olp-table 7.1.21 → 7.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle-report.html +3 -3
- package/olp-table.common.js +29 -29
- package/olp-table.umd.js +30 -30
- package/olp-table.umd.min.js +30 -30
- package/package.json +1 -1
package/olp-table.umd.min.js
CHANGED
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
*/
|
|
9
9
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
10
10
|
if(typeof exports === 'object' && typeof module === 'object')
|
|
11
|
-
module.exports = factory(require("vue"), require("pinia"), require("axios"), require("qs"), require("element-plus"), require("exceljs"), require("vxe-table"), require("@smallwei/avue"));
|
|
11
|
+
module.exports = factory(require("vue"), require("pinia"), require("axios"), require("qs"), require("element-plus"), require("pako"), require("exceljs"), require("vxe-table"), require("pinyin-pro"), require("@smallwei/avue"));
|
|
12
12
|
else if(typeof define === 'function' && define.amd)
|
|
13
|
-
define("olp-table", ["vue", "pinia", "axios", "qs", "element-plus", "exceljs", "vxe-table", "@smallwei/avue"], factory);
|
|
13
|
+
define("olp-table", ["vue", "pinia", "axios", "qs", "element-plus", "pako", "exceljs", "vxe-table", "pinyin-pro", "@smallwei/avue"], factory);
|
|
14
14
|
else if(typeof exports === 'object')
|
|
15
|
-
exports["olp-table"] = factory(require("vue"), require("pinia"), require("axios"), require("qs"), require("element-plus"), require("exceljs"), require("vxe-table"), require("@smallwei/avue"));
|
|
15
|
+
exports["olp-table"] = factory(require("vue"), require("pinia"), require("axios"), require("qs"), require("element-plus"), require("pako"), require("exceljs"), require("vxe-table"), require("pinyin-pro"), require("@smallwei/avue"));
|
|
16
16
|
else
|
|
17
|
-
root["olp-table"] = factory(root["vue"], root["pinia"], root["axios"], root["qs"], root["element-plus"], root["exceljs"], root["vxe-table"], root["@smallwei/avue"]);
|
|
18
|
-
})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE_vue__, __WEBPACK_EXTERNAL_MODULE_pinia__, __WEBPACK_EXTERNAL_MODULE_axios__, __WEBPACK_EXTERNAL_MODULE_qs__, __WEBPACK_EXTERNAL_MODULE_element_plus__, __WEBPACK_EXTERNAL_MODULE_exceljs__, __WEBPACK_EXTERNAL_MODULE_vxe_table__, __WEBPACK_EXTERNAL_MODULE__smallwei_avue__) {
|
|
17
|
+
root["olp-table"] = factory(root["vue"], root["pinia"], root["axios"], root["qs"], root["element-plus"], root["pako"], root["exceljs"], root["vxe-table"], root["pinyin-pro"], root["@smallwei/avue"]);
|
|
18
|
+
})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE_vue__, __WEBPACK_EXTERNAL_MODULE_pinia__, __WEBPACK_EXTERNAL_MODULE_axios__, __WEBPACK_EXTERNAL_MODULE_qs__, __WEBPACK_EXTERNAL_MODULE_element_plus__, __WEBPACK_EXTERNAL_MODULE_pako__, __WEBPACK_EXTERNAL_MODULE_exceljs__, __WEBPACK_EXTERNAL_MODULE_vxe_table__, __WEBPACK_EXTERNAL_MODULE_pinyin_pro__, __WEBPACK_EXTERNAL_MODULE__smallwei_avue__) {
|
|
19
19
|
return /******/ (function() { // webpackBootstrap
|
|
20
20
|
/******/ var __webpack_modules__ = ({
|
|
21
21
|
|
|
@@ -509,7 +509,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var spli
|
|
|
509
509
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
510
510
|
|
|
511
511
|
"use strict";
|
|
512
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"vue\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _store_dict__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/store/dict */ \"./src/store/dict.js\");\n/* harmony import */ var pinyin_pro__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! pinyin-pro */ \"./node_modules/pinyin-pro/dist/index.mjs\");\n/* harmony import */ var _utils_message__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/utils/message */ \"./src/utils/message.js\");\n/* harmony import */ var _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/utils/http/httpUtils */ \"./src/utils/http/httpUtils.js\");\n/* harmony import */ var _utils_tree__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils/tree */ \"./src/utils/tree.js\");\n/* harmony import */ var _api_dist__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/api/dist */ \"./src/api/dist.js\");\n/* harmony import */ var _utils_object__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/utils/object */ \"./src/utils/object.js\");\n\n\n\n\n\n\n\n\n\n\n\nconst __default__ = {\n name: \"olForm\"\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/Object.assign(__default__, {\n emits: ['emits'],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const dict = (0,_store_dict__WEBPACK_IMPORTED_MODULE_4__.storeDict)();\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.onMounted)(() => {\n dict.init(http);\n });\n const events = ['change'];\n const olPinyin = pinyin_pro__WEBPACK_IMPORTED_MODULE_10__.pinyin;\n const http = (0,vue__WEBPACK_IMPORTED_MODULE_3__.inject)(\"http\");\n const olMsg = (0,_utils_message__WEBPACK_IMPORTED_MODULE_5__.useMessage)(); // 消息弹窗\n const state = (0,vue__WEBPACK_IMPORTED_MODULE_3__.reactive)({\n key: 1,\n loading: false,\n fullscreen: false,\n dialogVisible: false,\n title: \"\",\n width: '60%',\n comCommit: true,\n maxHeight: '400px',\n type: '0',\n edit: false,\n form: {\n column: []\n },\n saveUrl: '',\n formData: {},\n requestType: 'post',\n updateKey: '',\n theme: 't1',\n tableConfigId: '',\n optionData: {}\n });\n const formRef = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)();\n const hideColumn = prop => {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_9__.setArrayObjectKeyValue)(state.form.column, 'display', false, prop);\n };\n const showColumn = prop => {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_9__.setArrayObjectKeyValue)(state.form.column, 'display', true, prop);\n };\n function getParams() {\n let params = {\n tableConfigId: state.tableConfigId,\n columnAndValueMap: {}\n };\n if (state.type != '0') {\n let formData = formRef.value.getFormData(false);\n for (let prop of Object.keys(formData)) {\n let value = formData[prop];\n if (value instanceof String) {\n value = value.trim();\n }\n params.columnAndValueMap[prop] = value;\n }\n } else {\n for (let {\n prop\n } of state.form.column) {\n let value = state.formData[prop];\n if (value) {\n if (value instanceof String) {\n value = value.trim();\n }\n params.columnAndValueMap[prop] = value;\n }\n }\n }\n if (state.saveUrl) {\n return params.columnAndValueMap;\n }\n if (state.edit) {\n params.whereMap = {};\n if (state.updateKey) {\n let split = state.updateKey.split(',');\n for (let kv of split) {\n let kvs = kv.split(\"=\");\n if (kvs.length == 2) {\n params.whereMap[kvs[0]] = params.columnAndValueMap[kvs[1]];\n delete params.columnAndValueMap[kvs[0]];\n } else {\n let val = params.columnAndValueMap[kvs];\n params.whereMap[kvs] = val != undefined ? val : state.formData[kvs];\n delete params.columnAndValueMap[kvs];\n }\n }\n } else {\n // 编辑时默认更新条件为id\n params.whereMap['id'] = state.formData['id'];\n if (!params.whereMap['id']) {\n params.whereMap['id'] = state.formData['t1_id'];\n }\n delete params.columnAndValueMap['id'];\n }\n }\n return params;\n }\n async function doValidate() {\n let dom = undefined;\n let keys = [];\n let status = true;\n if (state.type != '0') {\n await formRef.value.getNativeForm().validate((valid, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = formRef.value.getWidgetRef(keys[0]);\n status = false;\n }\n });\n } else {\n await formRef.value.validate((valid, done, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = formRef.value.getPropRef(keys[0]);\n status = false;\n }\n done();\n });\n }\n if (dom) {\n // 定位代码\n dom.$el.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n olMsg.error(\"您还有\" + keys.length + \"项信息未填写,请填写后再操作!\");\n status = false;\n }\n return status;\n }\n async function doSave() {\n let validate = await doValidate();\n if (!validate) {\n return;\n }\n state.loading = true;\n try {\n let params = getParams();\n let url = state.saveUrl ? state.saveUrl : state.edit ? '/online/crud/modify' : '/online/crud/save';\n if (state.requestType.toLowerCase() == \"put\") {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__.put)(http, url, params).then(status => {\n state.loading = false;\n if (status) {\n state.dialogVisible = false;\n emits('query');\n }\n });\n } else {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__.post)(http, url, params).then(status => {\n state.loading = false;\n if (status) {\n state.dialogVisible = false;\n emits('query');\n }\n });\n }\n } catch (e) {\n console.error(e);\n } finally {\n state.loading = false;\n }\n }\n function init(data) {\n if (data.saveUrl) {\n state.saveUrl = data.saveUrl.trim();\n if (data.requestType) {\n state.requestType = data.requestType;\n }\n }\n state.key++;\n state.edit = data['code'] == 'edit' == true;\n state.title = data.title ? data.title : state.edit ? '编辑' : '新增';\n //赋值弹窗宽度和高度\n if (data.form.diaLogWidth) {\n state.width = data.form.diaLogWidth;\n }\n if (data.form.diaLogHeight) {\n state.maxHeight = data.form.diaLogHeight + 'px';\n }\n if (data.form.title) {\n state.title = data.form.title;\n }\n state.dialogVisible = true;\n for (let key of Object.keys(state)) {\n if (data[key]) {\n state[key] = data[key];\n }\n }\n if (state.type == 0) {\n for (let column of state.form.column) {\n if (column.disabled == 1) {\n column.disabled = true;\n }\n initDict(column);\n parseJson(column);\n for (let event of events) {\n if (column[event] && !(column[event] instanceof Function)) {\n try {\n column[event] = getFunction(column[event]);\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n }\n }\n function parseJson(column) {\n let attrs = column.attrs;\n if (attrs) {\n try {\n attrs = JSON.parse(attrs);\n for (let key of Object.keys(attrs)) {\n column[key] = attrs[key];\n }\n } catch (e) {\n console.error(\"解析attrs异常\", attrs);\n }\n }\n }\n function initDict(column) {\n if (column.dictCode) {\n column.dicData = dict.val(column.dictCode);\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n if (state.edit) {\n return;\n }\n if (column.value != undefined) {\n state.formData[column.prop] = String(column.value);\n } else {\n //”number”、”string”、”boolean”、”object”、”function” 和 “undefined”\n let dataType = typeof state.formData[column.prop];\n // 数据字典与值类型不一致\n if (state.formData[column.prop] != undefined && state.formData[column.prop] != '' && [\"number\", \"boolean\"].indexOf(dataType) != -1) {\n state.formData[column.prop] = String(state.formData[column.prop]);\n column.value = state.formData[column.prop];\n } else if (state.formData[column.prop] == undefined) {\n setTimeout(() => {\n if (column.dicData) {\n for (let dicDatum of column.dicData) {\n if (dicDatum.isDefault == 1) {\n state.formData[column.prop] = dicDatum.value;\n column.value = state.formData[column.prop];\n }\n }\n }\n }, 100);\n }\n }\n } else if (column.dictTable || column.dictUrl) {\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n column.filterable = true;\n column.dicData = [];\n setTimeout(() => {\n setDictTable(column, undefined);\n }, 10);\n if (column.type == 'tree') {\n column.filterable = column.filterable == undefined ? true : column.clearable;\n column.clearable = column.clearable == undefined ? true : column.clearable;\n } else {\n column.filterMethod = e => {\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)(() => {\n setDictTable(column, e);\n });\n };\n }\n }\n }\n const doSetDictTable = (column, like) => {\n let value = state.formData[column.prop];\n /*String tableName;\r\n String dataBase;\r\n String label;\r\n String value;\r\n Map<String, Object> where;*/\n // olp-vue-pro,system_users,nickname,id,parentId\n let params = {};\n let dictTable = JSON.parse(JSON.stringify(column.dictTable));\n if (dictTable instanceof Object) {\n params = dictTable;\n } else {\n dictTable = column.dictTable.split(\",\");\n params[\"dbName\"] = dictTable[0];\n params[\"tableName\"] = dictTable[1];\n params[\"label\"] = dictTable[2];\n params[\"value\"] = dictTable[3];\n if (dictTable[4]) {\n params[\"parentValue\"] = dictTable[4];\n }\n }\n if (like || value) {\n if (!params.where) {\n params.where = {};\n }\n }\n if (!params[\"parentValue\"]) {\n if (like) {\n params.where['_like_' + params[\"label\"]] = like;\n }\n if (value) {\n params.defaultValue = value;\n }\n }\n (0,_api_dist__WEBPACK_IMPORTED_MODULE_8__.initDictTable)(http, params).then(data => {\n column.dicData.length = 0;\n if (params[\"parentValue\"]) {\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_7__.handleTree)(data, 'dictValue', 'parentValue');\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n };\n const setDictUrl = (column, like) => {\n let dictUrl = column.dictUrl.split(\",\");\n let url;\n let label = 'label';\n let value = 'value';\n let parentId = 'parentId';\n // get,url,label,value,parent_id\n let doGet = true;\n if (dictUrl.length > 1) {\n if (dictUrl[0].toString().toLowerCase() == 'post') {\n doGet = false;\n }\n url = dictUrl[1];\n label = dictUrl[2];\n value = dictUrl[3];\n parentId = dictUrl[4];\n } else {\n url = dictUrl[0];\n }\n if (doGet) {\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__.get)(http, url + \"?label=\" + like).then(data => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_7__.handleTree)(data, value, parentId);\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n } else {\n let params = {};\n if (like) {\n params['label'] = like;\n }\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__.post)(http, column.dictUrl, params, false).then(({\n data\n }) => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_7__.handleTree)(data, value, parentId);\n } else {\n data.forEach(da => {\n da['label'] = da[label];\n da['value'] = da[value];\n column.dicData.push(da);\n });\n }\n });\n }\n };\n const setDictTable = (column, like) => {\n if (column.dictTable && column.dictTable.toString().trim() != '') {\n doSetDictTable(column, like);\n } else if (column.dictUrl) {\n setDictUrl(column, like);\n }\n };\n const aws = async () => {\n await (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)();\n };\n function getFunction(v) {\n return eval(\" async (params)=>{await aws();let {formData} = state;let {value} = params;\" + replaceDollarBraces(v) + \"}\");\n }\n function replaceDollarBraces(str) {\n return str.toString().replace(/\\$\\{?([^{}]+)\\}?/g, function (match, innerContent) {\n return innerContent ? `'${innerContent}'` : match;\n });\n }\n\n // 子组件调用父组件\n const emits = __emit; //声明 emits\n\n // 对外暴露\n __expose({\n init\n });\n const __returned__ = {\n dict,\n events,\n olPinyin,\n http,\n olMsg,\n state,\n formRef,\n hideColumn,\n showColumn,\n getParams,\n doValidate,\n doSave,\n init,\n parseJson,\n initDict,\n doSetDictTable,\n setDictUrl,\n setDictTable,\n aws,\n getFunction,\n replaceDollarBraces,\n emits,\n reactive: vue__WEBPACK_IMPORTED_MODULE_3__.reactive,\n nextTick: vue__WEBPACK_IMPORTED_MODULE_3__.nextTick,\n ref: vue__WEBPACK_IMPORTED_MODULE_3__.ref,\n inject: vue__WEBPACK_IMPORTED_MODULE_3__.inject,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_3__.onMounted,\n get storeDict() {\n return _store_dict__WEBPACK_IMPORTED_MODULE_4__.storeDict;\n },\n get pinyin() {\n return pinyin_pro__WEBPACK_IMPORTED_MODULE_10__.pinyin;\n },\n get useMessage() {\n return _utils_message__WEBPACK_IMPORTED_MODULE_5__.useMessage;\n },\n get get() {\n return _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__.get;\n },\n get post() {\n return _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__.post;\n },\n get put() {\n return _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_6__.put;\n },\n get handleTree() {\n return _utils_tree__WEBPACK_IMPORTED_MODULE_7__.handleTree;\n },\n get initDictTable() {\n return _api_dist__WEBPACK_IMPORTED_MODULE_8__.initDictTable;\n },\n get setArrayObjectKeyValue() {\n return _utils_object__WEBPACK_IMPORTED_MODULE_9__.setArrayObjectKeyValue;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n}));\n\n//# sourceURL=webpack://olp-table/./src/components/table/ol-form-v3/index.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-124.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
|
|
512
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"vue\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(vue__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _store_dict__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/store/dict */ \"./src/store/dict.js\");\n/* harmony import */ var pinyin_pro__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! pinyin-pro */ \"pinyin-pro\");\n/* harmony import */ var pinyin_pro__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(pinyin_pro__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_message__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/utils/message */ \"./src/utils/message.js\");\n/* harmony import */ var _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils/http/httpUtils */ \"./src/utils/http/httpUtils.js\");\n/* harmony import */ var _utils_tree__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/utils/tree */ \"./src/utils/tree.js\");\n/* harmony import */ var _api_dist__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/api/dist */ \"./src/api/dist.js\");\n/* harmony import */ var _utils_object__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/utils/object */ \"./src/utils/object.js\");\n\n\n\n\n\n\n\n\n\n\n\nconst __default__ = {\n name: \"olForm\"\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/Object.assign(__default__, {\n emits: ['emits'],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const dict = (0,_store_dict__WEBPACK_IMPORTED_MODULE_4__.storeDict)();\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.onMounted)(() => {\n dict.init(http);\n });\n const events = ['change'];\n const olPinyin = pinyin_pro__WEBPACK_IMPORTED_MODULE_5__.pinyin;\n const http = (0,vue__WEBPACK_IMPORTED_MODULE_3__.inject)(\"http\");\n const olMsg = (0,_utils_message__WEBPACK_IMPORTED_MODULE_6__.useMessage)(); // 消息弹窗\n const state = (0,vue__WEBPACK_IMPORTED_MODULE_3__.reactive)({\n key: 1,\n loading: false,\n fullscreen: false,\n dialogVisible: false,\n title: \"\",\n width: '60%',\n comCommit: true,\n maxHeight: '400px',\n type: '0',\n edit: false,\n form: {\n column: []\n },\n saveUrl: '',\n formData: {},\n requestType: 'post',\n updateKey: '',\n theme: 't1',\n tableConfigId: '',\n optionData: {}\n });\n const formRef = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)();\n const hideColumn = prop => {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_10__.setArrayObjectKeyValue)(state.form.column, 'display', false, prop);\n };\n const showColumn = prop => {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_10__.setArrayObjectKeyValue)(state.form.column, 'display', true, prop);\n };\n function getParams() {\n let params = {\n tableConfigId: state.tableConfigId,\n columnAndValueMap: {}\n };\n if (state.type != '0') {\n let formData = formRef.value.getFormData(false);\n for (let prop of Object.keys(formData)) {\n let value = formData[prop];\n if (value instanceof String) {\n value = value.trim();\n }\n params.columnAndValueMap[prop] = value;\n }\n } else {\n for (let {\n prop\n } of state.form.column) {\n let value = state.formData[prop];\n if (value) {\n if (value instanceof String) {\n value = value.trim();\n }\n params.columnAndValueMap[prop] = value;\n }\n }\n }\n if (state.saveUrl) {\n return params.columnAndValueMap;\n }\n if (state.edit) {\n params.whereMap = {};\n if (state.updateKey) {\n let split = state.updateKey.split(',');\n for (let kv of split) {\n let kvs = kv.split(\"=\");\n if (kvs.length == 2) {\n params.whereMap[kvs[0]] = params.columnAndValueMap[kvs[1]];\n delete params.columnAndValueMap[kvs[0]];\n } else {\n let val = params.columnAndValueMap[kvs];\n params.whereMap[kvs] = val != undefined ? val : state.formData[kvs];\n delete params.columnAndValueMap[kvs];\n }\n }\n } else {\n // 编辑时默认更新条件为id\n params.whereMap['id'] = state.formData['id'];\n if (!params.whereMap['id']) {\n params.whereMap['id'] = state.formData['t1_id'];\n }\n delete params.columnAndValueMap['id'];\n }\n }\n return params;\n }\n async function doValidate() {\n let dom = undefined;\n let keys = [];\n let status = true;\n if (state.type != '0') {\n await formRef.value.getNativeForm().validate((valid, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = formRef.value.getWidgetRef(keys[0]);\n status = false;\n }\n });\n } else {\n await formRef.value.validate((valid, done, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = formRef.value.getPropRef(keys[0]);\n status = false;\n }\n done();\n });\n }\n if (dom) {\n // 定位代码\n dom.$el.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n olMsg.error(\"您还有\" + keys.length + \"项信息未填写,请填写后再操作!\");\n status = false;\n }\n return status;\n }\n async function doSave() {\n let validate = await doValidate();\n if (!validate) {\n return;\n }\n state.loading = true;\n try {\n let params = getParams();\n let url = state.saveUrl ? state.saveUrl : state.edit ? '/online/crud/modify' : '/online/crud/save';\n if (state.requestType.toLowerCase() == \"put\") {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__.put)(http, url, params).then(status => {\n state.loading = false;\n if (status) {\n state.dialogVisible = false;\n emits('query');\n }\n });\n } else {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__.post)(http, url, params).then(status => {\n state.loading = false;\n if (status) {\n state.dialogVisible = false;\n emits('query');\n }\n });\n }\n } catch (e) {\n console.error(e);\n } finally {\n state.loading = false;\n }\n }\n function init(data) {\n if (data.saveUrl) {\n state.saveUrl = data.saveUrl.trim();\n if (data.requestType) {\n state.requestType = data.requestType;\n }\n }\n state.key++;\n state.edit = data['code'] == 'edit' == true;\n state.title = data.title ? data.title : state.edit ? '编辑' : '新增';\n //赋值弹窗宽度和高度\n if (data.form.diaLogWidth) {\n state.width = data.form.diaLogWidth;\n }\n if (data.form.diaLogHeight) {\n state.maxHeight = data.form.diaLogHeight + 'px';\n }\n if (data.form.title) {\n state.title = data.form.title;\n }\n state.dialogVisible = true;\n for (let key of Object.keys(state)) {\n if (data[key]) {\n state[key] = data[key];\n }\n }\n if (state.type == 0) {\n for (let column of state.form.column) {\n if (column.disabled == 1) {\n column.disabled = true;\n }\n initDict(column);\n parseJson(column);\n for (let event of events) {\n if (column[event] && !(column[event] instanceof Function)) {\n try {\n column[event] = getFunction(column[event]);\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n }\n }\n function parseJson(column) {\n let attrs = column.attrs;\n if (attrs) {\n try {\n attrs = JSON.parse(attrs);\n for (let key of Object.keys(attrs)) {\n column[key] = attrs[key];\n }\n } catch (e) {\n console.error(\"解析attrs异常\", attrs);\n }\n }\n }\n function initDict(column) {\n if (column.dictCode) {\n column.dicData = dict.val(column.dictCode);\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n if (state.edit) {\n return;\n }\n if (column.value != undefined) {\n state.formData[column.prop] = String(column.value);\n } else {\n //”number”、”string”、”boolean”、”object”、”function” 和 “undefined”\n let dataType = typeof state.formData[column.prop];\n // 数据字典与值类型不一致\n if (state.formData[column.prop] != undefined && state.formData[column.prop] != '' && [\"number\", \"boolean\"].indexOf(dataType) != -1) {\n state.formData[column.prop] = String(state.formData[column.prop]);\n column.value = state.formData[column.prop];\n } else if (state.formData[column.prop] == undefined) {\n setTimeout(() => {\n if (column.dicData) {\n for (let dicDatum of column.dicData) {\n if (dicDatum.isDefault == 1) {\n state.formData[column.prop] = dicDatum.value;\n column.value = state.formData[column.prop];\n }\n }\n }\n }, 100);\n }\n }\n } else if (column.dictTable || column.dictUrl) {\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n column.filterable = true;\n column.dicData = [];\n setTimeout(() => {\n setDictTable(column, undefined);\n }, 10);\n if (column.type == 'tree') {\n column.filterable = column.filterable == undefined ? true : column.clearable;\n column.clearable = column.clearable == undefined ? true : column.clearable;\n } else {\n column.filterMethod = e => {\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)(() => {\n setDictTable(column, e);\n });\n };\n }\n }\n }\n const doSetDictTable = (column, like) => {\n let value = state.formData[column.prop];\n /*String tableName;\r\n String dataBase;\r\n String label;\r\n String value;\r\n Map<String, Object> where;*/\n // olp-vue-pro,system_users,nickname,id,parentId\n let params = {};\n let dictTable = JSON.parse(JSON.stringify(column.dictTable));\n if (dictTable instanceof Object) {\n params = dictTable;\n } else {\n dictTable = column.dictTable.split(\",\");\n params[\"dbName\"] = dictTable[0];\n params[\"tableName\"] = dictTable[1];\n params[\"label\"] = dictTable[2];\n params[\"value\"] = dictTable[3];\n if (dictTable[4]) {\n params[\"parentValue\"] = dictTable[4];\n }\n }\n if (like || value) {\n if (!params.where) {\n params.where = {};\n }\n }\n if (!params[\"parentValue\"]) {\n if (like) {\n params.where['_like_' + params[\"label\"]] = like;\n }\n if (value) {\n params.defaultValue = value;\n }\n }\n (0,_api_dist__WEBPACK_IMPORTED_MODULE_9__.initDictTable)(http, params).then(data => {\n column.dicData.length = 0;\n if (params[\"parentValue\"]) {\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_8__.handleTree)(data, 'dictValue', 'parentValue');\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n };\n const setDictUrl = (column, like) => {\n let dictUrl = column.dictUrl.split(\",\");\n let url;\n let label = 'label';\n let value = 'value';\n let parentId = 'parentId';\n // get,url,label,value,parent_id\n let doGet = true;\n if (dictUrl.length > 1) {\n if (dictUrl[0].toString().toLowerCase() == 'post') {\n doGet = false;\n }\n url = dictUrl[1];\n label = dictUrl[2];\n value = dictUrl[3];\n parentId = dictUrl[4];\n } else {\n url = dictUrl[0];\n }\n if (doGet) {\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__.get)(http, url + \"?label=\" + like).then(data => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_8__.handleTree)(data, value, parentId);\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n } else {\n let params = {};\n if (like) {\n params['label'] = like;\n }\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__.post)(http, column.dictUrl, params, false).then(({\n data\n }) => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_8__.handleTree)(data, value, parentId);\n } else {\n data.forEach(da => {\n da['label'] = da[label];\n da['value'] = da[value];\n column.dicData.push(da);\n });\n }\n });\n }\n };\n const setDictTable = (column, like) => {\n if (column.dictTable && column.dictTable.toString().trim() != '') {\n doSetDictTable(column, like);\n } else if (column.dictUrl) {\n setDictUrl(column, like);\n }\n };\n const aws = async () => {\n await (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)();\n };\n function getFunction(v) {\n return eval(\" async (params)=>{await aws();let {formData} = state;let {value} = params;\" + replaceDollarBraces(v) + \"}\");\n }\n function replaceDollarBraces(str) {\n return str.toString().replace(/\\$\\{?([^{}]+)\\}?/g, function (match, innerContent) {\n return innerContent ? `'${innerContent}'` : match;\n });\n }\n\n // 子组件调用父组件\n const emits = __emit; //声明 emits\n\n // 对外暴露\n __expose({\n init\n });\n const __returned__ = {\n dict,\n events,\n olPinyin,\n http,\n olMsg,\n state,\n formRef,\n hideColumn,\n showColumn,\n getParams,\n doValidate,\n doSave,\n init,\n parseJson,\n initDict,\n doSetDictTable,\n setDictUrl,\n setDictTable,\n aws,\n getFunction,\n replaceDollarBraces,\n emits,\n reactive: vue__WEBPACK_IMPORTED_MODULE_3__.reactive,\n nextTick: vue__WEBPACK_IMPORTED_MODULE_3__.nextTick,\n ref: vue__WEBPACK_IMPORTED_MODULE_3__.ref,\n inject: vue__WEBPACK_IMPORTED_MODULE_3__.inject,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_3__.onMounted,\n get storeDict() {\n return _store_dict__WEBPACK_IMPORTED_MODULE_4__.storeDict;\n },\n get pinyin() {\n return pinyin_pro__WEBPACK_IMPORTED_MODULE_5__.pinyin;\n },\n get useMessage() {\n return _utils_message__WEBPACK_IMPORTED_MODULE_6__.useMessage;\n },\n get get() {\n return _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__.get;\n },\n get post() {\n return _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__.post;\n },\n get put() {\n return _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_7__.put;\n },\n get handleTree() {\n return _utils_tree__WEBPACK_IMPORTED_MODULE_8__.handleTree;\n },\n get initDictTable() {\n return _api_dist__WEBPACK_IMPORTED_MODULE_9__.initDictTable;\n },\n get setArrayObjectKeyValue() {\n return _utils_object__WEBPACK_IMPORTED_MODULE_10__.setArrayObjectKeyValue;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n}));\n\n//# sourceURL=webpack://olp-table/./src/components/table/ol-form-v3/index.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-124.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
|
|
513
513
|
|
|
514
514
|
/***/ }),
|
|
515
515
|
|
|
@@ -520,7 +520,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core
|
|
|
520
520
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
521
521
|
|
|
522
522
|
"use strict";
|
|
523
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_object__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/utils/object */ \"./src/utils/object.js\");\n/* harmony import */ var _utils_message__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/utils/message */ \"./src/utils/message.js\");\n/* harmony import */ var _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/utils/http/httpUtils */ \"./src/utils/http/httpUtils.js\");\n/* harmony import */ var _utils_tree__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/utils/tree */ \"./src/utils/tree.js\");\n/* harmony import */ var _utils_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils/util */ \"./src/utils/util.js\");\n/* harmony import */ var _api_dist__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/api/dist */ \"./src/api/dist.js\");\n/* harmony import */ var _store_dict__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/store/dict */ \"./src/store/dict.js\");\n/* harmony import */ var _store_dictType__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/store/dictType */ \"./src/store/dictType.js\");\n/* harmony import */ var _components_ol_table_select_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/components/ol-table-select.vue */ \"./src/components/ol-table-select.vue\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst dict = (0,_store_dict__WEBPACK_IMPORTED_MODULE_9__.storeDict)();\nconst dictType = (0,_store_dictType__WEBPACK_IMPORTED_MODULE_10__.storeDictType)();\nfunction replaceDollarBraces(str) {\n return str.toString().replace(/\\$\\{?([^{}]+)\\}?/g, function (match, innerContent) {\n return innerContent ? `'${innerContent}'` : match;\n });\n}\nfunction parseJson(column) {\n let attrs = column.attrs;\n if (attrs) {\n try {\n attrs = JSON.parse(attrs);\n for (let key of Object.keys(attrs)) {\n column[key] = attrs[key];\n }\n } catch (e) {\n console.error(\"解析attrs异常\", attrs);\n }\n }\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"olForm\",\n components: {\n OlTableSelect: _components_ol_table_select_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"]\n },\n inject: ['http'],\n props: {\n isDialog: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n formData: {},\n optionData: {},\n form: {\n column: []\n },\n dynamicSlotsTable: [],\n dynamicSlotsField: {},\n dynamicSlotsOtherResult: {},\n show: true,\n state: {\n isDialog: true,\n loading: false,\n fullscreen: false,\n dialogVisible: false,\n title: \"\",\n width: '60%',\n comCommit: true,\n maxHeight: '400px',\n type: '0',\n edit: false,\n saveUrl: '',\n requestType: 'post',\n updateKey: '',\n theme: 't1',\n tableConfigId: '',\n dbName: '',\n tableName: '',\n otherProp: {}\n }\n };\n },\n methods: {\n hideColumn(prop) {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_3__.setArrayObjectKeyValue)(this.form.column, 'display', false, prop);\n },\n showColumn(prop) {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_3__.setArrayObjectKeyValue)(this.form.column, 'display', true, prop);\n },\n getParams() {\n let params = {\n tableConfigId: this.state.tableConfigId,\n dbName: this.state.dbName,\n tableName: this.state.tableName,\n columnAndValueMap: {}\n };\n if (this.state.type != '0') {\n let formData = this.$refs.value.getFormData(false);\n for (let prop of Object.keys(formData)) {\n let value = formData[prop];\n if (value instanceof String) {\n value = value.trim();\n }\n params.columnAndValueMap[prop] = value;\n }\n } else {\n // for (let {prop} of this.form.column) {\n // let value = this.formData[prop];\n // if (value) {\n // if (value instanceof String) {\n // value = value.trim();\n // }\n // params.columnAndValueMap[prop] = value;\n // }\n // }\n params.columnAndValueMap = this.getTableUpdateValue(this.form.column, this.formData);\n }\n if (this.state.saveUrl) {\n return params.columnAndValueMap;\n }\n if (this.state.edit) {\n params.whereMap = {};\n if (this.state.updateKey) {\n let split = this.state.updateKey.split(',');\n for (let kv of split) {\n let kvs = kv.split(\"=\");\n if (kvs.length == 2) {\n params.whereMap[kvs[0]] = params.columnAndValueMap[kvs[1]];\n delete params.columnAndValueMap[kvs[0]];\n } else {\n let val = params.columnAndValueMap[kvs];\n params.whereMap[kvs] = val != undefined ? val : this.formData[kvs];\n delete params.columnAndValueMap[kvs];\n }\n }\n } else {\n // 编辑时默认更新条件为id\n params.whereMap['id'] = this.formData['id'];\n if (!params.whereMap['id']) {\n params.whereMap['id'] = this.formData['t1_id'];\n }\n delete params.columnAndValueMap['id'];\n }\n } else if (this.state.updateKey) {\n let split = this.state.updateKey.split(',');\n params['genIdMap'] = {};\n for (let kv of split) {\n let kvs = kv.split(\"=\");\n if (kvs.length == 2) {\n params['genIdMap'][kvs[0]] = kvs[1];\n } else {\n params['genIdMap'][kvs[0]] = 'uuid';\n }\n }\n }\n return params;\n },\n /**\r\n * 根据列配置获取数据库表更新数据\r\n * @param column\r\n * @param formData\r\n * @returns {{}}\r\n */\n getTableUpdateValue(column, formData) {\n let columnAndValueMap = {};\n for (let {\n prop,\n tableField\n } of column) {\n if (tableField && tableField == '1') {\n continue;\n }\n let value = formData[prop];\n if (value != undefined) {\n if (value instanceof String) {\n value = value.trim();\n }\n columnAndValueMap[prop] = value;\n }\n }\n return columnAndValueMap;\n },\n async doSave() {\n let dom;\n let keys;\n if (this.state.type != '0') {\n await this.$refs.formRef.getNativeForm().validate((valid, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = this.$refs.formRef.getWidgetRef(keys[0]);\n dom.$el.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n (0,_utils_message__WEBPACK_IMPORTED_MODULE_4__.useMessage)().error(\"您还有\" + keys.length + \"项信息未填写,请填写后再操作!\");\n } else {\n this.save();\n }\n });\n } else {\n await this.$refs.formRef.validate((valid, done, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = this.$refs.formRef.getPropRef(keys[0]);\n dom.$el.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n (0,_utils_message__WEBPACK_IMPORTED_MODULE_4__.useMessage)().error(\"您还有\" + keys.length + \"项信息未填写,请填写后再操作!\");\n } else {\n this.save();\n }\n done();\n });\n }\n },\n saveOk(status) {\n this.state.loading = false;\n if (status) {\n this.state.dialogVisible = false;\n this.$emit('query');\n }\n if (this.state.otherProp && this.state.otherProp.afterSave) {\n try {\n eval(this.state.otherProp.afterSave);\n } catch (e) {\n console.log(e);\n }\n }\n },\n async save() {\n if (this.state.otherProp && this.state.otherProp.beforeSave) {\n try {\n let next = eval(\"()=>{\" + this.state.otherProp.beforeSave + \"}\");\n if (next() === false) {\n return;\n }\n } catch (e) {\n console.log(e);\n return;\n }\n }\n this.state.loading = true;\n try {\n let params = this.getParams();\n let url = this.state.saveUrl ? this.state.saveUrl : this.state.edit ? '/online/crudAes/modify' : '/online/crudAes/save';\n if (this.state.requestType.toLowerCase() == \"put\") {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.put)(this.http, url, params).then(status => {\n this.saveOk(status);\n });\n } else if (this.state.saveUrl) {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.post)(this.http, url, params).then(status => {\n this.saveOk(status);\n });\n } else {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.postAes)(this.http, url, params).then(status => {\n this.saveOk(status);\n });\n }\n } catch (e) {\n console.error(e);\n } finally {\n this.state.loading = false;\n }\n },\n init(data) {\n if (data.disabled) {\n this.show = false;\n }\n // 初始化动态插槽表格\n data.form.column.forEach(column => {\n if (data.disabled) {\n column.disabled = true;\n }\n if (column.selectDom === '22') {\n //表格选取\n let slotObj = {\n slotName: column.prop,\n config: JSON.parse(column.attrs).olTableSelect\n };\n this.dynamicSlotsField[column.prop] = column; //收集继续动态改变值的字段信息,以便动态改变值时更新表单数据\n this.dynamicSlotsTable.push(slotObj); //收集需要的动态插槽字段信息\n const otherResult = slotObj.config.otherResult; //返回额外参数字段配置\n if (otherResult !== null && otherResult !== undefined && otherResult !== '') {\n let otherResultArray = [];\n otherResult.split(\",\").forEach(m => {\n let k = m.split(\":\");\n otherResultArray.push({\n targetField: k[[k.length - 1]],\n sourceField: k[0]\n });\n });\n this.dynamicSlotsOtherResult[column.prop] = otherResultArray;\n }\n }\n });\n if (data.saveUrl) {\n this.state.saveUrl = data.saveUrl.trim();\n if (data.requestType) {\n this.state.requestType = data.requestType;\n }\n }\n this.state.edit = data['code'] == 'edit' == true;\n this.state.title = data.title ? data.title : this.state.edit ? '编辑' : '新增';\n //赋值弹窗宽度和高度\n if (data.form.diaLogWidth) {\n this.state.width = data.form.diaLogWidth;\n }\n if (data.form.diaLogHeight) {\n this.state.maxHeight = data.form.diaLogHeight + 'px';\n }\n if (data.form.title) {\n this.state.title = data.form.title;\n }\n this.state.dialogVisible = true;\n this.form = data.form;\n this.formData = data.formData;\n for (let key of Object.keys(this.state)) {\n if (data[key]) {\n this.state[key] = data[key];\n }\n }\n if (this.state.type == 0) {\n for (let column of this.form.column) {\n if (column.disabled == 1) {\n column.disabled = true;\n }\n this.initDict(column);\n parseJson(column);\n for (let event of ['change']) {\n if (column[event] && !(column[event] instanceof Function)) {\n try {\n column[event] = eval(\"(params)=>{this.$nextTick(()=>{\" + \"let formData = this.formData;\" + \"let {value} = params;\" + replaceDollarBraces(column[event]) + \"})\" + \"}\");\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n }\n if (this.state.otherProp) {\n try {\n this.state.otherProp = JSON.parse(this.state.otherProp);\n } catch (e) {\n console.log(e);\n }\n }\n },\n initDict(column) {\n if (column.dictCode) {\n column.dicData = dict.val(column.dictCode);\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n //”number”、”string”、”boolean”、”object”、”function” 和 “undefined”\n let dataType = typeof this.formData[column.prop];\n if ([\"number\", \"boolean\"].indexOf(dataType) != -1) {\n this.formData[column.prop] = String(this.formData[column.prop]);\n column.value = this.formData[column.prop];\n }\n if (this.state.edit) {\n return;\n }\n if (this.formData[column.prop] != undefined) {\n this.formData[column.prop] = String(this.formData[column.prop]);\n column.value = this.formData[column.prop];\n } else if (column.value != undefined) {\n this.formData[column.prop] = String(column.value);\n } else {\n // 数据字典与值类型不一致\n if (this.formData[column.prop] == undefined) {\n setTimeout(() => {\n if (column.dicData) {\n for (let dicDatum of column.dicData) {\n if (dicDatum.isDefault == 1) {\n this.formData[column.prop] = dicDatum.value;\n column.value = this.formData[column.prop];\n }\n }\n }\n }, 100);\n }\n }\n } else if (column.dictTable || column.dictUrl) {\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n column.filterable = true;\n column.dicData = [];\n setTimeout(() => {\n this.setDictTable(column, undefined);\n }, 10);\n if (column.type == 'tree') {\n column.filterable = column.filterable == undefined ? true : column.clearable;\n column.clearable = column.clearable == undefined ? true : column.clearable;\n } else {\n column.filterMethod = e => {\n this.$nextTick(() => {\n this.setDictTable(column, e);\n });\n };\n }\n }\n },\n setDictUrl(column, like) {\n let dictUrl = column.dictUrl.split(\",\");\n let url;\n let label = 'label';\n let value = 'value';\n let parentId = 'parentId';\n // get,url,label,value,parent_id\n let doGet = true;\n if (dictUrl.length > 1) {\n if (dictUrl[0].toString().toLowerCase() == 'post') {\n doGet = false;\n }\n url = dictUrl[1];\n label = dictUrl[2];\n value = dictUrl[3];\n parentId = dictUrl[4];\n } else {\n url = dictUrl[0];\n }\n if (doGet) {\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.get)(this.http, url + \"?label=\" + like).then(data => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_6__.handleTree)(data, value, parentId);\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n } else {\n let params = {};\n if (like) {\n params['label'] = like;\n }\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.post)(this.http, column.dictUrl, params, false).then(({\n data\n }) => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_6__.handleTree)(data, value, parentId);\n } else {\n data.forEach(da => {\n da['label'] = da[label];\n da['value'] = da[value];\n column.dicData.push(da);\n });\n }\n });\n }\n },\n setDictTable(column, like) {\n if (column.dictTable && column.dictTable.toString().trim() != '') {\n this.doSetDictTable(column, like);\n } else if (column.dictUrl) {\n this.setDictUrl(column, like);\n }\n },\n doSetDictTable(column, like) {\n let value = this.formData[column.prop];\n /*String tableName;\r\n String dataBase;\r\n String label;\r\n String value;\r\n Map<String, Object> where;*/\n // olp-vue-pro,system_users,nickname,id,parentId\n let params = {};\n let dictTable = JSON.parse(JSON.stringify(column.dictTable));\n if (dictTable instanceof Object) {\n params = dictTable;\n } else {\n dictTable = column.dictTable.split(\",\");\n params[\"dbName\"] = dictTable[0];\n params[\"tableName\"] = dictTable[1];\n params[\"label\"] = dictTable[2];\n params[\"value\"] = dictTable[3];\n if (dictTable[4]) {\n params[\"parentValue\"] = dictTable[4];\n }\n }\n if (like || value) {\n if (!params.where) {\n params.where = {};\n }\n }\n if (!params[\"parentValue\"]) {\n if (like) {\n params.where['_like_' + params[\"label\"]] = like;\n }\n if (value) {\n params.defaultValue = value;\n }\n }\n (0,_api_dist__WEBPACK_IMPORTED_MODULE_8__.initDictTable)(this.http, params).then(data => {\n column.dicData.length = 0;\n if (params[\"parentValue\"]) {\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_6__.handleTree)(data, 'dictValue', 'parentValue');\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n },\n /**\r\n * 表格选择器回调函数\r\n * @param data\r\n */\n olTableSelectChange(slotName, data) {\n // console.info('插槽名称', slotName, '表格回传的数据', data)\n // console.info('表格', this.form.column)\n this.formData[slotName] = data.value; //修改表单数据,以便后续提交\n if (typeof this.dynamicSlotsField[slotName].change === 'function') {\n this.dynamicSlotsField[slotName].change(data.value); //字段数据更新回调\n }\n //给其他字段赋值\n this.dynamicSlotsOtherResult[slotName]?.forEach(item => {\n this.formData[item.targetField] = data.data[item.sourceField];\n });\n }\n },\n mounted() {\n this.$nextTick(() => {\n (0,_store_dict__WEBPACK_IMPORTED_MODULE_9__.storeDict)().init(this.http);\n });\n },\n created() {}\n});\n\n//# sourceURL=webpack://olp-table/./src/components/table/ol-form/index.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-124.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
|
|
523
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_object__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/utils/object */ \"./src/utils/object.js\");\n/* harmony import */ var _utils_message__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/utils/message */ \"./src/utils/message.js\");\n/* harmony import */ var _utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/utils/http/httpUtils */ \"./src/utils/http/httpUtils.js\");\n/* harmony import */ var _utils_tree__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/utils/tree */ \"./src/utils/tree.js\");\n/* harmony import */ var _utils_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils/util */ \"./src/utils/util.js\");\n/* harmony import */ var _api_dist__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/api/dist */ \"./src/api/dist.js\");\n/* harmony import */ var pinyin_pro__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! pinyin-pro */ \"pinyin-pro\");\n/* harmony import */ var pinyin_pro__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(pinyin_pro__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _store_dict__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/store/dict */ \"./src/store/dict.js\");\n/* harmony import */ var _store_dictType__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/store/dictType */ \"./src/store/dictType.js\");\n/* harmony import */ var _components_ol_table_select_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/components/ol-table-select.vue */ \"./src/components/ol-table-select.vue\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst dict = (0,_store_dict__WEBPACK_IMPORTED_MODULE_10__.storeDict)();\nconst dictType = (0,_store_dictType__WEBPACK_IMPORTED_MODULE_11__.storeDictType)();\nfunction replaceDollarBraces(str) {\n return str.toString().replace(/\\$\\{?([^{}]+)\\}?/g, function (match, innerContent) {\n return innerContent ? `'${innerContent}'` : match;\n });\n}\nfunction parseJson(column) {\n let attrs = column.attrs;\n if (attrs) {\n try {\n attrs = JSON.parse(attrs);\n for (let key of Object.keys(attrs)) {\n column[key] = attrs[key];\n }\n } catch (e) {\n console.error(\"解析attrs异常\", attrs);\n }\n }\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"olForm\",\n components: {\n OlTableSelect: _components_ol_table_select_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n },\n inject: ['http'],\n props: {\n isDialog: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n formData: {},\n optionData: {},\n form: {\n column: []\n },\n dynamicSlotsTable: [],\n dynamicSlotsField: {},\n dynamicSlotsOtherResult: {},\n show: true,\n state: {\n isDialog: true,\n loading: false,\n fullscreen: false,\n dialogVisible: false,\n title: \"\",\n width: '60%',\n comCommit: true,\n maxHeight: '400px',\n type: '0',\n edit: false,\n saveUrl: '',\n requestType: 'post',\n updateKey: '',\n theme: 't1',\n tableConfigId: '',\n dbName: '',\n tableName: '',\n otherProp: {}\n }\n };\n },\n methods: {\n hideColumn(prop) {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_3__.setArrayObjectKeyValue)(this.form.column, 'display', false, prop);\n },\n showColumn(prop) {\n (0,_utils_object__WEBPACK_IMPORTED_MODULE_3__.setArrayObjectKeyValue)(this.form.column, 'display', true, prop);\n },\n getParams() {\n let params = {\n tableConfigId: this.state.tableConfigId,\n dbName: this.state.dbName,\n tableName: this.state.tableName,\n columnAndValueMap: {}\n };\n if (this.state.type != '0') {\n let formData = this.$refs.value.getFormData(false);\n for (let prop of Object.keys(formData)) {\n let value = formData[prop];\n if (value instanceof String) {\n value = value.trim();\n }\n params.columnAndValueMap[prop] = value;\n }\n } else {\n // for (let {prop} of this.form.column) {\n // let value = this.formData[prop];\n // if (value) {\n // if (value instanceof String) {\n // value = value.trim();\n // }\n // params.columnAndValueMap[prop] = value;\n // }\n // }\n params.columnAndValueMap = this.getTableUpdateValue(this.form.column, this.formData);\n }\n if (this.state.saveUrl) {\n return params.columnAndValueMap;\n }\n if (this.state.edit) {\n params.whereMap = {};\n if (this.state.updateKey) {\n let split = this.state.updateKey.split(',');\n for (let kv of split) {\n let kvs = kv.split(\"=\");\n if (kvs.length == 2) {\n params.whereMap[kvs[0]] = params.columnAndValueMap[kvs[1]];\n delete params.columnAndValueMap[kvs[0]];\n } else {\n let val = params.columnAndValueMap[kvs];\n params.whereMap[kvs] = val != undefined ? val : this.formData[kvs];\n delete params.columnAndValueMap[kvs];\n }\n }\n } else {\n // 编辑时默认更新条件为id\n params.whereMap['id'] = this.formData['id'];\n if (!params.whereMap['id']) {\n params.whereMap['id'] = this.formData['t1_id'];\n }\n delete params.columnAndValueMap['id'];\n }\n } else if (this.state.updateKey) {\n let split = this.state.updateKey.split(',');\n params['genIdMap'] = {};\n for (let kv of split) {\n let kvs = kv.split(\"=\");\n if (kvs.length == 2) {\n params['genIdMap'][kvs[0]] = kvs[1];\n } else {\n params['genIdMap'][kvs[0]] = 'uuid';\n }\n }\n }\n return params;\n },\n /**\r\n * 根据列配置获取数据库表更新数据\r\n * @param column\r\n * @param formData\r\n * @returns {{}}\r\n */\n getTableUpdateValue(column, formData) {\n let columnAndValueMap = {};\n for (let {\n prop,\n tableField\n } of column) {\n if (tableField && tableField == '1') {\n continue;\n }\n let value = formData[prop];\n if (value != undefined) {\n if (value instanceof String) {\n value = value.trim();\n }\n columnAndValueMap[prop] = value;\n }\n }\n return columnAndValueMap;\n },\n async doSave() {\n let dom;\n let keys;\n if (this.state.type != '0') {\n await this.$refs.formRef.getNativeForm().validate((valid, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = this.$refs.formRef.getWidgetRef(keys[0]);\n dom.$el.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n (0,_utils_message__WEBPACK_IMPORTED_MODULE_4__.useMessage)().error(\"您还有\" + keys.length + \"项信息未填写,请填写后再操作!\");\n } else {\n this.save();\n }\n });\n } else {\n await this.$refs.formRef.validate((valid, done, msg) => {\n if (!valid) {\n keys = Object.keys(msg);\n dom = this.$refs.formRef.getPropRef(keys[0]);\n dom.$el.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n (0,_utils_message__WEBPACK_IMPORTED_MODULE_4__.useMessage)().error(\"您还有\" + keys.length + \"项信息未填写,请填写后再操作!\");\n } else {\n this.save();\n }\n done();\n });\n }\n },\n saveOk(status) {\n this.state.loading = false;\n if (status) {\n this.state.dialogVisible = false;\n this.$emit('query');\n }\n if (this.state.otherProp && this.state.otherProp.afterSave) {\n try {\n eval(this.state.otherProp.afterSave);\n } catch (e) {\n console.log(e);\n }\n }\n },\n async save() {\n if (this.state.otherProp && this.state.otherProp.beforeSave) {\n try {\n let next = eval(\"()=>{\" + this.state.otherProp.beforeSave + \"}\");\n if (next() === false) {\n return;\n }\n } catch (e) {\n console.log(e);\n return;\n }\n }\n this.state.loading = true;\n try {\n let params = this.getParams();\n let url = this.state.saveUrl ? this.state.saveUrl : this.state.edit ? '/online/crudAes/modify' : '/online/crudAes/save';\n if (this.state.requestType.toLowerCase() == \"put\") {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.put)(this.http, url, params).then(status => {\n this.saveOk(status);\n });\n } else if (this.state.saveUrl) {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.post)(this.http, url, params).then(status => {\n this.saveOk(status);\n });\n } else {\n await (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.postAes)(this.http, url, params).then(status => {\n this.saveOk(status);\n });\n }\n } catch (e) {\n console.error(e);\n } finally {\n this.state.loading = false;\n }\n },\n init(data) {\n if (data.disabled) {\n this.show = false;\n }\n // 初始化动态插槽表格\n data.form.column.forEach(column => {\n if (data.disabled) {\n column.disabled = true;\n }\n if (column.selectDom === '22') {\n //表格选取\n let slotObj = {\n slotName: column.prop,\n config: JSON.parse(column.attrs).olTableSelect\n };\n this.dynamicSlotsField[column.prop] = column; //收集继续动态改变值的字段信息,以便动态改变值时更新表单数据\n this.dynamicSlotsTable.push(slotObj); //收集需要的动态插槽字段信息\n const otherResult = slotObj.config.otherResult; //返回额外参数字段配置\n if (otherResult !== null && otherResult !== undefined && otherResult !== '') {\n let otherResultArray = [];\n otherResult.split(\",\").forEach(m => {\n let k = m.split(\":\");\n otherResultArray.push({\n targetField: k[[k.length - 1]],\n sourceField: k[0]\n });\n });\n this.dynamicSlotsOtherResult[column.prop] = otherResultArray;\n }\n }\n });\n if (data.saveUrl) {\n this.state.saveUrl = data.saveUrl.trim();\n if (data.requestType) {\n this.state.requestType = data.requestType;\n }\n }\n this.state.edit = data['code'] == 'edit' == true;\n this.state.title = data.title ? data.title : this.state.edit ? '编辑' : '新增';\n //赋值弹窗宽度和高度\n if (data.form.diaLogWidth) {\n this.state.width = data.form.diaLogWidth;\n }\n if (data.form.diaLogHeight) {\n this.state.maxHeight = data.form.diaLogHeight + 'px';\n }\n if (data.form.title) {\n this.state.title = data.form.title;\n }\n this.state.dialogVisible = true;\n this.form = data.form;\n this.formData = data.formData;\n for (let key of Object.keys(this.state)) {\n if (data[key]) {\n this.state[key] = data[key];\n }\n }\n if (this.state.type == 0) {\n for (let column of this.form.column) {\n if (column.disabled == 1) {\n column.disabled = true;\n }\n this.initDict(column);\n parseJson(column);\n for (let event of ['change']) {\n if (column[event] && !(column[event] instanceof Function)) {\n try {\n column[event] = eval(\"(params)=>{this.$nextTick(()=>{\" + \"let formData = this.formData;\" + \"let {value} = params;\" + replaceDollarBraces(column[event]) + \"})\" + \"}\");\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n }\n if (this.state.otherProp) {\n try {\n this.state.otherProp = JSON.parse(this.state.otherProp);\n } catch (e) {\n console.log(e);\n }\n }\n },\n initDict(column) {\n if (column.dictCode) {\n column.dicData = dict.val(column.dictCode);\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n //”number”、”string”、”boolean”、”object”、”function” 和 “undefined”\n let dataType = typeof this.formData[column.prop];\n if ([\"number\", \"boolean\"].indexOf(dataType) != -1) {\n this.formData[column.prop] = String(this.formData[column.prop]);\n column.value = this.formData[column.prop];\n }\n if (this.state.edit) {\n return;\n }\n if (this.formData[column.prop] != undefined) {\n this.formData[column.prop] = String(this.formData[column.prop]);\n column.value = this.formData[column.prop];\n } else if (column.value != undefined) {\n this.formData[column.prop] = String(column.value);\n } else {\n // 数据字典与值类型不一致\n if (this.formData[column.prop] == undefined) {\n setTimeout(() => {\n if (column.dicData) {\n for (let dicDatum of column.dicData) {\n if (dicDatum.isDefault == 1) {\n this.formData[column.prop] = dicDatum.value;\n column.value = this.formData[column.prop];\n }\n }\n }\n }, 100);\n }\n }\n } else if (column.dictTable || column.dictUrl) {\n if (column.selectDom == 1) {\n column.type = \"select\";\n }\n column.filterable = true;\n column.dicData = [];\n setTimeout(() => {\n this.setDictTable(column, undefined);\n }, 10);\n if (column.type == 'tree') {\n column.filterable = column.filterable == undefined ? true : column.clearable;\n column.clearable = column.clearable == undefined ? true : column.clearable;\n } else {\n column.filterMethod = e => {\n this.$nextTick(() => {\n this.setDictTable(column, e);\n });\n };\n }\n }\n },\n setDictUrl(column, like) {\n let dictUrl = column.dictUrl.split(\",\");\n let url;\n let label = 'label';\n let value = 'value';\n let parentId = 'parentId';\n // get,url,label,value,parent_id\n let doGet = true;\n if (dictUrl.length > 1) {\n if (dictUrl[0].toString().toLowerCase() == 'post') {\n doGet = false;\n }\n url = dictUrl[1];\n label = dictUrl[2];\n value = dictUrl[3];\n parentId = dictUrl[4];\n } else {\n url = dictUrl[0];\n }\n if (doGet) {\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.get)(this.http, url + \"?label=\" + like).then(data => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_6__.handleTree)(data, value, parentId);\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n } else {\n let params = {};\n if (like) {\n params['label'] = like;\n }\n (0,_utils_http_httpUtils__WEBPACK_IMPORTED_MODULE_5__.post)(this.http, column.dictUrl, params, false).then(({\n data\n }) => {\n column.dicData.length = 0;\n if (column.type == 'tree') {\n for (let da of data) {\n da['label'] = da[label];\n da['value'] = da[value];\n }\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_6__.handleTree)(data, value, parentId);\n } else {\n data.forEach(da => {\n da['label'] = da[label];\n da['value'] = da[value];\n column.dicData.push(da);\n });\n }\n });\n }\n },\n setDictTable(column, like) {\n if (column.dictTable && column.dictTable.toString().trim() != '') {\n this.doSetDictTable(column, like);\n } else if (column.dictUrl) {\n this.setDictUrl(column, like);\n }\n },\n doSetDictTable(column, like) {\n let value = this.formData[column.prop];\n /*String tableName;\r\n String dataBase;\r\n String label;\r\n String value;\r\n Map<String, Object> where;*/\n // olp-vue-pro,system_users,nickname,id,parentId\n let params = {};\n let dictTable = JSON.parse(JSON.stringify(column.dictTable));\n if (dictTable instanceof Object) {\n params = dictTable;\n } else {\n dictTable = column.dictTable.split(\",\");\n params[\"dbName\"] = dictTable[0];\n params[\"tableName\"] = dictTable[1];\n params[\"label\"] = dictTable[2];\n params[\"value\"] = dictTable[3];\n if (dictTable[4]) {\n params[\"parentValue\"] = dictTable[4];\n }\n }\n if (like || value) {\n if (!params.where) {\n params.where = {};\n }\n }\n if (!params[\"parentValue\"]) {\n if (like) {\n params.where['_like_' + params[\"label\"]] = like;\n }\n if (value) {\n params.defaultValue = value;\n }\n }\n (0,_api_dist__WEBPACK_IMPORTED_MODULE_8__.initDictTable)(this.http, params).then(data => {\n column.dicData.length = 0;\n if (params[\"parentValue\"]) {\n column.dicData = (0,_utils_tree__WEBPACK_IMPORTED_MODULE_6__.handleTree)(data, 'dictValue', 'parentValue');\n } else {\n data.forEach(d => {\n column.dicData.push(d);\n });\n }\n });\n },\n /**\r\n * 表格选择器回调函数\r\n * @param data\r\n */\n olTableSelectChange(slotName, data) {\n // console.info('插槽名称', slotName, '表格回传的数据', data)\n // console.info('表格', this.form.column)\n this.formData[slotName] = data.value; //修改表单数据,以便后续提交\n if (typeof this.dynamicSlotsField[slotName].change === 'function') {\n this.dynamicSlotsField[slotName].change(data.value); //字段数据更新回调\n }\n //给其他字段赋值\n this.dynamicSlotsOtherResult[slotName]?.forEach(item => {\n this.formData[item.targetField] = data.data[item.sourceField];\n });\n }\n },\n mounted() {\n this.$nextTick(() => {\n (0,_store_dict__WEBPACK_IMPORTED_MODULE_10__.storeDict)().init(this.http);\n });\n },\n created() {}\n});\n\n//# sourceURL=webpack://olp-table/./src/components/table/ol-form/index.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-124.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
|
|
524
524
|
|
|
525
525
|
/***/ }),
|
|
526
526
|
|
|
@@ -5912,28 +5912,6 @@ eval("var baseValues = __webpack_require__(/*! ./_baseValues */ \"./node_modules
|
|
|
5912
5912
|
|
|
5913
5913
|
/***/ }),
|
|
5914
5914
|
|
|
5915
|
-
/***/ "./node_modules/pako/dist/pako.esm.mjs":
|
|
5916
|
-
/*!*********************************************!*\
|
|
5917
|
-
!*** ./node_modules/pako/dist/pako.esm.mjs ***!
|
|
5918
|
-
\*********************************************/
|
|
5919
|
-
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
5920
|
-
|
|
5921
|
-
"use strict";
|
|
5922
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Deflate: function() { return /* binding */ Deflate_1; },\n/* harmony export */ Inflate: function() { return /* binding */ Inflate_1; },\n/* harmony export */ constants: function() { return /* binding */ constants_1; },\n/* harmony export */ \"default\": function() { return /* binding */ pako; },\n/* harmony export */ deflate: function() { return /* binding */ deflate_1; },\n/* harmony export */ deflateRaw: function() { return /* binding */ deflateRaw_1; },\n/* harmony export */ gzip: function() { return /* binding */ gzip_1; },\n/* harmony export */ inflate: function() { return /* binding */ inflate_1; },\n/* harmony export */ inflateRaw: function() { return /* binding */ inflateRaw_1; },\n/* harmony export */ ungzip: function() { return /* binding */ ungzip_1; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.typed-array.with.js */ \"./node_modules/core-js/modules/es.typed-array.with.js\");\n\n\n/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED$1 = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN$1 = 2;\n\n/*============================================================================*/\n\nfunction zero$1(buf) {\n let len = buf.length;\n while (--len >= 0) {\n buf[len] = 0;\n }\n}\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1 = 30;\n/* number of distance codes */\n\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\nnew Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]);\nconst extra_dbits = /* extra bits for each distance code */\nnew Uint8Array([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]);\nconst extra_blbits = /* extra bits for each bit length code */\nnew Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]);\nconst bl_order = new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\nconst d_code = dist => {\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n // put_byte(s, (uch)((w) & 0xff));\n // put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = w & 0xff;\n s.pending_buf[s.pending++] = w >>> 8 & 0xff;\n};\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n if (s.bi_valid > Buf_size - length) {\n s.bi_buf |= value << s.bi_valid & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> Buf_size - s.bi_valid;\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= value << s.bi_valid & 0xffff;\n s.bi_valid += length;\n }\n};\nconst send_code = (s, c, tree) => {\n send_bits(s, tree[c * 2] /*.Code*/, tree[c * 2 + 1] /*.Len*/);\n};\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = s => {\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) => {\n // deflate_state *s;\n // tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1] /*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1] /*.Dad*/ * 2 + 1] /*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1] /*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) {\n continue;\n } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2] /*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1] /*.Len*/ + xbits);\n }\n }\n if (overflow === 0) {\n return;\n }\n\n // Tracev((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) {\n bits--;\n }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) {\n continue;\n }\n if (tree[m * 2 + 1] /*.Len*/ !== bits) {\n // Tracev((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1] /*.Len*/) * tree[m * 2] /*.Freq*/;\n tree[m * 2 + 1] /*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) => {\n // ct_data *tree; /* the tree to decorate */\n // int max_code; /* largest code with non zero frequency */\n // ushf *bl_count; /* number of codes at each bit length */\n\n const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS$1; bits++) {\n code = code + bl_count[bits - 1] << 1;\n next_code[bits] = code;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n // \"inconsistent bit counts\");\n //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n for (n = 0; n <= max_code; n++) {\n let len = tree[n * 2 + 1] /*.Len*/;\n if (len === 0) {\n continue;\n }\n /* Now reverse the bits */\n tree[n * 2] /*.Code*/ = bi_reverse(next_code[len]++, len);\n\n //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n }\n};\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nconst tr_static_init = () => {\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n /*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n #endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < 1 << extra_lbits[code]; n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < 1 << extra_dbits[code]; n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES$1; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < 1 << extra_dbits[code] - 7; n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n bl_count[bits] = 0;\n }\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1] /*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1] /*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1] /*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1] /*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES$1; n++) {\n static_dtree[n * 2 + 1] /*.Len*/ = 5;\n static_dtree[n * 2] /*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = s => {\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES$1; n++) {\n s.dyn_ltree[n * 2] /*.Freq*/ = 0;\n }\n for (n = 0; n < D_CODES$1; n++) {\n s.dyn_dtree[n * 2] /*.Freq*/ = 0;\n }\n for (n = 0; n < BL_CODES$1; n++) {\n s.bl_tree[n * 2] /*.Freq*/ = 0;\n }\n s.dyn_ltree[END_BLOCK * 2] /*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.sym_next = s.matches = 0;\n};\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = s => {\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n const _n2 = n * 2;\n const _m2 = m * 2;\n return tree[_n2] /*.Freq*/ < tree[_m2] /*.Freq*/ || tree[_n2] /*.Freq*/ === tree[_m2] /*.Freq*/ && depth[n] <= depth[m];\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) => {\n // deflate_state *s;\n // ct_data *tree; /* the tree to restore */\n // int k; /* node to move down */\n\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len && smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) {\n break;\n }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) => {\n // deflate_state *s;\n // const ct_data *ltree; /* literal tree */\n // const ct_data *dtree; /* distance tree */\n\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let sx = 0; /* running index in sym_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.sym_next !== 0) {\n do {\n dist = s.pending_buf[s.sym_buf + sx++] & 0xff;\n dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;\n lc = s.pending_buf[s.sym_buf + sx++];\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and sym_buf is ok: */\n //Assert(s->pending < s->lit_bufsize + sx, \"pendingBuf overflow\");\n } while (sx < s.sym_next);\n }\n send_code(s, END_BLOCK, ltree);\n};\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) => {\n // deflate_state *s;\n // tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE$1;\n for (n = 0; n < elems; n++) {\n if (tree[n * 2] /*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n } else {\n tree[n * 2 + 1] /*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0;\n tree[node * 2] /*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1] /*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = s.heap_len >> 1 /*int /2*/; n >= 1; n--) {\n pqdownheap(s, tree, n);\n }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1 /*SMALLEST*/];\n s.heap[1 /*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1 /*SMALLEST*/);\n /***/\n\n m = s.heap[1 /*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2] /*.Freq*/ = tree[n * 2] /*.Freq*/ + tree[m * 2] /*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1] /*.Dad*/ = tree[m * 2 + 1] /*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1 /*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1 /*SMALLEST*/);\n } while (s.heap_len >= 2);\n s.heap[--s.heap_max] = s.heap[1 /*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) => {\n // deflate_state *s;\n // ct_data *tree; /* the tree to be scanned */\n // int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1] /*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1] /*.Len*/;\n if (++count < max_count && curlen === nextlen) {\n continue;\n } else if (count < min_count) {\n s.bl_tree[curlen * 2] /*.Freq*/ += count;\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n s.bl_tree[curlen * 2] /*.Freq*/++;\n }\n s.bl_tree[REP_3_6 * 2] /*.Freq*/++;\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2] /*.Freq*/++;\n } else {\n s.bl_tree[REPZ_11_138 * 2] /*.Freq*/++;\n }\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) => {\n // deflate_state *s;\n // ct_data *tree; /* the tree to be scanned */\n // int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1] /*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1] /*.Len*/;\n if (++count < max_count && curlen === nextlen) {\n continue;\n } else if (count < min_count) {\n do {\n send_code(s, curlen, s.bl_tree);\n } while (--count !== 0);\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = s => {\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1] /*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) => {\n // deflate_state *s;\n // int lcodes, dcodes, blcodes; /* number of codes for each tree */\n\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1] /*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"block list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"allow list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = s => {\n /* block_mask is the bit mask of block-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let block_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"block-listed\") bytes. */\n for (n = 0; n <= 31; n++, block_mask >>>= 1) {\n if (block_mask & 1 && s.dyn_ltree[n * 2] /*.Freq*/ !== 0) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"allow-listed\") bytes. */\n if (s.dyn_ltree[9 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[10 * 2] /*.Freq*/ !== 0 || s.dyn_ltree[13 * 2] /*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS$1; n++) {\n if (s.dyn_ltree[n * 2] /*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"block-listed\" or \"allow-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = s => {\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) => {\n //DeflateState *s;\n //charf *buf; /* input block */\n //ulg stored_len; /* length of input block */\n //int last; /* one if this is the last block for a file */\n\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n bi_windup(s); /* align on byte boundary */\n put_short(s, stored_len);\n put_short(s, ~stored_len);\n if (stored_len) {\n s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);\n }\n s.pending += stored_len;\n};\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = s => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and write out the encoded block.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) => {\n //DeflateState *s;\n //charf *buf; /* input block, or NULL if too old */\n //ulg stored_len; /* length of input block */\n //int last; /* one if this is the last block for a file */\n\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN$1) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = s.opt_len + 3 + 7 >>> 3;\n static_lenb = s.static_len + 3 + 7 >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->sym_next / 3));\n\n if (static_lenb <= opt_lenb) {\n opt_lenb = static_lenb;\n }\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n if (stored_len + 4 <= opt_lenb && buf !== -1) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block$1(s, buf, stored_len, last);\n } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) => {\n // deflate_state *s;\n // unsigned dist; /* distance of matched string */\n // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n\n s.pending_buf[s.sym_buf + s.sym_next++] = dist;\n s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;\n s.pending_buf[s.sym_buf + s.sym_next++] = lc;\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2] /*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2] /*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2] /*.Freq*/++;\n }\n return s.sym_next === s.sym_end;\n};\nvar _tr_init_1 = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1 = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\nvar trees = {\n _tr_init: _tr_init_1,\n _tr_stored_block: _tr_stored_block_1,\n _tr_flush_block: _tr_flush_block_1,\n _tr_tally: _tr_tally_1,\n _tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = adler & 0xffff | 0,\n s2 = adler >>> 16 & 0xffff | 0,\n n = 0;\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n do {\n s1 = s1 + buf[pos++] | 0;\n s2 = s2 + s1 | 0;\n } while (--n);\n s1 %= 65521;\n s2 %= 65521;\n }\n return s1 | s2 << 16 | 0;\n};\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c,\n table = [];\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1;\n }\n table[n] = c;\n }\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n crc ^= -1;\n for (let i = pos; i < end; i++) {\n crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 0xFF];\n }\n return crc ^ -1; // >>> 0;\n};\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary',\n /* Z_NEED_DICT 2 */\n 1: 'stream end',\n /* Z_STREAM_END 1 */\n 0: '',\n /* Z_OK 0 */\n '-1': 'file error',\n /* Z_ERRNO (-1) */\n '-2': 'stream error',\n /* Z_STREAM_ERROR (-2) */\n '-3': 'data error',\n /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory',\n /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error',\n /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst {\n _tr_init,\n _tr_stored_block,\n _tr_flush_block,\n _tr_tally,\n _tr_align\n} = trees;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2,\n Z_PARTIAL_FLUSH,\n Z_FULL_FLUSH: Z_FULL_FLUSH$1,\n Z_FINISH: Z_FINISH$3,\n Z_BLOCK: Z_BLOCK$1,\n Z_OK: Z_OK$3,\n Z_STREAM_END: Z_STREAM_END$3,\n Z_STREAM_ERROR: Z_STREAM_ERROR$2,\n Z_DATA_ERROR: Z_DATA_ERROR$2,\n Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_FILTERED,\n Z_HUFFMAN_ONLY,\n Z_RLE,\n Z_FIXED,\n Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_UNKNOWN,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES = 30;\n/* number of distance codes */\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1;\nconst PRESET_DICT = 0x20;\nconst INIT_STATE = 42; /* zlib header -> BUSY_STATE */\n//#ifdef GZIP\nconst GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */\n//#endif\nconst EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */\nconst NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */\nconst COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */\nconst HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */\nconst BUSY_STATE = 113; /* deflate -> FINISH_STATE */\nconst FINISH_STATE = 666; /* stream complete */\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\nconst rank = f => {\n return f * 2 - (f > 4 ? 9 : 0);\n};\nconst zero = buf => {\n let len = buf.length;\n while (--len >= 0) {\n buf[len] = 0;\n }\n};\n\n/* ===========================================================================\n * Slide the hash table when sliding the window down (could be avoided with 32\n * bit values at the expense of memory usage). We slide even when level == 0 to\n * keep the hash table consistent if we switch back to level > 0 later.\n */\nconst slide_hash = s => {\n let n, m;\n let p;\n let wsize = s.w_size;\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = m >= wsize ? m - wsize : 0;\n } while (--n);\n n = wsize;\n //#ifndef FASTEST\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = m >= wsize ? m - wsize : 0;\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n //#endif\n};\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => (prev << s.hash_shift ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output, except for\n * some deflate_stored() output, goes through this function so some\n * applications may wish to modify it to avoid allocating a large\n * strm->next_out buffer and copying into it. (See also read_buf()).\n */\nconst flush_pending = strm => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) {\n return;\n }\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\nconst flush_block_only = (s, last) => {\n _tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n // put_byte(s, (Byte)(b >> 8));\n // put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = b >>> 8 & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n let len = strm.avail_in;\n if (len > size) {\n len = size;\n }\n if (len === 0) {\n return 0;\n }\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n } else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n strm.next_in += len;\n strm.total_in += len;\n return len;\n};\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0 /*NIL*/;\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) {\n nice_match = s.lookahead;\n }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = s => {\n const _w_size = s.w_size;\n let n, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n slide_hash(s);\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n //#if MIN_MATCH != 3\n // Call update_hash() MIN_MATCH-3 more times\n //#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n // if (s.high_water < s.window_size) {\n // const curr = s.strstart + s.lookahead;\n // let init = 0;\n //\n // if (s.high_water < curr) {\n // /* Previous high water mark below current data -- zero WIN_INIT\n // * bytes or up to end of window, whichever is less.\n // */\n // init = s.window_size - curr;\n // if (init > WIN_INIT)\n // init = WIN_INIT;\n // zmemzero(s->window + curr, (unsigned)init);\n // s->high_water = curr + init;\n // }\n // else if (s->high_water < (ulg)curr + WIN_INIT) {\n // /* High water mark at or above current data, but below current data\n // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n // * to end of window, whichever is less.\n // */\n // init = (ulg)curr + WIN_INIT - s->high_water;\n // if (init > s->window_size - s->high_water)\n // init = s->window_size - s->high_water;\n // zmemzero(s->window + s->high_water, (unsigned)init);\n // s->high_water += init;\n // }\n // }\n //\n // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n // \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n *\n * In case deflateParams() is used to later switch to a non-zero compression\n * level, s->matches (otherwise unused when storing) keeps track of the number\n * of hash table slides to perform. If s->matches is 1, then one hash table\n * slide will be done when switching. If s->matches is 2, the maximum value\n * allowed here, then the hash table will be cleared, since two or more slides\n * is the same as a clear.\n *\n * deflate_stored() is written to minimize the number of times an input byte is\n * copied. It is most efficient with large input and output buffers, which\n * maximizes the opportunites to have a single copy from next_in to next_out.\n */\nconst deflate_stored = (s, flush) => {\n /* Smallest worthy block size when not flushing or finishing. By default\n * this is 32K. This can be as small as 507 bytes for memLevel == 1. For\n * large input and output buffers, the stored block size will be larger.\n */\n let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;\n\n /* Copy as many min_block or larger stored blocks directly to next_out as\n * possible. If flushing, copy the remaining available input to next_out as\n * stored blocks, if there is enough space.\n */\n let len,\n left,\n have,\n last = 0;\n let used = s.strm.avail_in;\n do {\n /* Set len to the maximum size block that we can copy directly with the\n * available input data and output space. Set left to how much of that\n * would be copied from what's left in the window.\n */\n len = 65535 /* MAX_STORED */; /* maximum deflate stored block length */\n have = s.bi_valid + 42 >> 3; /* number of header bytes */\n if (s.strm.avail_out < have) {\n /* need room for header */\n break;\n }\n /* maximum stored block length that will fit in avail_out: */\n have = s.strm.avail_out - have;\n left = s.strstart - s.block_start; /* bytes left in window */\n if (len > left + s.strm.avail_in) {\n len = left + s.strm.avail_in; /* limit len to the input */\n }\n if (len > have) {\n len = have; /* limit len to the output */\n }\n\n /* If the stored block would be less than min_block in length, or if\n * unable to copy all of the available input when flushing, then try\n * copying to the window and the pending buffer instead. Also don't\n * write an empty block when flushing -- deflate() does that.\n */\n if (len < min_block && (len === 0 && flush !== Z_FINISH$3 || flush === Z_NO_FLUSH$2 || len !== left + s.strm.avail_in)) {\n break;\n }\n\n /* Make a dummy stored block in pending to get the header bytes,\n * including any pending bits. This also updates the debugging counts.\n */\n last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0;\n _tr_stored_block(s, 0, 0, last);\n\n /* Replace the lengths in the dummy stored block with len. */\n s.pending_buf[s.pending - 4] = len;\n s.pending_buf[s.pending - 3] = len >> 8;\n s.pending_buf[s.pending - 2] = ~len;\n s.pending_buf[s.pending - 1] = ~len >> 8;\n\n /* Write the stored block header bytes. */\n flush_pending(s.strm);\n\n //#ifdef ZLIB_DEBUG\n // /* Update debugging counts for the data about to be copied. */\n // s->compressed_len += len << 3;\n // s->bits_sent += len << 3;\n //#endif\n\n /* Copy uncompressed bytes from the window to next_out. */\n if (left) {\n if (left > len) {\n left = len;\n }\n //zmemcpy(s->strm->next_out, s->window + s->block_start, left);\n s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);\n s.strm.next_out += left;\n s.strm.avail_out -= left;\n s.strm.total_out += left;\n s.block_start += left;\n len -= left;\n }\n\n /* Copy uncompressed bytes directly from next_in to next_out, updating\n * the check value.\n */\n if (len) {\n read_buf(s.strm, s.strm.output, s.strm.next_out, len);\n s.strm.next_out += len;\n s.strm.avail_out -= len;\n s.strm.total_out += len;\n }\n } while (last === 0);\n\n /* Update the sliding window with the last s->w_size bytes of the copied\n * data, or append all of the copied data to the existing window if less\n * than s->w_size bytes were copied. Also update the number of bytes to\n * insert in the hash tables, in the event that deflateParams() switches to\n * a non-zero compression level.\n */\n used -= s.strm.avail_in; /* number of input bytes directly copied */\n if (used) {\n /* If any input was used, then no unused input remains in the window,\n * therefore s->block_start == s->strstart.\n */\n if (used >= s.w_size) {\n /* supplant the previous history */\n s.matches = 2; /* clear hash */\n //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);\n s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);\n s.strstart = s.w_size;\n s.insert = s.strstart;\n } else {\n if (s.window_size - s.strstart <= used) {\n /* Slide the window down. */\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);\n s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);\n s.strstart += used;\n s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;\n }\n s.block_start = s.strstart;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* If the last block was written to next_out, then done. */\n if (last) {\n return BS_FINISH_DONE;\n }\n\n /* If flushing and all input has been consumed, then done. */\n if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 && s.strm.avail_in === 0 && s.strstart === s.block_start) {\n return BS_BLOCK_DONE;\n }\n\n /* Fill the window with any remaining input. */\n have = s.window_size - s.strstart;\n if (s.strm.avail_in > have && s.block_start >= s.w_size) {\n /* Slide the window down. */\n s.block_start -= s.w_size;\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n have += s.w_size; /* more space now */\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n if (have > s.strm.avail_in) {\n have = s.strm.avail_in;\n }\n if (have) {\n read_buf(s.strm, s.window, s.strstart, have);\n s.strstart += have;\n s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* There was not enough avail_out to write a complete worthy or flushed\n * stored block to next_out. Write a stored block to pending instead, if we\n * have enough input for a worthy block, or if flushing and there is enough\n * room for the remaining input as a stored block in the pending buffer.\n */\n have = s.bi_valid + 42 >> 3; /* number of header bytes */\n /* maximum stored block length that will fit in pending: */\n have = s.pending_buf_size - have > 65535 /* MAX_STORED */ ? 65535 /* MAX_STORED */ : s.pending_buf_size - have;\n min_block = have > s.w_size ? s.w_size : have;\n left = s.strstart - s.block_start;\n if (left >= min_block || (left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 && s.strm.avail_in === 0 && left <= have) {\n len = left > have ? have : left;\n last = flush === Z_FINISH$3 && s.strm.avail_in === 0 && len === left ? 1 : 0;\n _tr_stored_block(s, s.block_start, len, last);\n s.block_start += len;\n flush_pending(s.strm);\n }\n\n /* We've done all we can with the available input and output. */\n return last ? BS_FINISH_STARTED : BS_NEED_MORE;\n};\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0 /*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0 /*NIL*/ && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match /*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n //#if MIN_MATCH != 3\n // Call UPDATE_HASH() MIN_MATCH-3 more times\n //#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break;\n } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0 /*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n if (hash_head !== 0 /*NIL*/ && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD /*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096 /*TOO_FAR*/)) {\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break;\n } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\nconst configuration_table = [/* good lazy nice chain */\nnew Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\nnew Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\nnew Config(4, 5, 16, 8, deflate_fast), /* 2 */\nnew Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\nnew Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\nnew Config(8, 16, 32, 32, deflate_slow), /* 5 */\nnew Config(8, 16, 128, 128, deflate_slow), /* 6 */\nnew Config(8, 32, 128, 256, deflate_slow), /* 7 */\nnew Config(32, 128, 258, 1024, deflate_slow), /* 8 */\nnew Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */];\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = s => {\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.sym_buf = 0; /* buffer for distances and literals/lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.sym_next = 0; /* running index in sym_buf */\n this.sym_end = 0; /* symbol table full when sym_next reaches this */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n/* =========================================================================\n * Check for a valid deflate stream state. Return 0 if ok, 1 if not.\n */\nconst deflateStateCheck = strm => {\n if (!strm) {\n return 1;\n }\n const s = strm.state;\n if (!s || s.strm !== strm || s.status !== INIT_STATE &&\n //#ifdef GZIP\n s.status !== GZIP_STATE &&\n //#endif\n s.status !== EXTRA_STATE && s.status !== NAME_STATE && s.status !== COMMENT_STATE && s.status !== HCRC_STATE && s.status !== BUSY_STATE && s.status !== FINISH_STATE) {\n return 1;\n }\n return 0;\n};\nconst deflateResetKeep = strm => {\n if (deflateStateCheck(strm)) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status =\n //#ifdef GZIP\n s.wrap === 2 ? GZIP_STATE :\n //#endif\n s.wrap ? INIT_STATE : BUSY_STATE;\n strm.adler = s.wrap === 2 ? 0 // crc32(0, Z_NULL, 0)\n : 1; // adler32(0, Z_NULL, 0)\n s.last_flush = -2;\n _tr_init(s);\n return Z_OK$3;\n};\nconst deflateReset = strm => {\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK$3) {\n lm_init(strm.state);\n }\n return ret;\n};\nconst deflateSetHeader = (strm, head) => {\n if (deflateStateCheck(strm) || strm.state.wrap !== 2) {\n return Z_STREAM_ERROR$2;\n }\n strm.state.gzhead = head;\n return Z_OK$3;\n};\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n if (!strm) {\n // === Z_NULL\n return Z_STREAM_ERROR$2;\n }\n let wrap = 1;\n if (level === Z_DEFAULT_COMPRESSION$1) {\n level = 6;\n }\n if (windowBits < 0) {\n /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n } else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED || windowBits === 8 && wrap !== 1) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n strm.state = s;\n s.strm = strm;\n s.status = INIT_STATE; /* to pass state test in deflateReset() */\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << memLevel + 6; /* 16K elements by default */\n\n /* We overlay pending_buf and sym_buf. This works since the average size\n * for length/distance pairs over any compressed block is assured to be 31\n * bits or less.\n *\n * Analysis: The longest fixed codes are a length code of 8 bits plus 5\n * extra bits, for lengths 131 to 257. The longest fixed distance codes are\n * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest\n * possible fixed-codes length/distance pair is then 31 bits total.\n *\n * sym_buf starts one-fourth of the way into pending_buf. So there are\n * three bytes in sym_buf for every four bytes in pending_buf. Each symbol\n * in sym_buf is three bytes -- two for the distance and one for the\n * literal/length. As each symbol is consumed, the pointer to the next\n * sym_buf value to read moves forward three bytes. From that symbol, up to\n * 31 bits are written to pending_buf. The closest the written pending_buf\n * bits gets to the next sym_buf symbol to read is just before the last\n * code is written. At that time, 31*(n-2) bits have been written, just\n * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at\n * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1\n * symbols are written.) The closest the writing gets to what is unread is\n * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and\n * can range from 128 to 32768.\n *\n * Therefore, at a minimum, there are 142 bits of space between what is\n * written and what is read in the overlain buffers, so the symbols cannot\n * be overwritten by the compressed data. That space is actually 139 bits,\n * due to the three-bit fixed-code block header.\n *\n * That covers the case where either Z_FIXED is specified, forcing fixed\n * codes, or when the use of fixed codes is chosen, because that choice\n * results in a smaller compressed block than dynamic codes. That latter\n * condition then assures that the above analysis also covers all dynamic\n * blocks. A dynamic-code block will only be chosen to be emitted if it has\n * fewer bits than a fixed-code block would for the same set of symbols.\n * Therefore its average symbol length is assured to be less than 31. So\n * the compressed data for a dynamic block also cannot overwrite the\n * symbols from which it is being constructed.\n */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->sym_buf = s->pending_buf + s->lit_bufsize;\n s.sym_buf = s.lit_bufsize;\n\n //s->sym_end = (s->lit_bufsize - 1) * 3;\n s.sym_end = (s.lit_bufsize - 1) * 3;\n /* We avoid equality with lit_bufsize*3 because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n return deflateReset(strm);\n};\nconst deflateInit = (strm, level) => {\n return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n/* ========================================================================= */\nconst deflate$2 = (strm, flush) => {\n if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n }\n const s = strm.state;\n if (!strm.output || strm.avail_in !== 0 && !strm.input || s.status === FINISH_STATE && flush !== Z_FINISH$3) {\n return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n }\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK$3;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH$3) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* Write the header */\n if (s.status === INIT_STATE && s.wrap === 0) {\n s.status = BUSY_STATE;\n }\n if (s.status === INIT_STATE) {\n /* zlib header */\n let header = Z_DEFLATED$2 + (s.w_bits - 8 << 4) << 8;\n let level_flags = -1;\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= level_flags << 6;\n if (s.strstart !== 0) {\n header |= PRESET_DICT;\n }\n header += 31 - header % 31;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n //#ifdef GZIP\n if (s.status === GZIP_STATE) {\n /* gzip header */\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) {\n // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0);\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n } else {\n put_byte(s, (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16));\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, s.gzhead.time >> 8 & 0xff);\n put_byte(s, s.gzhead.time >> 16 & 0xff);\n put_byte(s, s.gzhead.time >> 24 & 0xff);\n put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0);\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, s.gzhead.extra.length >> 8 & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra /* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;\n while (s.pending + left > s.pending_buf_size) {\n let copy = s.pending_buf_size - s.pending;\n // zmemcpy(s.pending_buf + s.pending,\n // s.gzhead.extra + s.gzindex, copy);\n s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);\n s.pending = s.pending_buf_size;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex += copy;\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n left -= copy;\n }\n // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility\n // TypedArray.slice and TypedArray.from don't exist in IE10-IE11\n let gzhead_extra = new Uint8Array(s.gzhead.extra);\n // zmemcpy(s->pending_buf + s->pending,\n // s->gzhead->extra + s->gzindex, left);\n s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);\n s.pending += left;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = NAME_STATE;\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name /* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = COMMENT_STATE;\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment /* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n }\n s.status = HCRC_STATE;\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n put_byte(s, strm.adler & 0xff);\n put_byte(s, strm.adler >> 8 & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n }\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n //#endif\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE) {\n let bstate = s.level === 0 ? deflate_stored(s, flush) : s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush);\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK$3;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align(s);\n } else if (flush !== Z_BLOCK$1) {\n /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH$1) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK$3;\n }\n }\n }\n if (flush !== Z_FINISH$3) {\n return Z_OK$3;\n }\n if (s.wrap <= 0) {\n return Z_STREAM_END$3;\n }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, strm.adler >> 8 & 0xff);\n put_byte(s, strm.adler >> 16 & 0xff);\n put_byte(s, strm.adler >> 24 & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, strm.total_in >> 8 & 0xff);\n put_byte(s, strm.total_in >> 16 & 0xff);\n put_byte(s, strm.total_in >> 24 & 0xff);\n } else {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) {\n s.wrap = -s.wrap;\n }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\nconst deflateEnd = strm => {\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n const status = strm.state.status;\n strm.state = null;\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n let dictLength = dictionary.length;\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n const s = strm.state;\n const wrap = s.wrap;\n if (wrap === 2 || wrap === 1 && s.status !== INIT_STATE || s.lookahead) {\n return Z_STREAM_ERROR$2;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) {\n /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK$3;\n};\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateGetDictionary = deflateGetDictionary;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n deflateInit: deflateInit_1,\n deflateInit2: deflateInit2_1,\n deflateReset: deflateReset_1,\n deflateResetKeep: deflateResetKeep_1,\n deflateSetHeader: deflateSetHeader_1,\n deflate: deflate_2$1,\n deflateEnd: deflateEnd_1,\n deflateSetDictionary: deflateSetDictionary_1,\n deflateInfo: deflateInfo\n};\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) {\n continue;\n }\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n return obj;\n};\n\n// Join array of chunks to single array.\nvar flattenChunks = chunks => {\n // calculate data length\n let len = 0;\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n return result;\n};\nvar common = {\n assign: assign,\n flattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\ntry {\n String.fromCharCode.apply(null, new Uint8Array(1));\n} catch (__) {\n STR_APPLY_UIA_OK = false;\n}\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1;\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n// convert string to array (typed, when possible)\nvar string2buf = str => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n let buf,\n c,\n c2,\n m_pos,\n i,\n str_len = str.length,\n buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + (c - 0xd800 << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | c >>> 6;\n buf[i++] = 0x80 | c & 0x3f;\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | c >>> 12;\n buf[i++] = 0x80 | c >>> 6 & 0x3f;\n buf[i++] = 0x80 | c & 0x3f;\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | c >>> 18;\n buf[i++] = 0x80 | c >>> 12 & 0x3f;\n buf[i++] = 0x80 | c >>> 6 & 0x3f;\n buf[i++] = 0x80 | c & 0x3f;\n }\n }\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n// convert array to string\nvar buf2string = (buf, max) => {\n const len = max || buf.length;\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) {\n utf16buf[out++] = c;\n continue;\n }\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) {\n utf16buf[out++] = 0xfffd;\n i += c_len - 1;\n continue;\n }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = c << 6 | buf[i++] & 0x3f;\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) {\n utf16buf[out++] = 0xfffd;\n continue;\n }\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | c >> 10 & 0x3ff;\n utf16buf[out++] = 0xdc00 | c & 0x3ff;\n }\n }\n return buf2binstring(utf16buf, out);\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n max = max || buf.length;\n if (max > buf.length) {\n max = buf.length;\n }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) {\n pos--;\n }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) {\n return max;\n }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) {\n return max;\n }\n return pos + _utf8len[buf[pos]] > max ? pos : max;\n};\nvar strings = {\n string2buf: string2buf,\n buf2string: buf2string,\n utf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = '' /*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2 /*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\nvar zstream = ZStream;\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1,\n Z_SYNC_FLUSH,\n Z_FULL_FLUSH,\n Z_FINISH: Z_FINISH$2,\n Z_OK: Z_OK$2,\n Z_STREAM_END: Z_STREAM_END$2,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_STRATEGY,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY\n }, options || {});\n let opt = this.options;\n if (opt.raw && opt.windowBits > 0) {\n opt.windowBits = -opt.windowBits;\n } else if (opt.gzip && opt.windowBits > 0 && opt.windowBits < 16) {\n opt.windowBits += 16;\n }\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n let status = deflate_1$2.deflateInit2(this.strm, opt.level, opt.method, opt.windowBits, opt.memLevel, opt.strategy);\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n if (opt.header) {\n deflate_1$2.deflateSetHeader(this.strm, opt.header);\n }\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n if (this.ended) {\n return false;\n }\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n status = deflate_1$2.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$2) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1$2.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$2;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n if (strm.avail_in === 0) break;\n }\n return true;\n};\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$2) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate$1(options);\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) {\n throw deflator.msg || messages[deflator.err];\n }\n return deflator.result;\n}\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\nvar deflate_1$1 = {\n Deflate: Deflate_1$1,\n deflate: deflate_2,\n deflateRaw: deflateRaw_1$1,\n gzip: gzip_1$1,\n constants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 16209; /* got a data error -- remain here until reset */\nconst TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n //#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n //#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n //#ifdef INFLATE_STRICT\n dmax = state.dmax;\n //#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top: do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = lcode[hold & lmask];\n dolen: for (;;) {\n // Goto emulation\n op = here >>> 24 /*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = here >>> 16 & 0xff /*here.op*/;\n if (op === 0) {\n /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff /*here.val*/;\n } else if (op & 16) {\n /* length base */\n len = here & 0xffff /*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & (1 << op) - 1;\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n dodist: for (;;) {\n // goto emulation\n op = here >>> 24 /*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = here >>> 16 & 0xff /*here.op*/;\n if (op & 16) {\n /* distance base */\n dist = here & 0xffff /*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & (1 << op) - 1;\n //#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n //#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) {\n /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // if (len <= op - whave) {\n // do {\n // output[_out++] = 0;\n // } while (--len);\n // continue top;\n // }\n // len -= op - whave;\n // do {\n // output[_out++] = 0;\n // } while (--op > whave);\n // if (op === 0) {\n // from = _out - dist;\n // do {\n // output[_out++] = output[from++];\n // } while (--len);\n // continue top;\n // }\n //#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) {\n /* very common case */\n from += wsize - op;\n if (op < len) {\n /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n } else if (wnext < op) {\n /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) {\n /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) {\n /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n } else {\n /* contiguous in window */\n from += wnext - op;\n if (op < len) {\n /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n } else {\n from = _out - dist; /* copy direct from output */\n do {\n /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n } else if ((op & 64) === 0) {\n /* 2nd level distance code */\n here = dcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)];\n continue dodist;\n } else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n break; // need to emulate goto via \"continue\"\n }\n } else if ((op & 64) === 0) {\n /* 2nd level length code */\n here = lcode[(here & 0xffff /*here.val*/) + (hold & (1 << op) - 1)];\n continue dolen;\n } else if (op & 32) {\n /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE$1;\n break top;\n } else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last);\n strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end);\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\nconst lbase = new Uint16Array([/* Length codes 257..285 base */\n3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]);\nconst lext = new Uint8Array([/* Length codes 257..285 extra */\n16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]);\nconst dbase = new Uint16Array([/* Distance codes 0..29 base */\n1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]);\nconst dext = new Uint8Array([/* Distance codes 0..29 extra */\n16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]);\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) => {\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0,\n max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n // let shoextra; /* extra bits table to use */\n let match; /* use base and extra for symbol >= match */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) {\n break;\n }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) {\n /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = 1 << 24 | 64 << 16 | 0;\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = 1 << 24 | 64 << 16 | 0;\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) {\n break;\n }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n match = 20;\n } else if (type === LENS$1) {\n base = lbase;\n extra = lext;\n match = 257;\n } else {\n /* DISTS */\n base = dbase;\n extra = dext;\n match = 0;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] + 1 < match) {\n here_op = 0;\n here_val = work[sym];\n } else if (work[sym] >= match) {\n here_op = extra[work[sym] - match];\n here_val = base[work[sym] - match];\n } else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << len - drop;\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << len - 1;\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) {\n break;\n }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) {\n break;\n }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if (type === LENS$1 && used > ENOUGH_LENS$1 || type === DISTS$1 && used > ENOUGH_DISTS$1) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = root << 24 | curr << 16 | next - table_index | 0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = len - drop << 24 | 64 << 16 | 0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$1,\n Z_BLOCK,\n Z_TREES,\n Z_OK: Z_OK$1,\n Z_STREAM_END: Z_STREAM_END$1,\n Z_NEED_DICT: Z_NEED_DICT$1,\n Z_STREAM_ERROR: Z_STREAM_ERROR$1,\n Z_DATA_ERROR: Z_DATA_ERROR$1,\n Z_MEM_ERROR: Z_MEM_ERROR$1,\n Z_BUF_ERROR,\n Z_DEFLATED\n} = constants$2;\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\nconst HEAD = 16180; /* i: waiting for magic header */\nconst FLAGS = 16181; /* i: waiting for method and flags (gzip) */\nconst TIME = 16182; /* i: waiting for modification time (gzip) */\nconst OS = 16183; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 16184; /* i: waiting for extra length (gzip) */\nconst EXTRA = 16185; /* i: waiting for extra bytes (gzip) */\nconst NAME = 16186; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 16187; /* i: waiting for end of comment (gzip) */\nconst HCRC = 16188; /* i: waiting for header crc (gzip) */\nconst DICTID = 16189; /* i: waiting for dictionary check value */\nconst DICT = 16190; /* waiting for inflateSetDictionary() call */\nconst TYPE = 16191; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 16193; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 16194; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16195; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 16196; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 16197; /* i: waiting for code length code lengths */\nconst CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 16199; /* i: same as LEN below, but only first time in */\nconst LEN = 16200; /* i: waiting for length/lit/eob code */\nconst LENEXT = 16201; /* i: waiting for length extra bits */\nconst DIST = 16202; /* i: waiting for distance code */\nconst DISTEXT = 16203; /* i: waiting for distance extra bits */\nconst MATCH = 16204; /* o: waiting for output space to copy string */\nconst LIT = 16205; /* o: waiting for output space to write literal */\nconst CHECK = 16206; /* i: waiting for 32-bit check value */\nconst LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 16208; /* finished check, done -- remain here until reset */\nconst BAD = 16209; /* got a data error -- remain here until reset */\nconst MEM = 16210; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 16211; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\nconst zswap32 = q => {\n return (q >>> 24 & 0xff) + (q >>> 8 & 0xff00) + ((q & 0xff00) << 8) + ((q & 0xff) << 24);\n};\nfunction InflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip,\n bit 2 true to validate check value */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib), or\n -1 if raw or no header yet */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\nconst inflateStateCheck = strm => {\n if (!strm) {\n return 1;\n }\n const state = strm.state;\n if (!state || state.strm !== strm || state.mode < HEAD || state.mode > SYNC) {\n return 1;\n }\n return 0;\n};\nconst inflateResetKeep = strm => {\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) {\n /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.flags = -1;\n state.dmax = 32768;\n state.head = null /*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$1;\n};\nconst inflateReset = strm => {\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n};\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n } else {\n wrap = (windowBits >> 4) + 5;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\nconst inflateInit2 = (strm, windowBits) => {\n if (!strm) {\n return Z_STREAM_ERROR$1;\n }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.strm = strm;\n state.window = null /*Z_NULL*/;\n state.mode = HEAD; /* to pass state test in inflateReset2() */\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null /*Z_NULL*/;\n }\n return ret;\n};\nconst inflateInit = strm => {\n return inflateInit2(strm, DEF_WBITS);\n};\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nconst fixedtables = state => {\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) {\n state.lens[sym++] = 8;\n }\n while (sym < 256) {\n state.lens[sym++] = 9;\n }\n while (sym < 280) {\n state.lens[sym++] = 7;\n }\n while (sym < 288) {\n state.lens[sym++] = 8;\n }\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, {\n bits: 9\n });\n\n /* distance table */\n sym = 0;\n while (sym < 32) {\n state.lens[sym++] = 5;\n }\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, {\n bits: 5\n });\n\n /* do this just once */\n virgin = false;\n }\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n } else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n } else {\n state.wnext += dist;\n if (state.wnext === state.wsize) {\n state.wnext = 0;\n }\n if (state.whave < state.wsize) {\n state.whave += dist;\n }\n }\n }\n return 0;\n};\nconst inflate$2 = (strm, flush) => {\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n if (inflateStateCheck(strm) || !strm.output || !strm.input && strm.avail_in !== 0) {\n return Z_STREAM_ERROR$1;\n }\n state = strm.state;\n if (state.mode === TYPE) {\n state.mode = TYPEDO;\n } /* skip check */\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n inf_leave:\n // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.wrap & 2 && hold === 0x8b1f) {\n /* gzip header */\n if (state.wbits === 0) {\n state.wbits = 15;\n }\n state.check = 0 /*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = hold >>> 8 & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff /*BITS(8)*/) << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f /*BITS(4)*/) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f /*BITS(4)*/) + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n if (len > 15 || len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n state.flags = 0; /* indicate zlib header */\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = hold >> 8 & 1;\n }\n if (state.flags & 0x0200 && state.wrap & 4) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = hold >>> 8 & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200 && state.wrap & 4) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = hold >>> 8 & 0xff;\n hbuf[2] = hold >>> 16 & 0xff;\n hbuf[3] = hold >>> 24 & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = hold & 0xff;\n state.head.os = hold >> 8;\n }\n if (state.flags & 0x0200 && state.wrap & 4) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = hold >>> 8 & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200 && state.wrap & 4) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = hold >>> 8 & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n } else if (state.head) {\n state.head.extra = null /*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) {\n copy = have;\n }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(input.subarray(next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy), /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len);\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200 && state.wrap & 4) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) {\n break inf_leave;\n }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) {\n break inf_leave;\n }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len && state.length < 65536 /*state.head.name_max*/) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200 && state.wrap & 4) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) {\n break inf_leave;\n }\n } else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) {\n break inf_leave;\n }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len && state.length < 65536 /*state.head.comm_max*/) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200 && state.wrap & 4) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) {\n break inf_leave;\n }\n } else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.wrap & 4 && hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = state.flags >> 9 & 1;\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1 /*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) {\n break inf_leave;\n }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = hold & 0x01 /*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch (hold & 0x03 /*BITS(2)*/) {\n case 0:\n /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1:\n /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2:\n /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== (hold >>> 16 ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) {\n break inf_leave;\n }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) {\n copy = have;\n }\n if (copy > left) {\n copy = left;\n }\n if (copy === 0) {\n break inf_leave;\n }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f /*BITS(5)*/) + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f /*BITS(5)*/) + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f /*BITS(4)*/) + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n //#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = hold & 0x07; //BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n opts = {\n bits: state.lenbits\n };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = here >>> 16 & 0xff;\n here_val = here & 0xffff;\n if (here_bits <= bits) {\n break;\n }\n //--- PULLBYTE() ---//\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n } else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03); //BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n } else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07); //BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n } else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f); //BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) {\n break;\n }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n opts = {\n bits: state.lenbits\n };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = {\n bits: state.distbits\n };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) {\n break inf_leave;\n }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & (1 << state.lenbits) - 1]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = here >>> 16 & 0xff;\n here_val = here & 0xffff;\n if (here_bits <= bits) {\n break;\n }\n //--- PULLBYTE() ---//\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)];\n here_bits = here >>> 24;\n here_op = here >>> 16 & 0xff;\n here_val = here & 0xffff;\n if (last_bits + here_bits <= bits) {\n break;\n }\n //--- PULLBYTE() ---//\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & (1 << state.distbits) - 1]; /*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = here >>> 16 & 0xff;\n here_val = here & 0xffff;\n if (here_bits <= bits) {\n break;\n }\n //--- PULLBYTE() ---//\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1 /*BITS(last.bits + last.op)*/) >> last_bits)];\n here_bits = here >>> 24;\n here_op = here >>> 16 & 0xff;\n here_val = here & 0xffff;\n if (last_bits + here_bits <= bits) {\n break;\n }\n //--- PULLBYTE() ---//\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = here_op & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & (1 << state.extra) - 1 /*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) {\n break inf_leave;\n }\n copy = _out - left;\n if (state.offset > copy) {\n /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // Trace((stderr, \"inflate.c too far\\n\"));\n // copy -= state.whave;\n // if (copy > state.length) { copy = state.length; }\n // if (copy > left) { copy = left; }\n // left -= copy;\n // state.length -= copy;\n // do {\n // output[put++] = 0;\n // } while (--copy);\n // if (state.length === 0) { state.mode = LEN; }\n // break;\n //#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n } else {\n from = state.wnext - copy;\n }\n if (copy > state.length) {\n copy = state.length;\n }\n from_source = state.window;\n } else {\n /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) {\n copy = left;\n }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) {\n state.mode = LEN;\n }\n break;\n case LIT:\n if (left === 0) {\n break inf_leave;\n }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap & 4 && _out) {\n strm.adler = state.check = /*UPDATE_CHECK(state.check, put - _out, _out);*/\n state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out);\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if (state.wrap & 4 && (state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) {\n break inf_leave;\n }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.wrap & 4 && hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH$1)) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap & 4 && _out) {\n strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/\n state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out);\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if ((_in === 0 && _out === 0 || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n};\nconst inflateEnd = strm => {\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n};\nconst inflateGetHeader = (strm, head) => {\n /* check state */\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n const state = strm.state;\n if ((state.wrap & 2) === 0) {\n return Z_STREAM_ERROR$1;\n }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n};\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n state = strm.state;\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$1;\n};\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCodesUsed = inflateCodesUsed;\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\nmodule.exports.inflateValidate = inflateValidate;\n*/\n\nvar inflate_1$2 = {\n inflateReset: inflateReset_1,\n inflateReset2: inflateReset2_1,\n inflateResetKeep: inflateResetKeep_1,\n inflateInit: inflateInit_1,\n inflateInit2: inflateInit2_1,\n inflate: inflate_2$1,\n inflateEnd: inflateEnd_1,\n inflateGetHeader: inflateGetHeader_1,\n inflateSetDictionary: inflateSetDictionary_1,\n inflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\nvar gzheader = GZheader;\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH,\n Z_FINISH,\n Z_OK,\n Z_STREAM_END,\n Z_NEED_DICT,\n Z_STREAM_ERROR,\n Z_DATA_ERROR,\n Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) {\n opt.windowBits = -15;\n }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if (opt.windowBits > 15 && opt.windowBits < 48) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n let status = inflate_1$2.inflateInit2(this.strm, opt.windowBits);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n this.header = new gzheader();\n inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) {\n //In raw mode we need to set the dictionary early\n status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n if (this.ended) return false;\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n status = inflate_1$2.inflate(strm, _flush_mode);\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n if (status === Z_OK) {\n status = inflate_1$2.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 && status === Z_STREAM_END && strm.state.wrap > 0 && data[strm.next_in] !== 0) {\n inflate_1$2.inflateReset(strm);\n status = inflate_1$2.inflate(strm, _flush_mode);\n }\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n if (this.options.to === 'string') {\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n this.onData(utf8str);\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$2.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n if (strm.avail_in === 0) break;\n }\n return true;\n};\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate$1(options);\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n return inflator.result;\n}\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\nvar inflate_1$1 = {\n Inflate: Inflate_1$1,\n inflate: inflate_2,\n inflateRaw: inflateRaw_1$1,\n ungzip: ungzip$1,\n constants: constants\n};\nconst {\n Deflate,\n deflate,\n deflateRaw,\n gzip\n} = deflate_1$1;\nconst {\n Inflate,\n inflate,\n inflateRaw,\n ungzip\n} = inflate_1$1;\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\nvar pako = {\n Deflate: Deflate_1,\n deflate: deflate_1,\n deflateRaw: deflateRaw_1,\n gzip: gzip_1,\n Inflate: Inflate_1,\n inflate: inflate_1,\n inflateRaw: inflateRaw_1,\n ungzip: ungzip_1,\n constants: constants_1\n};\n\n\n//# sourceURL=webpack://olp-table/./node_modules/pako/dist/pako.esm.mjs?");
|
|
5923
|
-
|
|
5924
|
-
/***/ }),
|
|
5925
|
-
|
|
5926
|
-
/***/ "./node_modules/pinyin-pro/dist/index.mjs":
|
|
5927
|
-
/*!************************************************!*\
|
|
5928
|
-
!*** ./node_modules/pinyin-pro/dist/index.mjs ***!
|
|
5929
|
-
\************************************************/
|
|
5930
|
-
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
5931
|
-
|
|
5932
|
-
"use strict";
|
|
5933
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ OutputFormat: function() { return /* binding */ OutputFormat; },\n/* harmony export */ addDict: function() { return /* binding */ addDict; },\n/* harmony export */ clearCustomDict: function() { return /* binding */ clearCustomDict; },\n/* harmony export */ convert: function() { return /* binding */ convert; },\n/* harmony export */ customPinyin: function() { return /* binding */ customPinyin; },\n/* harmony export */ getFinalParts: function() { return /* binding */ getFinalParts; },\n/* harmony export */ getInitialAndFinal: function() { return /* binding */ getInitialAndFinal; },\n/* harmony export */ getNumOfTone: function() { return /* binding */ getNumOfTone; },\n/* harmony export */ html: function() { return /* binding */ html; },\n/* harmony export */ match: function() { return /* binding */ match; },\n/* harmony export */ pinyin: function() { return /* binding */ pinyin; },\n/* harmony export */ polyphonic: function() { return /* binding */ polyphonic; },\n/* harmony export */ removeDict: function() { return /* binding */ removeDict; },\n/* harmony export */ segment: function() { return /* binding */ segment; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.iterator.some.js */ \"./node_modules/core-js/modules/es.iterator.some.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst DoubleUnicodePrefixReg = /^[\\uD800-\\uDBFF]$/;\nconst DoubleUnicodeSuffixReg = /^[\\uDC00-\\uDFFF]$/;\nconst DoubleUnicodeReg = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\nvar Probability;\n(function (Probability) {\n Probability[Probability[\"Unknown\"] = 1e-13] = \"Unknown\";\n Probability[Probability[\"Rule\"] = 1e-12] = \"Rule\";\n Probability[Probability[\"DICT\"] = 2e-8] = \"DICT\";\n Probability[Probability[\"Surname\"] = 1] = \"Surname\";\n Probability[Probability[\"Custom\"] = 1] = \"Custom\";\n})(Probability || (Probability = {}));\nconst Priority = {\n Normal: 1,\n Surname: 10,\n Custom: 100\n};\nfunction stringLength(text) {\n var _a;\n return text.length - (((_a = text.match(DoubleUnicodeReg)) === null || _a === void 0 ? void 0 : _a.length) || 0);\n}\n// 双音节字符处理\nfunction splitString(text) {\n const result = [];\n let i = 0;\n while (i < text.length) {\n const char = text[i];\n if (DoubleUnicodePrefixReg.test(char) && DoubleUnicodeSuffixReg.test(text[i + 1])) {\n result.push(text.substring(i, i + 2));\n i += 2;\n } else {\n result.push(char);\n i += 1;\n }\n }\n return result;\n}\nclass FastDictFactory {\n constructor() {\n this.NumberDICT = [];\n this.StringDICT = new Map();\n }\n get(word) {\n if (word.length > 1) {\n return this.StringDICT.get(word);\n } else {\n const code = word.charCodeAt(0);\n return this.NumberDICT[code];\n }\n }\n set(word, pinyin) {\n if (word.length > 1) {\n this.StringDICT.set(word, pinyin);\n } else {\n const code = word.charCodeAt(0);\n this.NumberDICT[code] = pinyin;\n }\n }\n clear() {\n this.NumberDICT = [];\n this.StringDICT.clear();\n }\n}\nconst map = {\n 'bǎng páng pāng': ['膀'],\n líng: ['〇', '伶', '凌', '刢', '囹', '坽', '夌', '姈', '婈', '孁', '岺', '彾', '掕', '昤', '朎', '柃', '棂', '櫺', '欞', '泠', '淩', '澪', '灵', '燯', '爧', '狑', '玲', '琌', '瓴', '皊', '砱', '祾', '秢', '竛', '笭', '紷', '綾', '绫', '羐', '羚', '翎', '聆', '舲', '苓', '菱', '蓤', '蔆', '蕶', '蛉', '衑', '裬', '詅', '跉', '軨', '輘', '酃', '醽', '鈴', '錂', '铃', '閝', '陵', '零', '霊', '霗', '霛', '霝', '靈', '駖', '魿', '鯪', '鲮', '鴒', '鸰', '鹷', '麢', '齡', '齢', '龄', '龗', '㥄'],\n yī: ['一', '乊', '伊', '依', '医', '吚', '咿', '噫', '壱', '壹', '夁', '嫛', '嬄', '弌', '揖', '撎', '檹', '毉', '洢', '渏', '漪', '瑿', '畩', '祎', '禕', '稦', '繄', '蛜', '衤', '譩', '辷', '郼', '醫', '銥', '铱', '鷖', '鹥', '黟', '黳'],\n 'dīng zhēng': ['丁'],\n 'kǎo qiǎo yú': ['丂'],\n qī: ['七', '倛', '僛', '凄', '嘁', '墄', '娸', '悽', '慼', '慽', '戚', '捿', '柒', '桤', '桼', '棲', '榿', '欺', '沏', '淒', '漆', '紪', '緀', '萋', '褄', '諆', '迉', '郪', '鏚', '霋', '魌', '鶈'],\n shàng: ['丄', '尙', '尚', '恦', '緔', '绱'],\n xià: ['丅', '下', '乤', '圷', '夏', '夓', '懗', '梺', '疜', '睱', '罅', '鎼', '鏬'],\n hǎn: ['丆', '喊', '浫', '罕', '豃', '㘎'],\n 'wàn mò': ['万'],\n zhàng: ['丈', '仗', '墇', '嶂', '帐', '帳', '幛', '扙', '杖', '涱', '痮', '瘬', '瘴', '瞕', '粀', '胀', '脹', '賬', '账', '障'],\n sān: ['三', '厁', '叁', '弎', '毵', '毶', '毿', '犙', '鬖'],\n 'shàng shǎng shang': ['上'],\n 'qí jī': ['丌', '其', '奇'],\n 'bù fǒu': ['不'],\n 'yǔ yù yú': ['与'],\n miǎn: ['丏', '偭', '免', '冕', '勉', '勔', '喕', '娩', '愐', '汅', '沔', '湎', '睌', '緬', '缅', '腼', '葂', '靦', '鮸', '𩾃'],\n gài: ['丐', '乢', '匃', '匄', '戤', '概', '槩', '槪', '溉', '漑', '瓂', '葢', '鈣', '钙', '𬮿'],\n chǒu: ['丑', '丒', '侴', '吜', '杽', '瞅', '矁', '醜', '魗'],\n zhuān: ['专', '叀', '嫥', '専', '專', '瑼', '甎', '砖', '磗', '磚', '蟤', '諯', '鄟', '顓', '颛', '鱄', '䏝'],\n 'qiě jū': ['且'],\n pī: ['丕', '伓', '伾', '噼', '坯', '岯', '憵', '批', '披', '炋', '狉', '狓', '砒', '磇', '礔', '礕', '秛', '秠', '耚', '豾', '邳', '鈚', '鉟', '銔', '錃', '錍', '霹', '駓', '髬', '魾', '𬳵'],\n shì: ['世', '丗', '亊', '事', '仕', '侍', '冟', '势', '勢', '卋', '呩', '嗜', '噬', '士', '奭', '嬕', '室', '市', '式', '弑', '弒', '恀', '恃', '戺', '拭', '揓', '是', '昰', '枾', '柿', '栻', '澨', '烒', '煶', '眂', '眎', '眡', '睗', '示', '礻', '筮', '簭', '舐', '舓', '襫', '視', '视', '觢', '試', '誓', '諡', '謚', '试', '谥', '貰', '贳', '軾', '轼', '逝', '遾', '釈', '释', '釋', '鈰', '鉃', '鉽', '铈', '飾', '餙', '餝', '饰', '鰘', '䏡', '𬤊'],\n qiū: ['丘', '丠', '坵', '媝', '恘', '恷', '楸', '秋', '秌', '穐', '篍', '緧', '萩', '蘒', '蚯', '蝵', '蟗', '蠤', '趥', '邱', '鞦', '鞧', '鰌', '鰍', '鳅', '鶖', '鹙', '龝'],\n bǐng: ['丙', '屛', '怲', '抦', '昞', '昺', '柄', '棅', '炳', '禀', '秉', '稟', '苪', '蛃', '邴', '鈵', '陃', '鞆', '餅', '餠', '饼'],\n yè: ['业', '亱', '僷', '墷', '夜', '嶪', '嶫', '抴', '捙', '擛', '擪', '擫', '晔', '曄', '曅', '曗', '曳', '曵', '枼', '枽', '業', '洂', '液', '澲', '烨', '燁', '爗', '璍', '皣', '瞱', '瞸', '礏', '腋', '葉', '謁', '谒', '邺', '鄴', '鍱', '鐷', '靥', '靨', '頁', '页', '餣', '饁', '馌', '驜', '鵺', '鸈'],\n cóng: ['丛', '从', '叢', '婃', '孮', '従', '徔', '徖', '悰', '樷', '欉', '淙', '灇', '爜', '琮', '藂', '誴', '賨', '賩', '錝'],\n dōng: ['东', '倲', '冬', '咚', '埬', '岽', '崬', '徚', '昸', '東', '氡', '氭', '涷', '笗', '苳', '菄', '蝀', '鮗', '鯟', '鶇', '鶫', '鸫', '鼕', '𬟽'],\n sī: ['丝', '俬', '凘', '厮', '司', '咝', '嘶', '噝', '媤', '廝', '恖', '撕', '斯', '楒', '泀', '澌', '燍', '禗', '禠', '私', '糹', '絲', '緦', '纟', '缌', '罳', '蕬', '虒', '蛳', '蜤', '螄', '蟖', '蟴', '鉰', '銯', '鍶', '鐁', '锶', '颸', '飔', '騦', '鷥', '鸶', '鼶', '㟃'],\n chéng: ['丞', '呈', '城', '埕', '堘', '塍', '塖', '宬', '峸', '惩', '懲', '成', '承', '挰', '掁', '揨', '枨', '棖', '橙', '檙', '洆', '溗', '澂', '珵', '珹', '畻', '程', '窚', '筬', '絾', '脭', '荿', '誠', '诚', '郕', '酲', '鋮', '铖', '騬', '鯎'],\n diū: ['丟', '丢', '銩', '铥'],\n liǎng: ['両', '两', '兩', '唡', '啢', '掚', '緉', '脼', '蜽', '裲', '魉', '魎', '𬜯'],\n yǒu: ['丣', '卣', '友', '梄', '湵', '牖', '禉', '羑', '聈', '苃', '莠', '蜏', '酉', '銪', '铕', '黝'],\n yán: ['严', '厳', '啱', '喦', '嚴', '塩', '壛', '壧', '妍', '姸', '娫', '娮', '岩', '嵒', '嵓', '巌', '巖', '巗', '延', '揅', '昖', '楌', '檐', '櫩', '欕', '沿', '炎', '炏', '狿', '琂', '盐', '碞', '筵', '簷', '莚', '蔅', '虤', '蜒', '言', '訁', '訮', '詽', '讠', '郔', '閆', '閻', '闫', '阎', '顏', '顔', '颜', '鹽', '麣', '𫄧'],\n bìng: ['並', '併', '倂', '傡', '垪', '摒', '栤', '病', '窉', '竝', '誁', '靐', '鮩'],\n 'sàng sāng': ['丧'],\n gǔn: ['丨', '惃', '滚', '滾', '磙', '緄', '绲', '蓘', '蔉', '衮', '袞', '輥', '辊', '鮌', '鯀', '鲧'],\n jiū: ['丩', '勼', '啾', '揪', '揫', '朻', '究', '糾', '纠', '萛', '赳', '阄', '鬏', '鬮', '鳩', '鸠'],\n 'gè gě': ['个', '個', '各'],\n yā: ['丫', '圧', '孲', '庘', '押', '枒', '桠', '椏', '錏', '鐚', '鴉', '鴨', '鵶', '鸦', '鸭'],\n pán: ['丬', '媻', '幋', '槃', '洀', '瀊', '爿', '盘', '盤', '磐', '縏', '蒰', '蟠', '蹒', '蹣', '鎜', '鞶'],\n 'zhōng zhòng': ['中'],\n jǐ: ['丮', '妀', '己', '戟', '挤', '掎', '撠', '擠', '橶', '泲', '犱', '脊', '虮', '蟣', '魢', '鱾', '麂'],\n jiè: ['丯', '介', '借', '唶', '堺', '屆', '届', '岕', '庎', '徣', '戒', '楐', '犗', '玠', '琾', '界', '畍', '疥', '砎', '蚧', '蛶', '衸', '褯', '誡', '诫', '鎅', '骱', '魪'],\n fēng: ['丰', '仹', '偑', '僼', '凨', '凬', '凮', '妦', '寷', '封', '峯', '峰', '崶', '枫', '楓', '檒', '沣', '沨', '渢', '灃', '烽', '犎', '猦', '琒', '疯', '瘋', '盽', '砜', '碸', '篈', '蘴', '蜂', '蠭', '豐', '鄷', '酆', '鋒', '鎽', '鏠', '锋', '霻', '靊', '飌', '麷'],\n 'guàn kuàng': ['丱'],\n chuàn: ['串', '汌', '玔', '賗', '釧', '钏'],\n chǎn: ['丳', '产', '冁', '剷', '囅', '嵼', '旵', '浐', '滻', '灛', '產', '産', '簅', '蒇', '蕆', '諂', '譂', '讇', '谄', '鏟', '铲', '閳', '闡', '阐', '骣', '𬊤'],\n lín: ['临', '冧', '壣', '崊', '嶙', '斴', '晽', '暽', '林', '潾', '瀶', '燐', '琳', '璘', '瞵', '碄', '磷', '粦', '粼', '繗', '翷', '臨', '轔', '辚', '遴', '邻', '鄰', '鏻', '阾', '隣', '霖', '驎', '鱗', '鳞', '麐', '麟', '𬴊', '𬭸'],\n zhuó: ['丵', '劅', '卓', '啄', '圴', '妰', '娺', '撯', '擆', '擢', '斫', '斮', '斱', '斲', '斵', '晫', '椓', '浊', '浞', '濁', '灼', '烵', '琸', '硺', '禚', '窡', '籗', '籱', '罬', '茁', '蠗', '蠿', '諁', '諑', '謶', '诼', '酌', '鐲', '镯', '鵫', '鷟', '䓬', '𬸦'],\n zhǔ: ['丶', '主', '劯', '嘱', '囑', '宔', '帾', '拄', '渚', '濐', '煑', '煮', '燝', '瞩', '矚', '罜', '詝', '陼', '鸀', '麈', '𬣞'],\n bā: ['丷', '仈', '八', '叭', '哵', '夿', '岜', '巴', '捌', '朳', '玐', '疤', '笆', '粑', '羓', '芭', '蚆', '豝', '釟'],\n wán: ['丸', '刓', '完', '岏', '抏', '捖', '汍', '烷', '玩', '琓', '笂', '紈', '纨', '翫', '芄', '貦', '頑', '顽'],\n dān: ['丹', '勯', '匰', '単', '妉', '媅', '殚', '殫', '甔', '眈', '砃', '箪', '簞', '耼', '耽', '聃', '聸', '褝', '襌', '躭', '郸', '鄲', '酖', '頕'],\n 'wèi wéi': ['为'],\n 'jǐng dǎn': ['丼'],\n 'lì lí': ['丽'],\n jǔ: ['举', '弆', '挙', '擧', '椇', '榉', '榘', '櫸', '欅', '矩', '筥', '聥', '舉', '莒', '蒟', '襷', '踽', '齟', '龃'],\n piě: ['丿', '苤', '鐅', '𬭯'],\n fú: ['乀', '伏', '俘', '凫', '刜', '匐', '咈', '哹', '垘', '孚', '岪', '巿', '帗', '幅', '幞', '弗', '彿', '怫', '扶', '柫', '栿', '桴', '氟', '泭', '浮', '涪', '澓', '炥', '玸', '甶', '畉', '癁', '祓', '福', '稪', '符', '箙', '紱', '紼', '絥', '綍', '绂', '绋', '罘', '罦', '翇', '艀', '芙', '芣', '苻', '茀', '茯', '菔', '葍', '虙', '蚨', '蜉', '蝠', '袚', '袱', '襆', '襥', '諨', '豧', '踾', '輻', '辐', '郛', '鉘', '鉜', '韍', '韨', '颫', '髴', '鮄', '鮲', '鳧', '鳬', '鴔', '鵩', '黻'],\n 'yí jí': ['乁'],\n yì: ['乂', '义', '亄', '亦', '亿', '伇', '伿', '佾', '俋', '億', '兿', '刈', '劓', '劮', '勚', '勩', '匇', '呓', '呭', '呹', '唈', '囈', '圛', '坄', '垼', '埸', '奕', '嫕', '嬑', '寱', '屹', '峄', '嶧', '帟', '帠', '幆', '廙', '异', '弈', '弋', '役', '忆', '怈', '怿', '悒', '意', '憶', '懌', '懿', '抑', '挹', '敡', '易', '晹', '曀', '曎', '杙', '枍', '棭', '榏', '槸', '檍', '歝', '殔', '殪', '殹', '毅', '浂', '浥', '浳', '湙', '溢', '潩', '澺', '瀷', '炈', '焲', '熠', '熤', '熼', '燚', '燡', '燱', '獈', '玴', '異', '疫', '痬', '瘗', '瘞', '瘱', '癔', '益', '瞖', '穓', '竩', '篒', '縊', '繶', '繹', '绎', '缢', '義', '羿', '翊', '翌', '翳', '翼', '耴', '肄', '肊', '膉', '臆', '艗', '艺', '芅', '苅', '萟', '蓺', '薏', '藙', '藝', '蘙', '虉', '蜴', '螠', '衪', '袣', '裔', '裛', '褹', '襼', '訲', '訳', '詍', '詣', '誼', '譯', '議', '讛', '议', '译', '诣', '谊', '豙', '豛', '豷', '貖', '贀', '跇', '轶', '逸', '邑', '鄓', '醷', '釴', '鈠', '鎰', '鐿', '镒', '镱', '阣', '隿', '霬', '饐', '駅', '驛', '驿', '骮', '鮨', '鶂', '鶃', '鶍', '鷁', '鷊', '鷧', '鷾', '鸃', '鹝', '鹢', '黓', '齸', '𬬩', '㑊', '𫄷', '𬟁'],\n nǎi: ['乃', '倷', '奶', '嬭', '廼', '氖', '疓', '艿', '迺', '釢'],\n wǔ: ['乄', '五', '仵', '伍', '侮', '倵', '儛', '午', '啎', '妩', '娬', '嫵', '庑', '廡', '忤', '怃', '憮', '摀', '武', '潕', '熓', '牾', '玝', '珷', '瑦', '甒', '碔', '舞', '躌', '迕', '逜', '陚', '鵡', '鹉', '𣲘'],\n jiǔ: ['久', '乆', '九', '乣', '奺', '杦', '汣', '灸', '玖', '紤', '舏', '酒', '镹', '韭', '韮'],\n 'tuō zhé': ['乇', '杔', '馲'],\n 'me mó ma yāo': ['么'],\n zhī: ['之', '倁', '卮', '巵', '搘', '支', '栀', '梔', '椥', '榰', '汁', '泜', '疷', '祗', '祬', '秓', '稙', '綕', '肢', '胑', '胝', '脂', '芝', '蘵', '蜘', '衼', '隻', '鳷', '鴲', '鼅', '𦭜'],\n 'wū wù': ['乌'],\n zhà: ['乍', '咤', '宱', '搾', '榨', '溠', '痄', '蚱', '詐', '诈', '醡', '霅', '䃎'],\n hū: ['乎', '乯', '匢', '匫', '呼', '唿', '嘑', '垀', '寣', '幠', '忽', '惚', '昒', '歑', '泘', '淴', '滹', '烀', '苸', '虍', '虖', '謼', '軤', '轷', '雐'],\n fá: ['乏', '伐', '傠', '坺', '垡', '墢', '姂', '栰', '浌', '瞂', '笩', '筏', '罚', '罰', '罸', '藅', '閥', '阀'],\n 'lè yuè yào lào': ['乐', '樂'],\n yín: ['乑', '吟', '噖', '嚚', '圁', '垠', '夤', '婬', '寅', '峾', '崟', '崯', '檭', '殥', '泿', '淫', '滛', '烎', '犾', '狺', '璌', '硍', '碒', '荶', '蔩', '訔', '訚', '訡', '誾', '鄞', '鈝', '銀', '银', '霪', '鷣', '齦'],\n pīng: ['乒', '俜', '娉', '涄', '甹', '砯', '聠', '艵', '頩'],\n pāng: ['乓', '滂', '胮', '膖', '雱', '霶'],\n qiáo: ['乔', '侨', '僑', '嫶', '憔', '桥', '槗', '樵', '橋', '櫵', '犞', '瞧', '硚', '礄', '荍', '荞', '蕎', '藮', '譙', '趫', '鐈', '鞒', '鞽', '顦'],\n hǔ: ['乕', '琥', '萀', '虎', '虝', '錿', '鯱'],\n guāi: ['乖'],\n 'chéng shèng': ['乗', '乘', '娍'],\n yǐ: ['乙', '乛', '以', '倚', '偯', '嬟', '崺', '已', '庡', '扆', '攺', '敼', '旑', '旖', '檥', '矣', '礒', '笖', '舣', '艤', '苡', '苢', '蚁', '螘', '蟻', '裿', '踦', '輢', '轙', '逘', '酏', '釔', '鈘', '鉯', '钇', '顗', '鳦', '齮', '𫖮', '𬺈'],\n 'háo yǐ': ['乚'],\n 'niè miē': ['乜'],\n qǐ: ['乞', '企', '启', '唘', '啓', '啔', '啟', '婍', '屺', '杞', '棨', '玘', '盀', '綺', '绮', '芑', '諬', '起', '邔', '闙'],\n yě: ['也', '冶', '嘢', '埜', '壄', '漜', '野'],\n xí: ['习', '喺', '媳', '嶍', '席', '椺', '檄', '漝', '習', '蓆', '袭', '襲', '覡', '觋', '謵', '趘', '郋', '鎴', '隰', '霫', '飁', '騱', '騽', '驨', '鰼', '鳛', '𠅤', '𫘬'],\n xiāng: ['乡', '厢', '廂', '忀', '楿', '欀', '湘', '瓖', '稥', '箱', '緗', '缃', '膷', '芗', '萫', '葙', '薌', '襄', '郷', '鄉', '鄊', '鄕', '鑲', '镶', '香', '驤', '骧', '鱜', '麘', '𬙋'],\n shū: ['书', '倏', '倐', '儵', '叔', '姝', '尗', '抒', '掓', '摅', '攄', '書', '枢', '梳', '樞', '殊', '殳', '毹', '毺', '淑', '瀭', '焂', '疎', '疏', '紓', '綀', '纾', '舒', '菽', '蔬', '踈', '軗', '輸', '输', '鄃', '陎', '鮛', '鵨'],\n dǒu: ['乧', '抖', '枓', '蚪', '鈄', '阧', '陡'],\n shǐ: ['乨', '使', '兘', '史', '始', '宩', '屎', '榁', '矢', '笶', '豕', '鉂', '駛', '驶'],\n jī: ['乩', '僟', '击', '刉', '刏', '剞', '叽', '唧', '喞', '嗘', '嘰', '圾', '基', '墼', '姬', '屐', '嵆', '嵇', '撃', '擊', '朞', '机', '枅', '樭', '機', '毄', '激', '犄', '玑', '璣', '畸', '畿', '癪', '矶', '磯', '积', '積', '笄', '筓', '箕', '簊', '緁', '羁', '羇', '羈', '耭', '肌', '芨', '虀', '覉', '覊', '譏', '譤', '讥', '賫', '賷', '赍', '跻', '踑', '躋', '躸', '銈', '錤', '鐖', '鑇', '鑙', '隮', '雞', '鞿', '韲', '飢', '饑', '饥', '魕', '鳮', '鶏', '鶺', '鷄', '鸄', '鸡', '齎', '齏', '齑', '𬯀', '𫓯', '𫓹', '𫌀'],\n náng: ['乪', '嚢', '欜', '蠰', '饢'],\n jiā: ['乫', '佳', '傢', '加', '嘉', '抸', '枷', '梜', '毠', '泇', '浃', '浹', '犌', '猳', '珈', '痂', '笳', '糘', '耞', '腵', '葭', '袈', '豭', '貑', '跏', '迦', '鉫', '鎵', '镓', '鴐', '麚', '𬂩'],\n jù: ['乬', '倨', '倶', '具', '剧', '劇', '勮', '埧', '埾', '壉', '姖', '屦', '屨', '岠', '巨', '巪', '怇', '惧', '愳', '懅', '懼', '拒', '拠', '昛', '歫', '洰', '澽', '炬', '烥', '犋', '秬', '窭', '窶', '簴', '粔', '耟', '聚', '虡', '蚷', '詎', '讵', '豦', '距', '踞', '躆', '遽', '邭', '醵', '鉅', '鐻', '钜', '颶', '飓', '駏', '鮔'],\n shí: ['乭', '十', '埘', '塒', '姼', '实', '実', '寔', '實', '峕', '嵵', '时', '旹', '時', '榯', '湜', '溡', '炻', '祏', '竍', '蚀', '蝕', '辻', '遈', '鉐', '飠', '饣', '鮖', '鰣', '鲥', '鼫', '鼭'],\n mǎo: ['乮', '冇', '卯', '峁', '戼', '昴', '泖', '笷', '蓩', '鉚', '铆'],\n mǎi: ['买', '嘪', '荬', '蕒', '買', '鷶'],\n luàn: ['乱', '亂', '釠'],\n rǔ: ['乳', '擩', '汝', '肗', '辱', '鄏'],\n xué: ['乴', '学', '學', '峃', '嶨', '斈', '泶', '澩', '燢', '穴', '茓', '袕', '踅', '鷽', '鸴'],\n yǎn: ['䶮', '乵', '俨', '偃', '儼', '兖', '兗', '厣', '厴', '噞', '孍', '嵃', '巘', '巚', '弇', '愝', '戭', '扊', '抁', '掩', '揜', '曮', '椼', '檿', '沇', '渷', '演', '琰', '甗', '眼', '罨', '萒', '蝘', '衍', '褗', '躽', '遃', '郾', '隒', '顩', '魇', '魘', '鰋', '鶠', '黡', '黤', '黬', '黭', '黶', '鼴', '鼹', '齴', '龑', '𬸘', '𬙂', '𪩘'],\n fǔ: ['乶', '俌', '俛', '俯', '府', '弣', '抚', '拊', '撫', '斧', '椨', '滏', '焤', '甫', '盙', '簠', '腐', '腑', '蜅', '輔', '辅', '郙', '釜', '釡', '阝', '頫', '鬴', '黼', '㕮', '𫖯'],\n shā: ['乷', '唦', '杀', '桬', '殺', '毮', '猀', '痧', '砂', '硰', '紗', '繺', '纱', '蔱', '裟', '鎩', '铩', '閷', '髿', '魦', '鯊', '鯋', '鲨'],\n nǎ: ['乸', '雫'],\n qián: ['乹', '亁', '仱', '偂', '前', '墘', '媊', '岒', '拑', '掮', '榩', '橬', '歬', '潛', '潜', '濳', '灊', '箝', '葥', '虔', '軡', '鈐', '鉗', '銭', '錢', '鎆', '钤', '钱', '钳', '靬', '騚', '騝', '鰬', '黔', '黚'],\n suǒ: ['乺', '唢', '嗩', '所', '暛', '溑', '溹', '琐', '琑', '瑣', '索', '褨', '鎖', '鎻', '鏁', '锁'],\n yú: ['乻', '于', '亐', '伃', '余', '堣', '堬', '妤', '娛', '娯', '娱', '嬩', '崳', '嵎', '嵛', '愚', '扵', '揄', '旟', '楡', '楰', '榆', '欤', '歈', '歟', '歶', '渔', '渝', '湡', '漁', '澞', '牏', '狳', '玗', '玙', '瑜', '璵', '盂', '睮', '窬', '竽', '籅', '羭', '腴', '臾', '舁', '舆', '艅', '茰', '萮', '萸', '蕍', '蘛', '虞', '虶', '蝓', '螸', '衧', '褕', '覦', '觎', '諛', '謣', '谀', '踰', '輿', '轝', '逾', '邘', '酑', '鍝', '隅', '雓', '雩', '餘', '馀', '騟', '骬', '髃', '魚', '魣', '鮽', '鯲', '鰅', '鱼', '鷠', '鸆', '齵'],\n zhù: ['乼', '伫', '佇', '住', '坾', '墸', '壴', '嵀', '拀', '杼', '柱', '樦', '殶', '注', '炷', '疰', '眝', '祝', '祩', '竚', '筯', '箸', '篫', '簗', '紵', '紸', '纻', '羜', '翥', '苎', '莇', '蛀', '註', '貯', '贮', '跓', '軴', '鉒', '鋳', '鑄', '铸', '馵', '駐', '驻'],\n zhě: ['乽', '者', '褶', '襵', '赭', '踷', '鍺', '锗'],\n 'qián gān': ['乾'],\n 'zhì luàn': ['乿'],\n guī: ['亀', '圭', '妫', '媯', '嫢', '嬀', '帰', '归', '摫', '椝', '槻', '槼', '櫷', '歸', '珪', '瑰', '璝', '瓌', '皈', '瞡', '硅', '茥', '蘬', '規', '规', '邽', '郌', '閨', '闺', '騩', '鬶', '鬹'],\n 'lǐn lìn': ['亃'],\n jué: ['亅', '决', '刔', '劂', '匷', '厥', '噊', '孒', '孓', '崛', '崫', '嶥', '彏', '憠', '憰', '戄', '抉', '挗', '掘', '攫', '桷', '橛', '橜', '欮', '氒', '決', '灍', '焳', '熦', '爑', '爴', '爵', '獗', '玃', '玦', '玨', '珏', '瑴', '瘚', '矍', '矡', '砄', '絕', '絶', '绝', '臄', '芵', '蕝', '蕨', '虳', '蟨', '蟩', '觖', '觮', '觼', '訣', '譎', '诀', '谲', '貜', '赽', '趉', '蹷', '躩', '鈌', '鐍', '鐝', '钁', '镢', '鴂', '鴃', '鷢', '𫘝', '㵐', '𫔎'],\n 'le liǎo': ['了'],\n 'gè mā': ['亇'],\n 'yǔ yú': ['予', '懙'],\n zhēng: ['争', '佂', '凧', '姃', '媜', '峥', '崝', '崢', '征', '徰', '炡', '烝', '爭', '狰', '猙', '癥', '眐', '睁', '睜', '筝', '箏', '篜', '聇', '脀', '蒸', '踭', '鉦', '錚', '鏳', '鬇'],\n èr: ['二', '刵', '咡', '弍', '弐', '樲', '誀', '貮', '貳', '贰', '髶'],\n chù: ['亍', '傗', '儊', '怵', '憷', '搐', '斶', '歜', '珿', '琡', '矗', '竌', '絀', '绌', '臅', '触', '觸', '豖', '鄐', '閦', '黜'],\n kuī: ['亏', '刲', '岿', '巋', '盔', '窥', '窺', '聧', '虧', '闚', '顝'],\n yún: ['云', '伝', '勻', '匀', '囩', '妘', '愪', '抣', '昀', '橒', '沄', '涢', '溳', '澐', '熉', '畇', '秐', '筼', '篔', '紜', '縜', '纭', '耘', '芸', '蒷', '蕓', '郧', '鄖', '鋆', '雲'],\n hù: ['互', '冱', '嗀', '嚛', '婟', '嫭', '嫮', '岵', '帍', '弖', '怙', '戶', '户', '戸', '戽', '扈', '护', '昈', '槴', '沍', '沪', '滬', '熩', '瓠', '祜', '笏', '簄', '粐', '綔', '蔰', '護', '豰', '鄠', '鍙', '頀', '鱯', '鳠', '鳸', '鸌', '鹱'],\n qí: ['亓', '剘', '埼', '岐', '岓', '崎', '嵜', '愭', '掑', '斉', '斊', '旂', '旗', '棊', '棋', '檱', '櫀', '歧', '淇', '濝', '猉', '玂', '琦', '琪', '璂', '畦', '疧', '碁', '碕', '祁', '祈', '祺', '禥', '竒', '簯', '簱', '籏', '粸', '綥', '綦', '肵', '脐', '臍', '艩', '芪', '萁', '萕', '蕲', '藄', '蘄', '蚑', '蚚', '蛴', '蜝', '蜞', '螧', '蠐', '褀', '軝', '鄿', '釮', '錡', '锜', '陭', '頎', '颀', '騎', '騏', '騹', '骐', '骑', '鬐', '鬿', '鯕', '鰭', '鲯', '鳍', '鵸', '鶀', '麒', '麡', '𨙸', '𬨂', '䓫'],\n jǐng: ['井', '儆', '刭', '剄', '坓', '宑', '幜', '憬', '暻', '殌', '汫', '汬', '澋', '璄', '璟', '璥', '穽', '肼', '蟼', '警', '阱', '頚', '頸'],\n sì: ['亖', '佀', '価', '儩', '兕', '嗣', '四', '姒', '娰', '孠', '寺', '巳', '柶', '榹', '汜', '泗', '泤', '洍', '洠', '涘', '瀃', '牭', '祀', '禩', '竢', '笥', '耜', '肂', '肆', '蕼', '覗', '貄', '釲', '鈶', '鈻', '飤', '飼', '饲', '駟', '騃', '驷'],\n suì: ['亗', '嬘', '岁', '嵗', '旞', '檖', '歲', '歳', '澻', '煫', '燧', '璲', '砕', '碎', '祟', '禭', '穂', '穗', '穟', '繀', '繐', '繸', '襚', '誶', '譢', '谇', '賥', '邃', '鐆', '鐩', '隧', '韢', '𫟦', '𬭼'],\n gèn: ['亘', '亙', '揯', '搄', '茛'],\n yà: ['亚', '亜', '俹', '冴', '劜', '圔', '圠', '埡', '娅', '婭', '揠', '氩', '氬', '犽', '砑', '稏', '聐', '襾', '覀', '訝', '讶', '迓', '齾'],\n 'xiē suò': ['些'],\n 'qí zhāi': ['亝', '齊'],\n 'yā yà': ['亞', '压', '垭', '壓', '铔'],\n 'jí qì': ['亟', '焏'],\n tóu: ['亠', '投', '頭', '骰'],\n 'wáng wú': ['亡'],\n 'kàng háng gāng': ['亢'],\n dà: ['亣', '眔'],\n jiāo: ['交', '僬', '娇', '嬌', '峧', '嶕', '嶣', '憍', '椒', '浇', '澆', '焦', '礁', '穚', '簥', '胶', '膠', '膲', '茭', '茮', '蕉', '虠', '蛟', '蟭', '跤', '轇', '郊', '鐎', '驕', '骄', '鮫', '鲛', '鵁', '鷦', '鷮', '鹪', '䴔'],\n hài: ['亥', '嗐', '害', '氦', '餀', '饚', '駭', '駴', '骇'],\n 'hēng pēng': ['亨'],\n mǔ: ['亩', '姆', '峔', '拇', '母', '牡', '牳', '畂', '畆', '畒', '畝', '畞', '畮', '砪', '胟', '踇', '鉧', '𬭁', '𧿹'],\n ye: ['亪'],\n xiǎng: ['享', '亯', '响', '想', '晑', '蚃', '蠁', '響', '飨', '餉', '饗', '饷', '鮝', '鯗', '鱶', '鲞'],\n jīng: ['京', '亰', '兢', '坕', '坙', '婛', '惊', '旌', '旍', '晶', '橸', '泾', '涇', '猄', '睛', '秔', '稉', '粳', '精', '経', '經', '綡', '聙', '腈', '茎', '荆', '荊', '菁', '葏', '驚', '鯨', '鲸', '鶁', '鶄', '麖', '麠', '鼱', '䴖'],\n tíng: ['亭', '停', '婷', '嵉', '庭', '廷', '楟', '榳', '筳', '聤', '莛', '葶', '蜓', '蝏', '諪', '邒', '霆', '鼮', '䗴'],\n liàng: ['亮', '喨', '悢', '晾', '湸', '諒', '谅', '輌', '輛', '辆', '鍄'],\n 'qīn qìng': ['亲', '親'],\n bó: ['亳', '仢', '侼', '僰', '博', '帛', '愽', '懪', '挬', '搏', '欂', '浡', '淿', '渤', '煿', '牔', '狛', '瓝', '礴', '秡', '箔', '簙', '糪', '胉', '脖', '膊', '舶', '艊', '萡', '葧', '袯', '襏', '襮', '謈', '踣', '郣', '鈸', '鉑', '鋍', '鎛', '鑮', '钹', '铂', '镈', '餺', '馎', '馛', '馞', '駁', '駮', '驳', '髆', '鵓', '鹁'],\n yòu: ['亴', '佑', '佦', '侑', '又', '右', '哊', '唀', '囿', '姷', '宥', '峟', '幼', '狖', '祐', '蚴', '誘', '诱', '貁', '迶', '酭', '釉', '鼬'],\n xiè: ['亵', '伳', '偞', '偰', '僁', '卨', '卸', '噧', '塮', '夑', '媟', '屑', '屧', '廨', '徢', '懈', '暬', '械', '榍', '榭', '泻', '洩', '渫', '澥', '瀉', '瀣', '灺', '炧', '炨', '燮', '爕', '獬', '祄', '禼', '糏', '紲', '絏', '絬', '繲', '纈', '绁', '缷', '薢', '薤', '蟹', '蠏', '褉', '褻', '謝', '谢', '躞', '邂', '靾', '韰', '齂', '齘', '齛', '齥', '𬹼', '𤫉'],\n 'dǎn dàn': ['亶', '馾'],\n lián: ['亷', '劆', '匲', '匳', '嗹', '噒', '奁', '奩', '嫾', '帘', '廉', '怜', '憐', '涟', '漣', '濂', '濓', '瀮', '熑', '燫', '簾', '籢', '籨', '縺', '翴', '联', '聨', '聫', '聮', '聯', '臁', '莲', '蓮', '薕', '螊', '蠊', '裢', '褳', '覝', '謰', '蹥', '连', '連', '鎌', '鐮', '镰', '鬑', '鰱', '鲢'],\n duǒ: ['亸', '哚', '嚲', '埵', '崜', '朵', '朶', '綞', '缍', '趓', '躱', '躲', '軃'],\n 'wěi mén': ['亹', '斖'],\n rén: ['人', '亻', '仁', '壬', '忈', '忎', '朲', '秂', '芢', '魜', '鵀'],\n jí: ['亼', '亽', '伋', '佶', '偮', '卙', '即', '卽', '及', '叝', '吉', '堲', '塉', '姞', '嫉', '岌', '嵴', '嶯', '彶', '忣', '急', '愱', '戢', '揤', '极', '棘', '楫', '極', '槉', '檝', '殛', '汲', '湒', '潗', '疾', '瘠', '皍', '笈', '箿', '籍', '級', '级', '膌', '艥', '蒺', '蕀', '蕺', '蝍', '螏', '襋', '觙', '谻', '踖', '蹐', '躤', '輯', '轚', '辑', '郆', '銡', '鍓', '鏶', '集', '雧', '霵', '鹡', '㴔'],\n wáng: ['亾', '仼', '兦', '莣', '蚟'],\n 'shén shí': ['什'],\n lè: ['仂', '叻', '忇', '氻', '泐', '玏', '砳', '簕', '艻', '阞', '韷', '餎', '鰳', '鱳', '鳓'],\n dīng: ['仃', '叮', '帄', '玎', '疔', '盯', '耵', '虰', '靪'],\n zè: ['仄', '崱', '庂', '捑', '昃', '昗', '汄'],\n 'jǐn jìn': ['仅', '僅', '嫤'],\n 'pú pū': ['仆'],\n 'chóu qiú': ['仇'],\n zhǎng: ['仉', '幥', '掌', '礃'],\n jīn: ['今', '堻', '巾', '惍', '斤', '津', '珒', '琻', '璡', '砛', '筋', '荕', '衿', '襟', '觔', '金', '釒', '釿', '钅', '鹶', '黅', '𬬱'],\n bīng: ['仌', '仒', '兵', '冫', '冰', '掤', '氷', '鋲'],\n réng: ['仍', '礽', '芿', '辸', '陾'],\n fó: ['仏', '坲', '梻'],\n 'jīn sǎn': ['仐'],\n lún: ['仑', '伦', '侖', '倫', '囵', '圇', '婨', '崘', '崙', '棆', '沦', '淪', '磮', '腀', '菕', '蜦', '踚', '輪', '轮', '錀', '陯', '鯩', '𬬭'],\n cāng: ['仓', '仺', '倉', '凔', '嵢', '沧', '滄', '濸', '獊', '舱', '艙', '苍', '蒼', '螥', '鸧'],\n 'zǎi zǐ zī': ['仔'],\n tā: ['他', '塌', '它', '榙', '溻', '牠', '祂', '褟', '趿', '遢', '闧'],\n fù: ['付', '偩', '傅', '冨', '副', '咐', '坿', '复', '妇', '婦', '媍', '嬔', '富', '復', '椱', '祔', '禣', '竎', '緮', '縛', '缚', '腹', '萯', '蕧', '蚹', '蛗', '蝜', '蝮', '袝', '複', '覄', '覆', '訃', '詂', '讣', '負', '賦', '賻', '负', '赋', '赙', '赴', '輹', '鍑', '鍢', '阜', '附', '馥', '駙', '驸', '鮒', '鰒', '鲋', '鳆', '㳇'],\n xiān: ['仙', '仚', '佡', '僊', '僲', '先', '嘕', '奾', '屳', '廯', '忺', '憸', '掀', '暹', '杴', '氙', '珗', '祆', '秈', '籼', '繊', '纎', '纖', '苮', '褼', '襳', '跹', '蹮', '躚', '酰', '鍁', '锨', '韯', '韱', '馦', '鱻', '鶱', '𬸣'],\n 'tuō chà duó': ['仛'],\n hóng: ['仜', '吰', '垬', '妅', '娂', '宏', '宖', '弘', '彋', '汯', '泓', '洪', '浤', '渱', '潂', '玒', '玜', '竑', '竤', '篊', '粠', '紘', '紭', '綋', '纮', '翃', '翝', '耾', '苰', '荭', '葒', '葓', '谹', '谼', '鈜', '鉷', '鋐', '閎', '闳', '霐', '霟', '鞃', '魟', '鴻', '鸿', '黉', '黌', '𫟹', '𬭎'],\n tóng: ['仝', '佟', '哃', '峂', '峝', '庝', '彤', '晍', '曈', '桐', '氃', '浵', '潼', '犝', '獞', '眮', '瞳', '砼', '秱', '童', '粡', '膧', '茼', '蚒', '詷', '赨', '酮', '鉖', '鉵', '銅', '铜', '餇', '鮦', '鲖', '𫍣', '𦒍'],\n rèn: ['仞', '仭', '刃', '刄', '妊', '姙', '屻', '岃', '扨', '牣', '祍', '紉', '紝', '絍', '纫', '纴', '肕', '腍', '衽', '袵', '訒', '認', '认', '讱', '軔', '轫', '鈓', '靭', '靱', '韌', '韧', '飪', '餁', '饪'],\n qiān: ['仟', '佥', '僉', '千', '圲', '奷', '孯', '岍', '悭', '愆', '慳', '扦', '拪', '搴', '撁', '攐', '攑', '攓', '杄', '櫏', '汘', '汧', '牵', '牽', '竏', '签', '簽', '籖', '籤', '粁', '芊', '茾', '蚈', '褰', '諐', '謙', '谦', '谸', '迁', '遷', '釺', '鈆', '鉛', '鏲', '钎', '阡', '韆', '顅', '騫', '骞', '鬜', '鬝', '鵮', '鹐'],\n 'gǎn hàn': ['仠'],\n 'yì gē': ['仡'],\n dài: ['代', '侢', '叇', '垈', '埭', '岱', '帒', '带', '帯', '帶', '廗', '怠', '戴', '曃', '柋', '殆', '瀻', '玳', '瑇', '甙', '簤', '紿', '緿', '绐', '艜', '蝳', '袋', '襶', '貣', '贷', '蹛', '軑', '軚', '軩', '轪', '迨', '霴', '靆', '鴏', '黛', '黱'],\n 'lìng líng lǐng': ['令'],\n chào: ['仦', '耖', '觘'],\n 'cháng zhǎng': ['仧', '兏', '長', '长'],\n sā: ['仨'],\n cháng: ['仩', '偿', '償', '嘗', '嚐', '嫦', '尝', '常', '徜', '瑺', '瓺', '甞', '肠', '腸', '膓', '苌', '萇', '镸', '鱨', '鲿'],\n yí: ['仪', '侇', '儀', '冝', '匜', '咦', '圯', '夷', '姨', '宐', '宜', '宧', '寲', '峓', '嶬', '嶷', '巸', '彛', '彜', '彝', '彞', '怡', '恞', '扅', '暆', '栘', '椬', '椸', '沂', '洟', '熪', '瓵', '痍', '移', '簃', '籎', '羠', '胰', '萓', '蛦', '螔', '觺', '謻', '貽', '贻', '跠', '迻', '遺', '鏔', '頉', '頤', '頥', '顊', '颐', '饴', '鮧', '鴺'],\n mù: ['仫', '凩', '募', '墓', '幕', '幙', '慔', '慕', '暮', '暯', '木', '楘', '毣', '沐', '炑', '牧', '狇', '目', '睦', '穆', '艒', '苜', '莯', '蚞', '鉬', '钼', '雮', '霂'],\n 'men mén': ['们'],\n fǎn: ['仮', '反', '橎', '返'],\n 'chào miǎo': ['仯'],\n 'yǎng áng': ['仰'],\n zhòng: ['仲', '众', '堹', '妕', '媑', '狆', '眾', '祌', '筗', '茽', '蚛', '衆', '衶', '諥'],\n 'pǐ pí': ['仳'],\n wò: ['仴', '偓', '卧', '媉', '幄', '握', '楃', '沃', '渥', '濣', '瓁', '瞃', '硪', '肟', '腛', '臥', '齷', '龌'],\n jiàn: ['件', '俴', '健', '僭', '剑', '剣', '剱', '劍', '劎', '劒', '劔', '墹', '寋', '建', '徤', '擶', '旔', '楗', '毽', '洊', '涧', '澗', '牮', '珔', '瞷', '磵', '礀', '箭', '糋', '繝', '腱', '臶', '舰', '艦', '荐', '薦', '覸', '諓', '諫', '譛', '谏', '賎', '賤', '贱', '趝', '践', '踐', '踺', '轞', '鉴', '鍳', '鍵', '鐱', '鑑', '鑒', '鑬', '鑳', '键', '間', '餞', '饯', '𬣡'],\n 'jià jiè jie': ['价'],\n 'yǎo fó': ['仸'],\n 'rèn rén': ['任'],\n 'fèn bīn': ['份'],\n dī: ['仾', '低', '啲', '埞', '堤', '岻', '彽', '樀', '滴', '磾', '秪', '羝', '袛', '趆', '隄', '鞮', '䃅'],\n fǎng: ['仿', '倣', '旊', '昉', '昘', '瓬', '眆', '紡', '纺', '舫', '訪', '访', '髣', '鶭'],\n zhōng: ['伀', '刣', '妐', '幒', '彸', '忠', '柊', '汷', '泈', '炂', '盅', '籦', '終', '终', '舯', '蔠', '蜙', '螤', '螽', '衳', '衷', '蹱', '鈡', '鍾', '鐘', '钟', '锺', '鴤', '鼨'],\n pèi: ['伂', '佩', '姵', '帔', '斾', '旆', '沛', '浿', '珮', '蓜', '轡', '辔', '配', '霈', '馷'],\n diào: ['伄', '吊', '弔', '掉', '瘹', '盄', '窎', '窵', '竨', '訋', '釣', '鈟', '銱', '鋽', '鑃', '钓', '铞', '雿', '魡'],\n dùn: ['伅', '潡', '炖', '燉', '盾', '砘', '碷', '踲', '逇', '遁', '遯', '鈍', '钝'],\n wěn: ['伆', '刎', '吻', '呅', '抆', '桽', '稳', '穏', '穩', '紊', '肳', '脗'],\n xǐn: ['伈'],\n kàng: ['伉', '匟', '囥', '抗', '炕', '鈧', '钪'],\n ài: ['伌', '僾', '塧', '壒', '嫒', '嬡', '愛', '懓', '暧', '曖', '爱', '瑷', '璦', '皧', '瞹', '砹', '硋', '碍', '礙', '薆', '譺', '賹', '鑀', '隘', '靉', '餲', '馤', '鱫', '鴱'],\n 'jì qí': ['伎', '薺'],\n 'xiū xǔ': ['休'],\n 'jìn yín': ['伒'],\n dǎn: ['伔', '刐', '撢', '玬', '瓭', '紞', '胆', '膽', '衴', '賧', '赕', '黕', '𬘘'],\n fū: ['伕', '呋', '娐', '孵', '尃', '怤', '懯', '敷', '旉', '玞', '砆', '稃', '筟', '糐', '綒', '肤', '膚', '荂', '荴', '衭', '趺', '跗', '邞', '鄜', '酜', '鈇', '麩', '麬', '麱', '麸', '𫓧'],\n tǎng: ['伖', '傥', '儻', '埫', '戃', '曭', '爣', '矘', '躺', '鎲', '钂', '镋'],\n yōu: ['优', '優', '呦', '嚘', '峳', '幽', '忧', '悠', '憂', '攸', '櫌', '滺', '瀀', '纋', '羪', '耰', '逌', '鄾', '麀'],\n huǒ: ['伙', '夥', '火', '煷', '邩', '鈥', '钬'],\n 'huì kuài': ['会', '會', '浍', '璯'],\n yǔ: ['伛', '俁', '俣', '偊', '傴', '匬', '噳', '圄', '圉', '宇', '寙', '屿', '嶼', '庾', '挧', '敔', '斞', '楀', '瑀', '瘐', '祤', '禹', '穥', '窳', '羽', '與', '萭', '貐', '鄅', '頨', '麌', '齬', '龉', '㺄'],\n cuì: ['伜', '啛', '忰', '悴', '毳', '淬', '焠', '疩', '瘁', '竁', '粋', '粹', '紣', '綷', '翆', '翠', '脃', '脆', '脺', '膬', '膵', '臎', '萃', '襊', '顇'],\n sǎn: ['伞', '傘', '糤', '繖', '饊', '馓'],\n wěi: ['伟', '伪', '偉', '偽', '僞', '儰', '娓', '寪', '屗', '崣', '嶉', '徫', '愇', '捤', '暐', '梶', '洧', '浘', '渨', '炜', '煒', '猥', '玮', '瑋', '痿', '緯', '纬', '腲', '艉', '芛', '苇', '荱', '萎', '葦', '蒍', '蔿', '蜼', '諉', '诿', '踓', '鍡', '韑', '韙', '韡', '韪', '頠', '颹', '骩', '骪', '骫', '鮪', '鲔', '𫇭', '𬀩', '𬱟'],\n 'chuán zhuàn': ['传', '傳'],\n 'chē jū': ['伡', '俥', '车'],\n 'jū chē': ['車'],\n yá: ['伢', '厑', '厓', '堐', '岈', '崕', '崖', '涯', '漄', '牙', '玡', '琊', '睚', '笌', '芽', '蚜', '衙', '齖'],\n qiàn: ['伣', '俔', '倩', '儙', '刋', '壍', '嬱', '悓', '棈', '椠', '槧', '欠', '歉', '皘', '篏', '篟', '縴', '芡', '蒨', '蔳', '輤', '𬘬'],\n shāng: ['伤', '傷', '商', '墒', '慯', '殇', '殤', '滳', '漡', '熵', '蔏', '螪', '觞', '觴', '謪', '鬺'],\n chāng: ['伥', '倀', '娼', '昌', '椙', '淐', '猖', '琩', '菖', '裮', '錩', '锠', '閶', '阊', '鯧', '鲳', '鼚'],\n 'chen cāng': ['伧'],\n xùn: ['伨', '侚', '卂', '噀', '巺', '巽', '徇', '愻', '殉', '殾', '汛', '潠', '狥', '蕈', '訊', '訓', '訙', '训', '讯', '迅', '迿', '逊', '遜', '鑂', '顨', '馴', '驯'],\n xìn: ['伩', '囟', '孞', '脪', '舋', '衅', '訫', '釁', '阠', '顖'],\n chǐ: ['伬', '侈', '卶', '叺', '呎', '垑', '恥', '歯', '耻', '肔', '胣', '蚇', '裭', '褫', '豉', '鉹', '齒', '齿'],\n 'xián xuán': ['伭'],\n 'nú nǔ': ['伮'],\n 'bó bǎi': ['伯'],\n 'gū gù': ['估'],\n nǐ: ['伱', '你', '儞', '孴', '拟', '擬', '旎', '晲', '狔', '苨', '薿', '隬'],\n 'nì ní': ['伲'],\n bàn: ['伴', '办', '半', '姅', '怑', '扮', '瓣', '秚', '絆', '绊', '辦', '鉡', '靽'],\n xù: ['伵', '侐', '勖', '勗', '卹', '叙', '垿', '壻', '婿', '序', '恤', '敍', '敘', '旭', '昫', '朂', '槒', '欰', '殈', '汿', '沀', '洫', '溆', '漵', '潊', '烅', '烼', '煦', '獝', '珬', '盢', '瞁', '稸', '絮', '続', '緒', '緖', '續', '绪', '续', '聓', '聟', '蓄', '藚', '訹', '賉', '酗', '頊', '鱮', '㳚'],\n zhòu: ['伷', '僽', '冑', '呪', '咒', '咮', '宙', '昼', '晝', '甃', '皱', '皺', '籀', '籒', '籕', '粙', '紂', '縐', '纣', '绉', '胄', '荮', '葤', '詋', '酎', '駎', '驟', '骤', '㤘', '㑇'],\n shēn: ['伸', '侁', '兟', '呻', '堔', '妽', '娠', '屾', '峷', '扟', '敒', '曑', '柛', '氠', '深', '燊', '珅', '甡', '甧', '申', '眒', '砷', '穼', '籶', '籸', '糂', '紳', '绅', '罙', '罧', '葠', '蓡', '蔘', '薓', '裑', '訷', '詵', '诜', '身', '駪', '鯓', '鯵', '鰺', '鲹', '鵢', '𬳽'],\n qū: ['伹', '佉', '匤', '呿', '坥', '屈', '岖', '岴', '嶇', '憈', '抾', '敺', '浀', '煀', '祛', '筁', '粬', '胠', '蛆', '蛐', '袪', '覻', '詘', '诎', '趍', '躯', '軀', '阹', '駆', '駈', '驅', '驱', '髷', '魼', '鰸', '鱋', '鶌', '麯', '麴', '麹', '黢', '㭕', '𪨰', '䓛'],\n 'sì cì': ['伺'],\n bēng: ['伻', '嘣', '奟', '崩', '嵭', '閍'],\n 'sì shì': ['似'],\n 'jiā qié gā': ['伽'],\n 'yǐ chì': ['佁'],\n 'diàn tián': ['佃', '钿'],\n 'hān gàn': ['佄'],\n mài: ['佅', '劢', '勱', '卖', '唛', '売', '脈', '衇', '賣', '迈', '邁', '霡', '霢', '麥', '麦', '鿏'],\n dàn: ['但', '僤', '啖', '啗', '啿', '噉', '嚪', '帎', '憺', '旦', '柦', '氮', '沊', '泹', '淡', '狚', '疍', '癚', '禫', '窞', '腅', '萏', '蓞', '蛋', '蜑', '觛', '訑', '誕', '诞', '贉', '霮', '餤', '饏', '駳', '髧', '鴠', '𫢸'],\n bù: ['佈', '勏', '吥', '咘', '埗', '埠', '布', '廍', '怖', '悑', '步', '歨', '歩', '瓿', '篰', '荹', '蔀', '踄', '部', '郶', '鈈', '钚', '餢'],\n bǐ: ['佊', '俾', '匕', '夶', '妣', '彼', '朼', '柀', '比', '毞', '沘', '疕', '秕', '笔', '筆', '粃', '聛', '舭', '貏', '鄙'],\n 'zhāo shào': ['佋'],\n cǐ: ['佌', '此', '泚', '皉', '𫚖'],\n wèi: ['位', '卫', '味', '喂', '墛', '媦', '慰', '懀', '未', '渭', '煟', '熭', '犚', '猬', '畏', '緭', '罻', '胃', '苿', '菋', '藯', '蘶', '蝟', '螱', '衛', '衞', '褽', '謂', '讆', '讏', '谓', '躗', '躛', '軎', '轊', '鏏', '霨', '餧', '餵', '饖', '魏', '鮇', '鳚'],\n zuǒ: ['佐', '左', '繓'],\n yǎng: ['佒', '傟', '养', '坱', '岟', '慃', '懩', '攁', '氧', '氱', '炴', '痒', '癢', '礢', '紻', '蝆', '軮', '養', '駚'],\n 'tǐ tī': ['体', '體'],\n zhàn: ['佔', '偡', '嶘', '战', '戦', '戰', '栈', '桟', '棧', '湛', '站', '綻', '绽', '菚', '蘸', '虥', '虦', '譧', '轏', '驏'],\n 'hé hē hè': ['何'],\n bì: ['佖', '咇', '哔', '嗶', '坒', '堛', '壁', '奰', '妼', '婢', '嬖', '币', '幣', '幤', '庇', '庳', '廦', '弊', '弻', '弼', '彃', '必', '怭', '愊', '愎', '敝', '斃', '梐', '毕', '毖', '毙', '湢', '滗', '滭', '潷', '煏', '熚', '狴', '獘', '獙', '珌', '璧', '畀', '畢', '疪', '痹', '痺', '皕', '睤', '碧', '筚', '箅', '箆', '篦', '篳', '粊', '綼', '縪', '繴', '罼', '腷', '苾', '荜', '萆', '萞', '蓖', '蓽', '蔽', '薜', '蜌', '袐', '襅', '襞', '襣', '觱', '詖', '诐', '貱', '贔', '赑', '跸', '蹕', '躃', '躄', '避', '邲', '鄨', '鄪', '鉍', '鏎', '鐴', '铋', '閇', '閉', '閟', '闭', '陛', '韠', '飶', '饆', '馝', '駜', '驆', '髀', '魓', '鮅', '鷝', '鷩', '鼊'],\n tuó: ['佗', '坨', '堶', '岮', '槖', '橐', '沱', '砣', '砤', '碢', '紽', '詑', '跎', '酡', '阤', '陀', '陁', '駝', '駞', '騨', '驒', '驝', '驼', '鮀', '鴕', '鸵', '鼉', '鼍', '鼧', '𬶍'],\n shé: ['佘', '舌', '虵', '蛥'],\n 'yì dié': ['佚', '昳', '泆', '軼'],\n 'fó fú bì bó': ['佛'],\n 'zuò zuō': ['作'],\n gōu: ['佝', '沟', '溝', '痀', '篝', '簼', '緱', '缑', '袧', '褠', '鈎', '鉤', '钩', '鞲', '韝'],\n nìng: ['佞', '侫', '倿', '寕', '泞', '澝', '濘'],\n qú: ['佢', '劬', '戵', '斪', '欋', '欔', '氍', '淭', '灈', '爠', '璖', '璩', '癯', '磲', '籧', '絇', '胊', '臞', '菃', '葋', '蕖', '蘧', '蟝', '蠷', '蠼', '衐', '衢', '躣', '軥', '鑺', '鴝', '鸜', '鸲', '鼩'],\n 'yōng yòng': ['佣'],\n wǎ: ['佤', '咓', '砙', '邷'],\n kǎ: ['佧', '垰', '胩', '裃', '鉲'],\n bāo: ['佨', '勹', '包', '孢', '煲', '笣', '胞', '苞', '蕔', '裦', '褒', '襃', '闁', '齙', '龅'],\n 'huái huí': ['佪'],\n 'gé hè': ['佫'],\n lǎo: ['佬', '咾', '恅', '栳', '狫', '珯', '硓', '老', '耂', '荖', '蛯', '轑', '銠', '铑', '鮱'],\n xiáng: ['佭', '庠', '栙', '祥', '絴', '翔', '詳', '跭'],\n gé: ['佮', '匌', '呄', '嗝', '塥', '愅', '挌', '搿', '槅', '櫊', '滆', '膈', '臵', '茖', '觡', '諽', '輵', '轕', '閣', '阁', '隔', '鞷', '韐', '韚', '騔', '骼', '鮯'],\n yáng: ['佯', '劷', '垟', '崸', '徉', '扬', '揚', '敭', '旸', '昜', '暘', '杨', '楊', '洋', '炀', '珜', '疡', '瘍', '眻', '蛘', '諹', '輰', '鍚', '钖', '阦', '阳', '陽', '霷', '颺', '飏', '鰑', '鴹', '鸉'],\n bǎi: ['佰', '捭', '摆', '擺', '栢', '百', '竡', '粨', '襬'],\n fǎ: ['佱', '峜', '法', '灋', '砝', '鍅'],\n mǐng: ['佲', '凕', '姳', '慏', '酩'],\n 'èr nài': ['佴'],\n hěn: ['佷', '很', '狠', '詪', '𬣳'],\n huó: ['佸', '活'],\n guǐ: ['佹', '匦', '匭', '厬', '垝', '姽', '宄', '庋', '庪', '恑', '晷', '湀', '癸', '祪', '簋', '蛫', '蟡', '觤', '詭', '诡', '軌', '轨', '陒', '鬼'],\n quán: ['佺', '全', '啳', '埢', '姾', '峑', '巏', '拳', '搼', '权', '楾', '権', '權', '泉', '洤', '湶', '牷', '犈', '瑔', '痊', '硂', '筌', '縓', '荃', '葲', '蜷', '蠸', '觠', '詮', '诠', '跧', '踡', '輇', '辁', '醛', '銓', '铨', '闎', '顴', '颧', '駩', '騡', '鬈', '鰁', '鳈', '齤'],\n tiāo: ['佻', '庣', '旫', '祧', '聎'],\n jiǎo: ['佼', '儌', '孂', '挢', '搅', '撟', '撹', '攪', '敫', '敽', '敿', '晈', '暞', '曒', '灚', '燞', '狡', '璬', '皎', '皦', '絞', '纐', '绞', '腳', '臫', '蟜', '譑', '賋', '踋', '鉸', '铰', '餃', '饺', '鱎', '龣'],\n cì: ['佽', '刾', '庛', '朿', '栨', '次', '絘', '茦', '莿', '蛓', '螆', '賜', '赐'],\n xíng: ['侀', '刑', '哘', '型', '娙', '形', '洐', '硎', '蛵', '邢', '郉', '鈃', '鉶', '銒', '钘', '铏', '陉', '陘', '餳', '𫰛'],\n tuō: ['侂', '咃', '咜', '圫', '托', '拕', '拖', '汑', '脫', '脱', '莌', '袥', '託', '讬', '飥', '饦', '魠', '鮵'],\n kǎn: ['侃', '偘', '冚', '坎', '惂', '砍', '莰', '輡', '轗', '顑'],\n zhí: ['侄', '値', '值', '埴', '執', '姪', '嬂', '戠', '执', '摭', '植', '樴', '淔', '漐', '直', '禃', '絷', '縶', '聀', '职', '職', '膱', '蟙', '跖', '踯', '蹠', '躑', '軄', '釞', '馽'],\n gāi: ['侅', '垓', '姟', '峐', '晐', '畡', '祴', '荄', '該', '该', '豥', '賅', '賌', '赅', '陔'],\n lái: ['來', '俫', '倈', '崃', '崍', '庲', '来', '梾', '棶', '涞', '淶', '猍', '琜', '筙', '箂', '莱', '萊', '逨', '郲', '錸', '铼', '騋', '鯠', '鶆', '麳'],\n kuǎ: ['侉', '咵', '垮', '銙'],\n gōng: ['侊', '公', '功', '匑', '匔', '塨', '宫', '宮', '工', '幊', '弓', '恭', '攻', '杛', '碽', '糼', '糿', '肱', '觥', '觵', '躬', '躳', '髸', '龔', '龚', '䢼'],\n lì: ['例', '俐', '俪', '傈', '儮', '儷', '凓', '利', '力', '励', '勵', '历', '厉', '厤', '厯', '厲', '叓', '吏', '呖', '唎', '唳', '嚦', '囇', '坜', '塛', '壢', '娳', '婯', '屴', '岦', '悧', '悷', '慄', '戾', '搮', '暦', '曆', '曞', '朸', '枥', '栃', '栗', '栛', '檪', '櫔', '櫪', '欐', '歴', '歷', '沥', '沴', '涖', '溧', '濿', '瀝', '爏', '犡', '猁', '珕', '瑮', '瓅', '瓑', '瓥', '疬', '痢', '癧', '盭', '睙', '砅', '砺', '砾', '磿', '礪', '礫', '礰', '禲', '秝', '立', '笠', '篥', '粒', '粝', '糲', '脷', '苈', '茘', '荔', '莅', '莉', '蒚', '蒞', '藶', '蚸', '蛎', '蛠', '蜧', '蝷', '蠇', '蠣', '詈', '讈', '赲', '轢', '轣', '轹', '酈', '鉝', '隶', '隷', '雳', '靂', '靋', '鬁', '鳨', '鴗', '鷅', '麜', '𫵷', '𬍛'],\n yīn: ['侌', '凐', '喑', '噾', '囙', '因', '垔', '堙', '姻', '婣', '愔', '慇', '栶', '氤', '洇', '溵', '濦', '瘖', '禋', '秵', '筃', '絪', '緸', '茵', '蒑', '蔭', '裀', '諲', '銦', '铟', '闉', '阥', '阴', '陰', '陻', '隂', '霒', '霠', '鞇', '音', '韾', '駰', '骃', '齗', '𬘡', '𬤇', '𬮱'],\n mǐ: ['侎', '孊', '弭', '敉', '洣', '渳', '灖', '米', '粎', '羋', '脒', '芈', '葞', '蔝', '銤'],\n zhū: ['侏', '株', '槠', '橥', '櫧', '櫫', '洙', '潴', '瀦', '猪', '珠', '硃', '秼', '絑', '茱', '蕏', '蛛', '蝫', '蠩', '袾', '誅', '諸', '诛', '诸', '豬', '跦', '邾', '銖', '铢', '駯', '鮢', '鯺', '鴸', '鼄'],\n ān: ['侒', '偣', '媕', '安', '峖', '庵', '桉', '氨', '盦', '盫', '腤', '菴', '萻', '葊', '蓭', '誝', '諳', '谙', '鞌', '鞍', '韽', '馣', '鮟', '鵪', '鶕', '鹌', '𩽾'],\n lù: ['侓', '僇', '勎', '勠', '圥', '坴', '塶', '娽', '峍', '廘', '彔', '录', '戮', '摝', '椂', '樚', '淕', '淥', '渌', '漉', '潞', '琭', '璐', '甪', '盝', '睩', '硉', '祿', '禄', '稑', '穋', '箓', '簏', '簬', '簵', '簶', '籙', '粶', '蔍', '蕗', '虂', '螰', '賂', '赂', '趢', '路', '踛', '蹗', '輅', '轆', '辂', '辘', '逯', '醁', '錄', '録', '錴', '鏴', '陸', '騄', '騼', '鯥', '鴼', '鵦', '鵱', '鷺', '鹭', '鹿', '麓', '𫘧'],\n móu: ['侔', '劺', '恈', '眸', '蛑', '謀', '谋', '踎', '鍪', '鴾', '麰'],\n ér: ['侕', '儿', '児', '兒', '峏', '栭', '洏', '粫', '而', '胹', '荋', '袻', '輀', '轜', '陑', '隭', '髵', '鮞', '鲕', '鴯', '鸸'],\n 'dòng tǒng tóng': ['侗'],\n chà: ['侘', '奼', '姹', '岔', '汊', '詫', '诧'],\n chì: ['侙', '傺', '勅', '勑', '叱', '啻', '彳', '恜', '慗', '憏', '懘', '抶', '敕', '斥', '杘', '湁', '灻', '炽', '烾', '熾', '痓', '痸', '瘛', '翄', '翅', '翤', '翨', '腟', '赤', '趩', '遫', '鉓', '雴', '飭', '饬', '鶒', '鷘'],\n 'gòng gōng': ['供', '共'],\n zhōu: ['侜', '周', '喌', '州', '徟', '洲', '淍', '炿', '烐', '珘', '矪', '舟', '謅', '譸', '诌', '賙', '赒', '輈', '輖', '辀', '週', '郮', '銂', '霌', '駲', '騆', '鵃', '鸼'],\n rú: ['侞', '儒', '嚅', '如', '嬬', '孺', '帤', '曘', '桇', '渪', '濡', '筎', '茹', '蕠', '薷', '蝡', '蠕', '袽', '襦', '邚', '醹', '銣', '铷', '顬', '颥', '鱬', '鴑', '鴽'],\n 'jiàn cún': ['侟'],\n xiá: ['侠', '俠', '匣', '峡', '峽', '敮', '暇', '柙', '炠', '烚', '狎', '狭', '狹', '珨', '瑕', '硖', '硤', '碬', '祫', '筪', '縖', '翈', '舝', '舺', '蕸', '赮', '轄', '辖', '遐', '鍜', '鎋', '陜', '陿', '霞', '騢', '魻', '鶷', '黠'],\n lǚ: ['侣', '侶', '儢', '吕', '呂', '屡', '屢', '履', '挔', '捛', '旅', '梠', '焒', '祣', '稆', '穭', '絽', '縷', '缕', '膂', '膐', '褛', '褸', '郘', '鋁', '铝'],\n ta: ['侤'],\n 'jiǎo yáo': ['侥', '僥', '徺'],\n zhēn: ['侦', '偵', '寊', '帧', '帪', '幀', '搸', '斟', '桢', '楨', '榛', '樼', '殝', '浈', '湞', '潧', '澵', '獉', '珍', '珎', '瑧', '甄', '眞', '真', '砧', '碪', '祯', '禎', '禛', '箴', '胗', '臻', '葴', '蒖', '蓁', '薽', '貞', '贞', '轃', '遉', '酙', '針', '鉁', '錱', '鍼', '针', '鱵'],\n 'cè zè zhāi': ['侧', '側'],\n kuài: ['侩', '儈', '凷', '哙', '噲', '圦', '块', '塊', '巜', '廥', '快', '旝', '欳', '狯', '獪', '筷', '糩', '脍', '膾', '郐', '鄶', '鱠', '鲙'],\n chái: ['侪', '儕', '喍', '柴', '犲', '祡', '豺'],\n nóng: ['侬', '儂', '农', '哝', '噥', '檂', '欁', '浓', '濃', '燶', '禯', '秾', '穠', '脓', '膿', '蕽', '襛', '譨', '農', '辳', '醲', '鬞', '𬪩'],\n jǐn: ['侭', '儘', '卺', '厪', '巹', '槿', '漌', '瑾', '紧', '緊', '菫', '蓳', '謹', '谨', '錦', '锦', '饉', '馑'],\n 'hóu hòu': ['侯', '矦'],\n jiǒng: ['侰', '僒', '冏', '囧', '泂', '澃', '炯', '烱', '煚', '煛', '熲', '燛', '窘', '綗', '褧', '迥', '逈', '顈', '颎', '䌹'],\n 'chěng tǐng': ['侱'],\n 'zhèn zhēn': ['侲', '揕'],\n zuò: ['侳', '做', '唑', '坐', '岝', '岞', '座', '祚', '糳', '胙', '葃', '葄', '蓙', '袏', '阼'],\n qīn: ['侵', '兓', '媇', '嵚', '嶔', '欽', '衾', '誛', '钦', '顉', '駸', '骎', '鮼'],\n jú: ['侷', '啹', '婅', '局', '巈', '椈', '橘', '泦', '淗', '湨', '焗', '犑', '狊', '粷', '菊', '蘜', '趜', '跼', '蹫', '輂', '郹', '閰', '駶', '驧', '鵙', '鵴', '鶪', '鼰', '鼳', '䴗'],\n 'shù dōu': ['侸'],\n tǐng: ['侹', '圢', '娗', '挺', '涏', '烶', '珽', '脡', '艇', '誔', '頲', '颋'],\n shèn: ['侺', '愼', '慎', '昚', '涁', '渗', '滲', '瘆', '瘮', '眘', '祳', '肾', '胂', '脤', '腎', '蜃', '蜄', '鋠'],\n 'tuì tuó': ['侻'],\n nán: ['侽', '喃', '娚', '抩', '暔', '枏', '柟', '楠', '男', '畘', '莮', '萳', '遖'],\n xiāo: ['侾', '哓', '嘵', '嚻', '囂', '婋', '宯', '宵', '庨', '彇', '揱', '枭', '枵', '梟', '櫹', '歊', '毊', '消', '潇', '瀟', '灱', '灲', '烋', '焇', '猇', '獢', '痚', '痟', '硝', '硣', '窙', '箫', '簘', '簫', '綃', '绡', '翛', '膮', '萧', '蕭', '虈', '虓', '蟂', '蟏', '蟰', '蠨', '踃', '逍', '銷', '销', '霄', '颵', '驍', '骁', '髇', '髐', '魈', '鴞', '鴵', '鷍', '鸮'],\n 'biàn pián': ['便', '緶', '缏'],\n tuǐ: ['俀', '腿', '蹆', '骽'],\n xì: ['係', '匸', '卌', '呬', '墍', '屃', '屓', '屭', '忥', '怬', '恄', '椞', '潝', '潟', '澙', '熂', '犔', '磶', '禊', '細', '綌', '縘', '细', '绤', '舃', '舄', '蕮', '虩', '衋', '覤', '赩', '趇', '郤', '釳', '阋', '隙', '隟', '霼', '餼', '饩', '鬩', '黖'],\n cù: ['促', '媨', '憱', '猝', '瘄', '瘯', '簇', '縬', '脨', '蔟', '誎', '趗', '踧', '踿', '蹙', '蹴', '蹵', '醋', '顣', '鼀'],\n é: ['俄', '囮', '娥', '峉', '峨', '峩', '涐', '珴', '皒', '睋', '磀', '莪', '訛', '誐', '譌', '讹', '迗', '鈋', '鋨', '锇', '頟', '額', '额', '魤', '鵝', '鵞', '鹅'],\n qiú: ['俅', '叴', '唒', '囚', '崷', '巯', '巰', '扏', '梂', '殏', '毬', '求', '汓', '泅', '浗', '湭', '煪', '犰', '玌', '球', '璆', '皳', '盚', '紌', '絿', '肍', '芁', '莍', '虬', '虯', '蛷', '裘', '觓', '觩', '訄', '訅', '賕', '赇', '逎', '逑', '遒', '酋', '釚', '釻', '銶', '頄', '鮂', '鯄', '鰽', '鼽', '𨱇'],\n xú: ['俆', '徐', '禑'],\n 'guàng kuāng': ['俇'],\n kù: ['俈', '喾', '嚳', '库', '庫', '廤', '瘔', '絝', '绔', '袴', '裤', '褲', '酷'],\n wù: ['俉', '务', '務', '勿', '卼', '坞', '塢', '奦', '婺', '寤', '屼', '岉', '嵨', '忢', '悞', '悟', '悮', '戊', '扤', '晤', '杌', '溩', '焐', '熃', '物', '痦', '矹', '窹', '粅', '蘁', '誤', '误', '鋈', '阢', '隖', '雾', '霚', '霧', '靰', '騖', '骛', '鶩', '鹜', '鼿', '齀'],\n jùn: ['俊', '儁', '呁', '埈', '寯', '峻', '懏', '捃', '攟', '晙', '棞', '燇', '珺', '畯', '竣', '箟', '蜠', '賐', '郡', '陖', '餕', '馂', '駿', '骏', '鵔', '鵕', '鵘', '䐃'],\n liáng: ['俍', '墚', '梁', '椋', '樑', '粮', '粱', '糧', '良', '輬', '辌', '𫟅'],\n zǔ: ['俎', '唨', '爼', '祖', '組', '组', '詛', '诅', '鎺', '阻', '靻'],\n 'qiào xiào': ['俏'],\n yǒng: ['俑', '勇', '勈', '咏', '埇', '塎', '嵱', '彮', '怺', '恿', '悀', '惥', '愑', '愹', '慂', '柡', '栐', '永', '泳', '湧', '甬', '蛹', '詠', '踊', '踴', '鯒', '鲬'],\n hùn: ['俒', '倱', '圂', '尡', '慁', '掍', '溷', '焝', '睴', '觨', '諢', '诨'],\n jìng: ['俓', '傹', '境', '妌', '婙', '婧', '弪', '弳', '径', '徑', '敬', '曔', '桱', '梷', '浄', '瀞', '獍', '痉', '痙', '竞', '竟', '竫', '競', '竸', '胫', '脛', '莖', '誩', '踁', '迳', '逕', '鏡', '镜', '靖', '静', '靜', '鵛'],\n sàn: ['俕', '閐'],\n pěi: ['俖'],\n sú: ['俗'],\n xī: ['俙', '僖', '兮', '凞', '卥', '厀', '吸', '唏', '唽', '嘻', '噏', '嚱', '夕', '奚', '嬆', '嬉', '屖', '嵠', '巇', '希', '徆', '徯', '息', '悉', '悕', '惁', '惜', '昔', '晞', '晰', '晳', '曦', '析', '桸', '榽', '樨', '橀', '欷', '氥', '汐', '浠', '淅', '渓', '溪', '烯', '焁', '焈', '焟', '熄', '熈', '熙', '熹', '熺', '熻', '燨', '爔', '牺', '犀', '犠', '犧', '琋', '瘜', '皙', '睎', '瞦', '矽', '硒', '磎', '礂', '稀', '穸', '窸', '粞', '糦', '緆', '繥', '羲', '翕', '翖', '肸', '肹', '膝', '舾', '莃', '菥', '蒠', '蜥', '螅', '蟋', '蠵', '西', '觹', '觽', '觿', '譆', '谿', '豀', '豨', '豯', '貕', '赥', '邜', '鄎', '酅', '醯', '釸', '錫', '鏭', '鐊', '鑴', '锡', '隵', '餏', '饎', '饻', '鯑', '鵗', '鸂', '鼷'],\n lǐ: ['俚', '娌', '峢', '峲', '李', '欚', '浬', '澧', '理', '礼', '禮', '粴', '裏', '裡', '豊', '逦', '邐', '醴', '鋰', '锂', '鯉', '鱧', '鱱', '鲤', '鳢'],\n bǎo: ['保', '堢', '媬', '宝', '寚', '寳', '寶', '珤', '緥', '葆', '藵', '褓', '賲', '靌', '飹', '飽', '饱', '駂', '鳵', '鴇', '鸨'],\n 'yú shù yù': ['俞'],\n 'sì qí': ['俟'],\n 'xìn shēn': ['信'],\n xiū: ['俢', '修', '咻', '庥', '樇', '烌', '羞', '脙', '脩', '臹', '貅', '銝', '鎀', '飍', '饈', '馐', '髤', '髹', '鮴', '鱃', '鵂', '鸺', '䗛'],\n dì: ['俤', '偙', '僀', '埊', '墑', '墬', '娣', '帝', '怟', '旳', '梊', '焍', '玓', '甋', '眱', '睇', '碲', '祶', '禘', '第', '締', '缔', '腣', '菂', '蒂', '蔕', '蝃', '蝭', '螮', '諦', '谛', '踶', '递', '逓', '遞', '遰', '鉪', '𤧛', '䗖'],\n chóu: ['俦', '儔', '嬦', '惆', '愁', '懤', '栦', '燽', '畴', '疇', '皗', '稠', '筹', '籌', '絒', '綢', '绸', '菗', '詶', '讎', '讐', '踌', '躊', '酧', '酬', '醻', '雔', '雠', '雦'],\n zhì: ['俧', '偫', '儨', '制', '劕', '垁', '娡', '寘', '帙', '帜', '幟', '庢', '庤', '廌', '彘', '徏', '徝', '志', '忮', '懥', '懫', '挃', '挚', '掷', '摯', '擲', '旘', '晊', '智', '栉', '桎', '梽', '櫍', '櫛', '治', '洷', '滍', '滞', '滯', '潌', '瀄', '炙', '熫', '狾', '猘', '璏', '瓆', '痔', '痣', '礩', '祑', '秩', '秷', '稚', '稺', '穉', '窒', '紩', '緻', '置', '翐', '膣', '至', '致', '芖', '蛭', '袟', '袠', '製', '覟', '觗', '觯', '觶', '誌', '豑', '豒', '貭', '質', '贄', '质', '贽', '跱', '踬', '躓', '輊', '轾', '郅', '銍', '鋕', '鑕', '铚', '锧', '陟', '隲', '雉', '駤', '騭', '騺', '驇', '骘', '鯯', '鴙', '鷙', '鸷', '𬃊'],\n 'liǎ liǎng': ['俩'],\n jiǎn: ['俭', '倹', '儉', '减', '剪', '堿', '弿', '彅', '戩', '戬', '拣', '挸', '捡', '揀', '撿', '枧', '柬', '梘', '检', '検', '檢', '減', '湕', '瀽', '瑐', '睑', '瞼', '硷', '碱', '礆', '笕', '筧', '简', '簡', '絸', '繭', '翦', '茧', '藆', '蠒', '裥', '襇', '襉', '襺', '詃', '謇', '謭', '譾', '谫', '趼', '蹇', '鐗', '鬋', '鰎', '鹸', '鹻', '鹼'],\n huò: ['俰', '咟', '嚯', '嚿', '奯', '彠', '惑', '或', '擭', '旤', '曤', '檴', '沎', '湱', '瀖', '獲', '癨', '眓', '矐', '祸', '禍', '穫', '窢', '耯', '臛', '艧', '获', '蒦', '藿', '蠖', '謋', '貨', '货', '鍃', '鑊', '镬', '雘', '霍', '靃', '韄', '㸌'],\n 'jù jū': ['俱', '据', '鋸', '锯'],\n xiào: ['俲', '傚', '効', '咲', '哮', '啸', '嘋', '嘨', '嘯', '孝', '效', '斅', '斆', '歗', '涍', '熽', '笑', '詨', '誟'],\n pái: ['俳', '徘', '牌', '犤', '猅', '簰', '簲', '輫'],\n biào: ['俵', '鰾', '鳔'],\n 'chù tì': ['俶'],\n fèi: ['俷', '剕', '厞', '吠', '屝', '废', '廃', '廢', '昲', '曊', '櫠', '沸', '濷', '狒', '癈', '肺', '萉', '費', '费', '鐨', '镄', '陫', '靅', '鼣'],\n fèng: ['俸', '凤', '奉', '湗', '焨', '煈', '賵', '赗', '鳯', '鳳', '鴌'],\n ǎn: ['俺', '唵', '埯', '揞', '罯', '銨', '铵'],\n bèi: ['俻', '倍', '偝', '偹', '備', '僃', '备', '悖', '惫', '愂', '憊', '昁', '梖', '焙', '牬', '犕', '狈', '狽', '珼', '琲', '碚', '禙', '糒', '苝', '蓓', '蛽', '褙', '貝', '贝', '軰', '輩', '辈', '邶', '郥', '鄁', '鋇', '鐾', '钡', '鞁', '鞴', '𬇙'],\n yù: ['俼', '儥', '喅', '喩', '喻', '域', '堉', '妪', '嫗', '寓', '峪', '嶎', '庽', '彧', '御', '愈', '慾', '戫', '昱', '棛', '棜', '棫', '櫲', '欎', '欝', '欲', '毓', '浴', '淯', '滪', '潏', '澦', '灪', '焴', '煜', '燏', '燠', '爩', '狱', '獄', '玉', '琙', '瘉', '癒', '砡', '硢', '硲', '礇', '礖', '礜', '禦', '秗', '稢', '稶', '篽', '籞', '籲', '粖', '緎', '罭', '聿', '肀', '艈', '芋', '芌', '茟', '蒮', '蓣', '蓹', '蕷', '蘌', '蜟', '蜮', '袬', '裕', '誉', '諭', '譽', '谕', '豫', '軉', '輍', '逳', '遇', '遹', '郁', '醧', '鈺', '鋊', '錥', '鐭', '钰', '閾', '阈', '雤', '霱', '預', '预', '飫', '饇', '饫', '馭', '驈', '驭', '鬰', '鬱', '鬻', '魊', '鱊', '鳿', '鴥', '鴧', '鴪', '鵒', '鷸', '鸒', '鹆', '鹬'],\n xīn: ['俽', '噺', '妡', '嬜', '廞', '心', '忄', '忻', '惞', '新', '昕', '杺', '欣', '歆', '炘', '盺', '薪', '訢', '辛', '邤', '鈊', '鋅', '鑫', '锌', '馨', '馫', '䜣', '𫷷'],\n 'hǔ chí': ['俿'],\n jiù: ['倃', '僦', '匓', '匛', '匶', '厩', '咎', '就', '廄', '廏', '廐', '慦', '捄', '救', '旧', '柩', '柾', '桕', '欍', '殧', '疚', '臼', '舅', '舊', '鯦', '鷲', '鹫', '麔', '齨', '㠇'],\n yáo: ['倄', '傜', '嗂', '垚', '堯', '姚', '媱', '尧', '尭', '峣', '嶢', '嶤', '徭', '揺', '搖', '摇', '摿', '暚', '榣', '烑', '爻', '猺', '珧', '瑤', '瑶', '磘', '窑', '窯', '窰', '肴', '蘨', '謠', '謡', '谣', '軺', '轺', '遙', '遥', '邎', '顤', '颻', '飖', '餆', '餚', '鰩', '鱙', '鳐'],\n 'cuì zú': ['倅'],\n 'liǎng liǎ': ['倆'],\n wǎn: ['倇', '唍', '婉', '惋', '挽', '晚', '晥', '晩', '晼', '梚', '椀', '琬', '畹', '皖', '盌', '碗', '綩', '綰', '绾', '脘', '萖', '踠', '輓', '鋔'],\n zǒng: ['倊', '偬', '傯', '嵸', '总', '惣', '捴', '搃', '摠', '燪', '総', '緫', '縂', '總', '蓗'],\n guān: ['倌', '关', '官', '棺', '瘝', '癏', '窤', '蒄', '関', '闗', '關', '鰥', '鱞', '鳏'],\n tiǎn: ['倎', '唺', '忝', '悿', '晪', '殄', '淟', '睓', '腆', '舔', '覥', '觍', '賟', '錪', '餂'],\n mén: ['們', '扪', '捫', '璊', '菛', '虋', '鍆', '钔', '門', '閅', '门', '𫞩'],\n 'dǎo dào': ['倒'],\n 'tán tàn': ['倓', '埮'],\n 'juè jué': ['倔'],\n chuí: ['倕', '垂', '埀', '捶', '搥', '桘', '棰', '槌', '箠', '腄', '菙', '錘', '鎚', '锤', '陲', '顀'],\n xìng: ['倖', '姓', '婞', '嬹', '幸', '性', '悻', '杏', '涬', '緈', '臖', '荇', '莕', '葕'],\n péng: ['倗', '傰', '塜', '塳', '弸', '憉', '捀', '朋', '棚', '椖', '樥', '硼', '稝', '竼', '篷', '纄', '膨', '芃', '蓬', '蘕', '蟚', '蟛', '袶', '輣', '錋', '鑝', '韸', '韼', '騯', '髼', '鬅', '鬔', '鵬', '鹏'],\n 'tǎng cháng': ['倘'],\n hòu: ['候', '厚', '后', '垕', '堠', '後', '洉', '茩', '豞', '逅', '郈', '鮜', '鱟', '鲎', '鲘'],\n tì: ['倜', '剃', '嚏', '嚔', '屉', '屜', '悌', '悐', '惕', '惖', '戻', '掦', '替', '朑', '歒', '殢', '涕', '瓋', '笹', '籊', '薙', '褅', '逖', '逷', '髰', '鬀', '鬄'],\n gàn: ['倝', '凎', '幹', '榦', '檊', '淦', '灨', '盰', '紺', '绀', '詌', '贑', '赣', '骭', '㽏'],\n 'liàng jìng': ['倞', '靓'],\n suī: ['倠', '哸', '夊', '滖', '濉', '眭', '睢', '芕', '荽', '荾', '虽', '雖', '鞖'],\n 'chàng chāng': ['倡'],\n jié: ['倢', '偼', '傑', '刦', '刧', '刼', '劫', '劼', '卩', '卪', '婕', '媫', '孑', '岊', '崨', '嵥', '嶻', '巀', '幯', '截', '捷', '掶', '擮', '昅', '杢', '杰', '桀', '桝', '楬', '楶', '榤', '洁', '滐', '潔', '狤', '睫', '礍', '竭', '節', '羯', '莭', '蓵', '蛣', '蜐', '蠘', '蠞', '蠽', '衱', '袺', '訐', '詰', '誱', '讦', '踕', '迼', '鉣', '鍻', '镼', '頡', '鮚', '鲒', '㛃'],\n 'kǒng kōng': ['倥'],\n juàn: ['倦', '劵', '奆', '慻', '桊', '淃', '狷', '獧', '眷', '睊', '睠', '絭', '絹', '绢', '罥', '羂', '腃', '蔨', '鄄', '餋'],\n zōng: ['倧', '堫', '宗', '嵏', '嵕', '惾', '朡', '棕', '椶', '熧', '猣', '磫', '緃', '翪', '腙', '葼', '蝬', '豵', '踨', '踪', '蹤', '鍐', '鑁', '騌', '騣', '骔', '鬃', '鬉', '鬷', '鯮', '鯼'],\n ní: ['倪', '坭', '埿', '尼', '屔', '怩', '淣', '猊', '籾', '聣', '蚭', '蜺', '觬', '貎', '跜', '輗', '郳', '鈮', '铌', '霓', '馜', '鯢', '鲵', '麑', '齯', '𫐐', '𫠜'],\n zhuō: ['倬', '拙', '捉', '桌', '梲', '棁', '棳', '槕', '涿', '窧', '鐯', '䦃'],\n 'wō wēi': ['倭'],\n luǒ: ['倮', '剆', '曪', '瘰', '癳', '臝', '蓏', '蠃', '裸', '躶'],\n sōng: ['倯', '凇', '娀', '崧', '嵩', '庺', '憽', '松', '枀', '枩', '柗', '梥', '檧', '淞', '濍', '硹', '菘', '鬆'],\n lèng: ['倰', '堎', '愣', '睖', '踜'],\n zì: ['倳', '剚', '字', '恣', '渍', '漬', '牸', '眥', '眦', '胔', '胾', '自', '茡', '荢'],\n bèn: ['倴', '坌', '捹', '撪', '渀', '笨', '逩'],\n cǎi: ['倸', '啋', '婇', '彩', '採', '棌', '毝', '睬', '綵', '跴', '踩'],\n zhài: ['债', '債', '寨', '瘵', '砦'],\n yē: ['倻', '吔', '噎', '擨', '暍', '椰', '歋', '潱', '蠮'],\n shà: ['倽', '唼', '喢', '歃', '箑', '翜', '翣', '萐', '閯', '霎'],\n qīng: ['倾', '傾', '卿', '圊', '寈', '氢', '氫', '淸', '清', '蜻', '軽', '輕', '轻', '郬', '錆', '鑋', '靑', '青', '鯖'],\n yīng: ['偀', '嘤', '噟', '嚶', '婴', '媖', '嫈', '嬰', '孆', '孾', '愥', '撄', '攖', '朠', '桜', '樱', '櫻', '渶', '煐', '珱', '瑛', '璎', '瓔', '甇', '甖', '碤', '礯', '緓', '纓', '绬', '缨', '罂', '罃', '罌', '膺', '英', '莺', '蘡', '蝧', '蠳', '褮', '譻', '賏', '軈', '鑍', '锳', '霙', '韺', '鴬', '鶑', '鶧', '鶯', '鷪', '鷹', '鸎', '鸚', '鹦', '鹰', '䓨'],\n 'chēng chèn': ['偁', '爯'],\n ruǎn: ['偄', '朊', '瑌', '瓀', '碝', '礝', '腝', '軟', '輭', '软', '阮'],\n 'zhòng tóng': ['偅'],\n chǔn: ['偆', '惷', '睶', '萶', '蠢', '賰'],\n 'jiǎ jià': ['假'],\n 'jì jié': ['偈'],\n 'bǐng bìng': ['偋'],\n ruò: ['偌', '叒', '嵶', '弱', '楉', '焫', '爇', '箬', '篛', '蒻', '鄀', '鰙', '鰯', '鶸'],\n tí: ['偍', '厗', '啼', '嗁', '崹', '漽', '瑅', '睼', '禵', '稊', '緹', '缇', '罤', '蕛', '褆', '謕', '趧', '蹄', '蹏', '醍', '鍗', '題', '题', '騠', '鮷', '鯷', '鳀', '鵜', '鷤', '鹈', '𫘨'],\n wēi: ['偎', '危', '喴', '威', '媙', '嶶', '巍', '微', '愄', '揋', '揻', '椳', '楲', '溦', '烓', '煨', '燰', '癓', '縅', '葨', '葳', '薇', '蜲', '蝛', '覣', '詴', '逶', '隇', '隈', '霺', '鰃', '鰄', '鳂'],\n piān: ['偏', '囨', '媥', '楄', '犏', '篇', '翩', '鍂'],\n yàn: ['偐', '厌', '厭', '唁', '喭', '嚈', '嚥', '堰', '妟', '姲', '嬊', '嬿', '宴', '彥', '彦', '敥', '晏', '暥', '曕', '曣', '滟', '灎', '灔', '灧', '灩', '焔', '焰', '焱', '熖', '燄', '牪', '猒', '砚', '硯', '艳', '艶', '艷', '覎', '觃', '觾', '諺', '讌', '讞', '谚', '谳', '豓', '豔', '贋', '贗', '赝', '軅', '酀', '酽', '醼', '釅', '雁', '餍', '饜', '騐', '験', '騴', '驗', '驠', '验', '鬳', '鳫', '鴈', '鴳', '鷃', '鷰', '齞'],\n 'tǎng dàng': ['偒'],\n è: ['偔', '匎', '卾', '厄', '呝', '咢', '噩', '垩', '堊', '堮', '岋', '崿', '廅', '悪', '愕', '戹', '扼', '搤', '搹', '擜', '櫮', '歞', '歺', '湂', '琧', '砈', '砐', '硆', '腭', '苊', '萼', '蕚', '蚅', '蝁', '覨', '諤', '讍', '谔', '豟', '軛', '軶', '轭', '遌', '遏', '遻', '鄂', '鈪', '鍔', '鑩', '锷', '阨', '阸', '頞', '顎', '颚', '餓', '餩', '饿', '鰐', '鰪', '鱷', '鳄', '鶚', '鹗', '齃', '齶', '𫫇', '𥔲'],\n xié: ['偕', '勰', '协', '協', '嗋', '垥', '奊', '恊', '愶', '拹', '携', '撷', '擕', '擷', '攜', '斜', '旪', '熁', '燲', '綊', '緳', '縀', '缬', '翓', '胁', '脅', '脇', '脋', '膎', '蝢', '衺', '襭', '諧', '讗', '谐', '鞋', '鞵', '龤', '㙦'],\n chě: ['偖', '扯', '撦'],\n shěng: ['偗', '渻', '眚'],\n chā: ['偛', '嗏', '扠', '挿', '插', '揷', '疀', '臿', '艖', '銟', '鍤', '锸', '餷'],\n huáng: ['偟', '凰', '喤', '堭', '墴', '媓', '崲', '徨', '惶', '楻', '湟', '煌', '獚', '瑝', '璜', '癀', '皇', '磺', '穔', '篁', '簧', '艎', '葟', '蝗', '蟥', '諻', '趪', '遑', '鍠', '鐄', '锽', '隍', '韹', '餭', '騜', '鰉', '鱑', '鳇', '鷬', '黃', '黄', '𨱑'],\n yǎo: ['偠', '咬', '婹', '宎', '岆', '杳', '柼', '榚', '溔', '狕', '窅', '窈', '舀', '苭', '闄', '騕', '鷕', '齩'],\n 'chǒu qiào': ['偢'],\n yóu: ['偤', '尤', '庮', '怣', '沋', '油', '浟', '游', '犹', '猶', '猷', '由', '疣', '秞', '肬', '莜', '莸', '蕕', '蚰', '蝣', '訧', '輏', '輶', '逰', '遊', '邮', '郵', '鈾', '铀', '駀', '魷', '鮋', '鱿', '鲉', '𬨎'],\n xū: ['偦', '墟', '媭', '嬃', '楈', '欨', '歔', '燸', '疞', '盱', '綇', '縃', '繻', '胥', '蕦', '虗', '虚', '虛', '蝑', '裇', '訏', '許', '諝', '譃', '谞', '鑐', '需', '須', '须', '顼', '驉', '鬚', '魆', '魖', '𬣙', '𦈡'],\n zhā: ['偧', '哳', '抯', '挓', '揸', '摣', '樝', '渣', '皶', '觰', '譇', '齄', '齇'],\n cī: ['偨', '疵', '蠀', '趀', '骴', '髊', '齹'],\n bī: ['偪', '屄', '楅', '毴', '豍', '逼', '鰏', '鲾', '鵖'],\n xún: ['偱', '噚', '寻', '尋', '峋', '巡', '廵', '循', '恂', '揗', '攳', '旬', '杊', '栒', '桪', '樳', '洵', '浔', '潯', '燅', '燖', '珣', '璕', '畃', '紃', '荀', '蟳', '詢', '询', '鄩', '鱏', '鱘', '鲟', '𬘓', '𬩽', '𬍤', '𬊈'],\n 'cāi sī': ['偲'],\n duān: ['偳', '媏', '端', '褍', '鍴'],\n ǒu: ['偶', '吘', '嘔', '耦', '腢', '蕅', '藕', '𬉼', '𠙶'],\n tōu: ['偷', '偸', '鍮'],\n 'zán zá zǎ': ['偺'],\n 'lǚ lóu': ['偻', '僂'],\n fèn: ['偾', '僨', '奋', '奮', '弅', '忿', '愤', '憤', '瀵', '瞓', '秎', '粪', '糞', '膹', '鱝', '鲼'],\n 'kuǐ guī': ['傀'],\n sǒu: ['傁', '叜', '叟', '嗾', '櫢', '瞍', '薮', '藪'],\n 'zhì sī tí': ['傂'],\n sù: ['傃', '僳', '嗉', '塐', '塑', '夙', '嫊', '愫', '憟', '榡', '樎', '樕', '殐', '泝', '涑', '溯', '溸', '潚', '潥', '玊', '珟', '璛', '簌', '粛', '粟', '素', '縤', '肃', '肅', '膆', '蔌', '藗', '觫', '訴', '謖', '诉', '谡', '趚', '蹜', '速', '遡', '遬', '鋉', '餗', '驌', '骕', '鱐', '鷫', '鹔', '𫗧'],\n xiā: ['傄', '煆', '瞎', '虲', '谺', '颬', '鰕'],\n 'yuàn yuán': ['傆', '媛'],\n rǒng: ['傇', '冗', '宂', '氄', '軵'],\n nù: ['傉', '怒'],\n yùn: ['傊', '孕', '恽', '惲', '愠', '慍', '枟', '腪', '蕴', '薀', '藴', '蘊', '褞', '貟', '运', '運', '郓', '鄆', '酝', '醖', '醞', '韗', '韞', '韵', '韻', '餫'],\n 'gòu jiǎng': ['傋'],\n mà: ['傌', '嘜', '榪', '睰', '祃', '禡', '罵', '閁', '駡', '骂', '鬕'],\n bàng: ['傍', '塝', '棒', '玤', '稖', '艕', '蒡', '蜯', '謗', '谤', '鎊', '镑'],\n diān: ['傎', '厧', '嵮', '巅', '巓', '巔', '掂', '攧', '敁', '槇', '滇', '癫', '癲', '蹎', '顚', '顛', '颠', '齻'],\n táng: ['傏', '唐', '啺', '坣', '堂', '塘', '搪', '棠', '榶', '溏', '漟', '煻', '瑭', '磄', '禟', '篖', '糃', '糖', '糛', '膅', '膛', '蓎', '螗', '螳', '赯', '踼', '鄌', '醣', '鎕', '隚', '餹', '饄', '鶶', '䣘'],\n hào: ['傐', '哠', '恏', '昊', '昦', '晧', '暠', '暤', '暭', '曍', '浩', '淏', '澔', '灏', '灝', '皓', '皜', '皞', '皡', '皥', '耗', '聕', '薃', '號', '鄗', '顥', '颢', '鰝'],\n 'xī xì': ['傒'],\n shān: ['傓', '删', '刪', '剼', '圸', '山', '挻', '搧', '柵', '檆', '潸', '澘', '煽', '狦', '珊', '笘', '縿', '羴', '羶', '脠', '舢', '芟', '衫', '跚', '軕', '邖', '閊', '鯅'],\n 'qiàn jiān': ['傔'],\n 'què jué': ['傕', '埆'],\n 'cāng chen': ['傖'],\n róng: ['傛', '媶', '嫆', '嬫', '容', '峵', '嵘', '嶸', '戎', '搈', '曧', '栄', '榕', '榮', '榵', '毧', '溶', '瀜', '烿', '熔', '狨', '瑢', '穁', '絨', '绒', '羢', '肜', '茙', '茸', '荣', '蓉', '蝾', '融', '螎', '蠑', '褣', '鎔', '镕', '駥'],\n 'tà tàn': ['傝'],\n suō: ['傞', '唆', '嗍', '嗦', '娑', '摍', '桫', '梭', '睃', '簑', '簔', '羧', '莏', '蓑', '趖', '鮻'],\n dǎi: ['傣', '歹'],\n zài: ['傤', '儎', '再', '在', '扗', '洅', '載', '酨'],\n gǔ: ['傦', '古', '啒', '尳', '愲', '榖', '榾', '汩', '淈', '濲', '瀔', '牯', '皷', '皼', '盬', '瞽', '穀', '罟', '羖', '股', '脵', '臌', '薣', '蛊', '蠱', '詁', '诂', '轂', '逧', '鈷', '钴', '餶', '馉', '鼓', '鼔', '𦙶'],\n bīn: ['傧', '宾', '彬', '斌', '椕', '滨', '濒', '濱', '濵', '瀕', '繽', '缤', '虨', '豩', '豳', '賓', '賔', '邠', '鑌', '镔', '霦', '顮'],\n chǔ: ['储', '儲', '杵', '椘', '楚', '楮', '檚', '濋', '璴', '础', '礎', '禇', '處', '齭', '齼', '𬺓'],\n nuó: ['傩', '儺', '挪', '梛', '橠'],\n 'cān càn': ['傪'],\n lěi: ['傫', '儡', '厽', '垒', '塁', '壘', '壨', '櫐', '灅', '癗', '矋', '磊', '礨', '耒', '蕌', '蕾', '藟', '蘽', '蠝', '誄', '讄', '诔', '鑸', '鸓'],\n cuī: ['催', '凗', '墔', '崔', '嵟', '慛', '摧', '榱', '獕', '磪', '鏙'],\n yōng: ['傭', '嗈', '墉', '壅', '嫞', '庸', '廱', '慵', '拥', '擁', '滽', '灉', '牅', '痈', '癕', '癰', '臃', '邕', '郺', '鄘', '鏞', '镛', '雍', '雝', '饔', '鱅', '鳙', '鷛'],\n 'zāo cáo': ['傮'],\n sǒng: ['傱', '嵷', '怂', '悚', '愯', '慫', '竦', '耸', '聳', '駷', '㧐'],\n ào: ['傲', '坳', '垇', '墺', '奡', '嫯', '岙', '岰', '嶴', '懊', '擙', '澳', '鏊', '驁', '骜'],\n 'qī còu': ['傶'],\n chuǎng: ['傸', '磢', '闖', '闯'],\n shǎ: ['傻', '儍'],\n hàn: ['傼', '垾', '悍', '憾', '扞', '捍', '撖', '撼', '旱', '晘', '暵', '汉', '涆', '漢', '瀚', '焊', '猂', '皔', '睅', '翰', '莟', '菡', '蛿', '蜭', '螒', '譀', '輚', '釬', '銲', '鋎', '雗', '頷', '顄', '颔', '駻', '鶾'],\n zhāng: ['傽', '嫜', '张', '張', '彰', '慞', '暲', '樟', '漳', '獐', '璋', '章', '粻', '蔁', '蟑', '遧', '鄣', '鏱', '餦', '騿', '鱆', '麞'],\n 'yān yàn': ['傿', '墕', '嬮'],\n 'piào biāo': ['僄', '骠'],\n liàn: ['僆', '堜', '媡', '恋', '戀', '楝', '殓', '殮', '湅', '潋', '澰', '瀲', '炼', '煉', '瑓', '練', '纞', '练', '萰', '錬', '鍊', '鏈', '链', '鰊', '𬶠'],\n màn: ['㵘', '僈', '墁', '幔', '慢', '曼', '漫', '澷', '熳', '獌', '縵', '缦', '蔄', '蘰', '鄤', '鏝', '镘', '𬜬'],\n 'tàn tǎn': ['僋'],\n yíng: ['僌', '営', '塋', '嬴', '攍', '楹', '櫿', '溁', '溋', '滢', '潆', '濙', '濚', '濴', '瀅', '瀛', '瀠', '瀯', '灐', '灜', '熒', '營', '瑩', '盁', '盈', '禜', '籝', '籯', '縈', '茔', '荧', '莹', '萤', '营', '萦', '萾', '蓥', '藀', '蛍', '蝇', '蝿', '螢', '蠅', '謍', '贏', '赢', '迎', '鎣'],\n dòng: ['働', '冻', '凍', '动', '動', '姛', '戙', '挏', '栋', '棟', '湩', '硐', '胨', '胴', '腖', '迵', '霘', '駧'],\n zhuàn: ['僎', '啭', '囀', '堟', '撰', '灷', '瑑', '篆', '腞', '蒃', '襈', '譔', '饌', '馔'],\n xiàng: ['像', '勨', '向', '嚮', '姠', '嶑', '曏', '橡', '珦', '缿', '蟓', '衖', '襐', '象', '鐌', '項', '项', '鱌'],\n shàn: ['僐', '善', '墠', '墡', '嬗', '擅', '敾', '椫', '樿', '歚', '汕', '灗', '疝', '磰', '繕', '缮', '膳', '蟮', '蟺', '訕', '謆', '譱', '讪', '贍', '赡', '赸', '鄯', '鐥', '饍', '騸', '骟', '鱓', '鱔', '鳝', '𫮃'],\n 'tuí tuǐ': ['僓'],\n zǔn: ['僔', '噂', '撙', '譐'],\n pú: ['僕', '匍', '圤', '墣', '濮', '獛', '璞', '瞨', '穙', '莆', '菐', '菩', '葡', '蒱', '蒲', '贌', '酺', '鏷', '镤'],\n láo: ['僗', '劳', '労', '勞', '哰', '崂', '嶗', '憥', '朥', '浶', '牢', '痨', '癆', '窂', '簩', '醪', '鐒', '铹', '顟', '髝', '𫭼'],\n chǎng: ['僘', '厰', '廠', '敞', '昶', '氅', '鋹', '𬬮'],\n guāng: ['僙', '光', '咣', '垙', '姯', '洸', '灮', '炗', '炚', '炛', '烡', '珖', '胱', '茪', '輄', '銧', '黆', '𨐈'],\n liáo: ['僚', '嘹', '嫽', '寥', '寮', '尞', '屪', '嵺', '嶚', '嶛', '廫', '憀', '敹', '暸', '橑', '獠', '璙', '疗', '療', '竂', '簝', '繚', '缭', '聊', '膋', '膫', '藔', '蟟', '豂', '賿', '蹘', '辽', '遼', '飉', '髎', '鷯', '鹩'],\n dèng: ['僜', '凳', '墱', '嶝', '櫈', '瞪', '磴', '覴', '邓', '鄧', '隥'],\n 'chán zhàn zhuàn': ['僝'],\n bō: ['僠', '嶓', '拨', '撥', '播', '波', '溊', '玻', '癶', '盋', '砵', '碆', '礡', '缽', '菠', '袰', '蹳', '鉢', '钵', '餑', '饽', '驋', '鱍', '𬭛'],\n huì: ['僡', '匯', '卉', '喙', '嘒', '嚖', '圚', '嬒', '寭', '屶', '屷', '彗', '彙', '彚', '徻', '恚', '恵', '惠', '慧', '憓', '懳', '晦', '暳', '槥', '橞', '檅', '櫘', '汇', '泋', '滙', '潓', '烩', '燴', '獩', '璤', '瞺', '硊', '秽', '穢', '篲', '絵', '繪', '绘', '翙', '翽', '荟', '蔧', '蕙', '薈', '薉', '蟪', '詯', '誨', '諱', '譓', '譿', '讳', '诲', '賄', '贿', '鐬', '闠', '阓', '靧', '頮', '顪', '颒', '餯', '𬤝', '𬭬'],\n chuǎn: ['僢', '喘', '舛', '荈', '踳'],\n 'tiě jiàn': ['僣'],\n sēng: ['僧', '鬙'],\n xiàn: ['僩', '僴', '哯', '垷', '塪', '姭', '娊', '宪', '岘', '峴', '憲', '撊', '晛', '橌', '橺', '涀', '瀗', '献', '獻', '现', '現', '県', '睍', '粯', '糮', '絤', '綫', '線', '线', '缐', '羡', '羨', '腺', '臔', '臽', '苋', '莧', '誢', '豏', '鋧', '錎', '限', '陥', '陷', '霰', '餡', '馅', '麲', '鼸', '𬀪', '𪾢'],\n 'yù jú': ['僪'],\n 'è wū': ['僫'],\n 'tóng zhuàng': ['僮'],\n lǐn: ['僯', '凛', '凜', '廩', '廪', '懍', '懔', '撛', '檁', '檩', '澟', '癛', '癝'],\n gù: ['僱', '凅', '固', '堌', '崓', '崮', '故', '梏', '棝', '牿', '痼', '祻', '錮', '锢', '雇', '顧', '顾', '鯝', '鲴'],\n jiāng: ['僵', '壃', '姜', '橿', '殭', '江', '畕', '疅', '礓', '繮', '缰', '翞', '茳', '葁', '薑', '螀', '螿', '豇', '韁', '鱂', '鳉'],\n mǐn: ['僶', '冺', '刡', '勄', '悯', '惽', '愍', '慜', '憫', '抿', '敃', '敏', '敯', '泯', '潣', '皿', '笢', '笽', '簢', '蠠', '閔', '閩', '闵', '闽', '鰵', '鳘', '黽'],\n jìn: ['僸', '凚', '噤', '嚍', '墐', '壗', '妗', '嬧', '搢', '晉', '晋', '枃', '殣', '浕', '浸', '溍', '濅', '濜', '烬', '煡', '燼', '琎', '瑨', '璶', '盡', '祲', '縉', '缙', '荩', '藎', '覲', '觐', '賮', '贐', '赆', '近', '进', '進', '靳', '齽'],\n 'jià jie': ['價'],\n qiào: ['僺', '峭', '帩', '撬', '殻', '窍', '竅', '誚', '诮', '躈', '陗', '鞩', '韒', '髚'],\n pì: ['僻', '媲', '嫓', '屁', '澼', '甓', '疈', '譬', '闢', '鷿', '鸊', '䴙'],\n sài: ['僿', '簺', '賽', '赛'],\n 'chán tǎn shàn': ['儃'],\n 'dāng dàng': ['儅', '当', '闣'],\n xuān: ['儇', '喧', '塇', '媗', '宣', '愃', '愋', '揎', '昍', '暄', '煊', '煖', '瑄', '睻', '矎', '禤', '箮', '翧', '翾', '萱', '萲', '蓒', '蕿', '藼', '蘐', '蝖', '蠉', '諠', '諼', '譞', '谖', '軒', '轩', '鍹', '駽', '鰚', '𫓶', '𫍽'],\n 'dān dàn': ['儋', '擔', '瘅'],\n càn: ['儏', '澯', '灿', '燦', '璨', '粲', '薒', '謲'],\n 'bīn bìn': ['儐'],\n 'án àn': ['儑'],\n tái: ['儓', '坮', '嬯', '抬', '擡', '檯', '炱', '炲', '籉', '臺', '薹', '跆', '邰', '颱', '鮐', '鲐'],\n lán: ['儖', '兰', '囒', '婪', '岚', '嵐', '幱', '拦', '攔', '斓', '斕', '栏', '欄', '欗', '澜', '瀾', '灆', '灡', '燣', '燷', '璼', '篮', '籃', '籣', '繿', '葻', '蓝', '藍', '蘫', '蘭', '褴', '襕', '襤', '襴', '襽', '譋', '讕', '谰', '躝', '鑭', '镧', '闌', '阑', '韊', '𬒗'],\n 'nǐ yì ài yí': ['儗'],\n méng: ['儚', '幪', '曚', '朦', '橗', '檬', '氋', '溕', '濛', '甍', '甿', '盟', '礞', '艨', '莔', '萌', '蕄', '虻', '蝱', '鄳', '鄸', '霿', '靀', '顭', '饛', '鯍', '鸏', '鹲', '𫑡', '㠓'],\n níng: ['儜', '凝', '咛', '嚀', '嬣', '柠', '橣', '檸', '狞', '獰', '聍', '聹', '薴', '鑏', '鬡', '鸋'],\n qióng: ['儝', '卭', '宆', '惸', '憌', '桏', '橩', '焪', '焭', '煢', '熍', '琼', '瓊', '睘', '穷', '穹', '窮', '竆', '笻', '筇', '舼', '茕', '藑', '藭', '蛩', '蛬', '赹', '跫', '邛', '銎', '䓖'],\n liè: ['儠', '冽', '列', '劣', '劽', '埒', '埓', '姴', '峛', '巤', '挒', '捩', '栵', '洌', '浖', '烈', '烮', '煭', '犣', '猎', '猟', '獵', '聗', '脟', '茢', '蛚', '趔', '躐', '迾', '颲', '鬛', '鬣', '鮤', '鱲', '鴷', '䴕', '𫚭'],\n kuǎng: ['儣', '夼', '懭'],\n bào: ['儤', '勽', '報', '忁', '报', '抱', '曓', '爆', '犦', '菢', '虣', '蚫', '豹', '鉋', '鑤', '铇', '骲', '髱', '鮑', '鲍'],\n biāo: ['儦', '墂', '幖', '彪', '标', '標', '滮', '瀌', '熛', '爂', '猋', '瘭', '磦', '膘', '臕', '謤', '贆', '鏢', '鑣', '镖', '镳', '颮', '颷', '飆', '飇', '飈', '飊', '飑', '飙', '飚', '驫', '骉', '髟'],\n zǎn: ['儧', '儹', '噆', '攅', '昝', '趱', '趲'],\n háo: ['儫', '嗥', '嘷', '噑', '嚎', '壕', '椃', '毜', '毫', '濠', '獆', '獔', '竓', '籇', '蚝', '蠔', '譹', '豪'],\n qìng: ['儬', '凊', '庆', '慶', '櫦', '濪', '碃', '磬', '罄', '靘'],\n chèn: ['儭', '嚫', '榇', '櫬', '疢', '衬', '襯', '讖', '谶', '趁', '趂', '齓', '齔', '龀'],\n téng: ['儯', '幐', '滕', '漛', '疼', '籐', '籘', '縢', '腾', '藤', '虅', '螣', '誊', '謄', '邆', '駦', '騰', '驣', '鰧', '䲢'],\n 'lǒng lóng lòng': ['儱'],\n 'chán chàn': ['儳'],\n 'ráng xiāng': ['儴', '勷'],\n 'huì xié': ['儶'],\n luó: ['儸', '攞', '椤', '欏', '猡', '玀', '箩', '籮', '罗', '羅', '脶', '腡', '萝', '蘿', '螺', '覼', '逻', '邏', '鏍', '鑼', '锣', '镙', '饠', '騾', '驘', '骡', '鸁'],\n léi: ['儽', '嫘', '檑', '欙', '瓃', '畾', '縲', '纍', '纝', '缧', '罍', '羸', '蔂', '蘲', '虆', '轠', '鐳', '鑘', '镭', '雷', '靁', '鱩', '鼺'],\n 'nàng nāng': ['儾'],\n 'wù wū': ['兀'],\n yǔn: ['允', '喗', '夽', '抎', '殒', '殞', '狁', '磒', '荺', '賱', '鈗', '阭', '陨', '隕', '霣', '馻', '齫', '齳'],\n zān: ['兂', '橵', '簪', '簮', '糌', '鐕', '鐟', '鵤'],\n yuán: ['元', '円', '原', '厡', '厵', '园', '圆', '圎', '園', '圓', '垣', '塬', '媴', '嫄', '援', '榞', '榬', '橼', '櫞', '沅', '湲', '源', '溒', '爰', '猨', '猿', '笎', '緣', '縁', '缘', '羱', '茒', '薗', '蝝', '蝯', '螈', '袁', '褤', '謜', '轅', '辕', '邍', '邧', '酛', '鈨', '鎱', '騵', '魭', '鶢', '鶰', '黿', '鼋', '𫘪'],\n xiōng: ['兄', '兇', '凶', '匂', '匈', '哅', '忷', '恟', '汹', '洶', '胷', '胸', '芎', '訩', '詾', '讻'],\n chōng: ['充', '嘃', '忡', '憃', '憧', '摏', '沖', '浺', '珫', '罿', '翀', '舂', '艟', '茺', '衝', '蹖', '㳘'],\n zhào: ['兆', '垗', '旐', '曌', '枛', '櫂', '照', '燳', '狣', '瞾', '笊', '罀', '罩', '羄', '肁', '肇', '肈', '詔', '诏', '赵', '趙', '鮡', '𬶐'],\n 'duì ruì yuè': ['兊', '兌', '兑'],\n kè: ['克', '刻', '勀', '勊', '堁', '娔', '客', '恪', '愙', '氪', '溘', '碦', '緙', '缂', '艐', '衉', '課', '课', '錁', '锞', '騍', '骒'],\n tù: ['兎', '兔', '堍', '迌', '鵵'],\n dǎng: ['党', '攩', '欓', '譡', '讜', '谠', '黨', '𣗋'],\n dōu: ['兜', '兠', '唗', '橷', '篼', '蔸'],\n huǎng: ['兤', '奛', '幌', '怳', '恍', '晄', '炾', '熀', '縨', '詤', '謊', '谎'],\n rù: ['入', '嗕', '媷', '扖', '杁', '洳', '溽', '縟', '缛', '蓐', '褥', '鳰'],\n nèi: ['內', '氝', '氞', '錗'],\n 'yú shù': ['兪'],\n 'liù lù': ['六'],\n han: ['兯', '爳'],\n tiān: ['兲', '天', '婖', '添', '酟', '靔', '靝', '黇'],\n 'xīng xìng': ['兴'],\n diǎn: ['典', '嚸', '奌', '婰', '敟', '椣', '点', '碘', '蒧', '蕇', '踮', '點'],\n 'zī cí': ['兹'],\n jiān: ['兼', '冿', '囏', '坚', '堅', '奸', '姦', '姧', '尖', '幵', '惤', '戋', '戔', '搛', '椾', '樫', '櫼', '歼', '殱', '殲', '湔', '瀐', '瀸', '煎', '熞', '熸', '牋', '瑊', '睷', '礛', '礷', '笺', '箋', '緘', '縑', '缄', '缣', '肩', '艰', '艱', '菅', '菺', '葌', '蒹', '蔪', '蕑', '蕳', '虃', '譼', '豜', '鑯', '雃', '鞯', '韀', '韉', '餰', '馢', '鰔', '鰜', '鰹', '鲣', '鳒', '鵑', '鵳', '鶼', '鹣', '麉'],\n shòu: ['兽', '受', '售', '壽', '夀', '寿', '授', '狩', '獣', '獸', '痩', '瘦', '綬', '绶', '膄'],\n jì: ['兾', '冀', '剂', '剤', '劑', '勣', '坖', '垍', '塈', '妓', '季', '寂', '寄', '廭', '彑', '徛', '忌', '悸', '惎', '懻', '技', '旡', '既', '旣', '暨', '暩', '曁', '梞', '檕', '檵', '洎', '漃', '漈', '瀱', '痵', '癠', '禝', '稩', '稷', '穄', '穊', '穧', '紀', '継', '績', '繋', '繼', '继', '绩', '罽', '臮', '芰', '茍', '茤', '葪', '蓟', '蔇', '薊', '蘎', '蘮', '蘻', '裚', '襀', '覬', '觊', '計', '記', '誋', '计', '记', '跡', '跽', '蹟', '迹', '际', '際', '霁', '霽', '驥', '骥', '髻', '鬾', '魝', '魥', '鯚', '鯽', '鰶', '鰿', '鱀', '鱭', '鲚', '鲫', '鵋', '鷑', '齌', '𪟝', '𬶨', '𬶭'],\n jiōng: ['冂', '冋', '坰', '埛', '扃', '蘏', '蘔', '駉', '駫', '𬳶'],\n mào: ['冃', '冐', '媢', '帽', '愗', '懋', '暓', '柕', '楙', '毷', '瑁', '皃', '眊', '瞀', '耄', '茂', '萺', '蝐', '袤', '覒', '貌', '貿', '贸', '鄚', '鄮'],\n rǎn: ['冄', '冉', '姌', '媣', '染', '珃', '苒', '蒅', '䎃'],\n 'nèi nà': ['内'],\n gāng: ['冈', '冮', '刚', '剛', '堈', '堽', '岡', '掆', '摃', '棡', '牨', '犅', '疘', '綱', '纲', '缸', '罁', '罡', '肛', '釭', '鎠', '㭎'],\n cè: ['冊', '册', '厕', '厠', '夨', '廁', '恻', '惻', '憡', '敇', '测', '測', '笧', '策', '筞', '筴', '箣', '荝', '萗', '萴', '蓛'],\n guǎ: ['冎', '剐', '剮', '叧', '寡'],\n 'mào mò': ['冒'],\n gòu: ['冓', '啂', '坸', '垢', '够', '夠', '媾', '彀', '搆', '撀', '构', '構', '煹', '覯', '觏', '訽', '詬', '诟', '購', '购', '遘', '雊'],\n xǔ: ['冔', '喣', '暊', '栩', '珝', '盨', '糈', '詡', '諿', '诩', '鄦', '醑'],\n mì: ['冖', '冪', '嘧', '塓', '宻', '密', '峚', '幂', '幎', '幦', '怽', '榓', '樒', '櫁', '汨', '淧', '滵', '漞', '濗', '熐', '羃', '蔤', '蜜', '覓', '覔', '覛', '觅', '謐', '谧', '鼏'],\n 'yóu yín': ['冘'],\n xiě: ['写', '冩', '藛'],\n jūn: ['军', '君', '均', '桾', '汮', '皲', '皸', '皹', '碅', '莙', '蚐', '袀', '覠', '軍', '鈞', '銁', '銞', '鍕', '钧', '頵', '鮶', '鲪', '麏'],\n mí: ['冞', '擟', '瀰', '爢', '猕', '獼', '祢', '禰', '縻', '蒾', '藌', '蘪', '蘼', '袮', '詸', '謎', '迷', '醚', '醾', '醿', '釄', '镾', '鸍', '麊', '麋', '麛'],\n 'guān guàn': ['冠', '覌', '観', '觀', '观'],\n měng: ['冡', '勐', '懵', '掹', '猛', '獴', '艋', '蜢', '蠓', '錳', '锰', '鯭', '鼆'],\n zhǒng: ['冢', '塚', '尰', '歱', '煄', '瘇', '肿', '腫', '踵'],\n zuì: ['冣', '嶵', '晬', '最', '栬', '槜', '檇', '檌', '祽', '絊', '罪', '蕞', '辠', '酔', '酻', '醉', '錊'],\n yuān: ['冤', '剈', '囦', '嬽', '寃', '棩', '淵', '渁', '渆', '渊', '渕', '灁', '眢', '肙', '葾', '蒬', '蜎', '蜵', '駌', '鳶', '鴛', '鵷', '鸢', '鸳', '鹓', '鼘', '鼝'],\n míng: ['冥', '名', '明', '暝', '朙', '榠', '洺', '溟', '猽', '眀', '眳', '瞑', '茗', '螟', '覭', '詺', '鄍', '銘', '铭', '鳴', '鸣'],\n kòu: ['冦', '叩', '宼', '寇', '扣', '敂', '滱', '窛', '筘', '簆', '蔲', '蔻', '釦', '鷇'],\n tài: ['冭', '太', '夳', '忲', '态', '態', '汰', '汱', '泰', '溙', '肽', '舦', '酞', '鈦', '钛'],\n 'féng píng': ['冯', '馮'],\n 'chōng chòng': ['冲'],\n kuàng: ['况', '圹', '壙', '岲', '懬', '旷', '昿', '曠', '框', '況', '爌', '眖', '眶', '矿', '砿', '礦', '穬', '絋', '絖', '纊', '纩', '貺', '贶', '軦', '邝', '鄺', '鉱', '鋛', '鑛', '黋'],\n lěng: ['冷'],\n pàn: ['冸', '判', '叛', '沜', '泮', '溿', '炍', '牉', '畔', '盼', '聁', '袢', '襻', '詊', '鋬', '鑻', '頖', '鵥'],\n fā: ['冹', '彂', '沷', '発', '發'],\n xiǎn: ['冼', '尟', '尠', '崄', '嶮', '幰', '攇', '显', '櫶', '毨', '灦', '烍', '燹', '狝', '猃', '獫', '獮', '玁', '禒', '筅', '箲', '藓', '蘚', '蚬', '蜆', '譣', '赻', '跣', '鍌', '险', '険', '險', '韅', '顕', '顯', '㬎'],\n qià: ['冾', '圶', '帢', '恰', '殎', '洽', '硈', '胢', '髂'],\n 'jìng chēng': ['净', '凈', '淨'],\n sōu: ['凁', '嗖', '廀', '廋', '捜', '搜', '摉', '溲', '獀', '艘', '蒐', '螋', '鄋', '醙', '鎪', '锼', '颼', '飕', '餿', '馊', '騪'],\n měi: ['凂', '媄', '媺', '嬍', '嵄', '挴', '毎', '每', '浼', '渼', '燘', '美', '躾', '鎂', '镁', '黣'],\n tú: ['凃', '図', '图', '圖', '圗', '塗', '屠', '峹', '嵞', '庩', '廜', '徒', '悇', '揬', '涂', '瘏', '筡', '腯', '荼', '蒤', '跿', '途', '酴', '鈯', '鍎', '馟', '駼', '鵌', '鶟', '鷋', '鷵', '𬳿'],\n zhǔn: ['准', '凖', '埻', '準', '𬘯'],\n 'liáng liàng': ['凉', '涼', '量'],\n diāo: ['凋', '刁', '刟', '叼', '奝', '弴', '彫', '汈', '琱', '碉', '簓', '虭', '蛁', '貂', '錭', '雕', '鮉', '鯛', '鲷', '鵰', '鼦'],\n còu: ['凑', '湊', '腠', '輳', '辏'],\n ái: ['凒', '啀', '嘊', '捱', '溰', '癌', '皑', '皚'],\n duó: ['凙', '剫', '夺', '奪', '痥', '踱', '鈬', '鐸', '铎'],\n dú: ['凟', '匵', '嬻', '椟', '櫝', '殰', '涜', '牍', '牘', '犊', '犢', '独', '獨', '瓄', '皾', '裻', '読', '讀', '讟', '豄', '贕', '錖', '鑟', '韇', '韣', '韥', '騳', '髑', '黩', '黷'],\n 'jǐ jī': ['几'],\n fán: ['凡', '凢', '凣', '匥', '墦', '杋', '柉', '棥', '樊', '瀿', '烦', '煩', '燔', '璠', '矾', '礬', '笲', '籵', '緐', '羳', '舤', '舧', '薠', '蘩', '蠜', '襎', '蹯', '釩', '鐇', '鐢', '钒', '鷭', '𫔍', '𬸪'],\n jū: ['凥', '匊', '娵', '婮', '居', '崌', '抅', '挶', '掬', '梮', '椐', '檋', '毩', '毱', '泃', '涺', '狙', '琚', '疽', '砠', '罝', '腒', '艍', '蜛', '裾', '諊', '跔', '踘', '躹', '陱', '雎', '鞠', '鞫', '駒', '驹', '鮈', '鴡', '鶋', '𬶋'],\n 'chù chǔ': ['処', '处'],\n zhǐ: ['凪', '劧', '咫', '址', '坧', '帋', '恉', '扺', '指', '旨', '枳', '止', '汦', '沚', '洔', '淽', '疻', '砋', '祉', '秖', '紙', '纸', '芷', '藢', '衹', '襧', '訨', '趾', '軹', '轵', '酯', '阯', '黹'],\n píng: ['凭', '凴', '呯', '坪', '塀', '岼', '帡', '帲', '幈', '平', '慿', '憑', '枰', '洴', '焩', '玶', '瓶', '甁', '竮', '箳', '簈', '缾', '荓', '萍', '蓱', '蚲', '蛢', '評', '评', '軿', '輧', '郱', '鮃', '鲆'],\n kǎi: ['凯', '凱', '剀', '剴', '垲', '塏', '恺', '愷', '慨', '暟', '蒈', '輆', '鍇', '鎧', '铠', '锴', '闓', '闿', '颽'],\n gān: ['凲', '坩', '尲', '尴', '尶', '尷', '柑', '泔', '漧', '玕', '甘', '疳', '矸', '竿', '筸', '粓', '肝', '苷', '迀', '酐', '魐'],\n 'kǎn qiǎn': ['凵'],\n tū: ['凸', '堗', '嶀', '捸', '涋', '湥', '痜', '禿', '秃', '突', '葖', '鋵', '鵚', '鼵', '㻬'],\n 'āo wā': ['凹'],\n chū: ['出', '初', '岀', '摴', '榋', '樗', '貙', '齣', '䢺', '䝙'],\n dàng: ['凼', '圵', '垱', '壋', '档', '檔', '氹', '璗', '瓽', '盪', '瞊', '砀', '碭', '礑', '簜', '荡', '菪', '蕩', '蘯', '趤', '逿', '雼', '𬍡'],\n hán: ['函', '凾', '含', '圅', '娢', '寒', '崡', '晗', '梒', '浛', '涵', '澏', '焓', '琀', '甝', '筨', '蜬', '邗', '邯', '鋡', '韓', '韩'],\n záo: ['凿', '鑿'],\n dāo: ['刀', '刂', '忉', '氘', '舠', '螩', '釖', '魛', '鱽'],\n chuāng: ['刅', '摐', '牎', '牕', '疮', '瘡', '窓', '窗', '窻'],\n 'fēn fèn': ['分'],\n 'qiè qiē': ['切'],\n kān: ['刊', '勘', '堪', '戡', '栞', '龕', '龛'],\n cǔn: ['刌', '忖'],\n chú: ['刍', '厨', '幮', '廚', '橱', '櫉', '櫥', '滁', '犓', '篨', '耡', '芻', '蒢', '蒭', '蜍', '蟵', '豠', '趎', '蹰', '躇', '躕', '鉏', '鋤', '锄', '除', '雏', '雛', '鶵'],\n 'huà huá': ['划'],\n lí: ['刕', '剓', '剺', '劙', '厘', '喱', '嚟', '囄', '嫠', '孷', '廲', '悡', '梨', '梸', '棃', '漓', '灕', '犁', '犂', '狸', '琍', '璃', '瓈', '盠', '睝', '离', '穲', '竰', '筣', '篱', '籬', '糎', '縭', '缡', '罹', '艃', '荲', '菞', '蓠', '蔾', '藜', '蘺', '蜊', '蟍', '蟸', '蠫', '褵', '謧', '貍', '醨', '鋫', '錅', '鏫', '鑗', '離', '驪', '骊', '鯏', '鯬', '鱺', '鲡', '鵹', '鸝', '鹂', '黎', '黧', '㰀'],\n yuè: ['刖', '嬳', '岄', '岳', '嶽', '恱', '悅', '悦', '戉', '抈', '捳', '月', '樾', '瀹', '爚', '玥', '礿', '禴', '篗', '籆', '籥', '籰', '粤', '粵', '蘥', '蚎', '蚏', '説', '越', '跀', '跃', '躍', '軏', '鈅', '鉞', '鑰', '钺', '閱', '閲', '阅', '鸑', '鸙', '黦', '龠', '𫐄', '𬸚'],\n liú: ['刘', '劉', '嚠', '媹', '嵧', '旈', '旒', '榴', '橊', '流', '浏', '瀏', '琉', '瑠', '瑬', '璢', '畄', '留', '畱', '疁', '瘤', '癅', '硫', '蒥', '蓅', '蟉', '裗', '鎏', '鏐', '鐂', '镠', '飀', '飅', '飗', '駠', '駵', '騮', '驑', '骝', '鰡', '鶹', '鹠', '麍'],\n zé: ['则', '則', '啧', '嘖', '嫧', '帻', '幘', '択', '樍', '歵', '沢', '泎', '溭', '皟', '瞔', '矠', '礋', '箦', '簀', '舴', '蔶', '蠌', '襗', '謮', '賾', '赜', '迮', '鸅', '齚', '齰'],\n 'chuàng chuāng': ['创', '創'],\n qù: ['刞', '厺', '去', '閴', '闃', '阒', '麮', '鼁'],\n 'bié biè': ['別', '别'],\n 'páo bào': ['刨'],\n 'chǎn chàn': ['刬', '剗', '幝'],\n guā: ['刮', '劀', '桰', '歄', '煱', '瓜', '胍', '踻', '颪', '颳', '騧', '鴰', '鸹'],\n gēng: ['刯', '庚', '椩', '浭', '焿', '畊', '絚', '羮', '羹', '耕', '菮', '賡', '赓', '鶊', '鹒'],\n dào: ['到', '噵', '悼', '椡', '檤', '燾', '瓙', '盗', '盜', '稲', '稻', '纛', '翿', '艔', '菿', '衜', '衟', '軇', '道'],\n chuàng: ['刱', '剏', '剙', '怆', '愴'],\n kū: ['刳', '哭', '圐', '堀', '枯', '桍', '矻', '窟', '跍', '郀', '骷', '鮬'],\n duò: ['刴', '剁', '墯', '尮', '惰', '憜', '挅', '桗', '舵', '跥', '跺', '陊', '陏', '飿', '饳', '鵽'],\n 'shuā shuà': ['刷'],\n 'quàn xuàn': ['券'],\n 'chà shā': ['刹', '剎'],\n 'cì cī': ['刺'],\n guì: ['刽', '刿', '劊', '劌', '撌', '攰', '昋', '桂', '椢', '槶', '樻', '櫃', '猤', '禬', '筀', '蓕', '襘', '貴', '贵', '跪', '鐀', '鑎', '鞼', '鱖', '鱥'],\n lóu: ['剅', '娄', '婁', '廔', '楼', '樓', '溇', '漊', '熡', '耧', '耬', '艛', '蒌', '蔞', '蝼', '螻', '謱', '軁', '遱', '鞻', '髅', '髏', '𪣻'],\n cuò: ['剉', '剒', '厝', '夎', '挫', '措', '棤', '莝', '莡', '蓌', '逪', '銼', '錯', '锉', '错'],\n 'xiāo xuē': ['削'],\n 'kēi kè': ['剋', '尅'],\n 'là lá': ['剌'],\n tī: ['剔', '梯', '踢', '銻', '锑', '鷈', '鷉', '䏲', '䴘'],\n pōu: ['剖'],\n wān: ['剜', '塆', '壪', '帵', '弯', '彎', '湾', '潫', '灣', '睕', '蜿', '豌'],\n 'bāo bō': ['剝', '剥'],\n duō: ['剟', '咄', '哆', '嚉', '多', '夛', '掇', '毲', '畓', '裰', '㙍'],\n qíng: ['剠', '勍', '夝', '情', '擎', '晴', '暒', '棾', '樈', '檠', '氰', '甠', '硘', '葝', '黥'],\n 'yǎn shàn': ['剡'],\n 'dū zhuó': ['剢'],\n yān: ['剦', '嫣', '崦', '嶖', '恹', '懕', '懨', '樮', '淊', '淹', '漹', '烟', '焉', '焑', '煙', '珚', '篶', '胭', '臙', '菸', '鄢', '醃', '閹', '阉', '黫'],\n huō: ['剨', '劐', '吙', '攉', '秴', '耠', '锪', '騞', '𬴃'],\n shèng: ['剩', '剰', '勝', '圣', '墭', '嵊', '晠', '榺', '橳', '琞', '聖', '蕂', '貹', '賸'],\n 'duān zhì': ['剬'],\n wū: ['剭', '呜', '嗚', '圬', '屋', '巫', '弙', '杇', '歍', '汙', '汚', '污', '洿', '烏', '窏', '箼', '螐', '誈', '誣', '诬', '邬', '鄔', '鎢', '钨', '鰞', '鴮'],\n gē: ['割', '哥', '圪', '彁', '戈', '戓', '戨', '歌', '滒', '犵', '肐', '袼', '謌', '鎶', '鴚', '鴿', '鸽'],\n 'dá zhá': ['剳'],\n chuán: ['剶', '暷', '椽', '篅', '舡', '舩', '船', '輲', '遄'],\n 'tuán zhuān': ['剸', '漙', '篿'],\n 'lù jiū': ['剹'],\n pēng: ['剻', '匉', '嘭', '怦', '恲', '抨', '梈', '烹', '砰', '軯', '駍'],\n piāo: ['剽', '勡', '慓', '旚', '犥', '翲', '螵', '飃', '飄', '飘', '魒'],\n kōu: ['剾', '彄', '抠', '摳', '眍', '瞘', '芤', '𫸩'],\n 'jiǎo chāo': ['剿', '劋', '勦', '摷'],\n qiāo: ['劁', '勪', '墝', '幧', '敲', '橇', '毃', '燆', '硗', '磽', '繑', '趬', '跷', '踍', '蹺', '蹻', '郻', '鄡', '鄥', '鍫', '鍬', '鐰', '锹', '頝'],\n 'huá huà': ['劃'],\n 'zhā zhá': ['劄'],\n 'pī pǐ': ['劈', '悂'],\n tāng: ['劏', '嘡', '羰', '薚', '蝪', '蹚', '鞺', '鼞'],\n chán: ['劖', '嚵', '壥', '婵', '嬋', '巉', '廛', '棎', '毚', '湹', '潹', '潺', '澶', '瀍', '瀺', '煘', '獑', '磛', '緾', '纏', '纒', '缠', '艬', '蝉', '蟐', '蟬', '蟾', '誗', '讒', '谗', '躔', '鄽', '酁', '鋋', '鑱', '镵', '饞', '馋'],\n zuān: ['劗', '躜', '躦', '鉆', '鑚'],\n mó: ['劘', '嫫', '嬤', '嬷', '尛', '摹', '擵', '橅', '糢', '膜', '藦', '蘑', '謨', '謩', '谟', '饃', '饝', '馍', '髍', '魔', '魹'],\n zhú: ['劚', '斸', '曯', '欘', '灟', '炢', '烛', '燭', '爥', '瘃', '竹', '笁', '笜', '舳', '茿', '蓫', '蠋', '蠾', '躅', '逐', '逫', '钃', '鱁'],\n quàn: ['劝', '勧', '勸', '牶', '韏'],\n 'jìn jìng': ['劤', '劲', '勁'],\n kēng: ['劥', '坑', '牼', '硁', '硜', '誙', '銵', '鍞', '鏗', '铿', '阬'],\n 'xié liè': ['劦'],\n 'zhù chú': ['助'],\n nǔ: ['努', '弩', '砮', '胬'],\n shào: ['劭', '卲', '哨', '潲', '紹', '綤', '绍', '袑', '邵'],\n miǎo: ['劰', '杪', '淼', '渺', '眇', '秒', '篎', '緲', '缈', '藐', '邈'],\n kǒu: ['劶', '口'],\n wā: ['劸', '娲', '媧', '屲', '挖', '攨', '洼', '溛', '漥', '瓾', '畖', '穵', '窊', '窪', '蛙', '韈', '鼃'],\n kuāng: ['劻', '匡', '匩', '哐', '恇', '洭', '筐', '筺', '誆', '诓', '軭', '邼'],\n hé: ['劾', '咊', '啝', '姀', '峆', '敆', '曷', '柇', '楁', '毼', '河', '涸', '渮', '澕', '熆', '皬', '盇', '盉', '盍', '盒', '禾', '篕', '籺', '粭', '翮', '菏', '萂', '覈', '訸', '詥', '郃', '釛', '鉌', '鑉', '閡', '闔', '阂', '阖', '鞨', '頜', '餄', '饸', '魺', '鹖', '麧', '齕', '龁', '龢', '𬌗'],\n gào: ['勂', '吿', '告', '峼', '祮', '祰', '禞', '筶', '誥', '诰', '郜', '鋯', '锆'],\n 'bó bèi': ['勃'],\n láng: ['勆', '嫏', '廊', '斏', '桹', '榔', '樃', '欴', '狼', '琅', '瑯', '硠', '稂', '艆', '蓈', '蜋', '螂', '躴', '郒', '郞', '鋃', '鎯', '锒'],\n xūn: ['勋', '勛', '勲', '勳', '嚑', '坃', '埙', '塤', '壎', '壦', '曛', '燻', '獯', '矄', '纁', '臐', '薫', '薰', '蘍', '醺', '𫄸'],\n 'juàn juān': ['勌', '瓹'],\n 'lè lēi': ['勒'],\n kài: ['勓', '炌', '烗', '鎎'],\n 'wěng yǎng': ['勜'],\n qín: ['勤', '嗪', '噙', '嶜', '庈', '懃', '懄', '捦', '擒', '斳', '檎', '澿', '珡', '琴', '琹', '瘽', '禽', '秦', '耹', '芩', '芹', '菦', '螓', '蠄', '鈙', '鈫', '雂', '靲', '鳹', '鵭'],\n jiàng: ['勥', '匞', '匠', '嵹', '弜', '弶', '摾', '櫤', '洚', '滰', '犟', '糡', '糨', '絳', '绛', '謽', '酱', '醤', '醬'],\n fān: ['勫', '嬏', '帆', '幡', '忛', '憣', '旙', '旛', '繙', '翻', '藩', '轓', '颿', '飜', '鱕'],\n juān: ['勬', '姢', '娟', '捐', '涓', '蠲', '裐', '鎸', '鐫', '镌', '鹃'],\n 'tóng dòng': ['勭', '烔', '燑', '狪'],\n lǜ: ['勴', '垏', '嵂', '律', '慮', '氯', '滤', '濾', '爈', '箻', '綠', '繂', '膟', '葎', '虑', '鑢'],\n chè: ['勶', '坼', '彻', '徹', '掣', '撤', '澈', '烢', '爡', '瞮', '硩', '聅', '迠', '頙', '㬚'],\n sháo: ['勺', '玿', '韶'],\n 'gōu gòu': ['勾'],\n cōng: ['匆', '囪', '囱', '忩', '怱', '悤', '暰', '樬', '漗', '瑽', '璁', '瞛', '篵', '繱', '聡', '聦', '聪', '聰', '苁', '茐', '葱', '蓯', '蔥', '蟌', '鍯', '鏓', '鏦', '騘', '驄', '骢'],\n 'táo yáo': ['匋', '陶'],\n páo: ['匏', '咆', '垉', '庖', '爮', '狍', '袍', '褜', '軳', '鞄', '麅'],\n dá: ['匒', '妲', '怛', '炟', '燵', '畣', '笪', '羍', '荙', '薘', '蟽', '詚', '达', '迏', '迖', '迚', '逹', '達', '鐽', '靼', '鞑', '韃', '龖', '龘', '𫟼'],\n 'huà huā': ['化'],\n 'běi bèi': ['北'],\n nǎo: ['匘', '垴', '堖', '嫐', '恼', '悩', '惱', '瑙', '碯', '脑', '脳', '腦'],\n 'chí shi': ['匙'],\n fāng: ['匚', '堏', '方', '淓', '牥', '芳', '邡', '鈁', '錺', '钫', '鴋'],\n zā: ['匝', '咂', '帀', '沞', '臜', '臢', '迊', '鉔', '魳'],\n qiè: ['匧', '厒', '妾', '怯', '悏', '惬', '愜', '挈', '穕', '窃', '竊', '笡', '箧', '篋', '籡', '踥', '鍥', '锲', '鯜'],\n 'zāng cáng': ['匨'],\n fěi: ['匪', '奜', '悱', '棐', '榧', '篚', '翡', '蕜', '誹', '诽'],\n 'kuì guì': ['匮', '匱'],\n suǎn: ['匴'],\n pǐ: ['匹', '噽', '嚭', '圮', '庀', '痞', '癖', '脴', '苉', '銢', '鴄'],\n 'qū ōu': ['区', '區'],\n 'kē qià': ['匼'],\n 'yǎn yàn': ['匽', '棪'],\n biǎn: ['匾', '惼', '揙', '碥', '稨', '窆', '藊', '褊', '貶', '贬', '鴘'],\n nì: ['匿', '堄', '嫟', '嬺', '惄', '愵', '昵', '暱', '氼', '眤', '睨', '縌', '胒', '腻', '膩', '逆', '𨺙'],\n niàn: ['卄', '唸', '埝', '廿', '念', '惗', '艌'],\n sà: ['卅', '櫒', '脎', '萨', '蕯', '薩', '鈒', '隡', '颯', '飒', '馺'],\n zú: ['卆', '哫', '崪', '族', '箤', '足', '踤', '镞'],\n shēng: ['升', '呏', '声', '斘', '昇', '曻', '枡', '殅', '泩', '湦', '焺', '牲', '珄', '生', '甥', '竔', '笙', '聲', '鉎', '鍟', '阩', '陞', '陹', '鵿', '鼪'],\n wàn: ['卍', '卐', '忨', '杤', '瞣', '脕', '腕', '萬', '蟃', '贎', '輐', '錽', '𬇕'],\n 'huá huà huā': ['华', '華'],\n bēi: ['卑', '悲', '揹', '杯', '桮', '盃', '碑', '藣', '鵯', '鹎'],\n 'zú cù': ['卒'],\n 'dān shàn chán': ['单', '單'],\n 'nán nā': ['南'],\n 'shuài lǜ': ['卛'],\n 'bǔ bo pú': ['卜'],\n 'kuàng guàn': ['卝'],\n biàn: ['卞', '变', '変', '峅', '弁', '徧', '忭', '抃', '昪', '汳', '汴', '玣', '艑', '苄', '覍', '諚', '變', '辡', '辧', '辨', '辩', '辫', '辮', '辯', '遍', '釆', '𨚕'],\n bǔ: ['卟', '哺', '捕', '补', '補', '鸔', '𬷕'],\n 'zhàn zhān': ['占', '覱'],\n 'kǎ qiǎ': ['卡'],\n lú: ['卢', '嚧', '垆', '壚', '庐', '廬', '曥', '枦', '栌', '櫨', '泸', '瀘', '炉', '爐', '獹', '玈', '瓐', '盧', '矑', '籚', '纑', '罏', '胪', '臚', '舮', '舻', '艫', '芦', '蘆', '蠦', '轤', '轳', '鈩', '鑪', '顱', '颅', '馿', '髗', '魲', '鱸', '鲈', '鸕', '鸬', '黸', '𬬻'],\n lǔ: ['卤', '塷', '掳', '擄', '樐', '橹', '櫓', '氌', '滷', '澛', '瀂', '硵', '磠', '穞', '艣', '艪', '蓾', '虏', '虜', '鏀', '鐪', '鑥', '镥', '魯', '鲁', '鹵'],\n guà: ['卦', '啩', '挂', '掛', '罣', '褂', '詿', '诖'],\n 'áng yǎng': ['卬'],\n yìn: ['印', '垽', '堷', '廕', '慭', '憖', '憗', '懚', '洕', '湚', '猌', '癊', '胤', '茚', '酳', '鮣', '䲟'],\n què: ['却', '卻', '塙', '崅', '悫', '愨', '慤', '搉', '榷', '燩', '琷', '皵', '确', '確', '礭', '闋', '阕', '鵲', '鹊', '𬒈'],\n luǎn: ['卵'],\n 'juàn juǎn': ['卷', '巻'],\n 'chǎng ān hàn': ['厂'],\n 'wěi yán': ['厃'],\n tīng: ['厅', '厛', '听', '庁', '廰', '廳', '汀', '烃', '烴', '綎', '耓', '聴', '聼', '聽', '鞓', '𬘩'],\n 'zhé zhái': ['厇'],\n 'hàn àn': ['厈', '屽'],\n yǎ: ['厊', '唖', '庌', '痖', '瘂', '蕥'],\n shè: ['厍', '厙', '弽', '慑', '慴', '懾', '摂', '欇', '涉', '涻', '渉', '滠', '灄', '社', '舎', '蔎', '蠂', '設', '设', '赦', '騇', '麝'],\n dǐ: ['厎', '呧', '坘', '弤', '抵', '拞', '掋', '牴', '砥', '菧', '觝', '詆', '诋', '軧', '邸', '阺', '骶', '鯳'],\n 'zhǎ zhǎi': ['厏'],\n páng: ['厐', '嫎', '庞', '徬', '舽', '螃', '逄', '鰟', '鳑', '龎', '龐'],\n 'zhì shī': ['厔'],\n máng: ['厖', '吂', '哤', '娏', '忙', '恾', '杗', '杧', '汒', '浝', '牻', '痝', '盲', '硭', '笀', '芒', '茫', '蘉', '邙', '釯', '鋩', '铓', '駹'],\n zuī: ['厜', '樶', '纗', '蟕'],\n 'shà xià': ['厦', '廈'],\n áo: ['厫', '嗷', '嗸', '廒', '敖', '滶', '獒', '獓', '璈', '翱', '翶', '翺', '聱', '蔜', '螯', '謷', '謸', '遨', '鏖', '隞', '鰲', '鳌', '鷔', '鼇'],\n 'lán qiān': ['厱'],\n 'sī mǒu': ['厶'],\n 'gōng hóng': ['厷'],\n 'lín miǎo': ['厸'],\n 'qiú róu': ['厹'],\n dū: ['厾', '嘟', '督', '醏'],\n 'xiàn xuán': ['县', '縣'],\n 'cān shēn cēn sān': ['参', '參', '叄', '叅'],\n 'ài yǐ': ['叆'],\n 'chā chà chǎ chá': ['叉'],\n shuāng: ['双', '孀', '孇', '欆', '礵', '艭', '雙', '霜', '騻', '驦', '骦', '鷞', '鸘', '鹴'],\n shōu: ['収', '收'],\n guái: ['叏'],\n bá: ['叐', '妭', '抜', '拔', '炦', '癹', '胈', '茇', '菝', '詙', '跋', '軷', '魃', '鼥'],\n 'fā fà': ['发'],\n 'zhuó yǐ lì jué': ['叕'],\n qǔ: ['取', '娶', '竬', '蝺', '詓', '齲', '龋'],\n 'jiǎ xiá': ['叚', '徦'],\n 'wèi yù': ['叞', '尉', '蔚'],\n dié: ['叠', '垤', '堞', '峌', '幉', '恎', '惵', '戜', '曡', '殜', '氎', '牃', '牒', '瓞', '畳', '疂', '疉', '疊', '碟', '絰', '绖', '耊', '耋', '胅', '艓', '苵', '蜨', '蝶', '褋', '詄', '諜', '谍', '跮', '蹀', '迭', '镻', '鰈', '鲽', '鴩', '𫶇'],\n ruì: ['叡', '枘', '汭', '瑞', '睿', '芮', '蚋', '蜹', '銳', '鋭', '锐'],\n 'jù gōu': ['句'],\n lìng: ['另', '呤', '炩', '蘦'],\n 'dāo dáo tāo': ['叨'],\n 'zhī zhǐ': ['只'],\n jiào: ['叫', '呌', '嘂', '嘦', '噍', '嬓', '斍', '斠', '滘', '漖', '獥', '珓', '皭', '窖', '藠', '訆', '譥', '趭', '較', '轎', '轿', '较', '酵', '醮', '釂'],\n 'zhào shào': ['召'],\n 'kě kè': ['可'],\n 'tái tāi': ['台', '苔'],\n pǒ: ['叵', '尀', '笸', '箥', '鉕', '钷', '駊'],\n 'yè xié': ['叶'],\n 'hào háo': ['号'],\n tàn: ['叹', '嘆', '探', '歎', '湠', '炭', '碳', '舕'],\n 'hōng hóng': ['叿'],\n miē: ['吀', '咩', '哶', '孭'],\n 'xū yū yù': ['吁'],\n chī: ['吃', '哧', '喫', '嗤', '噄', '妛', '媸', '彨', '彲', '摛', '攡', '殦', '瓻', '痴', '癡', '眵', '瞝', '笞', '粚', '胵', '蚩', '螭', '訵', '魑', '鴟', '鵄', '鸱', '黐', '齝', '𫄨'],\n 'xuān sòng': ['吅'],\n yāo: ['吆', '喓', '夭', '妖', '幺', '楆', '殀', '祅', '腰', '葽', '訞', '邀', '鴁', '鴢', '㙘'],\n zǐ: ['吇', '姉', '姊', '子', '杍', '梓', '榟', '橴', '滓', '矷', '秭', '笫', '籽', '紫', '耔', '虸', '訿', '釨'],\n 'hé gě': ['合', '鲄'],\n 'cùn dòu': ['吋'],\n 'tóng tòng': ['同'],\n 'tǔ tù': ['吐', '唋'],\n 'zhà zhā': ['吒', '奓'],\n 'xià hè': ['吓'],\n 'ā yā': ['吖'],\n 'ma má mǎ': ['吗'],\n lìn: ['吝', '恡', '悋', '橉', '焛', '甐', '膦', '蔺', '藺', '賃', '赁', '蹸', '躏', '躙', '躪', '轥', '閵'],\n tūn: ['吞', '暾', '朜', '焞'],\n 'bǐ pǐ': ['吡'],\n qìn: ['吢', '吣', '唚', '抋', '揿', '搇', '撳', '沁', '瀙', '菣', '藽'],\n 'jiè gè': ['吤'],\n 'fǒu pǐ': ['否'],\n 'ba bā': ['吧'],\n dūn: ['吨', '噸', '墩', '墪', '惇', '撉', '撴', '犜', '獤', '礅', '蜳', '蹾', '驐'],\n fēn: ['吩', '帉', '昐', '朆', '梤', '棻', '氛', '竕', '紛', '纷', '翂', '芬', '衯', '訜', '躮', '酚', '鈖', '雰', '餴', '饙', '馚'],\n 'é huā': ['吪'],\n 'kēng háng': ['吭', '妔'],\n shǔn: ['吮'],\n 'zhī zī': ['吱'],\n 'yǐn shěn': ['吲'],\n wú: ['吳', '吴', '呉', '墲', '峿', '梧', '橆', '毋', '洖', '浯', '無', '珸', '璑', '祦', '芜', '茣', '莁', '蕪', '蜈', '蟱', '譕', '郚', '鋙', '铻', '鯃', '鵐', '鷡', '鹀', '鼯'],\n 'chǎo chāo': ['吵'],\n 'nà nè': ['吶'],\n 'xuè chuò jué': ['吷'],\n chuī: ['吹', '炊', '龡'],\n 'dōu rú': ['吺'],\n hǒu: ['吼', '犼'],\n 'hōng hǒu ōu': ['吽'],\n 'wú yù': ['吾'],\n 'ya yā': ['呀'],\n 'è e': ['呃'],\n dāi: ['呆', '懛', '獃'],\n 'mèn qǐ': ['呇'],\n hōng: ['呍', '嚝', '揈', '灴', '烘', '焢', '硡', '薨', '訇', '谾', '軣', '輷', '轟', '轰', '鍧'],\n nà: ['呐', '捺', '笝', '納', '纳', '肭', '蒳', '衲', '豽', '貀', '軜', '郍', '鈉', '钠', '靹', '魶'],\n 'tūn tiān': ['呑'],\n 'fǔ ḿ': ['呒', '嘸'],\n 'dāi tǎi': ['呔'],\n 'ǒu ōu òu': ['呕'],\n 'bài bei': ['呗'],\n 'yuán yún yùn': ['员', '員'],\n guō: ['呙', '啯', '嘓', '埚', '堝', '墎', '崞', '彉', '彍', '懖', '猓', '瘑', '聒', '蝈', '蟈', '郭', '鈛', '鍋', '锅'],\n 'huá qì': ['呚'],\n 'qiàng qiāng': ['呛', '跄'],\n shī: ['呞', '失', '尸', '屍', '师', '師', '施', '浉', '湤', '湿', '溮', '溼', '濕', '狮', '獅', '瑡', '絁', '葹', '蒒', '蓍', '虱', '蝨', '褷', '襹', '詩', '诗', '邿', '釃', '鉇', '鍦', '鯴', '鰤', '鲺', '鳲', '鳾', '鶳', '鸤', '䴓', '𫚕'],\n juǎn: ['呟', '埍', '臇', '菤', '錈', '锩'],\n pěn: ['呠', '翸'],\n 'wěn mǐn': ['呡'],\n 'ne ní': ['呢'],\n 'ḿ m̀ móu': ['呣'],\n rán: ['呥', '嘫', '然', '燃', '繎', '肰', '蚦', '蚺', '衻', '袇', '袡', '髥', '髯'],\n 'tiè chè': ['呫'],\n 'qì zhī': ['呮'],\n 'zǐ cī': ['呰'],\n 'guā gū guǎ': ['呱'],\n 'cī zī': ['呲'],\n 'hǒu xǔ gòu': ['呴'],\n 'hē ā á ǎ à a': ['呵'],\n náo: ['呶', '夒', '峱', '嶩', '巎', '挠', '撓', '猱', '硇', '蛲', '蟯', '詉', '譊', '鐃', '铙'],\n 'xiā gā': ['呷'],\n pēi: ['呸', '怌', '肧', '胚', '衃', '醅'],\n 'háo xiāo': ['呺'],\n mìng: ['命', '掵'],\n 'dá dàn': ['呾'],\n 'zuǐ jǔ': ['咀'],\n 'xián gān': ['咁'],\n pǒu: ['咅', '哣', '犃'],\n 'yǎng yāng': ['咉'],\n 'zǎ zé zhā': ['咋'],\n 'hé hè huó huò hú': ['和'],\n hāi: ['咍'],\n dā: ['咑', '哒', '噠', '墶', '搭', '撘', '耷', '褡', '鎝', '𨱏'],\n 'kǎ kā': ['咔'],\n gū: ['咕', '唂', '唃', '姑', '嫴', '孤', '巬', '巭', '柧', '橭', '沽', '泒', '稒', '笟', '箍', '箛', '篐', '罛', '苽', '菇', '菰', '蓇', '觚', '軱', '軲', '轱', '辜', '酤', '鈲', '鮕', '鴣', '鸪'],\n 'kā gā': ['咖'],\n zuo: ['咗'],\n lóng: ['咙', '嚨', '嶐', '巃', '巄', '昽', '曨', '朧', '栊', '槞', '櫳', '湰', '滝', '漋', '爖', '珑', '瓏', '癃', '眬', '矓', '砻', '礱', '礲', '窿', '竜', '聋', '聾', '胧', '茏', '蘢', '蠪', '蠬', '襱', '豅', '鏧', '鑨', '霳', '靇', '驡', '鸗', '龍', '龒', '龙'],\n 'xiàn xián': ['咞'],\n qì: ['咠', '唭', '噐', '器', '夡', '弃', '憇', '憩', '暣', '棄', '欫', '气', '気', '氣', '汔', '汽', '泣', '湆', '湇', '炁', '甈', '盵', '矵', '碛', '碶', '磜', '磧', '罊', '芞', '葺', '藒', '蟿', '訖', '讫', '迄', '鐑'],\n 'xì dié': ['咥'],\n 'liē liě lié lie': ['咧'],\n zī: ['咨', '嗞', '姕', '姿', '孜', '孳', '孶', '崰', '嵫', '栥', '椔', '淄', '湽', '滋', '澬', '玆', '禌', '秶', '粢', '紎', '緇', '緕', '纃', '缁', '茊', '茲', '葘', '諮', '谘', '貲', '資', '赀', '资', '赼', '趑', '趦', '輜', '輺', '辎', '鄑', '鈭', '錙', '鍿', '鎡', '锱', '镃', '頾', '頿', '髭', '鯔', '鰦', '鲻', '鶅', '鼒', '齍', '齜', '龇'],\n mī: ['咪'],\n 'jī xī qià': ['咭'],\n 'gē luò kǎ lo': ['咯'],\n 'shù xún': ['咰'],\n 'zán zá zǎ zan': ['咱'],\n 'hāi ké': ['咳'],\n huī: ['咴', '噅', '噕', '婎', '媈', '幑', '徽', '恢', '拻', '挥', '揮', '晖', '暉', '楎', '洃', '瀈', '灰', '灳', '烣', '睳', '禈', '翚', '翬', '蘳', '袆', '褘', '詼', '诙', '豗', '輝', '辉', '鰴', '麾', '㧑'],\n 'huài shì': ['咶'],\n táo: ['咷', '啕', '桃', '檮', '洮', '淘', '祹', '綯', '绹', '萄', '蜪', '裪', '迯', '逃', '醄', '鋾', '鞀', '鞉', '饀', '駣', '騊', '鼗', '𫘦'],\n xián: ['咸', '啣', '娴', '娹', '婱', '嫌', '嫺', '嫻', '弦', '挦', '撏', '涎', '湺', '澖', '甉', '痫', '癇', '癎', '絃', '胘', '舷', '藖', '蚿', '蛝', '衔', '衘', '誸', '諴', '賢', '贒', '贤', '輱', '醎', '銜', '鑦', '閑', '闲', '鷳', '鷴', '鷼', '鹇', '鹹', '麙', '𫍯'],\n 'è àn': ['咹'],\n 'xuān xuǎn': ['咺', '烜'],\n 'wāi hé wǒ guǎ guō': ['咼'],\n 'yàn yè yān': ['咽'],\n āi: ['哀', '哎', '埃', '溾', '銰', '鎄', '锿'],\n pǐn: ['品', '榀'],\n shěn: ['哂', '婶', '嬸', '审', '宷', '審', '弞', '曋', '渖', '瀋', '瞫', '矤', '矧', '覾', '訠', '諗', '讅', '谂', '谉', '邥', '頣', '魫'],\n 'hǒng hōng hòng': ['哄'],\n 'wā wa': ['哇'],\n 'hā hǎ hà': ['哈'],\n zāi: ['哉', '栽', '渽', '溨', '災', '灾', '烖', '睵', '賳'],\n 'dì diè': ['哋'],\n pài: ['哌', '沠', '派', '渒', '湃', '蒎', '鎃'],\n 'gén hěn': ['哏'],\n 'yǎ yā': ['哑', '雅'],\n 'yuě huì': ['哕', '噦'],\n nián: ['哖', '年', '秊', '秥', '鮎', '鯰', '鲇', '鲶', '鵇', '黏'],\n 'huá huā': ['哗', '嘩'],\n 'jì jiē zhāi': ['哜', '嚌'],\n mōu: ['哞'],\n 'yō yo': ['哟', '喲'],\n lòng: ['哢', '梇', '贚'],\n 'ò ó é': ['哦'],\n 'lī lǐ li': ['哩'],\n 'nǎ na nǎi né něi': ['哪'],\n hè: ['哬', '垎', '壑', '寉', '惒', '焃', '煂', '燺', '爀', '癋', '碋', '翯', '褐', '謞', '賀', '贺', '赫', '靍', '靎', '靏', '鶴', '鸖', '鹤'],\n 'bō pò bā': ['哱'],\n zhé: ['哲', '啠', '喆', '嚞', '埑', '悊', '摺', '晢', '晣', '歽', '矺', '砓', '磔', '籷', '粍', '虴', '蛰', '蟄', '袩', '詟', '謫', '謺', '讁', '讋', '谪', '輒', '輙', '轍', '辄', '辙', '鮿'],\n 'liàng láng': ['哴'],\n 'liè lǜ': ['哷'],\n hān: ['哻', '憨', '蚶', '谽', '酣', '頇', '顸', '馠', '魽', '鼾'],\n 'hēng hng': ['哼'],\n gěng: ['哽', '埂', '峺', '挭', '梗', '綆', '绠', '耿', '莄', '郠', '骾', '鯁', '鲠', '𬒔'],\n 'chuò yuè': ['哾'],\n 'gě jiā': ['哿'],\n 'bei bài': ['唄'],\n 'hán hàn': ['唅'],\n chún: ['唇', '浱', '湻', '滣', '漘', '犉', '純', '纯', '脣', '莼', '蒓', '蓴', '醇', '醕', '錞', '陙', '鯙', '鶉', '鹑', '𬭚'],\n 'ài āi': ['唉'],\n 'jiá qiǎn': ['唊'],\n 'yán dàn xián': ['唌'],\n chē: ['唓', '砗', '硨', '莗', '蛼'],\n 'wú ńg ń': ['唔'],\n zào: ['唕', '唣', '噪', '慥', '梍', '灶', '煰', '燥', '皁', '皂', '竃', '竈', '簉', '艁', '譟', '趮', '躁', '造', '𥖨'],\n dí: ['唙', '啇', '嘀', '嚁', '嫡', '廸', '敌', '敵', '梑', '涤', '滌', '狄', '笛', '籴', '糴', '苖', '荻', '蔋', '蔐', '藡', '覿', '觌', '豴', '迪', '靮', '頔', '馰', '髢', '鸐', '𬱖'],\n 'gòng hǒng gǒng': ['唝', '嗊'],\n dóu: ['唞'],\n 'lào láo': ['唠', '嘮', '憦'],\n huàn: ['唤', '喚', '奂', '奐', '宦', '嵈', '幻', '患', '愌', '换', '換', '擐', '攌', '梙', '槵', '浣', '涣', '渙', '漶', '澣', '烉', '焕', '煥', '瑍', '痪', '瘓', '睆', '肒', '藧', '豢', '轘', '逭', '鯇', '鯶', '鰀', '鲩'],\n léng: ['唥', '塄', '楞', '碐', '薐'],\n 'wō wěi': ['唩'],\n fěng: ['唪', '覂', '諷', '讽'],\n 'yín jìn': ['唫'],\n 'hǔ xià': ['唬'],\n wéi: ['唯', '围', '圍', '壝', '峗', '峞', '嵬', '帏', '帷', '幃', '惟', '桅', '沩', '洈', '涠', '湋', '溈', '潍', '潙', '潿', '濰', '犩', '矀', '維', '维', '蓶', '覹', '违', '違', '鄬', '醀', '鍏', '闈', '闱', '韋', '韦', '鮠', '𣲗', '𬶏'],\n shuā: ['唰'],\n chàng: ['唱', '怅', '悵', '暢', '焻', '畅', '畼', '誯', '韔', '鬯'],\n 'ér wā': ['唲'],\n qiàng: ['唴', '炝', '熗', '羻'],\n yō: ['唷'],\n yū: ['唹', '淤', '瘀', '盓', '箊', '紆', '纡', '込', '迂', '迃', '陓'],\n lài: ['唻', '濑', '瀨', '瀬', '癞', '癩', '睐', '睞', '籁', '籟', '藾', '賚', '賴', '赉', '赖', '頼', '顂', '鵣'],\n tuò: ['唾', '嶞', '柝', '毤', '毻', '箨', '籜', '萚', '蘀', '跅'],\n 'zhōu zhāo tiào': ['啁'],\n kěn: ['啃', '垦', '墾', '恳', '懇', '肎', '肯', '肻', '豤', '錹'],\n 'zhuó zhào': ['啅', '濯'],\n 'hēng hèng': ['啈', '悙'],\n 'lín lán': ['啉'],\n 'a ā á ǎ à': ['啊'],\n qiāng: ['啌', '嗴', '嶈', '戕', '摤', '斨', '枪', '槍', '溬', '牄', '猐', '獇', '羌', '羗', '腔', '蜣', '謒', '鏘', '锖', '锵'],\n 'tūn zhūn xiāng duǐ': ['啍'],\n wèn: ['問', '妏', '揾', '搵', '璺', '问', '顐'],\n 'cuì qi': ['啐'],\n 'dié shà jié tì': ['啑'],\n 'yuē wā': ['啘'],\n 'zǐ cǐ': ['啙'],\n 'bǐ tú': ['啚'],\n 'chuò chuài': ['啜'],\n 'yǎ yā è': ['啞'],\n fēi: ['啡', '婓', '婔', '扉', '暃', '渄', '猆', '緋', '绯', '裶', '霏', '非', '靟', '飛', '飝', '飞', '餥', '馡', '騑', '騛', '鯡', '鲱', '𬴂'],\n pí: ['啤', '壀', '枇', '毗', '毘', '焷', '琵', '疲', '皮', '篺', '罴', '羆', '脾', '腗', '膍', '蚍', '蚽', '蜱', '螷', '蠯', '豼', '貔', '郫', '鈹', '阰', '陴', '隦', '魮', '鮍', '鲏', '鵧', '鼙'],\n shá: ['啥'],\n 'lā la': ['啦'],\n 'yīng qíng': ['啨'],\n pā: ['啪', '妑', '舥', '葩', '趴'],\n 'zhě shì': ['啫'],\n sè: ['啬', '嗇', '懎', '擌', '栜', '歮', '涩', '渋', '澀', '澁', '濇', '濏', '瀒', '瑟', '璱', '瘷', '穑', '穡', '穯', '繬', '譅', '轖', '銫', '鏼', '铯', '飋'],\n niè: ['啮', '嗫', '噛', '嚙', '囁', '囓', '圼', '孼', '孽', '嵲', '嶭', '巕', '帇', '敜', '枿', '槷', '櫱', '涅', '湼', '痆', '篞', '籋', '糱', '糵', '聂', '聶', '臬', '臲', '蘖', '蠥', '讘', '踂', '踗', '踙', '蹑', '躡', '錜', '鎳', '鑈', '鑷', '钀', '镊', '镍', '闑', '陧', '隉', '顳', '颞', '齧', '𫔶'],\n 'luō luó luo': ['啰', '囉'],\n 'tān chǎn tuō': ['啴'],\n bo: ['啵', '蔔'],\n dìng: ['啶', '定', '椗', '矴', '碇', '碠', '磸', '聢', '腚', '萣', '蝊', '訂', '订', '錠', '锭', '顁', '飣', '饤'],\n lāng: ['啷'],\n 'án ān': ['啽'],\n kā: ['喀', '擖'],\n 'yóng yú': ['喁'],\n 'lā lá lǎ': ['喇'],\n jiē: ['喈', '喼', '嗟', '堦', '媘', '接', '掲', '擑', '湝', '煯', '疖', '痎', '癤', '皆', '秸', '稭', '脻', '蝔', '街', '謯', '阶', '階', '鞂', '鶛'],\n hóu: ['喉', '帿', '猴', '瘊', '睺', '篌', '糇', '翭', '葔', '鄇', '鍭', '餱', '骺', '鯸', '𬭤'],\n 'dié zhá': ['喋'],\n wāi: ['喎', '歪', '竵'],\n 'nuò rě': ['喏'],\n 'xù huò guó': ['喐'],\n zán: ['喒'],\n 'wō ō': ['喔'],\n hú: ['喖', '嘝', '囫', '壶', '壷', '壺', '媩', '弧', '搰', '斛', '楜', '槲', '湖', '瀫', '焀', '煳', '狐', '猢', '瑚', '瓳', '箶', '絗', '縠', '胡', '葫', '蔛', '蝴', '螜', '衚', '觳', '醐', '鍸', '頶', '餬', '鬍', '魱', '鰗', '鵠', '鶘', '鶦', '鹕'],\n 'huàn yuán xuǎn hé': ['喛'],\n xǐ: ['喜', '囍', '壐', '屣', '徙', '憙', '枲', '橲', '歖', '漇', '玺', '璽', '矖', '禧', '縰', '葈', '葸', '蓰', '蟢', '謑', '蹝', '躧', '鈢', '鉨', '鉩', '鱚', '𬭳', '𬶮'],\n 'hē hè yè': ['喝'],\n kuì: ['喟', '嘳', '媿', '嬇', '愦', '愧', '憒', '篑', '簣', '籄', '聩', '聭', '聵', '膭', '蕢', '謉', '餽', '饋', '馈'],\n 'zhǒng chuáng': ['喠'],\n 'wéi wèi': ['喡', '為', '爲'],\n 'duó zhà': ['喥'],\n 'sāng sàng': ['喪'],\n 'qiáo jiāo': ['喬'],\n 'pèn bēn': ['喯'],\n 'cān sūn qī': ['喰'],\n 'zhā chā': ['喳'],\n miāo: ['喵'],\n 'pēn pèn': ['喷'],\n kuí: ['喹', '夔', '奎', '巙', '戣', '揆', '晆', '暌', '楏', '楑', '櫆', '犪', '睽', '葵', '藈', '蘷', '虁', '蝰', '躨', '逵', '鄈', '鍨', '鍷', '頯', '馗', '騤', '骙', '魁'],\n 'lou lóu': ['喽'],\n 'zào qiāo': ['喿'],\n 'hè xiāo xiào hù': ['嗃'],\n 'á shà': ['嗄'],\n xiù: ['嗅', '岫', '峀', '溴', '珛', '琇', '璓', '秀', '綉', '繍', '繡', '绣', '螑', '袖', '褎', '褏', '銹', '鏥', '鏽', '锈', '齅'],\n 'qiāng qiàng': ['嗆', '戗', '戧', '蹌', '蹡'],\n 'ài yì': ['嗌', '艾'],\n 'má mǎ ma': ['嗎'],\n 'kè kē': ['嗑'],\n 'dā tà': ['嗒', '鎉'],\n sǎng: ['嗓', '搡', '磉', '褬', '鎟', '顙', '颡'],\n chēn: ['嗔', '抻', '琛', '瞋', '諃', '謓', '賝', '郴', '𬘭'],\n 'wā gǔ': ['嗗'],\n 'pǎng bēng': ['嗙'],\n 'xián qiǎn qiān': ['嗛'],\n lào: ['嗠', '嫪', '橯', '涝', '澇', '耢', '耮', '躼', '軂', '酪'],\n wēng: ['嗡', '翁', '聬', '螉', '鎓', '鶲', '鹟', '𬭩'],\n wà: ['嗢', '腽', '膃', '袜', '襪', '韤'],\n 'hēi hāi': ['嗨'],\n hē: ['嗬', '欱', '蠚', '訶', '诃'],\n zi: ['嗭'],\n sǎi: ['嗮'],\n 'ǹg ńg ňg': ['嗯'],\n gě: ['嗰', '舸'],\n ná: ['嗱', '拏', '拿', '鎿', '镎'],\n diǎ: ['嗲'],\n 'ài ǎi āi': ['嗳'],\n tōng: ['嗵', '樋', '炵', '蓪'],\n 'zuī suī': ['嗺'],\n 'zhē zhè zhù zhe': ['嗻'],\n mò: ['嗼', '圽', '塻', '墨', '妺', '嫼', '寞', '帞', '昩', '末', '枺', '歿', '殁', '沫', '漠', '爅', '獏', '瘼', '皌', '眽', '眿', '瞐', '瞙', '砞', '礳', '秣', '絈', '纆', '耱', '茉', '莈', '蓦', '蛨', '蟔', '貃', '貊', '貘', '銆', '鏌', '镆', '陌', '靺', '驀', '魩', '默', '黙', '𬙊'],\n sòu: ['嗽', '瘶'],\n tǎn: ['嗿', '坦', '忐', '憳', '憻', '暺', '毯', '璮', '菼', '袒', '襢', '醓', '鉭', '钽'],\n 'jiào dǎo': ['嘄'],\n 'kǎi gě': ['嘅'],\n 'shān càn': ['嘇'],\n cáo: ['嘈', '嶆', '曹', '曺', '槽', '漕', '艚', '蓸', '螬', '褿', '鏪', '𥕢'],\n piào: ['嘌', '徱', '蔈', '驃'],\n 'lóu lou': ['嘍'],\n gǎ: ['尕', '玍'],\n 'gǔ jiǎ': ['嘏'],\n 'jiāo xiāo': ['嘐'],\n 'xū shī': ['嘘', '噓'],\n pó: ['嘙', '嚩', '婆', '櫇', '皤', '鄱'],\n 'dē dēi': ['嘚'],\n 'ma má': ['嘛'],\n 'lē lei': ['嘞'],\n 'gā gá gǎ': ['嘠'],\n sāi: ['嘥', '噻', '毢', '腮', '顋', '鰓'],\n 'zuō chuài': ['嘬'],\n 'cháo zhāo': ['嘲', '朝', '鼂'],\n zuǐ: ['嘴', '噿', '嶊', '璻'],\n 'qiáo qiào': ['嘺', '翹', '谯'],\n 'chù xù shòu': ['嘼'],\n 'tān chǎn': ['嘽'],\n 'dàn tán': ['嘾', '弾', '彈', '惔', '澹'],\n 'hēi mò': ['嘿'],\n ě: ['噁', '砨', '頋', '騀', '鵈'],\n 'fān bo': ['噃'],\n chuáng: ['噇', '床', '牀'],\n 'cù zā hé': ['噈'],\n 'tūn kuò': ['噋'],\n 'cēng chēng': ['噌'],\n dēng: ['噔', '嬁', '灯', '燈', '璒', '登', '竳', '簦', '艠', '豋'],\n pū: ['噗', '扑', '撲', '攴', '攵', '潽', '炇', '陠'],\n juē: ['噘', '屩', '屫', '撧'],\n lū: ['噜', '嚕', '撸', '擼', '謢'],\n zhān: ['噡', '岾', '惉', '旃', '旜', '枬', '栴', '毡', '氈', '氊', '沾', '瞻', '薝', '蛅', '詀', '詹', '譫', '谵', '趈', '邅', '閚', '霑', '飦', '饘', '驙', '魙', '鱣', '鸇', '鹯', '𫗴'],\n ō: ['噢'],\n 'zhòu zhuó': ['噣'],\n 'jiào qiào chī': ['噭'],\n yuàn: ['噮', '妴', '怨', '愿', '掾', '瑗', '禐', '苑', '衏', '裫', '褑', '院', '願'],\n 'ǎi ài āi': ['噯'],\n 'yōng yǒng': ['噰', '澭'],\n 'jué xué': ['噱'],\n 'pēn pèn fèn': ['噴'],\n gá: ['噶', '尜', '釓', '錷', '钆'],\n 'xīn hěn hèn': ['噷'],\n dāng: ['噹', '澢', '珰', '璫', '筜', '簹', '艡', '蟷', '裆', '襠'],\n làn: ['嚂', '滥', '濫', '烂', '燗', '爁', '爛', '爤', '瓓', '糷', '钄'],\n tà: ['嚃', '嚺', '崉', '挞', '搨', '撻', '榻', '橽', '毾', '涾', '澾', '濌', '禢', '粏', '誻', '譶', '蹋', '蹹', '躂', '躢', '遝', '錔', '闒', '闥', '闼', '阘', '鞜', '鞳'],\n 'huō huò ǒ': ['嚄'],\n hāo: ['嚆', '茠', '蒿', '薅'],\n 'hè xià': ['嚇'],\n 'xiù pì': ['嚊'],\n 'zhōu chóu': ['嚋', '盩', '诪'],\n mē: ['嚒'],\n 'chā cā': ['嚓'],\n 'bó pào bào': ['嚗'],\n 'me mèi mò': ['嚜'],\n 'xié hái': ['嚡'],\n 'áo xiāo': ['嚣'],\n mō: ['嚤', '摸'],\n pín: ['嚬', '娦', '嫔', '嬪', '玭', '矉', '薲', '蠙', '貧', '贫', '顰', '颦', '𬞟'],\n mè: ['嚰', '濹'],\n 'rǎng rāng': ['嚷'],\n lá: ['嚹', '旯'],\n 'jiáo jué jiào': ['嚼'],\n chuò: ['嚽', '娖', '擉', '歠', '涰', '磭', '踀', '輟', '辍', '辵', '辶', '酫', '鑡', '餟', '齪', '龊'],\n 'huān huàn': ['嚾'],\n 'zá cà': ['囃'],\n chài: ['囆', '虿', '蠆', '袃', '訍'],\n 'náng nāng': ['囊'],\n 'zá zàn cān': ['囋'],\n sū: ['囌', '櫯', '甦', '稣', '穌', '窣', '蘇', '蘓', '酥', '鯂'],\n zèng: ['囎', '熷', '甑', '贈', '赠', '鋥', '锃'],\n 'zá niè yàn': ['囐'],\n nāng: ['囔'],\n 'luó luō luo': ['囖'],\n 'wéi guó': ['囗'],\n huí: ['囘', '回', '囬', '廻', '廽', '恛', '洄', '痐', '茴', '蚘', '蛔', '蛕', '蜖', '迴', '逥', '鮰'],\n nín: ['囜', '您', '脌'],\n 'jiǎn nān': ['囝'],\n nān: ['囡'],\n tuán: ['团', '団', '團', '慱', '抟', '摶', '檲', '糰', '鏄', '鷒', '鷻'],\n 'tún dùn': ['囤', '坉'],\n guó: ['囯', '囶', '囻', '国', '圀', '國', '帼', '幗', '慖', '摑', '漍', '聝', '腘', '膕', '蔮', '虢', '馘', '𬇹'],\n kùn: ['困', '涃', '睏'],\n 'wéi tōng': ['囲'],\n qūn: ['囷', '夋', '逡'],\n rì: ['囸', '日', '衵', '鈤', '馹', '驲'],\n tāi: ['囼', '孡', '胎'],\n pǔ: ['圃', '圑', '擈', '普', '暜', '樸', '檏', '氆', '浦', '溥', '烳', '諩', '譜', '谱', '蹼', '鐠', '镨'],\n 'quān juàn juān': ['圈', '圏'],\n 'chuí chuán': ['圌'],\n tuǎn: ['圕', '畽', '疃'],\n lüè: ['圙', '掠', '略', '畧', '稤', '鋝', '鋢', '锊', '䂮'],\n 'huán yuán': ['圜'],\n luán: ['圝', '圞', '奱', '娈', '孌', '孪', '孿', '峦', '巒', '挛', '攣', '曫', '栾', '欒', '滦', '灤', '癴', '癵', '羉', '脔', '臠', '虊', '銮', '鑾', '鵉', '鸞', '鸾'],\n tǔ: ['土', '圡', '釷', '钍'],\n 'xū wéi': ['圩'],\n 'dì de': ['地', '嶳'],\n 'qiān sú': ['圱'],\n zhèn: ['圳', '塦', '挋', '振', '朕', '栚', '甽', '眹', '紖', '絼', '纼', '誫', '賑', '赈', '鋴', '鎭', '鎮', '镇', '阵', '陣', '震', '鴆', '鸩'],\n 'chǎng cháng': ['场', '場', '塲'],\n 'qí yín': ['圻'],\n jiá: ['圿', '忦', '恝', '戞', '扴', '脥', '荚', '莢', '蛱', '蛺', '裌', '跲', '郏', '郟', '鋏', '铗', '頬', '頰', '颊', '鴶', '鵊'],\n 'zhǐ zhì': ['坁'],\n bǎn: ['坂', '岅', '昄', '板', '版', '瓪', '粄', '舨', '蝂', '鈑', '钣', '阪', '魬'],\n qǐn: ['坅', '寑', '寝', '寢', '昑', '梫', '笉', '螼', '赾', '鋟', '锓'],\n 'méi fén': ['坆'],\n 'rǒng kēng': ['坈'],\n 'fāng fáng': ['坊'],\n 'fèn bèn': ['坋'],\n tān: ['坍', '怹', '摊', '擹', '攤', '滩', '灘', '瘫', '癱', '舑', '貪', '贪'],\n 'huài pēi pī péi': ['坏'],\n 'dì làn': ['坔'],\n tán: ['坛', '墰', '墵', '壇', '壜', '婒', '憛', '昙', '曇', '榃', '檀', '潭', '燂', '痰', '磹', '罈', '罎', '藫', '談', '譚', '譠', '谈', '谭', '貚', '郯', '醰', '錟', '顃'],\n bà: ['坝', '垻', '壩', '弝', '欛', '灞', '爸', '矲', '覇', '霸', '鮁', '鲅'],\n fén: ['坟', '墳', '妢', '岎', '幩', '枌', '棼', '汾', '焚', '燌', '燓', '羒', '羵', '蒶', '蕡', '蚠', '蚡', '豮', '豶', '轒', '鐼', '隫', '馩', '魵', '黂', '鼖', '鼢', '𣸣'],\n zhuì: ['坠', '墜', '惴', '甀', '畷', '礈', '綴', '縋', '缀', '缒', '腏', '膇', '諈', '贅', '赘', '醊', '錣', '鑆'],\n pō: ['坡', '岥', '泼', '溌', '潑', '釙', '鏺', '钋', '頗', '颇', '䥽'],\n 'pǎn bàn': ['坢'],\n kūn: ['坤', '堃', '堒', '崐', '崑', '昆', '晜', '潉', '焜', '熴', '猑', '琨', '瑻', '菎', '蜫', '裈', '裩', '褌', '醌', '錕', '锟', '騉', '髠', '髡', '髨', '鯤', '鲲', '鵾', '鶤', '鹍'],\n diàn: ['坫', '垫', '墊', '壂', '奠', '婝', '店', '惦', '扂', '橂', '殿', '淀', '澱', '玷', '琔', '电', '癜', '簟', '蜔', '鈿', '電', '靛', '驔'],\n 'mù mǔ': ['坶'],\n 'kē kě': ['坷', '軻'],\n xuè: ['坹', '岤', '桖', '瀥', '狘', '瞲', '謔', '谑', '趐'],\n 'dǐ chí': ['坻', '柢'],\n lā: ['垃', '柆', '菈', '邋'],\n lǒng: ['垄', '垅', '壟', '壠', '拢', '攏', '竉', '陇', '隴', '𬕂'],\n mín: ['垊', '姄', '岷', '崏', '捪', '旻', '旼', '民', '珉', '琘', '琝', '瑉', '痻', '盿', '砇', '緍', '緡', '缗', '罠', '苠', '鈱', '錉', '鍲', '鴖'],\n 'dòng tóng': ['垌', '峒', '洞'],\n cí: ['垐', '嬨', '慈', '柌', '濨', '珁', '瓷', '甆', '磁', '礠', '祠', '糍', '茨', '詞', '词', '辝', '辞', '辤', '辭', '雌', '飺', '餈', '鴜', '鶿', '鷀', '鹚'],\n duī: ['垖', '堆', '塠', '痽', '磓', '鐓', '鐜', '鴭'],\n 'duò duǒ': ['垛'],\n 'duǒ duò': ['垜', '挆'],\n chá: ['垞', '察', '嵖', '搽', '槎', '檫', '猹', '茬', '茶', '詧', '靫', '𥻗'],\n shǎng: ['垧', '晌', '樉', '賞', '贘', '赏', '鋿', '鏛', '鑜'],\n shǒu: ['垨', '守', '手', '扌', '艏', '首'],\n da: ['垯', '繨', '跶'],\n háng: ['垳', '斻', '杭', '筕', '絎', '绗', '航', '苀', '蚢', '裄', '貥', '迒', '頏', '颃', '魧'],\n 'ān ǎn': ['垵'],\n xīng: ['垶', '惺', '星', '曐', '煋', '猩', '瑆', '皨', '篂', '腥', '興', '觪', '觲', '謃', '騂', '骍', '鮏', '鯹'],\n 'yuàn huán': ['垸'],\n bāng: ['垹', '帮', '幇', '幚', '幫', '捠', '梆', '浜', '邦', '邫', '鞤', '𠳐'],\n 'póu fú': ['垺'],\n cén: ['埁', '岑', '涔'],\n 'běng fēng': ['埄'],\n 'dì fáng': ['埅'],\n 'xiá jiā': ['埉'],\n 'mái mán': ['埋'],\n làng: ['埌', '崀', '浪', '蒗', '閬', '㫰'],\n 'shān yán': ['埏'],\n 'qín jīn': ['埐'],\n 'pǔ bù': ['埔'],\n huā: ['埖', '婲', '椛', '硴', '糀', '花', '蒊', '蘤', '誮', '錵'],\n 'suì sù': ['埣'],\n 'pí pì': ['埤'],\n 'qīng zhēng': ['埥', '鲭'],\n 'wǎn wān': ['埦'],\n lǔn: ['埨', '稐', '𫭢'],\n 'zhēng chéng': ['埩'],\n kōng: ['埪', '崆', '箜', '躻', '錓', '鵼'],\n 'cǎi cài': ['埰', '寀', '采'],\n 'chù tòu': ['埱'],\n běng: ['埲', '琫', '菶', '鞛'],\n 'kǎn xiàn': ['埳'],\n 'yì shì': ['埶', '醳'],\n péi: ['培', '毰', '裴', '裵', '賠', '赔', '錇', '锫', '阫', '陪'],\n 'sào sǎo': ['埽'],\n 'jǐn qīn jìn': ['堇'],\n 'péng bèng': ['堋'],\n 'qiàn zàn jiàn': ['堑'],\n àn: ['堓', '屵', '岸', '按', '暗', '案', '胺', '荌', '豻', '貋', '錌', '闇', '隌', '黯'],\n 'duò huī': ['堕', '墮'],\n huán: ['堚', '寏', '寰', '峘', '桓', '洹', '澴', '獂', '环', '環', '糫', '繯', '缳', '羦', '荁', '萈', '萑', '豲', '鍰', '鐶', '锾', '镮', '闤', '阛', '雈', '鬟', '鹮', '𬘫', '𤩽'],\n 'bǎo bǔ pù': ['堡'],\n 'máo móu wǔ': ['堥'],\n ruán: ['堧', '壖', '撋'],\n 'ài è yè': ['堨'],\n gèng: ['堩', '暅'],\n méi: ['堳', '塺', '媒', '嵋', '徾', '攗', '枚', '栂', '梅', '楣', '楳', '槑', '湄', '湈', '煤', '猸', '玫', '珻', '瑂', '眉', '睂', '禖', '脄', '脢', '腜', '苺', '莓', '葿', '郿', '酶', '鎇', '镅', '霉', '鶥', '鹛', '黴'],\n dǔ: ['堵', '琽', '睹', '笃', '篤', '覩', '賭', '赌'],\n féng: ['堸', '綘', '艂', '逢'],\n hèng: ['堼'],\n chūn: ['堾', '媋', '旾', '春', '暙', '杶', '椿', '槆', '橁', '櫄', '瑃', '箺', '萅', '蝽', '輴', '鰆', '鶞', '䲠'],\n jiǎng: ['塂', '奖', '奨', '奬', '桨', '槳', '獎', '耩', '膙', '蒋', '蔣', '講', '讲', '顜'],\n huāng: ['塃', '巟', '慌', '肓', '荒', '衁'],\n duàn: ['塅', '断', '斷', '椴', '段', '毈', '煅', '瑖', '碫', '簖', '籪', '緞', '缎', '腶', '葮', '躖', '鍛', '锻'],\n tǎ: ['塔', '墖', '獭', '獺', '鮙', '鰨', '鳎'],\n wěng: ['塕', '奣', '嵡', '攚', '暡', '瞈', '蓊'],\n 'sāi sài sè': ['塞'],\n zàng: ['塟', '弉', '臓', '臟', '葬', '蔵', '銺'],\n tián: ['塡', '屇', '恬', '沺', '湉', '璳', '甛', '甜', '田', '畋', '畑', '碵', '磌', '胋', '闐', '阗', '鴫', '鷆', '鷏'],\n zhèng: ['塣', '幁', '政', '証', '諍', '證', '证', '诤', '郑', '鄭', '靕', '鴊'],\n 'tián zhèn': ['填'],\n wēn: ['塭', '昷', '榲', '殟', '温', '溫', '瑥', '瘟', '蕰', '豱', '輼', '轀', '辒', '鎾', '饂', '鰛', '鰮', '鳁'],\n liù: ['塯', '廇', '磟', '翏', '雡', '霤', '餾', '鬸', '鷚', '鹨'],\n hǎi: ['塰', '海', '烸', '酼', '醢'],\n lǎng: ['塱', '朖', '朗', '朤', '烺', '蓢', '㮾'],\n bèng: ['塴', '揼', '泵', '甏', '綳', '蹦', '迸', '逬', '鏰', '镚'],\n chén: ['塵', '宸', '尘', '忱', '敐', '敶', '晨', '曟', '栕', '樄', '沉', '煁', '瘎', '臣', '茞', '莀', '莐', '蔯', '薼', '螴', '訦', '諶', '軙', '辰', '迧', '鈂', '陈', '陳', '霃', '鷐', '麎'],\n 'ōu qiū': ['塸'],\n 'qiàn jiàn': ['塹'],\n 'zhuān tuán': ['塼'],\n shuǎng: ['塽', '慡', '漺', '爽', '縔', '鏯'],\n shú: ['塾', '婌', '孰', '璹', '秫', '贖', '赎'],\n lǒu: ['塿', '嵝', '嶁', '甊', '篓', '簍'],\n chí: ['墀', '弛', '持', '池', '漦', '竾', '筂', '箎', '篪', '茌', '荎', '蚳', '謘', '貾', '赿', '踟', '迟', '迡', '遅', '遟', '遲', '鍉', '馳', '驰'],\n shù: ['墅', '庶', '庻', '怷', '恕', '戍', '束', '树', '樹', '沭', '漱', '潄', '濖', '竖', '竪', '絉', '腧', '荗', '蒁', '虪', '術', '裋', '豎', '述', '鉥', '錰', '鏣', '霔', '鶐', '𬬸'],\n 'dì zhì': ['墆', '疐'],\n kàn: ['墈', '崁', '瞰', '矙', '磡', '衎', '鬫'],\n chěn: ['墋', '夦', '硶', '碜', '磣', '贂', '趻', '踸', '鍖'],\n 'zhǐ zhuó': ['墌'],\n qiǎng: ['墏', '繈', '繦', '羥', '襁'],\n zēng: ['増', '增', '憎', '璔', '矰', '磳', '罾', '譄', '鄫', '鱛', '䎖'],\n qiáng: ['墙', '墻', '嫱', '嬙', '樯', '檣', '漒', '牆', '艢', '蔃', '蔷', '蘠'],\n 'kuài tuí': ['墤'],\n 'tuǎn dǒng': ['墥'],\n 'qiáo què': ['墧'],\n 'zūn dūn': ['墫'],\n 'qiāo áo': ['墽'],\n 'yì tú': ['墿'],\n 'xué bó jué': ['壆'],\n lǎn: ['壈', '嬾', '孄', '孏', '懒', '懶', '揽', '擥', '攬', '榄', '欖', '浨', '漤', '灠', '纜', '缆', '罱', '覧', '覽', '览', '醂', '顲'],\n huài: ['壊', '壞', '蘾'],\n rǎng: ['壌', '壤', '攘', '爙'],\n 'làn xiàn': ['壏'],\n dǎo: ['壔', '导', '導', '岛', '島', '嶋', '嶌', '嶹', '捣', '搗', '擣', '槝', '祷', '禂', '禱', '蹈', '陦', '隝', '隯'],\n ruǐ: ['壡', '桵', '橤', '繠', '蕊', '蕋', '蘂', '蘃'],\n san: ['壭'],\n zhuàng: ['壮', '壯', '壵', '撞', '焋', '状', '狀'],\n 'ké qiào': ['壳', '殼'],\n kǔn: ['壸', '壼', '悃', '捆', '梱', '硱', '祵', '稇', '稛', '綑', '裍', '閫', '閸', '阃'],\n mǎng: ['壾', '漭', '茻', '莽', '莾', '蠎'],\n cún: ['壿', '存'],\n 'zhǐ zhōng': ['夂'],\n 'gǔ yíng': ['夃'],\n 'jiàng xiáng': ['夅', '降'],\n 'páng féng fēng': ['夆'],\n zhāi: ['夈', '捚', '摘', '斋', '斎', '榸', '粂', '齋'],\n 'xuàn xiòng': ['夐'],\n wài: ['外', '顡'],\n 'wǎn yuàn wān yuān': ['夗'],\n 'mǎo wǎn': ['夘'],\n mèng: ['夢', '夣', '孟', '梦', '癦', '霥'],\n 'dà dài': ['大'],\n 'fū fú': ['夫', '姇', '枎', '粰'],\n guài: ['夬', '怪', '恠'],\n yāng: ['央', '姎', '抰', '殃', '泱', '秧', '胦', '鉠', '鍈', '雵', '鴦', '鸯'],\n 'hāng bèn': ['夯'],\n gǎo: ['夰', '搞', '杲', '槀', '槁', '檺', '稁', '稾', '稿', '縞', '缟', '菒', '藁', '藳'],\n 'tāo běn': ['夲'],\n 'tóu tou': ['头'],\n 'yǎn tāo': ['夵'],\n 'kuā kuà': ['夸', '誇'],\n 'jiá jiā gā xiá': ['夹'],\n huà: ['夻', '婳', '嫿', '嬅', '崋', '摦', '杹', '枠', '桦', '槬', '樺', '澅', '画', '畫', '畵', '繣', '舙', '話', '諙', '譮', '话', '黊'],\n 'jiā jiá gā xiá': ['夾'],\n ēn: ['奀', '恩', '蒽'],\n 'dī tì': ['奃'],\n 'yǎn yān': ['奄', '渰'],\n pào: ['奅', '疱', '皰', '砲', '礟', '礮', '靤', '麭'],\n nài: ['奈', '柰', '渿', '耐', '萘', '褦', '錼', '鼐'],\n 'quān juàn': ['奍', '弮', '棬'],\n zòu: ['奏', '揍'],\n 'qì qiè xiè': ['契'],\n kāi: ['奒', '开', '揩', '鐦', '锎', '開'],\n 'bēn bèn': ['奔', '泍'],\n tào: ['套'],\n 'zàng zhuǎng': ['奘'],\n běn: ['奙', '本', '楍', '畚', '翉', '苯'],\n 'xùn zhuì': ['奞'],\n shē: ['奢', '檨', '猞', '畭', '畲', '賒', '賖', '赊', '輋', '𪨶'],\n 'hǎ pò tǎi': ['奤'],\n 'ào yù': ['奥', '奧', '澚'],\n yūn: ['奫', '氲', '氳', '蒀', '蒕', '蝹', '贇', '赟', '𫖳'],\n 'duǒ chě': ['奲'],\n 'nǚ rǔ': ['女'],\n nú: ['奴', '孥', '笯', '駑', '驽'],\n 'dīng dǐng tiǎn': ['奵'],\n 'tā jiě': ['她'],\n nuán: ['奻'],\n 'hǎo hào': ['好'],\n fàn: ['奿', '嬎', '梵', '汎', '泛', '滼', '瀪', '犯', '畈', '盕', '笵', '範', '范', '訉', '販', '贩', '軬', '輽', '飯', '飰', '饭'],\n shuò: ['妁', '搠', '朔', '槊', '烁', '爍', '矟', '蒴', '鎙', '鑠', '铄'],\n 'fēi pèi': ['妃'],\n wàng: ['妄', '忘', '旺', '望', '朢'],\n zhuāng: ['妆', '妝', '娤', '庄', '庒', '桩', '梉', '樁', '粧', '糚', '荘', '莊', '装', '裝'],\n mā: ['妈', '媽'],\n 'fū yōu': ['妋'],\n 'hài jiè': ['妎'],\n dù: ['妒', '妬', '杜', '殬', '渡', '秺', '芏', '荰', '螙', '蠧', '蠹', '鍍', '镀', '靯', '𬭊'],\n miào: ['妙', '庙', '庿', '廟', '玅', '竗'],\n 'fǒu pēi pī': ['妚'],\n 'yuè jué': ['妜'],\n niū: ['妞'],\n 'nà nàn': ['妠'],\n tuǒ: ['妥', '嫷', '庹', '椭', '楕', '橢', '鬌', '鰖', '鵎'],\n 'wàn yuán': ['妧'],\n fáng: ['妨', '房', '肪', '防', '魴', '鲂'],\n nī: ['妮'],\n zhóu: ['妯', '碡'],\n zhāo: ['妱', '巶', '招', '昭', '釗', '鉊', '鍣', '钊', '駋', '𬬿'],\n 'nǎi nǐ': ['妳'],\n tǒu: ['妵', '敨', '紏', '蘣', '黈'],\n 'xián xuán xù': ['妶'],\n 'zhí yì': ['妷', '秇'],\n ē: ['妸', '妿', '婀', '屙'],\n mèi: ['妹', '媚', '寐', '抺', '旀', '昧', '沬', '煝', '痗', '眛', '睸', '祙', '篃', '蝞', '袂', '跊', '鬽', '魅'],\n 'qī qì': ['妻'],\n 'xū xǔ': ['姁', '稰'],\n 'shān shàn': ['姍', '姗', '苫', '釤', '钐'],\n mán: ['姏', '慲', '樠', '蛮', '蠻', '謾', '饅', '馒', '鬗', '鬘', '鰻', '鳗'],\n jiě: ['姐', '媎', '檞', '毑', '飷'],\n 'wěi wēi': ['委'],\n pīn: ['姘', '拼', '礗', '穦', '馪', '驞'],\n 'huá huó': ['姡'],\n 'jiāo xiáo': ['姣'],\n 'gòu dù': ['姤'],\n 'lǎo mǔ': ['姥'],\n 'nián niàn': ['姩'],\n zhěn: ['姫', '屒', '弫', '抮', '昣', '枕', '畛', '疹', '眕', '稹', '縝', '縥', '缜', '聄', '萙', '袗', '裖', '覙', '診', '诊', '軫', '轸', '辴', '駗', '鬒'],\n héng: ['姮', '恆', '恒', '烆', '珩', '胻', '蘅', '衡', '鑅', '鴴', '鵆', '鸻'],\n 'jūn xún': ['姰'],\n 'kuā hù': ['姱'],\n 'è yà': ['姶'],\n 'xiān shēn': ['姺'],\n wá: ['娃'],\n 'ráo rǎo': ['娆', '嬈'],\n 'shào shāo': ['娋'],\n xiē: ['娎', '揳', '楔', '歇', '蝎', '蠍'],\n 'wǔ méi mǔ': ['娒'],\n 'chuò lài': ['娕'],\n niáng: ['娘', '嬢', '孃'],\n 'nà nuó': ['娜', '𦰡'],\n 'pōu bǐ': ['娝'],\n 'něi suī': ['娞'],\n tuì: ['娧', '煺', '蛻', '蜕', '退', '駾'],\n mǎn: ['娨', '屘', '満', '满', '滿', '螨', '蟎', '襔', '鏋'],\n 'wú wù yú': ['娪'],\n 'xī āi': ['娭'],\n 'zhuì shuì': ['娷'],\n 'dōng dòng': ['娻'],\n 'ǎi ái è': ['娾'],\n 'ē ě': ['娿'],\n mián: ['婂', '嬵', '宀', '杣', '棉', '檰', '櫋', '眠', '矈', '矊', '矏', '綿', '緜', '绵', '芇', '蝒'],\n 'pǒu péi bù': ['婄'],\n biǎo: ['婊', '脿', '表', '裱', '褾', '諘', '錶'],\n 'fù fàn': ['婏'],\n wǒ: ['婐', '婑', '我'],\n 'ní nǐ': ['婗', '棿'],\n 'quán juàn': ['婘', '惓'],\n hūn: ['婚', '昏', '昬', '棔', '涽', '睧', '睯', '碈', '荤', '葷', '蔒', '轋', '閽', '阍'],\n 'qiān jǐn': ['婜'],\n 'wān wà': ['婠'],\n 'lái lài': ['婡', '徕', '徠'],\n 'zhōu chōu': ['婤'],\n 'chuò nào': ['婥'],\n 'nüè àn': ['婩'],\n 'hùn kūn': ['婫'],\n 'dàng yáng': ['婸'],\n nàn: ['婻'],\n 'ruò chuò': ['婼'],\n jiǎ: ['婽', '岬', '斚', '斝', '榎', '槚', '檟', '玾', '甲', '胛', '鉀', '钾'],\n 'tōu yú': ['婾', '媮'],\n 'yù yú': ['媀'],\n 'wéi wěi': ['媁'],\n 'dì tí': ['媂', '珶', '苐'],\n róu: ['媃', '揉', '柔', '渘', '煣', '瑈', '瓇', '禸', '粈', '糅', '脜', '腬', '葇', '蝚', '蹂', '輮', '鍒', '鞣', '騥', '鰇', '鶔', '𫐓'],\n 'ruǎn nèn': ['媆'],\n miáo: ['媌', '嫹', '描', '瞄', '苗', '鶓', '鹋'],\n 'yí pèi': ['媐'],\n 'mián miǎn': ['媔'],\n 'tí shì': ['媞', '惿'],\n 'duò tuó': ['媠', '沲'],\n ǎo: ['媪', '媼', '艹', '芺', '袄', '襖', '镺'],\n 'chú zòu': ['媰'],\n yìng: ['媵', '映', '暎', '硬', '膡', '鱦'],\n 'qín shēn': ['嫀'],\n jià: ['嫁', '幏', '架', '榢', '稼', '駕', '驾'],\n sǎo: ['嫂'],\n 'zhēn zhěn': ['嫃'],\n 'jiē suǒ': ['嫅'],\n 'míng mǐng': ['嫇'],\n niǎo: ['嫋', '嬝', '嬲', '茑', '蔦', '袅', '裊', '褭', '鸟'],\n tāo: ['嫍', '幍', '弢', '慆', '掏', '搯', '槄', '涛', '滔', '濤', '瑫', '絛', '縚', '縧', '绦', '詜', '謟', '轁', '鞱', '韜', '韬', '飸', '饕'],\n biáo: ['嫑'],\n 'piáo piāo': ['嫖', '薸'],\n xuán: ['嫙', '悬', '懸', '暶', '檈', '漩', '玄', '璇', '璿', '痃', '蜁', '𫠊'],\n 'màn mān': ['嫚'],\n kāng: ['嫝', '嵻', '康', '慷', '槺', '漮', '砊', '穅', '糠', '躿', '鏮', '鱇', '𡐓', '𩾌'],\n 'hān nǎn': ['嫨'],\n nèn: ['嫩', '嫰'],\n zhē: ['嫬', '遮'],\n 'mā má': ['嫲'],\n piè: ['嫳'],\n zhǎn: ['嫸', '展', '搌', '斩', '斬', '琖', '盏', '盞', '輾', '醆', '颭', '飐'],\n 'xiān yǎn jìn': ['嬐'],\n liǎn: ['嬚', '敛', '斂', '琏', '璉', '羷', '脸', '臉', '蔹', '蘝', '蘞', '裣', '襝', '鄻'],\n 'qióng huán xuān': ['嬛'],\n dǒng: ['嬞', '懂', '箽', '董', '蕫', '諌'],\n cān: ['嬠', '湌', '爘', '飡', '餐', '驂', '骖'],\n tiǎo: ['嬥', '宨', '晀', '朓', '窱', '脁'],\n bí: ['嬶', '荸', '鼻'],\n liǔ: ['嬼', '柳', '栁', '桞', '桺', '橮', '熮', '珋', '綹', '绺', '罶', '羀', '鋶', '锍'],\n 'qiān xiān': ['孅', '欦'],\n 'xié huī': ['孈'],\n 'huān quán': ['孉'],\n 'lí lì': ['孋', '麗'],\n 'zhú chuò': ['孎'],\n kǒng: ['孔', '恐'],\n 'mā zī': ['孖'],\n 'sūn xùn': ['孙', '孫'],\n 'bèi bó': ['孛', '誖'],\n 'yòu niū': ['孧'],\n zhuǎn: ['孨', '竱', '轉'],\n hái: ['孩', '骸'],\n nāo: ['孬'],\n 'chán càn': ['孱'],\n bò: ['孹', '檗', '蘗', '譒'],\n nái: ['孻', '腉'],\n 'níng nìng': ['宁', '寍', '寗', '寜', '寧', '甯'],\n zhái: ['宅'],\n 'tū jiā': ['宊'],\n sòng: ['宋', '訟', '誦', '讼', '诵', '送', '鎹', '頌', '颂', '餸'],\n ròu: ['宍', '肉', '譳'],\n zhūn: ['宒', '窀', '衠', '諄', '谆', '迍'],\n 'mì fú': ['宓'],\n 'dàng tàn': ['宕'],\n 'wǎn yuān': ['宛'],\n chǒng: ['宠', '寵'],\n qún: ['宭', '峮', '帬', '羣', '群', '裙', '裠'],\n zǎi: ['宰', '崽'],\n 'bǎo shí': ['宲'],\n 'jiā jia jie': ['家'],\n 'huāng huǎng': ['宺'],\n kuān: ['宽', '寛', '寬', '臗', '鑧', '髋', '髖'],\n 'sù xiǔ xiù': ['宿'],\n 'jié zǎn': ['寁'],\n 'bìng bǐng': ['寎'],\n 'jìn qǐn': ['寖'],\n 'lóu jù': ['寠'],\n 'xiě xiè': ['寫'],\n 'qīn qìn': ['寴'],\n cùn: ['寸', '籿'],\n duì: ['对', '対', '對', '怼', '憝', '懟', '濧', '瀩', '碓', '祋', '綐', '薱', '譈', '譵', '轛', '队', '陮'],\n 'lüè luó': ['寽'],\n 'shè yè yì': ['射'],\n 'jiāng jiàng qiāng': ['将'],\n 'jiāng jiàng': ['將', '浆', '漿', '畺'],\n zūn: ['尊', '嶟', '樽', '罇', '遵', '鐏', '鱒', '鳟', '鶎', '鷷', '𨱔'],\n 'shù zhù': ['尌', '澍'],\n xiǎo: ['小', '晓', '暁', '曉', '皛', '皢', '筱', '筿', '篠', '謏', '𫍲'],\n 'jié jí': ['尐', '诘', '鞊'],\n 'shǎo shào': ['少'],\n ěr: ['尒', '尓', '尔', '栮', '毦', '洱', '爾', '珥', '耳', '薾', '衈', '趰', '迩', '邇', '鉺', '铒', '餌', '饵', '駬'],\n 'wāng yóu': ['尢'],\n wāng: ['尣', '尩', '尪', '尫', '汪'],\n liào: ['尥', '尦', '廖', '撂', '料', '炓', '窷', '鐐', '镣', '𪤗'],\n 'méng máng lóng páng': ['尨'],\n gà: ['尬', '魀'],\n 'kuì kuǐ': ['尯'],\n tuí: ['尵', '弚', '穨', '蘈', '蹪', '隤', '頹', '頺', '頽', '颓', '魋', '𬯎'],\n yǐn: ['尹', '嶾', '引', '朄', '檃', '檼', '櫽', '淾', '濥', '瘾', '癮', '粌', '蘟', '蚓', '螾', '讔', '赺', '趛', '輑', '鈏', '靷'],\n 'chǐ chě': ['尺'],\n kāo: ['尻', '髛'],\n 'jìn jǐn': ['尽'],\n 'wěi yǐ': ['尾'],\n 'niào suī': ['尿'],\n céng: ['层', '層', '嶒', '驓'],\n diǎo: ['屌'],\n 'píng bǐng bīng': ['屏'],\n lòu: ['屚', '漏', '瘘', '瘺', '瘻', '鏤', '镂', '陋'],\n 'shǔ zhǔ': ['属', '屬'],\n 'xiè tì': ['屟'],\n 'chè cǎo': ['屮'],\n 'tún zhūn': ['屯'],\n 'nì jǐ': ['屰'],\n 'hóng lóng': ['屸'],\n 'qǐ kǎi': ['岂', '豈'],\n áng: ['岇', '昂', '昻'],\n 'gǎng gāng': ['岗', '崗'],\n kě: ['岢', '敤', '渇', '渴', '炣'],\n gǒu: ['岣', '狗', '玽', '笱', '耇', '耈', '耉', '苟', '豿'],\n tiáo: ['岧', '岹', '樤', '祒', '笤', '芀', '萔', '蓚', '蓨', '蜩', '迢', '鋚', '鎥', '鞗', '髫', '鯈', '鰷', '鲦', '齠', '龆'],\n 'qū jū': ['岨'],\n lǐng: ['岭', '嶺', '領', '领'],\n pò: ['岶', '敀', '洦', '湐', '烞', '珀', '破', '砶', '粕', '蒪', '魄'],\n 'bā kè': ['峇'],\n luò: ['峈', '摞', '洛', '洜', '犖', '珞', '笿', '纙', '荦', '詻', '雒', '駱', '骆', '鵅'],\n 'fù niè': ['峊'],\n ěn: ['峎'],\n 'zhì shì': ['峙', '崻'],\n qiǎ: ['峠', '跒', '酠', '鞐'],\n 'qiáo jiào': ['峤', '癄'],\n 'xié yé': ['峫'],\n bū: ['峬', '庯', '晡', '誧', '逋', '鈽', '錻', '钸', '餔', '鵏'],\n chóng: ['崇', '崈', '爞', '虫', '蝩', '蟲', '褈', '隀'],\n 'zú cuì': ['崒', '椊'],\n 'líng léng': ['崚'],\n 'dòng dōng': ['崠'],\n xiáo: ['崤', '洨', '淆', '訤', '誵'],\n 'pí bǐ': ['崥', '芘'],\n 'zhǎn chán': ['崭', '嶃', '嶄'],\n 'wǎi wēi': ['崴'],\n 'yáng dàng': ['崵'],\n 'shì dié': ['崼'],\n yào: ['崾', '曜', '熎', '燿', '矅', '穾', '窔', '筄', '耀', '艞', '药', '葯', '薬', '藥', '袎', '覞', '詏', '讑', '靿', '鷂', '鹞', '鼼'],\n 'kān zhàn': ['嵁'],\n 'hán dǎng': ['嵅'],\n 'qiàn kàn': ['嵌'],\n 'wù máo': ['嵍'],\n 'kě jié': ['嵑', '嶱'],\n 'wēi wěi': ['嵔'],\n kē: ['嵙', '柯', '棵', '榼', '樖', '牁', '牱', '犐', '珂', '疴', '瞌', '磕', '礚', '科', '稞', '窠', '萪', '薖', '蚵', '蝌', '趷', '轲', '醘', '鈳', '钶', '頦', '顆', '颗', '髁'],\n 'dàng táng': ['嵣'],\n 'róng yíng': ['嵤', '爃'],\n 'ái kǎi': ['嵦'],\n 'kāo qiāo': ['嵪'],\n cuó: ['嵯', '嵳', '痤', '矬', '蒫', '蔖', '虘', '鹺', '鹾'],\n 'qiǎn qīn': ['嵰'],\n 'dì dié': ['嵽'],\n cēn: ['嵾'],\n dǐng: ['嵿', '艼', '薡', '鐤', '頂', '顶', '鼎', '鼑'],\n 'áo ào': ['嶅'],\n 'pǐ pèi': ['嶏'],\n 'jiào qiáo': ['嶠', '潐'],\n 'jué guì': ['嶡', '鳜'],\n 'zhān shàn': ['嶦', '鳣'],\n 'xiè jiè': ['嶰'],\n 'guī xī juàn': ['嶲'],\n rū: ['嶿'],\n 'lì liè': ['巁', '棙', '爄', '綟'],\n 'xī guī juàn': ['巂'],\n 'yíng hōng': ['巆'],\n yǐng: ['巊', '廮', '影', '摬', '梬', '潁', '瘿', '癭', '矨', '穎', '郢', '鐛', '頴', '颍', '颕', '颖'],\n chǎo: ['巐', '炒', '煼', '眧', '麨'],\n cuán: ['巑', '櫕', '欑'],\n chuān: ['巛', '川', '氚', '瑏', '穿'],\n 'jīng xíng': ['巠'],\n cháo: ['巢', '巣', '晁', '漅', '潮', '牊', '窲', '罺', '謿', '轈', '鄛', '鼌'],\n qiǎo: ['巧', '愀', '髜'],\n gǒng: ['巩', '廾', '拱', '拲', '栱', '汞', '珙', '輁', '鞏'],\n 'chà chā chāi cī': ['差'],\n 'xiàng hàng': ['巷'],\n shuài: ['帅', '帥', '蟀'],\n pà: ['帊', '帕', '怕', '袙'],\n 'tǎng nú': ['帑'],\n 'mò wà': ['帓'],\n 'tiē tiě tiè': ['帖'],\n zhǒu: ['帚', '晭', '疛', '睭', '箒', '肘', '菷', '鯞'],\n 'juǎn juàn': ['帣'],\n shuì: ['帨', '涗', '涚', '睡', '稅', '税', '裞'],\n 'chóu dào': ['帱', '幬'],\n 'jiǎn jiān sàn': ['帴'],\n 'shà qiè': ['帹'],\n 'qí jì': ['帺', '荠'],\n 'shān qiāo shēn': ['幓'],\n 'zhuàng chuáng': ['幢'],\n 'chān chàn': ['幨'],\n miè: ['幭', '懱', '搣', '滅', '灭', '烕', '礣', '篾', '蔑', '薎', '蠛', '衊', '鑖', '鱴', '鴓'],\n 'gān gàn': ['干'],\n 'bìng bīng': ['并', '幷'],\n 'jī jǐ': ['幾'],\n 'guǎng ān': ['广'],\n guǎng: ['広', '廣', '犷', '獷'],\n me: ['庅'],\n 'dùn tún': ['庉'],\n 'bài tīng': ['庍'],\n 'yìng yīng': ['应'],\n 'dǐ de': ['底'],\n 'dù duó': ['度'],\n 'máng méng páng': ['庬'],\n 'bìng píng': ['庰'],\n chěng: ['庱', '悜', '睈', '逞', '騁', '骋'],\n 'jī cuò': ['庴'],\n qǐng: ['庼', '廎', '檾', '漀', '苘', '請', '謦', '请', '頃', '顷'],\n 'guī wěi huì': ['廆'],\n 'jǐn qín': ['廑'],\n kuò: ['廓', '扩', '拡', '擴', '濶', '筈', '萿', '葀', '蛞', '闊', '阔', '霩', '鞟', '鞹', '韕', '頢', '鬠'],\n 'qiáng sè': ['廧', '薔'],\n 'yǐn yìn': ['廴', '隐', '隠', '隱', '飮', '飲', '饮'],\n 'pò pǎi': ['廹', '迫'],\n 'nòng lòng': ['弄'],\n 'dì tì tuí': ['弟'],\n 'jué zhāng': ['弡'],\n 'mí mǐ': ['弥', '彌', '靡'],\n chāo: ['弨', '怊', '抄', '欩', '訬', '超', '鈔', '钞'],\n yi: ['弬'],\n shāo: ['弰', '旓', '烧', '焼', '燒', '筲', '艄', '萷', '蕱', '輎', '髾', '鮹'],\n 'xuān yuān': ['弲'],\n 'qiáng qiǎng jiàng': ['強', '强'],\n 'tán dàn': ['弹', '醈'],\n biè: ['彆'],\n 'qiáng jiàng qiǎng': ['彊'],\n 'jì xuě': ['彐'],\n tuàn: ['彖', '褖'],\n yuē: ['彟', '曰', '曱', '矱'],\n 'shān xiǎn': ['彡'],\n wén: ['彣', '文', '炆', '珳', '瘒', '繧', '聞', '芠', '蚉', '蚊', '螡', '蟁', '閺', '閿', '闅', '闦', '闻', '阌', '雯', '馼', '駇', '魰', '鳼', '鴍', '鼤', '𫘜'],\n 'péng bāng': ['彭'],\n 'piāo piào': ['彯'],\n 'zhuó bó': ['彴'],\n 'tuǒ yí': ['彵'],\n 'páng fǎng': ['彷'],\n wǎng: ['彺', '往', '徃', '惘', '枉', '棢', '網', '网', '罒', '罓', '罔', '罖', '菵', '蛧', '蝄', '誷', '輞', '辋', '魍'],\n cú: ['徂', '殂'],\n 'dài dāi': ['待'],\n huái: ['徊', '怀', '懐', '懷', '槐', '淮', '耲', '蘹', '褢', '褱', '踝'],\n 'wā wàng jiā': ['徍'],\n 'chěng zhèng': ['徎'],\n 'dé děi de': ['得'],\n 'cóng zòng': ['從'],\n 'shì tǐ': ['徥'],\n 'tí chí': ['徲', '鶗', '鶙'],\n dé: ['徳', '德', '恴', '悳', '惪', '淂', '鍀', '锝'],\n 'zhǐ zhēng': ['徴', '徵'],\n bié: ['徶', '癿', '莂', '蛂', '襒', '蹩'],\n 'chōng zhǒng': ['徸'],\n 'jiǎo jiào': ['徼', '笅', '筊'],\n 'lòng lǒng': ['徿'],\n 'qú jù': ['忂', '渠', '瞿', '螶'],\n 'dìng tìng': ['忊'],\n gǎi: ['忋', '改'],\n rěn: ['忍', '栠', '栣', '秹', '稔', '綛', '荏', '荵', '躵'],\n chàn: ['忏', '懴', '懺', '硟', '羼', '韂', '顫'],\n tè: ['忑', '慝', '特', '蟘', '鋱', '铽'],\n 'tè tēi tuī': ['忒'],\n 'gān hàn': ['忓', '攼'],\n 'yì qì': ['忔'],\n 'tài shì': ['忕'],\n 'xī liě': ['忚'],\n 'yīng yìng': ['応', '應', '譍'],\n 'mǐn wěn mín': ['忞', '忟'],\n 'sōng zhōng': ['忪'],\n 'yù shū': ['忬', '悆'],\n 'qí shì': ['忯', '耆'],\n 'tún zhūn dùn': ['忳'],\n 'qián qín': ['忴', '扲'],\n hún: ['忶', '浑', '渾', '餛', '馄', '魂', '鼲'],\n niǔ: ['忸', '扭', '炄', '狃', '紐', '纽', '莥', '鈕', '钮', '靵'],\n 'kuáng wǎng': ['忹'],\n 'kāng hàng': ['忼'],\n 'kài xì': ['忾', '愾'],\n òu: ['怄', '慪'],\n 'bǎo bào': ['怉'],\n 'mín mén': ['怋'],\n 'zuò zhà': ['怍'],\n zěn: ['怎'],\n yàng: ['怏', '恙', '样', '様', '樣', '漾', '羕', '詇'],\n 'kòu jù': ['怐'],\n 'náo niú': ['怓'],\n 'zhēng zhèng': ['怔', '掙', '钲', '铮'],\n 'tiē zhān': ['怗'],\n 'hù gù': ['怘'],\n 'cū jù zū': ['怚'],\n 'sī sāi': ['思'],\n 'yóu chóu': ['怞'],\n 'tū dié': ['怢'],\n 'yōu yào': ['怮'],\n xuàn: ['怰', '昡', '楦', '泫', '渲', '炫', '琄', '眩', '碹', '絢', '縼', '繏', '绚', '蔙', '衒', '袨', '贙', '鉉', '鏇', '铉', '镟', '颴'],\n 'xù xuè': ['怴'],\n 'bì pī': ['怶'],\n 'xī shù': ['怸'],\n 'nèn nín': ['恁'],\n 'tiāo yáo': ['恌'],\n 'xī qī xù': ['恓'],\n 'xiào jiǎo': ['恔'],\n 'hū kuā': ['恗'],\n nǜ: ['恧', '朒', '衂', '衄'],\n hèn: ['恨'],\n 'dòng tōng': ['恫'],\n 'quán zhuān': ['恮'],\n 'è wù ě wū': ['恶', '惡'],\n tòng: ['恸', '慟', '憅', '痛', '衕'],\n 'yuān juàn': ['悁'],\n 'qiāo qiǎo': ['悄'],\n 'jiè kè': ['悈'],\n 'hào jiào': ['悎'],\n huǐ: ['悔', '檓', '毀', '毁', '毇', '燬', '譭'],\n 'mán mèn': ['悗', '鞔'],\n 'yī yì': ['悘', '衣'],\n quān: ['悛', '箞', '鐉', '𨟠'],\n 'kuī lǐ': ['悝'],\n 'yì niàn': ['悥'],\n 'mèn mēn': ['悶'],\n guàn: ['悹', '悺', '惯', '慣', '掼', '摜', '樌', '欟', '泴', '涫', '潅', '灌', '爟', '瓘', '盥', '礶', '祼', '罆', '罐', '貫', '贯', '躀', '遦', '鏆', '鑵', '鱹', '鸛', '鹳'],\n 'kōng kǒng': ['悾'],\n 'lǔn lùn': ['惀'],\n guǒ: ['惈', '果', '椁', '槨', '粿', '綶', '菓', '蜾', '裹', '褁', '輠', '餜', '馃'],\n 'yuān wǎn': ['惌', '箢'],\n 'lán lín': ['惏'],\n 'yù xù': ['惐', '淢'],\n 'chuò chuì': ['惙'],\n 'hūn mèn': ['惛'],\n 'chǎng tǎng': ['惝'],\n 'suǒ ruǐ': ['惢'],\n cǎn: ['惨', '慘', '憯', '黪', '黲', '䅟'],\n cán: ['惭', '慙', '慚', '残', '殘', '蚕', '蝅', '蠶', '蠺'],\n 'dàn dá': ['惮', '憚'],\n rě: ['惹'],\n 'yú tōu': ['愉'],\n 'kài qì': ['愒'],\n 'dàng táng shāng yáng': ['愓'],\n 'chén xìn dān': ['愖'],\n 'kè qià': ['愘'],\n nuò: ['愞', '懦', '懧', '掿', '搦', '榒', '稬', '穤', '糑', '糥', '糯', '諾', '诺', '蹃', '逽', '鍩', '锘'],\n gǎn: ['感', '擀', '敢', '桿', '橄', '澉', '澸', '皯', '秆', '稈', '笴', '芉', '衦', '赶', '趕', '鱤', '鳡'],\n 'còng sōng': ['愡'],\n 'sāi sī sǐ': ['愢'],\n 'gōng gòng hǒng': ['愩', '慐'],\n 'shuò sù': ['愬', '洬'],\n 'yáo yào': ['愮'],\n huàng: ['愰', '曂', '榥', '滉', '皝', '皩', '鎤', '㿠'],\n zhěng: ['愸', '抍', '拯', '整', '晸'],\n cǎo: ['愺', '艸', '草', '騲'],\n 'xì xié': ['慀'],\n 'cǎo sāo': ['慅'],\n 'xù chù': ['慉'],\n 'qiè qiàn': ['慊'],\n 'cáo cóng': ['慒'],\n 'ào áo': ['慠'],\n 'lián liǎn': ['慩', '梿', '槤', '櫣'],\n 'jìn qín jǐn': ['慬'],\n 'dì chì': ['慸'],\n 'zhí zhé': ['慹'],\n 'lóu lǚ': ['慺', '鷜'],\n còng: ['憁', '謥'],\n 'zhī zhì': ['憄', '知', '織', '织'],\n chēng: ['憆', '摚', '撐', '撑', '晿', '柽', '棦', '橕', '檉', '泟', '浾', '琤', '瞠', '碀', '緽', '罉', '蛏', '蟶', '赪', '赬', '鏿', '鐣', '阷', '靗', '頳', '饓'],\n biē: ['憋', '虌', '鱉', '鳖', '鼈', '龞'],\n 'chéng dèng zhèng': ['憕'],\n 'xǐ xī': ['憘'],\n 'duì dùn tūn': ['憞'],\n 'xiāo jiāo': ['憢'],\n 'xián xiàn': ['憪'],\n 'liáo liǎo': ['憭', '燎', '爎', '爒'],\n shéng: ['憴', '縄', '繉', '繩', '绳', '譝'],\n 'náo nǎo náng': ['憹'],\n 'jǐng jìng': ['憼'],\n 'jǐ jiǎo': ['憿'],\n 'xuān huān': ['懁'],\n 'cǎo sāo sào': ['懆'],\n mèn: ['懑', '懣', '暪', '焖', '燜'],\n 'mèng méng měng': ['懜'],\n 'ài yì nǐ': ['懝'],\n 'méng měng': ['懞', '瞢', '矒'],\n 'qí jī jì': ['懠'],\n mǒ: ['懡'],\n 'lán xiàn': ['懢'],\n 'yōu yǒu': ['懮'],\n 'liú liǔ': ['懰', '藰'],\n ràng: ['懹', '譲', '讓', '让'],\n huān: ['懽', '欢', '歓', '歡', '獾', '讙', '貛', '酄', '驩', '鴅', '鵍'],\n nǎn: ['戁', '揇', '湳', '煵', '腩', '蝻', '赧'],\n 'mí mó': ['戂'],\n 'gàng zhuàng': ['戅', '戆'],\n 'zhuàng gàng': ['戇'],\n 'xū qu': ['戌'],\n 'xì hū': ['戏', '戯', '戲'],\n 'jiá gā': ['戛'],\n zéi: ['戝', '蠈', '賊', '贼', '鰂', '鱡', '鲗'],\n děng: ['戥', '等'],\n 'hū xì': ['戱'],\n chuō: ['戳', '踔', '逴'],\n 'biǎn piān': ['扁'],\n 'shǎng jiōng': ['扄'],\n 'shàn shān': ['扇'],\n cái: ['才', '材', '纔', '裁', '財', '财'],\n 'zhā zā zhá': ['扎'],\n 'lè lì cái': ['扐'],\n 'bā pá': ['扒'],\n 'dǎ dá': ['打'],\n rēng: ['扔'],\n 'fǎn fú': ['払'],\n 'diǎo dí yuē lì': ['扚'],\n 'káng gāng': ['扛'],\n 'yū wū': ['扜'],\n 'yū wū kū': ['扝'],\n 'tuō chǐ yǐ': ['扡'],\n 'gǔ jié xì gē': ['扢'],\n dèn: ['扥', '扽'],\n 'sǎo sào': ['扫', '掃'],\n rǎo: ['扰', '擾', '隢'],\n 'xī chā qì': ['扱'],\n 'bān pān': ['扳'],\n 'bā ào': ['扷'],\n 'xī zhé': ['扸'],\n 'zhì sǔn kǎn': ['扻'],\n zhǎo: ['找', '沼', '瑵'],\n 'kuáng wǎng zài': ['抂'],\n 'hú gǔ': ['抇', '鹄', '鹘'],\n 'bǎ bà': ['把'],\n 'dǎn shěn': ['抌'],\n 'nè nì ruì nà': ['抐'],\n zhuā: ['抓', '檛', '簻', '膼', '髽'],\n póu: ['抔', '裒'],\n 'zhé shé zhē': ['折'],\n 'póu pōu fū': ['抙', '捊'],\n pāo: ['抛', '拋', '脬', '萢'],\n 'ǎo ào niù': ['抝'],\n 'lūn lún': ['抡', '掄'],\n 'qiǎng qiāng chēng': ['抢'],\n 'zhǐ zhǎi': ['抧'],\n 'bù pū': ['抪', '柨'],\n 'yǎo tāo': ['抭'],\n 'hē hè qiā': ['抲'],\n 'nǐ ní': ['抳'],\n 'pī pēi': ['抷'],\n 'mǒ mò mā': ['抹'],\n chōu: ['抽', '犨', '犫', '瘳', '篘'],\n 'jiā yá': ['拁'],\n 'fú bì': ['拂', '畐', '鶝'],\n zhǎ: ['拃', '眨', '砟', '鮺', '鲝'],\n 'dān dàn dǎn': ['担'],\n 'chāi cā': ['拆'],\n niān: ['拈', '蔫'],\n 'lā lá lǎ là': ['拉'],\n 'bàn pàn': ['拌'],\n pāi: ['拍'],\n līn: ['拎'],\n guǎi: ['拐', '枴', '柺'],\n 'tuò tà zhí': ['拓'],\n 'ào ǎo niù': ['拗'],\n 'jū gōu': ['拘'],\n 'pīn pàn fān': ['拚'],\n 'bài bái': ['拜'],\n bài: ['拝', '敗', '稗', '粺', '薭', '贁', '败', '韛'],\n qiá: ['拤'],\n 'nǐng níng nìng': ['拧'],\n 'zé zhái': ['择', '擇'],\n hén: ['拫', '痕', '鞎'],\n 'kuò guā': ['括'],\n 'jié jiá': ['拮'],\n nǐn: ['拰'],\n shuān: ['拴', '栓', '閂', '闩'],\n 'cún zùn': ['拵'],\n 'zā zǎn': ['拶', '桚'],\n kǎo: ['拷', '攷', '栲', '烤', '考'],\n 'yí chǐ hài': ['拸'],\n 'cè sè chuò': ['拺'],\n 'zhuài zhuāi yè': ['拽'],\n 'shí shè': ['拾'],\n bāi: ['挀', '掰'],\n 'kuò guāng': ['挄'],\n nòng: ['挊', '挵', '齈'],\n 'jiào jiāo': ['挍', '敎', '教'],\n 'kuà kū': ['挎'],\n 'ná rú': ['挐'],\n 'tiāo tiǎo': ['挑'],\n 'dié shè': ['挕'],\n liě: ['挘', '毟'],\n 'yà yǎ': ['挜', '掗'],\n 'wō zhuā': ['挝'],\n 'xié jiā': ['挟', '挾'],\n 'dǎng dàng': ['挡', '擋'],\n 'zhèng zhēng': ['挣', '正', '症'],\n 'āi ái': ['挨'],\n 'tuō shuì': ['挩', '捝'],\n 'tǐ tì': ['挮'],\n 'suō shā': ['挱'],\n 'sā shā suō': ['挲'],\n 'kēng qiān': ['挳', '摼'],\n 'bàng péng': ['挷'],\n 'ruó ruá': ['挼'],\n 'jiǎo kù': ['捁'],\n 'wǔ wú': ['捂'],\n tǒng: ['捅', '桶', '筒', '筩', '統', '綂', '统', '㛚'],\n 'huò chì': ['捇'],\n 'tú shū chá': ['捈'],\n 'lǚ luō': ['捋'],\n 'shāo shào': ['捎', '稍'],\n niē: ['捏', '揑'],\n 'shù sǒng sōu': ['捒'],\n 'yé yú': ['捓'],\n 'jué zhuó': ['捔'],\n 'bù pú zhì': ['捗'],\n zùn: ['捘', '銌'],\n lāo: ['捞', '撈', '粩'],\n sǔn: ['损', '損', '榫', '笋', '筍', '箰', '鎨', '隼'],\n 'wàn wǎn wān yù': ['捥'],\n pěng: ['捧', '淎', '皏'],\n shě: ['捨'],\n 'fǔ fù bǔ': ['捬'],\n dáo: ['捯'],\n 'luò luǒ wǒ': ['捰'],\n 'juǎn quán': ['捲'],\n 'chēn tiǎn': ['捵'],\n 'niǎn niē': ['捻'],\n 'ruó wěi ré': ['捼'],\n zuó: ['捽', '昨', '秨', '稓', '筰', '莋', '鈼'],\n 'wò xiá': ['捾'],\n 'qìng qiàn': ['掅'],\n 'póu pǒu': ['掊'],\n qiā: ['掐', '葜'],\n 'pái pǎi': ['排'],\n 'qiān wàn': ['掔'],\n 'yè yē': ['掖'],\n 'niè nǐ yì': ['掜'],\n 'huò xù': ['掝'],\n 'yàn shàn yǎn': ['掞'],\n 'zhěng dìng': ['掟'],\n kòng: ['控', '鞚'],\n tuī: ['推', '蓷', '藬'],\n 'zōu zhōu chōu': ['掫'],\n tiàn: ['掭', '舚'],\n kèn: ['掯', '裉', '褃'],\n pá: ['掱', '杷', '潖', '爬', '琶', '筢'],\n 'guó guāi': ['掴'],\n 'dǎn shàn': ['掸', '撣'],\n 'chān xiān càn shǎn': ['掺'],\n sāo: ['掻', '搔', '溞', '繅', '缫', '螦', '騒', '騷', '鰠', '鱢', '鳋'],\n pèng: ['掽', '椪', '槰', '碰', '踫'],\n 'zhēng kēng': ['揁'],\n 'jiū yóu': ['揂'],\n 'jiān jiǎn': ['揃', '籛'],\n 'pì chè': ['揊'],\n 'sāi zǒng cāi': ['揌'],\n 'tí dī dǐ': ['提'],\n 'zǒng sōng': ['揔'],\n 'huáng yóng': ['揘'],\n 'zǎn zuàn': ['揝'],\n 'xū jū': ['揟'],\n 'ké qiā': ['揢'],\n 'chuāi chuǎi chuài tuán zhuī': ['揣'],\n 'dì tì': ['揥'],\n 'lá là': ['揦'],\n là: ['揧', '楋', '溂', '瓎', '瘌', '翋', '臘', '蝋', '蝲', '蠟', '辢', '辣', '鑞', '镴', '鬎', '鯻', '𬶟'],\n 'jiē qì': ['揭'],\n 'chòng dǒng': ['揰'],\n 'dié shé yè': ['揲'],\n 'jiàn qián jiǎn': ['揵'],\n yé: ['揶', '爷', '爺', '瑘', '鋣', '鎁', '铘'],\n chān: ['搀', '摻', '攙', '裧', '襜', '覘', '觇', '辿', '鋓'],\n 'gē gé': ['搁', '擱'],\n 'lǒu lōu': ['搂', '摟'],\n 'chōu zǒu': ['搊'],\n chuāi: ['搋'],\n sūn: ['搎', '槂', '狲', '猻', '荪', '蓀', '蕵', '薞', '飧', '飱'],\n 'róng náng nǎng': ['搑'],\n 'péng bàng': ['搒'],\n cuō: ['搓', '瑳', '磋', '蹉', '遳', '醝'],\n 'kē è': ['搕'],\n 'nù nuò nòu': ['搙'],\n 'lā xié xiàn': ['搚'],\n qiǔ: ['搝', '糗'],\n 'xiǎn xiān': ['搟'],\n 'jié zhé': ['搩'],\n 'pán bān pó': ['搫'],\n bān: ['搬', '攽', '斑', '斒', '班', '瘢', '癍', '肦', '螁', '螌', '褩', '辬', '頒', '颁', '𨭉'],\n 'zhì nái': ['搱'],\n 'wā wǎ wà': ['搲'],\n huá: ['搳', '撶', '滑', '猾', '蕐', '螖', '譁', '鏵', '铧', '驊', '骅', '鷨'],\n 'qiāng qiǎng chēng': ['搶'],\n 'tián shēn': ['搷'],\n 'ná nuò': ['搻'],\n èn: ['摁'],\n 'shè niè': ['摄', '攝'],\n bìn: ['摈', '擯', '殡', '殯', '膑', '臏', '髌', '髕', '髩', '鬂', '鬓', '鬢'],\n 'shā sà shǎi': ['摋'],\n 'chǎn sùn': ['摌'],\n 'jiū liú liáo jiǎo náo': ['摎'],\n 'féng pěng': ['摓'],\n shuāi: ['摔'],\n 'dì tú zhí': ['摕'],\n 'qì jì chá': ['摖'],\n 'sōu sǒng': ['摗'],\n 'liǎn liàn': ['摙'],\n 'gài xì': ['摡'],\n 'hù chū': ['摢'],\n tàng: ['摥', '烫', '燙', '鐋'],\n 'nái zhì': ['摨'],\n 'mó mā': ['摩'],\n 'jiāng qiàng': ['摪'],\n 'áo qiáo': ['摮'],\n 'niè chè': ['摰'],\n 'mán màn': ['摱'],\n 'chàn cán': ['摲'],\n 'sè mí sù': ['摵'],\n 'biāo biào': ['摽'],\n 'juē jué': ['撅'],\n piē: ['撆', '暼', '氕', '瞥'],\n 'piě piē': ['撇'],\n 'zǎn zān zēn qián': ['撍'],\n 'sā sǎ': ['撒'],\n hòng: ['撔', '訌', '讧', '闀', '鬨'],\n 'héng guàng': ['撗'],\n niǎn: ['撚', '撵', '攆', '涊', '焾', '碾', '簐', '蹍', '蹨', '躎', '輦', '辇'],\n 'chéng zhěng': ['撜'],\n 'huī wéi': ['撝'],\n cāo: ['撡', '操', '糙'],\n 'xiāo sōu': ['撨'],\n 'liáo liāo': ['撩'],\n 'cuō zuǒ': ['撮'],\n 'wěi tuǒ': ['撱'],\n cuān: ['撺', '攛', '汆', '蹿', '躥', '鑹', '镩'],\n 'qiào yāo jī': ['撽'],\n 'zhuā wō': ['撾'],\n 'lèi léi': ['擂'],\n nǎng: ['擃', '攮', '曩', '灢'],\n 'qíng jǐng': ['擏'],\n kuǎi: ['擓', '蒯', '㧟'],\n 'pǐ bò': ['擗'],\n 'bò bāi': ['擘'],\n 'jù jǐ': ['據'],\n mēng: ['擝'],\n 'sǒu sòu': ['擞'],\n xǐng: ['擤', '箵', '醒'],\n cā: ['擦'],\n 'níng nǐng nìng': ['擰'],\n 'zhì jié': ['擳'],\n 'là liè': ['擸', '爉'],\n 'sòu sǒu': ['擻'],\n 'lì luò yuè': ['擽'],\n 'tī zhāi zhì': ['擿'],\n pān: ['攀', '潘', '眅', '萠'],\n lèi: ['攂', '泪', '涙', '淚', '禷', '类', '纇', '蘱', '酹', '銇', '錑', '頛', '頪', '類', '颣'],\n 'cā sǎ': ['攃'],\n 'jùn pèi': ['攈'],\n 'lì luò': ['攊', '躒'],\n 'là lài': ['攋', '櫴'],\n 'lú luó': ['攎'],\n 'zǎn cuán': ['攒'],\n 'xiān jiān': ['攕'],\n 'mí mǐ mó': ['攠'],\n 'zǎn cuán zàn zuān': ['攢'],\n zuàn: ['攥'],\n 'lì shài': ['攦'],\n 'lì luǒ': ['攭'],\n 'guǐ guì': ['攱'],\n 'jī qī yǐ': ['攲'],\n fàng: ['放'],\n 'wù móu': ['敄'],\n 'chù shōu': ['敊'],\n 'gé guó è': ['敋'],\n 'duó duì': ['敓', '敚'],\n 'duō què': ['敠', '敪'],\n 'sàn sǎn': ['散'],\n 'dūn duì': ['敦', '镦'],\n 'qī yǐ jī': ['敧'],\n 'xiào xué': ['敩'],\n 'shù shǔ shuò': ['数', '數'],\n 'ái zhú': ['敱', '敳'],\n 'xiòng xuàn': ['敻'],\n 'zhuó zhú': ['斀'],\n 'yì dù': ['斁'],\n 'lí tái': ['斄'],\n 'fěi fēi': ['斐'],\n 'yǔ zhōng': ['斔'],\n 'dòu dǒu': ['斗'],\n 'wò guǎn': ['斡'],\n 'tǒu tiǎo': ['斢'],\n dòu: ['斣', '梪', '浢', '痘', '窦', '竇', '脰', '荳', '豆', '逗', '郖', '酘', '閗', '闘', '餖', '饾', '鬥', '鬦', '鬪', '鬬', '鬭'],\n 'yín zhì': ['斦'],\n 'chǎn jiè': ['斺'],\n 'wū yū yú': ['於'],\n 'yóu liú': ['斿'],\n 'páng bàng': ['旁'],\n 'máo mào': ['旄'],\n 'pī bì': ['旇'],\n 'xuán xuàn': ['旋'],\n 'wú mó': ['无'],\n zǎo: ['早', '枣', '栆', '棗', '澡', '璪', '薻', '藻', '蚤'],\n gā: ['旮'],\n 'gàn hàn': ['旰'],\n 'tái yīng': ['旲'],\n 'xū xù': ['旴'],\n 'tūn zhùn': ['旽'],\n 'wù wǔ': ['旿'],\n 'pò pèi': ['昢'],\n zòng: ['昮', '猔', '疭', '瘲', '粽', '糉', '糭', '縦'],\n ǎi: ['昹', '毐', '矮', '蔼', '藹', '譪', '躷', '霭', '靄'],\n 'huàng huǎng': ['晃'],\n xuǎn: ['晅', '癣', '癬', '选', '選'],\n 'xù kuā': ['晇'],\n hǒng: ['晎'],\n shài: ['晒', '曬'],\n 'yūn yùn': ['晕', '煴'],\n 'shèng chéng': ['晟', '椉', '盛'],\n 'jǐng yǐng': ['景'],\n shǎn: ['晱', '熌', '睒', '覢', '閃', '闪', '陕', '陝'],\n 'qǐ dù': ['晵'],\n 'ǎn àn yǎn': ['晻'],\n 'wǎng wàng': ['暀'],\n zàn: ['暂', '暫', '瓉', '瓒', '瓚', '禶', '襸', '讃', '讚', '賛', '贊', '赞', '蹔', '鄼', '錾', '鏨', '饡'],\n 'yùn yūn': ['暈'],\n 'mín mǐn': ['暋'],\n 'dǔ shǔ': ['暏'],\n shǔ: ['暑', '曙', '潻', '癙', '糬', '署', '薥', '薯', '藷', '蜀', '蠴', '襡', '襩', '鱪', '鱰', '黍', '鼠', '鼡'],\n 'jiǎn lán': ['暕'],\n nuǎn: ['暖', '煗', '餪'],\n 'bào pù': ['暴'],\n 'xī xǐ': ['暿'],\n 'pù bào': ['曝', '瀑'],\n 'qū qǔ': ['紶'],\n 'qǔ qū': ['曲'],\n 'gèng gēng': ['更'],\n 'hū hù': ['曶', '雽'],\n 'zēng céng': ['曽', '橧'],\n 'céng zēng': ['曾', '竲'],\n 'cǎn qián jiàn': ['朁'],\n 'qiè hé': ['朅'],\n 'bì pí': ['朇', '禆', '笓', '裨'],\n 'yǒu yòu': ['有'],\n 'bān fén': ['朌', '鳻'],\n 'fú fù': ['服', '洑'],\n 'fěi kū': ['朏', '胐'],\n 'qú xù chǔn': ['朐'],\n 'juān zuī': ['朘'],\n 'huāng máng wáng': ['朚'],\n 'qī jī': ['期'],\n 'tóng chuáng': ['朣', '橦'],\n zhá: ['札', '牐', '箚', '蚻', '譗', '鍘', '铡', '閘', '闸'],\n 'zhú shù shú': ['朮'],\n 'shù shú zhú': ['术'],\n 'zhū shú': ['朱'],\n 'pǔ pò pō piáo': ['朴'],\n 'dāo tiáo mù': ['朷'],\n 'guǐ qiú': ['朹'],\n xiǔ: ['朽', '滫', '潃', '糔'],\n 'chéng chēng': ['朾'],\n zá: ['杂', '沯', '砸', '襍', '雑', '雜', '雥', '韴'],\n 'yú wū': ['杅'],\n 'gān gǎn': ['杆'],\n 'chā chà': ['杈'],\n 'shān shā': ['杉'],\n cūn: ['村', '皴', '竴', '膥', '踆', '邨'],\n 'rèn ér': ['杒', '梕'],\n 'sháo biāo': ['杓'],\n 'dì duò': ['杕', '枤'],\n 'gū gài': ['杚'],\n 'yí zhì lí duò': ['杝'],\n 'gàng gāng': ['杠'],\n 'tiáo tiāo': ['条', '條'],\n 'mà mǎ': ['杩'],\n 'sì zhǐ xǐ': ['杫'],\n 'yuán wán': ['杬', '蚖'],\n 'bèi fèi': ['杮'],\n 'shū duì': ['杸'],\n 'niǔ chǒu': ['杻'],\n 'wò yuè': ['枂', '臒'],\n máo: ['枆', '毛', '氂', '渵', '牦', '矛', '罞', '茅', '茆', '蝥', '蟊', '軞', '酕', '鉾', '錨', '锚', '髦', '鶜'],\n 'pī mì': ['枈'],\n àng: ['枊', '盎', '醠'],\n 'fāng bìng': ['枋'],\n 'hù dǐ': ['枑'],\n xín: ['枔', '襑', '鐔', '鬵'],\n 'yāo yǎo': ['枖'],\n 'ě è': ['枙'],\n 'zhī qí': ['枝'],\n 'cōng zōng': ['枞', '樅'],\n 'xiān zhēn': ['枮'],\n 'tái sì': ['枱'],\n 'gǒu jǔ gōu': ['枸'],\n 'bāo fú': ['枹'],\n 'yì xiè': ['枻', '栧'],\n 'tuó duò': ['柁', '馱', '駄', '驮'],\n 'yí duò lí': ['柂'],\n 'nǐ chì': ['柅'],\n 'pán bàn': ['柈', '跘'],\n 'yǎng yàng yāng yīng': ['柍'],\n 'fù fū fǔ': ['柎'],\n 'bǎi bó bò': ['柏'],\n mǒu: ['某'],\n 'sháo shào': ['柖'],\n zhè: ['柘', '樜', '浙', '淛', '蔗', '蟅', '這', '鷓', '鹧', '䗪'],\n 'yòu yóu': ['柚', '櫾'],\n 'guì jǔ': ['柜'],\n 'zhà zuò': ['柞'],\n 'dié zhì': ['柣', '眰'],\n 'zhā zǔ zū': ['柤'],\n 'chá zhā': ['查', '査'],\n 'āo ào': ['柪', '軪'],\n 'bā fú pèi bó biē': ['柭'],\n 'duò zuó wù': ['柮'],\n 'bì bié': ['柲'],\n 'zhù chù': ['柷'],\n 'bēi pēi': ['柸'],\n 'shì fèi': ['柹'],\n 'shān zhà shi cè': ['栅'],\n 'lì yuè': ['栎', '櫟'],\n 'qì qiè': ['栔', '砌'],\n 'qī xī': ['栖', '蹊'],\n 'guā kuò': ['栝'],\n 'bīng bēn': ['栟'],\n 'xiào jiào': ['校'],\n 'jiàn zùn': ['栫', '袸'],\n 'yǒu yù': ['栯'],\n 'hé hú': ['核'],\n gēn: ['根', '跟'],\n 'zhī yì': ['栺'],\n 'gé gē': ['格'],\n 'héng háng': ['桁'],\n 'guàng guāng': ['桄'],\n 'yí tí': ['桋', '荑'],\n sāng: ['桑', '桒', '槡'],\n 'jú jié': ['桔'],\n 'yú móu': ['桙'],\n 'ráo náo': ['桡', '橈'],\n 'guì huì': ['桧', '檜'],\n 'chén zhèn': ['桭'],\n 'tīng yíng': ['桯'],\n 'bó po': ['桲'],\n 'bèn fàn': ['桳'],\n 'fēng fèng': ['桻', '葑'],\n 'sù yìn': ['梀'],\n 'tǐng tìng': ['梃'],\n 'xuān juān xié': ['梋'],\n 'tú chá': ['梌'],\n 'āo yòu': ['梎'],\n kuǎn: ['梡', '欵', '款', '歀'],\n 'shāo sào': ['梢'],\n 'qín chén cén': ['梣'],\n 'lí sì qǐ': ['梩'],\n 'chān yán': ['梴'],\n 'bīn bīng': ['梹', '槟', '檳'],\n 'táo chóu dào': ['梼'],\n 'cōng sōng': ['棇'],\n 'gùn hùn': ['棍'],\n 'dé zhé': ['棏'],\n 'pái bèi pèi': ['棑'],\n 'bàng pǒu bèi bēi': ['棓'],\n 'dì dài tì': ['棣'],\n sēn: ['森', '椮', '槮', '襂'],\n 'rěn shěn': ['棯'],\n 'léng lēng líng': ['棱'],\n 'fú sù': ['棴'],\n 'zōu sǒu': ['棷'],\n zōu: ['棸', '箃', '緅', '諏', '诹', '邹', '郰', '鄒', '鄹', '陬', '騶', '驺', '鯫', '鲰', '黀', '齱', '齺'],\n 'zhào zhuō': ['棹'],\n 'chēn shēn': ['棽'],\n 'jiē qiè': ['椄'],\n 'yǐ yī': ['椅'],\n 'chóu zhòu diāo': ['椆'],\n 'qiāng kōng': ['椌'],\n 'zhuī chuí': ['椎'],\n 'bēi pí': ['椑'],\n mēn: ['椚'],\n 'quān juàn quán': ['椦'],\n 'duǒ chuán': ['椯'],\n 'wěi huī': ['椲'],\n 'jiǎ jiā': ['椵'],\n 'hán jiān': ['椷'],\n 'shèn zhēn': ['椹'],\n 'yàn yà': ['椻'],\n 'zhā chá': ['楂'],\n 'guō kuǎ': ['楇'],\n 'jí zhì': ['楖'],\n 'kǔ hù': ['楛'],\n 'yóu yǒu': ['楢'],\n 'sǒng cōng': ['楤'],\n 'yuán xuàn': ['楥'],\n 'yǎng yàng yīng': ['楧'],\n pián: ['楩', '胼', '腁', '賆', '蹁', '駢', '騈', '骈', '骿', '㛹'],\n 'dié yè': ['楪'],\n 'dùn shǔn': ['楯'],\n 'còu zòu': ['楱'],\n 'dì dǐ shì': ['楴'],\n 'kǎi jiē': ['楷'],\n 'róu ròu': ['楺'],\n 'lè yuè': ['楽'],\n 'wēn yùn': ['榅', '鞰'],\n lǘ: ['榈', '櫚', '氀', '膢', '藘', '閭', '闾', '驢', '驴'],\n shén: ['榊', '神', '鉮', '鰰', '𬬹'],\n 'bī pi': ['榌'],\n 'zhǎn niǎn zhèn': ['榐'],\n 'fú fù bó': ['榑'],\n 'jiàn jìn': ['榗'],\n 'bǎng bàng': ['榜'],\n 'shā xiè': ['榝', '樧'],\n nòu: ['槈', '耨', '鎒', '鐞'],\n 'qiǎn lián xiàn': ['槏'],\n gàng: ['槓', '焵', '焹', '筻', '鿍'],\n gāo: ['槔', '槹', '橰', '櫜', '睾', '篙', '糕', '羔', '臯', '韟', '餻', '高', '髙', '鷎', '鷱', '鼛'],\n 'diān zhěn zhēn': ['槙'],\n 'kǎn jiàn': ['槛'],\n 'xí dié': ['槢'],\n 'jī guī': ['槣'],\n 'róng yōng': ['槦'],\n 'tuán shuàn quán': ['槫'],\n 'qì sè': ['槭'],\n 'cuī zhǐ': ['槯'],\n 'yǒu chǎo': ['槱'],\n 'màn wàn': ['槾'],\n 'lí chī': ['樆'],\n 'léi lěi': ['樏', '櫑', '礌'],\n 'cháo jiǎo chāo': ['樔'],\n 'chēng táng': ['樘'],\n 'jiū liáo': ['樛'],\n 'mó mú': ['模'],\n 'niǎo mù': ['樢'],\n 'héng hèng': ['横', '橫'],\n xuě: ['樰', '膤', '艝', '轌', '雪', '鱈', '鳕'],\n 'fá fèi': ['橃'],\n rùn: ['橍', '润', '潤', '膶', '閏', '閠', '闰'],\n 'zhǎn jiǎn': ['橏'],\n shùn: ['橓', '瞚', '瞬', '舜', '蕣', '順', '顺', '鬊'],\n 'tuí dūn': ['橔'],\n 'táng chēng': ['橖'],\n 'sù qiū': ['橚'],\n 'tán diàn': ['橝'],\n 'fén fèn fèi': ['橨'],\n 'rǎn yān': ['橪'],\n 'cū chu': ['橻'],\n 'shū qiāo': ['橾'],\n 'píng bò': ['檘'],\n 'zhái shì tú': ['檡'],\n 'biǎo biāo': ['檦'],\n 'qiān lián': ['檶'],\n 'nǐ mí': ['檷'],\n 'jiàn kǎn': ['檻'],\n 'nòu ruǎn rú': ['檽'],\n 'jī jì': ['櫅', '禨'],\n 'huǎng guǒ gǔ': ['櫎'],\n 'lǜ chū': ['櫖'],\n 'miè mèi': ['櫗'],\n ōu: ['櫙', '欧', '歐', '殴', '毆', '瓯', '甌', '膒', '藲', '謳', '讴', '鏂', '鴎', '鷗', '鸥'],\n 'zhù zhuó': ['櫡'],\n 'jué jì': ['櫭'],\n 'huái guī': ['櫰'],\n 'chán zhàn': ['欃'],\n 'wéi zuì': ['欈'],\n cáng: ['欌', '鑶'],\n 'yù yì': ['欥'],\n 'chù qù xì': ['欪'],\n 'kài ài': ['欬'],\n 'yì yīn': ['欭'],\n 'xì kài': ['欯'],\n 'shuò sòu': ['欶'],\n 'ǎi ēi éi ěi èi ê̄ ế ê̌ ề': ['欸'],\n 'qī yī': ['欹'],\n 'chuā xū': ['欻'],\n 'chǐ chuài': ['欼'],\n 'kǎn qiàn': ['欿'],\n 'kǎn kè': ['歁'],\n 'chuǎn chuán': ['歂'],\n 'yīn yān': ['歅'],\n 'jìn qūn': ['歏'],\n pēn: ['歕'],\n 'xū chuā': ['歘'],\n 'xī shè': ['歙'],\n 'liǎn hān': ['歛'],\n 'zhì chí': ['歭'],\n 'sè shà': ['歰'],\n sǐ: ['死'],\n 'wěn mò': ['歾'],\n piǎo: ['殍', '皫', '瞟', '醥', '顠'],\n 'qíng jìng': ['殑'],\n 'fǒu bó': ['殕'],\n 'zhí shi': ['殖'],\n 'yè yān yàn': ['殗'],\n 'hūn mèi': ['殙'],\n chòu: ['殠', '臰', '遚'],\n 'kuì huì': ['殨', '溃', '潰'],\n cuàn: ['殩', '熶', '爨', '窜', '竄', '篡', '簒'],\n 'yīn yān yǐn': ['殷'],\n 'qìng kēng shēng': ['殸'],\n 'yáo xiáo xiào': ['殽'],\n 'gū gǔ': ['毂', '蛄'],\n 'guàn wān': ['毌'],\n 'dú dài': ['毒'],\n 'xún xùn': ['毥'],\n mú: ['毪', '氁'],\n 'dòu nuò': ['毭'],\n 'sāi suī': ['毸'],\n lu: ['氇'],\n sào: ['氉', '瘙', '矂', '髞'],\n 'shì zhī': ['氏'],\n 'dī dǐ': ['氐'],\n 'máng méng': ['氓'],\n 'yáng rì': ['氜'],\n shuǐ: ['水', '氵', '氺', '閖'],\n 'zhěng chéng zhèng': ['氶'],\n tǔn: ['氽'],\n 'fán fàn': ['氾'],\n 'guǐ jiǔ': ['氿'],\n 'bīn pà pā': ['汃'],\n 'zhuó què': ['汋'],\n 'dà tài': ['汏'],\n pìn: ['汖', '牝', '聘'],\n 'hàn hán': ['汗', '馯'],\n tu: ['汢'],\n 'tāng shāng': ['汤', '湯'],\n 'zhī jì': ['汥'],\n 'gàn hán cén': ['汵'],\n 'wèn mén': ['汶'],\n 'fāng pāng': ['汸'],\n 'hǔ huǎng': ['汻'],\n 'niú yóu': ['汼'],\n hàng: ['沆'],\n 'shěn chén': ['沈'],\n 'dùn zhuàn': ['沌'],\n 'nǜ niǔ': ['沑'],\n 'méi mò': ['沒', '没'],\n 'tà dá': ['沓'],\n 'mì wù': ['沕'],\n 'hóng pāng': ['沗'],\n 'shā shà': ['沙'],\n 'zhuǐ zǐ': ['沝'],\n 'ōu òu': ['沤', '漚'],\n 'jǔ jù': ['沮'],\n 'tuō duó': ['沰'],\n 'mǐ lì': ['沵'],\n 'yí chí': ['沶'],\n 'xiè yì': ['泄'],\n 'bó pō': ['泊'],\n 'mì bì': ['泌', '秘'],\n 'chù shè': ['泏'],\n 'yōu yòu āo': ['泑'],\n 'pēng píng': ['泙', '硑'],\n 'pào pāo': ['泡'],\n 'ní nì': ['泥', '秜'],\n 'yuè sà': ['泧'],\n 'jué xuè': ['泬', '疦'],\n 'lóng shuāng': ['泷', '瀧'],\n 'luò pō': ['泺', '濼'],\n 'zé shì': ['泽', '澤'],\n 'sǎ xǐ': ['洒'],\n 'sè qì zì': ['洓'],\n 'xǐ xiǎn': ['洗'],\n 'kǎo kào': ['洘'],\n 'àn yàn è': ['洝'],\n 'lěi lèi': ['洡'],\n 'qiè jié': ['洯'],\n 'qiǎn jiān': ['浅'],\n 'jì jǐ': ['济', '済', '濟', '纪'],\n 'hǔ xǔ': ['浒', '滸'],\n 'jùn xùn': ['浚', '濬'],\n 'yǐng chéng yíng': ['浧'],\n 'liàn lì': ['浰'],\n 'féng hóng': ['浲', '溄'],\n 'jiǒng jiōng': ['浻'],\n 'suī něi': ['浽'],\n 'yǒng chōng': ['涌'],\n 'tūn yūn': ['涒'],\n 'wō guō': ['涡', '渦'],\n hēng: ['涥', '脝'],\n 'zhǎng zhàng': ['涨', '漲'],\n 'shòu tāo': ['涭'],\n shuàn: ['涮', '腨'],\n 'kōng náng': ['涳'],\n 'wò wǎn yuān': ['涴'],\n 'tuō tuò': ['涶'],\n wō: ['涹', '猧', '窝', '窩', '莴', '萵', '蜗', '蝸', '踒'],\n 'qiè jí': ['淁'],\n 'guǒ guàn': ['淉'],\n 'lín lìn': ['淋', '獜', '疄'],\n 'tǎng chǎng': ['淌'],\n 'nào chuò zhuō': ['淖'],\n 'péng píng': ['淜'],\n féi: ['淝', '肥', '腓', '蜰'],\n 'pì pèi': ['淠'],\n 'niǎn shěn': ['淰'],\n 'biāo hǔ': ['淲'],\n 'chún zhūn': ['淳'],\n 'hùn hún': ['混'],\n qiǎn: ['淺', '繾', '缱', '肷', '膁', '蜸', '譴', '谴', '遣', '鑓'],\n 'wèn mín': ['渂'],\n 'rè ruò luò': ['渃'],\n 'dú dòu': ['渎', '瀆', '读'],\n 'jiàn jiān': ['渐', '溅', '漸', '濺'],\n 'miǎn shéng': ['渑', '澠'],\n 'nuǎn nuán': ['渜'],\n 'qiú wù': ['渞'],\n 'tíng tīng': ['渟'],\n 'dì tí dī': ['渧'],\n 'gǎng jiǎng': ['港'],\n 'hōng qìng': ['渹'],\n tuān: ['湍', '煓'],\n 'huì mǐn xū': ['湏'],\n 'xǔ xù': ['湑'],\n pén: ['湓', '瓫', '盆', '葐'],\n 'mǐn hūn': ['湣'],\n 'tuàn nuǎn': ['湪'],\n 'qiū jiǎo': ['湫', '湬'],\n 'yān yīn': ['湮'],\n 'bàn pán': ['湴'],\n 'zhuāng hún': ['湷'],\n 'yàn guì': ['溎'],\n 'lián liǎn nián xián xiàn': ['溓'],\n 'dá tǎ': ['溚', '鿎'],\n 'liū liù': ['溜', '澑', '蹓'],\n lùn: ['溣'],\n mǎ: ['溤', '犸', '獁', '玛', '瑪', '码', '碼', '遤', '鎷', '馬', '马', '鰢', '鷌'],\n 'zhēn qín': ['溱'],\n 'nì niào': ['溺'],\n 'chù xù': ['滀', '畜'],\n 'wěng wēng': ['滃'],\n 'hào xuè': ['滈'],\n 'qì xì xiē': ['滊'],\n 'xíng yíng': ['滎'],\n 'zé hào': ['滜'],\n 'piāo piào piǎo': ['漂'],\n 'cóng sǒng': ['漎'],\n 'féng péng': ['漨'],\n 'luò tà': ['漯'],\n 'pēng bēn': ['漰'],\n 'chóng shuāng': ['漴'],\n 'huǒ kuò huò': ['漷'],\n 'liáo liú': ['漻'],\n 'cuǐ cuī': ['漼'],\n 'cóng zǒng': ['潀'],\n 'cóng zōng': ['潈'],\n 'pì piē': ['潎'],\n 'dàng xiàng': ['潒'],\n 'huáng guāng': ['潢'],\n 'liáo lào lǎo': ['潦'],\n 'cōng zòng': ['潨'],\n 'zhí zhì': ['潪'],\n 'tān shàn': ['潬'],\n 'tú zhā': ['潳'],\n 'sàn sǎ': ['潵'],\n hēi: ['潶', '黑', '黒', '𬭶'],\n 'chéng dèng': ['澄', '瀓'],\n 'cūn cún': ['澊'],\n 'péng pēng': ['澎'],\n 'hòng gǒng': ['澒', '銾'],\n 'wàn màn': ['澫'],\n 'kuài huì': ['澮'],\n 'guō wō': ['濄'],\n 'pēn fén': ['濆'],\n 'jí shà': ['濈'],\n 'huì huò': ['濊'],\n 'dǐng tìng': ['濎'],\n 'mǐ nǐ': ['濔'],\n 'bì pì': ['濞'],\n 'cuì zuǐ': ['濢'],\n 'hù huò': ['濩'],\n 'ǎi kài kè': ['濭'],\n 'wěi duì': ['濻', '瀢'],\n 'zàn cuán': ['濽', '灒'],\n 'yǎng yàng': ['瀁'],\n 'wǎng wāng': ['瀇'],\n 'mò miè': ['瀎', '眜'],\n suǐ: ['瀡', '膸', '髓'],\n 'huái wāi': ['瀤'],\n 'zùn jiàn': ['瀳'],\n 'yīng yǐng yìng': ['瀴'],\n 'ráng ràng': ['瀼'],\n shuàng: ['灀'],\n 'zhuó jiào zé': ['灂'],\n sǎ: ['灑', '訯', '靸'],\n 'luán luàn': ['灓'],\n 'dǎng tǎng': ['灙'],\n 'xún quán quàn': ['灥'],\n 'huǒ biāo': ['灬'],\n 'zhà yù': ['灹'],\n 'fén bèn': ['炃'],\n 'jiǒng guì': ['炅'],\n 'pàng fēng': ['炐'],\n quē: ['炔', '缺', '缼', '蒛'],\n biān: ['炞', '煸', '甂', '砭', '笾', '箯', '籩', '編', '编', '蝙', '邉', '邊', '鍽', '鞭', '鯾', '鯿', '鳊'],\n 'zhāo zhào': ['炤'],\n 'zhuō chù': ['炪'],\n 'pào páo bāo': ['炮'],\n 'páo fǒu': ['炰'],\n 'shǎn qián shān': ['炶'],\n 'zhà zhá': ['炸'],\n 'jiǎo yào': ['烄'],\n quǎn: ['烇', '犬', '犭', '畎', '綣', '绻', '虇'],\n 'yàng yáng': ['烊'],\n 'lào luò': ['烙'],\n 'huí huǐ': ['烠'],\n rè: ['热', '熱'],\n 'fú páo': ['烰'],\n 'xiè chè': ['烲', '焎'],\n 'yàn shān': ['烻'],\n 'hūn xūn': ['焄'],\n kào: ['焅', '犒', '銬', '铐', '靠', '鮳', '鯌', '鲓', '㸆'],\n 'juān yè': ['焆'],\n 'jùn qū': ['焌'],\n 'tāo dào': ['焘'],\n 'chǎo jù': ['焣'],\n 'wò ài': ['焥'],\n 'zǒng cōng': ['焧'],\n 'xī yì': ['焬'],\n 'xìn xīn': ['焮'],\n 'chāo zhuō': ['焯'],\n 'xiǒng yīng': ['焸', '焽'],\n kuǐ: ['煃', '跬', '蹞', '頍', '𫠆'],\n 'huī yùn xūn': ['煇'],\n 'jiǎo qiāo': ['煍'],\n 'qián shǎn shān': ['煔'],\n 'xī yí': ['煕'],\n 'shà shā': ['煞'],\n 'yè zhá': ['煠'],\n 'yáng yàng': ['煬'],\n 'ēn yūn': ['煾'],\n 'yūn yǔn': ['熅'],\n 'hè xiāo': ['熇'],\n xióng: ['熊', '熋', '雄'],\n 'xūn xùn': ['熏', '爋'],\n gòng: ['熕', '貢', '贡'],\n liū: ['熘'],\n 'cōng zǒng': ['熜'],\n 'lù āo': ['熝'],\n 'shú shóu': ['熟'],\n 'fēng péng': ['熢'],\n 'cuǐ suī': ['熣'],\n tēng: ['熥', '膯', '鼟'],\n 'yùn yù': ['熨'],\n 'áo āo': ['熬'],\n 'hàn rǎn': ['熯'],\n 'ōu ǒu': ['熰'],\n 'huáng huǎng': ['熿'],\n 'chǎn dǎn chàn': ['燀'],\n 'jiāo zhuó qiáo jué': ['燋'],\n 'yàn yān': ['燕'],\n 'tài liè': ['燤'],\n āo: ['爊'],\n 'yàn xún': ['爓'],\n 'jué jiào': ['爝', '覐', '覚', '覺', '觉'],\n 'lǎn làn': ['爦'],\n 'zhuǎ zhǎo': ['爪'],\n 'zhǎo zhuǎ': ['爫'],\n 'fù fǔ': ['父'],\n diē: ['爹', '褺', '跌'],\n zāng: ['牂', '羘', '臧', '賍', '賘', '贓', '贜', '赃', '髒'],\n 'piàn piān': ['片'],\n 'biān miàn': ['牑'],\n bǎng: ['牓', '綁', '绑'],\n 'yǒu yōng': ['牗'],\n 'chēng chèng': ['牚', '竀'],\n niú: ['牛', '牜'],\n 'jiū lè': ['牞'],\n 'mù móu': ['牟'],\n māng: ['牤'],\n 'gē qiú': ['牫'],\n 'yòu chōu': ['牰'],\n 'tè zhí': ['犆'],\n bēn: ['犇', '錛', '锛'],\n 'jiān qián': ['犍', '玪'],\n má: ['犘', '痲', '蔴', '蟇', '麻'],\n 'máo lí': ['犛'],\n 'bá quǎn': ['犮'],\n 'zhuó bào': ['犳'],\n 'àn hān': ['犴'],\n 'kàng gǎng': ['犺'],\n 'pèi fèi': ['犻'],\n 'fān huān': ['犿'],\n kuáng: ['狂', '狅', '誑', '诳', '軖', '軠', '鵟', '𫛭'],\n 'yí quán chí': ['狋'],\n 'xīng shēng': ['狌'],\n 'tuó yí': ['狏'],\n kǔ: ['狜', '苦'],\n 'huán huān': ['狟'],\n 'hé mò': ['狢'],\n 'tà shì': ['狧'],\n 'máng dòu': ['狵'],\n 'xī shǐ': ['狶'],\n suān: ['狻', '痠', '酸'],\n 'bài pí': ['猈'],\n 'jiān yàn': ['猏', '豣'],\n 'yī yǐ': ['猗'],\n 'yá wèi': ['猚'],\n cāi: ['猜'],\n 'māo máo': ['猫', '貓'],\n 'chuàn chuān': ['猭'],\n 'tuān tuàn': ['猯', '貒'],\n 'yà jiá qiè': ['猰'],\n 'hè xiē gé hài': ['猲'],\n 'biān piàn': ['猵', '獱'],\n 'bó pò': ['猼'],\n 'háo gāo': ['獋'],\n 'fén fèn': ['獖'],\n 'yào xiāo': ['獟'],\n 'shuò xī': ['獡'],\n 'gé liè xiē': ['獦'],\n 'nòu rú': ['獳'],\n 'náo nǎo yōu': ['獶'],\n ráng: ['獽', '瓤', '禳', '穣', '穰', '蘘', '躟', '鬤'],\n 'náo yōu': ['獿'],\n 'lǜ shuài': ['率'],\n 'wáng wàng': ['王'],\n 'yáng chàng': ['玚'],\n 'mín wén': ['玟'],\n 'bīn fēn': ['玢'],\n 'mén yǔn': ['玧'],\n 'qiāng cāng': ['玱', '瑲', '篬'],\n 'án gān': ['玵'],\n 'xuán xián': ['玹'],\n 'cī cǐ': ['玼', '跐'],\n 'yí tāi': ['珆'],\n 'zǔ jù': ['珇'],\n fà: ['珐', '琺', '蕟', '髪', '髮'],\n 'yín kèn': ['珢'],\n 'huī hún': ['珲'],\n 'xuán qióng': ['琁'],\n 'fú fū': ['琈'],\n 'bǐng pín': ['琕'],\n 'cuì sè': ['琗'],\n 'yù wéi': ['琟'],\n 'tiǎn tiàn': ['琠'],\n 'zhuó zuó': ['琢'],\n 'běng pěi': ['琣'],\n guǎn: ['琯', '璭', '痯', '筦', '管', '舘', '輨', '錧', '館', '馆', '鳤'],\n 'hún huī': ['琿'],\n 'xié jiē': ['瑎'],\n 'chàng dàng yáng': ['瑒'],\n 'tiàn zhèn': ['瑱'],\n 'bīn pián': ['瑸', '璸'],\n 'tú shū': ['瑹'],\n cuǐ: ['璀', '皠', '趡'],\n 'zǎo suǒ': ['璅'],\n 'jué qióng': ['璚'],\n 'lú fū': ['璷'],\n 'jì zī': ['璾'],\n suí: ['瓍', '綏', '绥', '遀', '随', '隨', '髄'],\n 'mí xǐ': ['瓕'],\n 'qióng wěi wèi': ['瓗'],\n 'huán yè yà': ['瓛'],\n 'bó páo': ['瓟'],\n 'zhí hú': ['瓡'],\n piáo: ['瓢', '闝'],\n 'wǎ wà': ['瓦'],\n 'xiáng hóng': ['瓨'],\n wèng: ['瓮', '甕', '罋', '蕹', '齆'],\n 'shèn shén': ['甚'],\n ruí: ['甤', '緌', '蕤'],\n yòng: ['用', '砽', '苚', '蒏', '醟', '㶲'],\n shuǎi: ['甩'],\n béng: ['甭', '甮'],\n 'yóu zhá': ['甴'],\n 'diàn tián shèng': ['甸'],\n 'tǐng dīng': ['町', '甼'],\n 'zāi zī': ['甾'],\n 'bì qí': ['畁'],\n 'dá fú': ['畗'],\n 'cè jì': ['畟'],\n 'zāi zī tián': ['畠'],\n 'zhì chóu shì': ['畤'],\n 'fān pān': ['畨', '番'],\n 'shē yú': ['畬'],\n 'dāng dàng dǎng': ['當'],\n 'jiāng qiáng': ['疆'],\n 'pǐ yǎ shū': ['疋'],\n 'jié qiè': ['疌'],\n 'yí nǐ': ['疑'],\n nè: ['疒', '眲', '訥', '讷'],\n 'gē yì': ['疙'],\n 'nüè yào': ['疟', '瘧'],\n 'lì lài': ['疠', '癘'],\n 'yǎ xiā': ['疨'],\n xuē: ['疶', '蒆', '薛', '辥', '辪', '靴', '鞾'],\n 'dǎn da': ['疸'],\n 'fá biǎn': ['疺'],\n 'fèi féi': ['疿', '痱'],\n 'shān diàn': ['痁'],\n 'téng chóng': ['痋'],\n 'tōng tóng': ['痌'],\n 'wěi yòu yù': ['痏'],\n 'tān shǐ': ['痑'],\n 'pū pù': ['痡', '鋪'],\n 'bēng péng': ['痭'],\n 'má lìn': ['痳'],\n 'tiǎn diàn': ['痶'],\n 'ān yè è': ['痷'],\n 'kē ē': ['痾'],\n 'zhì chì': ['瘈'],\n 'jiǎ xiá xiā': ['瘕'],\n 'lěi huì': ['瘣'],\n 'chài cuó': ['瘥'],\n 'diān chēn': ['瘨'],\n 'da dá': ['瘩'],\n 'biě biē': ['瘪'],\n qué: ['瘸'],\n 'dàn dān': ['癉'],\n 'guì wēi': ['癐'],\n 'nòng nóng': ['癑'],\n 'biē biě': ['癟'],\n 'bō bǒ': ['癷'],\n bái: ['白'],\n 'jí bī': ['皀'],\n 'de dì dí dī': ['的'],\n 'pā bà': ['皅'],\n 'gāo háo': ['皋'],\n 'gāo yáo': ['皐'],\n 'lì luò bō': ['皪'],\n 'zhā cǔ': ['皻'],\n 'zhāo zhǎn dǎn': ['皽'],\n 'jiān jiàn': ['监', '監', '鋻', '间', '鞬'],\n 'gài gě hé': ['盖'],\n 'máng wàng': ['盳'],\n yuǎn: ['盶', '逺', '遠'],\n 'tián xián': ['盷'],\n 'xiāng xiàng': ['相'],\n dǔn: ['盹', '趸', '躉'],\n 'xì pǎn': ['盻'],\n 'shěng xǐng': ['省'],\n 'yún hùn': ['眃'],\n 'miǎn miàn': ['眄'],\n 'kàn kān': ['看'],\n 'yìng yāng yǎng': ['眏'],\n 'yǎo āo ǎo': ['眑'],\n 'jū xū kōu': ['眗'],\n 'yí chì': ['眙'],\n 'dié tì': ['眣'],\n 'bǐng fǎng': ['眪'],\n 'pàng pán': ['眫'],\n 'mī mí': ['眯', '瞇'],\n 'xuàn shùn xún': ['眴'],\n tiào: ['眺', '粜', '糶', '覜', '趒'],\n 'zhe zhuó zháo zhāo': ['着'],\n 'qiáo shào xiāo': ['睄'],\n 'cuó zhuài': ['睉'],\n gùn: ['睔', '謴'],\n 'suì zuì': ['睟'],\n 'pì bì': ['睥', '稫', '辟'],\n 'yì zé gāo': ['睪'],\n 'xǐng xìng': ['睲'],\n 'guì wèi kuì': ['瞆'],\n 'kòu jì': ['瞉'],\n 'qióng huán': ['瞏'],\n 'mán mén': ['瞒', '瞞'],\n 'diāo dōu': ['瞗'],\n 'lou lóu lǘ': ['瞜'],\n 'shùn rún': ['瞤'],\n 'liào liǎo': ['瞭', '钌'],\n 'jiàn xián': ['瞯'],\n 'wǔ mí': ['瞴'],\n 'guì kuì': ['瞶'],\n 'nǐng chēng': ['矃'],\n 'huò yuè': ['矆'],\n 'mēng méng': ['矇'],\n 'kuàng guō': ['矌'],\n 'guàn quán': ['矔'],\n 'mǎn mán': ['矕'],\n 'jīn guān qín': ['矜'],\n 'jīn qín guān': ['矝'],\n 'yù xù jué': ['矞'],\n 'jiǎo jiáo': ['矫', '矯'],\n duǎn: ['短'],\n 'shí dàn': ['石'],\n 'gāng qiāng kòng': ['矼'],\n 'huā xū': ['砉'],\n 'pīn bīn fēn': ['砏'],\n 'yán yàn': ['研', '硏'],\n 'luǒ kē': ['砢'],\n 'fú fèi': ['砩', '笰'],\n 'zhǔ zhù': ['砫'],\n 'lá lì lā': ['砬'],\n 'kuāng guāng': ['硄'],\n 'gè luò': ['硌'],\n 'shuò shí': ['硕', '碩'],\n 'wèi wéi ái': ['硙'],\n 'què kè kù': ['硞'],\n 'mǎng bàng': ['硥'],\n 'luò lòng': ['硦'],\n 'yǒng tóng': ['硧'],\n nüè: ['硸', '虐'],\n 'kēng kěng': ['硻'],\n 'yān yǎn': ['硽'],\n 'zhuì chuí duǒ': ['硾'],\n 'kōng kòng': ['硿'],\n 'zòng cóng': ['碂'],\n 'jiān zhàn': ['碊'],\n 'lù liù': ['碌', '陆'],\n 'què xī': ['碏'],\n 'lún lǔn lùn': ['碖'],\n 'náo gāng': ['碙'],\n 'jié yà': ['碣'],\n 'wèi wěi': ['碨'],\n 'tí dī': ['碮'],\n 'chá chā': ['碴'],\n 'qiāo què': ['碻'],\n 'sù xiè': ['碿'],\n 'liú liù': ['磂', '遛', '鎦', '馏'],\n 'sī tí': ['磃'],\n 'bàng páng': ['磅'],\n 'huá kě gū': ['磆'],\n 'wěi kuǐ': ['磈'],\n 'xiá qià yà': ['磍'],\n 'lián qiān': ['磏'],\n 'wèi ái gài': ['磑'],\n 'lá lā': ['磖'],\n 'áo qiāo': ['磝'],\n 'pēng pèng': ['磞', '閛'],\n 'yīn yǐn': ['磤'],\n 'lěi léi': ['磥'],\n 'mó mò': ['磨'],\n 'qì zhú': ['磩'],\n 'láo luò': ['磱'],\n 'pán bō': ['磻'],\n 'jí shé': ['磼'],\n 'hé qiāo qiào': ['礉'],\n 'kè huò': ['礊'],\n 'què hú': ['礐'],\n 'è qì': ['礘'],\n cǎ: ['礤', '礸'],\n 'xián xín': ['礥'],\n 'léi lěi lèi': ['礧'],\n 'yán yǎn': ['礹'],\n 'qí zhǐ': ['祇', '蚔'],\n 'bēng fāng': ['祊'],\n 'bì mì': ['祕'],\n suàn: ['祘', '笇', '筭', '算', '蒜'],\n 'piào piāo': ['票'],\n 'jì zhài': ['祭'],\n 'shuì lèi': ['祱'],\n 'jìn jīn': ['禁'],\n 'chán shàn': ['禅'],\n 'yáng shāng': ['禓'],\n 'zhī zhǐ tí': ['禔'],\n 'shàn chán': ['禪'],\n 'yú yù ǒu': ['禺'],\n 'zǐ zì': ['秄'],\n 'chá ná': ['秅'],\n 'zhǒng zhòng chóng': ['种'],\n 'hào mào': ['秏'],\n 'kù kū': ['秙'],\n zū: ['租', '葅'],\n chèng: ['秤', '穪'],\n 'huó kuò': ['秮', '秳'],\n 'chēng chèn chèng': ['称', '稱'],\n 'shì zhì': ['秲', '銴'],\n 'fù pū': ['秿'],\n 'xùn zè': ['稄'],\n 'tú shǔ': ['稌'],\n 'zhùn zhǔn': ['稕'],\n 'jī qí': ['稘', '綨', '觭'],\n 'léng líng': ['稜'],\n 'zuì zú sū': ['稡'],\n 'xì qiè': ['稧', '郄'],\n 'zhǒng zhòng': ['種'],\n 'zōng zǒng': ['稯'],\n 'xián jiān liàn': ['稴'],\n 'zī jiū': ['稵'],\n 'jī qǐ': ['稽'],\n ròng: ['穃'],\n 'shān cǎn cēn': ['穇'],\n 'mén méi': ['穈'],\n 'jǐ jì': ['穖'],\n 'xiāo rào': ['穘'],\n 'zhuō bó': ['穛'],\n 'tóng zhǒng zhòng': ['穜'],\n zuō: ['穝'],\n 'biāo pāo': ['穮', '藨'],\n 'zhuō jué': ['穱'],\n 'cuán zàn': ['穳'],\n 'kōng kòng kǒng': ['空'],\n 'yū yǔ': ['穻'],\n zhǎi: ['窄', '鉙'],\n báo: ['窇', '雹'],\n 'kū zhú': ['窋'],\n 'jiào liáo liù': ['窌'],\n 'wā guī': ['窐'],\n 'tiǎo yáo': ['窕'],\n 'xūn yìn': ['窨'],\n 'yà yē': ['窫'],\n 'tián diān yǎn': ['窴'],\n 'chāo kē': ['窼'],\n 'kuǎn cuàn': ['窽', '窾'],\n 'chù qì': ['竐'],\n 'qǔ kǒu': ['竘'],\n 'jìng zhěn': ['竧'],\n 'kǎn kàn': ['竷'],\n 'zhú dǔ': ['竺'],\n 'lè jīn': ['竻'],\n 'zhuì ruì': ['笍'],\n 'háng hàng': ['笐'],\n 'cén jìn hán': ['笒'],\n 'dā xiá nà': ['笚'],\n 'zé zuó': ['笮'],\n 'lóng lǒng': ['笼', '篭', '籠', '躘', '龓'],\n 'zhù zhú': ['筑', '築'],\n 'dá dā': ['答', '荅'],\n shāi: ['筛', '篩', '簁', '籭'],\n 'yún jūn': ['筠'],\n 'láng làng': ['筤', '郎', '阆'],\n 'zhì zhǐ': ['筫'],\n o: ['筽'],\n 'póu bù fú pú': ['箁'],\n 'pái bēi': ['箄'],\n gè: ['箇', '虼', '鉻', '铬'],\n 'tái chí': ['箈'],\n 'guǎi dài': ['箉'],\n 'zhào dào': ['箌'],\n 'jīng qìng': ['箐'],\n 'lín lǐn': ['箖'],\n 'jùn qūn': ['箘'],\n 'shī yí': ['箷', '釶'],\n 'yuē yào chuò': ['箹'],\n 'xiāo shuò qiào': ['箾'],\n 'gōng gǎn lǒng': ['篢'],\n 'páng péng': ['篣'],\n 'zhuó huò': ['篧'],\n 'jiǎn jiān': ['篯'],\n 'dí zhú': ['篴'],\n 'zān cēn cǎn': ['篸'],\n 'zhuàn suǎn zuàn': ['篹'],\n 'piǎo biāo': ['篻'],\n 'guó guì': ['簂'],\n 'cè jí': ['簎'],\n 'mì miè': ['簚'],\n 'shāi sī': ['簛'],\n 'sǔn zhuàn': ['簨'],\n 'gàn gǎn': ['簳'],\n 'bò bǒ': ['簸'],\n 'bó bù': ['簿'],\n shi: ['籂'],\n 'zhēn jiān': ['籈'],\n 'zhuàn zuǎn': ['籑'],\n 'fān pān biān': ['籓'],\n 'sǒu shǔ': ['籔'],\n zuǎn: ['籫', '繤', '纂', '纉', '纘', '缵'],\n nǚ: ['籹', '釹', '钕'],\n 'shā chǎo': ['粆'],\n 'kāng jīng': ['粇'],\n fěn: ['粉', '黺'],\n cū: ['粗', '觕', '麁', '麄', '麤'],\n 'nián zhān': ['粘'],\n 'cè sè': ['粣'],\n 'zhōu yù': ['粥'],\n 'shēn sǎn': ['糁'],\n 'biān biǎn': ['糄', '萹'],\n miàn: ['糆', '面', '靣', '麪', '麫', '麵', '麺'],\n 'hú hū hù': ['糊'],\n 'gǔ gòu': ['糓'],\n 'mí méi': ['糜'],\n 'sǎn shēn': ['糝', '糣'],\n zāo: ['糟', '蹧', '遭', '醩'],\n 'mì sī': ['糸'],\n 'jiū jiǔ': ['糺'],\n 'xì jì': ['系', '繫'],\n 'zhēng zhěng': ['糽'],\n 'chà chǎ': ['紁', '衩'],\n 'yuē yāo': ['約', '约'],\n 'hóng gōng': ['紅', '红'],\n 'hé gē': ['紇', '纥'],\n 'wén wèn': ['紋', '纹'],\n fóu: ['紑'],\n 'jì jié jiè': ['紒'],\n 'pī pí bǐ': ['紕', '纰'],\n 'jīn jìn': ['紟'],\n 'zhā zā': ['紥', '紮'],\n hā: ['紦'],\n 'fū fù': ['紨'],\n 'chōu chóu': ['紬'],\n 'lèi léi lěi': ['累'],\n 'bō bì': ['紴'],\n 'tiǎn zhěn': ['紾'],\n 'jiōng jiǒng': ['絅'],\n 'jié jiē': ['結', '结', '节'],\n 'guà kuā': ['絓'],\n 'bǎi mò': ['絔'],\n 'gēng huán': ['絙'],\n 'jié xié': ['絜'],\n 'quán shuān': ['絟'],\n 'gǎi ǎi': ['絠'],\n 'luò lào': ['絡', '络'],\n 'bīng bēng pēng': ['絣'],\n 'gěi jǐ': ['給', '给'],\n 'tóng tōng dòng': ['絧'],\n 'tiào diào dào': ['絩'],\n 'lěi lèi léi': ['絫'],\n 'gāi hài': ['絯'],\n 'chī zhǐ': ['絺'],\n 'wèn miǎn mán wàn': ['絻'],\n 'huán huàn wàn': ['綄'],\n 'qīn xiān': ['綅'],\n 'tì tí': ['綈'],\n 'yán xiàn': ['綖'],\n 'zōng zèng zòng': ['綜'],\n 'chēn lín': ['綝'],\n 'zhǔn zhùn': ['綧'],\n 'qiàn qīng zhēng': ['綪'],\n 'qìng qǐ': ['綮'],\n 'lún guān': ['綸', '纶'],\n 'chuò chāo': ['綽', '绰'],\n 'tián tǎn chān': ['緂'],\n 'lǜ lù': ['緑', '绿'],\n 'ruǎn ruàn': ['緛'],\n 'jí qī': ['緝'],\n 'zhòng chóng': ['緟', '重'],\n 'miáo máo': ['緢'],\n 'xiè yè': ['緤'],\n huǎn: ['緩', '缓', '㬊'],\n 'gēng gèng': ['緪', '縆'],\n 'tōu xū shū': ['緰'],\n 'zōng zòng': ['緵', '繌'],\n 'yùn gǔn': ['緷'],\n 'guā wō': ['緺'],\n 'yùn yūn wēn': ['緼', '縕'],\n 'bāng bàng': ['縍'],\n 'gǔ hú': ['縎', '鶻'],\n 'cī cuò suǒ': ['縒'],\n 'cuī shuāi': ['縗'],\n 'róng rǒng ròng': ['縙'],\n 'zài zēng': ['縡'],\n cài: ['縩', '菜', '蔡'],\n 'féng fèng': ['縫'],\n 'suō sù': ['縮', '缩'],\n 'yǎn yǐn': ['縯', '酓'],\n 'zòng zǒng': ['縱', '纵'],\n 'zhuàn juàn': ['縳'],\n 'mò mù': ['縸', '莫'],\n 'piǎo piāo': ['縹', '缥'],\n 'fán pó': ['繁'],\n 'bēng bèng': ['繃'],\n 'móu miù miào liǎo': ['繆'],\n 'yáo yóu zhòu': ['繇'],\n 'zēng zèng': ['繒', '缯'],\n 'jú jué': ['繘'],\n 'chuō chuò': ['繛'],\n 'zūn zǔn': ['繜'],\n rào: ['繞', '绕', '遶'],\n 'chǎn chán': ['繟'],\n 'huì huí': ['繢', '缋', '藱'],\n 'qiāo sāo zǎo': ['繰'],\n 'jiǎo zhuó': ['繳', '缴'],\n 'dàn tán chán': ['繵'],\n nǒng: ['繷'],\n 'pú fú': ['纀'],\n 'yào lì': ['纅'],\n 'rǎng xiāng': ['纕'],\n 'lí sǎ xǐ lǐ': ['纚'],\n 'xiān qiàn': ['纤'],\n 'jīng jìng': ['经'],\n 'tí tì': ['绨'],\n 'bēng běng bèng': ['绷'],\n 'zōng zèng': ['综'],\n 'jī qī': ['缉'],\n 'wēn yùn yūn': ['缊'],\n 'fèng féng': ['缝'],\n 'shuāi cuī suī': ['缞'],\n 'miù móu liáo miào mù': ['缪'],\n 'qiāo sāo': ['缲'],\n fǒu: ['缶', '缹', '缻', '雬', '鴀'],\n 'bà ba pí': ['罢', '罷'],\n 'guà guǎi': ['罫'],\n 'yáng xiáng': ['羊', '羏'],\n 'měi gāo': ['羙'],\n 'yì xī': ['羛'],\n 'qiǎng qiān': ['羟'],\n 'qiāng kòng': ['羫'],\n 'qián xián yán': ['羬'],\n nóu: ['羺'],\n 'hóng gòng': ['羾'],\n 'pī bì pō': ['翍'],\n 'qú yù': ['翑'],\n ké: ['翗'],\n 'qiào qiáo': ['翘'],\n 'zhái dí': ['翟'],\n 'dào zhōu': ['翢'],\n 'hóu qú': ['翵'],\n shuǎ: ['耍'],\n 'ruǎn nuò': ['耎'],\n 'ér nài': ['耏'],\n 'zhuān duān': ['耑'],\n 'pá bà': ['耙'],\n 'chí sì': ['耛'],\n 'qù chú': ['耝'],\n 'lún lǔn': ['耣'],\n 'jí jiè': ['耤'],\n 'tāng tǎng': ['耥'],\n pǎng: ['耪', '覫'],\n 'zhá zé': ['耫'],\n 'yē yé': ['耶'],\n 'yún yíng': ['耺'],\n 'wà tuǐ zhuó': ['聉'],\n 'ér nǜ': ['聏'],\n 'tiē zhé': ['聑'],\n 'dǐ zhì': ['聜'],\n qié: ['聺'],\n 'nǐ jiàn': ['聻'],\n 'lèi lē': ['肋'],\n cào: ['肏', '襙', '鄵', '鼜'],\n 'bó dí': ['肑'],\n 'xiào xiāo': ['肖'],\n 'dù dǔ': ['肚'],\n chāi: ['肞', '釵', '钗'],\n 'hán qín hàn': ['肣'],\n 'pàng pán pàn': ['肨', '胖'],\n 'zhūn chún': ['肫'],\n āng: ['肮', '骯'],\n 'yù yō': ['育'],\n 'pí bǐ bì': ['肶'],\n 'fèi bì': ['胇'],\n 'bèi bēi': ['背'],\n 'fèi zǐ': ['胏'],\n 'píng pēng': ['胓', '苹'],\n 'fū fú zhǒu': ['胕'],\n 'shèng shēng': ['胜'],\n kuà: ['胯', '跨', '骻'],\n 'gǎi hǎi': ['胲'],\n 'gē gé gā': ['胳'],\n 'néng nài': ['能'],\n 'guī kuì': ['胿'],\n 'mài mò': ['脉'],\n 'zāng zàng': ['脏'],\n 'jiǎo jué': ['脚', '角'],\n cuǒ: ['脞'],\n 'de te': ['脦'],\n 'zuī juān': ['脧'],\n něi: ['脮', '腇', '餒', '馁', '鮾', '鯘'],\n 'pú fǔ': ['脯'],\n niào: ['脲'],\n shuí: ['脽'],\n guò: ['腂', '過', '鐹'],\n 'là xī': ['腊'],\n 'yān ā': ['腌'],\n 'gāo gào': ['膏'],\n 'lù biāo': ['膔'],\n chuái: ['膗'],\n 'zhuān chuán chún zhuǎn': ['膞'],\n chuài: ['膪', '踹'],\n 'fán pán': ['膰'],\n 'wǔ hū': ['膴'],\n 'shān dàn': ['膻'],\n tún: ['臀', '臋', '蛌', '豘', '豚', '軘', '霕', '飩', '饨', '魨', '鲀', '黗'],\n 'bì bei': ['臂'],\n 'là gé': ['臈'],\n 'sào sāo': ['臊'],\n nào: ['臑', '閙', '闹', '鬧'],\n 'ní luán': ['臡'],\n 'qiān xián': ['臤'],\n 'guàng jiǒng': ['臦'],\n 'guǎng jiǒng': ['臩'],\n 'chòu xiù': ['臭'],\n 'mián biān': ['臱'],\n 'dié zhí': ['臷'],\n 'zhī jìn': ['臸'],\n 'shè shě': ['舍'],\n pù: ['舖', '舗'],\n 'bān bō pán': ['般'],\n kuā: ['舿'],\n 'gèn gěn': ['艮'],\n 'sè shǎi': ['色'],\n 'fú bó': ['艴'],\n 'jiāo qiú': ['艽'],\n 'chāi chā': ['芆'],\n 'sháo què': ['芍'],\n 'hù xià': ['芐'],\n 'zì zǐ': ['芓'],\n 'huì hū': ['芔'],\n 'tún chūn': ['芚'],\n 'jiè gài': ['芥'],\n 'xù zhù': ['芧'],\n 'yuán yán': ['芫'],\n 'xīn xìn': ['芯'],\n 'lún huā': ['芲'],\n 'wù hū': ['芴'],\n 'gōu gǒu': ['芶'],\n 'mào máo': ['芼'],\n 'fèi fú': ['芾'],\n 'chán yín': ['苂'],\n qiē: ['苆'],\n 'sū sù': ['苏'],\n 'tiáo sháo': ['苕'],\n 'lì jī': ['苙'],\n 'kē hē': ['苛'],\n 'jù qǔ': ['苣'],\n 'ruò rě': ['若'],\n 'zhù níng': ['苧'],\n 'pā bó': ['苩'],\n xiú: ['苬'],\n 'zhǎ zuó': ['苲'],\n 'jū chá': ['苴'],\n nié: ['苶'],\n 'shēng ruí': ['苼'],\n 'qié jiā': ['茄'],\n 'zǐ cí': ['茈'],\n 'qiàn xī': ['茜'],\n chǎi: ['茝'],\n 'fá pèi': ['茷'],\n ráo: ['荛', '蕘', '襓', '饒', '饶'],\n 'yíng xíng': ['荥'],\n 'qián xún': ['荨', '蕁'],\n 'yìn yīn': ['荫'],\n 'hé hè': ['荷'],\n 'shā suō': ['莎'],\n 'péng fēng': ['莑'],\n 'shēn xīn': ['莘'],\n 'wǎn guān guǎn': ['莞'],\n 'yóu sù': ['莤'],\n 'shāo xiāo': ['莦', '蛸'],\n 'làng liáng': ['莨'],\n 'piǎo fú': ['莩'],\n 'wèn wǎn miǎn': ['莬'],\n 'shì shí': ['莳', '蒔'],\n 'tù tú': ['莵'],\n 'xiān liǎn': ['莶', '薟'],\n 'wǎn yù': ['菀'],\n 'zōu chù': ['菆'],\n 'lù lǜ': ['菉'],\n 'jūn jùn': ['菌'],\n 'niè rěn': ['菍'],\n 'zī zì zāi': ['菑'],\n 'tú tù': ['菟'],\n 'jiē shà': ['菨'],\n 'qiáo zhǎo': ['菬'],\n 'tái zhī chí': ['菭'],\n 'fēi fěi': ['菲', '蜚'],\n 'qín qīn jīn': ['菳'],\n 'zū jù': ['菹', '蒩'],\n 'lǐn má': ['菻'],\n 'tián tiàn': ['菾'],\n tiē: ['萜', '貼', '贴'],\n 'luò là lào luō': ['落'],\n 'zhù zhuó zhe': ['著'],\n 'shèn rèn': ['葚'],\n 'gě gé': ['葛'],\n 'jùn suǒ': ['葰'],\n 'kuì kuài': ['蒉'],\n 'rú ná': ['蒘'],\n 'méng mēng měng': ['蒙'],\n 'yuán huán': ['蒝'],\n 'xú shú': ['蒣'],\n 'xí xì': ['蒵'],\n 'mì míng': ['蓂'],\n 'sōu sǒu': ['蓃'],\n 'gài gě hé hài': ['蓋'],\n 'yǎo zhuó': ['蓔'],\n 'diào tiáo dí': ['蓧'],\n 'xū qiū fū': ['蓲'],\n 'zí jú': ['蓻'],\n 'liǎo lù': ['蓼'],\n xu: ['蓿'],\n 'hàn hǎn': ['蔊'],\n 'màn wàn mán': ['蔓'],\n 'pó bò': ['蔢'],\n 'fān fán bō': ['蕃'],\n 'hóng hòng': ['蕻'],\n 'yù ào': ['薁', '隩'],\n 'xí xiào': ['薂'],\n 'báo bó bò': ['薄'],\n 'cí zī': ['薋'],\n 'wàn luàn': ['薍'],\n 'kǎo hāo': ['薧'],\n 'yuǎn wěi': ['薳'],\n 'zhòu chóu': ['薵'],\n 'wō mái': ['薶'],\n 'xiāo hào': ['藃'],\n 'yù xù xū': ['藇'],\n 'jiè jí': ['藉'],\n 'diào zhuó': ['藋'],\n 'cáng zàng': ['藏'],\n lǎ: ['藞'],\n 'chú zhū': ['藸'],\n 'pín píng': ['蘋'],\n 'gān hán': ['虷'],\n 'hóng jiàng': ['虹'],\n 'huī huǐ': ['虺'],\n 'xiā há': ['虾'],\n 'mǎ mà mā': ['蚂'],\n 'fāng bàng': ['蚄'],\n 'bàng bèng': ['蚌'],\n 'jué quē': ['蚗'],\n 'qín qián': ['蚙'],\n 'gōng zhōng': ['蚣'],\n 'fǔ fù': ['蚥'],\n 'dài dé': ['蚮'],\n 'gǒu qú xù': ['蚼'],\n 'bǒ pí': ['蚾'],\n 'shé yí': ['蛇'],\n tiě: ['蛈', '鉄', '銕', '鐡', '鐵', '铁', '驖'],\n 'gé luò': ['蛒'],\n 'máng bàng': ['蛖'],\n 'yì xǔ': ['蛡'],\n 'há gé': ['蛤'],\n 'qiè ní': ['蛪'],\n 'é yǐ': ['蛾'],\n 'zhē zhé': ['蜇'],\n 'là zhà': ['蜡'],\n suò: ['蜶', '逤'],\n 'yóu qiú': ['蝤'],\n 'xiā hā': ['蝦'],\n 'xī qī': ['螇'],\n 'bī pí': ['螕'],\n 'nài něng': ['螚'],\n 'hé xiá': ['螛'],\n 'guì huǐ': ['螝'],\n 'mǎ mā mà': ['螞'],\n 'shì zhē': ['螫'],\n 'zhì dié': ['螲'],\n 'jiàn chán': ['螹'],\n 'ma má mò': ['蟆'],\n 'mǎng měng': ['蟒'],\n 'biē bié': ['蟞'],\n 'bēn fèi': ['蟦'],\n 'láo liáo': ['蟧'],\n 'yín xún': ['蟫'],\n 'lí lǐ': ['蠡'],\n 'xuè xiě': ['血'],\n 'xíng háng hàng héng': ['行'],\n 'shuāi cuī': ['衰'],\n 'tuó tuō': ['袉'],\n 'lǐng líng': ['袊'],\n 'bào páo pào': ['袌'],\n 'jù jiē': ['袓'],\n 'hè kè': ['袔'],\n 'yí yì': ['袘', '貤'],\n 'nà jué': ['袦'],\n 'bèi pī': ['被'],\n 'chǐ nuǒ': ['袲'],\n 'chǐ qǐ duǒ nuǒ': ['袳'],\n 'jiá qiā jié': ['袷'],\n 'bó mò': ['袹'],\n 'guī guà': ['袿'],\n 'liè liě': ['裂'],\n 'chéng chěng': ['裎'],\n 'jiē gé': ['裓'],\n 'dāo chóu': ['裯'],\n 'shang cháng': ['裳'],\n 'yuān gǔn': ['裷'],\n 'yǎn ān': ['裺'],\n 'tì xī': ['裼'],\n 'fù fú': ['褔'],\n 'chǔ zhǔ': ['褚'],\n 'tuì tùn': ['褪'],\n lǎi: ['襰'],\n 'yào yāo': ['要'],\n 'qín tán': ['覃'],\n 'jiàn xiàn': ['見', '见'],\n piǎn: ['覑', '諞', '谝', '貵', '𡎚'],\n 'piē miè': ['覕'],\n 'yíng yǐng': ['覮'],\n 'qù qū': ['覰', '覷', '觑'],\n 'jiàn biǎn': ['覵'],\n 'luó luǎn': ['覶'],\n 'zī zuǐ': ['觜'],\n 'huà xiè': ['觟'],\n 'jiě jiè xiè': ['解', '觧'],\n 'xué hù': ['觷'],\n 'lì lù': ['觻'],\n tǎo: ['討', '讨'],\n zhùn: ['訰'],\n 'zī zǐ': ['訾'],\n 'yí dài': ['詒', '诒'],\n xiòng: ['詗', '诇'],\n 'diào tiǎo': ['誂'],\n 'yí chǐ chì': ['誃'],\n 'lǎng làng': ['誏'],\n 'ēi éi ěi èi xī': ['誒', '诶'],\n shuà: ['誜'],\n 'yǔ yù': ['語', '语', '雨'],\n 'shuō shuì yuè': ['說', '说'],\n 'shuí shéi': ['誰', '谁'],\n 'qū juè': ['誳'],\n 'chī lài': ['誺'],\n 'nì ná': ['誽'],\n 'diào tiáo': ['調'],\n 'pǐ bēi': ['諀'],\n 'jì jī': ['諅'],\n 'zé zuò zhǎ cuò': ['諎'],\n 'chù jí': ['諔'],\n 'háo xià': ['諕'],\n 'lùn lún': ['論', '论'],\n 'shì dì': ['諟'],\n 'huà guā': ['諣'],\n 'xǐ shāi āi': ['諰'],\n 'nán nàn': ['諵', '難'],\n miù: ['謬', '谬'],\n zèn: ['譖', '谮'],\n 'shí zhì': ['識', '识'],\n 'juàn xuān': ['讂'],\n 'yí tuī': ['讉'],\n zhán: ['讝'],\n 'xǔ hǔ': ['许'],\n 'xiáng yáng': ['详'],\n 'tiáo diào zhōu': ['调'],\n 'chén shèn': ['谌'],\n 'mí mèi': ['谜'],\n 'màn mán': ['谩'],\n 'gǔ yù': ['谷'],\n 'huō huò huá': ['豁'],\n 'zhì zhài': ['豸'],\n 'huān huán': ['貆'],\n 'kěn kūn': ['貇'],\n 'mò hé': ['貈'],\n 'mò hé háo': ['貉'],\n 'jù lóu': ['貗'],\n 'zé zhài': ['責', '责'],\n 'dài tè': ['貸'],\n 'bì bēn': ['賁'],\n 'jiǎ gǔ jià': ['賈'],\n 'xiōng mín': ['賯'],\n càng: ['賶'],\n 'zhuàn zuàn': ['賺', '赚'],\n 'wàn zhuàn': ['贃'],\n 'gàn gòng zhuàng': ['贛'],\n 'yuán yùn': ['贠'],\n 'bēn bì': ['贲'],\n 'jiǎ gǔ': ['贾'],\n zǒu: ['走', '赱', '鯐'],\n 'dié tú': ['趃'],\n 'jū qiè': ['趄'],\n 'qū cù': ['趋', '趨'],\n 'jí jié': ['趌'],\n 'guā huó': ['趏'],\n 'què qì jí': ['趞'],\n 'tàng tāng': ['趟'],\n 'chuō zhuó': ['趠'],\n 'qù cù': ['趣'],\n 'yuè tì': ['趯'],\n 'bō bào': ['趵'],\n 'kuà wù': ['趶'],\n 'guì jué': ['趹'],\n 'fāng fàng páng': ['趽'],\n 'páo bà': ['跁'],\n 'qí qǐ': ['跂'],\n 'jiàn chén': ['跈'],\n 'pǎo páo': ['跑'],\n 'diǎn diē tiē': ['跕'],\n 'jū jù qiè': ['跙'],\n bǒ: ['跛'],\n 'luò lì': ['跞'],\n 'dài duò duō chí': ['跢'],\n zhuǎi: ['跩'],\n 'bèng pián': ['跰'],\n 'tiào táo': ['跳'],\n 'shū chōu': ['跾'],\n 'liàng liáng': ['踉'],\n 'tà tā': ['踏'],\n chǎ: ['蹅', '鑔', '镲'],\n 'dí zhí': ['蹢'],\n 'dēng dèng': ['蹬', '鐙', '镫'],\n cèng: ['蹭'],\n 'dūn cún': ['蹲'],\n 'juě jué': ['蹶'],\n liāo: ['蹽'],\n 'xiè sǎ': ['躠'],\n tǐ: ['躰', '軆', '骵'],\n 'yà zhá gá': ['轧', '軋'],\n 'xìn xiàn': ['軐'],\n 'fàn guǐ': ['軓'],\n 'zhuàn zhuǎn': ['転'],\n 'zhóu zhòu': ['軸', '轴'],\n bú: ['轐', '醭', '鳪'],\n 'zhuǎn zhuàn zhuǎi': ['转'],\n 'zǎi zài': ['载'],\n 'niǎn zhǎn': ['辗'],\n 'biān bian': ['边'],\n 'dào biān': ['辺'],\n 'yǐ yí': ['迆', '迤', '迱'],\n 'guò guo guō': ['过'],\n 'wàng kuāng': ['迋'],\n 'hái huán': ['还'],\n 'zhè zhèi': ['这'],\n 'yuǎn yuàn': ['远'],\n 'zhì lì': ['迣'],\n 'zhù wǎng': ['迬'],\n 'zhuī duī': ['追'],\n 'shì kuò': ['适'],\n tòu: ['透'],\n 'tōng tòng': ['通'],\n guàng: ['逛'],\n 'dǎi dài': ['逮'],\n 'suì suí': ['遂'],\n 'tí dì': ['遆'],\n 'yí wèi': ['遗'],\n 'shì dí zhé': ['適'],\n cà: ['遪'],\n 'huán hái': ['還'],\n 'lí chí': ['邌'],\n 'kàng háng': ['邟'],\n 'nà nèi nā': ['那'],\n 'xié yá yé yú xú': ['邪'],\n 'gāi hái': ['郂'],\n 'huán xún': ['郇'],\n 'chī xī': ['郗'],\n hǎo: ['郝'],\n 'lì zhí': ['郦'],\n 'xiáo ǎo': ['郩'],\n 'dōu dū': ['都'],\n liǎo: ['曢', '鄝', '镽'],\n 'zàn cuán cuó': ['酂', '酇'],\n 'dīng dǐng': ['酊'],\n 'cù zuò': ['酢'],\n 'fā pō': ['酦'],\n 'shāi shī': ['酾'],\n niàng: ['酿', '醸'],\n 'qiú chōu': ['醔'],\n 'pō fā': ['醗', '醱'],\n 'chǎn chěn': ['醦'],\n 'yàn liǎn xiān': ['醶'],\n 'niàng niáng': ['釀'],\n 'lǐ li': ['里'],\n 'lí xǐ xī': ['釐'],\n 'liǎo liào': ['釕'],\n 'dīng dìng': ['釘', '钉'],\n 'qiǎo jiǎo': ['釥'],\n 'yú huá': ['釪'],\n 'huá wū': ['釫'],\n 'rì rèn jiàn': ['釰', '釼'],\n 'dì dài': ['釱'],\n 'pī zhāo': ['釽'],\n 'yá yé': ['釾'],\n 'bǎ pá': ['鈀', '钯'],\n 'tā tuó': ['鉈', '铊'],\n běi: ['鉳'],\n 'bǐng píng': ['鉼'],\n 'hā kē': ['鉿', '铪'],\n chòng: ['銃', '铳'],\n 'xiǎng jiōng': ['銄'],\n 'yù sì': ['銉'],\n 'xù huì': ['銊'],\n 'rén rěn': ['銋'],\n 'shàn shuò': ['銏'],\n 'chì lì': ['銐'],\n 'xiǎn xǐ': ['銑', '铣'],\n 'hóu xiàng': ['銗'],\n 'diào tiáo yáo': ['銚'],\n 'xiān kuò tiǎn guā': ['銛', '銽', '铦'],\n 'zhé niè': ['銸'],\n 'zhōng yōng': ['銿'],\n 'tōu tù dòu': ['鋀'],\n 'méi méng': ['鋂'],\n 'wàn jiǎn': ['鋄', '鎫'],\n 'tǐng dìng': ['鋌', '铤'],\n 'juān jiān cuān': ['鋑'],\n 'sī tuó': ['鋖'],\n 'juān xuān juàn': ['鋗'],\n 'wú huá wū': ['鋘'],\n 'zhuó chuò': ['鋜'],\n 'xíng xìng jīng': ['鋞'],\n 'jū jú': ['鋦', '锔'],\n 'zuì niè': ['鋷'],\n 'yuān yuǎn wǎn wān': ['鋺'],\n 'gāng gàng': ['鋼', '钢'],\n zhuī: ['錐', '锥', '騅', '骓', '鵻'],\n ā: ['錒', '锕'],\n 'cuō chā': ['鎈'],\n 'suǒ sè': ['鎍'],\n 'yáo zú': ['鎐'],\n 'yè tà gé': ['鎑'],\n 'qiāng chēng': ['鎗'],\n 'gé lì': ['鎘', '镉', '鬲'],\n 'bī pī bì': ['鎞'],\n 'gǎo hào': ['鎬'],\n 'zú chuò': ['鏃'],\n 'xiū xiù': ['鏅'],\n 'shòu sōu': ['鏉'],\n 'dí dī': ['鏑', '镝'],\n 'qiāo sǎn càn': ['鏒'],\n 'lù áo': ['鏕'],\n 'tāng táng': ['鏜'],\n 'jiàn zàn': ['鏩'],\n 'huì suì ruì': ['鏸'],\n 'qiǎng qiāng': ['鏹', '镪'],\n 'sǎn xiàn sà': ['鏾'],\n 'jiǎn jiàn': ['鐧', '锏'],\n 'dāng chēng': ['鐺', '铛'],\n 'zuān zuàn': ['鑽'],\n 'sà xì': ['钑'],\n 'yào yuè': ['钥'],\n 'tǒu dǒu': ['钭'],\n 'zuàn zuān': ['钻'],\n 'qiān yán': ['铅'],\n 'pí pī': ['铍'],\n 'yáo diào tiáo': ['铫'],\n 'tāng tàng': ['铴'],\n 'pù pū': ['铺'],\n 'tán xiān': ['锬'],\n 'liù liú': ['镏'],\n 'hào gǎo': ['镐'],\n 'táng tāng': ['镗'],\n 'tán chán xín': ['镡'],\n 'huò shǎn': ['閄'],\n 'hàn bì': ['閈', '闬'],\n 'kāng kàng': ['閌', '闶'],\n 'xián jiàn jiān jiǎn': ['閒'],\n 'xiā xiǎ': ['閕'],\n 'xiǎ kě': ['閜'],\n 'biàn guān': ['閞'],\n 'hé gé': ['閤', '颌'],\n 'hòng xiàng': ['閧'],\n 'sē xī': ['閪'],\n 'tíng tǐng': ['閮'],\n 'è yān': ['閼', '阏'],\n 'hòng juǎn xiàng': ['闂'],\n 'bǎn pàn': ['闆'],\n 'dū shé': ['闍', '阇'],\n 'què quē': ['闕'],\n 'tāng táng chāng': ['闛'],\n 'kàn hǎn': ['闞', '阚'],\n 'xì sè tà': ['闟'],\n 'mēn mèn': ['闷'],\n 'quē què': ['阙'],\n 'yán diàn': ['阽'],\n 'ā ē': ['阿'],\n 'bēi pō pí': ['陂'],\n 'yàn yǎn': ['隁'],\n 'yú yáo shù': ['隃'],\n 'lóng lōng': ['隆'],\n 'duì zhuì': ['隊'],\n 'suí duò': ['隋'],\n 'gāi qí ái': ['隑'],\n 'huī duò': ['隓', '隳'],\n 'wěi kuí': ['隗'],\n 'lì dài': ['隸'],\n 'zhuī cuī wéi': ['隹'],\n 'hè hú': ['隺', '鶮'],\n 'jùn juàn': ['隽', '雋'],\n 'nán nàn nuó': ['难'],\n 'què qiāo qiǎo': ['雀'],\n 'guàn huán': ['雚'],\n 'guī xī': ['雟'],\n 'sè xí': ['雭'],\n án: ['雸'],\n 'wù méng': ['雺'],\n tèng: ['霯'],\n 'lù lòu': ['露'],\n mái: ['霾'],\n 'jìng liàng': ['靚'],\n 'gé jí': ['革'],\n bǎ: ['靶'],\n 'yāng yàng': ['鞅'],\n 'gé tà sǎ': ['鞈'],\n 'biān yìng': ['鞕'],\n 'qiào shāo': ['鞘'],\n 'juān xuān': ['鞙'],\n 'shàng zhǎng': ['鞝'],\n 'pí bǐng bì bēi': ['鞞'],\n la: ['鞡'],\n 'xiè dié': ['鞢'],\n ēng: ['鞥'],\n 'móu mù': ['鞪'],\n 'bì bǐng': ['鞸'],\n 'mèi wà': ['韎'],\n rǒu: ['韖'],\n 'shè xiè': ['韘'],\n 'yùn wēn': ['韫'],\n 'dùn dú': ['頓', '顿'],\n duǐ: ['頧'],\n luō: ['頱'],\n 'bīn pín': ['頻'],\n yóng: ['顒', '颙', '鰫'],\n mān: ['顢', '颟'],\n 'jǐng gěng': ['颈'],\n 'jié xié jiá': ['颉'],\n 'kē ké': ['颏'],\n 'pín bīn': ['频'],\n 'chàn zhàn': ['颤'],\n 'fēng fěng': ['風', '风'],\n 'biāo diū': ['颩'],\n 'bá fú': ['颰'],\n 'sāo sōu': ['颾'],\n 'liù liáo': ['飂'],\n 'shí sì yì': ['食'],\n 'yǎng juàn': ['飬'],\n 'zhù tǒu': ['飳'],\n 'yí sì': ['飴'],\n 'zuò zé zhā': ['飵'],\n tiè: ['飻', '餮'],\n 'xiǎng náng': ['饟'],\n 'táng xíng': ['饧'],\n 'gē le': ['饹'],\n 'chā zha': ['馇'],\n 'náng nǎng': ['馕'],\n 'yūn wò': ['馧'],\n 'zhī shì': ['馶'],\n 'xìn jìn': ['馸'],\n 'kuài jué': ['駃'],\n zǎng: ['駔', '驵'],\n 'tái dài': ['駘'],\n 'xún xuān': ['駨'],\n 'liáng láng': ['駺'],\n piàn: ['騗', '騙', '骗', '魸'],\n 'dài tái': ['骀'],\n 'sāo sǎo': ['骚'],\n 'gǔ gū': ['骨'],\n 'bèi mó': ['骳'],\n 'xiāo qiāo': ['骹'],\n 'bǎng pǎng': ['髈'],\n 'bó jué': ['髉'],\n 'bì pǒ': ['髲'],\n 'máo méng': ['髳'],\n 'kuò yuè': ['髺'],\n 'bā bà': ['魞', '鲃'],\n 'jì cǐ': ['鮆'],\n 'bó bà': ['鮊'],\n 'zhǎ zhà': ['鮓', '鲊'],\n 'chóu dài': ['鮘'],\n 'luò gé': ['鮥'],\n 'guī xié wā kuí': ['鮭'],\n 'xiān xiǎn': ['鮮', '鲜'],\n 'pū bū': ['鯆'],\n 'yì sī': ['鯣'],\n 'bà bó': ['鲌'],\n 'guī xié': ['鲑'],\n 'sāi xǐ': ['鳃'],\n 'niǎo diǎo': ['鳥'],\n 'diāo zhāo': ['鳭'],\n 'gān hàn yàn': ['鳱'],\n 'fū guī': ['鳺'],\n 'jiān qiān zhān': ['鳽'],\n 'hé jiè': ['鶡'],\n 'piān biǎn': ['鶣'],\n 'chuàn zhì': ['鶨'],\n 'cāng qiāng': ['鶬'],\n 'sǔn xùn': ['鶽'],\n 'biāo páo': ['麃'],\n 'zhù cū': ['麆'],\n 'jūn qún': ['麇', '麕'],\n chi: ['麶'],\n 'mó me': ['麼'],\n 'mó me ma': ['麽'],\n 'mí mǒ': ['麿'],\n 'dàn shèn': ['黮'],\n 'zhěn yān': ['黰'],\n 'dǎn zhǎn': ['黵'],\n 'miǎn mǐn měng': ['黾'],\n hōu: ['齁'],\n nàng: ['齉'],\n 'qí jì zī zhāi': ['齐'],\n 'yín kěn yǎn': ['龂'],\n 'yín kěn': ['龈'],\n 'gōng wò': ['龏'],\n 'guī jūn qiū': ['龜', '龟'],\n 'kuí wā': ['䖯'],\n lōu: ['䁖'],\n 'ōu qū': ['𫭟'],\n 'lóu lǘ': ['𦝼'],\n 'gǎ gā gá': ['嘎'],\n 'wā guà': ['坬'],\n 'zhǐ dǐ': ['茋'],\n 'gǒng hóng': ['硔'],\n 'yáo xiào': ['滧']\n};\nconst DICT1 = new FastDictFactory();\nObject.keys(map).forEach(key => {\n const chars = map[key];\n for (let char of chars) {\n DICT1.set(char, key);\n }\n});\nconst InitialList = ['zh', 'ch', 'sh', 'z', 'c', 's', 'b', 'p', 'm', 'f', 'd', 't', 'n', 'l', 'g', 'k', 'h', 'j', 'q', 'x', 'r', 'y', 'w', ''];\nconst SpecialInitialList = ['j', 'q', 'x'];\nconst SpecialFinalList = ['uān', 'uán', 'uǎn', 'uàn', 'uan', 'uē', 'ué', 'uě', 'uè', 'ue', 'ūn', 'ún', 'ǔn', 'ùn', 'un', 'ū', 'ú', 'ǔ', 'ù', 'u'];\nconst SpecialFinalMap = {\n uān: 'üān',\n uán: 'üán',\n uǎn: 'üǎn',\n uàn: 'üàn',\n uan: 'üan',\n uē: 'üē',\n ué: 'üé',\n uě: 'üě',\n uè: 'üè',\n ue: 'üe',\n ūn: 'ǖn',\n ún: 'ǘn',\n ǔn: 'ǚn',\n ùn: 'ǜn',\n un: 'ün',\n ū: 'ǖ',\n ú: 'ǘ',\n ǔ: 'ǚ',\n ù: 'ǜ',\n u: 'ü'\n};\nconst doubleFinalList = ['ia', 'ian', 'iang', 'iao', 'ie', 'iu', 'iong', 'ua', 'uai', 'uan', 'uang', 'ue', 'ui', 'uo', 'üan', 'üe', 'van', 've'];\n/**\r\n * @description: 数量词 + 特殊词 音调处理\r\n */\nconst Numbers = {\n 一: 'yì',\n 二: 'èr',\n 三: 'sān',\n 四: 'sì',\n 五: 'wǔ',\n 六: 'liù',\n 七: 'qī',\n 八: 'bā',\n 九: 'jiǔ',\n 十: 'shí',\n 百: 'bǎi',\n 千: 'qiān',\n 万: 'wàn',\n 亿: 'yì',\n 单: 'dān',\n 两: 'liǎng',\n 双: 'shuāng',\n 多: 'duō',\n 几: 'jǐ',\n 十一: 'shí yī',\n 零一: 'líng yī',\n 第一: 'dì yī',\n 一十: 'yī shí',\n 一十一: 'yī shí yī'\n};\nconst NumberWordMap = {\n 重: 'chóng',\n 行: 'háng',\n 斗: 'dǒu',\n 更: 'gēng'\n};\n// 与以下词组合时,不变调\nfunction genNumberDict() {\n const dict = {\n 零一: 'líng yī',\n 〇一: 'líng yī',\n 十一: 'shí yī',\n 一十: 'yī shí',\n 第一: 'dì yī',\n 一十一: 'yī shí yī'\n };\n for (let number in Numbers) {\n for (let key in NumberWordMap) {\n const word = `${number}${key}`;\n const pinyin = `${Numbers[number]} ${NumberWordMap[key]}`;\n dict[word] = pinyin;\n }\n }\n return dict;\n}\nconst NumberDict = genNumberDict();\nconst PatternNumberDict = Object.keys(NumberDict).map(key => ({\n zh: key,\n pinyin: NumberDict[key],\n probability: 1e-12 /* Probability.Rule */,\n length: stringLength(key),\n priority: Priority.Normal,\n dict: Symbol('rule')\n}));\n/**\r\n * @description: 连续变调处理:https://zh.wiktionary.org/wiki/Appendix:%E2%80%9C%E4%B8%80%E2%80%9D%E5%8F%8A%E2%80%9C%E4%B8%8D%E2%80%9D%E7%9A%84%E5%8F%98%E8%B0%83\r\n */\nconst toneSandhiMap = {\n // 说不说,说一说,叠词之间发音为轻声\n 不: {\n bú: [4] // \"不\" 后面跟 4 声时,变调为 2 声\n },\n 一: {\n yí: [4],\n yì: [1, 2, 3]\n }\n};\nconst toneSandhiIgnoreSuffix = {\n 不: ['的', '而', '之', '后', '也', '还', '地'],\n 一: ['的', '而', '之', '后', '也', '还', '是']\n};\nconst toneSandhiList = Object.keys(toneSandhiMap);\n// 处理「一」和 「不」字的变调\nfunction processToneSandhi(cur, pre, next) {\n if (toneSandhiList.indexOf(cur) === -1) {\n return getSingleWordPinyin(cur);\n }\n // 轻声变调:说不说,说一说,叠词之间发音为轻声\n if (pre === next && pre && getSingleWordPinyin(pre) !== pre) {\n return getPinyinWithoutTone(getSingleWordPinyin(cur));\n }\n // 「一」和 「不」字变调处理\n if (next && !toneSandhiIgnoreSuffix[cur].includes(next)) {\n const nextPinyin = getSingleWordPinyin(next);\n if (nextPinyin !== next) {\n const nextTone = getNumOfTone(nextPinyin);\n const pinyinMap = toneSandhiMap[cur];\n for (let pinyin in pinyinMap) {\n const tones = pinyinMap[pinyin];\n if (tones.indexOf(Number(nextTone)) !== -1) {\n return pinyin;\n }\n }\n }\n }\n}\n// 处理「了」字的变调\nfunction processToneSandhiLiao(cur, pre) {\n if (cur === '了' && (!pre || !DICT1.get(pre))) {\n return 'liǎo';\n }\n}\n// 处理叠字符[々]\nfunction processReduplicationChar(cur, pre) {\n if (cur === '々') {\n if (!pre || !DICT1.get(pre)) {\n return 'tóng';\n } else {\n return DICT1.get(pre).split(' ')[0];\n }\n }\n}\nfunction processSepecialPinyin(cur, pre, next) {\n return processReduplicationChar(cur, pre) || processToneSandhiLiao(cur, pre) || processToneSandhi(cur, pre, next) || getSingleWordPinyin(cur);\n}\nconst Surnames = {\n 南宫: 'nán gōng',\n 第五: 'dì wǔ',\n 万俟: 'mò qí',\n 司马: 'sī mǎ',\n 上官: 'shàng guān',\n 欧阳: 'ōu yáng',\n 夏侯: 'xià hóu',\n 诸葛: 'zhū gě',\n 闻人: 'wén rén',\n 东方: 'dōng fāng',\n 赫连: 'hè lián',\n 皇甫: 'huáng fǔ',\n 尉迟: 'yù chí',\n 公羊: 'gōng yáng',\n 澹台: 'tán tái',\n 公冶: 'gōng yě',\n 宗政: 'zōng zhèng',\n 濮阳: 'pú yáng',\n 淳于: 'chún yú',\n 太叔: 'tài shū',\n 申屠: 'shēn tú',\n 公孙: 'gōng sūn',\n 仲孙: 'zhòng sūn',\n 轩辕: 'xuān yuán',\n 令狐: 'líng hú',\n 钟离: 'zhōng lí',\n 宇文: 'yǔ wén',\n 长孙: 'zhǎng sūn',\n 慕容: 'mù róng',\n 鲜于: 'xiān yú',\n 闾丘: 'lǘ qiū',\n 司徒: 'sī tú',\n 司空: 'sī kōng',\n 亓官: 'qí guān',\n 司寇: 'sī kòu',\n 仉督: 'zhǎng dū',\n 子车: 'zǐ jū',\n 颛孙: 'zhuān sūn',\n 端木: 'duān mù',\n 巫马: 'wū mǎ',\n 公西: 'gōng xī',\n 漆雕: 'qī diāo',\n 乐正: 'yuè zhèng',\n 壤驷: 'rǎng sì',\n 公良: 'gōng liáng',\n 拓跋: 'tuò bá',\n 夹谷: 'jiá gǔ',\n 宰父: 'zǎi fǔ',\n 榖梁: 'gǔ liáng',\n 段干: 'duàn gān',\n 百里: 'bǎi lǐ',\n 东郭: 'dōng guō',\n 南门: 'nán mén',\n 呼延: 'hū yán',\n 羊舌: 'yáng shé',\n 梁丘: 'liáng qiū',\n 左丘: 'zuǒ qiū',\n 东门: 'dōng mén',\n 西门: 'xī mén',\n 句龙: 'gōu lóng',\n 毌丘: 'guàn qiū',\n 赵: 'zhào',\n 钱: 'qián',\n 孙: 'sūn',\n 李: 'lǐ',\n 周: 'zhōu',\n 吴: 'wú',\n 郑: 'zhèng',\n 王: 'wáng',\n 冯: 'féng',\n 陈: 'chén',\n 褚: 'chǔ',\n 卫: 'wèi',\n 蒋: 'jiǎng',\n 沈: 'shěn',\n 韩: 'hán',\n 杨: 'yáng',\n 朱: 'zhū',\n 秦: 'qín',\n 尤: 'yóu',\n 许: 'xǔ',\n 何: 'hé',\n 吕: 'lǚ',\n 施: 'shī',\n 张: 'zhāng',\n 孔: 'kǒng',\n 曹: 'cáo',\n 严: 'yán',\n 华: 'huà',\n 金: 'jīn',\n 魏: 'wèi',\n 陶: 'táo',\n 姜: 'jiāng',\n 戚: 'qī',\n 谢: 'xiè',\n 邹: 'zōu',\n 喻: 'yù',\n 柏: 'bǎi',\n 水: 'shuǐ',\n 窦: 'dòu',\n 章: 'zhāng',\n 云: 'yún',\n 苏: 'sū',\n 潘: 'pān',\n 葛: 'gě',\n 奚: 'xī',\n 范: 'fàn',\n 彭: 'péng',\n 郎: 'láng',\n 鲁: 'lǔ',\n 韦: 'wéi',\n 昌: 'chāng',\n 马: 'mǎ',\n 苗: 'miáo',\n 凤: 'fèng',\n 花: 'huā',\n 方: 'fāng',\n 俞: 'yú',\n 任: 'rén',\n 袁: 'yuán',\n 柳: 'liǔ',\n 酆: 'fēng',\n 鲍: 'bào',\n 史: 'shǐ',\n 唐: 'táng',\n 费: 'fèi',\n 廉: 'lián',\n 岑: 'cén',\n 薛: 'xuē',\n 雷: 'léi',\n 贺: 'hè',\n 倪: 'ní',\n 汤: 'tāng',\n 滕: 'téng',\n 殷: 'yīn',\n 罗: 'luó',\n 毕: 'bì',\n 郝: 'hǎo',\n 邬: 'wū',\n 安: 'ān',\n 常: 'cháng',\n 乐: 'yuè',\n 于: 'yú',\n 时: 'shí',\n 傅: 'fù',\n 皮: 'pí',\n 卞: 'biàn',\n 齐: 'qí',\n 康: 'kāng',\n 伍: 'wǔ',\n 余: 'yú',\n 元: 'yuán',\n 卜: 'bǔ',\n 顾: 'gù',\n 孟: 'mèng',\n 平: 'píng',\n 黄: 'huáng',\n 和: 'hé',\n 穆: 'mù',\n 萧: 'xiāo',\n 尹: 'yǐn',\n 姚: 'yáo',\n 邵: 'shào',\n 湛: 'zhàn',\n 汪: 'wāng',\n 祁: 'qí',\n 毛: 'máo',\n 禹: 'yǔ',\n 狄: 'dí',\n 米: 'mǐ',\n 贝: 'bèi',\n 明: 'míng',\n 臧: 'zāng',\n 计: 'jì',\n 伏: 'fú',\n 成: 'chéng',\n 戴: 'dài',\n 谈: 'tán',\n 宋: 'sòng',\n 茅: 'máo',\n 庞: 'páng',\n 熊: 'xióng',\n 纪: 'jǐ',\n 舒: 'shū',\n 屈: 'qū',\n 项: 'xiàng',\n 祝: 'zhù',\n 董: 'dǒng',\n 梁: 'liáng',\n 杜: 'dù',\n 阮: 'ruǎn',\n 蓝: 'lán',\n 闵: 'mǐn',\n 席: 'xí',\n 季: 'jì',\n 麻: 'má',\n 强: 'qiáng',\n 贾: 'jiǎ',\n 路: 'lù',\n 娄: 'lóu',\n 危: 'wēi',\n 江: 'jiāng',\n 童: 'tóng',\n 颜: 'yán',\n 郭: 'guō',\n 梅: 'méi',\n 盛: 'shèng',\n 林: 'lín',\n 刁: 'diāo',\n 钟: 'zhōng',\n 徐: 'xú',\n 邱: 'qiū',\n 骆: 'luò',\n 高: 'gāo',\n 夏: 'xià',\n 蔡: 'cài',\n 田: 'tián',\n 樊: 'fán',\n 胡: 'hú',\n 凌: 'líng',\n 霍: 'huò',\n 虞: 'yú',\n 万: 'wàn',\n 支: 'zhī',\n 柯: 'kē',\n 昝: 'zǎn',\n 管: 'guǎn',\n 卢: 'lú',\n 莫: 'mò',\n 经: 'jīng',\n 房: 'fáng',\n 裘: 'qiú',\n 缪: 'miào',\n 干: 'gān',\n 解: 'xiè',\n 应: 'yīng',\n 宗: 'zōng',\n 丁: 'dīng',\n 宣: 'xuān',\n 贲: 'bēn',\n 邓: 'dèng',\n 郁: 'yù',\n 单: 'shàn',\n 杭: 'háng',\n 洪: 'hóng',\n 包: 'bāo',\n 诸: 'zhū',\n 左: 'zuǒ',\n 石: 'shí',\n 崔: 'cuī',\n 吉: 'jí',\n 钮: 'niǔ',\n 龚: 'gōng',\n 程: 'chéng',\n 嵇: 'jī',\n 邢: 'xíng',\n 滑: 'huá',\n 裴: 'péi',\n 陆: 'lù',\n 荣: 'róng',\n 翁: 'wēng',\n 荀: 'xún',\n 羊: 'yáng',\n 於: 'yū',\n 惠: 'huì',\n 甄: 'zhēn',\n 曲: 'qū',\n 家: 'jiā',\n 封: 'fēng',\n 芮: 'ruì',\n 羿: 'yì',\n 储: 'chǔ',\n 靳: 'jìn',\n 汲: 'jí',\n 邴: 'bǐng',\n 糜: 'mí',\n 松: 'sōng',\n 井: 'jǐng',\n 段: 'duàn',\n 富: 'fù',\n 巫: 'wū',\n 乌: 'wū',\n 焦: 'jiāo',\n 巴: 'bā',\n 弓: 'gōng',\n 牧: 'mù',\n 隗: 'wěi',\n 山: 'shān',\n 谷: 'gǔ',\n 车: 'chē',\n 侯: 'hóu',\n 宓: 'mì',\n 蓬: 'péng',\n 全: 'quán',\n 郗: 'xī',\n 班: 'bān',\n 仰: 'yǎng',\n 秋: 'qiū',\n 仲: 'zhòng',\n 伊: 'yī',\n 宫: 'gōng',\n 宁: 'nìng',\n 仇: 'qiú',\n 栾: 'luán',\n 暴: 'bào',\n 甘: 'gān',\n 钭: 'tǒu',\n 厉: 'lì',\n 戎: 'róng',\n 祖: 'zǔ',\n 武: 'wǔ',\n 符: 'fú',\n 刘: 'liú',\n 景: 'jǐng',\n 詹: 'zhān',\n 束: 'shù',\n 龙: 'lóng',\n 叶: 'yè',\n 幸: 'xìng',\n 司: 'sī',\n 韶: 'sháo',\n 郜: 'gào',\n 黎: 'lí',\n 蓟: 'jì',\n 薄: 'bó',\n 印: 'yìn',\n 宿: 'sù',\n 白: 'bái',\n 怀: 'huái',\n 蒲: 'pú',\n 邰: 'tái',\n 从: 'cóng',\n 鄂: 'è',\n 索: 'suǒ',\n 咸: 'xián',\n 籍: 'jí',\n 赖: 'lài',\n 卓: 'zhuó',\n 蔺: 'lìn',\n 屠: 'tú',\n 蒙: 'méng',\n 池: 'chí',\n 乔: 'qiáo',\n 阴: 'yīn',\n 鬱: 'yù',\n 胥: 'xū',\n 能: 'nài',\n 苍: 'cāng',\n 双: 'shuāng',\n 闻: 'wén',\n 莘: 'shēn',\n 党: 'dǎng',\n 翟: 'zhái',\n 谭: 'tán',\n 贡: 'gòng',\n 劳: 'láo',\n 逄: 'páng',\n 姬: 'jī',\n 申: 'shēn',\n 扶: 'fú',\n 堵: 'dǔ',\n 冉: 'rǎn',\n 宰: 'zǎi',\n 郦: 'lì',\n 雍: 'yōng',\n 郤: 'xì',\n 璩: 'qú',\n 桑: 'sāng',\n 桂: 'guì',\n 濮: 'pú',\n 牛: 'niú',\n 寿: 'shòu',\n 通: 'tōng',\n 边: 'biān',\n 扈: 'hù',\n 燕: 'yān',\n 冀: 'jì',\n 郏: 'jiá',\n 浦: 'pǔ',\n 尚: 'shàng',\n 农: 'nóng',\n 温: 'wēn',\n 别: 'bié',\n 庄: 'zhuāng',\n 晏: 'yàn',\n 柴: 'chái',\n 瞿: 'qú',\n 阎: 'yán',\n 充: 'chōng',\n 慕: 'mù',\n 连: 'lián',\n 茹: 'rú',\n 习: 'xí',\n 宦: 'huàn',\n 艾: 'ài',\n 鱼: 'yú',\n 容: 'róng',\n 向: 'xiàng',\n 古: 'gǔ',\n 易: 'yì',\n 慎: 'shèn',\n 戈: 'gē',\n 廖: 'liào',\n 庾: 'yǔ',\n 终: 'zhōng',\n 暨: 'jì',\n 居: 'jū',\n 衡: 'héng',\n 步: 'bù',\n 都: 'dū',\n 耿: 'gěng',\n 满: 'mǎn',\n 弘: 'hóng',\n 匡: 'kuāng',\n 国: 'guó',\n 文: 'wén',\n 寇: 'kòu',\n 广: 'guǎng',\n 禄: 'lù',\n 阙: 'quē',\n 东: 'dōng',\n 欧: 'ōu',\n 殳: 'shū',\n 沃: 'wò',\n 利: 'lì',\n 蔚: 'wèi',\n 越: 'yuè',\n 夔: 'kuí',\n 隆: 'lóng',\n 师: 'shī',\n 巩: 'gǒng',\n 厍: 'shè',\n 聂: 'niè',\n 晁: 'cháo',\n 勾: 'gōu',\n 敖: 'áo',\n 融: 'róng',\n 冷: 'lěng',\n 訾: 'zī',\n 辛: 'xīn',\n 阚: 'kàn',\n 那: 'nā',\n 简: 'jiǎn',\n 饶: 'ráo',\n 空: 'kōng',\n 曾: 'zēng',\n 母: 'mǔ',\n 沙: 'shā',\n 乜: 'niè',\n 养: 'yǎng',\n 鞠: 'jū',\n 须: 'xū',\n 丰: 'fēng',\n 巢: 'cháo',\n 关: 'guān',\n 蒯: 'kuǎi',\n 相: 'xiàng',\n 查: 'zhā',\n 后: 'hòu',\n 荆: 'jīng',\n 红: 'hóng',\n 游: 'yóu',\n 竺: 'zhú',\n 权: 'quán',\n 逯: 'lù',\n 盖: 'gě',\n 益: 'yì',\n 桓: 'huán',\n 公: 'gōng',\n 牟: 'móu',\n 哈: 'hǎ',\n 言: 'yán',\n 福: 'fú',\n 肖: 'xiāo',\n 区: 'ōu',\n 覃: 'qín',\n 朴: 'piáo',\n 繁: 'pó',\n 员: 'yùn',\n 句: 'gōu',\n 要: 'yāo',\n 过: 'guō',\n 钻: 'zuān',\n 谌: 'chén',\n 折: 'shé',\n 召: 'shào',\n 郄: 'qiè',\n 撒: 'sǎ',\n 甯: 'nìng',\n 六: 'lù',\n 啜: 'chuài',\n 行: 'xíng'\n};\nconst PatternSurname = Object.keys(Surnames).map(key => ({\n zh: key,\n pinyin: Surnames[key],\n probability: 1 /* Probability.Surname */ + stringLength(key),\n length: stringLength(key),\n priority: Priority.Surname,\n dict: Symbol('surname')\n}));\nconst DICT2 = {\n 这个: 'zhè ge',\n 成为: 'chéng wéi',\n 认为: 'rèn wéi',\n 作为: 'zuò wéi',\n 部分: 'bù fen',\n 要求: 'yāo qiú',\n 应该: 'yīng gāi',\n 增长: 'zēng zhǎng',\n 提供: 'tí gōng',\n 觉得: 'jué de',\n 任务: 'rèn wu',\n 那个: 'nà ge',\n 称为: 'chēng wéi',\n 为主: 'wéi zhǔ',\n 了解: 'liǎo jiě',\n 处理: 'chǔ lǐ',\n 皇上: 'huáng shang',\n 只要: 'zhǐ yào',\n 大量: 'dà liàng',\n 力量: 'lì liàng',\n 几乎: 'jī hū',\n 干部: 'gàn bù',\n 目的: 'mù dì',\n 行为: 'xíng wéi',\n 只见: 'zhǐ jiàn',\n 认识: 'rèn shi',\n 市长: 'shì zhǎng',\n 师父: 'shī fu',\n 调查: 'diào chá',\n 重新: 'chóng xīn',\n 分为: 'fēn wéi',\n 知识: 'zhī shi',\n 导弹: 'dǎo dàn',\n 质量: 'zhì liàng',\n 行款: 'háng kuǎn',\n 行列: 'háng liè',\n 行话: 'háng huà',\n 行业: 'háng yè',\n 隔行: 'gé háng',\n 在行: 'zài háng',\n 行家: 'háng jia',\n 内行: 'nèi háng',\n 外行: 'wài háng',\n 同行: 'tóng háng',\n 本行: 'běn háng',\n 行伍: 'háng wǔ',\n 洋行: 'yáng háng',\n 银行: 'yín háng',\n 商行: 'shāng háng',\n 支行: 'zhī háng',\n 总行: 'zǒng háng',\n 行情: 'háng qíng',\n 懂行: 'dǒng háng',\n 行规: 'háng guī',\n 行当: 'háng dang',\n 行货: 'háng huò',\n 太行: 'tài háng',\n 入行: 'rù háng',\n 中行: 'zhōng háng',\n 农行: 'nóng háng',\n 工行: 'gōng háng',\n 建行: 'jiàn háng',\n 各行: \"gè háng\",\n 行号: 'háng hào',\n 行高: 'háng gāo',\n 行首: 'háng shǒu',\n 行尾: 'háng wěi',\n 行末: 'háng mò',\n 行长: 'háng cháng',\n 行距: 'háng jù',\n 换行: 'huàn háng',\n 行会: 'háng huì',\n 行辈: 'háng bèi',\n 行道: 'háng dào',\n 道行: 'dào heng',\n 参与: 'cān yù',\n 充分: 'chōng fèn',\n 尽管: 'jǐn guǎn',\n 生长: 'shēng zhǎng',\n 数量: 'shù liàng',\n 应当: 'yīng dāng',\n 院长: 'yuàn zhǎng',\n 强调: 'qiáng diào',\n 只能: 'zhǐ néng',\n 音乐: 'yīn yuè',\n 以为: 'yǐ wéi',\n 处于: 'chǔ yú',\n 部长: 'bù zhǎng',\n 蒙古: 'měng gǔ',\n 只有: 'zhǐ yǒu',\n 适当: 'shì dàng',\n 只好: 'zhǐ hǎo',\n 成长: 'chéng zhǎng',\n 高兴: 'gāo xìng',\n 不了: 'bù liǎo',\n 产量: 'chǎn liàng',\n 胖子: 'pàng zi',\n 显得: 'xiǎn de',\n 只是: 'zhǐ shì',\n 似的: 'shì de',\n 率领: 'shuài lǐng',\n 改为: 'gǎi wéi',\n 不禁: 'bù jīn',\n 成分: 'chéng fèn',\n 答应: 'dā ying',\n 少年: 'shào nián',\n 兴趣: 'xìng qù',\n 太监: 'tài jian',\n 休息: 'xiū xi',\n 校长: 'xiào zhǎng',\n 更新: 'gēng xīn',\n 合同: 'hé tong',\n 喝道: 'hè dào',\n 重庆: 'chóng qìng',\n 重建: 'chóng jiàn',\n 使得: 'shǐ de',\n 审查: 'shěn chá',\n 累计: 'lěi jì',\n 给予: 'jǐ yǔ',\n 极为: 'jí wéi',\n 冠军: 'guàn jūn',\n 仿佛: 'fǎng fú',\n 头发: 'tóu fa',\n 投降: 'tóu xiáng',\n 家长: 'jiā zhǎng',\n 仔细: 'zǐ xì',\n 要是: 'yào shi',\n 将领: 'jiàng lǐng',\n 含量: 'hán liàng',\n 更为: 'gèng wéi',\n 积累: 'jī lěi',\n 地处: 'dì chǔ',\n 县长: 'xiàn zhǎng',\n 少女: 'shào nǚ',\n 路上: 'lù shang',\n 只怕: 'zhǐ pà',\n 能量: 'néng liàng',\n 储量: 'chǔ liàng',\n 供应: 'gōng yìng',\n 挑战: 'tiǎo zhàn',\n 西藏: 'xī zàng',\n 记得: 'jì de',\n 总量: 'zǒng liàng',\n 当真: 'dàng zhēn',\n 将士: 'jiàng shì',\n 差别: 'chā bié',\n 较为: 'jiào wéi',\n 长老: 'zhǎng lǎo',\n 大夫: 'dài fu',\n 差异: 'chā yì',\n 懂得: 'dǒng de',\n 尽量: 'jǐn liàng',\n 模样: 'mú yàng',\n 的确: 'dí què',\n 为首: 'wéi shǒu',\n 便宜: 'pián yi',\n 更名: 'gēng míng',\n 石头: 'shí tou',\n 州长: 'zhōu zhǎng',\n 为止: 'wéi zhǐ',\n 漂亮: 'piào liang',\n 炮弹: 'pào dàn',\n 藏族: 'zàng zú',\n 角色: 'jué sè',\n 当作: 'dàng zuò',\n 尽快: 'jǐn kuài',\n 人为: 'rén wéi',\n 重复: 'chóng fù',\n 胡同: 'hú tòng',\n 差距: 'chā jù',\n 弟兄: 'dì xiong',\n 大将: 'dà jiàng',\n 睡觉: 'shuì jiào',\n 一觉: 'yí jiào',\n 团长: 'tuán zhǎng',\n 队长: 'duì zhǎng',\n 区长: 'qū zhǎng',\n 难得: 'nán dé',\n 丫头: 'yā tou',\n 会长: 'huì zhǎng',\n 弟弟: 'dì di',\n 王爷: 'wáng ye',\n 重量: 'zhòng liàng',\n 誉为: 'yù wéi',\n 家伙: 'jiā huo',\n 华山: 'huà shān',\n 椅子: 'yǐ zi',\n 流量: 'liú liàng',\n 长大: 'zhǎng dà',\n 勉强: 'miǎn qiǎng',\n 会计: 'kuài jì',\n 过分: 'guò fèn',\n 济南: 'jǐ nán',\n 调动: 'diào dòng',\n 燕京: 'yān jīng',\n 少将: 'shào jiàng',\n 中毒: 'zhòng dú',\n 晓得: 'xiǎo de',\n 变更: 'biàn gēng',\n 打更: 'dǎ gēng',\n 认得: 'rèn de',\n 苹果: 'píng guǒ',\n 念头: 'niàn tou',\n 挣扎: 'zhēng zhá',\n 三藏: 'sān zàng',\n 剥削: 'bō xuē',\n 丞相: 'chéng xiàng',\n 少量: 'shǎo liàng',\n 寻思: 'xún si',\n 夺得: 'duó dé',\n 干线: 'gàn xiàn',\n 呼吁: 'hū yù',\n 处罚: 'chǔ fá',\n 长官: 'zhǎng guān',\n 柏林: 'bó lín',\n 亲戚: 'qīn qi',\n 身分: 'shēn fèn',\n 胳膊: 'gē bo',\n 着手: 'zhuó shǒu',\n 炸弹: 'zhà dàn',\n 咳嗽: 'ké sou',\n 叶子: 'yè zi',\n 外长: 'wài zhǎng',\n 供给: 'gōng jǐ',\n 师长: 'shī zhǎng',\n 变量: 'biàn liàng',\n 应有: 'yīng yǒu',\n 下载: 'xià zài',\n 乐器: 'yuè qì',\n 间接: 'jiàn jiē',\n 底下: 'dǐ xià',\n 打扮: 'dǎ bàn',\n 子弹: 'zǐ dàn',\n 弹药: 'dàn yào',\n 热量: 'rè liàng',\n 削弱: 'xuē ruò',\n 骨干: 'gǔ gàn',\n 容量: 'róng liàng',\n 模糊: 'mó hu',\n 转动: 'zhuàn dòng',\n 称呼: 'chēng hu',\n 科长: 'kē zhǎng',\n 处置: 'chǔ zhì',\n 着重: 'zhuó zhòng',\n 着急: 'zháo jí',\n 强迫: 'qiǎng pò',\n 庭长: 'tíng zhǎng',\n 首相: 'shǒu xiàng',\n 喇嘛: 'lǎ ma',\n 镇长: 'zhèn zhǎng',\n 只管: 'zhǐ guǎn',\n 重重: 'chóng chóng',\n 免得: 'miǎn de',\n 着实: 'zhuó shí',\n 度假: 'dù jià',\n 真相: 'zhēn xiàng',\n 相貌: 'xiàng mào',\n 处分: 'chǔ fèn',\n 委屈: 'wěi qu',\n 为期: 'wéi qī',\n 伯伯: 'bó bo',\n 伯子: 'bǎi zi',\n 圈子: 'quān zi',\n 见识: 'jiàn shi',\n 笼罩: 'lǒng zhào',\n 与会: 'yù huì',\n 都督: 'dū du',\n 都市: 'dū shì',\n 成都: 'chéng dū',\n 首都: 'shǒu dū',\n 帝都: 'dì dū',\n 王都: 'wáng dū',\n 东都: 'dōng dū',\n 都护: 'dū hù',\n 都城: 'dū chéng',\n 建都: 'jiàn dū',\n 迁都: 'qiān dū',\n 故都: 'gù dū',\n 定都: 'dìng dū',\n 中都: 'zhōng dū',\n 六安: 'lù ān',\n 宰相: 'zǎi xiàng',\n 较量: 'jiào liàng',\n 对称: 'duì chèn',\n 总长: 'zǒng zhǎng',\n 相公: 'xiàng gong',\n 空白: 'kòng bái',\n 打量: 'dǎ liang',\n 水分: 'shuǐ fèn',\n 舌头: 'shé tou',\n 没收: 'mò shōu',\n 行李: 'xíng li',\n 判处: 'pàn chǔ',\n 散文: 'sǎn wén',\n 处境: 'chǔ jìng',\n 孙子: 'sūn zi',\n 拳头: 'quán tou',\n 打发: 'dǎ fā',\n 组长: 'zǔ zhǎng',\n 骨头: 'gǔ tou',\n 宁可: 'nìng kě',\n 更换: 'gēng huàn',\n 薄弱: 'bó ruò',\n 还原: 'huán yuán',\n 重修: 'chóng xiū',\n 重来: 'chóng lái',\n 只顾: 'zhǐ gù',\n 爱好: 'ài hào',\n 馒头: 'mán tou',\n 军长: 'jūn zhǎng',\n 首长: 'shǒu zhǎng',\n 厂长: 'chǎng zhǎng',\n 司长: 'sī zhǎng',\n 长子: 'zhǎng zǐ',\n 强劲: 'qiáng jìng',\n 恰当: 'qià dàng',\n 头儿: 'tóu er',\n 站长: 'zhàn zhǎng',\n 折腾: 'zhē teng',\n 相处: 'xiāng chǔ',\n 统率: 'tǒng shuài',\n 中将: 'zhōng jiàng',\n 命中: 'mìng zhòng',\n 名将: 'míng jiàng',\n 木头: 'mù tou',\n 动弹: 'dòng tan',\n 地壳: 'dì qiào',\n 干活: 'gàn huó',\n 少爷: 'shào ye',\n 水量: 'shuǐ liàng',\n 补给: 'bǔ jǐ',\n 尾巴: 'wěi ba',\n 来得: 'lái de',\n 好奇: 'hào qí',\n 钥匙: 'yào shi',\n 当做: 'dàng zuò',\n 沉着: 'chén zhuó',\n 哑巴: 'yǎ ba',\n 车子: 'chē zi',\n 上将: 'shàng jiàng',\n 恶心: 'ě xīn',\n 担子: 'dàn zi',\n 应届: 'yīng jiè',\n 主角: 'zhǔ jué',\n 运转: 'yùn zhuǎn',\n 兄长: 'xiōng zhǎng',\n 格式: 'gé shì',\n 正月: 'zhēng yuè',\n 营长: 'yíng zhǎng',\n 当成: 'dàng chéng',\n 女婿: 'nǚ xu',\n 咽喉: 'yān hóu',\n 重阳: 'chóng yáng',\n 化为: 'huà wéi',\n 吐蕃: 'tǔ bō',\n 钻进: 'zuān jìn',\n 乐队: 'yuè duì',\n 亮相: 'liàng xiàng',\n 被子: 'bèi zi',\n 舍得: 'shě de',\n 杉木: 'shā mù',\n 击中: 'jī zhòng',\n 排长: 'pái zhǎng',\n 假期: 'jià qī',\n 分量: 'fèn liàng',\n 数次: 'shù cì',\n 提防: 'dī fáng',\n 吆喝: 'yāo he',\n 查处: 'chá chǔ',\n 量子: 'liàng zǐ',\n 里头: 'lǐ tou',\n 调研: 'diào yán',\n 伺候: 'cì hou',\n 重申: 'chóng shēn',\n 枕头: 'zhěn tou',\n 拚命: 'pīn mìng',\n 社长: 'shè zhǎng',\n 归还: 'guī huán',\n 批量: 'pī liàng',\n 畜牧: 'xù mù',\n 点着: 'diǎn zháo',\n 甚为: 'shèn wéi',\n 小将: 'xiǎo jiàng',\n 着眼: 'zhuó yǎn',\n 处死: 'chǔ sǐ',\n 厌恶: 'yàn wù',\n 鼓乐: 'gǔ yuè',\n 树干: 'shù gàn',\n 秘鲁: 'bì lǔ',\n 大方: 'dà fāng',\n 外头: 'wài tou',\n 班长: 'bān zhǎng',\n 星宿: 'xīng xiù',\n 宁愿: 'nìng yuàn',\n 钦差: 'qīn chāi',\n 为数: 'wéi shù',\n 勾当: 'gòu dàng',\n 削减: 'xuē jiǎn',\n 间谍: 'jiàn dié',\n 埋怨: 'mán yuàn',\n 结实: 'jiē shi',\n 计量: 'jì liáng',\n 淹没: 'yān mò',\n 村长: 'cūn zhǎng',\n 连长: 'lián zhǎng',\n 自给: 'zì jǐ',\n 武将: 'wǔ jiàng',\n 温差: 'wēn chā',\n 直奔: 'zhí bèn',\n 供求: 'gōng qiú',\n 剂量: 'jì liàng',\n 道长: 'dào zhǎng',\n 泄露: 'xiè lòu',\n 王八: 'wáng ba',\n 切割: 'qiē gē',\n 间隔: 'jiàn gé',\n 一晃: 'yì huǎng',\n 长假: 'cháng jià',\n 令狐: 'líng hú',\n 为害: 'wéi hài',\n 句子: 'jù zi',\n 偿还: 'cháng huán',\n 疙瘩: 'gē da',\n 燕山: 'yān shān',\n 堵塞: 'dǔ sè',\n 夺冠: 'duó guàn',\n 扎实: 'zhā shi',\n 电荷: 'diàn hè',\n 看守: 'kān shǒu',\n 复辟: 'fù bì',\n 郁闷: 'yù mèn',\n 尽早: 'jǐn zǎo',\n 切断: 'qiē duàn',\n 指头: 'zhǐ tou',\n 为生: 'wéi shēng',\n 畜生: 'chù sheng',\n 切除: 'qiē chú',\n 着力: 'zhuó lì',\n 着想: 'zhuó xiǎng',\n 级差: 'jí chā',\n 投奔: 'tóu bèn',\n 棍子: 'gùn zi',\n 含糊: 'hán hu',\n 少妇: 'shào fù',\n 兴致: 'xìng zhì',\n 纳闷: 'nà mèn',\n 干流: 'gàn liú',\n 卷起: 'juǎn qǐ',\n 扇子: 'shàn zi',\n 更改: 'gēng gǎi',\n 笼络: 'lǒng luò',\n 喇叭: 'lǎ ba',\n 载荷: 'zài hè',\n 妥当: 'tuǒ dàng',\n 为难: 'wéi nán',\n 着陆: 'zhuó lù',\n 燕子: 'yàn zi',\n 干吗: 'gàn má',\n 白发: 'bái fà',\n 总得: 'zǒng děi',\n 夹击: 'jiā jī',\n 曝光: 'bào guāng',\n 曲调: 'qǔ diào',\n 相机: 'xiàng jī',\n 叫化: 'jiào huà',\n 角逐: 'jué zhú',\n 啊哟: 'ā yō',\n 载重: 'zài zhòng',\n 长辈: 'zhǎng bèi',\n 出差: 'chū chāi',\n 垛口: 'duǒ kǒu',\n 撇开: 'piē kāi',\n 厅长: 'tīng zhǎng',\n 组分: 'zǔ fèn',\n 误差: 'wù chā',\n 家当: 'jiā dàng',\n 传记: 'zhuàn jì',\n 个子: 'gè zi',\n 铺设: 'pū shè',\n 干事: 'gàn shì',\n 杆菌: 'gǎn jūn',\n 定量: 'dìng liàng',\n 运载: 'yùn zài',\n 会儿: 'huì er',\n 酋长: 'qiú zhǎng',\n 重返: 'chóng fǎn',\n 差额: 'chā é',\n 露面: 'lòu miàn',\n 钻研: 'zuān yán',\n 大城: 'dài chéng',\n 上当: 'shàng dàng',\n 销量: 'xiāo liàng',\n 作坊: 'zuō fang',\n 照相: 'zhào xiàng',\n 哎呀: 'āi yā',\n 调集: 'diào jí',\n 看中: 'kàn zhòng',\n 议长: 'yì zhǎng',\n 风筝: 'fēng zheng',\n 辟邪: 'bì xié',\n 空隙: 'kòng xì',\n 更迭: 'gēng dié',\n 偏差: 'piān chā',\n 声调: 'shēng diào',\n 适量: 'shì liàng',\n 屯子: 'tún zi',\n 无量: 'wú liàng',\n 空地: 'kòng dì',\n 调度: 'diào dù',\n 散射: 'sǎn shè',\n 创伤: 'chuāng shāng',\n 海参: 'hǎi shēn',\n 满载: 'mǎn zài',\n 重叠: 'chóng dié',\n 落差: 'luò chā',\n 单调: 'dān diào',\n 老将: 'lǎo jiàng',\n 人参: 'rén shēn',\n 间断: 'jiàn duàn',\n 重现: 'chóng xiàn',\n 夹杂: 'jiā zá',\n 调用: 'diào yòng',\n 萝卜: 'luó bo',\n 附着: 'fù zhuó',\n 应声: 'yìng shēng',\n 主将: 'zhǔ jiàng',\n 罪过: 'zuì guo',\n 咀嚼: 'jǔ jué',\n 为政: 'wéi zhèng',\n 过量: 'guò liàng',\n 乐曲: 'yuè qǔ',\n 负荷: 'fù hè',\n 枪弹: 'qiāng dàn',\n 悄然: 'qiǎo rán',\n 处方: 'chǔ fāng',\n 悄声: 'qiǎo shēng',\n 曲子: 'qǔ zi',\n 情调: 'qíng diào',\n 挑衅: 'tiǎo xìn',\n 代为: 'dài wéi',\n 了结: 'liǎo jié',\n 打中: 'dǎ zhòng',\n 酒吧: 'jiǔ bā',\n 懒得: 'lǎn de',\n 增量: 'zēng liàng',\n 衣着: 'yī zhuó',\n 部将: 'bù jiàng',\n 要塞: 'yào sài',\n 茶几: 'chá jī',\n 杠杆: 'gàng gǎn',\n 出没: 'chū mò',\n 鲜有: 'xiǎn yǒu',\n 间隙: 'jiàn xì',\n 重担: 'zhòng dàn',\n 重演: 'chóng yǎn',\n 重试: 'chóng shì',\n 应酬: 'yìng chou',\n 只当: 'zhǐ dāng',\n 毋宁: 'wú nìng',\n 包扎: 'bāo zā',\n 前头: 'qián tou',\n 卷烟: 'juǎn yān',\n 非得: 'fēi děi',\n 弹道: 'dàn dào',\n 杆子: 'gān zi',\n 门将: 'mén jiàng',\n 后头: 'hòu tou',\n 喝彩: 'hè cǎi',\n 暖和: 'nuǎn huo',\n 累积: 'lěi jī',\n 调遣: 'diào qiǎn',\n 倔强: 'jué jiàng',\n 宝藏: 'bǎo zàng',\n 丧事: 'sāng shì',\n 约莫: 'yuē mo',\n 纤夫: 'qiàn fū',\n 更替: 'gēng tì',\n 装载: 'zhuāng zài',\n 背包: 'bēi bāo',\n 帖子: 'tiě zi',\n 松散: 'sōng sǎn',\n 呼喝: 'hū hè',\n 可恶: 'kě wù',\n 自转: 'zì zhuàn',\n 供电: 'gōng diàn',\n 反省: 'fǎn xǐng',\n 坦率: 'tǎn shuài',\n 苏打: 'sū dá',\n 本分: 'běn fèn',\n 落得: 'luò de',\n 鄙薄: 'bǐ bó',\n 相间: 'xiāng jiàn',\n 单薄: 'dān bó',\n 混蛋: 'hún dàn',\n 贞观: 'zhēn guān',\n 附和: 'fù hè',\n 能耐: 'néng nài',\n 吓唬: 'xià hu',\n 未了: 'wèi liǎo',\n 引着: 'yǐn zháo',\n 抽调: 'chōu diào',\n 沙子: 'shā zi',\n 席卷: 'xí juǎn',\n 标的: 'biāo dì',\n 别扭: 'biè niu',\n 思量: 'sī liang',\n 喝采: 'hè cǎi',\n 论语: 'lún yǔ',\n 盖子: 'gài zi',\n 分外: 'fèn wài',\n 弄堂: 'lòng táng',\n 乐舞: 'yuè wǔ',\n 雨量: 'yǔ liàng',\n 毛发: 'máo fà',\n 差遣: 'chāi qiǎn',\n 背负: 'bēi fù',\n 转速: 'zhuàn sù',\n 声乐: 'shēng yuè',\n 夹攻: 'jiā gōng',\n 供水: 'gōng shuǐ',\n 主干: 'zhǔ gàn',\n 惩处: 'chéng chǔ',\n 长相: 'zhǎng xiàng',\n 公差: 'gōng chāi',\n 榴弹: 'liú dàn',\n 省得: 'shěng de',\n 条子: 'tiáo zi',\n 重围: 'chóng wéi',\n 阻塞: 'zǔ sè',\n 劲风: 'jìng fēng',\n 纠葛: 'jiū gé',\n 颠簸: 'diān bǒ',\n 点中: 'diǎn zhòng',\n 重创: 'zhòng chuāng',\n 姥姥: 'lǎo lao',\n 迷糊: 'mí hu',\n 公家: 'gōng jia',\n 几率: 'jī lǜ',\n 苦闷: 'kǔ mèn',\n 度量: 'dù liàng',\n 差错: 'chā cuò',\n 暑假: 'shǔ jià',\n 参差: 'cēn cī',\n 搭载: 'dā zài',\n 助长: 'zhù zhǎng',\n 相称: 'xiāng chèn',\n 红晕: 'hóng yùn',\n 舍命: 'shě mìng',\n 喜好: 'xǐ hào',\n 列传: 'liè zhuàn',\n 劲敌: 'jìng dí',\n 蛤蟆: 'há ma',\n 请假: 'qǐng jià',\n 钉子: 'dīng zi',\n 沉没: 'chén mò',\n 高丽: 'gāo lí',\n 休假: 'xiū jià',\n 无为: 'wú wéi',\n 巴结: 'bā jie',\n 了得: 'liǎo dé',\n 变相: 'biàn xiàng',\n 核弹: 'hé dàn',\n 亲家: 'qìng jia',\n 承载: 'chéng zài',\n 喝问: 'hè wèn',\n 还击: 'huán jī',\n 交还: 'jiāo huán',\n 将令: 'jiàng lìng',\n 单于: 'chán yú',\n 空缺: 'kòng quē',\n 绿林: 'lù lín',\n 胆量: 'dǎn liàng',\n 执着: 'zhí zhuó',\n 低调: 'dī diào',\n 闭塞: 'bì sè',\n 轻薄: 'qīng bó',\n 得当: 'dé dàng',\n 占卜: 'zhān bǔ',\n 扫帚: 'sào zhou',\n 龟兹: 'qiū cí',\n 年长: 'nián zhǎng',\n 外传: 'wài zhuàn',\n 头子: 'tóu zi',\n 裁缝: 'cái feng',\n 礼乐: 'lǐ yuè',\n 血泊: 'xuè pō',\n 散乱: 'sǎn luàn',\n 动量: 'dòng liàng',\n 倒腾: 'dǎo teng',\n 取舍: 'qǔ shě',\n 咱家: 'zán jiā',\n 长发: 'cháng fà',\n 爪哇: 'zhǎo wā',\n 弹壳: 'dàn ké',\n 省悟: 'xǐng wù',\n 嚷嚷: 'rāng rang',\n 连累: 'lián lèi',\n 应得: 'yīng dé',\n 族长: 'zú zhǎng',\n 柜子: 'guì zi',\n 擂鼓: 'léi gǔ',\n 眩晕: 'xuàn yùn',\n 调配: 'tiáo pèi',\n 躯干: 'qū gàn',\n 差役: 'chāi yì',\n 坎坷: 'kǎn kě',\n 少儿: 'shào ér',\n 乐团: 'yuè tuán',\n 养分: 'yǎng fèn',\n 退还: 'tuì huán',\n 格调: 'gé diào',\n 语调: 'yǔ diào',\n 音调: 'yīn diào',\n 乐府: 'yuè fǔ',\n 古朴: 'gǔ pǔ',\n 打点: 'dǎ diǎn',\n 差使: 'chāi shǐ',\n 匀称: 'yún chèn',\n 瘦削: 'shòu xuē',\n 膏药: 'gāo yao',\n 吞没: 'tūn mò',\n 调任: 'diào rèn',\n 散居: 'sǎn jū',\n 上头: 'shàng tóu',\n 风靡: 'fēng mǐ',\n 放假: 'fàng jià',\n 估量: 'gū liang',\n 失当: 'shī dàng',\n 中弹: 'zhòng dàn',\n 妄为: 'wàng wéi',\n 长者: 'zhǎng zhě',\n 起哄: 'qǐ hòng',\n 末了: 'mò liǎo',\n 相声: 'xiàng sheng',\n 校正: 'jiào zhèng',\n 劝降: 'quàn xiáng',\n 矢量: 'shǐ liàng',\n 沉闷: 'chén mèn',\n 给与: 'jǐ yǔ',\n 解法: 'jiě fǎ',\n 塞外: 'sài wài',\n 将校: 'jiàng xiào',\n 嗜好: 'shì hào',\n 没落: 'mò luò',\n 朴刀: 'pō dāo',\n 片子: 'piān zi',\n 切削: 'qiē xiāo',\n 弹丸: 'dàn wán',\n 稀薄: 'xī bó',\n 亏得: 'kuī dé',\n 间歇: 'jiàn xiē',\n 翘首: 'qiáo shǒu',\n 色调: 'sè diào',\n 处决: 'chǔ jué',\n 表率: 'biǎo shuài',\n 尺子: 'chǐ zi',\n 招降: 'zhāo xiáng',\n 称职: 'chèn zhí',\n 斗篷: 'dǒu peng',\n 铺子: 'pù zi',\n 底子: 'dǐ zi',\n 负载: 'fù zài',\n 干警: 'gàn jǐng',\n 倒数: 'dào shǔ',\n 将官: 'jiàng guān',\n 锄头: 'chú tou',\n 归降: 'guī xiáng',\n 疟疾: 'nüè ji',\n 唠叨: 'láo dao',\n 限量: 'xiàn liàng',\n 屏息: 'bǐng xī',\n 重逢: 'chóng féng',\n 器乐: 'qì yuè',\n 氢弹: 'qīng dàn',\n 脖颈: 'bó gěng',\n 妃子: 'fēi zi',\n 处事: 'chǔ shì',\n 参量: 'cān liàng',\n 轻率: 'qīng shuài',\n 缥缈: 'piāo miǎo',\n 中奖: 'zhòng jiǎng',\n 才干: 'cái gàn',\n 施舍: 'shī shě',\n 卷子: 'juàn zi',\n 游说: 'yóu shuì',\n 巷子: 'xiàng zi',\n 膀胱: 'páng guāng',\n 切勿: 'qiè wù',\n 看管: 'kān guǎn',\n 风头: 'fēng tou',\n 精干: 'jīng gàn',\n 高差: 'gāo chā',\n 恐吓: 'kǒng hè',\n 扁担: 'biǎn dàn',\n 给养: 'jǐ yǎng',\n 格子: 'gé zi',\n 供需: 'gōng xū',\n 反差: 'fǎn chā',\n 飞弹: 'fēi dàn',\n 微薄: 'wēi bó',\n 发型: 'fà xíng',\n 即兴: 'jí xìng',\n 攒动: 'cuán dòng',\n 间或: 'jiàn huò',\n 浅薄: 'qiǎn bó',\n 乐章: 'yuè zhāng',\n 顺差: 'shùn chā',\n 调子: 'diào zi',\n 相位: 'xiàng wèi',\n 转子: 'zhuàn zǐ',\n 劲旅: 'jìng lǚ',\n 咔嚓: 'kā chā',\n 了事: 'liǎo shì',\n 转悠: 'zhuàn you',\n 当铺: 'dàng pù',\n 爪子: 'zhuǎ zi',\n 单子: 'dān zi',\n 好战: 'hào zhàn',\n 燕麦: 'yàn mài',\n 只许: 'zhǐ xǔ',\n 干练: 'gàn liàn',\n 女将: 'nǚ jiàng',\n 酒量: 'jiǔ liàng',\n 划船: 'huá chuán',\n 伎俩: 'jì liǎng',\n 挑拨: 'tiǎo bō',\n 少校: 'shào xiào',\n 着落: 'zhuó luò',\n 憎恶: 'zēng wù',\n 刻薄: 'kè bó',\n 要挟: 'yāo xié',\n 用处: 'yòng chu',\n 还手: 'huán shǒu',\n 模具: 'mú jù',\n 执著: 'zhí zhuó',\n 喝令: 'hè lìng',\n 保长: 'bǎo zhǎng',\n 吸着: 'xī zhe',\n 症结: 'zhēng jié',\n 公转: 'gōng zhuàn',\n 校勘: 'jiào kān',\n 重提: 'chóng tí',\n 扫兴: 'sǎo xìng',\n 铺盖: 'pū gài',\n 长史: 'zhǎng shǐ',\n 差价: 'chā jià',\n 压根: 'yà gēn',\n 怔住: 'zhèng zhù',\n 应允: 'yīng yǔn',\n 切入: 'qiē rù',\n 战将: 'zhàn jiàng',\n 年少: 'nián shào',\n 舍身: 'shě shēn',\n 执拗: 'zhí niù',\n 处世: 'chǔ shì',\n 中风: 'zhòng fēng',\n 等量: 'děng liàng',\n 放量: 'fàng liàng',\n 腔调: 'qiāng diào',\n 老少: 'lǎo shào',\n 没入: 'mò rù',\n 瓜葛: 'guā gé',\n 将帅: 'jiàng shuài',\n 车载: 'chē zài',\n 窝囊: 'wō nang',\n 长进: 'zhǎng jìn',\n 可汗: 'kè hán',\n 并州: 'bīng zhōu',\n 供销: 'gōng xiāo',\n 切片: 'qiē piàn',\n 差事: 'chāi shì',\n 知会: 'zhī hui',\n 鹰爪: 'yīng zhǎo',\n 处女: 'chǔ nǚ',\n 切磋: 'qiē cuō',\n 日头: 'rì tou',\n 押解: 'yā jiè',\n 滋长: 'zī zhǎng',\n 道观: 'dào guàn',\n 脚色: 'jué sè',\n 当量: 'dāng liàng',\n 婆家: 'pó jia',\n 缘分: 'yuán fèn',\n 空闲: 'kòng xián',\n 好色: 'hào sè',\n 怒喝: 'nù hè',\n 笼统: 'lǒng tǒng',\n 边塞: 'biān sài',\n 何曾: 'hé céng',\n 重合: 'chóng hé',\n 零散: 'líng sǎn',\n 轰隆: 'hōng lōng',\n 化子: 'huà zi',\n 内蒙: 'nèi měng',\n 数落: 'shǔ luò',\n 逆差: 'nì chā',\n 牟利: 'móu lì',\n 栅栏: 'zhà lan',\n 中标: 'zhòng biāo',\n 调档: 'diào dàng',\n 佝偻: 'gōu lóu',\n 场子: 'chǎng zi',\n 甲壳: 'jiǎ qiào',\n 重温: 'chóng wēn',\n 炮制: 'páo zhì',\n 返还: 'fǎn huán',\n 自传: 'zì zhuàn',\n 高调: 'gāo diào',\n 殷红: 'yān hóng',\n 固着: 'gù zhuó',\n 强求: 'qiǎng qiú',\n 本相: 'běn xiàng',\n 骄横: 'jiāo hèng',\n 草率: 'cǎo shuài',\n 气闷: 'qì mèn',\n 着色: 'zhuó sè',\n 宁肯: 'nìng kěn',\n 兴头: 'xìng tou',\n 拘泥: 'jū nì',\n 夹角: 'jiā jiǎo',\n 发髻: 'fà jì',\n 猛将: 'měng jiàng',\n 约摸: 'yuē mo',\n 拖累: 'tuō lěi',\n 呢绒: 'ní róng',\n 钻探: 'zuān tàn',\n 夹层: 'jiā céng',\n 落魄: 'luò pò',\n 巷道: 'hàng dào',\n 运量: 'yùn liàng',\n 解闷: 'jiě mèn',\n 空儿: 'kòng er',\n 估摸: 'gū mo',\n 好客: 'hào kè',\n 钻孔: 'zuān kǒng',\n 糊弄: 'hù nòng',\n 荥阳: 'xíng yáng',\n 烦闷: 'fán mèn',\n 仓卒: 'cāng cù',\n 分叉: 'fēn chà',\n 厂子: 'chǎng zi',\n 小调: 'xiǎo diào',\n 少阳: 'shào yáng',\n 受降: 'shòu xiáng',\n 染坊: 'rǎn fáng',\n 胳臂: 'gē bei',\n 将门: 'jiàng mén',\n 模板: 'mú bǎn',\n 配给: 'pèi jǐ',\n 为伍: 'wéi wǔ',\n 跟头: 'gēn tou',\n 划算: 'huá suàn',\n 累赘: 'léi zhui',\n 哄笑: 'hōng xiào',\n 晕眩: 'yūn xuàn',\n 干掉: 'gàn diào',\n 缝制: 'féng zhì',\n 难处: 'nán chù',\n 着意: 'zhuó yì',\n 蛮横: 'mán hèng',\n 奇数: 'jī shù',\n 短发: 'duǎn fà',\n 生还: 'shēng huán',\n 还清: 'huán qīng',\n 看护: 'kān hù',\n 直率: 'zhí shuài',\n 奏乐: 'zòu yuè',\n 载客: 'zài kè',\n 专横: 'zhuān hèng',\n 湮没: 'yān mò',\n 空格: 'kòng gé',\n 铺垫: 'pū diàn',\n 良将: 'liáng jiàng',\n 哗啦: 'huā lā',\n 散漫: 'sǎn màn',\n 脱发: 'tuō fà',\n 送还: 'sòng huán',\n 埋没: 'mái mò',\n 累及: 'lěi jí',\n 薄雾: 'bó wù',\n 调离: 'diào lí',\n 舌苔: 'shé tāi',\n 机长: 'jī zhǎng',\n 栓塞: 'shuān sè',\n 配角: 'pèi jué',\n 切口: 'qiē kǒu',\n 创口: 'chuāng kǒu',\n 哈欠: 'hā qian',\n 实弹: 'shí dàn',\n 铺平: 'pū píng',\n 哈达: 'hǎ dá',\n 懒散: 'lǎn sǎn',\n 实干: 'shí gàn',\n 填空: 'tián kòng',\n 刁钻: 'diāo zuān',\n 乐师: 'yuè shī',\n 量变: 'liàng biàn',\n 诱降: 'yòu xiáng',\n 搪塞: 'táng sè',\n 征调: 'zhēng diào',\n 夹道: 'jiā dào',\n 干咳: 'gān ké',\n 止咳: 'zhǐ ké',\n 乐工: 'yuè gōng',\n 划过: 'huá guò',\n 着火: 'zháo huǒ',\n 更正: 'gēng zhèng',\n 给付: 'jǐ fù',\n 空子: 'kòng zi',\n 哪吒: 'né zhā',\n 正着: 'zhèng zháo',\n 刷子: 'shuā zi',\n 丧葬: 'sāng zàng',\n 夹带: 'jiā dài',\n 安分: 'ān fèn',\n 中意: 'zhòng yì',\n 长孙: 'zhǎng sūn',\n 校订: 'jiào dìng',\n 卷曲: 'juǎn qū',\n 载运: 'zài yùn',\n 投弹: 'tóu dàn',\n 柞蚕: 'zuò cán',\n 份量: 'fèn liàng',\n 调换: 'diào huàn',\n 了然: 'liǎo rán',\n 咧嘴: 'liě zuǐ',\n 典当: 'diǎn dàng',\n 寒假: 'hán jià',\n 长兄: 'zhǎng xiōng',\n 给水: 'jǐ shuǐ',\n 须发: 'xū fà',\n 枝干: 'zhī gàn',\n 属相: 'shǔ xiàng',\n 哄抢: 'hōng qiǎng',\n 刻划: 'kè huà',\n 塞子: 'sāi zi',\n 单干: 'dān gàn',\n 还乡: 'huán xiāng',\n 兆头: 'zhào tou',\n 寺观: 'sì guàn',\n 督率: 'dū shuài',\n 啊哈: 'ā ha',\n 割舍: 'gē shě',\n 抹布: 'mā bù',\n 好恶: 'hào wù',\n 下处: 'xià chǔ',\n 消长: 'xiāo zhǎng',\n 离间: 'lí jiàn',\n 准头: 'zhǔn tou',\n 校对: 'jiào duì',\n 什物: 'shí wù',\n 番禺: 'pān yú',\n 佛爷: 'fó ye',\n 吗啡: 'mǎ fēi',\n 盐分: 'yán fèn',\n 虎将: 'hǔ jiàng',\n 薄荷: 'bò he',\n 独处: 'dú chǔ',\n 空位: 'kòng wèi',\n 铺路: 'pū lù',\n 乌拉: 'wū lā',\n 调回: 'diào huí',\n 来头: 'lái tou',\n 闲散: 'xián sǎn',\n 胶卷: 'jiāo juǎn',\n 冒失: 'mào shi',\n 干劲: 'gàn jìn',\n 弦乐: 'xián yuè',\n 相国: 'xiàng guó',\n 丹参: 'dān shēn',\n 助兴: 'zhù xìng',\n 铺开: 'pū kāi',\n 次长: 'cì zhǎng',\n 发卡: 'fà qiǎ',\n 拮据: 'jié jū',\n 刹车: 'shā chē',\n 生发: 'shēng fà',\n 重播: 'chóng bō',\n 缝合: 'féng hé',\n 音量: 'yīn liàng',\n 少尉: 'shào wèi',\n 冲压: 'chòng yā',\n 苍劲: 'cāng jìng',\n 厚薄: 'hòu báo',\n 威吓: 'wēi hè',\n 外相: 'wài xiàng',\n 呼号: 'hū háo',\n 着迷: 'zháo mí',\n 挑担: 'tiāo dàn',\n 纹路: 'wén lù',\n 还俗: 'huán sú',\n 强横: 'qiáng hèng',\n 着数: 'zhāo shù',\n 降顺: 'xiáng shùn',\n 挑明: 'tiǎo míng',\n 眯缝: 'mī feng',\n 分内: 'fèn nèi',\n 更衣: 'gēng yī',\n 软和: 'ruǎn huo',\n 尽兴: 'jìn xìng',\n 号子: 'hào zi',\n 爪牙: 'zhǎo yá',\n 败将: 'bài jiàng',\n 猜中: 'cāi zhòng',\n 结扎: 'jié zā',\n 没空: 'méi kòng',\n 夹缝: 'jiā fèng',\n 拾掇: 'shí duo',\n 掺和: 'chān huo',\n 簸箕: 'bò ji',\n 电量: 'diàn liàng',\n 荷载: 'hè zǎi',\n 调式: 'diào shì',\n 处身: 'chǔ shēn',\n 打手: 'dǎ shǒu',\n 弹弓: 'dàn gōng',\n 横蛮: 'hèng mán',\n 能干: 'néng gàn',\n 校点: 'jiào diǎn',\n 加载: 'jiā zài',\n 干校: 'gàn xiào',\n 哄传: 'hōng chuán',\n 校注: 'jiào zhù',\n 淤塞: 'yū sè',\n 马扎: 'mǎ zhá',\n 月氏: 'yuè zhī',\n 高干: 'gāo gàn',\n 经传: 'jīng zhuàn',\n 曾孙: 'zēng sūn',\n 好斗: 'hào dòu',\n 关卡: 'guān qiǎ',\n 逃奔: 'táo bèn',\n 磨蹭: 'mó ceng',\n 牟取: 'móu qǔ',\n 颤栗: 'zhàn lì',\n 蚂蚱: 'mà zha',\n 撮合: 'cuō he',\n 趔趄: 'liè qie',\n 摔打: 'shuāi dǎ',\n 台子: 'tái zi',\n 分得: 'fēn de',\n 粘着: 'nián zhuó',\n 采邑: 'cài yì',\n 散装: 'sǎn zhuāng',\n 婀娜: 'ē nuó',\n 兴味: 'xìng wèi',\n 行头: 'xíng tou',\n 气量: 'qì liàng',\n 调运: 'diào yùn',\n 处治: 'chǔ zhì',\n 乐音: 'yuè yīn',\n 充塞: 'chōng sè',\n 恫吓: 'dòng hè',\n 论调: 'lùn diào',\n 相中: 'xiāng zhòng',\n 民乐: 'mín yuè',\n 炮仗: 'pào zhang',\n 丧服: 'sāng fú',\n 骁将: 'xiāo jiàng',\n 量刑: 'liàng xíng',\n 缝补: 'féng bǔ',\n 财会: 'cái kuài',\n 大干: 'dà gàn',\n 历数: 'lì shǔ',\n 校场: 'jiào chǎng',\n 塞北: 'sài běi',\n 识相: 'shí xiàng',\n 辱没: 'rǔ mò',\n 鲜亮: 'xiān liàng',\n 语塞: 'yǔ sè',\n 露脸: 'lòu liǎn',\n 凉快: 'liáng kuai',\n 腰杆: 'yāo gǎn',\n 溜达: 'liū da',\n 嘎嘎: 'gā gā',\n 公干: 'gōng gàn',\n 桔梗: 'jié gěng',\n 挑逗: 'tiǎo dòu',\n 看门: 'kān mén',\n 乐歌: 'yuè gē',\n 拓片: 'tà piàn',\n 挑动: 'tiǎo dòng',\n 准将: 'zhǔn jiàng',\n 遒劲: 'qiú jìng',\n 磨坊: 'mò fáng',\n 逶迤: 'wēi yí',\n 搅和: 'jiǎo huo',\n 摩挲: 'mó suō',\n 作弄: 'zuò nòng',\n 苗头: 'miáo tou',\n 打颤: 'dǎ zhàn',\n 大藏: 'dà zàng',\n 畜牲: 'chù shēng',\n 勾搭: 'gōu da',\n 树荫: 'shù yīn',\n 树杈: 'shù chà',\n 铁杆: 'tiě gǎn',\n 将相: 'jiàng xiàng',\n 份子: 'fèn zi',\n 视差: 'shì chā',\n 绿荫: 'lǜ yīn',\n 枪杆: 'qiāng gǎn',\n 缝纫: 'féng rèn',\n 愁闷: 'chóu mèn',\n 点将: 'diǎn jiàng',\n 华佗: 'huà tuó',\n 劲射: 'jìng shè',\n 箱笼: 'xiāng lǒng',\n 终了: 'zhōng liǎo',\n 鬓发: 'bìn fà',\n 结巴: 'jiē ba',\n 苦干: 'kǔ gàn',\n 看家: 'kān jiā',\n 正旦: 'zhēng dàn',\n 中肯: 'zhòng kěn',\n 厦门: 'xià mén',\n 东莞: 'dōng guǎn',\n 食量: 'shí liàng',\n 宫调: 'gōng diào',\n 间作: 'jiàn zuò',\n 弹片: 'dàn piàn',\n 差池: 'chā chí',\n 漂白: 'piǎo bái',\n 杠子: 'gàng zi',\n 调处: 'tiáo chǔ',\n 好动: 'hào dòng',\n 转炉: 'zhuàn lú',\n 屏气: 'bǐng qì',\n 夹板: 'jiā bǎn',\n 哀乐: 'āi yuè',\n 干道: 'gàn dào',\n 苦处: 'kǔ chù',\n 劈柴: 'pǐ chái',\n 长势: 'zhǎng shì',\n 天华: 'tiān huá',\n 共处: 'gòng chǔ',\n 校验: 'jiào yàn',\n 出塞: 'chū sài',\n 磨盘: 'mò pán',\n 萎靡: 'wěi mǐ',\n 奔丧: 'bēn sāng',\n 唱和: 'chàng hè',\n 大调: 'dà diào',\n 非分: 'fēi fèn',\n 钻营: 'zuān yíng',\n 夹子: 'jiā zi',\n 超载: 'chāo zài',\n 更始: 'gēng shǐ',\n 铃铛: 'líng dang',\n 披散: 'pī sàn',\n 发还: 'fā huán',\n 转轮: 'zhuàn lún',\n 横财: 'hèng cái',\n 泡桐: 'pāo tóng',\n 抛撒: 'pāo sǎ',\n 天呀: 'tiān yā',\n 糊糊: 'hū hu',\n 躯壳: 'qū qiào',\n 通量: 'tōng liàng',\n 奉还: 'fèng huán',\n 午觉: 'wǔ jiào',\n 闷棍: 'mèn gùn',\n 浪头: 'làng tou',\n 砚台: 'yàn tái',\n 油坊: 'yóu fáng',\n 学长: 'xué zhǎng',\n 过载: 'guò zài',\n 笔调: 'bǐ diào',\n 衣被: 'yī bèi',\n 畜产: 'xù chǎn',\n 调阅: 'diào yuè',\n 蛮干: 'mán gàn',\n 曾祖: 'zēng zǔ',\n 提干: 'tí gàn',\n 变调: 'biàn diào',\n 覆没: 'fù mò',\n 模子: 'mú zi',\n 乐律: 'yuè lǜ',\n 称心: 'chèn xīn',\n 木杆: 'mù gān',\n 重印: 'chóng yìn',\n 自省: 'zì xǐng',\n 提调: 'tí diào',\n 看相: 'kàn xiàng',\n 芋头: 'yù tou',\n 下切: 'xià qiē',\n 塞上: 'sài shàng',\n 铺张: 'pū zhāng',\n 藤蔓: 'téng wàn',\n 薄幸: 'bó xìng',\n 解数: 'xiè shù',\n 褪去: 'tuì qù',\n 霰弹: 'xiàn dàn',\n 柚木: 'yóu mù',\n 痕量: 'hén liàng',\n 雅乐: 'yǎ yuè',\n 号哭: 'háo kū',\n 诈降: 'zhà xiáng',\n 猪圈: 'zhū juàn',\n 咋舌: 'zé shé',\n 铣床: 'xǐ chuáng',\n 防弹: 'fáng dàn',\n 健将: 'jiàn jiàng',\n 丽水: 'lí shuǐ',\n 削发: 'xuē fà',\n 空当: 'kòng dāng',\n 多相: 'duō xiàng',\n 鲜见: 'xiǎn jiàn',\n 划桨: 'huá jiǎng',\n 载波: 'zài bō',\n 跳蚤: 'tiào zao',\n 俏皮: 'qiào pí',\n 吧嗒: 'bā dā',\n 结发: 'jié fà',\n 了断: 'liǎo duàn',\n 同调: 'tóng diào',\n 石磨: 'shí mò',\n 时差: 'shí chā',\n 鼻塞: 'bí sè',\n 挑子: 'tiāo zi',\n 推磨: 'tuī mò',\n 武侯: 'wǔ hóu',\n 抹煞: 'mǒ shā',\n 调转: 'diào zhuǎn',\n 籍没: 'jí mò',\n 还债: 'huán zhài',\n 调演: 'diào yǎn',\n 分划: 'fēn huá',\n 奇偶: 'jī ǒu',\n 断喝: 'duàn hè',\n 闷雷: 'mèn léi',\n 狼藉: 'láng jí',\n 饭量: 'fàn liàng',\n 还礼: 'huán lǐ',\n 转调: 'zhuǎn diào',\n 星相: 'xīng xiàng',\n 手相: 'shǒu xiàng',\n 配乐: 'pèi yuè',\n 盖头: 'gài tou',\n 连杆: 'lián gǎn',\n 簿记: 'bù jì',\n 刀把: 'dāo bà',\n 量词: 'liàng cí',\n 名角: 'míng jué',\n 步调: 'bù diào',\n 校本: 'jiào běn',\n 账簿: 'zhàng bù',\n 隽永: 'juàn yǒng',\n 稍为: 'shāo wéi',\n 易传: 'yì zhuàn',\n 乐谱: 'yuè pǔ',\n 牵累: 'qiān lěi',\n 答理: 'dā li',\n 喝斥: 'hè chì',\n 吟哦: 'yín é',\n 干渠: 'gàn qú',\n 海量: 'hǎi liàng',\n 精当: 'jīng dàng',\n 着床: 'zhuó chuáng',\n 月相: 'yuè xiàng',\n 庶几: 'shù jī',\n 宫观: 'gōng guàn',\n 论处: 'lùn chǔ',\n 征辟: 'zhēng bì',\n 厚朴: 'hòu pò',\n 介壳: 'jiè qiào',\n 吭哧: 'kēng chī',\n 咯血: 'kǎ xiě',\n 铺陈: 'pū chén',\n 重生: 'chóng shēng',\n 乐理: 'yuè lǐ',\n 哀号: 'āi háo',\n 藏历: 'zàng lì',\n 刚劲: 'gāng jìng',\n 削平: 'xuē píng',\n 浓荫: 'nóng yīn',\n 城垛: 'chéng duǒ',\n 当差: 'dāng chāi',\n 正传: 'zhèng zhuàn',\n 并处: 'bìng chǔ',\n 创面: 'chuāng miàn',\n 旦角: 'dàn jué',\n 薄礼: 'bó lǐ',\n 晃荡: 'huàng dang',\n 臊子: 'sào zi',\n 家什: 'jiā shí',\n 闷头: 'mēn tóu',\n 美发: 'měi fà',\n 度数: 'dù shu',\n 着凉: 'zháo liáng',\n 闯将: 'chuǎng jiàng',\n 几案: 'jī àn',\n 姘头: 'pīn tou',\n 差数: 'chā shù',\n 散碎: 'sǎn suì',\n 壅塞: 'yōng sè',\n 寒颤: 'hán zhàn',\n 牵强: 'qiān qiǎng',\n 无间: 'wú jiàn',\n 轮转: 'lún zhuàn',\n 号叫: 'háo jiào',\n 铺排: 'pū pái',\n 降伏: 'xiáng fú',\n 轧钢: 'zhá gāng',\n 东阿: 'dōng ē',\n 病假: 'bìng jià',\n 累加: 'lěi jiā',\n 梗塞: 'gěng sè',\n 弹夹: 'dàn jiā',\n 钻心: 'zuān xīn',\n 晃眼: 'huǎng yǎn',\n 魔爪: 'mó zhǎo',\n 标量: 'biāo liàng',\n 憋闷: 'biē mèn',\n 猜度: 'cāi duó',\n 处士: 'chǔ shì',\n 官差: 'guān chāi',\n 讨还: 'tǎo huán',\n 长门: 'cháng mén',\n 馏分: 'liú fēn',\n 里弄: 'lǐ lòng',\n 色相: 'sè xiàng',\n 雅兴: 'yǎ xìng',\n 角力: 'jué lì',\n 弹坑: 'dàn kēng',\n 枝杈: 'zhī chà',\n 夹具: 'jiā jù',\n 处刑: 'chǔ xíng',\n 悍将: 'hàn jiàng',\n 好学: 'hào xué',\n 好好: 'hǎo hǎo',\n 银发: 'yín fà',\n 扫把: 'sào bǎ',\n 法相: 'fǎ xiàng',\n 贵干: 'guì gàn',\n 供气: 'gōng qì',\n 空余: 'kòng yú',\n 捆扎: 'kǔn zā',\n 瘠薄: 'jí bó',\n 浆糊: 'jiàng hu',\n 嘎吱: 'gā zhī',\n 调令: 'diào lìng',\n 法帖: 'fǎ tiè',\n 淋病: 'lìn bìng',\n 调派: 'diào pài',\n 转盘: 'zhuàn pán',\n 供稿: 'gōng gǎo',\n 差官: 'chāi guān',\n 忧闷: 'yōu mèn',\n 教长: 'jiào zhǎng',\n 重唱: 'chóng chàng',\n 酒兴: 'jiǔ xìng',\n 乐坛: 'yuè tán',\n 花呢: 'huā ní',\n 叱喝: 'chì hè',\n 膀臂: 'bǎng bì',\n 得空: 'dé kòng',\n 转圈: 'zhuàn quān',\n 横暴: 'hèng bào',\n 哄抬: 'hōng tái',\n 引吭: 'yǐn háng',\n 载货: 'zài huò',\n 中计: 'zhòng jì',\n 官长: 'guān zhǎng',\n 相面: 'xiàng miàn',\n 看头: 'kàn tou',\n 盼头: 'pàn tou',\n 意兴: 'yì xìng',\n 军乐: 'jūn yuè',\n 累次: 'lěi cì',\n 骨嘟: 'gǔ dū',\n 燕赵: 'yān zhào',\n 报丧: 'bào sāng',\n 弥撒: 'mí sa',\n 挨斗: 'ái dòu',\n 扁舟: 'piān zhōu',\n 丑角: 'chǒu jué',\n 吊丧: 'diào sāng',\n 强将: 'qiáng jiàng',\n 重奏: 'chóng zòu',\n 发辫: 'fà biàn',\n 着魔: 'zháo mó',\n 着法: 'zhāo fǎ',\n 盛放: 'shèng fàng',\n 填塞: 'tián sè',\n 凶横: 'xiōng hèng',\n 稽首: 'qǐ shǒu',\n 碑帖: 'bēi tiè',\n 冲量: 'chōng liàng',\n 发菜: 'fà cài',\n 假发: 'jiǎ fà',\n 翻卷: 'fān juǎn',\n 小量: 'xiǎo liàng',\n 胶着: 'jiāo zhuó',\n 里子: 'lǐ zi',\n 调调: 'diào diao',\n 散兵: 'sǎn bīng',\n 高挑: 'gāo tiǎo',\n 播撒: 'bō sǎ',\n 夹心: 'jiā xīn',\n 扇动: 'shān dòng',\n 叨扰: 'tāo rǎo',\n 霓裳: 'ní cháng',\n 捻子: 'niǎn zi',\n 弥缝: 'mí féng',\n 撒布: 'sǎ bù',\n 场院: 'cháng yuàn',\n 省亲: 'xǐng qīn',\n 提拉: 'tí lā',\n 惯量: 'guàn liàng',\n 强逼: 'qiáng bī',\n 强征: 'qiáng zhēng',\n 晕车: 'yùn chē',\n 数道: 'shù dào',\n 带累: 'dài lèi',\n 拓本: 'tà běn',\n 嫌恶: 'xián wù',\n 宿将: 'sù jiàng',\n 龟裂: 'jūn liè',\n 缠夹: 'chán jiā',\n 发式: 'fà shì',\n 隔扇: 'gé shàn',\n 天分: 'tiān fèn',\n 癖好: 'pǐ hào',\n 四通: 'sì tōng',\n 白术: 'bái zhú',\n 划伤: 'huá shāng',\n 角斗: 'jué dòu',\n 听差: 'tīng chāi',\n 岁差: 'suì chā',\n 丧礼: 'sāng lǐ',\n 脉脉: 'mò mò',\n 削瘦: 'xuē shòu',\n 撒播: 'sǎ bō',\n 莎草: 'suō cǎo',\n 犍为: 'qián wéi',\n 调头: 'diào tóu',\n 龙卷: 'lóng juǎn',\n 外调: 'wài diào',\n 字帖: 'zì tiè',\n 卷发: 'juǎn fà',\n 揣度: 'chuǎi duó',\n 洋相: 'yáng xiàng',\n 散光: 'sǎn guāng',\n 骨碌: 'gū lu',\n 薄命: 'bó mìng',\n 笼头: 'lóng tóu',\n 咽炎: 'yān yán',\n 碌碡: 'liù zhou',\n 片儿: 'piàn er',\n 纤手: 'qiàn shǒu',\n 散体: 'sǎn tǐ',\n 内省: 'nèi xǐng',\n 强留: 'qiáng liú',\n 解送: 'jiè sòng',\n 反间: 'fǎn jiàn',\n 少壮: 'shào zhuàng',\n 留空: 'liú kōng',\n 告假: 'gào jià',\n 咳血: 'ké xuè',\n 薄暮: 'bó mù',\n 铺轨: 'pū guǐ',\n 磨削: 'mó xuē',\n 治丧: 'zhì sāng',\n 叉子: 'chā zi',\n 哄动: 'hōng dòng',\n 蛾子: 'é zi',\n 出落: 'chū luò',\n 股长: 'gǔ zhǎng',\n 贵处: 'guì chù',\n 还魂: 'huán hún',\n 例假: 'lì jià',\n 刹住: 'shā zhù',\n 身量: 'shēn liàng',\n 同好: 'tóng hào',\n 模量: 'mó liàng',\n 更生: 'gēng shēng',\n 服丧: 'fú sāng',\n 率直: 'shuài zhí',\n 字模: 'zì mú',\n 散架: 'sǎn jià',\n 答腔: 'dā qiāng',\n 交恶: 'jiāo wù',\n 薄情: 'bó qíng',\n 眼泡: 'yǎn pāo',\n 袅娜: 'niǎo nuó',\n 草垛: 'cǎo duò',\n 冲劲: 'chòng jìn',\n 呢喃: 'ní nán',\n 切中: 'qiè zhòng',\n 挑灯: 'tiǎo dēng',\n 还愿: 'huán yuàn',\n 激将: 'jī jiàng',\n 更鼓: 'gēng gǔ',\n 没药: 'mò yào',\n 败兴: 'bài xìng',\n 切面: 'qiē miàn',\n 散户: 'sǎn hù',\n 累进: 'lěi jìn',\n 背带: 'bēi dài',\n 秤杆: 'chèng gǎn',\n 碾坊: 'niǎn fáng',\n 簿子: 'bù zi',\n 扳手: 'bān shǒu',\n 铅山: 'yán shān',\n 儒将: 'rú jiàng',\n 重光: 'chóng guāng',\n 剪发: 'jiǎn fà',\n 长上: 'zhǎng shàng',\n 小传: 'xiǎo zhuàn',\n 压轴: 'yā zhòu',\n 弱冠: 'ruò guàn',\n 花卷: 'huā juǎn',\n 横祸: 'hèng huò',\n 夹克: 'jiā kè',\n 光晕: 'guāng yùn',\n 披靡: 'pī mǐ',\n 对调: 'duì diào',\n 夹持: 'jiā chí',\n 空额: 'kòng é',\n 平调: 'píng diào',\n 铺床: 'pū chuáng',\n 丧钟: 'sāng zhōng',\n 作乐: 'zuò lè',\n 少府: 'shào fǔ',\n 数数: 'shuò shuò',\n 奔头: 'bèn tou',\n 进给: 'jìn jǐ',\n 率性: 'shuài xìng',\n 乐子: 'lè zi',\n 绑扎: 'bǎng zā',\n 挑唆: 'tiǎo suō',\n 漂洗: 'piǎo xǐ',\n 夹墙: 'jiā qiáng',\n 咳喘: 'ké chuǎn',\n 乜斜: 'miē xie',\n 错处: 'cuò chù',\n 闷酒: 'mèn jiǔ',\n 时调: 'shí diào',\n 重孙: 'chóng sūn',\n 经幢: 'jīng chuáng',\n 圩场: 'xū chǎng',\n 调门: 'diào mén',\n 花头: 'huā tóu',\n 划拉: 'huá la',\n 套色: 'tào shǎi',\n 粗率: 'cū shuài',\n 相率: 'xiāng shuài',\n 款识: 'kuǎn zhì',\n 吁请: 'yù qǐng',\n 荫蔽: 'yīn bì',\n 文蛤: 'wén gé',\n 嘀嗒: 'dī dā',\n 调取: 'diào qǔ',\n 交差: 'jiāo chāi',\n 落子: 'luò zǐ',\n 相册: 'xiàng cè',\n 絮叨: 'xù dao',\n 落发: 'luò fà',\n 异相: 'yì xiàng',\n 浸没: 'jìn mò',\n 角抵: 'jué dǐ',\n 卸载: 'xiè zài',\n 春卷: 'chūn juǎn',\n 扎挣: 'zhá zheng',\n 畜养: 'xù yǎng',\n 吡咯: 'bǐ luò',\n 垛子: 'duò zi',\n 恶少: 'è shào',\n 发际: 'fà jì',\n 红苕: 'hóng sháo',\n 糨糊: 'jiàng hu',\n 哭丧: 'kū sāng',\n 稍息: 'shào xī',\n 晕船: 'yùn chuán',\n 校样: 'jiào yàng',\n 外差: 'wài chā',\n 脚爪: 'jiǎo zhǎo',\n 铺展: 'pū zhǎn',\n 芫荽: 'yán sui',\n 夹紧: 'jiā jǐn',\n 尿泡: 'suī pào',\n 丧乱: 'sāng luàn',\n 凶相: 'xiōng xiàng',\n 华发: 'huá fà',\n 打场: 'dǎ cháng',\n 云量: 'yún liàng',\n 正切: 'zhèng qiē',\n 划拳: 'huá quán',\n 划艇: 'huá tǐng',\n 评传: 'píng zhuàn',\n 拉纤: 'lā qiàn',\n 句读: 'jù dòu',\n 散剂: 'sǎn jì',\n 骨殖: 'gǔ shi',\n 塞音: 'sè yīn',\n 铺叙: 'pū xù',\n 阏氏: 'yān zhī',\n 冷颤: 'lěng zhàn',\n 煞住: 'shā zhù',\n 少男: 'shào nán',\n 管乐: 'guǎn yuè',\n 号啕: 'háo táo',\n 纳降: 'nà xiáng',\n 拥塞: 'yōng sè',\n 万乘: 'wàn shèng',\n 杆儿: 'gǎn ér',\n 葛藤: 'gé téng',\n 簿籍: 'bù jí',\n 皮夹: 'pí jiā',\n 校准: 'jiào zhǔn',\n 允当: 'yǔn dàng',\n 器量: 'qì liàng',\n 选调: 'xuǎn diào',\n 扮相: 'bàn xiàng',\n 干才: 'gàn cái',\n 基干: 'jī gàn',\n 割切: 'gē qiē',\n 国乐: 'guó yuè',\n 卡壳: 'qiǎ ké',\n 辟谷: 'bì gǔ',\n 磨房: 'mò fáng',\n 咿呀: 'yī yā',\n 芥末: 'jiè mo',\n 薄技: 'bó jì',\n 产假: 'chǎn jià',\n 诗兴: 'shī xìng',\n 重出: 'chóng chū',\n 转椅: 'zhuàn yǐ',\n 酌量: 'zhuó liang',\n 簿册: 'bù cè',\n 藏青: 'zàng qīng',\n 的士: 'dī shì',\n 调人: 'diào rén',\n 解元: 'jiè yuán',\n 茎干: 'jīng gàn',\n 巨量: 'jù liàng',\n 榔头: 'láng tou',\n 率真: 'shuài zhēn',\n 喷香: 'pèn xiāng',\n 锁钥: 'suǒ yuè',\n 虾蟆: 'há má',\n 相图: 'xiàng tú',\n 兴会: 'xìng huì',\n 灶头: 'zào tóu',\n 重婚: 'chóng hūn',\n 钻洞: 'zuān dòng',\n 忖度: 'cǔn duó',\n 党参: 'dǎng shēn',\n 调温: 'diào wēn',\n 杆塔: 'gān tǎ',\n 葛布: 'gé bù',\n 拱券: 'gǒng xuàn',\n 夹生: 'jiā shēng',\n 露馅: 'lòu xiàn',\n 恰切: 'qià qiè',\n 散见: 'sǎn jiàn',\n 哨卡: 'shào qiǎ',\n 烫发: 'tàng fà',\n 体量: 'tǐ liàng',\n 挺括: 'tǐng kuò',\n 系带: 'jì dài',\n 相士: 'xiàng shì',\n 羊圈: 'yáng juàn',\n 转矩: 'zhuàn jǔ',\n 吧台: 'bā tái',\n 苍术: 'cāng zhú',\n 菲薄: 'fěi bó',\n 蛤蚧: 'gé jiè',\n 蛤蜊: 'gé lí',\n 瓜蔓: 'guā wàn',\n 怪相: 'guài xiàng',\n 临帖: 'lín tiè',\n 女红: 'nǚ gōng',\n 刨床: 'bào chuáng',\n 翘楚: 'qiáo chǔ',\n 数九: 'shǔ jiǔ',\n 谈兴: 'tán xìng',\n 雄劲: 'xióng jìng',\n 扎染: 'zā rǎn',\n 遮荫: 'zhē yīn',\n 周正: 'zhōu zhèng',\n 赚头: 'zhuàn tou',\n 扒手: 'pá shǒu',\n 搀和: 'chān huo',\n 诚朴: 'chéng pǔ',\n 肚量: 'dù liàng',\n 干结: 'gān jié',\n 工尺: 'gōng chě',\n 家累: 'jiā lěi',\n 曲水: 'qū shuǐ',\n 沙参: 'shā shēn',\n 挑花: 'tiǎo huā',\n 阿门: 'ā mén',\n 背篓: 'bēi lǒu',\n 瘪三: 'biē sān',\n 裁处: 'cái chǔ',\n 创痛: 'chuāng tòng',\n 福相: 'fú xiàng',\n 更动: 'gēng dòng',\n 豪兴: 'háo xìng',\n 还阳: 'huán yáng',\n 还嘴: 'huán zuǐ',\n 借调: 'jiè diào',\n 卷云: 'juǎn yún',\n 流弹: 'liú dàn',\n 想头: 'xiǎng tou',\n 削价: 'xuē jià',\n 校阅: 'jiào yuè',\n 雅量: 'yǎ liàng',\n 别传: 'bié zhuàn',\n 薄酒: 'bó jiǔ',\n 春假: 'chūn jià',\n 发妻: 'fà qī',\n 哗哗: 'huā huā',\n 宽绰: 'kuān chuo',\n 了悟: 'liǎo wù',\n 切花: 'qiē huā',\n 审度: 'shěn duó',\n 应许: 'yīng xǔ',\n 转台: 'zhuàn tái',\n 仔猪: 'zǐ zhū',\n 裁量: 'cái liáng',\n 藏戏: 'zàng xì',\n 乘兴: 'chéng xìng',\n 绸缪: 'chóu móu',\n 摧折: 'cuī zhé',\n 调经: 'tiáo jīng',\n 调职: 'diào zhí',\n 缝缀: 'féng zhuì',\n 骨朵: 'gū duǒ',\n 核儿: 'hú er',\n 恒量: 'héng liàng',\n 还价: 'huán jià',\n 浑朴: 'hún pǔ',\n 苦差: 'kǔ chāi',\n 面糊: 'miàn hù',\n 煞车: 'shā chē',\n 省视: 'xǐng shì',\n 什锦: 'shí jǐn',\n 信差: 'xìn chāi',\n 余切: 'yú qiē',\n 攒眉: 'cuán méi',\n 炸糕: 'zhá gāo',\n 钻杆: 'zuàn gǎn',\n 扒灰: 'pá huī',\n 拌和: 'bàn huò',\n 长调: 'cháng diào',\n 大溜: 'dà liù',\n 抖搂: 'dǒu lōu',\n 飞转: 'fēi zhuàn',\n 干仗: 'gàn zhàng',\n 好胜: 'hào shèng',\n 画片: 'huà piàn',\n 搅混: 'jiǎo hún',\n 螺杆: 'luó gǎn',\n 木模: 'mù mú',\n 怒号: 'nù háo',\n 频数: 'pín shù',\n 无宁: 'wú níng',\n 遗少: 'yí shào',\n 邮差: 'yóu chāi',\n 占卦: 'zhān guà',\n 占星: 'zhān xīng',\n 重审: 'chóng shěn',\n 自量: 'zì liàng',\n 调防: 'diào fáng',\n 发廊: 'fà láng',\n 反调: 'fǎn diào',\n 缝子: 'fèng zi',\n 更夫: 'gēng fū',\n 骨子: 'gǔ zi',\n 光杆: 'guāng gǎn',\n 夹棍: 'jiā gùn',\n 居丧: 'jū sāng',\n 巨贾: 'jù gǔ',\n 看押: 'kān yā',\n 空转: 'kōng zhuàn',\n 量力: 'liàng lì',\n 炮烙: 'páo luò',\n 赔还: 'péi huán',\n 扑扇: 'pū shān',\n 散记: 'sǎn jì',\n 散件: 'sǎn jiàn',\n 删削: 'shān xuē',\n 射干: 'shè gàn',\n 条几: 'tiáo jī',\n 偷空: 'tōu kòng',\n 削壁: 'xuē bì',\n 校核: 'jiào hé',\n 阴干: 'yīn gān',\n 择菜: 'zhái cài',\n 重九: 'chóng jiǔ',\n 主调: 'zhǔ diào',\n 自禁: 'zì jīn',\n 吧唧: 'bā jī',\n 便溺: 'biàn niào',\n 词调: 'cí diào',\n 叨咕: 'dáo gu',\n 落枕: 'lào zhěn',\n 铺砌: 'pū qì',\n 刷白: 'shuà bái',\n 委靡: 'wěi mǐ',\n 系泊: 'xì bó',\n 相马: 'xiàng mǎ',\n 熨帖: 'yù tiē',\n 转筋: 'zhuàn jīn',\n 棒喝: 'bàng hè',\n 傧相: 'bīn xiàng',\n 镐头: 'gǎo tóu',\n 间苗: 'jiàn miáo',\n 乐池: 'yuè chí',\n 卖相: 'mài xiàng',\n 屏弃: 'bǐng qì',\n 铅弹: 'qiān dàn',\n 切变: 'qiē biàn',\n 请调: 'qǐng diào',\n 群氓: 'qún méng',\n 散板: 'sǎn bǎn',\n 省察: 'xǐng chá',\n 事假: 'shì jià',\n 纤绳: 'qiàn shéng',\n 重影: 'chóng yǐng',\n 耕种: 'gēng zhòng',\n 种地: 'zhòng dì',\n 种菜: 'zhòng cài',\n 栽种: 'zāi zhòng',\n 接种: 'jiē zhòng',\n 垦种: 'kěn zhòng',\n 种殖: 'zhòng zhí',\n 种瓜: 'zhòng guā',\n 种豆: 'zhòng dòu',\n 种树: 'zhòng shù',\n 睡着: 'shuì zháo',\n 笼子: 'lóng zi',\n 重启: 'chóng qǐ',\n 重整: 'chóng zhěng',\n 重弹: 'chóng tán',\n 重足: 'chóng zú',\n 重山: 'chóng shān',\n 重游: 'chóng yóu',\n 重峦: 'chóng luán',\n 爷爷: 'yé ye',\n 奶奶: 'nǎi nai',\n 姥爷: 'lǎo ye',\n 爸爸: 'bà ba',\n 妈妈: 'mā ma',\n 婶婶: 'shěn shen',\n 舅舅: 'jiù jiu',\n 姑姑: 'gū gu',\n 叔叔: 'shū shu',\n 姨夫: 'yí fu',\n 舅母: 'jiù mu',\n 姑父: 'gū fu',\n 姐夫: 'jiě fu',\n 婆婆: 'pó po',\n 公公: 'gōng gong',\n 舅子: 'jiù zi',\n 姐姐: 'jiě jie',\n 哥哥: 'gē ge',\n 妹妹: 'mèi mei',\n 妹夫: 'mèi fu',\n 姨子: 'yí zi',\n 宝宝: 'bǎo bao',\n 娃娃: 'wá wa',\n 孩子: 'hái zi',\n 日子: 'rì zi',\n 样子: 'yàng zi',\n 狮子: 'shī zi',\n 身子: 'shēn zi',\n 架子: 'jià zi',\n 嫂子: 'sǎo zi',\n 鼻子: 'bí zi',\n 亭子: 'tíng zi',\n 折子: 'zhé zi',\n 面子: 'miàn zi',\n 脖子: 'bó zi',\n 辈子: 'bèi zi',\n 帽子: 'mào zi',\n 拍子: 'pāi zi',\n 柱子: 'zhù zi',\n 辫子: 'biàn zi',\n 鸽子: 'gē zi',\n 房子: 'fáng zi',\n 丸子: 'wán zi',\n 摊子: 'tān zi',\n 牌子: 'pái zi',\n 胡子: 'hú zi',\n 鬼子: 'guǐ zi',\n 矮子: 'ǎi zi',\n 鸭子: 'yā zi',\n 小子: 'xiǎo zi',\n 影子: 'yǐng zi',\n 屋子: 'wū zi',\n 对子: 'duì zi',\n 点子: 'diǎn zi',\n 本子: 'běn zi',\n 种子: 'zhǒng zi',\n 儿子: 'ér zi',\n 兔子: 'tù zi',\n 骗子: 'piàn zi',\n 院子: 'yuàn zi',\n 猴子: 'hóu zi',\n 嗓子: 'sǎng zi',\n 侄子: 'zhí zi',\n 柿子: 'shì zi',\n 钳子: 'qián zi',\n 虱子: 'shī zi',\n 瓶子: 'píng zi',\n 豹子: 'bào zi',\n 筷子: 'kuài zi',\n 篮子: 'lán zi',\n 绳子: 'shéng zi',\n 嘴巴: 'zuǐ ba',\n 耳朵: 'ěr duo',\n 茄子: 'qié zi',\n 蚌埠: 'bèng bù',\n 崆峒: 'kōng tóng',\n 琵琶: 'pí pa',\n 蘑菇: 'mó gu',\n 葫芦: 'hú lu',\n 狐狸: 'hú li',\n 桔子: 'jú zi',\n 盒子: 'hé zi',\n 桌子: 'zhuō zi',\n 竹子: 'zhú zi',\n 师傅: 'shī fu',\n 衣服: 'yī fu',\n 袜子: 'wà zi',\n 杯子: 'bēi zi',\n 刺猬: 'cì wei',\n 麦子: 'mài zi',\n 队伍: 'duì wu',\n 知了: 'zhī liǎo',\n 鱼儿: 'yú er',\n 馄饨: 'hún tun',\n 灯笼: 'dēng long',\n 庄稼: 'zhuāng jia',\n 聪明: 'cōng ming',\n 镜子: 'jìng zi',\n 银子: 'yín zi',\n 盘子: 'pán zi',\n 了却: 'liǎo què',\n 力气: 'lì qi',\n 席子: 'xí zi',\n 林子: 'lín zi',\n 朝霞: 'zhāo xiá',\n 朝夕: 'zhāo xī',\n 朝气: 'zhāo qì',\n 翅膀: 'chì bǎng',\n 省长: 'shěng zhǎng',\n 臧否: 'zāng pǐ',\n 否泰: 'pǐ tài',\n 变得: 'biàn de',\n 丈夫: 'zhàng fu',\n 豆腐: 'dòu fu',\n 笔杆: 'bǐ gǎn',\n 枞阳: 'zōng yáng',\n 行人: 'xíng rén',\n 打着: 'dǎ zhe',\n // 一字不变调的词语(需要增补更多)\n // 有歧义的词:一楼、一栋、一层、一排、一连\n // “一楼”这个词,上下文语意是“一整栋楼”时,需要变调成四声;我住一楼时,则是一声\n 第一: 'dì yī',\n 万一: 'wàn yī',\n 之一: 'zhī yī',\n 得之: 'dé zhī',\n 统一: 'tǒng yī',\n 唯一: 'wéi yī',\n 专一: 'zhuān yī',\n 单一: 'dān yī',\n 如一: 'rú yī',\n 其一: 'qí yī',\n 合一: 'hé yī',\n 逐一: 'zhú yī',\n 周一: 'zhōu yī',\n 初一: 'chū yī',\n 研一: 'yán yī',\n 归一: 'guī yī',\n 假一: 'jiǎ yī',\n 闻一: 'wén yī',\n 了了: 'liǎo liǎo',\n 公了: 'gōng liǎo',\n 私了: 'sī liǎo',\n // 一 发音\n 一月: 'yī yuè',\n 一号: 'yī hào',\n 一级: 'yī jí',\n 一等: 'yī děng',\n 一哥: 'yī gē',\n 月一: 'yuè yī',\n 一一: 'yī yī',\n 二一: 'èr yī',\n 三一: 'sān yī',\n 四一: 'sì yī',\n 五一: 'wǔ yī',\n 六一: 'liù yī',\n 七一: 'qī yī',\n 八一: 'bā yī',\n 九一: 'jiǔ yī',\n 一〇: 'yī líng',\n 一零: 'yī líng',\n 一二: 'yī èr',\n 一三: 'yī sān',\n 一四: 'yī sì',\n 一五: 'yī wǔ',\n 一六: 'yī liù',\n 一七: 'yī qī',\n 一八: 'yī bā',\n 一九: 'yī jiǔ',\n 一又: 'yī yòu',\n 一饼: 'yī bǐng',\n 一楼: 'yī lóu',\n 为例: 'wéi lì',\n 为准: 'wéi zhǔn',\n 沧海: 'cāng hǎi',\n 难为: 'nán wéi',\n 责难: 'zé nàn',\n 患难: 'huàn nàn',\n 磨难: 'mó nàn',\n 大难: 'dà nàn',\n 刁难: 'diāo nàn',\n 殉难: 'xùn nàn',\n 落难: 'luò nàn',\n 罹难: 'lí nàn',\n 灾难: 'zāi nàn',\n 难民: 'nàn mín',\n 苦难: 'kǔ nàn',\n 危难: 'wēi nàn',\n 发难: 'fā nàn',\n 逃难: 'táo nàn',\n 避难: 'bì nàn',\n 遇难: 'yù nàn',\n 阻难: 'zǔ nàn',\n 厄难: 'è nàn',\n 徇难: 'xùn nàn',\n 空难: 'kōng nàn',\n 喜欢: 'xǐ huan',\n 朝朝: 'zhāo zhāo',\n 不行: 'bù xíng',\n 轧轧: 'yà yà',\n 弯曲: 'wān qū',\n 扭曲: 'niǔ qū',\n 曲直: 'qū zhí',\n 委曲: 'wěi qū',\n 酒曲: 'jiǔ qū',\n 曲径: 'qū jìng',\n 曲解: 'qū jiě',\n 歪曲: 'wāi qū',\n 曲线: 'qū xiàn',\n 曲阜: 'qū fù',\n 九曲: 'jiǔ qū',\n 曲折: 'qū zhé',\n 曲肱: 'qū gōng',\n 曲意: 'qū yì',\n 仡佬: 'gē lǎo'\n};\nconst Pattern2 = Object.keys(DICT2).map(key => ({\n zh: key,\n pinyin: DICT2[key],\n probability: 2e-8 /* Probability.DICT */,\n length: 2,\n priority: Priority.Normal,\n dict: Symbol('dict2')\n}));\nconst DICT3 = {\n 为什么: 'wèi shén me',\n 实际上: 'shí jì shang',\n 检察长: 'jiǎn chá zhǎng',\n 干什么: 'gàn shén me',\n 这会儿: 'zhè huì er',\n 尽可能: 'jǐn kě néng',\n 董事长: 'dǒng shì zhǎng',\n 了不起: 'liǎo bù qǐ',\n 参谋长: 'cān móu zhǎng',\n 朝鲜族: 'cháo xiǎn zú',\n 海内外: 'hǎi nèi wài',\n 禁不住: 'jīn bú zhù',\n 柏拉图: 'bó lā tú',\n 不在乎: 'bú zài hu',\n 洛杉矶: 'luò shān jī',\n 有点儿: 'yǒu diǎn er',\n 迫击炮: 'pǎi jī pào',\n 不得了: 'bù dé liǎo',\n 马尾松: 'mǎ wěi sōng',\n 运输量: 'yùn shū liàng',\n 发脾气: 'fā pí qi',\n 士大夫: 'shì dà fū',\n 鸭绿江: 'yā lù jiāng',\n 压根儿: 'yà gēn er',\n 对得起: 'duì de qǐ',\n 那会儿: 'nà huì er',\n 自个儿: 'zì gě er',\n 物理量: 'wù lǐ liàng',\n 怎么着: 'zěn me zhāo',\n 明晃晃: 'míng huǎng huǎng',\n 节假日: 'jié jià rì',\n 心里话: 'xīn lǐ huà',\n 发行量: 'fā xíng liàng',\n 兴冲冲: 'xìng chōng chōng',\n 分子量: 'fēn zǐ liàng',\n 国子监: 'guó zǐ jiàn',\n 老大难: 'lǎo dà nán',\n 党内外: 'dǎng nèi wài',\n 这么着: 'zhè me zhāo',\n 少奶奶: 'shào nǎi nai',\n 暗地里: 'àn dì lǐ',\n 更年期: 'gēng nián qī',\n 工作量: 'gōng zuò liàng',\n 背地里: 'bèi dì lǐ',\n 山里红: 'shān li hóng',\n 好好儿: 'hǎo hāo er',\n 交响乐: 'jiāo xiǎng yuè',\n 好意思: 'hǎo yì si',\n 吐谷浑: 'tǔ yù hún',\n 没意思: 'méi yì si',\n 理发师: 'lǐ fà shī',\n 塔什干: 'tǎ shí gān',\n 充其量: 'chōng qí liàng',\n 靠得住: 'kào de zhù',\n 车行道: 'chē xíng dào',\n 人行道: 'rén xíng dào',\n 中郎将: 'zhōng láng jiàng',\n 照明弹: 'zhào míng dàn',\n 烟幕弹: 'yān mù dàn',\n 没奈何: 'mò nài hé',\n 乱哄哄: 'luàn hōng hōng',\n 惠更斯: 'huì gēng sī',\n 载重量: 'zài zhòng liàng',\n 瞧得起: 'qiáo de qǐ',\n 纪传体: 'jì zhuàn tǐ',\n 阿房宫: 'ē páng gōng',\n 卷心菜: 'juǎn xīn cài',\n 戏班子: 'xì bān zi',\n 过得去: 'guò de qù',\n 花岗石: 'huā gāng shí',\n 外甥女: 'wài sheng nǚ',\n 团团转: 'tuán tuán zhuàn',\n 大堡礁: 'dà bǎo jiāo',\n 燃烧弹: 'rán shāo dàn',\n 劳什子: 'láo shí zi',\n 摇滚乐: 'yáo gǔn yuè',\n 夹竹桃: 'jiā zhú táo',\n 闹哄哄: 'nào hōng hōng',\n 三连冠: 'sān lián guàn',\n 重头戏: 'zhòng tóu xì',\n 二人转: 'èr rén zhuàn',\n 节骨眼: 'jiē gǔ yǎn',\n 知识面: 'zhī shi miàn',\n 护士长: 'hù shi zhǎng',\n 信号弹: 'xìn hào dàn',\n 干电池: 'gān diàn chí',\n 枪杆子: 'qiāng gǎn zi',\n 哭丧棒: 'kū sāng bàng',\n 鼻咽癌: 'bí yān ái',\n 瓦岗军: 'wǎ gāng jūn',\n 买得起: 'mǎi de qǐ',\n 癞蛤蟆: 'lài há ma',\n 脊梁骨: 'jǐ liang gǔ',\n 子母弹: 'zǐ mǔ dàn',\n 开小差: 'kāi xiǎo chāi',\n 女强人: 'nǚ qiáng rén',\n 英雄传: 'yīng xióng zhuàn',\n 爵士乐: 'jué shì yuè',\n 说笑话: 'shuō xiào hua',\n 碰头会: 'pèng tóu huì',\n 玻璃钢: 'bō li gāng',\n 曳光弹: 'yè guāng dàn',\n 少林拳: 'shào lín quán',\n 咏叹调: 'yǒng tàn diào',\n 少先队: 'shào xiān duì',\n 灵长目: 'líng zhǎng mù',\n 对着干: 'duì zhe gàn',\n 蒙蒙亮: 'méng méng liàng',\n 软骨头: 'ruǎn gǔ tou',\n 铺盖卷: 'pū gài juǎn',\n 和稀泥: 'huò xī ní',\n 背黑锅: 'bēi hēi guō',\n 红彤彤: 'hóng tōng tōng',\n 武侯祠: 'wǔ hóu cí',\n 打哆嗦: 'dǎ duō suo',\n 户口簿: 'hù kǒu bù',\n 马尾藻: 'mǎ wěi zǎo',\n 夜猫子: 'yè māo zi',\n 打手势: 'dǎ shǒu shì',\n 龙王爷: 'lóng wáng yé',\n 气头上: 'qì tóu shang',\n 糊涂虫: 'hú tu chóng',\n 笔杆子: 'bǐ gǎn zi',\n 占便宜: 'zhàn pián yi',\n 打主意: 'dǎ zhǔ yì',\n 多弹头: 'duō dàn tóu',\n 露一手: 'lòu yì shǒu',\n 堰塞湖: 'yàn sè hú',\n 保得住: 'bǎo de zhù',\n 趵突泉: 'bào tū quán',\n 奥得河: 'ào de hé',\n 司务长: 'sī wù zhǎng',\n 禁不起: 'jīn bù qǐ',\n 什刹海: 'shí chà hǎi',\n 莲花落: 'lián huā lào',\n 见世面: 'jiàn shì miàn',\n 豁出去: 'huō chū qù',\n 电位差: 'diàn wèi chā',\n 挨个儿: 'āi gè er',\n 那阵儿: 'nà zhèn er',\n 肺活量: 'fèi huó liàng',\n 大师傅: 'dà shī fu',\n 掷弹筒: 'zhì dàn tǒng',\n 打呼噜: 'dǎ hū lu',\n 广渠门: 'ān qú mén',\n 未见得: 'wèi jiàn dé',\n 大婶儿: 'dà shěn er',\n 谈得来: 'tán de lái',\n 脚丫子: 'jiǎo yā zi',\n 空包弹: 'kōng bāo dàn',\n 窝里斗: 'wō li dòu',\n 弹着点: 'dàn zhuó diǎn',\n 个头儿: 'gè tóu er',\n 看得起: 'kàn de qǐ',\n 糊涂账: 'hú tu zhàng',\n 大猩猩: 'dà xīng xing',\n 禁得起: 'jīn de qǐ',\n 法相宗: 'fǎ xiàng zōng',\n 可怜相: 'kě lián xiàng',\n 吃得下: 'chī de xià',\n 汉堡包: 'hàn bǎo bāo',\n 闹嚷嚷: 'nào rāng rāng',\n 数来宝: 'shǔ lái bǎo',\n 合得来: 'hé de lái',\n 干性油: 'gān xìng yóu',\n 闷葫芦: 'mèn hú lu',\n 呱呱叫: 'guā guā jiào',\n 西洋参: 'xī yáng shēn',\n 林荫道: 'lín yīn dào',\n 拉家常: 'lā jiā cháng',\n 卷铺盖: 'juǎn pū gài',\n 过得硬: 'guò de yìng',\n 飞将军: 'fēi jiāng jūn',\n 挑大梁: 'tiǎo dà liáng',\n 哈巴狗: 'hǎ ba gǒu',\n 过家家: 'guò jiā jiā',\n 催泪弹: 'cuī lèi dàn',\n 雨夹雪: 'yǔ jiā xuě',\n 敲竹杠: 'qiāo zhú gàng',\n 列车长: 'liè chē zhǎng',\n 华达呢: 'huá dá ní',\n 犯得着: 'fàn de zháo',\n 土疙瘩: 'tǔ gē da',\n 煞风景: 'shā fēng jǐng',\n 轻量级: 'qīng liàng jí',\n 羞答答: 'xiū dā dā',\n 石子儿: 'shí zǐ er',\n 达姆弹: 'dá mǔ dàn',\n 科教片: 'kē jiào piān',\n 侃大山: 'kǎn dà shān',\n 丁点儿: 'dīng diǎn er',\n 吃得消: 'chī de xiāo',\n 捋虎须: 'luō hǔ xū',\n 高丽参: 'gāo lí shēn',\n 众生相: 'zhòng shēng xiàng',\n 咽峡炎: 'yān xiá yán',\n 禁得住: 'jīn de zhù',\n 吃得开: 'chī de kāi',\n 柞丝绸: 'zuò sī chóu',\n 应声虫: 'yìng shēng chóng',\n 数得着: 'shǔ de zháo',\n 傻劲儿: 'shǎ jìn er',\n 铅玻璃: 'qiān bō li',\n 可的松: 'kě dì sōng',\n 划得来: 'huá de lái',\n 晕乎乎: 'yūn hū hū',\n 屎壳郎: 'shǐ ke làng',\n 尥蹶子: 'liào juě zi',\n 藏红花: 'zàng hóng huā',\n 闷罐车: 'mèn guàn chē',\n 卡脖子: 'qiǎ bó zi',\n 红澄澄: 'hóng deng deng',\n 赶得及: 'gǎn de jí',\n 当间儿: 'dāng jiàn er',\n 露马脚: 'lòu mǎ jiǎo',\n 鸡内金: 'jī nèi jīn',\n 犯得上: 'fàn de shàng',\n 钉齿耙: 'dīng chǐ bà',\n 饱和点: 'bǎo hé diǎn',\n 龙爪槐: 'lóng zhǎo huái',\n 喝倒彩: 'hè dào cǎi',\n 定冠词: 'dìng guàn cí',\n 担担面: 'dàn dan miàn',\n 吃得住: 'chī de zhù',\n 爪尖儿: 'zhuǎ jiān er',\n 支着儿: 'zhī zhāo er',\n 折跟头: 'zhē gēn tou',\n 阴着儿: 'yīn zhāo er',\n 烟卷儿: 'yān juǎn er',\n 宣传弹: 'xuān chuán dàn',\n 信皮儿: 'xìn pí er',\n 弦切角: 'xián qiē jiǎo',\n 缩砂密: 'sù shā mì',\n 说得来: 'shuō de lái',\n 水漂儿: 'shuǐ piāo er',\n 耍笔杆: 'shuǎ bǐ gǎn',\n 数得上: 'shǔ de shàng',\n 数不着: 'shǔ bù zháo',\n 数不清: 'shǔ bù qīng',\n 什件儿: 'shí jiàn er',\n 生死簿: 'shēng sǐ bù',\n 扇风机: 'shān fēng jī',\n 撒呓挣: 'sā yì zheng',\n 日记簿: 'rì jì bù',\n 热得快: 'rè de kuài',\n 亲家公: 'qìng jia gōng',\n 奇函数: 'jī hán shù',\n 拍纸簿: 'pāi zhǐ bù',\n 努劲儿: 'nǔ jìn er',\n 泥娃娃: 'ní wá wa',\n 内切圆: 'nèi qiē yuán',\n 哪会儿: 'nǎ huì er',\n 闷头儿: 'mēn tóu er',\n 没谱儿: 'méi pǔ er',\n 铆劲儿: 'mǎo jìn er',\n 溜肩膀: 'liū jiān bǎng',\n 了望台: 'liào wàng tái',\n 老来少: 'lǎo lái shào',\n 坤角儿: 'kūn jué er',\n 考勤簿: 'kǎo qín bù',\n 卷笔刀: 'juǎn bǐ dāo',\n 进给量: 'jìn jǐ liàng',\n 划不来: 'huá bù lái',\n 汗褂儿: 'hàn guà er',\n 鼓囊囊: 'gǔ nāng nāng',\n 够劲儿: 'gòu jìn er',\n 公切线: 'gōng qiē xiàn',\n 搁得住: 'gé de zhù',\n 赶浪头: 'gǎn làng tóu',\n 赶得上: 'gǎn de shàng',\n 干酵母: 'gān jiào mǔ',\n 嘎渣儿: 'gā zhā er',\n 嘎嘣脆: 'gā bēng cuì',\n 对得住: 'duì de zhù',\n 逗闷子: 'dòu mèn zi',\n 顶呱呱: 'dǐng guā guā',\n 滴溜儿: 'dī liù er',\n 大轴子: 'dà zhòu zi',\n 打板子: 'dǎ bǎn zi',\n 寸劲儿: 'cùn jìn er',\n 醋劲儿: 'cù jìn er',\n 揣手儿: 'chuāi shǒu er',\n 冲劲儿: 'chòng jìn er',\n 吃得来: 'chī de lái',\n 不更事: 'bù gēng shì',\n 奔头儿: 'bèn tou er',\n 百夫长: 'bǎi fū zhǎng',\n 娃娃亲: 'wá wa qīn',\n 死劲儿: 'sǐ jìn er',\n 骨朵儿: 'gū duǒ er',\n 功劳簿: 'gōng láo bù',\n 都江堰: 'dū jiāng yàn',\n 一担水: 'yí dàn shuǐ',\n 否极泰: 'pǐ jí tài',\n 泰来否: 'tài lái pǐ',\n 咳特灵: 'ké tè líng',\n 开户行: 'kāi hù háng',\n 郦食其: 'lì yì jī',\n 花事了: 'huā shì liǎo',\n // 一字变调的词语(与两个字的字典冲突,故需要重新定义)\n 一更更: 'yì gēng gēng',\n 一重山: 'yì chóng shān',\n 风一更: 'fēng yì gēng',\n 雪一更: 'xuě yì gēng',\n 归一码: 'guī yì mǎ',\n // 一字不变调的词语(需要增补更多)\n 星期一: 'xīng qī yī',\n 礼拜一: 'lǐ bài yī',\n 一季度: 'yī jì dù',\n 一月一: 'yī yuè yī',\n 一字马: 'yī zì mǎ',\n 一是一: 'yī shì yī',\n 一次方: 'yī cì fāng',\n 一阳指: 'yī yáng zhǐ',\n 一字决: 'yī zì jué',\n 一年级: 'yī nián jí',\n 一不做: 'yī bú zuò',\n 屈戌儿: 'qū qu ér',\n 难为水: 'nán wéi shuǐ',\n 难为情: 'nán wéi qíng',\n 行一行: 'xíng yì háng',\n 别别的: 'biè bié de',\n 干哪行: 'gàn nǎ háng',\n 干一行: 'gàn yì háng',\n 曲别针: 'qū bié zhēn'\n};\nconst Pattern3 = Object.keys(DICT3).map(key => ({\n zh: key,\n pinyin: DICT3[key],\n probability: 2e-8 /* Probability.DICT */,\n length: 3,\n priority: Priority.Normal,\n dict: Symbol('dict3')\n}));\nconst DICT4 = {\n 成吉思汗: \"chéng jí sī hán\",\n 四通八达: \"sì tōng bā dá\",\n 一模一样: \"yì mú yí yàng\",\n 青藏高原: \"qīng zàng gāo yuán\",\n 阿弥陀佛: \"ē mí tuó fó\",\n 解放思想: \"jiè fàng sī xiǎng\",\n 所作所为: \"suǒ zuò suǒ wéi\",\n 迷迷糊糊: \"mí mí hu hū\",\n 荷枪实弹: \"hè qiāng shí dàn\",\n 兴高采烈: \"xìng gāo cǎi liè\",\n 无能为力: \"wú néng wéi lì\",\n 布鲁塞尔: \"bù lǔ sài ěr\",\n 为所欲为: \"wéi suǒ yù wéi\",\n 克什米尔: \"kè shí mǐ ěr\",\n 没完没了: \"méi wán méi liǎo\",\n 不为人知: \"bù wéi rén zhī\",\n 结结巴巴: \"jiē jiē bā bā\",\n 前仆后继: \"qián pū hòu jì\",\n 铺天盖地: \"pū tiān gài dì\",\n 直截了当: \"zhí jié liǎo dàng\",\n 供不应求: \"gōng bú yìng qiú\",\n 御史大夫: \"yù shǐ dà fū\",\n 不为瓦全: \"bù wéi wǎ quán\",\n 不可收拾: \"bù kě shōu shi\",\n 胡作非为: \"hú zuò fēi wéi\",\n 分毫不差: \"fēn háo bú chà\",\n 模模糊糊: \"mó mó hu hū\",\n 不足为奇: \"bù zú wéi qí\",\n 悄无声息: \"qiǎo wú shēng xī\",\n 了如指掌: \"liǎo rú zhǐ zhǎng\",\n 深恶痛绝: \"shēn wù tòng jué\",\n 高高兴兴: \"gāo gāo xìng xìng\",\n 唉声叹气: \"āi shēng tàn qì\",\n 汉藏语系: \"hàn zàng yǔ xì\",\n 处心积虑: \"chǔ xīn jī lǜ\",\n 泣不成声: \"qì bù chéng shēng\",\n 半夜三更: \"bàn yè sān gēng\",\n 失魂落魄: \"shī hún luò pò\",\n 二十八宿: \"èr shí bā xiù\",\n 转来转去: \"zhuàn lái zhuàn qù\",\n 数以万计: \"shǔ yǐ wàn jì\",\n 相依为命: \"xiāng yī wéi mìng\",\n 恋恋不舍: \"liàn liàn bù shě\",\n 屈指可数: \"qū zhǐ kě shǔ\",\n 神出鬼没: \"shén chū guǐ mò\",\n 结结实实: \"jiē jiē shí shí\",\n 有的放矢: \"yǒu dì fàng shǐ\",\n 叽哩咕噜: \"jī lǐ gū lū\",\n 调兵遣将: \"diào bīng qiǎn jiàng\",\n 载歌载舞: \"zài gē zài wǔ\",\n 转危为安: \"zhuǎn wēi wéi ān\",\n 踏踏实实: \"tā tā shi shí\",\n 桑给巴尔: \"sāng jǐ bā ěr\",\n 装模作样: \"zhuāng mú zuò yàng\",\n 见义勇为: \"jiàn yì yǒng wéi\",\n 相差无几: \"xiāng chā wú jǐ\",\n 叹为观止: \"tàn wéi guān zhǐ\",\n 闷闷不乐: \"mèn mèn bú lè\",\n 喜怒哀乐: \"xǐ nù āi lè\",\n 鲜为人知: \"xiǎn wéi rén zhī\",\n 张牙舞爪: \"zhāng yá wǔ zhǎo\",\n 为非作歹: \"wéi fēi zuò dǎi\",\n 含糊其辞: \"hán hú qí cí\",\n 疲于奔命: \"pí yú bēn mìng\",\n 勉为其难: \"miǎn wéi qí nán\",\n 依依不舍: \"yī yī bù shě\",\n 顶头上司: \"dǐng tóu shàng si\",\n 不着边际: \"bù zhuó biān jì\",\n 大模大样: \"dà mú dà yàng\",\n 寻欢作乐: \"xún huān zuò lè\",\n 一走了之: \"yì zǒu liǎo zhī\",\n 字里行间: \"zì lǐ háng jiān\",\n 含含糊糊: \"hán hán hu hū\",\n 恰如其分: \"qià rú qí fèn\",\n 破涕为笑: \"pò tì wéi xiào\",\n 深更半夜: \"shēn gēng bàn yè\",\n 千差万别: \"qiān chā wàn bié\",\n 数不胜数: \"shǔ bú shèng shǔ\",\n 据为己有: \"jù wéi jǐ yǒu\",\n 天旋地转: \"tiān xuán dì zhuàn\",\n 养尊处优: \"yǎng zūn chǔ yōu\",\n 玻璃纤维: \"bō li xiān wéi\",\n 吵吵闹闹: \"chāo chao nào nào\",\n 晕头转向: \"yūn tóu zhuàn xiàng\",\n 土生土长: \"tǔ shēng tǔ zhǎng\",\n 宁死不屈: \"nìng sǐ bù qū\",\n 不省人事: \"bù xǐng rén shì\",\n 尽力而为: \"jìn lì ér wéi\",\n 精明强干: \"jīng míng qiáng gàn\",\n 唠唠叨叨: \"láo lao dāo dāo\",\n 叽叽喳喳: \"jī ji zhā zhā\",\n 功不可没: \"gōng bù kě mò\",\n 锲而不舍: \"qiè ér bù shě\",\n 排忧解难: \"pái yōu jiě nàn\",\n 稀里糊涂: \"xī li hú tú\",\n 各有所长: \"gè yǒu suǒ cháng\",\n 的的确确: \"dí dí què què\",\n 哄堂大笑: \"hōng táng dà xiào\",\n 听而不闻: \"tīng ér bù wén\",\n 刀耕火种: \"dāo gēng huǒ zhòng\",\n 内分泌腺: \"nèi fèn mì xiàn\",\n 化险为夷: \"huà xiǎn wéi yí\",\n 百发百中: \"bǎi fā bǎi zhòng\",\n 重见天日: \"chóng jiàn tiān rì\",\n 反败为胜: \"fǎn bài wéi shèng\",\n 一了百了: \"yì liǎo bǎi liǎo\",\n 大大咧咧: \"dà da liē liē\",\n 心急火燎: \"xīn jí huǒ liǎo\",\n 粗心大意: \"cū xīn dà yi\",\n 鸡皮疙瘩: \"jī pí gē da\",\n 夷为平地: \"yí wéi píng dì\",\n 日积月累: \"rì jī yuè lěi\",\n 设身处地: \"shè shēn chǔ dì\",\n 投其所好: \"tóu qí suǒ hào\",\n 间不容发: \"jiān bù róng fà\",\n 人满为患: \"rén mǎn wéi huàn\",\n 穷追不舍: \"qióng zhuī bù shě\",\n 为时已晚: \"wéi shí yǐ wǎn\",\n 如数家珍: \"rú shǔ jiā zhēn\",\n 心里有数: \"xīn lǐ yǒu shù\",\n 以牙还牙: \"yǐ yá huán yá\",\n 神不守舍: \"shén bù shǒu shě\",\n 孟什维克: \"mèng shí wéi kè\",\n 各自为战: \"gè zì wéi zhàn\",\n 怨声载道: \"yuàn shēng zài dào\",\n 救苦救难: \"jiù kǔ jiù nàn\",\n 好好先生: \"hǎo hǎo xiān sheng\",\n 怪模怪样: \"guài mú guài yàng\",\n 抛头露面: \"pāo tóu lù miàn\",\n 游手好闲: \"yóu shǒu hào xián\",\n 无所不为: \"wú suǒ bù wéi\",\n 调虎离山: \"diào hǔ lí shān\",\n 步步为营: \"bù bù wéi yíng\",\n 好大喜功: \"hào dà xǐ gōng\",\n 众矢之的: \"zhòng shǐ zhī dì\",\n 长生不死: \"cháng shēng bù sǐ\",\n 蔚为壮观: \"wèi wéi zhuàng guān\",\n 不可胜数: \"bù kě shèng shǔ\",\n 鬼使神差: \"guǐ shǐ shén chāi\",\n 洁身自好: \"jié shēn zì hào\",\n 敢作敢为: \"gǎn zuò gǎn wéi\",\n 茅塞顿开: \"máo sè dùn kāi\",\n 走马换将: \"zǒu mǎ huàn jiàng\",\n 为时过早: \"wéi shí guò zǎo\",\n 为人师表: \"wéi rén shī biǎo\",\n 阴差阳错: \"yīn chā yáng cuò\",\n 油腔滑调: \"yóu qiāng huá diào\",\n 重蹈覆辙: \"chóng dǎo fù zhé\",\n 骂骂咧咧: \"mà ma liē liē\",\n 絮絮叨叨: \"xù xù dāo dāo\",\n 如履薄冰: \"rú lǚ bó bīng\",\n 损兵折将: \"sǔn bīng zhé jiàng\",\n 拐弯抹角: \"guǎi wān mò jiǎo\",\n 像模像样: \"xiàng mú xiàng yàng\",\n 供过于求: \"gōng guò yú qiú\",\n 开花结果: \"kāi huā jiē guǒ\",\n 仔仔细细: \"zǐ zǐ xì xì\",\n 川藏公路: \"chuān zàng gōng lù\",\n 河北梆子: \"hé běi bāng zi\",\n 长年累月: \"cháng nián lěi yuè\",\n 正儿八经: \"zhèng er bā jīng\",\n 不识抬举: \"bù shí tái ju\",\n 重振旗鼓: \"chóng zhèn qí gǔ\",\n 气息奄奄: \"qì xī yān yān\",\n 紧追不舍: \"jǐn zhuī bù shě\",\n 服服帖帖: \"fú fu tiē tiē\",\n 强词夺理: \"qiǎng cí duó lǐ\",\n 噼里啪啦: \"pī li pā lā\",\n 人才济济: \"rén cái jǐ jǐ\",\n 发人深省: \"fā rén shēn xǐng\",\n 不足为凭: \"bù zú wéi píng\",\n 为富不仁: \"wéi fù bù rén\",\n 连篇累牍: \"lián piān lěi dú\",\n 呼天抢地: \"hū tiān qiāng dì\",\n 落落大方: \"luò luò dà fāng\",\n 自吹自擂: \"zì chuī zì léi\",\n 乐善好施: \"lè shàn hào shī\",\n 以攻为守: \"yǐ gōng wéi shǒu\",\n 磨磨蹭蹭: \"mó mó cèng cèng\",\n 削铁如泥: \"xuē tiě rú ní\",\n 助纣为虐: \"zhù zhòu wéi nüè\",\n 以退为进: \"yǐ tuì wéi jìn\",\n 嘁嘁喳喳: \"qī qī chā chā\",\n 枪林弹雨: \"qiāng lín dàn yǔ\",\n 令人发指: \"lìng rén fà zhǐ\",\n 转败为胜: \"zhuǎn bài wéi shèng\",\n 转弯抹角: \"zhuǎn wān mò jiǎo\",\n 在劫难逃: \"zài jié nán táo\",\n 正当防卫: \"zhèng dàng fáng wèi\",\n 不足为怪: \"bù zú wéi guài\",\n 难兄难弟: \"nàn xiōng nàn dì\",\n 咿咿呀呀: \"yī yī yā yā\",\n 弹尽粮绝: \"dàn jìn liáng jué\",\n 阿谀奉承: \"ē yú fèng chéng\",\n 稀里哗啦: \"xī li huā lā\",\n 返老还童: \"fǎn lǎo huán tóng\",\n 好高骛远: \"hào gāo wù yuǎn\",\n 鹿死谁手: \"lù sǐ shéi shǒu\",\n 差强人意: \"chā qiáng rén yì\",\n 大吹大擂: \"dà chuī dà léi\",\n 成家立业: \"chéng jiā lì yè\",\n 自怨自艾: \"zì yuàn zì yì\",\n 负债累累: \"fù zhài lěi lěi\",\n 古为今用: \"gǔ wéi jīn yòng\",\n 入土为安: \"rù tǔ wéi ān\",\n 下不为例: \"xià bù wéi lì\",\n 一哄而上: \"yì hōng ér shàng\",\n 没头苍蝇: \"méi tóu cāng ying\",\n 天差地远: \"tiān chā dì yuǎn\",\n 风卷残云: \"fēng juǎn cán yún\",\n 多灾多难: \"duō zāi duō nàn\",\n 乳臭未干: \"rǔ xiù wèi gān\",\n 行家里手: \"háng jiā lǐ shǒu\",\n 狼狈为奸: \"láng bèi wéi jiān\",\n 处变不惊: \"chǔ biàn bù jīng\",\n 一唱一和: \"yí chàng yí hè\",\n 一念之差: \"yí niàn zhī chā\",\n 金蝉脱壳: \"jīn chán tuō qiào\",\n 滴滴答答: \"dī dī dā dā\",\n 硕果累累: \"shuò guǒ léi léi\",\n 好整以暇: \"hào zhěng yǐ xiá\",\n 红得发紫: \"hóng de fā zǐ\",\n 传为美谈: \"chuán wéi měi tán\",\n 富商大贾: \"fù shāng dà gǔ\",\n 四海为家: \"sì hǎi wéi jiā\",\n 了若指掌: \"liǎo ruò zhǐ zhǎng\",\n 大有可为: \"dà yǒu kě wéi\",\n 出头露面: \"chū tóu lù miàn\",\n 鼓鼓囊囊: \"gǔ gu nāng nāng\",\n 窗明几净: \"chuāng míng jī jìng\",\n 泰然处之: \"tài rán chǔ zhī\",\n 怒发冲冠: \"nù fà chōng guān\",\n 有机玻璃: \"yǒu jī bō li\",\n 骨头架子: \"gǔ tou jià zi\",\n 义薄云天: \"yì bó yún tiān\",\n 一丁点儿: \"yī dīng diǎn er\",\n 时来运转: \"shí lái yùn zhuǎn\",\n 陈词滥调: \"chén cí làn diào\",\n 化整为零: \"huà zhěng wéi líng\",\n 火烧火燎: \"huǒ shāo huǒ liǎo\",\n 干脆利索: \"gàn cuì lì suǒ\",\n 吊儿郎当: \"diào er láng dāng\",\n 广种薄收: \"guǎng zhòng bó shōu\",\n 种瓜得瓜: \"zhòng guā dé guā\",\n 种豆得豆: \"zhòng dòu dé dòu\",\n 难舍难分: \"nán shě nán fēn\",\n 歃血为盟: \"shà xuè wéi méng\",\n 奋发有为: \"fèn fā yǒu wéi\",\n 阴错阳差: \"yīn cuò yáng chā\",\n 东躲西藏: \"dōng duǒ xī cáng\",\n 烟熏火燎: \"yān xūn huǒ liǎo\",\n 钻牛角尖: \"zuān niú jiǎo jiān\",\n 乔装打扮: \"qiáo zhuāng dǎ bàn\",\n 改弦更张: \"gǎi xián gēng zhāng\",\n 河南梆子: \"hé nán bāng zi\",\n 好吃懒做: \"hào chī lǎn zuò\",\n 何乐不为: \"hé lè bù wéi\",\n 大出风头: \"dà chū fēng tóu\",\n 攻城掠地: \"gōng chéng lüè dì\",\n 漂漂亮亮: \"piào piào liang liang\",\n 折衷主义: \"zhé zhōng zhǔ yì\",\n 大马哈鱼: \"dà mǎ hǎ yú\",\n 绿树成荫: \"lǜ shù chéng yīn\",\n 率先垂范: \"shuài xiān chuí fàn\",\n 家长里短: \"jiā cháng lǐ duǎn\",\n 宽大为怀: \"kuān dà wéi huái\",\n 左膀右臂: \"zuǒ bǎng yòu bì\",\n 一笑了之: \"yí xiào liǎo zhī\",\n 天下为公: \"tiān xià wéi gōng\",\n 还我河山: \"huán wǒ hé shān\",\n 何足为奇: \"hé zú wéi qí\",\n 好自为之: \"hǎo zì wéi zhī\",\n 风姿绰约: \"fēng zī chuò yuē\",\n 大雨滂沱: \"dà yǔ pāng tuó\",\n 传为佳话: \"chuán wéi jiā huà\",\n 吃里扒外: \"chī lǐ pá wài\",\n 重操旧业: \"chóng cāo jiù yè\",\n 小家子气: \"xiǎo jiā zi qì\",\n 少不更事: \"shào bù gēng shì\",\n 难分难舍: \"nán fēn nán shě\",\n 添砖加瓦: \"tiān zhuān jiā wǎ\",\n 是非分明: \"shì fēi fēn míng\",\n 舍我其谁: \"shě wǒ qí shuí\",\n 偏听偏信: \"piān tīng piān xìn\",\n 量入为出: \"liàng rù wéi chū\",\n 降龙伏虎: \"xiáng lóng fú hǔ\",\n 钢化玻璃: \"gāng huà bō li\",\n 正中下怀: \"zhèng zhòng xià huái\",\n 以身许国: \"yǐ shēn xǔ guó\",\n 一语中的: \"yì yǔ zhòng dì\",\n 丧魂落魄: \"sàng hún luò pò\",\n 三座大山: \"sān zuò dà shān\",\n 济济一堂: \"jǐ jǐ yì táng\",\n 好事之徒: \"hào shì zhī tú\",\n 干净利索: \"gàn jìng lì suǒ\",\n 出将入相: \"chū jiàng rù xiàng\",\n 袅袅娜娜: \"niǎo niǎo nuó nuó\",\n 狐狸尾巴: \"hú li wěi ba\",\n 好逸恶劳: \"hào yì wù láo\",\n 大而无当: \"dà ér wú dàng\",\n 打马虎眼: \"dǎ mǎ hu yǎn\",\n 板上钉钉: \"bǎn shàng dìng dīng\",\n 吆五喝六: \"yāo wǔ hè liù\",\n 虾兵蟹将: \"xiā bīng xiè jiàng\",\n 水调歌头: \"shuǐ diào gē tóu\",\n 数典忘祖: \"shǔ diǎn wàng zǔ\",\n 人事不省: \"rén shì bù xǐng\",\n 曲高和寡: \"qǔ gāo hè guǎ\",\n 屡教不改: \"lǚ jiào bù gǎi\",\n 互为因果: \"hù wéi yīn guǒ\",\n 互为表里: \"hù wéi biǎo lǐ\",\n 厚此薄彼: \"hòu cǐ bó bǐ\",\n 过关斩将: \"guò guān zhǎn jiàng\",\n 疙疙瘩瘩: \"gē ge dā dā\",\n 大腹便便: \"dà fù pián pián\",\n 走为上策: \"zǒu wéi shàng cè\",\n 冤家对头: \"yuān jia duì tóu\",\n 有隙可乘: \"yǒu xì kě chèng\",\n 一鳞半爪: \"yì lín bàn zhǎo\",\n 片言只语: \"piàn yán zhǐ yǔ\",\n 开花结实: \"kāi huā jié shí\",\n 经年累月: \"jīng nián lěi yuè\",\n 含糊其词: \"hán hú qí cí\",\n 寡廉鲜耻: \"guǎ lián xiǎn chǐ\",\n 成年累月: \"chéng nián lěi yuè\",\n 不徇私情: \"bú xùn sī qíng\",\n 不当人子: \"bù dāng rén zǐ\",\n 膀大腰圆: \"bǎng dà yāo yuán\",\n 指腹为婚: \"zhǐ fù wéi hūn\",\n 这么点儿: \"zhè me diǎn er\",\n 意兴索然: \"yì xīng suǒ rán\",\n 绣花枕头: \"xiù huā zhěn tou\",\n 无的放矢: \"wú dì fàng shǐ\",\n 望闻问切: \"wàng wén wèn qiè\",\n 舍己为人: \"shě jǐ wèi rén\",\n 穷年累月: \"qióng nián lěi yuè\",\n 排难解纷: \"pái nàn jiě fēn\",\n 处之泰然: \"chǔ zhī tài rán\",\n 指鹿为马: \"zhǐ lù wéi mǎ\",\n 危如累卵: \"wēi rú lěi luǎn\",\n 天兵天将: \"tiān bīng tiān jiàng\",\n 舍近求远: \"shě jìn qiú yuǎn\",\n 南腔北调: \"nán qiāng běi diào\",\n 苦中作乐: \"kǔ zhōng zuò lè\",\n 厚积薄发: \"hòu jī bó fā\",\n 臭味相投: \"xiù wèi xiāng tóu\",\n 长幼有序: \"zhǎng yòu yǒu xù\",\n 逼良为娼: \"bī liáng wéi chāng\",\n 悲悲切切: \"bēi bēi qiè qiē\",\n 败军之将: \"bài jūn zhī jiàng\",\n 欺行霸市: \"qī háng bà shì\",\n 削足适履: \"xuē zú shì lǚ\",\n 先睹为快: \"xiān dǔ wéi kuài\",\n 啼饥号寒: \"tí jī háo hán\",\n 疏不间亲: \"shū bú jiàn qīn\",\n 神差鬼使: \"shén chāi guǐ shǐ\",\n 敲敲打打: \"qiāo qiāo dǎ dǎ\",\n 平铺直叙: \"píng pū zhí xù\",\n 没头没尾: \"méi tóu mò wěi\",\n 寥寥可数: \"liáo liáo kě shǔ\",\n 哼哈二将: \"hēng hā èr jiàng\",\n 鹤发童颜: \"hè fà tóng yán\",\n 各奔前程: \"gè bèn qián chéng\",\n 弹无虚发: \"dàn wú xū fā\",\n 大人先生: \"dà rén xiān sheng\",\n 与民更始: \"yǔ mín gēng shǐ\",\n 树碑立传: \"shù bēi lì zhuàn\",\n 是非得失: \"shì fēi dé shī\",\n 实逼处此: \"shí bī chǔ cǐ\",\n 塞翁失马: \"sài wēng shī mǎ\",\n 日薄西山: \"rì bó xī shān\",\n 切身体会: \"qiè shēn tǐ huì\",\n 片言只字: \"piàn yán zhǐ zì\",\n 跑马卖解: \"pǎo mǎ mài xiè\",\n 宁折不弯: \"nìng zhé bù wān\",\n 零零散散: \"líng líng sǎn sǎn\",\n 量体裁衣: \"liàng tǐ cái yī\",\n 连中三元: \"lián zhòng sān yuán\",\n 礼崩乐坏: \"lǐ bēng yuè huài\",\n 不为已甚: \"bù wéi yǐ shèn\",\n 转悲为喜: \"zhuǎn bēi wéi xǐ\",\n 以眼还眼: \"yǐ yǎn huán yǎn\",\n 蔚为大观: \"wèi wéi dà guān\",\n 未为不可: \"wèi wéi bù kě\",\n 童颜鹤发: \"tóng yán hè fà\",\n 朋比为奸: \"péng bǐ wéi jiān\",\n 莫此为甚: \"mò cǐ wéi shèn\",\n 夹枪带棒: \"jiā qiāng dài bàng\",\n 富商巨贾: \"fù shāng jù jiǎ\",\n 淡然处之: \"dàn rán chǔ zhī\",\n 箪食壶浆: \"dān shí hú jiāng\",\n 创巨痛深: \"chuāng jù tòng shēn\",\n 草长莺飞: \"cǎo zhǎng yīng fēi\",\n 坐视不救: \"zuò shī bú jiù\",\n 以己度人: \"yǐ jǐ duó rén\",\n 随行就市: \"suí háng jiù shì\",\n 文以载道: \"wén yǐ zài dào\",\n 文不对题: \"wén bú duì tí\",\n 铁板钉钉: \"tiě bǎn dìng dīng\",\n 身体发肤: \"shēn tǐ fà fū\",\n 缺吃少穿: \"quē chī shǎo chuān\",\n 目无尊长: \"mù wú zūn zhǎng\",\n 吉人天相: \"jí rén tiān xiàng\",\n 毁家纾难: \"huǐ jiā shū nàn\",\n 钢筋铁骨: \"gāng jīn tiě gǔ\",\n 丢卒保车: \"diū zú bǎo jū\",\n 丢三落四: \"diū sān là sì\",\n 闭目塞听: \"bì mù sè tīng\",\n 削尖脑袋: \"xuē jiān nǎo dài\",\n 为非作恶: \"wéi fēi zuò è\",\n 人才难得: \"rén cái nán dé\",\n 情非得已: \"qíng fēi dé yǐ\",\n 切中要害: \"qiè zhòng yào hài\",\n 火急火燎: \"huǒ jí huǒ liǎo\",\n 画地为牢: \"huà dì wéi láo\",\n 好酒贪杯: \"hào jiǔ tān bēi\",\n 长歌当哭: \"cháng gē dàng kū\",\n 载沉载浮: \"zài chén zài fú\",\n 遇难呈祥: \"yù nàn chéng xiáng\",\n 榆木疙瘩: \"yú mù gē da\",\n 以邻为壑: \"yǐ lín wéi hè\",\n 洋为中用: \"yáng wéi zhōng yòng\",\n 言为心声: \"yán wéi xīn shēng\",\n 言必有中: \"yán bì yǒu zhòng\",\n 图穷匕见: \"tú qióng bǐ xiàn\",\n 滂沱大雨: \"páng tuó dà yǔ\",\n 目不暇给: \"mù bù xiá jǐ\",\n 量才录用: \"liàng cái lù yòng\",\n 教学相长: \"jiào xué xiāng zhǎng\",\n 悔不当初: \"huǐ bù dāng chū\",\n 呼幺喝六: \"hū yāo hè liù\",\n 不足为训: \"bù zú wéi xùn\",\n 不拘形迹: \"bù jū xíng jī\",\n 傍若无人: \"páng ruò wú rén\",\n 罪责难逃: \"zuì zé nán táo\",\n 自我吹嘘: \"zì wǒ chuī xū\",\n 转祸为福: \"zhuǎn huò wéi fú\",\n 勇冠三军: \"yǒng guàn sān jūn\",\n 易地而处: \"yì dì ér chǔ\",\n 卸磨杀驴: \"xiè mò shā lǘ\",\n 玩儿不转: \"wán ér bú zhuàn\",\n 天道好还: \"tiān dào hǎo huán\",\n 身单力薄: \"shēn dān lì bó\",\n 撒豆成兵: \"sǎ dòu chéng bīng\",\n 片纸只字: \"piàn zhǐ zhī zì\",\n 宁缺毋滥: \"nìng quē wú làn\",\n 没没无闻: \"mò mò wú wén\",\n 量力而为: \"liàng lì ér wéi\",\n 历历可数: \"lì lì kě shǔ\",\n 口碑载道: \"kǒu bēi zài dào\",\n 君子好逑: \"jūn zǐ hǎo qiú\",\n 好为人师: \"hào wéi rén shī\",\n 豪商巨贾: \"háo shāng jù jiǎ\",\n 各有所好: \"gè yǒu suǒ hào\",\n 度德量力: \"duó dé liàng lì\",\n 指天为誓: \"zhǐ tiān wéi shì\",\n 逸兴遄飞: \"yì xìng chuán fēi\",\n 心宽体胖: \"xīn kuān tǐ pán\",\n 为德不卒: \"wéi dé bù zú\",\n 天下为家: \"tiān xià wéi jiā\",\n 视为畏途: \"shì wéi wèi tú\",\n 三灾八难: \"sān zāi bā nàn\",\n 沐猴而冠: \"mù hóu ér guàn\",\n 哩哩啦啦: \"lī li lā lā\",\n 见缝就钻: \"jiàn fèng jiù zuān\",\n 夹层玻璃: \"jiā céng bō li\",\n 急公好义: \"jí gōng hào yì\",\n 积年累月: \"jī nián lěi yuè\",\n 划地为牢: \"huá dì wéi láo\",\n 更名改姓: \"gēng míng gǎi xìng\",\n 奉为圭臬: \"fèng wéi guī niè\",\n 多难兴邦: \"duō nàn xīng bāng\",\n 不破不立: \"bú pò bú lì\",\n 坐地自划: \"zuò dì zì huá\",\n 坐不重席: \"zuò bù chóng xí\",\n 坐不窥堂: \"zuò bù kuī táng\",\n 作嫁衣裳: \"zuò jià yī shang\",\n 左枝右梧: \"zuǒ zhī yòu wú\",\n 左宜右有: \"zuǒ yí yòu yǒu\",\n 钻头觅缝: \"zuān tóu mì fèng\",\n 钻天打洞: \"zuān tiān dǎ dòng\",\n 钻皮出羽: \"zuān pí chū yǔ\",\n 钻火得冰: \"zuān huǒ dé bīng\",\n 钻洞觅缝: \"zuàn dòng mì féng\",\n 钻冰求火: \"zuān bīng qiú huǒ\",\n 子为父隐: \"zǐ wéi fù yǐn\",\n 擢发难数: \"zhuó fà nán shǔ\",\n 着人先鞭: \"zhuó rén xiān biān\",\n 斫雕为朴: \"zhuó diāo wéi pǔ\",\n 锥处囊中: \"zhuī chǔ náng zhōng\",\n 椎心饮泣: \"chuí xīn yǐn qì\",\n 椎心泣血: \"chuí xīn qì xuè\",\n 椎牛飨士: \"chuí niú xiǎng shì\",\n 椎牛歃血: \"chuí niú shà xuè\",\n 椎牛发冢: \"chuí niú fà zhǒng\",\n 椎埋屠狗: \"chuí mái tú gǒu\",\n 椎埋狗窃: \"chuí mái gǒu qiè\",\n 壮发冲冠: \"zhuàng fā chōng guàn\",\n 庄严宝相: \"zhuāng yán bǎo xiàng\",\n 转愁为喜: \"zhuǎn chóu wéi xǐ\",\n 转嗔为喜: \"zhuǎn chēn wéi xǐ\",\n 拽巷啰街: \"zhuài xiàng luó jiē\",\n 拽耙扶犁: \"zhuāi pá fú lí\",\n 拽布拖麻: \"zhuài bù tuō má\",\n 箸长碗短: \"zhù cháng wǎn duǎn\",\n 铸剑为犁: \"zhù jiàn wéi lí\",\n 杼柚其空: \"zhù yòu qí kōng\",\n 杼柚空虚: \"zhù yòu kōng xū\",\n 助天为虐: \"zhù tiān wéi nüè\",\n 属垣有耳: \"zhǔ yuán yǒu ěr\",\n 属毛离里: \"zhǔ máo lí lǐ\",\n 属辞比事: \"zhǔ cí bǐ shì\",\n 逐物不还: \"zhú wù bù huán\",\n 铢量寸度: \"zhū liáng cùn duó\",\n 铢两悉称: \"zhū liǎng xī chèn\",\n 侏儒观戏: \"zhū rú guān xì\",\n 朱轓皁盖: \"zhū fān zào gài\",\n 昼度夜思: \"zhòu duó yè sī\",\n 诪张为幻: \"zhōu zhāng wéi huàn\",\n 重明继焰: \"chóng míng jì yàn\",\n 众啄同音: \"zhòng zhuó tóng yīn\",\n 众毛攒裘: \"zhòng máo cuán qiú\",\n 众好众恶: \"zhòng hào zhòng wù\",\n 擿埴索涂: \"zhāi zhí suǒ tú\",\n 稚齿婑媠: \"zhì chǐ wǒ tuó\",\n 至当不易: \"zhì dàng bú yì\",\n 指皂为白: \"zhǐ zào wéi bái\",\n 指雁为羹: \"zhǐ yàn wéi gēng\",\n 指树为姓: \"zhǐ shù wéi xìng\",\n 指山说磨: \"zhǐ shān shuō mò\",\n 止戈为武: \"zhǐ gē wéi wǔ\",\n 枝干相持: \"zhī gàn xiāng chí\",\n 枝大于本: \"zh dà yú běn\",\n 支吾其词: \"zhī wú qí cí\",\n 正身率下: \"zhèng shēn shuài xià\",\n 正冠李下: \"zhèng guàn lǐ xià\",\n 整冠纳履: \"zhěng guān nà lǚ\",\n 整躬率物: \"zhěng gōng shuài wù\",\n 整顿干坤: \"zhěng dùn gàn kūn\",\n 针头削铁: \"zhēn tóu xuē tiě\",\n 贞松劲柏: \"zhēn sōng jìng bǎi\",\n 赭衣塞路: \"zhě yī sè lù\",\n 折箭为誓: \"shé jiàn wéi shì\",\n 折而族之: \"zhé ér zú zhī\",\n 昭德塞违: \"zhāo dé sè wéi\",\n 章句小儒: \"zhāng jù xiǎo rú\",\n 湛恩汪濊: \"zhàn ēn wāng huì\",\n 占风望气: \"zhān fēng wàng qì\",\n 斩将搴旗: \"zhǎn jiàng qiān qí\",\n 曾母投杼: \"zēng mǔ tóu zhù\",\n 曾参杀人: \"zēng shēn shā rén\",\n 造谣中伤: \"zào yáo zhòng shāng\",\n 早占勿药: \"zǎo zhān wù yào\",\n 凿龟数策: \"záo guī shǔ cè\",\n 攒三聚五: \"cuán sān jù wǔ\",\n 攒眉蹙额: \"cuán mei cù é\",\n 攒零合整: \"cuán líng hé zhěng\",\n 攒锋聚镝: \"cuán fēng jù dí\",\n 载笑载言: \"zài xiào zài yán\",\n 载酒问字: \"zài jiǔ wèn zì\",\n 殒身不恤: \"yǔn shēn bú xù\",\n 云舒霞卷: \"yún shū xiá juǎn\",\n 月中折桂: \"yuè zhōng shé guì\",\n 月落参横: \"yuè luò shēn héng\",\n 鬻驽窃价: \"yù nú qiè jià\",\n 鬻鸡为凤: \"yù jī wéi fèng\",\n 遇难成祥: \"yù nàn chéng xiáng\",\n 郁郁累累: \"yù yù lěi lěi\",\n 玉卮无当: \"yù zhī wú dàng\",\n 语笑喧阗: \"yǔ xiào xuān tián\",\n 与世沉浮: \"yǔ shì chén fú\",\n 与时消息: \"yǔ shí xiāo xi\",\n 逾墙钻隙: \"yú qiáng zuān xì\",\n 渔夺侵牟: \"yú duó qīn móu\",\n 杅穿皮蠹: \"yú chuān pí dù\",\n 余勇可贾: \"yú yǒng kě gǔ\",\n 予智予雄: \"yú zhì yú xióng\",\n 予取予求: \"yú qǔ yú qiú\",\n 于家为国: \"yú jiā wéi guó\",\n 有借无还: \"yǒu jiè wú huán\",\n 有加无已: \"yǒu jiā wú yǐ\",\n 有国难投: \"yǒu guó nán tóu\",\n 游必有方: \"yóu bì yǒu fāng\",\n 油干灯尽: \"yóu gàn dēng jìn\",\n 尤云殢雨: \"yóu yún tì yǔ\",\n 庸中皦皦: \"yōng zhōng jiǎo jiǎo\",\n 郢书燕说: \"yǐng shū yān shuō\",\n 营蝇斐锦: \"yíng yíng fēi jǐn\",\n 鹰心雁爪: \"yīng xīn yàn zhǎo\",\n 莺吟燕儛: \"yīng yín yàn wǔ\",\n 应天顺时: \"yīng tiān shùn shí\",\n 印累绶若: \"yìn léi shòu ruò\",\n 隐占身体: \"yǐn zhàn shēn tǐ\",\n 饮犊上流: \"yìn dú shàng liú\",\n 引绳切墨: \"yǐn shéng qiē mò\",\n 龈齿弹舌: \"yín chǐ dàn shé\",\n 因缘为市: \"yīn yuán wéi shì\",\n 因树为屋: \"yīn shù wéi wū\",\n 溢美溢恶: \"yì měi yì wù\",\n 抑塞磊落: \"yì sè lěi luò\",\n 倚闾望切: \"yǐ lǘ wàng qiē\",\n 以意为之: \"yǐ yì wéi zhī\",\n 以言为讳: \"yǐ yán wéi huì\",\n 以疏间亲: \"yǐ shū jiàn qīn\",\n 以水济水: \"yǐ shuǐ jǐ shuǐ\",\n 以书为御: \"yǐ shū wéi yù\",\n 以守为攻: \"yǐ shǒu wéi gōng\",\n 以升量石: \"yǐ shēng liáng dàn\",\n 以慎为键: \"yǐ shèn wéi jiàn\",\n 以筌为鱼: \"yǐ quán wéi yú\",\n 以利累形: \"yǐ lì lěi xíng\",\n 以毁为罚: \"yǐ huǐ wéi fá\",\n 以黑为白: \"yǐ hēi wéi bái\",\n 以规为瑱: \"yǐ guī wéi tiàn\",\n 以古为鉴: \"yǐ gǔ wéi jiàn\",\n 以宫笑角: \"yǐ gōng xiào jué\",\n 以法为教: \"yǐ fǎ wéi jiào\",\n 以大恶细: \"yǐ dà wù xì\",\n 遗世忘累: \"yí shì wàng lěi\",\n 遗寝载怀: \"yí qǐn zài huái\",\n 移的就箭: \"yí dì jiù jiàn\",\n 依头缕当: \"yī tóu lǚ dàng\",\n 衣租食税: \"yì zū shí shuì\",\n 衣轻乘肥: \"yì qīng chéng féi\",\n 衣裳之会: \"yī shang zhī huì\",\n 衣单食薄: \"yī dān shí bó\",\n 一还一报: \"yì huán yí bào\",\n 叶公好龙: \"yè gōng hào lóng\",\n 野调无腔: \"yě diào wú qiāng\",\n 瑶池女使: \"yáo chí nǚ shǐ\",\n 幺麽小丑: \"yāo mó xiǎo chǒu\",\n 养精畜锐: \"yǎng jīng xù ruì\",\n 卬首信眉: \"áng shǒu shēn méi\",\n 洋洋纚纚: \"yáng yáng sǎ sǎ\",\n 羊羔美酒: \"yáng gāo měi jiǔ\",\n 扬风扢雅: \"yáng fēng jié yǎ\",\n 燕昭市骏: \"yān zhāo shì jùn\",\n 燕昭好马: \"yān zhāo hǎo mǎ\",\n 燕石妄珍: \"yān shí wàng zhēn\",\n 燕骏千金: \"yān jùn qiān jīn\",\n 燕金募秀: \"yān jīn mù xiù\",\n 燕驾越毂: \"yān jià yuè gǔ\",\n 燕歌赵舞: \"yān gē zhào wǔ\",\n 燕岱之石: \"yān dài zhī shí\",\n 燕处危巢: \"yàn chǔ wēi cháo\",\n 掞藻飞声: \"shàn zǎo fēi shēng\",\n 偃革为轩: \"yǎn gé wéi xuān\",\n 妍蚩好恶: \"yán chī hǎo è\",\n 压良为贱: \"yā liáng wéi jiàn\",\n 搀行夺市: \"chān háng duó shì\",\n 泣数行下: \"qì shù háng xià\",\n 当行出色: \"dāng háng chū sè\",\n 秀出班行: \"xiù chū bān háng\",\n 儿女成行: \"ér nǚ chéng háng\",\n 大行大市: \"dà háng dà shì\",\n 寻行数墨: \"xún háng shǔ mò\",\n 埙篪相和: \"xūn chí xiāng hè\",\n 血债累累: \"xuè zhài lěi lěi\",\n 炫玉贾石: \"xuàn yù gǔ shí\",\n 炫石为玉: \"xuàn shí wéi yù\",\n 悬石程书: \"xuán dàn chéng shū\",\n 悬狟素飡: \"xuán huán sù cān\",\n 悬龟系鱼: \"xuán guī xì yú\",\n 揎拳捋袖: \"xuān quán luō xiù\",\n 轩鹤冠猴: \"xuān hè guàn hóu\",\n 畜妻养子: \"xù qī yǎng zǐ\",\n 羞人答答: \"xiū rén dā dā\",\n 修鳞养爪: \"xiū lín yǎng zhǎo\",\n 熊据虎跱: \"xióng jù hǔ zhì\",\n 兄死弟及: \"xiōng sǐ dì jí\",\n 腥闻在上: \"xīng wén zài shàng\",\n 兴文匽武: \"xīng wén yǎn wǔ\",\n 兴观群怨: \"xìng guān qún yuàn\",\n 兴高彩烈: \"xìng gāo cǎi liè\",\n 心手相应: \"xīn shǒu xiāng yìng\",\n 心口相应: \"xīn kǒu xiāng yīng\",\n 挟势弄权: \"xié shì nòng quán\",\n 胁肩累足: \"xié jiān lěi zú\",\n 校短量长: \"jiào duǎn liáng cháng\",\n 小眼薄皮: \"xiǎo yǎn bó pí\",\n 硝云弹雨: \"xiāo yún dàn yǔ\",\n 鸮鸣鼠暴: \"xiāo míng shǔ bào\",\n 削株掘根: \"xuē zhū jué gēn\",\n 削铁无声: \"xuē tiě wú shēng\",\n 削职为民: \"xuē zhí wéi mín\",\n 削木为吏: \"xuē mù wéi lì\",\n 想望风褱: \"xiǎng wàng fēng huái\",\n 香培玉琢: \"xiang pei yu zhuó\",\n 相鼠有皮: \"xiàng shǔ yǒu pí\",\n 相时而动: \"xiàng shí ér dòng\",\n 相切相磋: \"xiāng qiē xiāng cuō\",\n 相女配夫: \"xiàng nǚ pèi fū\",\n 相门有相: \"xiàng mén yǒu xiàng\",\n 挦章撦句: \"xián zhāng chě jù\",\n 先我着鞭: \"xiān wǒ zhuó biān\",\n 习焉不察: \"xí yān bù chá\",\n 歙漆阿胶: \"shè qī ē jiāo\",\n 晰毛辨发: \"xī máo biàn fà\",\n 悉索薄赋: \"xī suǒ bó fù\",\n 雾鳞云爪: \"wù lín yún zhǎo\",\n 物稀为贵: \"wù xī wéi guì\",\n 碔砆混玉: \"wǔ fū hùn yù\",\n 武断专横: \"wǔ duàn zhuān héng\",\n 五石六鹢: \"wǔ shí liù yì\",\n 五色相宣: \"wǔ sè xiāng xuān\",\n 五侯七贵: \"wǔ hóu qī guì\",\n 五侯蜡烛: \"wǔ hòu là zhú\",\n 五羖大夫: \"wǔ gǔ dà fū\",\n 吾自有处: \"wú zì yǒu chǔ\",\n 无下箸处: \"wú xià zhù chǔ\",\n 无伤无臭: \"wú shāng wú xiù\",\n 无能为役: \"wú néng wéi yì\",\n 无寇暴死: \"wú kòu bào sǐ\",\n 无孔不钻: \"wú kǒng bú zuàn\",\n 无间可乘: \"wú jiān kě chéng\",\n 无间冬夏: \"wú jiān dōng xià\",\n 无恶不为: \"wú è bù wéi\",\n 无动为大: \"wú dòng wéi dà\",\n 诬良为盗: \"wū liáng wéi dào\",\n 握拳透爪: \"wò quán tòu zhǎo\",\n 文武差事: \"wén wǔ chāi shì\",\n 委委佗佗: \"wēi wēi tuó tuó\",\n 惟日为岁: \"wéi rì wéi suì\",\n 帷薄不修: \"wéi bó bù xiū\",\n 为善最乐: \"wéi shàn zuì lè\",\n 为山止篑: \"wéi shān zhǐ kuì\",\n 为仁不富: \"wéi rén bú fù\",\n 为裘为箕: \"wéi qiú wéi jī\",\n 为民父母: \"wéi mín fù mǔ\",\n 为虺弗摧: \"wéi huǐ fú cuī\",\n 为好成歉: \"wéi hǎo chéng qiàn\",\n 为鬼为蜮: \"wéi guǐ wéi yù\",\n 望风响应: \"wàng fēng xiǎng yīng\",\n 望尘僄声: \"wàng chén piào shēng\",\n 往渚还汀: \"wǎng zhǔ huán tīng\",\n 王贡弹冠: \"wáng gòng dàn guàn\",\n 亡国大夫: \"wáng guó dà fū\",\n 万贯家私: \"wàn guàn jiā sī\",\n 晚食当肉: \"wǎn shí dàng ròu\",\n 晚节不保: \"wǎn jié bù bǎo\",\n 玩岁愒时: \"wán suì kài shí\",\n 蛙蟆胜负: \"wā má shèng fù\",\n 吞言咽理: \"tūn yán yàn lǐ\",\n 颓垣断堑: \"tuí yuán duàn qiàn\",\n 推干就湿: \"tuī gàn jiù shī\",\n 剸繁决剧: \"tuán fán jué jù\",\n 团头聚面: \"tuán tóu jù miàn\",\n 兔丝燕麦: \"tù sī yàn mài\",\n 兔头麞脑: \"tù tóu zhāng nǎo\",\n 兔葵燕麦: \"tù kuí yàn mài\",\n 吐哺握发: \"tǔ bǔ wò fà\",\n 投传而去: \"tóu zhuàn ér qù\",\n 头没杯案: \"tóu mò bēi àn\",\n 头昏脑闷: \"tóu hūn nǎo mèn\",\n 头会箕敛: \"tóu kuài jī liǎn\",\n 头出头没: \"tóu chū tóu mò\",\n 痛自创艾: \"tòng zì chuāng yì\",\n 同恶相助: \"tóng wù xiāng zhù\",\n 同恶相恤: \"tóng wù xiāng xù\",\n 痌瘝在抱: \"tōng guān zài bào\",\n 通文调武: \"tōng wén diào wǔ\",\n 停留长智: \"tíng liú zhǎng zhì\",\n 铁树开华: \"tiě shù kāi huā\",\n 条贯部分: \"tiáo guàn bù fēn\",\n 挑牙料唇: \"tiǎo yá liào chún\",\n 挑么挑六: \"tiāo yāo tiāo liù\",\n 挑唇料嘴: \"tiǎo chún liào zuǐ\",\n 恬不为意: \"tián bù wéi yì\",\n 恬不为怪: \"tián bù wéi guài\",\n 天下为笼: \"tiān xià wéi lóng\",\n 天台路迷: \"tiān tái lù mí\",\n 天年不遂: \"tiān nián bú suì\",\n 探囊胠箧: \"tàn náng qū qiè\",\n 谭言微中: \"tán yán wēi zhòng\",\n 谈言微中: \"tán yán wēi zhòng\",\n 狧穅及米: \"shì kāng jí mǐ\",\n 随物应机: \"suí wù yīng jī\",\n 搜岩采干: \"sōu yán cǎi gàn\",\n 宋斤鲁削: \"sòng jīn lǔ xuē\",\n 松筠之节: \"sōng yún zhī jié\",\n 四亭八当: \"sì tíng bā dàng\",\n 四马攒蹄: \"sì mǎ cuán tí\",\n 四不拗六: \"sì bú niù liù\",\n 思所逐之: \"sī suǒ zhú zhī\",\n 丝恩发怨: \"sī ēn fà yuàn\",\n 硕望宿德: \"shuò wàng xiǔ dé\",\n 铄古切今: \"shuò gǔ qiē jīn\",\n 顺风而呼: \"shùn fēng ér hū\",\n 顺风吹火: \"shùn fēng chuī huǒ\",\n 水中著盐: \"shuǐ zhōng zhuó yán\",\n 双柑斗酒: \"shuāng gān dǒu jiǔ\",\n 数米而炊: \"shǔ mǐ ér chuī\",\n 数米量柴: \"shǔ mǐ liáng chái\",\n 数理逻辑: \"shù lǐ luó ji\",\n 数黑论黄: \"shǔ hēi lùn huáng\",\n 数白论黄: \"shǔ bái lùn huáng\",\n 束缊还妇: \"shù yūn huán fù\",\n 束蒲为脯: \"shù pú wéi pú\",\n 束椽为柱: \"shù chuán wéi zhù\",\n 书缺有间: \"shū quē yǒu jiàn\",\n 手足重茧: \"shǒu zú chóng jiǎn\",\n 手足异处: \"shǒu zú yì chǔ\",\n 手脚干净: \"shǒu jiǎo gàn jìng\",\n 手不应心: \"shǒu bù yīng xīn\",\n 螫手解腕: \"shì shǒu jiě wàn\",\n 释知遗形: \"shì zhī yí xíng\",\n 适时应务: \"shì shí yīng wù\",\n 适情率意: \"shì qíng shuài yì\",\n 适当其冲: \"shì dāng qí chōng\",\n 视为知己: \"shì wéi zhī jǐ\",\n 使羊将狼: \"shǐ yáng jiàng láng\",\n 食为民天: \"shí wéi mín tiān\",\n 拾掇无遗: \"shí duō wú yí\",\n 实与有力: \"shí yù yǒu lì\",\n 石英玻璃: \"shí yīng bō li\",\n 石室金匮: \"shí shì jīn guì\",\n 什袭珍藏: \"shí xí zhēn cáng\",\n 什伍东西: \"shí wǔ dōng xī\",\n 什围伍攻: \"shí wéi wǔ gōng\",\n 十魔九难: \"shí mó jiǔ nàn\",\n 诗书发冢: \"shī shū fà zhǒng\",\n 虱处裈中: \"shī chǔ kūn zhōng\",\n 师直为壮: \"shī zhí wéi zhuàng\",\n 尸居龙见: \"shī jū lóng xiàn\",\n 圣经贤传: \"shèng jīng xián zhuàn\",\n 圣君贤相: \"shèng jūn xián xiàng\",\n 生拖死拽: \"shēng tuō sǐ zhuài\",\n 审己度人: \"shěn jǐ duó rén\",\n 神武挂冠: \"shén wǔ guà guàn\",\n 神龙失埶: \"shén lóng shī shì\",\n 深文曲折: \"shēn wén qǔ shé\",\n 深厉浅揭: \"shēn lì qiǎn qì\",\n 深谷为陵: \"shēn gǔ wéi líng\",\n 深恶痛疾: \"shēn wù tòng jí\",\n 深仇宿怨: \"shēn chóu xiǔ yuàn\",\n 舍己为公: \"shě jǐ wèi gōng\",\n 舍短取长: \"shě duǎn qǔ cháng\",\n 舍策追羊: \"shě cè zhuī yáng\",\n 蛇蝎为心: \"shé xiē wéi xīn\",\n 少成若性: \"shào chéng ruò xìng\",\n 上当学乖: \"shàng dàng xué guāi\",\n 赏不当功: \"shǎng bù dāng gōng\",\n 善自为谋: \"shàn zì wéi móu\",\n 善为说辞: \"shàn wéi shuō cí\",\n 善善恶恶: \"shàn shàn wù è\",\n 善财难舍: \"shàn cái nán shě\",\n 苫眼铺眉: \"shān yǎn pū méi\",\n 讪牙闲嗑: \"shàn yá xián kē\",\n 山阴乘兴: \"shān yīn chéng xīng\",\n 山殽野湋: \"shān yáo yě wéi\",\n 山溜穿石: \"shān liù chuān shí\",\n 山节藻棁: \"shān jié zǎo zhuō\",\n 杀鸡为黍: \"shā jī wéi shǔ\",\n 色厉胆薄: \"sè lì dǎn bó\",\n 桑荫未移: \"sāng yīn wèi yí\",\n 桑荫不徙: \"sāng yīn bù xǐ\",\n 桑土绸缪: \"sāng tǔ chóu miù\",\n 桑户棬枢: \"sāng hù juàn shū\",\n 三战三北: \"sān zhàn sān běi\",\n 三瓦两舍: \"sān wǎ liǎng shě\",\n 三人为众: \"sān rén wèi zhòng\",\n 三差两错: \"sān chā liǎng cuò\",\n 塞井焚舍: \"sāi jǐng fén shě\",\n 洒心更始: \"sǎ xīn gèng shǐ\",\n 洒扫应对: \"sǎ sǎo yìng duì\",\n 软红香土: \"ruǎn hóng xiāng tǔ\",\n 入吾彀中: \"rù wú gòu zhōng\",\n 入铁主簿: \"rù tiě zhǔ bù\",\n 入理切情: \"rù lǐ qiē qíng\",\n 汝成人耶: \"rǔ chéng rén yé\",\n 如水投石: \"rú shuǐ tóu shí\",\n 如切如磋: \"rú qiē rú cuō\",\n 如登春台: \"rú dēng chūn tái\",\n 肉薄骨并: \"ròu bó gǔ bìng\",\n 柔情绰态: \"róu qíng chuò tài\",\n 戎马劻勷: \"róng mǎ kuāng ráng\",\n 日中为市: \"rì zhōng wéi shì\",\n 日月参辰: \"rì yuè shēn chén\",\n 日省月修: \"rì xǐng yuè xiū\",\n 日削月割: \"rì xuē yuè gē\",\n 日省月试: \"rì xǐng yuè shì\",\n 任达不拘: \"rèn dá bù jū\",\n 人言藉藉: \"rén yán jí jí\",\n 人模狗样: \"rén mú gǒu yàng\",\n 人莫予毒: \"rén mò yú dú\",\n 热熬翻饼: \"rè áo fān bǐng\",\n 圈牢养物: \"juàn láo yǎng wù\",\n 取予有节: \"qǔ yǔ yǒu jié\",\n 诎要桡腘: \"qū yāo ráo guó\",\n 穷形尽相: \"qióng xíng jìn xiàng\",\n 情凄意切: \"qíng qī yì qiè\",\n 情见势屈: \"qíng xiàn shì qū\",\n 情见乎辞: \"qíng xiàn hū cí\",\n 清都绛阙: \"qīng dōu jiàng què\",\n 倾肠倒肚: \"qīng cháng dào dǔ\",\n 青紫被体: \"qīng zǐ pī tǐ\",\n 青林黑塞: \"qīng lín hēi sài\",\n 螓首蛾眉: \"qín shǒu é méi\",\n 琴瑟之好: \"qín sè zhī hào\",\n 且住为佳: \"qiě zhù wéi jiā\",\n 切树倒根: \"qiē shù dǎo gēn\",\n 切理餍心: \"qiē lǐ yàn xīn\",\n 切近的当: \"qiē jìn de dāng\",\n 翘足引领: \"qiáo zú yǐn lǐng\",\n 巧发奇中: \"qiǎo fā qí zhòng\",\n 强嘴拗舌: \"jiàng zuǐ niù shé\",\n 强直自遂: \"qiáng zhí zì suí\",\n 强死强活: \"qiǎng sǐ qiǎng huó\",\n 强食自爱: \"qiǎng shí zì ài\",\n 强食靡角: \"qiǎng shí mí jiǎo\",\n 强弓劲弩: \"qiáng gōng jìng nǔ\",\n 强聒不舍: \"qiǎng guō bù shě\",\n 强凫变鹤: \"qiáng fú biàn hè\",\n 强而后可: \"qiǎng ér hòu kě\",\n 强得易贫: \"qiǎng dé yì pín\",\n 遣兴陶情: \"qiǎn xìng táo qíng\",\n 牵羊担酒: \"qiān yáng dān jiǔ\",\n 千了百当: \"qiān liǎo bǎi dàng\",\n 泣下如雨: \"qì xià rú yǔ\",\n 起偃为竖: \"qǐ yǎn wéi shù\",\n 岂弟君子: \"kǎi tì jūn zǐ\",\n 綦溪利跂: \"qí xī lì qí\",\n 棋输先著: \"qí shū xiān zhuó\",\n 齐王舍牛: \"qí wáng shě niú\",\n 欺天诳地: \"qī tiān kuáng dì\",\n 普天率土: \"pǔ tiān shuài tǔ\",\n 铺胸纳地: \"pū xiōng nà dì\",\n 铺锦列绣: \"pū jǐn liè xiù\",\n 破家为国: \"pò jiā wèi guó\",\n 破觚为圜: \"pò gū wéi yuán\",\n 萍飘蓬转: \"píng piāo péng zhuàn\",\n 帡天极地: \"píng tiān jí dì\",\n 屏声息气: \"bǐng shēng xī qì\",\n 凭几据杖: \"píng jī jù zhàng\",\n 贫嘴薄舌: \"pín zuǐ bó shé\",\n 片语只辞: \"piàn yǔ zhī cí\",\n 披发文身: \"pī fà wén shēn\",\n 烹龙炮凤: \"pēng lóng páo fèng\",\n 炰鳖脍鲤: \"fǒu biē kuài lǐ\",\n 庞眉皓发: \"páng méi hào fà\",\n 攀花折柳: \"pān huā zhé liǔ\",\n 攀蟾折桂: \"pān chán shé guì\",\n 女大难留: \"nǚ dà nán liú\",\n 弄玉吹箫: \"nòng yù chuī xiāo\",\n 弄管调弦: \"nòng guǎn tiáo xián\",\n 弄粉调朱: \"nòng fěn diào zhū\",\n 浓抹淡妆: \"nóng mò dàn zhuāng\",\n 捻土为香: \"niǎn tǔ wéi xiāng\",\n 年谊世好: \"nián yì shì hǎo\",\n 年华垂暮: \"nián huá chuí mù\",\n 儗不于伦: \"nǐ bù yú lún\",\n 泥而不滓: \"ní ér bù zǐ\",\n 能者为师: \"néng zhě wéi shī\",\n 能不称官: \"néng bú chèn guān\",\n 挠直为曲: \"náo zhí wéi qū\",\n 难进易退: \"nán jìn yì tuì\",\n 难得糊涂: \"nán dé hú tú\",\n 南蛮鴂舌: \"nán mán jué shé\",\n 南贩北贾: \"nán fàn běi gǔ\",\n 牧猪奴戏: \"mù zhū nú xì\",\n 目眢心忳: \"mù yuān xīn tún\",\n 目挑心招: \"mù tiǎo xīn zhāo\",\n 目量意营: \"mù liàng yì yíng\",\n 木头木脑: \"mù tóu mù nǎo\",\n 木干鸟栖: \"mù gàn niǎo qī\",\n 侔色揣称: \"móu sè chuǎi chèn\",\n 莫予毒也: \"mò yú dú yě\",\n 抹粉施脂: \"mò fěn shī zhī\",\n 磨砻镌切: \"mó lóng juān qiē\",\n 磨棱刓角: \"mó léng wán jiǎo\",\n 摸门不着: \"mō mén bù zháo\",\n 摸不着边: \"mō bù zhuó biān\",\n 命中注定: \"mìng zhōng zhù dìng\",\n 鸣鹤之应: \"míng hè zhī yìng\",\n 明效大验: \"míng xiào dà yàn\",\n 名我固当: \"míng wǒ gù dāng\",\n 邈处欿视: \"miǎo chǔ kǎn shì\",\n 黾穴鸲巢: \"měng xué qú cháo\",\n 绵里薄材: \"mián lǐ bó cái\",\n 靡有孑遗: \"mǐ yǒu jié yí\",\n 靡衣偷食: \"mǐ yī tōu shí\",\n 迷恋骸骨: \"mí liàn hái gǔ\",\n 扪参历井: \"mén shēn lì jǐng\",\n 门单户薄: \"mén dān hù bó\",\n 昧旦晨兴: \"mèi dàn chén xīng\",\n 冒名接脚: \"mào míng jiē jiǎo\",\n 毛遂堕井: \"máo suí duò jǐng\",\n 毛发倒竖: \"máo fā dǎo shù\",\n 卖文为生: \"mài wén wéi shēng\",\n 卖李钻核: \"mài lǐ zuān hé\",\n 买椟还珠: \"mǎi dú huán zhū\",\n 埋三怨四: \"mán sān yuàn sì\",\n 马入华山: \"mǎ rù huá shān\",\n 落魄江湖: \"luò pò jiāng hú\",\n 落落难合: \"luò luò nán hé\",\n 落草为寇: \"luò cǎo wéi kòu\",\n 罗织构陷: \"luó zhī gòu xiàn\",\n 鸾凤和鸣: \"luán fèng hè míng\",\n 率由旧章: \"shuài yóu jiù zhāng\",\n 率土同庆: \"shuài tǔ tóng qìng\",\n 率兽食人: \"shuài shòu shí rén\",\n 率土归心: \"shuài tǔ guī xīn\",\n 率马以骥: \"shuài mǎ yǐ jì\",\n 率尔成章: \"shuài ěr chéng zhāng\",\n 鲁斤燕削: \"lǔ jīn yàn xuē\",\n 漏尽更阑: \"lòu jìn gēng lán\",\n 笼鸟槛猿: \"lóng niǎo jiàn yuán\",\n 笼鸟池鱼: \"lóng niǎo chí yú\",\n 龙游曲沼: \"lóng yóu qū zhǎo\",\n 龙血玄黄: \"lóng xuè xuán huáng\",\n 龙雕凤咀: \"lóng diāo fèng jǔ\",\n 六尺之讬: \"liù chǐ zhī tuō\",\n 令原之戚: \"líng yuán zhī qī\",\n 令人捧腹: \"lìng rén pěng fù\",\n 陵劲淬砺: \"líng jìng cuì lì\",\n 临敌易将: \"lín dí yì jiàng\",\n 裂裳衣疮: \"liè shang yī chuāng\",\n 裂冠毁冕: \"liè guàn huǐ miǎn\",\n 了无惧色: \"liǎo wú jù sè\",\n 了身达命: \"liǎo shēn dá mìng\",\n 了然无闻: \"liǎo rán wú wén\",\n 了不可见: \"liǎo bù kě jiàn\",\n 了不长进: \"liǎo bù zhǎng jìn\",\n 燎发摧枯: \"liǎo fà cuī kū\",\n 审时度势: \"shěn shí duó shì\",\n 量小力微: \"liàng xiǎo lì wēi\",\n 相时度力: \"xiāng shí duó lì\",\n 量枘制凿: \"liàng ruì zhì záo\",\n 量如江海: \"liàng rú jiāng hǎi\",\n 量金买赋: \"liàng jīn mǎi fù\",\n 量己审分: \"liàng jǐ shěn fēn\",\n 敛骨吹魂: \"liǎn gǔ chuī hún\",\n 詈夷为跖: \"lì yí wéi zhí\",\n 利令志惛: \"lì lìng zhì hūn\",\n 李广不侯: \"lǐ guǎng bú hòu\",\n 礼为情貌: \"lǐ wéi qíng mào\",\n 礼让为国: \"lǐ ràng wéi guó\",\n 犁生骍角: \"lí shēng xīng jiǎo\",\n 离本徼末: \"lí běn jiǎo mò\",\n 楞眉横眼: \"léng méi hèng yǎn\",\n 擂天倒地: \"léi tiān dǎo dì\",\n 累足成步: \"lěi zú chéng bù\",\n 累瓦结绳: \"lěi wǎ jié shéng\",\n 累土至山: \"lěi tǔ zhì shān\",\n 累土聚沙: \"lěi tǔ jù shā\",\n 累卵之危: \"lěi luǎn zhī wēi\",\n 累累如珠: \"lěi lěi rú zhū\",\n 累块积苏: \"lěi kuài jī sū\",\n 乐山乐水: \"lè shān lè shuǐ\",\n 潦原浸天: \"lǎo yuán jìn tiān\",\n 老师宿儒: \"lǎo shī xiǔ rú\",\n 牢什古子: \"láo shí gǔ zi\",\n 琅嬛福地: \"láng huán fú dì\",\n 揆情度理: \"kuí qíng duó lǐ\",\n 旷日累时: \"kuàng rì lěi shí\",\n 匡救弥缝: \"kuāng jiù mí fèng\",\n 枯树生华: \"kū shù shēng huā\",\n 口轻舌薄: \"kǒu qīng shé bó\",\n 口角生风: \"kǒu jiǎo shēng fēng\",\n 口角春风: \"kǒu jiǎo chūn fēng\",\n 口角风情: \"kǒu jiǎo fēng qíng\",\n 口干舌焦: \"kǒu gān shé jiāo\",\n 口腹之累: \"kǒu fù zhī lěi\",\n 空腹便便: \"kōng fù pián pián\",\n 嗑牙料嘴: \"kē yá liào zuǐ\",\n 刻木为鹄: \"kè mù wéi hú\",\n 咳珠唾玉: \"ké zhū tuò yù\",\n 咳唾成珠: \"ké tuò chéng zhū\",\n 抗颜为师: \"kàng yán wéi shī\",\n 开华结果: \"kāi huā jié guǒ\",\n 峻阪盐车: \"jùn bǎn yán chē\",\n 嚼铁咀金: \"jiáo tiě jǔ jīn\",\n 嚼墨喷纸: \"jué mò pēn zhǐ\",\n 倔头强脑: \"juè tóu jiàng nǎo\",\n 倔头倔脑: \"juè tóu juè nǎo\",\n 倦鸟知还: \"juàn niǎo zhī huán\",\n 卷席而葬: \"juǎn xí ér zàng\",\n 卷甲倍道: \"juǎn jiǎ bèi dào\",\n 聚米为山: \"jù mǐ wéi shān\",\n 举手相庆: \"jǔ shǒu xiāng qìng\",\n 举世混浊: \"jǔ shì hún zhuó\",\n 鞠为茂草: \"jū wéi mào cǎo\",\n 拘神遣将: \"jū shén qiǎn jiàng\",\n 居下讪上: \"jū xià shàn shàng\",\n 久要不忘: \"jiǔ yāo bú wàng\",\n 九转功成: \"jiǔ zhuǎn gōng chéng\",\n 九蒸三熯: \"jiǔ zhēng sān hàn\",\n 敬业乐群: \"jìng yè lè qún\",\n 井底虾蟆: \"jǐng dǐ xiā má\",\n 旌旗卷舒: \"jīng qí juǎn shū\",\n 荆棘载途: \"jīng jí zài tú\",\n 禁舍开塞: \"jìn shě kāi sāi\",\n 祲威盛容: \"jìn wēi shèng róng\",\n 进退消长: \"jìn tuì xiāo cháng\",\n 进退应矩: \"jìn tuì yīng jǔ\",\n 进退触籓: \"jìn tuì chù fān\",\n 进退跋疐: \"jìn tuì bá zhì\",\n 尽多尽少: \"jǐn duō jǐn shǎo\",\n 锦囊还矢: \"jǐn náng huán shǐ\",\n 矜己自饰: \"jīn jǐ zì shì\",\n 矜功负气: \"jīn gōng fù qì\",\n 津关险塞: \"jīn guān xiǎn sài\",\n 金吾不禁: \"jīn wú bú jìn\",\n 金翅擘海: \"jīn chì bāi hǎi\",\n 解衣衣人: \"jiě yī yī rén\",\n 解人难得: \"jiě rén nán dé\",\n 解铃系铃: \"jiě líng xì líng\",\n 解发佯狂: \"jiě fà yáng kuáng\",\n 诘屈磝碻: \"jié qū áo qiāo\",\n 教猱升木: \"jiāo náo shēng mù\",\n 较瘦量肥: \"jiào shòu liàng féi\",\n 角立杰出: \"jiǎo lì jié chū\",\n 焦沙烂石: \"jiāo shā làn shí\",\n 骄儿騃女: \"jiāo ér sì nǚ\",\n 浇风薄俗: \"jiāo fēng bó sú\",\n 降妖捉怪: \"xiáng yāo zhuō guài\",\n 将取固予: \"jiāng qǔ gù yǔ\",\n 将门有将: \"jiàng mén yǒu jiàng\",\n 将夺固与: \"jiāng duó gù yǔ\",\n 槛花笼鹤: \"jiàn huā lóng hè\",\n 鉴影度形: \"jiàn yǐng duó xíng\",\n 渐不可长: \"jiàn bù kě zhǎng\",\n 见素抱朴: \"xiàn sù bào pǔ\",\n 见弃于人: \"jiàn qì yú rén\",\n 简丝数米: \"jiǎn sī shǔ mǐ\",\n 俭不中礼: \"jiǎn bú zhòng lǐ\",\n 间见层出: \"jiàn xiàn céng chū\",\n 尖嘴薄舌: \"jiān zuǐ bó shé\",\n 甲冠天下: \"jiǎ guàn tiān xià\",\n 葭莩之亲: \"jiā fú zhī qīn\",\n 家累千金: \"jiā lèi qiān jīn\",\n 家给人足: \"jiā jǐ rén zú\",\n 家道从容: \"jiā dào cóng róng\",\n 夹袋人物: \"jiā dài rén wù\",\n 霁风朗月: \"jì fēng lǎng yuè\",\n 寄兴寓情: \"jì xìng yù qíng\",\n 计深虑远: \"jì shēn lǜ yuǎn\",\n 计功量罪: \"jì gōng liàng zuì\",\n 掎裳连襼: \"jǐ shang lián yì\",\n 虮虱相吊: \"jǐ shī xiāng diào\",\n 疾不可为: \"jí bù kě wéi\",\n 极深研几: \"jí shēn yán jī\",\n 及宾有鱼: \"jí bīn yǒu yú\",\n 激薄停浇: \"jī bó tíng jiāo\",\n 积素累旧: \"jī sù lěi jiù\",\n 积时累日: \"jī shí lěi rì\",\n 积露为波: \"jī lù wéi bō\",\n 积德累功: \"jī dé lěi gōng\",\n 积谗糜骨: \"jī chán méi gǔ\",\n 击排冒没: \"jī pái mào mò\",\n 祸为福先: \"huò wéi fú xiān\",\n 祸福相依: \"huò fú xiāng yī\",\n 获隽公车: \"huò jùn gōng chē\",\n 混应滥应: \"hùn yīng làn yīng\",\n 毁舟为杕: \"huǐ zhōu wéi duò\",\n 毁钟为铎: \"huǐ zhōng wéi duó\",\n 毁冠裂裳: \"huǐ guān liè cháng\",\n 晦盲否塞: \"huì máng pǐ sè\",\n 回船转舵: \"huí chuán zhuàn duò\",\n 潢池盗弄: \"huáng chí dào nòng\",\n 黄冠草履: \"huáng guàn cǎo lǚ\",\n 黄发儿齿: \"huáng fà ér chǐ\",\n 黄发垂髫: \"huáng fà chuí tiáo\",\n 还珠返璧: \"huán zhū fǎn bì\",\n 还年驻色: \"huán nián zhù sè\",\n 还年却老: \"huán nián què lǎo\",\n 坏裳为裤: \"huài shang wéi kù\",\n 画荻和丸: \"huà dí huò wán\",\n 化枭为鸠: \"huà xiāo wéi jiū\",\n 化腐为奇: \"huà fǔ wéi qí\",\n 化鸱为凤: \"huà chī wéi fèng\",\n 花不棱登: \"huā bu lēng dēng\",\n 户限为穿: \"hù xiàn wéi chuān\",\n 呼卢喝雉: \"hū lú hè zhì\",\n 呼来喝去: \"hū lái hè qù\",\n 呼不给吸: \"hū bù jǐ xī\",\n 厚味腊毒: \"hòu wèi xī dú\",\n 厚德载物: \"hòu dé zài wù\",\n 鸿渐于干: \"hóng jiàn yú gàn\",\n 洪炉燎发: \"hóng lú liáo fà\",\n 红绳系足: \"hóng shéng jì zú\",\n 红不棱登: \"hóng bu lēng dēng\",\n 横抢硬夺: \"hèng qiǎng yìng duó\",\n 横恩滥赏: \"hèng ēn làn shǎng\",\n 恨海难填: \"hèn hǎi nán tián\",\n 鹤发鸡皮: \"hè fà jī pí\",\n 涸思干虑: \"hé sī gān lǜ\",\n 河涸海干: \"hé hé hǎi gān\",\n 和颜说色: \"hé yán yuè sè\",\n 合从连衡: \"hé zòng lián héng\",\n 浩浩汤汤: \"hào hào shāng shāng\",\n 好勇斗狠: \"hào yǒng dòu hěn\",\n 好问则裕: \"hào wèn zé yù\",\n 好为事端: \"hào wéi shì duān\",\n 好问决疑: \"hào wèn jué yí\",\n 好生之德: \"hào shēng zhī dé\",\n 好奇尚异: \"hǎo qí shàng yì\",\n 好恶不同: \"hǎo è bù tóng\",\n 好丹非素: \"hào dān fēi sù\",\n 豪干暴取: \"háo gàn bào qǔ\",\n 毫发不爽: \"háo fà bù shuǎng\",\n 寒酸落魄: \"hán suān luò pò\",\n 含英咀华: \"hán yīng jǔ huá\",\n 含糊不明: \"hán hú bù míng\",\n 过为已甚: \"guò wéi yǐ shèn\",\n 桂折兰摧: \"guì shé lán cuī\",\n 规旋矩折: \"guī xuán jǔ shé\",\n 广文先生: \"guǎng wén xiān sheng\",\n 广陵散绝: \"guǎng líng sǎn jué\",\n 冠山戴粒: \"guàn shān dài lì\",\n 冠屦倒施: \"guàn jù dǎo shī\",\n 挂席为门: \"guà xí wéi mén\",\n 寡见鲜闻: \"guǎ jiàn xiǎn wén\",\n 瓜葛相连: \"guā gé xiāng lián\",\n 鼓吻奋爪: \"gǔ wěn fèn zhǎo\",\n 古调单弹: \"gǔ diào dān tán\",\n 古调不弹: \"gǔ diào bù tán\",\n 姑射神人: \"gū yè shén rén\",\n 苟合取容: \"gǒu hé qǔ róng\",\n 狗续侯冠: \"gǒu xù hòu guàn\",\n 钩爪锯牙: \"gōu zhǎo jù yá\",\n 共枝别干: \"gòng zhī bié gàn\",\n 共为唇齿: \"gòng wéi chún chǐ\",\n 拱手而降: \"gǒng shǒu ér xiáng\",\n 拱肩缩背: \"gǒng jiān suō bèi\",\n 功薄蝉翼: \"gōng bó chán yì\",\n 弓调马服: \"gōng diào mǎ fú\",\n 更姓改物: \"gēng xìng gǎi wù\",\n 更仆难数: \"gēng pú nán shǔ\",\n 更令明号: \"gēng lìng míng hào\",\n 更待干罢: \"gèng dài gàn bà\",\n 更唱迭和: \"gēng chàng dié hé\",\n 更长梦短: \"gēng cháng mèng duǎn\",\n 各色名样: \"gè sè míng yàng\",\n 格格不纳: \"gé gé bú nà\",\n 格格不吐: \"gé gé bù tǔ\",\n 告朔饩羊: \"gù shuò xì yáng\",\n 膏车秣马: \"gào chē mò mǎ\",\n 高义薄云: \"gāo yì bó yún\",\n 岗头泽底: \"gāng tóu zé dǐ\",\n 敢为敢做: \"gǎn wéi gǎn zuò\",\n 甘分随时: \"gān fèn suí shí\",\n 甘处下流: \"gān chǔ xià liú\",\n 干啼湿哭: \"gàn tí shī kū\",\n 干名犯义: \"gàn míng fàn yì\",\n 干将莫邪: \"gān jiāng mò yé\",\n 干城之将: \"gān chéng zhī jiàng\",\n 腹载五车: \"fù zài wǔ chē\",\n 父债子还: \"fù zhài zǐ huán\",\n 父为子隐: \"fù wéi zǐ yǐn\",\n 辅世长民: \"fǔ shì zhǎng mín\",\n 福为祸始: \"fú wéi huò shǐ\",\n 符号逻辑: \"fú hào luó jí\",\n 浮收勒折: \"fú shōu lè shé\",\n 肤受之愬: \"fū shòu zhī sù\",\n 否终则泰: \"pǐ zhōng zé tài\",\n 佛头著粪: \"fó tóu zhuó fèn\",\n 奉为楷模: \"fèng wéi kǎi mó\",\n 凤靡鸾吪: \"fèng mǐ luán é\",\n 封豨修蛇: \"fēng xī xiū shé\",\n 风影敷衍: \"fēng yǐng fū yǎn\",\n 丰屋蔀家: \"fēng wū bù jiā\",\n 粪土不如: \"fèn tǔ bù rú\",\n 分风劈流: \"fēn fēng pǐ liú\",\n 沸沸汤汤: \"fèi fèi shāng shāng\",\n 菲食薄衣: \"fěi shí bó yī\",\n 飞将数奇: \"fēi jiàng shù qí\",\n 放辟邪侈: \"fàng pì xié chǐ\",\n 方领圆冠: \"fāng lǐng yuán guàn\",\n 犯而不校: \"fàn ér bú jiào\",\n 返本还源: \"fǎn běn huán yuán\",\n 反劳为逸: \"fǎn láo wéi yì\",\n 法轮常转: \"fǎ lún cháng zhuàn\",\n 罚不当罪: \"fá bù dāng zuì\",\n 发引千钧: \"fà yǐn qiān jūn\",\n 发奸擿伏: \"fā jiān tī fú\",\n 发短心长: \"fà duǎn xīn cháng\",\n 二竖为虐: \"èr shù wéi nüè\",\n 儿女心肠: \"ér nǚ xīn cháng\",\n 儿女亲家: \"ér nǚ qìng jiā\",\n 遏恶扬善: \"è wù yáng shàn\",\n 饿殍枕藉: \"è piǎo zhěn jí\",\n 饿殍载道: \"è piǎo zài dào\",\n 恶醉强酒: \"wù zuì qiǎng jiǔ\",\n 恶意中伤: \"è yì zhòng shāng\",\n 恶湿居下: \"wù shī jū xià\",\n 恶居下流: \"wù jū xià liú\",\n 恶不去善: \"wù bú qù shàn\",\n 扼吭夺食: \"è háng duó shí\",\n 扼襟控咽: \"è jīn kòng yān\",\n 峨峨汤汤: \"é é shāng shāng\",\n 屙金溺银: \"ē jīn niào yín\",\n 朵颐大嚼: \"duǒ yí dà jiáo\",\n 夺人所好: \"duó rén suǒ hào\",\n 多言数穷: \"duō yán shuò qióng\",\n 多文为富: \"duō wén wéi fù\",\n 多端寡要: \"duō duān guǎ yào\",\n 多财善贾: \"duō cái shàn gǔ\",\n 遁世无闷: \"dùn shì wú mèn\",\n 遁迹黄冠: \"dùn jì huáng guàn\",\n 堆案盈几: \"duī àn yíng jī\",\n 断还归宗: \"duàn huán guī zōng\",\n 短见薄识: \"duǎn jiàn bó shí\",\n 蠹居棊处: \"dù jū qí chǔ\",\n 度己以绳: \"duó jǐ yǐ shéng\",\n 杜默为诗: \"dù mò wéi shī\",\n 杜鹃啼血: \"dù juān tí xuè\",\n 笃近举远: \"dǔ jìn jǔ yuǎn\",\n 独有千秋: \"dú yǒu qiān qiū\",\n 读书得间: \"dú shū dé jiàn\",\n 斗转参横: \"dǒu zhuǎn shēn héng\",\n 兜肚连肠: \"dōu dǔ lián cháng\",\n 洞见症结: \"dòng jiàn zhèng jié\",\n 恫疑虚喝: \"dòng yí xū hè\",\n 动中窾要: \"dòng zhōng kuǎn yào\",\n 东鸣西应: \"dōng míng xī yīng\",\n 东鳞西爪: \"dōng lín xī zhǎo\",\n 东量西折: \"dōng liàng xī shé\",\n 东家西舍: \"dōng jiā xī shè\",\n 东扯西拽: \"dōng chě xī zhuāi\",\n 鼎铛有耳: \"dǐng chēng yǒu ěr\",\n 鼎铛玉石: \"dǐng chēng yù shí\",\n 钉头磷磷: \"dīng tóu lín lín\",\n 跌宕不羁: \"diē dàng bù jī\",\n 跌弹斑鸠: \"diē dàn bān jiū\",\n 雕心雁爪: \"diāo xīn yàn zhǎo\",\n 颠倒衣裳: \"diān dǎo yī cháng\",\n 德薄能鲜: \"dé bó néng xiǎn\",\n 得马折足: \"dé mǎ shé zú\",\n 蹈其覆辙: \"dǎo qí fù zhé\",\n 捣虚撇抗: \"dǎo xū piē kàng\",\n 倒载干戈: \"dào zài gān gē\",\n 倒裳索领: \"dào cháng suǒ lǐng\",\n 倒果为因: \"dào guǒ wéi yīn\",\n 叨在知己: \"tāo zài zhī jǐ\",\n 叨陪末座: \"tāo péi mò zuò\",\n 党豺为虐: \"dǎng chái wéi nüè\",\n 当轴处中: \"dāng zhóu chǔ zhōng\",\n 当着不着: \"dāng zhuó bù zhuó\",\n 当务始终: \"dāng wù shǐ zhōng\",\n 淡汝浓抹: \"dàn rǔ nóng mǒ\",\n 弹丸脱手: \"tán wán tuō shǒu\",\n 弹铗无鱼: \"dàn jiá wú yú\",\n 箪食瓢饮: \"dān sì piáo yǐn\",\n 大璞不完: \"dà pú bù wán\",\n 大明法度: \"dà míng fǎ dù\",\n 大车以载: \"dà chē yǐ zài\",\n 打闷葫芦: \"dǎ mèn hú lu\",\n 沓来踵至: \"tà lái zhǒng zhì\",\n 厝火燎原: \"cuò huǒ liǎo yuán\",\n 撮科打哄: \"cuō kē dǎ hòng\",\n 寸积铢累: \"cùn jī zhū lěi\",\n 啛啛喳喳: \"cuì cuì chā chā\",\n 摧折豪强: \"cuī zhé háo qiáng\",\n 摧刚为柔: \"cuī gāng wéi róu\",\n 从俗就简: \"cóng sú jiù jiǎn\",\n 此发彼应: \"cǐ fā bǐ yīng\",\n 此唱彼和: \"cǐ chàng bǐ hè\",\n 慈悲为本: \"cí bēi wéi běn\",\n 纯属骗局: \"chún shǔ piàn jú\",\n 春笋怒发: \"chūn sǔn nù fā\",\n 垂头搨翼: \"chuí tóu tà yì\",\n 传为笑谈: \"chuán wéi xiào tán\",\n 传风扇火: \"chuán fēng shān huǒ\",\n 穿红着绿: \"chuān hóng zhuó lǜ\",\n 触处机来: \"chù chǔ jī lái\",\n 处尊居显: \"chǔ zūn jū xiǎn\",\n 处堂燕雀: \"chǔ táng yàn què\",\n 处实效功: \"chǔ shí xiào gōng\",\n 处高临深: \"chǔ gāo lín shēn\",\n 出入无间: \"chū rù wú jiān\",\n 出门应辙: \"chū mén yīng zhé\",\n 出处语默: \"chū chǔ yǔ mò\",\n 出处殊途: \"chū chǔ shū tú\",\n 出处进退: \"chū chǔ jìn tuì\",\n 愁山闷海: \"chóu shān mèn hǎi\",\n 冲冠眦裂: \"chōng guàn zì liè\",\n 齿牙为祸: \"chǐ yá wéi huò\",\n 尺二冤家: \"chǐ èr yuān jia\",\n 尺短寸长: \"chǐ duǎn cùn cháng\",\n 尺寸之功: \"chǐ cùn zhī gōng\",\n 城北徐公: \"chéng běi xú gōng\",\n 成败兴废: \"chéng bài xīng fèi\",\n 趁水和泥: \"chèn shuǐ huò ní\",\n 称雨道晴: \"chēng yǔ dào qíng\",\n 称体载衣: \"chēng tǐ zài yī\",\n 称体裁衣: \"chèn tǐ cái yī\",\n 称家有无: \"chèn jiā yǒu wú\",\n 称德度功: \"chēng dé duó gōng\",\n 沉吟章句: \"chén yín zhāng jù\",\n 沉吟不决: \"chén yín bù jué\",\n 沉疴宿疾: \"chén kē sù jí\",\n 扯纤拉烟: \"chě qiàn lā yān\",\n 扯顺风旗: \"chě shùn fēng qí\",\n 车载船装: \"chē zǎi chuán zhuāng\",\n 朝升暮合: \"zhāo shēng mù gě\",\n 朝攀暮折: \"zhāo pān mù shé\",\n 超今冠古: \"chāo jīn guàn gǔ\",\n 倡而不和: \"chàng ér bú hè\",\n 畅所欲为: \"chàng suǒ yù wéi\",\n 苌弘碧血: \"cháng hóng bì xiě\",\n 长幼尊卑: \"zhǎng yòu zūn bēi\",\n 长绳系日: \"cháng shéng jì rì\",\n 长年三老: \"zhǎng nián sān lǎo\",\n 长春不老: \"cháng chūn bù lǎo\",\n 长傲饰非: \"zhǎng ào shì fēi\",\n 昌亭旅食: \"chāng tíng lǚ shí\",\n 禅絮沾泥: \"chán xù zhān ní\",\n 差三错四: \"chā sān cuò sì\",\n 层台累榭: \"céng tái lěi xiè\",\n 层见迭出: \"céng xiàn dié chū\",\n 藏踪蹑迹: \"cáng zōng niè jì\",\n 苍蝇见血: \"cāng yíng jiàn xiě\",\n 餐松啖柏: \"cān sōng dàn bó\",\n 骖风驷霞: \"cān fēng sì xiá\",\n 参伍错综: \"cēn wǔ cuò zōng\",\n 参辰卯酉: \"shēn chén mǎo yǒu\",\n 材优干济: \"cái yōu gān jǐ\",\n 材薄质衰: \"cái bó zhì shuāi\",\n 才大难用: \"cái dà nán yòng\",\n 才薄智浅: \"cái bó zhì qiǎn\",\n 不足为意: \"bù zú wéi yì\",\n 不足为据: \"bù zú wéi jù\",\n 不足为法: \"bù zú wéi fǎ\",\n 不足齿数: \"bù zú chǐ shǔ\",\n 不着疼热: \"bù zhuó téng rè\",\n 不知薡蕫: \"bù zhī dǐng dǒng\",\n 不越雷池: \"bú yuè léi chí\",\n 不相为谋: \"bù xiāng wéi móu\",\n 不贪为宝: \"bù tān wéi bǎo\",\n 不了而了: \"bù liǎo ér liǎo\",\n 不可揆度: \"bù kě kuí duó\",\n 不遑启处: \"bù huáng qǐ chǔ\",\n 不当不正: \"bù dāng bú zhèng\",\n 不差什么: \"bú chà shén me\",\n 不差累黍: \"bù chā lěi shǔ\",\n 擘两分星: \"bò liǎng fēn xīng\",\n 簸土扬沙: \"bǒ tǔ yáng shā\",\n 薄物细故: \"bó wù xì gù\",\n 薄寒中人: \"bó hán zhòng rén\",\n 博文约礼: \"bó wén yuē lǐ\",\n 播糠眯目: \"bō kāng mí mù\",\n 剥皮抽筋: \"bō pí chōu jīn\",\n 剥肤椎髓: \"bō fū chuí suǐ\",\n 波属云委: \"bō zhǔ yún wěi\",\n 波骇云属: \"bō hài yún zhǔ\",\n 兵微将寡: \"bīng wēi jiàng guǎ\",\n 兵强将勇: \"bīng qiáng jiàng yǒng\",\n 兵多将广: \"bīng duō jiàng guǎng\",\n 兵不由将: \"bīng bù yóu jiàng\",\n 冰解的破: \"bīng jiě dì pò\",\n 彬彬济济: \"bīn bīn jǐ jǐ\",\n 摽梅之年: \"biào méi zhī nián\",\n 表里为奸: \"biǎo lǐ wéi jiān\",\n 飙发电举: \"biāo fā diàn jǔ\",\n 变贪厉薄: \"biàn tān lì bó\",\n 敝盖不弃: \"bì gài bú qì\",\n 秕言谬说: \"bǐ yán miù shuō\",\n 比物属事: \"bǐ wù zhǔ shì\",\n 被山带河: \"pī shān dài hé\",\n 被甲枕戈: \"pī jiǎ zhěn gē\",\n 被甲据鞍: \"pī jiǎ jù ān\",\n 被褐怀玉: \"pī hè huái yù\",\n 被发缨冠: \"pī fà yīng guàn\",\n 背曲腰躬: \"bèi qǔ yāo gōng\",\n 北窗高卧: \"běi chuāng gāo wò\",\n 北辰星拱: \"běi chén xīng gǒng\",\n 北鄙之音: \"běi bǐ zhī yīn\",\n 卑宫菲食: \"bēi gōng fěi shí\",\n 暴衣露冠: \"pù yī lù guàn\",\n 暴腮龙门: \"pù sāi lóng mén\",\n 暴露文学: \"bào lù wén xué\",\n 暴虎冯河: \"bào hǔ píng hé\",\n 抱蔓摘瓜: \"bào wàn zhāi guā\",\n 抱法处势: \"bào fǎ chǔ shì\",\n 褒贬与夺: \"bāo biǎn yǔ duó\",\n 帮闲钻懒: \"bāng xián zuān lǎn\",\n 拜将封侯: \"bài jiàng fēng hóu\",\n 百兽率舞: \"bǎi shòu shuài wǔ\",\n 百孔千创: \"bǎi kǒng qiān chuāng\",\n 白衣卿相: \"bái yī qīng xiàng\",\n 白首为郎: \"bái shǒu wéi láng\",\n 白首相知: \"bái shǒu xiāng zhī\",\n 把玩无厌: \"bǎ wán wú yàn\",\n 拔锅卷席: \"bá guō juǎn xí\",\n 拔本塞源: \"bá běn sè yuán\",\n 傲不可长: \"ào bù kě zhǎng\",\n 熬更守夜: \"áo gēng shǒu yè\",\n 安时处顺: \"ān shí chǔ shùn\",\n 安身为乐: \"ān shēn wéi lè\",\n 安老怀少: \"ān lǎo huái shào\",\n 安步当车: \"ān bù dàng chē\",\n 爱人好士: \"ài rén hào shì\",\n 矮人观场: \"ǎi rén guān chǎng\",\n 捱风缉缝: \"ái fēng jī fèng\",\n 挨山塞海: \"āi shān sè hǎi\",\n 阿家阿翁: \"ā jiā ā wēng\",\n 阿党相为: \"ē dǎng xiāng wéi\",\n 追亡逐北: \"zhuī wáng zhú běi\",\n 竹篮打水: \"zhú lán dá shuǐ\",\n 知疼着热: \"zhī téng zháo rè\",\n 语不惊人: \"yǔ bù jīng rén\",\n 于今为烈: \"yú jīn wéi liè\",\n 一日三省: \"yí rì sān xǐng\",\n 穴居野处: \"xué jū yě chǔ\",\n 五脊六兽: \"wǔ jǐ liù shòu\",\n 无声无臭: \"wú shēng wú xiù\",\n 谓予不信: \"wèi yú bú xìn\",\n 舍身为国: \"shě shēn wéi guó\",\n 杀妻求将: \"shā qī qiú jiàng\",\n 强作解人: \"qiǎng zuò jiě rén\",\n 气冲斗牛: \"qì chōng dǒu niú\",\n 临深履薄: \"lín shēn lǚ bó\",\n 钧天广乐: \"jūn tiān guǎng yuè\",\n 艰难竭蹶: \"jiān nán jié jué\",\n 夹七夹八: \"jiā qī jiā bā\",\n 混混噩噩: \"hún hún è è\",\n 厚古薄今: \"hòu gǔ bó jīn\",\n 鬼怕恶人: \"guǐ pà è rén\",\n 伽马射线: \"gā mǎ shè xiàn\",\n 佛头着粪: \"fó tóu zhuó fèn\",\n 奉为至宝: \"fèng wéi zhì bǎo\",\n 登坛拜将: \"dēng tán bài jiàng\",\n 晨昏定省: \"chén hūn dìng xǐng\",\n 察察为明: \"chá chá wéi míng\",\n 博闻强识: \"bó wén qiáng zhì\",\n 避难就易: \"bì nán jiù yì\",\n 了无生机: 'liǎo wú shēng jī',\n // 一字不变调的词语,如果词语仅有单个一且一字在结尾的无需添加(需要增补更多)\n 有一说一: 'yǒu yī shuō yī',\n 独一无二: 'dú yī wú èr',\n 说一不二: 'shuō yī bù èr',\n 举一反三: 'jǔ yī fǎn sān',\n 数一数二: 'shǔ yī shǔ èr',\n 杀一儆百: 'shā yī jǐng bǎi',\n 丁一卯二: 'dīng yī mǎo èr',\n 丁一确二: 'dīng yī què èr',\n 不一而止: 'bù yī ér zhǐ',\n 无一幸免: 'wú yī xìng miǎn',\n // 来源:https://m.gushici.com/cyxy_4e00_4\n 表里不一: 'biǎo lǐ bù yī',\n 良莠不一: 'liáng yǒu bù yī',\n 心口不一: 'xīn kǒu bù yī',\n 言行不一: 'yán xíng bù yī',\n 政令不一: 'zhèng lìng bù yī',\n 参差不一: 'cēn cī bù yī',\n 纷纷不一: 'fēn fēn bù yī',\n 毁誉不一: 'huǐ yù bù yī',\n 不一而三: 'bù yī ér sān',\n 百不一遇: 'bǎi bù yī yù',\n 言行抱一: 'yán xíng bào yī',\n 瑜百瑕一: 'yú bǎi xiá yī',\n 背城借一: 'bèi chéng jiè yī',\n 凭城借一: 'píng chéng jiè yī',\n 劝百讽一: 'quàn bǎi fěng yī',\n 群居和一: 'qún jū hé yī',\n 百不获一: 'bǎi bù huò yī',\n 百不失一: 'bǎi bù shī yī',\n 百无失一: 'bǎi wú shī yī',\n 万不失一: 'wàn bù shī yī',\n 万无失一: 'wàn wú shī yī',\n 合而为一: 'hé ér wéi yī',\n 合两为一: 'hé liǎng wéi yī',\n 合二为一: 'hé èr wéi yī',\n 天下为一: 'tiān xià wéi yī',\n 相与为一: 'xiāng yǔ wéi yī',\n 较若画一: 'jiào ruò huà yī',\n 较如画一: 'jiào rú huà yī',\n 斠若画一: 'jiào ruò huà yī',\n 言行若一: 'yán xíng ruò yī',\n 始终若一: 'shǐ zhōng ruò yī',\n 终始若一: 'zhōng shǐ ruò yī',\n 惟精惟一: 'wéi jīng wéi yī',\n 众多非一: 'zhòng duō fēi yī',\n 不能赞一: 'bù néng zàn yī',\n 问一答十: 'wèn yī dá shí',\n 一不扭众: 'yī bù niǔ zhòng',\n 一以贯之: 'yī yǐ guàn zhī',\n 一以当百: 'yī yǐ dāng bǎi',\n 百不当一: 'bǎi bù dāng yī',\n 十不当一: 'shí bù dāng yī',\n 以一警百: 'yǐ yī jǐng bǎi',\n 以一奉百: 'yǐ yī fèng bǎi',\n 以一持万: 'yǐ yī chí wàn',\n 以一知万: 'yǐ yī zhī wàn',\n 百里挑一: 'bǎi lǐ tiāo yī',\n 整齐划一: 'zhěng qí huà yī',\n 一来二去: 'yī lái èr qù',\n 一路公交: 'yī lù gōng jiāo',\n 一路汽车: 'yī lù qì chē',\n 一路巴士: 'yī lù bā shì',\n 朝朝朝落: 'zhāo cháo zhāo luò',\n 曲意逢迎: 'qū yì féng yíng',\n 一行不行: 'yì háng bù xíng',\n 行行不行: 'háng háng bù xíng'\n};\nconst Pattern4 = Object.keys(DICT4).map(key => ({\n zh: key,\n pinyin: DICT4[key],\n probability: 2e-8 /* Probability.DICT */,\n length: 4,\n priority: Priority.Normal,\n dict: Symbol('dict4')\n}));\nconst DICT5 = {\n 巴尔干半岛: 'bā ěr gàn bàn dǎo',\n 巴尔喀什湖: 'bā ěr kā shí hú',\n 不幸而言中: 'bú xìng ér yán zhòng',\n 布尔什维克: 'bù ěr shí wéi kè',\n 何乐而不为: 'hé lè ér bù wéi',\n 苛政猛于虎: 'kē zhèng měng yú hǔ',\n 蒙得维的亚: 'méng dé wéi dì yà',\n 民以食为天: 'mín yǐ shí wéi tiān',\n 事后诸葛亮: 'shì hòu zhū gě liàng',\n 物以稀为贵: 'wù yǐ xī wéi guì',\n 先下手为强: 'xiān xià shǒu wéi qiáng',\n 行行出状元: 'háng háng chū zhuàng yuan',\n 亚得里亚海: 'yà dé lǐ yà hǎi',\n 眼不见为净: 'yǎn bú jiàn wéi jìng',\n 竹筒倒豆子: 'zhú tǒng dào dòu zi'\n};\nconst Pattern5 = Object.keys(DICT5).map(key => ({\n zh: key,\n pinyin: DICT5[key],\n probability: 2e-8 /* Probability.DICT */,\n length: 5,\n priority: Priority.Normal,\n dict: Symbol('dict5')\n}));\n\n// 根据 probability 和 decimal 获取两个概率中最大的\nfunction getMaxProbability(a, b) {\n if (!a) {\n return b;\n }\n if (a.decimal < b.decimal) {\n return a;\n } else if (a.decimal === b.decimal) {\n return a.probability > b.probability ? a : b;\n } else {\n return b;\n }\n}\n// probability 小于 1e-300 时,为防止小数溢出需要进位\nfunction checkDecimal(prob) {\n if (prob.probability < 1e-300) {\n prob.probability *= 1e300;\n prob.decimal += 1;\n }\n}\nfunction getPatternDecimal(pattern) {\n if (pattern.priority === Priority.Custom) {\n return -(pattern.length * pattern.length * 100);\n }\n if (pattern.priority === Priority.Surname) {\n return -(pattern.length * pattern.length * 10);\n }\n return 0;\n}\n// 最大概率算法\nfunction maxProbability(patterns, length) {\n const dp = [];\n let patternIndex = patterns.length - 1;\n let pattern = patterns[patternIndex];\n // 按照长度去除重叠词\n for (let i = length - 1; i >= 0; i--) {\n // suffix\n const suffixDP = i + 1 >= length ? {\n probability: 1,\n decimal: 0,\n patterns: []\n } : dp[i + 1];\n while (pattern && pattern.index + pattern.length - 1 === i) {\n const startIndex = pattern.index;\n const curDP = {\n probability: pattern.probability * suffixDP.probability,\n decimal: suffixDP.decimal + getPatternDecimal(pattern),\n patterns: suffixDP.patterns,\n concatPattern: pattern\n };\n checkDecimal(curDP);\n dp[startIndex] = getMaxProbability(dp[startIndex], curDP);\n pattern = patterns[--patternIndex];\n }\n // dp[i]\n const iDP = {\n probability: 1e-13 /* Probability.Unknown */ * suffixDP.probability,\n decimal: 0,\n patterns: suffixDP.patterns\n };\n checkDecimal(iDP);\n dp[i] = getMaxProbability(dp[i], iDP);\n if (dp[i].concatPattern) {\n dp[i].patterns = dp[i].patterns.concat(dp[i].concatPattern);\n dp[i].concatPattern = undefined;\n delete dp[i + 1];\n }\n }\n return dp[0].patterns.reverse();\n}\n\n// 取最少分词数\nfunction getMinCount(a, b) {\n if (!a) {\n return b;\n }\n return a.count <= b.count ? a : b;\n}\nfunction getPatternCount(pattern) {\n if (pattern.priority === Priority.Custom) {\n return -(pattern.length * pattern.length * 100000);\n }\n if (pattern.priority === Priority.Surname) {\n return -(pattern.length * pattern.length * 100);\n }\n return 1;\n}\n// 最少分词算法\nfunction minTokenization(patterns, length) {\n const dp = [];\n let patternIndex = patterns.length - 1;\n let pattern = patterns[patternIndex];\n // 按照长度去除重叠词\n for (let i = length - 1; i >= 0; i--) {\n // suffix\n const suffixDP = i + 1 >= length ? {\n count: 0,\n patterns: []\n } : dp[i + 1];\n while (pattern && pattern.index + pattern.length - 1 === i) {\n const startIndex = pattern.index;\n const curDP = {\n count: getPatternCount(pattern) + suffixDP.count,\n patterns: suffixDP.patterns,\n concatPattern: pattern\n };\n dp[startIndex] = getMinCount(dp[startIndex], curDP);\n pattern = patterns[--patternIndex];\n }\n // dp[i]\n const iDP = {\n count: 1 + suffixDP.count,\n patterns: suffixDP.patterns\n };\n dp[i] = getMinCount(dp[i], iDP);\n if (dp[i].concatPattern) {\n dp[i].patterns = dp[i].patterns.concat(dp[i].concatPattern);\n dp[i].concatPattern = undefined;\n delete dp[i + 1];\n }\n }\n return dp[0].patterns.reverse();\n}\n\n// 判断 pre 是否可以被忽略的重叠词\nfunction isIgnorablePattern(cur, pre) {\n // 未重叠\n if (pre.index + pre.length <= cur.index) {\n return false;\n }\n if (pre.priority > cur.priority) {\n return false;\n }\n if (pre.priority === cur.priority && pre.length > cur.length) {\n return false;\n }\n return true;\n}\n// 逆向最大匹配算法\nfunction reverseMaxMatch(patterns) {\n const filteredArr = [];\n // 按照长度去除重叠词\n for (let i = patterns.length - 1; i >= 0;) {\n const {\n index\n } = patterns[i];\n let j = i - 1;\n while (j >= 0 && isIgnorablePattern(patterns[i], patterns[j])) {\n j--;\n }\n if (j < 0 || patterns[j].index + patterns[j].length <= index) {\n filteredArr.push(patterns[i]);\n }\n i = j;\n }\n return filteredArr.reverse();\n}\nvar TokenizationAlgorithm;\n(function (TokenizationAlgorithm) {\n TokenizationAlgorithm[TokenizationAlgorithm[\"ReverseMaxMatch\"] = 1] = \"ReverseMaxMatch\";\n TokenizationAlgorithm[TokenizationAlgorithm[\"MaxProbability\"] = 2] = \"MaxProbability\";\n TokenizationAlgorithm[TokenizationAlgorithm[\"MinTokenization\"] = 3] = \"MinTokenization\";\n})(TokenizationAlgorithm || (TokenizationAlgorithm = {}));\nclass TrieNode {\n constructor(parent, prefix = \"\", key = \"\") {\n this.children = new Map();\n this.fail = null;\n this.patterns = [];\n this.parent = parent;\n this.prefix = prefix;\n this.key = key;\n }\n}\nclass AC {\n constructor() {\n this.dictMap = new Map();\n this.queues = [];\n this.root = new TrieNode(null);\n }\n build(patternList) {\n this.buildTrie(patternList);\n this.buildFailPointer();\n }\n // 构建 trie 树\n buildTrie(patternList) {\n for (let pattern of patternList) {\n const zhChars = splitString(pattern.zh);\n let cur = this.root;\n for (let i = 0; i < zhChars.length; i++) {\n let c = zhChars[i];\n if (!cur.children.has(c)) {\n const trieNode = new TrieNode(cur, zhChars.slice(0, i).join(''), c);\n cur.children.set(c, trieNode);\n this.addNodeToQueues(trieNode);\n }\n cur = cur.children.get(c);\n }\n this.insertPattern(cur.patterns, pattern);\n pattern.node = cur;\n this.addPatternToDictMap(pattern);\n }\n }\n // 构建失败指针\n buildFailPointer() {\n let queue = [];\n let queueIndex = 0;\n this.queues.forEach(_queue => {\n queue = queue.concat(_queue);\n });\n this.queues = [];\n while (queue.length > queueIndex) {\n let node = queue[queueIndex++];\n let failNode = node.parent && node.parent.fail;\n let key = node.key;\n while (failNode && !failNode.children.has(key)) {\n failNode = failNode.fail;\n }\n if (!failNode) {\n node.fail = this.root;\n } else {\n node.fail = failNode.children.get(key);\n }\n }\n }\n // 将 pattern 添加到 dictMap 中\n addPatternToDictMap(pattern) {\n if (!this.dictMap.has(pattern.dict)) {\n this.dictMap.set(pattern.dict, new Set());\n }\n this.dictMap.get(pattern.dict).add(pattern);\n }\n addNodeToQueues(trieNode) {\n if (!this.queues[stringLength(trieNode.prefix)]) {\n this.queues[stringLength(trieNode.prefix)] = [];\n }\n this.queues[stringLength(trieNode.prefix)].push(trieNode);\n }\n // 按照优先级插入 pattern\n insertPattern(patterns, pattern) {\n for (let i = patterns.length - 1; i >= 0; i--) {\n const _pattern = patterns[i];\n if (pattern.priority === _pattern.priority && pattern.probability >= _pattern.probability) {\n patterns[i + 1] = _pattern;\n } else if (pattern.priority > _pattern.priority) {\n patterns[i + 1] = _pattern;\n } else {\n patterns[i + 1] = pattern;\n return;\n }\n }\n patterns[0] = pattern;\n }\n removeDict(dictName) {\n if (this.dictMap.has(dictName)) {\n const set = this.dictMap.get(dictName);\n set.forEach(pattern => {\n pattern.node.patterns = pattern.node.patterns.filter(_pattern => _pattern !== pattern);\n });\n this.dictMap.delete(dictName);\n }\n }\n // 搜索字符串返回匹配的模式串\n match(text, surname) {\n let cur = this.root;\n let result = [];\n const zhChars = splitString(text);\n for (let i = 0; i < zhChars.length; i++) {\n let c = zhChars[i];\n while (cur !== null && !cur.children.has(c)) {\n cur = cur.fail;\n }\n if (cur === null) {\n cur = this.root;\n } else {\n cur = cur.children.get(c);\n const pattern = cur.patterns.find(item => {\n if (surname === \"off\") {\n return item.priority !== Priority.Surname;\n } else if (surname === \"head\") {\n return item.length - 1 - i === 0;\n } else {\n return true;\n }\n });\n if (pattern) {\n result.push(Object.assign(Object.assign({}, pattern), {\n index: i - pattern.length + 1\n }));\n }\n let failNode = cur.fail;\n while (failNode !== null) {\n const pattern = failNode.patterns.find(item => {\n if (surname === \"off\") {\n return item.priority !== Priority.Surname;\n } else if (surname === \"head\") {\n return item.length - 1 - i === 0;\n } else {\n return true;\n }\n });\n if (pattern) {\n result.push(Object.assign(Object.assign({}, pattern), {\n index: i - pattern.length + 1\n }));\n }\n failNode = failNode.fail;\n }\n }\n }\n return result;\n }\n search(text, surname, algorithm = 2 /* TokenizationAlgorithm.MaxProbability */) {\n const patterns = this.match(text, surname);\n if (algorithm === 1 /* TokenizationAlgorithm.ReverseMaxMatch */) {\n return reverseMaxMatch(patterns);\n } else if (algorithm === 3 /* TokenizationAlgorithm.MinTokenization */) {\n return minTokenization(patterns, stringLength(text));\n }\n return maxProbability(patterns, stringLength(text));\n }\n}\n// 常规匹配\nconst PatternsNormal = [...Pattern5, ...Pattern4, ...Pattern3, ...Pattern2, ...PatternNumberDict, ...PatternSurname];\nconst acTree = new AC();\nacTree.build(PatternsNormal);\nlet customDict = {};\nconst customMultipleDict = new FastDictFactory();\nconst customPolyphonicDict = new FastDictFactory();\nconst CustomDictName = Symbol('custom');\n/**\r\n * @description: 用户自定义拼音\r\n * @param {{ [key: string]: string }} config 用户自定义的拼音映射(支持汉字、词语、句子的映射),若匹配到该映射,优先将汉字转换为该映射\r\n * @param {CustomPinyinOptions} options multiple/polyphonic 对于 customPinyin 补充词汇的处理\r\n */\nfunction customPinyin(config = {}, options) {\n const words = Object.keys(config).sort((word1, word2) => stringLength(word2) - stringLength(word1));\n words.forEach(word => {\n customDict[word] = config[word];\n });\n const customPatterns = Object.keys(customDict).map(word => ({\n zh: word,\n pinyin: customDict[word],\n probability: 1 /* Probability.Custom */ + stringLength(word),\n length: stringLength(word),\n priority: Priority.Custom,\n dict: CustomDictName\n }));\n acTree.build(customPatterns);\n // add words for multiple and polyphonic\n if (options === null || options === void 0 ? void 0 : options.multiple) {\n addCustomConfigToDict(config, customMultipleDict, options.multiple);\n }\n if (options === null || options === void 0 ? void 0 : options.polyphonic) {\n addCustomConfigToDict(config, customPolyphonicDict, options.polyphonic);\n }\n}\nfunction addCustomConfigToDict(config, dict, handleType) {\n for (let word in config) {\n const pinyins = config[word];\n splitString(word).forEach((char, index) => {\n const pinyin = pinyins.split(' ')[index] || '';\n if (handleType === 'replace' || handleType === 'add' && !dict.get(char) && !DICT1.get(char)) {\n // 直接覆盖原词典\n dict.set(char, pinyin);\n } else {\n // 补充至原词典\n dict.set(char, dict.get(char) || DICT1.get(char));\n if (!dict.get(char).split(' ').includes(pinyin)) {\n dict.set(char, `${dict.get(char)} ${pinyin}`.trim());\n }\n }\n });\n }\n}\nconst getCustomMultpileDict = () => {\n return customMultipleDict;\n};\nconst getCustomPolyphonicDict = () => {\n return customPolyphonicDict;\n};\nfunction clearCustomDict(dict) {\n if (dict === 'pinyin' || dict.indexOf('pinyin') !== -1) {\n Object.keys(customDict).forEach(function (word) {\n delete customDict[word];\n });\n acTree.removeDict(CustomDictName);\n }\n if (dict === 'multiple' || dict.indexOf('multiple') !== -1) {\n customMultipleDict.clear();\n }\n if (dict === 'polyphonic' || dict.indexOf('polyphonic') !== -1) {\n customPolyphonicDict.clear();\n }\n}\nconst getSingleWordPinyin = char => {\n const pinyin = DICT1.get(char);\n // 若查到, 则返回第一个拼音; 若未查到, 返回原字符\n return pinyin ? pinyin.split(\" \")[0] : char;\n};\nconst getPinyin = (word, list, surname, segmentit) => {\n const matches = acTree.search(word, surname, segmentit);\n let matchIndex = 0;\n const zhChars = splitString(word);\n for (let i = 0; i < zhChars.length;) {\n const match = matches[matchIndex];\n if (match && i === match.index) {\n if (match.length === 1 && match.priority <= Priority.Normal) {\n const char = zhChars[i];\n let pinyin = \"\";\n pinyin = processSepecialPinyin(char, zhChars[i - 1], zhChars[i + 1]);\n list[i] = {\n origin: char,\n result: pinyin,\n isZh: pinyin !== char,\n originPinyin: pinyin\n };\n i++;\n matchIndex++;\n continue;\n }\n const pinyins = match.pinyin.split(\" \");\n let pinyinIndex = 0;\n for (let j = 0; j < match.length; j++) {\n const zhChars = splitString(match.zh);\n list[i + j] = {\n origin: zhChars[j],\n result: pinyins[pinyinIndex],\n isZh: true,\n originPinyin: pinyins[pinyinIndex]\n };\n pinyinIndex++;\n }\n i += match.length;\n matchIndex++;\n } else {\n const char = zhChars[i];\n let pinyin = \"\";\n pinyin = processSepecialPinyin(char, zhChars[i - 1], zhChars[i + 1]);\n list[i] = {\n origin: char,\n result: pinyin,\n isZh: pinyin !== char,\n originPinyin: pinyin\n };\n i++;\n }\n }\n return {\n list,\n matches\n };\n};\nconst getPinyinWithoutTone = pinyin => {\n return pinyin.replace(/(ā|á|ǎ|à)/g, \"a\").replace(/(ō|ó|ǒ|ò)/g, \"o\").replace(/(ē|é|ě|è)/g, \"e\").replace(/(ī|í|ǐ|ì)/g, \"i\").replace(/(ū|ú|ǔ|ù)/g, \"u\").replace(/(ǖ|ǘ|ǚ|ǜ)/g, \"ü\").replace(/(n̄|ń|ň|ǹ)/g, \"n\").replace(/(m̄|ḿ|m̌|m̀)/g, \"m\").replace(/(ê̄|ế|ê̌|ề)/g, \"ê\");\n};\nconst getAllPinyin = (char, surname = \"off\") => {\n const customMultpileDict = getCustomMultpileDict();\n let pinyin = DICT1.get(char) ? DICT1.get(char).split(\" \") : [];\n if (customMultpileDict.get(char)) {\n pinyin = customMultpileDict.get(char).split(\" \");\n } else if (surname !== \"off\") {\n const surnamePinyin = Surnames[char];\n if (surnamePinyin) {\n pinyin = [surnamePinyin].concat(pinyin.filter(py => py !== surnamePinyin));\n }\n }\n return pinyin;\n};\nconst getMultiplePinyin = (word, surname = \"off\") => {\n let pinyin = getAllPinyin(word, surname);\n if (pinyin.length > 0) {\n return pinyin.map(value => ({\n origin: word,\n result: value,\n isZh: true,\n originPinyin: value\n }));\n } else {\n return [{\n origin: word,\n result: word,\n isZh: false,\n originPinyin: word\n }];\n }\n};\nconst getInitialAndFinal = pinyin => {\n const pinyin_arr = pinyin.split(\" \");\n const initial_arr = [];\n const final_arr = [];\n for (let _pinyin of pinyin_arr) {\n for (let _initial of InitialList) {\n if (_pinyin.startsWith(_initial)) {\n let _final = _pinyin.slice(_initial.length);\n if (SpecialInitialList.indexOf(_initial) !== -1 && SpecialFinalList.indexOf(_final) !== -1) {\n // 针对 jqx 的 u 特殊处理\n _final = SpecialFinalMap[_final];\n }\n initial_arr.push(_initial);\n final_arr.push(_final);\n break;\n }\n }\n }\n return {\n final: final_arr.join(\" \"),\n initial: initial_arr.join(\" \") // 声母\n };\n};\nconst getFinalParts = pinyin => {\n const {\n final\n } = getInitialAndFinal(pinyin);\n let head = \"\",\n body = \"\",\n tail = \"\";\n if (doubleFinalList.indexOf(getPinyinWithoutTone(final)) !== -1) {\n head = final[0];\n body = final[1];\n tail = final.slice(2);\n } else {\n body = final[0] || \"\";\n tail = final.slice(1) || \"\";\n }\n return {\n head,\n body,\n tail\n };\n};\nconst getNumOfTone = pinyin => {\n const reg_tone1 = /(ā|ō|ē|ī|ū|ǖ|n̄|m̄|ê̄)/;\n const reg_tone2 = /(á|ó|é|í|ú|ǘ|ń|ḿ|ế)/;\n const reg_tone3 = /(ǎ|ǒ|ě|ǐ|ǔ|ǚ|ň|m̌|ê̌)/;\n const reg_tone4 = /(à|ò|è|ì|ù|ǜ|ǹ|m̀|ề)/;\n const reg_tone0 = /(a|o|e|i|u|ü|ê)/;\n const special_tone = /(n|m)$/;\n const tone_num_arr = [];\n const pinyin_arr = pinyin.split(\" \");\n pinyin_arr.forEach(_pinyin => {\n if (reg_tone1.test(_pinyin)) {\n tone_num_arr.push(\"1\");\n } else if (reg_tone2.test(_pinyin)) {\n tone_num_arr.push(\"2\");\n } else if (reg_tone3.test(_pinyin)) {\n tone_num_arr.push(\"3\");\n } else if (reg_tone4.test(_pinyin)) {\n tone_num_arr.push(\"4\");\n } else if (reg_tone0.test(_pinyin)) {\n tone_num_arr.push(\"0\");\n } else if (special_tone.test(_pinyin)) {\n tone_num_arr.push(\"0\");\n } else {\n tone_num_arr.push(\"\");\n }\n });\n return tone_num_arr.join(\" \");\n};\nconst getPinyinWithNum = (pinyin, originPinyin) => {\n const pinyin_arr = getPinyinWithoutTone(pinyin).split(\" \");\n const tone_num_arr = getNumOfTone(originPinyin).split(\" \");\n const res_arr = [];\n pinyin_arr.forEach((item, index) => {\n res_arr.push(`${item}${tone_num_arr[index]}`);\n });\n return res_arr.join(\" \");\n};\nconst getFirstLetter = (pinyin, isZh) => {\n const first_letter_arr = [];\n const pinyin_arr = pinyin.split(\" \");\n pinyin_arr.forEach(pinyin => {\n first_letter_arr.push(isZh ? pinyin[0] : pinyin);\n });\n return first_letter_arr.join(\" \");\n};\n\n// 验证输入是否为字符串\nconst validateType = word => {\n if (typeof word !== \"string\") {\n console.error(\"The first param of pinyin is error: \" + word + ' is not assignable to type \"string\".');\n return false;\n } else {\n return true;\n }\n};\nfunction isNonZhScope(char, scope) {\n if (scope instanceof RegExp) {\n return scope.test(char);\n }\n return true;\n}\n// nonZh 属性处理\nconst middleWareNonZh = (list, options) => {\n let nonZh = options.nonZh;\n if (nonZh === \"removed\") {\n return list.filter(item => item.isZh || !isNonZhScope(item.origin, options.nonZhScope));\n } else if (nonZh === \"consecutive\") {\n for (let i = list.length - 2; i >= 0; i--) {\n const cur = list[i];\n const pre = list[i + 1];\n if (!cur.isZh && !pre.isZh && isNonZhScope(cur.origin, options.nonZhScope) && isNonZhScope(pre.origin, options.nonZhScope)) {\n cur.origin += pre.origin;\n cur.result += pre.result;\n pre.delete = true;\n }\n }\n return list.filter(item => !item.delete);\n } else {\n return list;\n }\n};\n// multiple 属性处理\nconst middlewareMultiple = (word, options) => {\n if (stringLength(word) === 1 && options.multiple) {\n return getMultiplePinyin(word, options.surname);\n } else {\n return false;\n }\n};\n// pattern 属性处理\nconst middlewarePattern = (list, options) => {\n switch (options.pattern) {\n case \"pinyin\":\n break;\n case \"num\":\n list.forEach(item => {\n item.result = item.isZh ? getNumOfTone(item.result) : \"\";\n });\n break;\n case \"initial\":\n list.forEach(item => {\n item.result = item.isZh ? getInitialAndFinal(item.result).initial : \"\";\n });\n break;\n case \"final\":\n list.forEach(item => {\n item.result = item.isZh ? getInitialAndFinal(item.result).final : \"\";\n });\n break;\n case \"first\":\n list.forEach(item => {\n item.result = getFirstLetter(item.result, item.isZh);\n });\n break;\n case \"finalHead\":\n list.forEach(item => {\n item.result = item.isZh ? getFinalParts(item.result).head : \"\";\n });\n break;\n case \"finalBody\":\n list.forEach(item => {\n item.result = item.isZh ? getFinalParts(item.result).body : \"\";\n });\n break;\n case \"finalTail\":\n list.forEach(item => {\n item.result = item.isZh ? getFinalParts(item.result).tail : \"\";\n });\n break;\n }\n};\n// toneType 属性处理\nconst middlewareToneType = (list, options) => {\n switch (options.toneType) {\n case \"symbol\":\n break;\n case \"none\":\n list.forEach(item => {\n if (item.isZh) {\n item.result = getPinyinWithoutTone(item.result);\n }\n });\n break;\n case \"num\":\n {\n list.forEach(item => {\n if (item.isZh) {\n item.result = getPinyinWithNum(item.result, item.originPinyin);\n }\n });\n break;\n }\n }\n};\n// v 属性处理\nconst middlewareV = (list, options) => {\n if (options.v) {\n list.forEach(item => {\n if (item.isZh) {\n item.result = item.result.replace(/ü/g, \"v\");\n }\n });\n }\n};\n// type 属性处理\nconst middlewareType = (list, options, word) => {\n if (options.multiple && stringLength(word) === 1) {\n let last = \"\";\n list = list.filter(item => {\n const res = item.result !== last;\n last = item.result;\n return res;\n });\n }\n if (options.type === \"array\") {\n return list.map(item => item.result);\n }\n if (options.type === \"all\") {\n return list.map(item => {\n const pinyin = item.isZh ? item.result : \"\";\n const {\n initial,\n final\n } = getInitialAndFinal(pinyin);\n const {\n head,\n body,\n tail\n } = getFinalParts(pinyin);\n let polyphonic = [];\n if (pinyin !== \"\") {\n polyphonic = [pinyin].concat(getAllPinyin(item.origin, options.surname).filter(item => item !== pinyin));\n }\n return {\n origin: item.origin,\n pinyin,\n initial,\n final,\n first: getFirstLetter(item.result, item.isZh),\n finalHead: head,\n finalBody: body,\n finalTail: tail,\n num: Number(getNumOfTone(item.originPinyin)),\n isZh: item.isZh,\n polyphonic,\n inZhRange: !!DICT1.get(item.origin),\n result: item.result\n };\n });\n }\n return list.map(item => item.result).join(options.separator);\n};\n// 是否开启变调\nconst middlewareToneSandhi = (list, toneSandhi) => {\n if (toneSandhi === false) {\n list.forEach(item => {\n if (item.origin === \"一\") {\n item.result = item.originPinyin = \"yī\";\n } else if (item.origin === \"不\") {\n item.result = item.originPinyin = \"bù\";\n }\n });\n }\n return list;\n};\nconst DEFAULT_OPTIONS$2 = {\n pattern: \"pinyin\",\n toneType: \"symbol\",\n type: \"string\",\n multiple: false,\n mode: \"normal\",\n removeNonZh: false,\n nonZh: \"spaced\",\n v: false,\n separator: \" \",\n toneSandhi: true,\n segmentit: 2 /* TokenizationAlgorithm.MaxProbability */\n};\n/**\r\n * @description: 获取汉语字符串的拼音\r\n * @param {string} word 要转换的汉语字符串\r\n * @param {CompleteOptions=} options 配置项\r\n * @return {string | string[] | AllData[]} options.type 为 string 时,返回字符串,中间用空格隔开;为 array 时,返回拼音字符串数组;为 all 时返回全部信息的数组\r\n */\nfunction pinyin(word, options) {\n options = Object.assign(Object.assign({}, DEFAULT_OPTIONS$2), options || {});\n // 校验 word 类型是否正确\n const legal = validateType(word);\n if (!legal) {\n return word;\n }\n // 传入空字符串\n if (word === \"\") {\n return options.type === \"array\" || options.type === \"all\" ? [] : \"\";\n }\n if (options.surname === undefined) {\n if (options.mode === \"surname\") {\n options.surname = \"all\";\n } else {\n options.surname = \"off\";\n }\n }\n if (options.type === \"all\") {\n options.pattern = \"pinyin\";\n }\n if (options.pattern === \"num\") {\n options.toneType = \"none\";\n }\n if (options.removeNonZh) {\n options.nonZh = \"removed\";\n }\n let _list = Array(stringLength(word));\n let {\n list\n } = getPinyin(word, _list, options.surname, options.segmentit);\n // 一和不变调处理\n list = middlewareToneSandhi(list, options.toneSandhi);\n // nonZh 参数及 removeNonZh 参数\n list = middleWareNonZh(list, options);\n // multiple 参数\n if (middlewareMultiple(word, options)) {\n list = middlewareMultiple(word, options);\n }\n // pattern 参数\n middlewarePattern(list, options);\n // toneType参数处理\n middlewareToneType(list, options);\n // v参数处理\n middlewareV(list, options);\n // type 参数处理\n return middlewareType(list, options, word);\n}\nconst DefaultName = Symbol(\"default\");\nconst originDictMap = new Map();\nfunction addDict(dict, options) {\n const patterns = [];\n // string 类型时:options 为 name()\n const name = typeof options === \"object\" ? options.name : options;\n const dictName = name || DefaultName;\n const dict1Handle = (options === null || options === void 0 ? void 0 : options.dict1) || \"add\";\n for (let word in dict) {\n const value = dict[word];\n const pinyin = Array.isArray(value) ? value[0] : value;\n const wordLength = stringLength(word);\n if (wordLength === 1) {\n addToOriginDict(dictName, word, pinyin, dict1Handle);\n }\n if (Array.isArray(value)) {\n patterns.push({\n zh: word,\n pinyin,\n probability: typeof value[1] === \"number\" ? value[1] : 2e-8 /* Probability.DICT */ * wordLength * wordLength,\n length: wordLength,\n priority: Priority.Normal,\n dict: dictName,\n pos: typeof value[2] === \"string\" ? value[2] : \"\"\n });\n } else {\n patterns.push({\n zh: word,\n pinyin,\n probability: 2e-8 /* Probability.DICT */ * wordLength * wordLength,\n length: wordLength,\n priority: Priority.Normal,\n dict: dictName\n });\n }\n }\n acTree.build(patterns);\n}\nfunction removeDict(dictName) {\n acTree.removeDict(dictName || DefaultName);\n removeOriginDict(dictName || DefaultName);\n}\nfunction addToOriginDict(dict, char, pinyin, handle = \"add\") {\n if (!originDictMap.get(dict)) {\n originDictMap.set(dict, {});\n }\n const originDict = originDictMap.get(dict);\n if (!originDict[char]) {\n originDict[char] = DICT1.get(char);\n }\n if (handle === \"add\") {\n const existedPinyin = DICT1.get(char);\n if (existedPinyin && !existedPinyin.split(' ').includes(pinyin)) {\n DICT1.set(char, `${existedPinyin} ${pinyin}`);\n } else if (!DICT1.get(char)) {\n DICT1.set(char, pinyin);\n }\n } else if (handle === \"replace\") {\n DICT1.set(char, pinyin);\n }\n}\nfunction removeOriginDict(dict) {\n const originDict = originDictMap.get(dict) || {};\n for (let char in originDict) {\n DICT1.set(char, originDict[char]);\n delete originDict[char];\n }\n}\nconst DefaultMatchOptions = {\n precision: \"first\",\n continuous: false,\n space: \"ignore\",\n lastPrecision: \"start\",\n insensitive: true,\n v: false\n};\nconst MAX_PINYIN_LENGTH = 6;\n/**\r\n * @description: 检测汉语字符串和拼音是否匹配\r\n * @param {string} text 汉语字符串\r\n * @param {string} pinyin 拼音,支持各种缩写形式\r\n * @param {MatchOptions=} options 配置项\r\n * @return {Array | null} 若匹配成功,返回 text 中匹配成功的下标数组;若匹配失败,返回 null\r\n */\nconst match = (text, pinyin, options) => {\n if ((options === null || options === void 0 ? void 0 : options.precision) === \"any\") {\n options.lastPrecision = \"any\";\n }\n if (options === null || options === void 0 ? void 0 : options.v) {\n pinyin = pinyin.replace(/ü/g, \"v\");\n }\n const completeOptions = Object.assign(Object.assign({}, DefaultMatchOptions), options || {});\n // 是否大小写不敏感\n if (completeOptions.insensitive !== false) {\n text = text.toLowerCase();\n pinyin = pinyin.toLowerCase();\n }\n // 移除空格\n if (completeOptions.space === \"ignore\") {\n pinyin = pinyin.replace(/\\s/g, \"\");\n }\n const result = (options === null || options === void 0 ? void 0 : options.precision) === \"any\" ? matchAny(text, pinyin, completeOptions) : matchAboveStart(text, pinyin, completeOptions);\n return processDoubleUnicodeIndex(text, result);\n};\n// 检测两个拼音最大的匹配长度\nconst getMatchLength = (pinyin1, pinyin2) => {\n let length = 0;\n for (let i = 0; i < pinyin1.length; i++) {\n if (pinyin1[i] === pinyin2[length]) {\n length++;\n }\n }\n return length;\n};\nconst matchAny = (text, pinyin$1, options) => {\n let result = [];\n const words = splitString(text);\n const ignoreSpace = options.space === \"ignore\";\n for (let i = 0; i < words.length; i++) {\n // 空格字符\n if (ignoreSpace && words[i] === \" \") {\n result.push(i);\n continue;\n }\n // 是否为中文匹配\n if (words[i] === pinyin$1[0]) {\n pinyin$1 = pinyin$1.slice(1);\n result.push(i);\n continue;\n }\n // 当前字的多音字拼音\n const ps = pinyin(words[i], {\n toneType: \"none\",\n multiple: true,\n type: \"array\",\n v: options.v\n });\n let currentLength = 0;\n ps.forEach(p => {\n const length = getMatchLength(p, pinyin$1);\n if (length > currentLength) {\n currentLength = length;\n }\n });\n if (currentLength) {\n pinyin$1 = pinyin$1.slice(currentLength);\n result.push(i);\n }\n if (!pinyin$1) {\n break;\n }\n }\n // 未匹配完\n if (pinyin$1) {\n return null;\n }\n // 是否连续\n if (options.continuous) {\n const _result = result;\n const isNotContinuous = result.some((val, index) => index > 0 && val !== _result[index - 1] + 1);\n if (isNotContinuous) {\n return null;\n }\n }\n if (options.space === \"ignore\") {\n result = result.filter(i => words[i] !== \" \");\n }\n return result.length ? result : null;\n};\nconst matchAboveStart = (text, pinyin$1, options) => {\n const words = splitString(text);\n // 二维数组 dp[i][j],i 表示遍历到的 text 索引+1, j 表示遍历到的 pinyin 的索引+1\n const dp = Array(words.length + 1);\n // 使用哨兵初始化 dp\n for (let i = 0; i < dp.length; i++) {\n dp[i] = Array(pinyin$1.length + 1);\n dp[i][0] = [];\n }\n for (let i = 0; i < dp[0].length; i++) {\n dp[0][i] = [];\n }\n // 动态规划匹配\n for (let i = 1; i < dp.length; i++) {\n // options.continuous 为 false 或 options.space 为 ignore 且当前为空格时,第 i 个字可以不参与匹配\n if (!options.continuous || options.space == \"ignore\" && words[i - 1] === \" \") {\n for (let j = 1; j <= pinyin$1.length; j++) {\n dp[i][j - 1] = dp[i - 1][j - 1];\n }\n }\n // 第 i 个字参与匹配\n for (let j = 1; j <= pinyin$1.length; j++) {\n if (!dp[i - 1][j - 1]) {\n // 第 i - 1 已经匹配失败,停止向后匹配\n continue;\n } else if (j !== 1 && !dp[i - 1][j - 1].length) {\n // 非开头且前面的字符未匹配完成,停止向后匹配\n continue;\n } else {\n const muls = pinyin(words[i - 1], {\n type: \"array\",\n toneType: \"none\",\n multiple: true,\n v: options.v\n });\n // 非中文匹配\n if (words[i - 1] === pinyin$1[j - 1]) {\n const matches = [...dp[i - 1][j - 1], i - 1];\n // 记录最长的可匹配下标数组\n if (!dp[i][j] || matches.length > dp[i][j].length) {\n dp[i][j] = matches;\n }\n // pinyin 参数完全匹配完成,记录结果\n if (j === pinyin$1.length) {\n return dp[i][j];\n }\n }\n // 剩余长度小于等于 MAX_PINYIN_LENGTH(6) 时,有可能是最后一个拼音了\n if (pinyin$1.length - j <= MAX_PINYIN_LENGTH) {\n // lastPrecision 参数处理\n const last = muls.some(py => {\n if (options.lastPrecision === \"any\") {\n return py.includes(pinyin$1.slice(j - 1, pinyin$1.length));\n }\n if (options.lastPrecision === \"start\") {\n return py.startsWith(pinyin$1.slice(j - 1, pinyin$1.length));\n }\n if (options.lastPrecision === \"first\") {\n return py[0] === pinyin$1.slice(j - 1, pinyin$1.length);\n }\n if (options.lastPrecision === \"every\") {\n return py === pinyin$1.slice(j - 1, pinyin$1.length);\n }\n return false;\n });\n if (last) {\n return [...dp[i - 1][j - 1], i - 1];\n }\n }\n const precision = options.precision;\n // precision 为 start 时,匹配开头\n if (precision === \"start\") {\n muls.forEach(py => {\n let end = j;\n const matches = [...dp[i - 1][j - 1], i - 1];\n while (end <= pinyin$1.length && py.startsWith(pinyin$1.slice(j - 1, end))) {\n if (!dp[i][end] || matches.length > dp[i][end].length) {\n dp[i][end] = matches;\n }\n end++;\n }\n });\n }\n // precision 为 first 时,匹配首字母\n if (precision === \"first\") {\n if (muls.some(py => py[0] === pinyin$1[j - 1])) {\n const matches = [...dp[i - 1][j - 1], i - 1];\n // 记录最长的可匹配下标数组\n if (!dp[i][j] || matches.length > dp[i][j].length) {\n dp[i][j] = matches;\n }\n }\n }\n // 匹配当前汉字的完整拼音\n const completeMatch = muls.find(py => py === pinyin$1.slice(j - 1, j - 1 + py.length));\n if (completeMatch) {\n const matches = [...dp[i - 1][j - 1], i - 1];\n const endIndex = j - 1 + completeMatch.length;\n // 记录最长的可匹配下标数组\n if (!dp[i][endIndex] || matches.length > dp[i][endIndex].length) {\n dp[i][endIndex] = matches;\n }\n }\n }\n }\n }\n return null;\n};\n// 对于双字节的字符,需要将 index 顺延 +1\nfunction processDoubleUnicodeIndex(text, indexArray) {\n if (!indexArray) {\n return null;\n }\n const result = [];\n let doubleUnicodeCount = 0;\n const words = splitString(text);\n let i = 0;\n for (let j = 0; j < indexArray.length; j++) {\n const curIndex = indexArray[j];\n while (i <= curIndex) {\n if (words[i].length === 2) {\n doubleUnicodeCount++;\n }\n i++;\n }\n const realIndex = curIndex + doubleUnicodeCount;\n if (words[curIndex].length === 2) {\n result.push(realIndex - 1, realIndex);\n } else {\n result.push(realIndex);\n }\n }\n return result;\n}\nconst DefaultHtmlOptions = {\n resultClass: 'py-result-item',\n chineseClass: 'py-chinese-item',\n pinyinClass: 'py-pinyin-item',\n nonChineseClass: 'py-non-chinese-item',\n wrapNonChinese: false,\n toneType: 'symbol',\n customClassMap: {},\n toneSandhi: true,\n rp: true\n};\n/**\r\n * @description: 获取带拼音汉字的 html 字符串\r\n * @param {string} text 要转换的字符串\r\n * @param {HtmlOptions=} options html 中标签类名相关配置\r\n * @return {string} 带汉字的拼音字符串\r\n */\nconst html = (text, options) => {\n const completeOptions = Object.assign(Object.assign({}, DefaultHtmlOptions), options || {});\n const pinyinArray = pinyin(text, {\n type: 'all',\n toneType: completeOptions.toneType,\n toneSandhi: options === null || options === void 0 ? void 0 : options.toneSandhi\n });\n const result = pinyinArray.map(item => {\n let additionalClass = '';\n for (const classname in completeOptions.customClassMap) {\n const dict = completeOptions.customClassMap[classname];\n if (dict.includes(item.origin)) {\n additionalClass += ` ${classname}`;\n }\n }\n if (item.isZh) {\n // 汉字字符处理\n const resultClass = completeOptions.resultClass || DefaultHtmlOptions.resultClass;\n const chineseClass = completeOptions.chineseClass || DefaultHtmlOptions.chineseClass;\n const pinyinClass = completeOptions.pinyinClass || DefaultHtmlOptions.pinyinClass;\n return `<span class=\"${resultClass}${additionalClass}\"><ruby><span class=\"${chineseClass}\">${item.origin}</span>${completeOptions.rp ? '<rp>(</rp>' : ''}<rt class=\"${pinyinClass}\">${item.pinyin}</rt>${completeOptions.rp ? '<rp>)</rp>' : ''}</ruby></span>`;\n } else {\n // 非汉字字符处理\n if (completeOptions.wrapNonChinese) {\n const nonChineseClass = completeOptions.nonChineseClass || DefaultHtmlOptions.nonChineseClass;\n return `<span class=\"${nonChineseClass}${additionalClass}\">${item.origin}</span>`;\n } else {\n return item.origin;\n }\n }\n });\n return result.join('');\n};\nconst DEFAULT_OPTIONS$1 = {\n pattern: 'pinyin',\n toneType: 'symbol',\n type: 'string',\n v: false,\n nonZh: 'spaced'\n};\n/**\r\n * @description: 获取每个汉字的所有读音\r\n * @param {string} text 要转换的汉语字符串\r\n * @param {CompleteOptions=} options 配置项\r\n * @return {string[] | string[][] | AllData[][]} options.type 为 string 时,返回字符串数组,中间用空格隔开;为 array 时,返回二维拼音字符串数组;为 all 时返回二维全部信息的数组\r\n */\nfunction polyphonic(text, options = DEFAULT_OPTIONS$1) {\n // 校验 text 类型是否正确\n const legal = validateType(text);\n if (!legal) {\n return [];\n }\n // 传入空字符串\n if (text === '') {\n return [];\n }\n if (options.type === 'all') {\n options.pattern = 'pinyin';\n }\n if (options.pattern === 'num') {\n options.toneType = 'none';\n }\n let list = getPolyphonicList(text);\n // nonZh 参数及 removeNonZh 参数\n list = middleWareNonZh(list, options);\n let doubleList = getSplittedPolyphonicList(list);\n // pattern 参数\n doubleList.forEach(list => {\n middlewarePattern(list, options);\n });\n // toneType参数处理\n doubleList.forEach(list => {\n middlewareToneType(list, options);\n });\n // v参数处理\n doubleList.forEach(list => {\n middlewareV(list, options);\n });\n // type 参数处理\n const result = doubleList.map(list => handleType(list, options));\n return result;\n}\n// 获取每个字多音字的数组\nconst getPolyphonicList = text => {\n return splitString(text).map(char => {\n const customPolyphonicDict = getCustomPolyphonicDict();\n const pinyin = customPolyphonicDict.get(char) || DICT1.get(char) || char;\n return {\n origin: char,\n result: pinyin,\n isZh: pinyin !== char,\n originPinyin: pinyin\n };\n });\n};\n// 将多音字每个读音都单独切为一个数组项\nconst getSplittedPolyphonicList = list => {\n return list.map(item => {\n return item.isZh ? item.result.split(' ').map(pinyin => ({\n origin: item.origin,\n result: pinyin,\n isZh: true,\n originPinyin: pinyin\n })) : [item];\n });\n};\n// type 属性处理\nconst handleType = (list, options) => {\n if (options.type === 'array') {\n return Array.from(new Set(list.map(item => item.result)));\n }\n if (options.type === 'all') {\n return list.map(item => {\n const pinyin = item.isZh ? item.result : '';\n const {\n initial,\n final\n } = getInitialAndFinal(pinyin);\n const {\n head,\n body,\n tail\n } = getFinalParts(pinyin);\n return {\n origin: item.origin,\n pinyin,\n initial,\n final,\n first: getFirstLetter(item.result, item.isZh),\n finalHead: head,\n finalBody: body,\n finalTail: tail,\n num: Number(getNumOfTone(item.originPinyin)),\n isZh: item.isZh,\n inZhRange: !!DICT1.get(item.origin)\n };\n });\n }\n return Array.from(new Set(list.map(item => item.result))).join(' ');\n};\nconst DefaultConvertOptions = {\n separator: ' ',\n format: 'numToSymbol'\n};\nconst toneMap = {\n a: ['a', 'ā', 'á', 'ǎ', 'à'],\n o: ['o', 'ō', 'ó', 'ǒ', 'ò'],\n e: ['e', 'ē', 'é', 'ě', 'è'],\n ü: ['ü', 'ǖ', 'ǘ', 'ǚ', 'ǜ'],\n v: ['ü', 'ǖ', 'ǘ', 'ǚ', 'ǜ'],\n ui: ['ui', 'uī', 'uí', 'uǐ', 'uì'],\n iu: ['iu', 'iū', 'iú', 'iǔ', 'iù'],\n i: ['i', 'ī', 'í', 'ǐ', 'ì'],\n u: ['u', 'ū', 'ú', 'ǔ', 'ù'],\n n: ['n', 'n̄', 'ń', 'ň', 'ǹ'],\n m: ['m', 'm̄', 'ḿ', 'm̌', 'm̀'],\n ê: ['ê', 'ê̄', 'ế', 'ê̌', 'ề']\n};\n/**\r\n * @description: 拼音格式转换。pin1 yin1 -> pīn yīn 或 pīn yīn -> pin1 yin1 或 pīn yīn -> pin yin\r\n * @param {string | string[]} pinyin 要转换的拼音字符串或者拼音字符串数组\r\n * @param {ConvertOptions=} options 配置项\r\n * @return {string | string[]} 转换后的拼音字符串或者拼音字符串数组\r\n */\nfunction convert(pinyin, options) {\n options = Object.assign(Object.assign({}, DefaultConvertOptions), options || {});\n const originType = typeof pinyin;\n if (typeof pinyin === 'string') {\n pinyin = pinyin.split(options.separator);\n }\n pinyin = pinyin.map(item => {\n const format = options.format;\n if (format === 'numToSymbol') {\n return formatNumToSymbol(item);\n } else if (format === 'symbolToNum') {\n return formatSymbolToNum(item);\n } else if (format === 'toneNone') {\n return formatToneNone(item);\n }\n return item;\n });\n if (originType === 'string') {\n return pinyin.join(options.separator);\n } else {\n return pinyin;\n }\n}\nfunction formatNumToSymbol(pinyin) {\n const lastChar = Number(pinyin[pinyin.length - 1]);\n if (lastChar >= 0 && lastChar <= 4) {\n for (let key in toneMap) {\n if (pinyin.includes(key)) {\n return pinyin.slice(0, pinyin.length - 1).replace(key, toneMap[key][lastChar]);\n }\n }\n return pinyin;\n } else {\n return pinyin;\n }\n}\nfunction formatSymbolToNum(pinyin) {\n return `${getPinyinWithoutTone(pinyin)}${getNumOfTone(pinyin)}`;\n}\nfunction formatToneNone(pinyin) {\n return getPinyinWithoutTone(pinyin);\n}\nvar OutputFormat;\n(function (OutputFormat) {\n OutputFormat[OutputFormat[\"AllSegment\"] = 1] = \"AllSegment\";\n OutputFormat[OutputFormat[\"AllArray\"] = 2] = \"AllArray\";\n OutputFormat[OutputFormat[\"AllString\"] = 3] = \"AllString\";\n OutputFormat[OutputFormat[\"PinyinSegment\"] = 4] = \"PinyinSegment\";\n OutputFormat[OutputFormat[\"PinyinArray\"] = 5] = \"PinyinArray\";\n OutputFormat[OutputFormat[\"PinyinString\"] = 6] = \"PinyinString\";\n OutputFormat[OutputFormat[\"ZhSegment\"] = 7] = \"ZhSegment\";\n OutputFormat[OutputFormat[\"ZhArray\"] = 8] = \"ZhArray\";\n OutputFormat[OutputFormat[\"ZhString\"] = 9] = \"ZhString\";\n})(OutputFormat || (OutputFormat = {}));\nfunction middlewareSegment(list, matches) {\n const segments = [];\n let i = 0;\n let j = 0;\n while (i < list.length && j < matches.length) {\n const match = matches[j];\n const item = list[i];\n if (match.zh.startsWith(item.origin)) {\n const start = i;\n const chars = splitString(match.zh);\n let cur = start + 1;\n while (cur < list.length && list[cur].origin === chars[cur - start]) {\n cur++;\n }\n const _segment = list.slice(start, cur);\n segments.push({\n segment: _segment.map(item => ({\n origin: item.origin,\n result: item.result\n })),\n isZh: true\n });\n i += cur - start;\n j++;\n } else {\n segments.push({\n segment: [{\n origin: item.origin,\n result: item.result\n }],\n isZh: false\n });\n i++;\n }\n }\n while (i < list.length) {\n const item = list[i];\n segments.push({\n segment: [{\n origin: item.origin,\n result: item.result\n }],\n isZh: false\n });\n i++;\n }\n return segments;\n}\nfunction middlewareOutputFormat(segments, options) {\n const {\n format = OutputFormat.AllSegment,\n separator = ' '\n } = options;\n if (format === OutputFormat.AllSegment) {\n return segments.map(item => {\n return {\n origin: item.segment.map(item => item.origin).join(''),\n result: item.segment.map(item => item.result).join('')\n };\n });\n } else if (format === OutputFormat.AllArray) {\n return segments.map(item => item.segment);\n } else if (format === OutputFormat.AllString) {\n const list = segments.map(item => {\n return {\n origin: item.segment.map(item => item.origin).join(''),\n result: item.segment.map(item => item.result).join('')\n };\n });\n return {\n origin: list.map(item => item.origin).join(separator),\n result: list.map(item => item.result).join(separator)\n };\n } else if (format === OutputFormat.PinyinSegment) {\n return segments.map(item => item.segment.map(item => item.result).join(''));\n } else if (format === OutputFormat.PinyinArray) {\n return segments.map(item => item.segment.map(item => item.result));\n } else if (format === OutputFormat.PinyinString) {\n return segments.map(item => item.segment.map(item => item.result).join('')).join(separator);\n } else if (format === OutputFormat.ZhSegment) {\n return segments.map(item => item.segment.map(item => item.origin).join(''));\n } else if (format === OutputFormat.ZhArray) {\n return segments.map(item => item.segment.map(item => item.origin));\n } else if (format === OutputFormat.ZhString) {\n return segments.map(item => item.segment.map(item => item.origin).join('')).join(separator);\n }\n}\nconst DEFAULT_OPTIONS = {\n toneType: \"symbol\",\n mode: \"normal\",\n nonZh: \"spaced\",\n v: false,\n separator: \" \",\n toneSandhi: true,\n segmentit: 2 /* TokenizationAlgorithm.MaxProbability */,\n format: OutputFormat.AllSegment\n};\nfunction segment(word, options) {\n options = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options || {});\n // 校验 word 类型是否正确\n const legal = validateType(word);\n if (!legal) {\n return word;\n }\n if (options.surname === undefined) {\n if (options.mode === \"surname\") {\n options.surname = \"all\";\n } else {\n options.surname = \"off\";\n }\n }\n let _list = Array(stringLength(word));\n let {\n list,\n matches\n } = getPinyin(word, _list, options.surname, options.segmentit);\n // 一和不变调处理\n list = middlewareToneSandhi(list, options.toneSandhi);\n // nonZh\n list = middleWareNonZh(list, options);\n // toneType参数处理\n middlewareToneType(list, options);\n // v参数处理\n middlewareV(list, options);\n const segments = middlewareSegment(list, matches);\n return middlewareOutputFormat(segments, {\n format: options.format,\n separator: options.separator\n });\n}\n\n\n//# sourceURL=webpack://olp-table/./node_modules/pinyin-pro/dist/index.mjs?");
|
|
5934
|
-
|
|
5935
|
-
/***/ }),
|
|
5936
|
-
|
|
5937
5915
|
/***/ "./node_modules/sortablejs/modular/sortable.esm.js":
|
|
5938
5916
|
/*!*********************************************************!*\
|
|
5939
5917
|
!*** ./node_modules/sortablejs/modular/sortable.esm.js ***!
|
|
@@ -11066,7 +11044,7 @@ eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// lo
|
|
|
11066
11044
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
11067
11045
|
|
|
11068
11046
|
"use strict";
|
|
11069
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ decryptWithDecompress: function() { return /* binding */ decryptWithDecompress; },\n/* harmony export */ encryptWithCompress: function() { return /* binding */ encryptWithCompress; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.typed-array.with.js */ \"./node_modules/core-js/modules/es.typed-array.with.js\");\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(crypto_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! pako */ \"
|
|
11047
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ decryptWithDecompress: function() { return /* binding */ decryptWithDecompress; },\n/* harmony export */ encryptWithCompress: function() { return /* binding */ encryptWithCompress; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.typed-array.with.js */ \"./node_modules/core-js/modules/es.typed-array.with.js\");\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(crypto_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! pako */ \"pako\");\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(pako__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var js_base64__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! js-base64 */ \"./node_modules/js-base64/base64.mjs\");\n\n\n\n\n\n\n\n// 配置参数\nconst SECRETKEY = \"liuzhououlaipu66\"; // 必须与Java保持一致\nconst IV_LENGTH = 16;\n\n// ================== 加密流程 ================== //\n/**\r\n * JS加密(与Java互操作)\r\n * @param {Object|string} data - 待加密数据\r\n * @returns {string} Base64加密字符串\r\n */\nfunction encryptWithCompress(data) {\n // Step1:JSON序列化,使用自定义replacer处理大数字\n const jsonStr = typeof data === 'string' ? data : JSON.stringify(data, (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n return value.toString();\n }\n return value;\n });\n\n // Step2:GZIP压缩\n const compressed = pako__WEBPACK_IMPORTED_MODULE_4___default().gzip(jsonStr, {\n level: 6\n });\n\n // Step3:生成随机IV\n const iv = crypto_js__WEBPACK_IMPORTED_MODULE_3___default().lib.WordArray.random(IV_LENGTH);\n\n // Step4:AES加密\n const key = crypto_js__WEBPACK_IMPORTED_MODULE_3___default().enc.Utf8.parse(SECRETKEY);\n const cipher = crypto_js__WEBPACK_IMPORTED_MODULE_3___default().AES.encrypt(crypto_js__WEBPACK_IMPORTED_MODULE_3___default().lib.WordArray.create(compressed), key, {\n iv: iv,\n mode: (crypto_js__WEBPACK_IMPORTED_MODULE_3___default().mode).CBC,\n padding: (crypto_js__WEBPACK_IMPORTED_MODULE_3___default().pad).Pkcs7\n });\n\n // Step5:拼接IV+密文 → Base64\n const ivBytes = crypto_js__WEBPACK_IMPORTED_MODULE_3___default().enc.Hex.parse(iv.toString((crypto_js__WEBPACK_IMPORTED_MODULE_3___default().enc).Hex));\n const combined = ivBytes.concat(cipher.ciphertext);\n return combined.toString((crypto_js__WEBPACK_IMPORTED_MODULE_3___default().enc).Base64);\n}\n\n// ================== 解密流程 ================== //\n/**\r\n * JS解密(兼容Java加密数据)\r\n * @param {string} encryptedBase64 - Java加密字符串\r\n * @returns {Object} 原始数据\r\n */\nfunction decryptWithDecompress(encryptedBase64) {\n // Step1:Base64解码(处理Apache格式)\n const rawData = js_base64__WEBPACK_IMPORTED_MODULE_5__.Base64.toUint8Array(encryptedBase64.replace(/\\n/g, ''));\n\n // Step2:提取IV和密文\n const ivBytes = rawData.slice(0, IV_LENGTH);\n const cipherBytes = rawData.slice(IV_LENGTH);\n\n // Step3:AES解密配置\n const key = crypto_js__WEBPACK_IMPORTED_MODULE_3___default().enc.Utf8.parse(SECRETKEY);\n const iv = crypto_js__WEBPACK_IMPORTED_MODULE_3___default().lib.WordArray.create(ivBytes);\n\n // Step4:执行解密\n const decrypted = crypto_js__WEBPACK_IMPORTED_MODULE_3___default().AES.decrypt({\n ciphertext: crypto_js__WEBPACK_IMPORTED_MODULE_3___default().lib.WordArray.create(cipherBytes)\n }, key, {\n iv: iv,\n padding: (crypto_js__WEBPACK_IMPORTED_MODULE_3___default().pad).Pkcs7\n });\n\n // Step5:GZIP解压\n const uint8Array = new Uint8Array(decrypted.sigBytes);\n decrypted.words.forEach((word, i) => {\n uint8Array[i * 4] = word >> 24 & 0xff;\n uint8Array[i * 4 + 1] = word >> 16 & 0xff;\n uint8Array[i * 4 + 2] = word >> 8 & 0xff;\n uint8Array[i * 4 + 3] = word & 0xff;\n });\n try {\n const decompressed = pako__WEBPACK_IMPORTED_MODULE_4___default().ungzip(uint8Array);\n const str = new TextDecoder().decode(decompressed);\n // 使用自定义的 reviver 函数来处理大数字\n const parse = JSON.parse(str);\n return jsonParse(parse);\n } catch (e) {\n throw new Error(`解密失败:${e.message}`);\n }\n}\nfunction jsonParse(str) {\n return JSON.parse(str.replace(/:\\s*([-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?)/g, (match, p1) => {\n if (Math.abs(p1) > Number.MAX_SAFE_INTEGER) {\n return `:\"${p1}\"`;\n }\n return `:${p1}`;\n }));\n}\n\n\n//# sourceURL=webpack://olp-table/./src/utils/AESCRUDUtils.js?");
|
|
11070
11048
|
|
|
11071
11049
|
/***/ }),
|
|
11072
11050
|
|
|
@@ -13686,6 +13664,17 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_exceljs__;
|
|
|
13686
13664
|
|
|
13687
13665
|
/***/ }),
|
|
13688
13666
|
|
|
13667
|
+
/***/ "pako":
|
|
13668
|
+
/*!***********************!*\
|
|
13669
|
+
!*** external "pako" ***!
|
|
13670
|
+
\***********************/
|
|
13671
|
+
/***/ (function(module) {
|
|
13672
|
+
|
|
13673
|
+
"use strict";
|
|
13674
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_pako__;
|
|
13675
|
+
|
|
13676
|
+
/***/ }),
|
|
13677
|
+
|
|
13689
13678
|
/***/ "pinia":
|
|
13690
13679
|
/*!************************!*\
|
|
13691
13680
|
!*** external "pinia" ***!
|
|
@@ -13697,6 +13686,17 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_pinia__;
|
|
|
13697
13686
|
|
|
13698
13687
|
/***/ }),
|
|
13699
13688
|
|
|
13689
|
+
/***/ "pinyin-pro":
|
|
13690
|
+
/*!*****************************!*\
|
|
13691
|
+
!*** external "pinyin-pro" ***!
|
|
13692
|
+
\*****************************/
|
|
13693
|
+
/***/ (function(module) {
|
|
13694
|
+
|
|
13695
|
+
"use strict";
|
|
13696
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_pinyin_pro__;
|
|
13697
|
+
|
|
13698
|
+
/***/ }),
|
|
13699
|
+
|
|
13700
13700
|
/***/ "qs":
|
|
13701
13701
|
/*!*********************!*\
|
|
13702
13702
|
!*** external "qs" ***!
|