From 53c612880832653afb7a8d2b1d74498d6484586d Mon Sep 17 00:00:00 2001
From: mkm <727897186@qq.com>
Date: Sun, 3 Dec 2023 09:58:50 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=8A=E4=BC=A0=E6=96=87?=
=?UTF-8?q?=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
composer.json | 2 +-
composer.lock | 146 +-
.../plugin/mongdch/webman-uploadslice/app.php | 14 +
vendor/composer/autoload_files.php | 1 +
vendor/composer/autoload_psr4.php | 3 +-
vendor/composer/autoload_static.php | 19 +-
vendor/composer/installed.json | 153 +-
vendor/composer/installed.php | 31 +-
vendor/mongdch/mon-util/.gitignore | 6 +
vendor/mongdch/mon-util/CHANGELOG.md | 187 +
vendor/mongdch/mon-util/LICENSE | 201 +
vendor/mongdch/mon-util/README.md | 48 +
vendor/mongdch/mon-util/composer.json | 28 +
vendor/mongdch/mon-util/composer.lock | 20 +
vendor/mongdch/mon-util/example/container.php | 29 +
vendor/mongdch/mon-util/example/docparse.php | 53 +
vendor/mongdch/mon-util/example/http.php | 14 +
vendor/mongdch/mon-util/example/index.php | 50 +
.../mongdch/mon-util/example/iplocation.php | 17 +
vendor/mongdch/mon-util/example/lottery.php | 20 +
vendor/mongdch/mon-util/example/migrate.php | 63 +
vendor/mongdch/mon-util/example/pinyin.php | 9 +
vendor/mongdch/mon-util/example/qrcode.php | 11 +
vendor/mongdch/mon-util/example/socket.php | 10 +
vendor/mongdch/mon-util/example/upload.php | 35 +
.../mon-util/example/upload_slice.html | 405 ++
.../mongdch/mon-util/example/upload_slice.php | 140 +
vendor/mongdch/mon-util/src/Common.php | 751 ++++
vendor/mongdch/mon-util/src/Container.php | 308 ++
vendor/mongdch/mon-util/src/Date.php | 646 +++
vendor/mongdch/mon-util/src/Dictionary.php | 339 ++
vendor/mongdch/mon-util/src/DocParse.php | 180 +
vendor/mongdch/mon-util/src/File.php | 554 +++
vendor/mongdch/mon-util/src/Gif.php | 494 +++
vendor/mongdch/mon-util/src/IPLocation.php | 495 +++
vendor/mongdch/mon-util/src/IdCard.php | 226 ++
vendor/mongdch/mon-util/src/IdCode.php | 157 +
vendor/mongdch/mon-util/src/Image.php | 646 +++
vendor/mongdch/mon-util/src/Instance.php | 56 +
vendor/mongdch/mon-util/src/Lang.php | 183 +
vendor/mongdch/mon-util/src/Log.php | 242 ++
vendor/mongdch/mon-util/src/Lottery.php | 126 +
vendor/mongdch/mon-util/src/Migrate.php | 625 +++
vendor/mongdch/mon-util/src/Network.php | 380 ++
vendor/mongdch/mon-util/src/Pinyin.php | 479 +++
vendor/mongdch/mon-util/src/Qrcode.php | 3076 +++++++++++++++
vendor/mongdch/mon-util/src/Sql.php | 82 +
vendor/mongdch/mon-util/src/Tool.php | 699 ++++
vendor/mongdch/mon-util/src/Tree.php | 456 +++
vendor/mongdch/mon-util/src/UploadFile.php | 294 ++
vendor/mongdch/mon-util/src/UploadImg.php | 153 +
vendor/mongdch/mon-util/src/UploadSlice.php | 263 ++
vendor/mongdch/mon-util/src/Validate.php | 769 ++++
vendor/mongdch/mon-util/src/data/idcard.php | 3477 +++++++++++++++++
.../src/exception/IPLocationException.php | 31 +
.../mon-util/src/exception/ImgException.php | 76 +
.../src/exception/LotteryException.php | 26 +
.../src/exception/MigrateException.php | 12 +
.../src/exception/NetWorkException.php | 42 +
.../src/exception/UploadException.php | 76 +
.../src/exception/ValidateException.php | 24 +
vendor/mongdch/mon-util/src/functions.php | 432 ++
vendor/mongdch/webman-uploadslice/.gitignore | 6 +
vendor/mongdch/webman-uploadslice/LICENSE | 20 +
vendor/mongdch/webman-uploadslice/README.md | 3 +
.../mongdch/webman-uploadslice/composer.json | 20 +
.../mongdch/webman-uploadslice/composer.lock | 144 +
.../webman-uploadslice/example/route.php | 75 +
.../webman-uploadslice/example/upload.html | 407 ++
.../webman-uploadslice/src/Install.php | 74 +
.../webman-uploadslice/src/UploadSlice.php | 206 +
.../plugin/mongdch/webman-uploadslice/app.php | 14 +
vendor/workerman/mqtt/.gitignore | 8 -
vendor/workerman/mqtt/README.md | 200 -
vendor/workerman/mqtt/composer.json | 35 -
vendor/workerman/mqtt/examples/changelog.md | 1 -
vendor/workerman/mqtt/examples/chatroom.php | 32 -
.../mqtt/examples/publish-no-ssl.php | 21 -
.../mqtt/examples/publish-over-ssl.php | 24 -
.../mqtt/examples/ssl/mosquitto.org.crt | 20 -
.../mqtt/examples/ssl/mosquitto.org.key | 27 -
.../mqtt/examples/subscribe-no-ssl.php | 19 -
.../mqtt/examples/subscribe-over-ssl.php | 24 -
.../mqtt/examples/v5/publish-no-ssl.php | 41 -
.../mqtt/examples/v5/subscribe-no-ssl.php | 62 -
vendor/workerman/mqtt/src/Client.php | 1111 ------
.../workerman/mqtt/src/Consts/MQTTConst.php | 116 -
.../mqtt/src/Consts/PropertyConst.php | 63 -
.../mqtt/src/Consts/ReasonCodeConst.php | 177 -
vendor/workerman/mqtt/src/Handle/DecodeV5.php | 304 --
vendor/workerman/mqtt/src/Handle/Decoder.php | 141 -
vendor/workerman/mqtt/src/Handle/EncodeV5.php | 217 -
vendor/workerman/mqtt/src/Handle/Encoder.php | 87 -
.../mqtt/src/Handle/Property/PackProperty.php | 337 --
.../mqtt/src/Handle/Property/PacketMap.php | 124 -
.../src/Handle/Property/UnPackProperty.php | 368 --
vendor/workerman/mqtt/src/Protocols/Mqtt.php | 479 ---
vendor/workerman/mqtt/src/Protocols/Mqtt5.php | 179 -
vendor/workerman/mqtt/src/Tools/Common.php | 33 -
vendor/workerman/mqtt/src/Tools/Debug.php | 123 -
100 files changed, 19427 insertions(+), 4505 deletions(-)
create mode 100644 config/plugin/mongdch/webman-uploadslice/app.php
create mode 100644 vendor/mongdch/mon-util/.gitignore
create mode 100644 vendor/mongdch/mon-util/CHANGELOG.md
create mode 100644 vendor/mongdch/mon-util/LICENSE
create mode 100644 vendor/mongdch/mon-util/README.md
create mode 100644 vendor/mongdch/mon-util/composer.json
create mode 100644 vendor/mongdch/mon-util/composer.lock
create mode 100644 vendor/mongdch/mon-util/example/container.php
create mode 100644 vendor/mongdch/mon-util/example/docparse.php
create mode 100644 vendor/mongdch/mon-util/example/http.php
create mode 100644 vendor/mongdch/mon-util/example/index.php
create mode 100644 vendor/mongdch/mon-util/example/iplocation.php
create mode 100644 vendor/mongdch/mon-util/example/lottery.php
create mode 100644 vendor/mongdch/mon-util/example/migrate.php
create mode 100644 vendor/mongdch/mon-util/example/pinyin.php
create mode 100644 vendor/mongdch/mon-util/example/qrcode.php
create mode 100644 vendor/mongdch/mon-util/example/socket.php
create mode 100644 vendor/mongdch/mon-util/example/upload.php
create mode 100644 vendor/mongdch/mon-util/example/upload_slice.html
create mode 100644 vendor/mongdch/mon-util/example/upload_slice.php
create mode 100644 vendor/mongdch/mon-util/src/Common.php
create mode 100644 vendor/mongdch/mon-util/src/Container.php
create mode 100644 vendor/mongdch/mon-util/src/Date.php
create mode 100644 vendor/mongdch/mon-util/src/Dictionary.php
create mode 100644 vendor/mongdch/mon-util/src/DocParse.php
create mode 100644 vendor/mongdch/mon-util/src/File.php
create mode 100644 vendor/mongdch/mon-util/src/Gif.php
create mode 100644 vendor/mongdch/mon-util/src/IPLocation.php
create mode 100644 vendor/mongdch/mon-util/src/IdCard.php
create mode 100644 vendor/mongdch/mon-util/src/IdCode.php
create mode 100644 vendor/mongdch/mon-util/src/Image.php
create mode 100644 vendor/mongdch/mon-util/src/Instance.php
create mode 100644 vendor/mongdch/mon-util/src/Lang.php
create mode 100644 vendor/mongdch/mon-util/src/Log.php
create mode 100644 vendor/mongdch/mon-util/src/Lottery.php
create mode 100644 vendor/mongdch/mon-util/src/Migrate.php
create mode 100644 vendor/mongdch/mon-util/src/Network.php
create mode 100644 vendor/mongdch/mon-util/src/Pinyin.php
create mode 100644 vendor/mongdch/mon-util/src/Qrcode.php
create mode 100644 vendor/mongdch/mon-util/src/Sql.php
create mode 100644 vendor/mongdch/mon-util/src/Tool.php
create mode 100644 vendor/mongdch/mon-util/src/Tree.php
create mode 100644 vendor/mongdch/mon-util/src/UploadFile.php
create mode 100644 vendor/mongdch/mon-util/src/UploadImg.php
create mode 100644 vendor/mongdch/mon-util/src/UploadSlice.php
create mode 100644 vendor/mongdch/mon-util/src/Validate.php
create mode 100644 vendor/mongdch/mon-util/src/data/idcard.php
create mode 100644 vendor/mongdch/mon-util/src/exception/IPLocationException.php
create mode 100644 vendor/mongdch/mon-util/src/exception/ImgException.php
create mode 100644 vendor/mongdch/mon-util/src/exception/LotteryException.php
create mode 100644 vendor/mongdch/mon-util/src/exception/MigrateException.php
create mode 100644 vendor/mongdch/mon-util/src/exception/NetWorkException.php
create mode 100644 vendor/mongdch/mon-util/src/exception/UploadException.php
create mode 100644 vendor/mongdch/mon-util/src/exception/ValidateException.php
create mode 100644 vendor/mongdch/mon-util/src/functions.php
create mode 100644 vendor/mongdch/webman-uploadslice/.gitignore
create mode 100644 vendor/mongdch/webman-uploadslice/LICENSE
create mode 100644 vendor/mongdch/webman-uploadslice/README.md
create mode 100644 vendor/mongdch/webman-uploadslice/composer.json
create mode 100644 vendor/mongdch/webman-uploadslice/composer.lock
create mode 100644 vendor/mongdch/webman-uploadslice/example/route.php
create mode 100644 vendor/mongdch/webman-uploadslice/example/upload.html
create mode 100644 vendor/mongdch/webman-uploadslice/src/Install.php
create mode 100644 vendor/mongdch/webman-uploadslice/src/UploadSlice.php
create mode 100644 vendor/mongdch/webman-uploadslice/src/config/plugin/mongdch/webman-uploadslice/app.php
delete mode 100644 vendor/workerman/mqtt/.gitignore
delete mode 100644 vendor/workerman/mqtt/README.md
delete mode 100644 vendor/workerman/mqtt/composer.json
delete mode 100644 vendor/workerman/mqtt/examples/changelog.md
delete mode 100644 vendor/workerman/mqtt/examples/chatroom.php
delete mode 100644 vendor/workerman/mqtt/examples/publish-no-ssl.php
delete mode 100644 vendor/workerman/mqtt/examples/publish-over-ssl.php
delete mode 100644 vendor/workerman/mqtt/examples/ssl/mosquitto.org.crt
delete mode 100644 vendor/workerman/mqtt/examples/ssl/mosquitto.org.key
delete mode 100644 vendor/workerman/mqtt/examples/subscribe-no-ssl.php
delete mode 100644 vendor/workerman/mqtt/examples/subscribe-over-ssl.php
delete mode 100644 vendor/workerman/mqtt/examples/v5/publish-no-ssl.php
delete mode 100644 vendor/workerman/mqtt/examples/v5/subscribe-no-ssl.php
delete mode 100644 vendor/workerman/mqtt/src/Client.php
delete mode 100644 vendor/workerman/mqtt/src/Consts/MQTTConst.php
delete mode 100644 vendor/workerman/mqtt/src/Consts/PropertyConst.php
delete mode 100644 vendor/workerman/mqtt/src/Consts/ReasonCodeConst.php
delete mode 100644 vendor/workerman/mqtt/src/Handle/DecodeV5.php
delete mode 100644 vendor/workerman/mqtt/src/Handle/Decoder.php
delete mode 100644 vendor/workerman/mqtt/src/Handle/EncodeV5.php
delete mode 100644 vendor/workerman/mqtt/src/Handle/Encoder.php
delete mode 100644 vendor/workerman/mqtt/src/Handle/Property/PackProperty.php
delete mode 100644 vendor/workerman/mqtt/src/Handle/Property/PacketMap.php
delete mode 100644 vendor/workerman/mqtt/src/Handle/Property/UnPackProperty.php
delete mode 100644 vendor/workerman/mqtt/src/Protocols/Mqtt.php
delete mode 100644 vendor/workerman/mqtt/src/Protocols/Mqtt5.php
delete mode 100644 vendor/workerman/mqtt/src/Tools/Common.php
delete mode 100644 vendor/workerman/mqtt/src/Tools/Debug.php
diff --git a/composer.json b/composer.json
index 1dd9e5b..1ad1cde 100644
--- a/composer.json
+++ b/composer.json
@@ -46,7 +46,7 @@
"symfony/cache": "^5.4",
"max/var-dumper": "^0.1.1",
"textalk/websocket": "^1.5",
- "workerman/mqtt": "^1.5"
+ "mongdch/webman-uploadslice": "^1.0"
},
"suggest": {
"ext-event": "For better performance. "
diff --git a/composer.lock b/composer.lock
index 2234a6d..4eb7e75 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "a17d1e2eafc455d4b265f28452681146",
+ "content-hash": "010dcca3d3b8046a639dc83a69a08fdc",
"packages": [
{
"name": "aliyuncs/oss-sdk-php",
@@ -1331,6 +1331,95 @@
"homepage": "https://github.com/marxphp/var-dumper",
"time": "2023-07-07T12:54:36+00:00"
},
+ {
+ "name": "mongdch/mon-util",
+ "version": "1.3.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MonGDCH/mon-util.git",
+ "reference": "dee088b3bee124b1784d39714addb54d141447b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MonGDCH/mon-util/zipball/dee088b3bee124b1784d39714addb54d141447b0",
+ "reference": "dee088b3bee124b1784d39714addb54d141447b0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "mon\\util\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "MonGDCH",
+ "email": "985558837@qq.com"
+ }
+ ],
+ "description": "常用的PHP工具类库,包含了各种各式各样的工具,如:容器、时间、验证器、多语言、图片、二维码、IP地址、文件上传、文件操作、加解密、数据字典、各种算法等等等等。。。",
+ "homepage": "http://www.gdmon.com",
+ "keywords": [
+ "mon",
+ "tool",
+ "util"
+ ],
+ "support": {
+ "issues": "https://github.com/MonGDCH/mon-util/issues",
+ "source": "https://github.com/MonGDCH/mon-util/tree/1.3.12"
+ },
+ "time": "2022-07-15T02:26:44+00:00"
+ },
+ {
+ "name": "mongdch/webman-uploadslice",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MonGDCH/webman-uploadslice.git",
+ "reference": "bf38ef7c9e92c5a0fc67d24828d922f4a84ec563"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MonGDCH/webman-uploadslice/zipball/bf38ef7c9e92c5a0fc67d24828d922f4a84ec563",
+ "reference": "bf38ef7c9e92c5a0fc67d24828d922f4a84ec563",
+ "shasum": ""
+ },
+ "require": {
+ "mongdch/mon-util": "^1.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Mongdch\\WebmanUploadslice\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "MonGDCH",
+ "email": "985558837@qq.com"
+ }
+ ],
+ "description": "Webman plugin mongdch/webman-uploadslice",
+ "support": {
+ "issues": "https://github.com/MonGDCH/webman-uploadslice/issues",
+ "source": "https://github.com/MonGDCH/webman-uploadslice/tree/1.0.0"
+ },
+ "time": "2022-08-15T06:45:25+00:00"
+ },
{
"name": "monolog/monolog",
"version": "2.9.1",
@@ -3702,61 +3791,6 @@
],
"time": "2022-06-03T18:03:27+00:00"
},
- {
- "name": "workerman/mqtt",
- "version": "v1.5",
- "source": {
- "type": "git",
- "url": "https://github.com/walkor/mqtt.git",
- "reference": "7075c2dbc31449352ac83ad9e1ee2d480962779f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/walkor/mqtt/zipball/7075c2dbc31449352ac83ad9e1ee2d480962779f",
- "reference": "7075c2dbc31449352ac83ad9e1ee2d480962779f",
- "shasum": ""
- },
- "require": {
- "workerman/workerman": ">=3.3.0"
- },
- "suggest": {
- "ext-event": "For better performance. "
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Workerman\\Mqtt\\": "./src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "walkor",
- "email": "walkor@workerman.net",
- "homepage": "https://www.workerman.net",
- "role": "Developer"
- }
- ],
- "homepage": "https://www.workerman.net",
- "keywords": [
- "event-loop",
- "mqtt",
- "mqtt3",
- "mqtt5.0",
- "mqtt_client",
- "php",
- "workerman"
- ],
- "support": {
- "email": "walkor@workerman.net",
- "issues": "https://github.com/walkor/mqtt/issues",
- "source": "https://github.com/walkor/mqtt/tree/v1.5"
- },
- "time": "2023-04-21T11:23:53+00:00"
- },
{
"name": "workerman/webman-framework",
"version": "v1.5.8",
diff --git a/config/plugin/mongdch/webman-uploadslice/app.php b/config/plugin/mongdch/webman-uploadslice/app.php
new file mode 100644
index 0000000..5efbf83
--- /dev/null
+++ b/config/plugin/mongdch/webman-uploadslice/app.php
@@ -0,0 +1,14 @@
+ true,
+ // 允许上传的文件后缀
+ 'exts' => [],
+ // 分片文件大小限制
+ 'sliceSize' => 0,
+ // 保存根路径
+ 'rootPath' => public_path() . DIRECTORY_SEPARATOR . 'upload',
+ // 临时文件存储路径,基于rootPath
+ 'tmpPath' => 'tmp'
+];
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index a0ec5bc..f1ec2e0 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -21,6 +21,7 @@ return array(
'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php',
+ '95cbb2114eda2a039354f2117212c38d' => $vendorDir . '/mongdch/mon-util/src/functions.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
'35fab96057f1bf5e7aba31a8a6d5fdde' => $vendorDir . '/topthink/think-orm/stubs/load_stubs.php',
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 4551288..b6cd1e9 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -10,10 +10,10 @@ return array(
'think\\' => array($vendorDir . '/topthink/think-container/src', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src'),
'taoser\\' => array($vendorDir . '/taoser/webman-validate/src'),
'support\\' => array($vendorDir . '/workerman/webman-framework/src/support'),
+ 'mon\\util\\' => array($vendorDir . '/mongdch/mon-util/src'),
'app\\View\\Components\\' => array($baseDir . '/app/view/components'),
'app\\' => array($baseDir . '/app'),
'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
- 'Workerman\\Mqtt\\' => array($vendorDir . '/workerman/mqtt/src'),
'Workerman\\' => array($vendorDir . '/workerman/workerman'),
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
'Webman\\ThinkOrm\\' => array($vendorDir . '/webman/think-orm/src'),
@@ -55,6 +55,7 @@ return array(
'PhpDocReader\\' => array($vendorDir . '/php-di/phpdoc-reader/src/PhpDocReader'),
'OSS\\' => array($vendorDir . '/aliyuncs/oss-sdk-php/src/OSS'),
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
+ 'Mongdch\\WebmanUploadslice\\' => array($vendorDir . '/mongdch/webman-uploadslice/src'),
'Max\\VarDumper\\' => array($vendorDir . '/max/var-dumper/src'),
'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'),
'Laravel\\SerializableClosure\\' => array($vendorDir . '/laravel/serializable-closure/src'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index ca03fc6..834af3c 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -22,6 +22,7 @@ class ComposerStaticInita5e937600be5568fba59bedece01053c
'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php',
+ '95cbb2114eda2a039354f2117212c38d' => __DIR__ . '/..' . '/mongdch/mon-util/src/functions.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
'35fab96057f1bf5e7aba31a8a6d5fdde' => __DIR__ . '/..' . '/topthink/think-orm/stubs/load_stubs.php',
@@ -47,6 +48,10 @@ class ComposerStaticInita5e937600be5568fba59bedece01053c
array (
'support\\' => 8,
),
+ 'm' =>
+ array (
+ 'mon\\util\\' => 9,
+ ),
'a' =>
array (
'app\\View\\Components\\' => 20,
@@ -58,7 +63,6 @@ class ComposerStaticInita5e937600be5568fba59bedece01053c
),
'W' =>
array (
- 'Workerman\\Mqtt\\' => 15,
'Workerman\\' => 10,
'Webmozart\\Assert\\' => 17,
'Webman\\ThinkOrm\\' => 16,
@@ -118,6 +122,7 @@ class ComposerStaticInita5e937600be5568fba59bedece01053c
'M' =>
array (
'Monolog\\' => 8,
+ 'Mongdch\\WebmanUploadslice\\' => 26,
'Max\\VarDumper\\' => 14,
'Matrix\\' => 7,
),
@@ -186,6 +191,10 @@ class ComposerStaticInita5e937600be5568fba59bedece01053c
array (
0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support',
),
+ 'mon\\util\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/mongdch/mon-util/src',
+ ),
'app\\View\\Components\\' =>
array (
0 => __DIR__ . '/../..' . '/app/view/components',
@@ -198,10 +207,6 @@ class ComposerStaticInita5e937600be5568fba59bedece01053c
array (
0 => __DIR__ . '/..' . '/maennchen/zipstream-php/src',
),
- 'Workerman\\Mqtt\\' =>
- array (
- 0 => __DIR__ . '/..' . '/workerman/mqtt/src',
- ),
'Workerman\\' =>
array (
0 => __DIR__ . '/..' . '/workerman/workerman',
@@ -367,6 +372,10 @@ class ComposerStaticInita5e937600be5568fba59bedece01053c
array (
0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',
),
+ 'Mongdch\\WebmanUploadslice\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/mongdch/webman-uploadslice/src',
+ ),
'Max\\VarDumper\\' =>
array (
0 => __DIR__ . '/..' . '/max/var-dumper/src',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index a8dc2c8..50aa089 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1400,6 +1400,101 @@
"homepage": "https://github.com/marxphp/var-dumper",
"install-path": "../max/var-dumper"
},
+ {
+ "name": "mongdch/mon-util",
+ "version": "1.3.12",
+ "version_normalized": "1.3.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MonGDCH/mon-util.git",
+ "reference": "dee088b3bee124b1784d39714addb54d141447b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MonGDCH/mon-util/zipball/dee088b3bee124b1784d39714addb54d141447b0",
+ "reference": "dee088b3bee124b1784d39714addb54d141447b0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "time": "2022-07-15T02:26:44+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "mon\\util\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "MonGDCH",
+ "email": "985558837@qq.com"
+ }
+ ],
+ "description": "常用的PHP工具类库,包含了各种各式各样的工具,如:容器、时间、验证器、多语言、图片、二维码、IP地址、文件上传、文件操作、加解密、数据字典、各种算法等等等等。。。",
+ "homepage": "http://www.gdmon.com",
+ "keywords": [
+ "mon",
+ "tool",
+ "util"
+ ],
+ "support": {
+ "issues": "https://github.com/MonGDCH/mon-util/issues",
+ "source": "https://github.com/MonGDCH/mon-util/tree/1.3.12"
+ },
+ "install-path": "../mongdch/mon-util"
+ },
+ {
+ "name": "mongdch/webman-uploadslice",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MonGDCH/webman-uploadslice.git",
+ "reference": "bf38ef7c9e92c5a0fc67d24828d922f4a84ec563"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MonGDCH/webman-uploadslice/zipball/bf38ef7c9e92c5a0fc67d24828d922f4a84ec563",
+ "reference": "bf38ef7c9e92c5a0fc67d24828d922f4a84ec563",
+ "shasum": ""
+ },
+ "require": {
+ "mongdch/mon-util": "^1.3"
+ },
+ "time": "2022-08-15T06:45:25+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Mongdch\\WebmanUploadslice\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "MonGDCH",
+ "email": "985558837@qq.com"
+ }
+ ],
+ "description": "Webman plugin mongdch/webman-uploadslice",
+ "support": {
+ "issues": "https://github.com/MonGDCH/webman-uploadslice/issues",
+ "source": "https://github.com/MonGDCH/webman-uploadslice/tree/1.0.0"
+ },
+ "install-path": "../mongdch/webman-uploadslice"
+ },
{
"name": "monolog/monolog",
"version": "2.9.1",
@@ -3912,64 +4007,6 @@
],
"install-path": "../webmozart/assert"
},
- {
- "name": "workerman/mqtt",
- "version": "v1.5",
- "version_normalized": "1.5.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/walkor/mqtt.git",
- "reference": "7075c2dbc31449352ac83ad9e1ee2d480962779f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/walkor/mqtt/zipball/7075c2dbc31449352ac83ad9e1ee2d480962779f",
- "reference": "7075c2dbc31449352ac83ad9e1ee2d480962779f",
- "shasum": ""
- },
- "require": {
- "workerman/workerman": ">=3.3.0"
- },
- "suggest": {
- "ext-event": "For better performance. "
- },
- "time": "2023-04-21T11:23:53+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Workerman\\Mqtt\\": "./src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "walkor",
- "email": "walkor@workerman.net",
- "homepage": "https://www.workerman.net",
- "role": "Developer"
- }
- ],
- "homepage": "https://www.workerman.net",
- "keywords": [
- "event-loop",
- "mqtt",
- "mqtt3",
- "mqtt5.0",
- "mqtt_client",
- "php",
- "workerman"
- ],
- "support": {
- "email": "walkor@workerman.net",
- "issues": "https://github.com/walkor/mqtt/issues",
- "source": "https://github.com/walkor/mqtt/tree/v1.5"
- },
- "install-path": "../workerman/mqtt"
- },
{
"name": "workerman/webman-framework",
"version": "v1.5.8",
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index b42fcbf..104af2a 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -3,7 +3,7 @@
'name' => 'workerman/webman',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'e68d605171c1be1e01a8a7ae2021617a73184ec8',
+ 'reference' => '3a57936b3180850a6555ea18517b28261c9d2c4d',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -235,6 +235,24 @@
'aliases' => array(),
'dev_requirement' => false,
),
+ 'mongdch/mon-util' => array(
+ 'pretty_version' => '1.3.12',
+ 'version' => '1.3.12.0',
+ 'reference' => 'dee088b3bee124b1784d39714addb54d141447b0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../mongdch/mon-util',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
+ 'mongdch/webman-uploadslice' => array(
+ 'pretty_version' => '1.0.0',
+ 'version' => '1.0.0.0',
+ 'reference' => 'bf38ef7c9e92c5a0fc67d24828d922f4a84ec563',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../mongdch/webman-uploadslice',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
'monolog/monolog' => array(
'pretty_version' => '2.9.1',
'version' => '2.9.1.0',
@@ -725,19 +743,10 @@
'aliases' => array(),
'dev_requirement' => false,
),
- 'workerman/mqtt' => array(
- 'pretty_version' => 'v1.5',
- 'version' => '1.5.0.0',
- 'reference' => '7075c2dbc31449352ac83ad9e1ee2d480962779f',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../workerman/mqtt',
- 'aliases' => array(),
- 'dev_requirement' => false,
- ),
'workerman/webman' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => 'e68d605171c1be1e01a8a7ae2021617a73184ec8',
+ 'reference' => '3a57936b3180850a6555ea18517b28261c9d2c4d',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
diff --git a/vendor/mongdch/mon-util/.gitignore b/vendor/mongdch/mon-util/.gitignore
new file mode 100644
index 0000000..a67d42b
--- /dev/null
+++ b/vendor/mongdch/mon-util/.gitignore
@@ -0,0 +1,6 @@
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
diff --git a/vendor/mongdch/mon-util/CHANGELOG.md b/vendor/mongdch/mon-util/CHANGELOG.md
new file mode 100644
index 0000000..348526f
--- /dev/null
+++ b/vendor/mongdch/mon-util/CHANGELOG.md
@@ -0,0 +1,187 @@
+### 更新日志
+
+> 所有值得注意的版本信息都将记录在该文件中
+
+#### [1.3.12](#) (2022-07-15)
+
+- 优化文档
+- 增加`Log`日志处理类
+
+
+#### [1.3.11](https://github.com/MonGDCH/mon-util/commit/de7fe3ffd752e7051a9624f2fe500bba932b6ead) (2022-07-13)
+
+* 优化`Sql`类
+* 优化`Dictionary`类
+* 增加`Migrate`Mysql数据库备份迁移类
+
+
+#### [1.3.10](https://github.com/MonGDCH/mon-util/commit/95b3be663e8807b17bf6c9af9c6f27707df20b68) (2022-05-18)
+
+* 优化代码
+* `Tool`类增加base64图片转换方法
+
+
+#### [1.3.9](https://github.com/MonGDCH/mon-util/commit/1a689833b9cf22edc7bc68dab0725b89664667bb) (2022-04-21)
+
+* 优化代码
+* 增加UploadSilce类,用户处理大文件分片上传
+* 增加Pinyin类,中文转拼音
+
+
+#### [1.3.8](https://github.com/MonGDCH/mon-util/commit/a9b5dd32ae15f77caa569e03fe9e9606a11e1976) (2022-01-24)
+
+* 优化增加文件导出压缩包 Tool::exportZip 方法
+* 增加 Tool::exportZipForDir 方法,压缩导出整个目录
+* 优化代码注解
+* 补全版本
+
+
+#### [1.3.7](https://github.com/MonGDCH/mon-util/commit/a5beb3ed528fd8e00e52f84648bafc5f84e08361) (2021-11-05)
+
+* 优化增强Image类
+* 补全版本
+
+
+#### [1.3.6](https://github.com/MonGDCH/mon-util/commit/aba7e439f7f17bf8d0e0d3d1fd2757b4e1641549) (2021-10-14)
+
+* 优化代码
+
+
+#### [1.3.5](https://github.com/MonGDCH/mon-util/commit/7b4d9401ade441d79350cf2acc7d85a2175e1031) (2021-08-25)
+
+* 优化代码,`Client`类更改为`Network`类,优化错误处理,增加模拟表单文件上传功能
+* 优化`Date`类,增加获取年月日周等开始时间及结束时间
+
+
+#### [1.3.4](https://github.com/MonGDCH/mon-util/commit/b52464f523c05464c7a48bc6ebf3b1d7f1222fce) (2021-08-11)
+
+* 优化代码,移除`Tool`类中的TCP、UDP方法
+* 增加`Client`类,支持HTTP、TCP、UDP请求
+
+
+#### [1.3.3](https://github.com/MonGDCH/mon-util/commit/499ce3d6c5b3c91d200b4543e8e5786d0f305017) (2021-07-01)
+
+* 优化代码,增强验证器
+* File类增加 `copyDir` 文件夹复制方法
+
+
+#### [1.3.2](https://github.com/MonGDCH/mon-util/commit/8495104332a7d4d73b2fc21bb1ad51bb3314e3cb) (2021-04-26)
+
+* 优化代码,优化错误处理机制
+* Validate类check方法统一返回boolean值,通过getError方法获取错误信息
+* 移除部分内置函数
+
+
+#### [1.3.1](https://github.com/MonGDCH/mon-util/commit/1de8c9a6c935b1b37823eda6c40585487c54aafe) (2021-03-18)
+
+* 优化代码,优化错误处理机制
+* 移除Validate类内置单例模式,增加confirm、eq方法
+* 移除Date类内置单例模式,优化业务逻辑
+* 优化IdCard类,增加根据身份证号获取所属省市区地址
+* 增加Lottery类,概率抽奖工具类
+
+
+#### [1.2.10](https://github.com/MonGDCH/mon-util/commit/ce683230948c6ade093a1ad8f1e038ec1cab5962) (2021-03-11)
+
+* 增加Sql类,用于解析SQL文件,获取sql操作语句
+* 增加IdCard类,用于处理身份证相关的业务
+
+
+#### [1.2.9](https://github.com/MonGDCH/mon-util/commit/ece2233632916f89e0fd51719c0da683f98598cb) (2021-03-08)
+
+* 增加DocParse类,用于PHP文档解析
+
+
+#### [1.2.8](https://github.com/MonGDCH/mon-util/commit/b0024ac96d4311554a767bd9cad0e93c893d9058) (2021-03-01)
+
+* 优化代码
+* 从[mongdch/mon-container]迁移container类库,优化类库
+* 增加File文件操作类库
+
+
+#### [1.2.7](https://github.com/MonGDCH/mon-util/commit/d7d5f4bd76acfb1844b3ba69397dd2a86010da47) (2021-02-03)
+
+* 优化代码
+* 增加IPLocatoin类,用于处理基于纯真IP库的地址定位
+
+
+#### [1.2.6](https://github.com/MonGDCH/mon-util/commit/d816217e31ab2d715a2c8c73d250b6dc583ae19f) (2021-01-28)
+
+* 优化id加密生成code类
+
+
+#### [1.2.5](https://github.com/MonGDCH/mon-util/commit/6b14c1e22ba031c8ff3bb5b735741365a9e202e4) (2020-12-09)
+
+* 优化代码
+* 增加更多的工具方法
+
+
+#### [1.2.4](https://github.com/MonGDCH/mon-util/commit/75139eb2f4e6e190fd23556913e053f9aec1fc66) (2020-11-30)
+
+* 优化decryption字符串解密方法
+* 增加Tool类download方法,用于下载保存文件
+* 增加IdCode类,用于将int类型的ID值转为code值
+
+
+#### [1.2.3](https://github.com/MonGDCH/mon-util/commit/9bb8f1c810bfac4e801a3b0ec7d6003e3bacb212) (2020-11-25)
+
+* 优化验证器,验证器规则支持数组定义
+* 增加Qrcode二维码工具类、增加Tool类getDistance方法用于获取两个坐标距离
+* 增加Tool类exportZip、unZip、qrcode等方法,同步支持直接方法名调用
+
+
+#### [1.2.2](https://github.com/MonGDCH/mon-util/commit/031e6c308918f56e190863cc028bdf1984fdbcc8) (2020-06-29)
+
+* 优化代码,使用PHP自带的filter_var方法验证邮件及IP类型
+* 增加Tool类safe_ip方法,用于验证IP白名单或黑名单
+
+
+#### [1.2.1](https://github.com/MonGDCH/mon-util/commit/6473e5e18b8215a7f33978b53340f61c0b398d91) (2020-06-16)
+
+* 优化代码
+
+
+#### [1.2.0](https://github.com/MonGDCH/mon-util/commit/b6036ea7db9c8e2161cd6a5d91e4281e7dff5e86) (2020-05-30)
+
+* 优化代码,增加注解
+* 增加工具类函数调用方式
+
+
+#### [1.1.0](https://github.com/MonGDCH/mon-util/commit/cf1dcf3f389abdaab2530de568fc28a5e30b6352) (2019-12-20)
+
+* 优化代码
+* 增加Dictionary类,用于做数据字典
+
+
+#### [1.0.4](https://github.com/MonGDCH/mon-util/commit/4e0925df23fcca06f2e903fb27654175b8c5ecc7) (2019-09-12)
+
+* 优化代码
+* 移除Form类
+* 增加Lang多语言操作类
+
+
+#### [1.0.3](https://github.com/MonGDCH/mon-util/commit/9c8bcf2724df50685804eb735bb9532d2e5a97f0) (2019-06-15)
+
+* 修正函数缺失的BUG
+* 优化代码
+
+
+#### [1.0.2](https://github.com/MonGDCH/mon-util/commit/d51b57dd00043aaa687ab9e0a6bfe22a55876a8d) (2019-06-14)
+
+* 验证器使用场景验证的情况下,字段未设置【required】验证规则,仍然必须存在字段BUG
+* 增加Image类、UploadFile类、GIF类
+* 优化代码结构
+
+
+#### [1.0.1](https://github.com/MonGDCH/mon-util/commit/6e4456b222ec84db045d6b1bc9d41596b69f13d6) (2019-04-18)
+
+* 增强Common类、Tool类功能函数
+* 增加From类、Instance类
+* 优化代码结构
+
+
+#### [1.0.0](https://github.com/MonGDCH/mon-util/commit/30c2688aca8875bdf6b49c6c79b561ebd704f93e) (2019-04-11)
+
+- 发布第一个版本
+
+
diff --git a/vendor/mongdch/mon-util/LICENSE b/vendor/mongdch/mon-util/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/vendor/mongdch/mon-util/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/mongdch/mon-util/README.md b/vendor/mongdch/mon-util/README.md
new file mode 100644
index 0000000..b64b4ee
--- /dev/null
+++ b/vendor/mongdch/mon-util/README.md
@@ -0,0 +1,48 @@
+# mon-util
+
+> PHP常用工具、辅助类集合,包含各种常用的类库
+
+
+* Container类,对象容器
+* Date类,时间操作
+* Instance类, trait单例实现
+* Tree类,树结构操作
+* UpdateImg类,base64图片上传
+* UpdateFile类,文件上传
+* File类,文件操作
+* Validate类,验证器
+* Tool类,常用工具类库函数
+* Common类,公共工具函数库
+* Image类,图片处理工具
+* UploadFile类,文件上传
+* GIF类,辅助Image类进行GIF图片处理
+* Lang类,多语言操作
+* Dictionary类,数据字典
+* IdCode类,用于整形ID加密转短字符串,可结合应用用于生成短链接
+* IPLocation类,基于纯真IP库的ip地址定位,解析GBK数据输出UTF8编码地址
+* Qrcode类,用于生成图片二维码
+* DocParse类,解析PHP类对象注解,生成文档
+* Sql类,解析SQL文件,获取sql操作语句
+* IdCard类,处理身份证相关的业务工具类
+* Lottery类,概率抽奖工具类
+* Nework类,网络客户端工具类
+* UploadSilce类,处理大文件分片上传
+* Pinyin类,中文转拼音
+* Migrate类,Mysql数据库备份迁移
+* Log类,日志处理
+
+
+## 安装
+
+```bash
+composer require mongdch/mon-util
+```
+
+## 致谢
+
+感谢您的支持和阅读,如果有什么不足的地方或者建议还请@我,如果你觉得对你有帮助的话还请给个star。
+
+
+## 关于
+
+作者邮箱: 985558837@qq.com
\ No newline at end of file
diff --git a/vendor/mongdch/mon-util/composer.json b/vendor/mongdch/mon-util/composer.json
new file mode 100644
index 0000000..090d911
--- /dev/null
+++ b/vendor/mongdch/mon-util/composer.json
@@ -0,0 +1,28 @@
+{
+ "name": "mongdch/mon-util",
+ "description": "常用的PHP工具类库,包含了各种各式各样的工具,如:容器、时间、验证器、多语言、图片、二维码、IP地址、文件上传、文件操作、加解密、数据字典、各种算法等等等等。。。",
+ "license": "Apache-2.0",
+ "keywords": [
+ "mon",
+ "util",
+ "tool"
+ ],
+ "homepage": "http://www.gdmon.com",
+ "authors": [
+ {
+ "name": "MonGDCH",
+ "email": "985558837@qq.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "mon\\util\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/vendor/mongdch/mon-util/composer.lock b/vendor/mongdch/mon-util/composer.lock
new file mode 100644
index 0000000..06fae61
--- /dev/null
+++ b/vendor/mongdch/mon-util/composer.lock
@@ -0,0 +1,20 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "39b00a050ae84046e9557c615fbfe782",
+ "packages": [],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.6.0"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.2.0"
+}
diff --git a/vendor/mongdch/mon-util/example/container.php b/vendor/mongdch/mon-util/example/container.php
new file mode 100644
index 0000000..9f77dfd
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/container.php
@@ -0,0 +1,29 @@
+bind('dump', function ($ages) {
+ debug($ages);
+});
+
+// 调用
+Container::instance()->get('dump', ['asdfgg']);
+
+
+// 绑定对象
+Container::set('t', T::class);
+
+// 调用
+Container::instance()->t->test('aaasd');
diff --git a/vendor/mongdch/mon-util/example/docparse.php b/vendor/mongdch/mon-util/example/docparse.php
new file mode 100644
index 0000000..37f068c
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/docparse.php
@@ -0,0 +1,53 @@
+parseClass(DemoTest::class);
+debug($data);
+
+class DemoTest
+{
+ /**
+ * 测试方法
+ *
+ * @param string $a 字符串参数
+ * @param integer $b 整型参数
+ * @param float $c 浮点型
+ * @param Test $d 对象类型
+ * @param array $e 数组类型
+ * @author Mon <985558837@qq.com>
+ * @copyright MonLam
+ * @deprecated deprecated test
+ * @example location description
+ * @final lalala
+ * @global 全局的xxx
+ * @ignore skldgkasgj for ignore
+ * @license MIT
+ * @link http://url.com
+ * @package ppap
+ * @abstract ccccc
+ * @static staticcccc
+ * @var mixed
+ * @version 1.0.0
+ * @todo Something
+ * @throws Exception 的事实
+ * @return void 无
+ */
+ public function test($a, $b, $c, $d, $e)
+ {
+ return false;
+ }
+
+ /**
+ * demo方法
+ *
+ * @return array
+ */
+ public function demo()
+ {
+ return [];
+ }
+}
diff --git a/vendor/mongdch/mon-util/example/http.php b/vendor/mongdch/mon-util/example/http.php
new file mode 100644
index 0000000..1a75ee4
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/http.php
@@ -0,0 +1,14 @@
+sendFile($url, $path, ['a' => 1, 'b' => 2]);
+
+var_dump($data);
diff --git a/vendor/mongdch/mon-util/example/index.php b/vendor/mongdch/mon-util/example/index.php
new file mode 100644
index 0000000..8ea1d6c
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/index.php
@@ -0,0 +1,50 @@
+img_base64('111.jpg');
+// $img = Tool::instance()->base64_img($base64, '222.jpg');
+// debug($base64);
+// debug($img);
+
+
+// $create = Tool::instance()->createTicket('123456', '123456', 3600, 'aaa', 'aaa_time');
+
+// $check = Tool::instance()->checkTicket('123456');
+// debug($check);
+
+$check = check('num', '1');
+debug($check);
+
+class V extends Validate
+{
+ use Instance;
+
+ public $rule = [
+ 'a' => 'required|num',
+ 'b' => 'required|str',
+ 'c' => 'confirm:b'
+ ];
+
+ public $message = [
+ 'a' => 'a错误',
+ 'b' => 'b错误',
+ 'c' => 'c错误'
+ ];
+}
+
+$data = [
+ 'a' => '1',
+ 'b' => '1123',
+ 'c' => '1123'
+];
+$check = V::instance()->data($data)->check();
+debug($check);
+if (!$check) {
+ debug(V::instance()->getError());
+}
diff --git a/vendor/mongdch/mon-util/example/iplocation.php b/vendor/mongdch/mon-util/example/iplocation.php
new file mode 100644
index 0000000..245de2d
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/iplocation.php
@@ -0,0 +1,17 @@
+getLocation($ip);
+
+$location = IPLocation::instance()->init($qqwry)->getLocation($ip);
+
+debug($location);
diff --git a/vendor/mongdch/mon-util/example/lottery.php b/vendor/mongdch/mon-util/example/lottery.php
new file mode 100644
index 0000000..7feb9bd
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/lottery.php
@@ -0,0 +1,20 @@
+ array('id' => 1, 'title' => '平板电脑', 'probability' => 0.5),
+ '1' => array('id' => 2, 'title' => '数码相机', 'probability' => 0.15),
+ '2' => array('id' => 3, 'title' => '音箱设备', 'probability' => 0.25),
+ '3' => array('id' => 4, 'title' => '4G优盘', 'probability' => 24.5),
+ '4' => array('id' => 5, 'title' => '10Q币', 'probability' => 3.5),
+);
+
+$lottery = new Lottery();
+// 初始化抽奖配置,抽奖
+$gift = $lottery->init($awards)->getDraw();
+debug($gift);
diff --git a/vendor/mongdch/mon-util/example/migrate.php b/vendor/mongdch/mon-util/example/migrate.php
new file mode 100644
index 0000000..0468ec6
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/migrate.php
@@ -0,0 +1,63 @@
+ './data/',
+ // 数据库备份卷大小
+ 'part' => 20971520,
+ // 数据库备份文件是否启用压缩 0不压缩 1 压缩
+ 'compress' => 1,
+ // 压缩级别
+ 'level' => 9,
+ // 数据库配置
+ 'db' => [
+ // 数据库类型
+ 'type' => 'mysql',
+ // 服务器地址
+ 'host' => '127.0.0.1',
+ // 数据库名
+ 'database' => 'test',
+ // 用户名
+ 'username' => 'root',
+ // 密码
+ 'password' => 'root',
+ // 端口
+ 'port' => '3306',
+ // 数据库编码默认采用utf8
+ 'charset' => 'utf8mb4',
+ // 数据库连接参数
+ 'params' => []
+ ]
+];
+
+// 获取所有表格信息
+$tableList = Migrate::instance($config)->tableList();
+// 获取指定表格结构
+$tableStruct = Migrate::instance()->tableStruct('record');
+// 获取生成的备份文件列表
+$fileList = Migrate::instance()->fileList();
+// 获取指定备份文件信息
+$fileInfo = Migrate::instance()->fileInfo();
+// 删除备份文件
+// $del = Migrate::instance()->del();
+// 备份指定表
+// $backup = Migrate::instance()->backup('record');
+// 备份所有数据表
+// $migrate = Migrate::instance()->migrate();
+
+
+// 下载导出,参数为$fileList返回结果集中对应的time字段值
+// $export = Migrate::instance()->export(1657692293);
+
+// 导入,参数为$fileList返回结果集中对应的time字段值
+// $import = Migrate::instance()->import(1657696160);
+// debug($tableList);
+
+$d = new Dictionary($config['db']);
+echo $d->getHTML();
\ No newline at end of file
diff --git a/vendor/mongdch/mon-util/example/pinyin.php b/vendor/mongdch/mon-util/example/pinyin.php
new file mode 100644
index 0000000..8ba7baa
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/pinyin.php
@@ -0,0 +1,9 @@
+format('我是拼 音,一起 拼音!');
+
diff --git a/vendor/mongdch/mon-util/example/qrcode.php b/vendor/mongdch/mon-util/example/qrcode.php
new file mode 100644
index 0000000..c4d8050
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/qrcode.php
@@ -0,0 +1,11 @@
+qrcode('https://gdmon.com/');
+// QRcode::png('https://gdmon.com/', false, QR_ECLEVEL_L, 8, 1);
+// QRcode::png('https://gdmon.com/', 'a.png', QR_ECLEVEL_L, 12, 1, true);
diff --git a/vendor/mongdch/mon-util/example/socket.php b/vendor/mongdch/mon-util/example/socket.php
new file mode 100644
index 0000000..c140d8a
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/socket.php
@@ -0,0 +1,10 @@
+sendTCP('127.0.0.1', '8818', 'test');
+
+debug($result);
+// debug($result);
\ No newline at end of file
diff --git a/vendor/mongdch/mon-util/example/upload.php b/vendor/mongdch/mon-util/example/upload.php
new file mode 100644
index 0000000..5aaab56
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/upload.php
@@ -0,0 +1,35 @@
+
+
+
+ upfile
+
+
+ __DIR__ . '/upload/',
+ 'exts' => ['jpg']
+ ]);
+
+ try {
+ // 获取上传文件信息
+ $info = $file->upload()->getFile();
+ var_dump($file);
+ $save = $file->save()->getFile();
+ var_dump($save);
+ } catch (\mon\util\exception\UploadException $e) {
+ var_dump($e->getMessage(), $e->getCode());
+ }
+ } else {
+ ?>
+
+
+
+
\ No newline at end of file
diff --git a/vendor/mongdch/mon-util/example/upload_slice.html b/vendor/mongdch/mon-util/example/upload_slice.html
new file mode 100644
index 0000000..ab6874c
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/upload_slice.html
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+ 多线程异步大文件分片上传
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vendor/mongdch/mon-util/example/upload_slice.php b/vendor/mongdch/mon-util/example/upload_slice.php
new file mode 100644
index 0000000..c7c5646
--- /dev/null
+++ b/vendor/mongdch/mon-util/example/upload_slice.php
@@ -0,0 +1,140 @@
+ [],
+ // 分片文件大小限制
+ 'sliceSize' => 1024 * 1024 * 2,
+ // 保存根路径
+ 'rootPath' => __DIR__ . DIRECTORY_SEPARATOR . 'upload',
+ // 临时文件存储路径,基于rootPath
+ 'tmpPath' => 'tmp'
+ ];
+
+ /**
+ * 文件上传
+ *
+ * @return void
+ */
+ public function upload()
+ {
+ if (empty($_POST)) {
+ return $this->result(0, 'query faild');
+ }
+ // 验证数据
+ $validate = new Validate();
+ $check = $validate->data($_POST)->rule([
+ 'action' => ['in:slice,merge'],
+ 'filename' => ['required', 'str'],
+ 'chunk' => ['int', 'min:0'],
+ 'chunkLength' => ['required', 'int', 'min:0'],
+ 'uuid' => ['required', 'str']
+ ])->message([
+ 'action' => 'action faild',
+ 'filename' => 'filename faild',
+ 'chunk' => 'chunk faild',
+ 'chunkLength' => 'chunkLength faild',
+ 'uuid' => 'uuid faild'
+ ])->check();
+ if (!$check) {
+ return $this->result(0, $validate->getError());
+ }
+ if ($_POST['action'] == 'slice' && !isset($_POST['chunk'])) {
+ return $this->result(0, 'chunk required');
+ }
+ if ($_POST['action'] == 'slice' && empty($_FILES)) {
+ return $this->result(0, 'upload faild');
+ }
+
+ // 处理上传业务
+ $action = $this->post('action');
+ $filename = $this->post('filename');
+ $chunk = $this->post('chunk');
+ $chunkLength = $this->post('chunkLength');
+ $uuid = $this->post('uuid');
+ $upload = new UploadSlice($this->config);
+ try {
+ if ($action == 'slice') {
+ // 保存分片
+ $save = $upload->upload($uuid, $chunk);
+ return $this->result(1, 'ok', $save);
+ }
+ // 合并
+ $merge = $upload->merge($uuid, $chunkLength, $filename);
+ return $this->result(1, 'ok', $merge);
+ } catch (UploadException $e) {
+ return $this->result(0, $e->getMessage());
+ }
+ }
+
+ /**
+ * GET参数
+ *
+ * @param string $field
+ * @param string $default
+ * @return mixed
+ */
+ protected function get($field, $default = '')
+ {
+ return isset($_GET[$field]) ? $_GET[$field] : $default;
+ }
+
+ /**
+ * POST参数
+ *
+ * @param string $field
+ * @param string $default
+ * @return mixed
+ */
+ protected function post($field, $default = '')
+ {
+ return isset($_POST[$field]) ? $_POST[$field] : $default;
+ }
+
+ /**
+ * 返回json
+ *
+ * @param integer $code
+ * @param string $msg
+ * @param array $data
+ * @return void
+ */
+ protected function result($code, $msg, $data = [])
+ {
+ $result = json_encode([
+ 'code' => $code,
+ 'msg' => $msg,
+ // 'data' => $this->m_mb_convert_encoding($data)
+ 'data' => $data
+ ], JSON_UNESCAPED_UNICODE);
+
+ echo $result;
+ }
+
+ protected function m_mb_convert_encoding($string)
+ {
+ if (is_array($string)) {
+ foreach ($string as $key => $value) {
+ $string[$key] = $this->m_mb_convert_encoding($value);
+ }
+
+ return $string;
+ }
+
+ return mb_convert_encoding($string, 'UTF-8', 'UTF-8');
+ }
+}
+(new App())->upload();
diff --git a/vendor/mongdch/mon-util/src/Common.php b/vendor/mongdch/mon-util/src/Common.php
new file mode 100644
index 0000000..b96c99b
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Common.php
@@ -0,0 +1,751 @@
+
+ * @version 1.1.1 优化代码 2022-07-8
+ */
+class Common
+{
+ use Instance;
+
+ /**
+ * 字符串编码过滤(中文、英文、数字不过滤,只过滤特殊字符)
+ *
+ * @param string $src 安全转码的字符串
+ * @return string
+ */
+ public function encodeEX($src)
+ {
+ $result = '';
+ $len = mb_strlen($src);
+ $encode_buf = '';
+ for ($i = 0; $i < $len; $i++) {
+ $sChar = mb_substr($src, $i, 1);
+ switch ($sChar) {
+ case "~":
+ case "`":
+ case "!":
+ case "@":
+ case "#":
+ case "$":
+ case "%":
+ case "^":
+ case "&":
+ case "*":
+ case "(":
+ case ")":
+ case "-":
+ case "_":
+ case "+":
+ case "=":
+ case "{":
+ case "}":
+ case "[":
+ case "]":
+ case "|":
+ case "\\":
+ case ";":
+ case ":":
+ case "\"":
+ case ",":
+ case "<":
+ case ">":
+ case ".":
+ case "?":
+ case "/":
+ case " ":
+ case "'":
+ case "\"":
+ case "\n":
+ case "\r":
+ case "\t":
+ $encode_buf = sprintf("%%%s", bin2hex($sChar));
+ $result .= $encode_buf;
+ break;
+ default:
+ $result .= $sChar;
+ break;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * 字符串解码(对应encodeEX)
+ *
+ * @param string $src 安全解码的字符串
+ * @return string
+ */
+ public function decodeEX($src)
+ {
+ $result = '';
+ $len = mb_strlen($src);
+ for ($i = 0; $i < $len; $i++) {
+ $sChar = mb_substr($src, $i, 1);
+ if ($sChar == '%' && $i < ($len - 2) && $this->IsXDigit(mb_substr($src, $i + 1, 1)) && $this->IsXDigit(mb_substr($src, $i + 2, 1))) {
+ $chDecode = mb_substr($src, $i + 1, 2);
+ $result .= pack("H*", $chDecode);
+ $i += 2;
+ } else {
+ $result .= $sChar;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * 字符串加密方法
+ *
+ * @param string $str 加密的字符串
+ * @param string $salt 加密盐
+ * @return string
+ */
+ public function encryption($str, $salt)
+ {
+ $str = base64_encode($this->randString(4, 5) . "." . $str . "." . $this->randString(4, 5));
+ $key = base64_encode($salt);
+ $str = base64_encode($str);
+ $mix = mb_strlen($key) >= mb_strlen($str) ? ceil(mb_strlen($key) / mb_strlen($str)) : ceil(mb_strlen($str) / mb_strlen($key));
+ $temp = str_split($str);
+ $ftmp = str_split($key);
+ foreach ($ftmp as $k => $v) {
+ isset($temp[$k * $mix]) && $temp[$k * $mix] .= $v;
+ }
+ $str = str_replace(array("=", "+", "/"), array("i00i", "k00k", "z00z"), implode($temp));
+ return base64_encode($str);
+ }
+
+ /**
+ * 字符串解密方法
+ *
+ * @param string $str 解密的字符串
+ * @param string $salt 解密的盐
+ * @return string
+ */
+ public function decryption($str, $salt)
+ {
+ $str = base64_decode($str);
+ if (empty($str)) {
+ return '';
+ };
+ $key = base64_encode($salt);
+ $str = str_replace(array("i00i", "k00k", "z00z"), array("=", "+", "/"), $str);
+ $mix = mb_strlen($key) >= mb_strlen($str) ? ceil(mb_strlen($key) / mb_strlen($str)) : ceil(mb_strlen($str) / mb_strlen($key));
+ $temp = str_split($str);
+ for ($k = 0; $k < mb_strlen($key); $k++) {
+ if (!isset($temp[$k * $mix + 1])) {
+ break;
+ }
+ unset($temp[$k * $mix + 1]);
+ }
+ $str = base64_decode(base64_decode(implode($temp)));
+ $_arr = explode(".", $str);
+ return isset($_arr[1]) ? $_arr[1] : null;
+ }
+
+ /**
+ * 判断是否为16进制,由于PHP没有相关的API,所以折中处理
+ *
+ * @param string $src 验证的字符串
+ * @return boolean
+ */
+ public function isXDigit($src)
+ {
+ if (mb_strlen($src) < 1) {
+ return false;
+ }
+ if (($src >= '0' && $src <= '9') || ($src >= 'A' && $src <= 'F') || ($src >= 'a' && $src <= 'f')) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * 检查字符串是否是UTF8编码
+ *
+ * @param string $string 验证的字符串
+ * @return boolean
+ */
+ public function isUtf8($str)
+ {
+ $c = 0;
+ $b = 0;
+ $bits = 0;
+ $len = mb_strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $c = ord($str[$i]);
+ if ($c > 128) {
+ if (($c >= 254)) {
+ return false;
+ } elseif ($c >= 252) {
+ $bits = 6;
+ } elseif ($c >= 248) {
+ $bits = 5;
+ } elseif ($c >= 240) {
+ $bits = 4;
+ } elseif ($c >= 224) {
+ $bits = 3;
+ } elseif ($c >= 192) {
+ $bits = 2;
+ } else {
+ return false;
+ }
+
+ if (($i + $bits) > $len) {
+ return false;
+ }
+ while ($bits > 1) {
+ $i++;
+ $b = ord($str[$i]);
+ if ($b < 128 || $b > 191) {
+ return false;
+ }
+ $bits--;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 获取余数
+ *
+ * @param integer $bn 被除数
+ * @param integer $sn 除数
+ * @return float 余
+ */
+ public function mod($bn, $sn)
+ {
+ $mod = intval(fmod(floatval($bn), $sn));
+ return abs($mod);
+ }
+
+ /**
+ * 返回正数的ip2long值
+ *
+ * @param string $ip ip
+ * @return integer
+ */
+ public function ip2long_positive($ip)
+ {
+ return sprintf("%u", $this->mIp2long($ip));
+ }
+
+ /**
+ * IP地址转为数字地址
+ * php 的 ip2long 这个函数有问题
+ * 133.205.0.0 ==>> 2244804608
+ *
+ * @param string $ip 要转换的 ip 地址
+ * @return integer 转换完成的数字
+ */
+ public function mIp2long($ip)
+ {
+ $ip_arr = explode('.', $ip);
+ $iplong = (16777216 * intval($ip_arr[0])) + (65536 * intval($ip_arr[1])) + (256 * intval($ip_arr[2])) + intval($ip_arr[3]);
+
+ return $iplong;
+ }
+
+ /**
+ * 递归转换数组数据为XML,只作为exportXML的辅助方法使用
+ *
+ * @param array $data 输出的数据
+ * @return string
+ */
+ public function arrToXML(array $data)
+ {
+ $xml = '';
+ foreach ($data as $key => $val) {
+ $xml .= "<{$key}>";
+ $xml .= (is_array($val) || is_object($val)) ? $this->arrToXML($val) : $val;
+ $xml .= "{$key}>";
+ }
+
+ return $xml;
+ }
+
+ /**
+ * XML转数组
+ *
+ * @param string $xml
+ * @return array
+ */
+ public function xmlToArr($xml)
+ {
+ $obj = simplexml_load_string($xml);
+ $json = json_encode($obj);
+ return json_decode($json, true);
+ }
+
+ /**
+ * URI字符串转数组
+ *
+ * @param string $str 入参,待转换的字符串
+ * @return array 字符数组
+ */
+ public function strToMap($str)
+ {
+ $str = trim($str);
+ $infoMap = array();
+ $strArr = explode("&", $str);
+ for ($i = 0; $i < count($strArr); $i++) {
+ $infoArr = explode("=", $strArr[$i]);
+ if (count($infoArr) != 2) {
+ continue;
+ }
+ $infoMap[$infoArr[0]] = $infoArr[1];
+ }
+ return $infoMap;
+ }
+
+ /**
+ * 数组转字符串
+ *
+ * @param array $map 入参,待转换的数组
+ * @return string
+ */
+ public function mapToStr(array $map)
+ {
+ $str = "";
+ if (!empty($map)) {
+ foreach ($map as $k => $v) {
+ $str .= "&" . $k . "=" . $v;
+ }
+ }
+
+ return $str;
+ }
+
+ /**
+ * 二维数组去重(键&值不能完全相同)
+ *
+ * @param array $arr 需要去重的数组
+ * @return array
+ */
+ public function array_2D_unique(array $arr)
+ {
+ foreach ($arr as $v) {
+ // 降维,将一维数组转换为用","连接的字符串.
+ $v = implode(",", $v);
+ $result[] = $v;
+ }
+ // 去掉重复的字符串,也就是重复的一维数组
+ $result = array_unique($result);
+
+ // 重组数组
+ foreach ($result as $k => $v) {
+ // 再将拆开的数组重新组装
+ $result[$k] = explode(",", $v);
+ }
+ sort($result);
+
+ return $result;
+ }
+
+ /**
+ * 二维数组去重(值不能相同)
+ *
+ * @param array $arr 需要去重的数组
+ * @return array
+ */
+ public function array_2D_value_unique(array $arr)
+ {
+ $tmp = array();
+ foreach ($arr as $k => $v) {
+ // 搜索$v[$key]是否在$tmp数组中存在,若存在返回true
+ if (in_array($v, $tmp)) {
+ unset($arr[$k]);
+ } else {
+ $tmp[] = $v;
+ }
+ }
+ sort($arr);
+
+ return $arr;
+ }
+
+ /**
+ * 是否为关联数组
+ *
+ * @param array $array 验证码的数组
+ * @return boolean
+ */
+ public function isAssoc(array $array)
+ {
+ $keys = array_keys($array);
+ return array_keys($keys) !== $keys;
+ }
+
+ /**
+ * 二维数组排序
+ *
+ * @param array $array 排序的数组
+ * @param string $keys 排序的键名
+ * @param integer $sort 排序方式,默认值:SORT_DESC
+ * @return array
+ */
+ public function array2DSort($array, $keys, $sort = SORT_DESC)
+ {
+ $keysValue = [];
+ foreach ($array as $k => $v) {
+ $keysValue[$k] = $v[$keys];
+ }
+ array_multisort($keysValue, $sort, $array);
+ return $array;
+ }
+
+ /**
+ * php获取中文字符拼音首字母
+ *
+ * @param string $str 中文字符串
+ * @return string
+ */
+ public function getFirstChar($str)
+ {
+ if (empty($str)) {
+ return '';
+ }
+ $fchar = ord($str[0]);
+ if ($fchar >= ord('A') && $fchar <= ord('z')) {
+ return strtoupper($str[0]);
+ }
+ $s1 = iconv('UTF-8', 'gb2312', $str);
+ $s2 = iconv('gb2312', 'UTF-8', $s1);
+ $s = $s2 == $str ? $s1 : $str;
+ if (empty($s[1])) {
+ return '';
+ }
+ $asc = ord($s[0]) * 256 + ord($s[1]) - 65536;
+ if ($asc >= -20319 && $asc <= -20284) return 'A';
+ if ($asc >= -20283 && $asc <= -19776) return 'B';
+ if ($asc >= -19775 && $asc <= -19219) return 'C';
+ if ($asc >= -19218 && $asc <= -18711) return 'D';
+ if ($asc >= -18710 && $asc <= -18527) return 'E';
+ if ($asc >= -18526 && $asc <= -18240) return 'F';
+ if ($asc >= -18239 && $asc <= -17923) return 'G';
+ if ($asc >= -17922 && $asc <= -17418) return 'H';
+ if ($asc >= -17417 && $asc <= -16475) return 'J';
+ if ($asc >= -16474 && $asc <= -16213) return 'K';
+ if ($asc >= -16212 && $asc <= -15641) return 'L';
+ if ($asc >= -15640 && $asc <= -15166) return 'M';
+ if ($asc >= -15165 && $asc <= -14923) return 'N';
+ if ($asc >= -14922 && $asc <= -14915) return 'O';
+ if ($asc >= -14914 && $asc <= -14631) return 'P';
+ if ($asc >= -14630 && $asc <= -14150) return 'Q';
+ if ($asc >= -14149 && $asc <= -14091) return 'R';
+ if ($asc >= -14090 && $asc <= -13319) return 'S';
+ if ($asc >= -13318 && $asc <= -12839) return 'T';
+ if ($asc >= -12838 && $asc <= -12557) return 'W';
+ if ($asc >= -12556 && $asc <= -11848) return 'X';
+ if ($asc >= -11847 && $asc <= -11056) return 'Y';
+ if ($asc >= -11055 && $asc <= -10247) return 'Z';
+ return null;
+ }
+
+ /**
+ * 生成UUID 单机使用
+ *
+ * @return string
+ */
+ public function uuid()
+ {
+ $charid = md5(uniqid(mt_rand(), true));
+ $hyphen = chr(45); // "-"
+ $uuid = mb_substr($charid, 0, 8) . $hyphen
+ . mb_substr($charid, 8, 4) . $hyphen
+ . mb_substr($charid, 12, 4) . $hyphen
+ . mb_substr($charid, 16, 4) . $hyphen
+ . mb_substr($charid, 20, 12);
+
+ return $uuid;
+ }
+
+ /**
+ * 生成Guid主键
+ *
+ * @return string
+ */
+ public function keyGen()
+ {
+ return str_replace('-', '', mb_substr($this->uuid(), 1, -1));
+ }
+
+ /**
+ * 字符串截取,支持中文和其他编码
+ *
+ * @param string $str 需要转换的字符串
+ * @param string $start 开始位置
+ * @param string $length 截取长度
+ * @param string $charset 编码格式
+ * @param string $suffix 截断显示字符
+ * @return string
+ */
+ public function mSubstr($str, $length, $start = 0, $charset = "utf-8", $suffix = true)
+ {
+ if (function_exists("mb_substr")) {
+ $slice = mb_substr($str, $start, $length, $charset);
+ } elseif (function_exists('iconv_substr')) {
+ $slice = iconv_substr($str, $start, $length, $charset);
+ } else {
+ $re['utf-8'] = '/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/';
+ $re['gb2312'] = '/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/';
+ $re['gbk'] = '/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/';
+ $re['big5'] = '/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/';
+ preg_match_all($re[$charset], $str, $match);
+ $slice = join('', array_slice($match[0], $start, $length));
+ }
+
+ return $suffix ? $slice . '...' : $slice;
+ }
+
+ /**
+ * 产生随机字串,可用来自动生成密码
+ * 默认长度6位 字母和数字混合 支持中文
+ *
+ * @param string $len 长度
+ * @param string $type 字串类型,0:字母;1:数字;2:大写字母;3:小写字母;4:中文;5:字母数字混合;othor:过滤掉混淆字符的字母数字组合
+ * @param string $addChars 额外字符
+ * @return string
+ */
+ public function randString($len = 6, $type = '', $addChars = '')
+ {
+ $str = '';
+ switch ($type) {
+ case '0':
+ $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' . $addChars;
+ break;
+ case '1':
+ $chars = str_repeat('0123456789' . $addChars, 3);
+ break;
+ case '2':
+ $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . $addChars;
+ break;
+ case '3':
+ $chars = 'abcdefghijklmnopqrstuvwxyz' . $addChars;
+ break;
+ case '4':
+ $chars = '们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借' . $addChars;
+ break;
+ case '5':
+ $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890' . $addChars;
+ break;
+ default:
+ // 默认去掉了容易混淆的字符oOLl和数字01,要添加请使用addChars参数
+ $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789' . $addChars;
+ break;
+ }
+ if ($len > 10) {
+ //位数过长重复字符串一定次数
+ $chars = ($type == 1) ? str_repeat($chars, $len) : str_repeat($chars, 5);
+ }
+ if ($type != 4) {
+ $chars = str_shuffle($chars);
+ $str = mb_substr($chars, 0, $len);
+ } else {
+ // 中文随机字
+ for ($i = 0; $i < $len; $i++) {
+ $str .= $this->msubstr($chars, floor(mt_rand(0, mb_strlen($chars, 'utf-8') - 1)), 1, 'utf-8', false);
+ }
+ }
+
+ return $str;
+ }
+
+ /**
+ * 递归转换字符集
+ *
+ * @param mixed $data 要转换的数据
+ * @param string $out_charset 输出编码
+ * @param string $in_charset 输入编码
+ * @return mixed
+ */
+ public function iconv_recursion($data, $out_charset, $in_charset)
+ {
+ switch (gettype($data)) {
+ case 'integer':
+ case 'boolean':
+ case 'float':
+ case 'double':
+ case 'NULL':
+ return $data;
+ case 'string':
+ if (empty($data) || is_numeric($data)) {
+ return $data;
+ } elseif (function_exists('mb_convert_encoding')) {
+ $data = mb_convert_encoding($data, $out_charset, $in_charset);
+ } elseif (function_exists('iconv')) {
+ $data = iconv($in_charset, $out_charset, $data);
+ }
+
+ return $data;
+ case 'object':
+ $vars = array_keys(get_object_vars($data));
+ foreach ($vars as $key) {
+ $data->$key = $this->iconv_recursion($data->$key, $out_charset, $in_charset);
+ }
+ return $data;
+ case 'array':
+ foreach ($data as $k => $v) {
+ $data[$this->iconv_recursion($k, $out_charset, $in_charset)] = $this->iconv_recursion($v, $out_charset, $in_charset);
+ }
+ return $data;
+ default:
+ return $data;
+ }
+ }
+
+ /**
+ * 笛卡尔积生成规格
+ *
+ * @param array $arr1 要进行笛卡尔积的二维数组
+ * @param array $arr2 最终实现的笛卡尔积组合,可不传
+ * @return array
+ */
+ public function specCartesian($arr1, $arr2 = [])
+ {
+ $result = [];
+ if (!empty($arr1)) {
+ // 去除第一个元素
+ $first = array_splice($arr1, 0, 1);
+ // 判断是否是第一次进行拼接
+ if (count($arr2) > 0) {
+ foreach ($arr2 as $v) {
+ foreach ($first[0]['value'] as $vs) {
+ $result[] = $v . ',' . $vs;
+ }
+ }
+ } else {
+ foreach ($first[0]['value'] as $vs) {
+ $result[] = $vs;
+ }
+ }
+ // 递归进行拼接
+ if (count($arr1) > 0) {
+ $result = $this->specCartesian($arr1, $result);
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * 字符串转Ascii码
+ *
+ * @param string $str 字符串
+ * @return string
+ */
+ public function str2ascii($str)
+ {
+ $change_after = '';
+ if (!empty($str)) {
+ // 编码处理
+ $encode = mb_detect_encoding($str);
+ if ($encode != 'UTF-8') {
+ $str = mb_convert_encoding($str, 'UTF-8', $encode);
+ }
+ // 开始转换
+ for ($i = 0, $l = mb_strlen($str); $i < $l; $i++) {
+ $temp_str = dechex(ord($str[$i]));
+ if (isset($temp_str[1])) {
+ $change_after .= $temp_str[1];
+ }
+ if (isset($temp_str[0])) {
+ $change_after .= $temp_str[0];
+ }
+ }
+ }
+ return strtoupper($change_after);
+ }
+
+ /**
+ * Ascii码转字符串
+ *
+ * @param string $ascii Ascii码
+ * @return string
+ */
+ public function ascii2str($ascii)
+ {
+ $str = '';
+ if (!empty($ascii)) {
+ // 开始转换
+ $asc_arr = str_split(strtolower($ascii), 2);
+ for ($i = 0; $i < count($asc_arr); $i++) {
+ $str .= chr(hexdec($asc_arr[$i][1] . $asc_arr[$i][0]));
+ }
+ // 编码处理
+ $encode = mb_detect_encoding($str);
+ if ($encode != 'UTF-8') {
+ $str = mb_convert_encoding($str, 'UTF-8', $encode);
+ }
+ }
+ return $str;
+ }
+
+ /**
+ * 删除字符串中的空格
+ *
+ * @param $str 要删除空格的字符串
+ * @return string 返回删除空格后的字符串
+ */
+ public function trimAll($str)
+ {
+ $str = str_replace(" ", '', $str);
+ $str = str_ireplace(array("\r", "\n", '\r', '\n'), '', $str);
+
+ return $str;
+ }
+
+ /**
+ * 将一个字符串部分字符用$re替代隐藏
+ *
+ * @param string $string 待处理的字符串
+ * @param integer $start 规定在字符串的何处开始,
+ * 正数 - 在字符串的指定位置开始
+ * 负数 - 在从字符串结尾的指定位置开始
+ * 0 - 在字符串中的第一个字符处开始
+ * @param integer $length 可选。规定要隐藏的字符串长度。默认是直到字符串的结尾。
+ * 正数 - 从 start 参数所在的位置隐藏
+ * 负数 - 从字符串末端隐藏
+ * @param string $re 替代符
+ * @return string 处理后的字符串
+ */
+ public function hidestr($string, $start = 0, $length = 0, $re = '*')
+ {
+ if (empty($string)) {
+ return false;
+ }
+ $strarr = [];
+ $mb_strlen = mb_strlen($string);
+ while ($mb_strlen) {
+ $strarr[] = mb_substr($string, 0, 1, 'utf8');
+ $string = mb_substr($string, 1, $mb_strlen, 'utf8');
+ $mb_strlen = mb_strlen($string);
+ }
+ $strlen = count($strarr);
+ $begin = $start >= 0 ? $start : ($strlen - abs($start));
+ $end = $last = $strlen - 1;
+ if ($length > 0) {
+ $end = $begin + $length - 1;
+ } elseif ($length < 0) {
+ $end -= abs($length);
+ }
+
+ for ($i = $begin; $i <= $end; $i++) {
+ $strarr[$i] = $re;
+ }
+ if ($begin >= $end || $begin >= $last || $end > $last) {
+ return false;
+ }
+
+ return implode('', $strarr);
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Container.php b/vendor/mongdch/mon-util/src/Container.php
new file mode 100644
index 0000000..00a73f2
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Container.php
@@ -0,0 +1,308 @@
+make($abstract, $vars, $newInstance);
+ }
+
+ /**
+ * 绑定一个类、闭包、实例、接口实现到容器
+ *
+ * @param string $abstract 类名称或标识符
+ * @param mixed $server 要绑定的实例
+ * @return Container
+ */
+ public static function set($abstract, $server = null)
+ {
+ return static::instance()->bind($abstract, $server);
+ }
+
+ /**
+ * 私有化构造方法
+ */
+ protected function __construct()
+ {
+ }
+
+ /**
+ * 魔术方法获取实例
+ *
+ * @param string $abstract 对象名称或标识
+ * @return mixed
+ */
+ public function __get($abstract)
+ {
+ return static::get($abstract);
+ }
+
+ /**
+ * 绑定类、闭包、实例、接口实现到容器
+ *
+ * @param mixed $abstract 类名称或标识符或者数组
+ * @param mixed $server 要绑定的实例
+ * @return Container
+ */
+ public function bind($abstract, $server = null)
+ {
+ // 传入数组,批量注册
+ if (is_array($abstract)) {
+ foreach ($abstract as $prefix => $service) {
+ // 数组,定义前缀并绑定服务
+ if (is_array($service)) {
+ foreach ($service as $k => $v) {
+ $name = $prefix . '_' . $k;
+ $this->register($name, $v);
+ }
+ } else {
+ $this->register($prefix, $service);
+ }
+ }
+ } else {
+ $this->register($abstract, $server);
+ }
+
+ return $this;
+ }
+
+ /**
+ * 判断容器中是否存在某个类或标识
+ *
+ * @param string $name 类名称或标识符
+ * @return boolean [description]
+ */
+ public function has($name)
+ {
+ return isset($this->bind[$name]) || isset($this->service[$name]);
+ }
+
+ /**
+ * 创建获取对象的实例
+ *
+ * @param string $name 类名称或标识符
+ * @param array $vars 绑定的参数
+ * @param boolean $new 是否保存实例
+ * @return mixed
+ */
+ public function make($name, $vars = [], $new = false)
+ {
+ if (isset($this->service[$name]) && !$new) {
+ $object = $this->service[$name];
+ } else {
+ if (isset($this->bind[$name])) {
+ // 存在标识
+ $service = $this->bind[$name];
+
+ if ($service instanceof Closure) {
+ // 匿名函数,绑定参数
+ $object = $this->invokeFunction($service, $vars);
+ } elseif (is_object($service)) {
+ // 已实例化的对象
+ $object = $service;
+ } else {
+ // 类对象,回调获取实例
+ $object = $this->make($service, $vars, $new);
+ }
+ } else {
+ // 不存在,判断为直接写入的类对象, 获取实例
+ $object = $this->invokeClass($name, $vars);
+ }
+
+ // 保存实例
+ if (!$new) {
+ $this->service[$name] = $object;
+ }
+ }
+
+ return $object;
+ }
+
+ /**
+ * 绑定参数,执行函数或者闭包
+ *
+ * @param mixed $function 函数或者闭包
+ * @param array $vars 绑定参数
+ * @return mixed
+ */
+ public function invokeFunction($function, $vars = [])
+ {
+ // 创建反射对象
+ $reflact = new ReflectionFunction($function);
+ // 获取参数
+ $args = $this->bindParams($reflact, $vars);
+
+ return $reflact->invokeArgs($args);
+ }
+
+ /**
+ * 执行类方法, 绑定参数
+ *
+ * @param string|array $method 类方法, 用@分割, 如: Test@say
+ * @param array $vars 绑定参数
+ * @return mixed
+ */
+ public function invokeMethd($method, $vars = [])
+ {
+ // 字符串转数组
+ if (is_string($method)) {
+ $method = explode('@', $method);
+ }
+
+ // 反射绑定类方法
+ $class = is_object($method[0]) ? $method[0] : $this->invokeClass($method[0]);
+ $reflact = new ReflectionMethod($class, $method[1]);
+
+ // 绑定参数
+ $args = $this->bindParams($reflact, $vars);
+ return $reflact->invokeArgs($class, $args);
+ }
+
+ /**
+ * 反射执行对象实例化,支持构造方法依赖注入
+ *
+ * @param string $class 对象名称
+ * @param array $vars 绑定构造方法参数
+ * @return mixed
+ */
+ public function invokeClass($class, $vars = [])
+ {
+ $reflect = new ReflectionClass($class);
+ // 获取构造方法
+ $constructor = $reflect->getConstructor();
+
+ if ($constructor) {
+ // 存在构造方法
+ $args = $this->bindParams($constructor, $vars);
+ } else {
+ $args = [];
+ }
+
+ return $reflect->newInstanceArgs($args);
+ }
+
+ /**
+ * 反射执行回调方法
+ *
+ * @param mixed $callback 回调方法
+ * @param array $vars 参数
+ * @return mixed
+ */
+ public function invoke($callback, $vars = [])
+ {
+ if ($callback instanceof Closure) {
+ $result = $this->invokeFunction($callback, $vars);
+ } else {
+ $result = $this->invokeMethd($callback, $vars);
+ }
+
+ return $result;
+ }
+
+ /**
+ * 注册服务容器
+ *
+ * @param string $name 名称
+ * @param mixed $server 要绑定的实例
+ * @return Container
+ */
+ protected function register($name, $server)
+ {
+ // 闭包,绑定闭包
+ if ($server instanceof Closure) {
+ $this->bind[$name] = $server;
+ }
+ // 实例化后的对象, 保存到实例容器中
+ elseif (is_object($server)) {
+ $this->service[$name] = $server;
+ }
+ // 对象类名称,先保存,不实例化
+ else {
+ $this->bind[$name] = $server;
+ }
+
+ return $this;
+ }
+
+ /**
+ * 为反射对象绑定参数
+ *
+ * @param mixed $reflact 反射对象
+ * @param array $vars 参数
+ * @throws InvalidArgumentException
+ * @return array
+ */
+ protected function bindParams($reflact, $vars = [])
+ {
+ $args = [];
+ if ($reflact->getNumberOfParameters() > 0) {
+ // 判断数组类型 数字数组时按顺序绑定参数
+ reset($vars);
+ $type = key($vars) === 0 ? 1 : 0;
+
+ // 获取类方法需要的参数
+ $params = $reflact->getParameters();
+
+ // 获取参数类型, 绑定参数
+ foreach ($params as $param) {
+ $name = $param->getName();
+ $class = $param->getClass();
+
+ if ($class) {
+ $className = $class->getName();
+ $args[] = $this->make($className);
+ } elseif (1 == $type && !empty($vars)) {
+ $args[] = array_shift($vars);
+ } elseif (0 == $type && isset($vars[$name])) {
+ $args[] = $vars[$name];
+ } elseif ($param->isDefaultValueAvailable()) {
+ $args[] = $param->getDefaultValue();
+ } else {
+ throw new InvalidArgumentException('bind parameters were not found![' . $name . ']', 500);
+ }
+ }
+ }
+
+ return $args;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Date.php b/vendor/mongdch/mon-util/src/Date.php
new file mode 100644
index 0000000..9b3c818
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Date.php
@@ -0,0 +1,646 @@
+date = $this->parse($date);
+ $this->setDate($this->date);
+ }
+
+ /**
+ * 日期分析,获取时间戳
+ *
+ * @param mixed $date 日期
+ * @return string 时间戳
+ */
+ public function parse($date)
+ {
+ // 字符串解析
+ if (is_numeric($date)) {
+ //数字格式直接转换为时间戳
+ $tmpdate = $date;
+ } elseif (is_null($date)) {
+ //为空默认取得当前时间戳
+ $tmpdate = time();
+ } elseif (is_string($date)) {
+ if (($date == '') || strtotime($date) == -1) {
+ //为空默认取得当前时间戳
+ $tmpdate = time();
+ } else {
+ //把字符串转换成UNIX时间戳
+ $tmpdate = strtotime($date);
+ }
+ } else {
+ //默认取当前时间戳
+ $tmpdate = time();
+ }
+
+ return $tmpdate;
+ }
+
+ /**
+ * 日期相关参数设置
+ *
+ * @param integer $date 日期时间戳
+ * @return Date
+ */
+ public function setDate($date)
+ {
+ $dateArray = getdate($date);
+ $this->date = $dateArray[0]; //时间戳
+ $this->second = $dateArray["seconds"]; //秒
+ $this->minute = $dateArray["minutes"]; //分
+ $this->hour = $dateArray["hours"]; //时
+ $this->day = $dateArray["mday"]; //日
+ $this->month = $dateArray["mon"]; //月
+ $this->year = $dateArray["year"]; //年
+
+ $this->weekday = $dateArray["wday"]; //星期 0~6
+ $this->cWeekday = '星期' . $this->Week[$this->weekday]; //$dateArray["weekday"]; //星期完整表示
+ $this->yDay = $dateArray["yday"]; //一年中的天数 0-365
+ $this->cMonth = $dateArray["month"]; //月份的完整表示
+
+ $this->CDATE = $this->format("Y-m-d"); //日期表示
+ $this->YMD = $this->format("Ymd"); //简单日期
+ $this->CTIME = $this->format("H:i:s"); //时间表示
+
+ return $this;
+ }
+
+ /**
+ * 日期格式化
+ * 默认返回 1970-01-01 11:30:45 格式
+ *
+ * @param string $format 格式化参数
+ * @return string
+ */
+ public function format($format = "Y-m-d H:i:s")
+ {
+ return date($format, $this->date);
+ }
+
+ /**
+ * 获取日期开始和结束的时间戳
+ *
+ * @param integer $timeStamp 时间戳,默认当天
+ * @return array
+ */
+ public function getDayTime($timeStamp = '')
+ {
+ $date = $timeStamp ? $timeStamp : $this->date;
+ list($y, $m, $d) = explode('-', date('Y-m-d', $date));
+ return [
+ mktime(0, 0, 0, $m, $d, $y),
+ mktime(23, 59, 59, $m, $d, $y)
+ ];
+ }
+
+ /**
+ * 获取周开始和结束的时间戳
+ *
+ * @param integer $timeStamp 默认当周
+ * @return array
+ */
+ public function getWeekTime($timeStamp = '')
+ {
+ $date = $timeStamp ? $timeStamp : $this->date;
+ list($y, $m, $d, $w) = explode('-', date('Y-m-d-w', $date));
+ // 修正周日的问题
+ if ($w == 0) {
+ $w = 7;
+ }
+ return [
+ mktime(0, 0, 0, $m, $d - $w + 1, $y),
+ mktime(23, 59, 59, $m, $d - $w + 7, $y)
+ ];
+ }
+
+ /**
+ * 获取月开始和结束的时间戳
+ *
+ * @param integer $timeStamp 默认当月
+ * @return array
+ */
+ public function getMonthTime($timeStamp = '')
+ {
+ $date = $timeStamp ? $timeStamp : $this->date;
+ list($y, $m, $t) = explode('-', date('Y-m-t', $date));
+ return [
+ mktime(0, 0, 0, $m, 1, $y),
+ mktime(23, 59, 59, $m, $t, $y)
+ ];
+ }
+
+ /**
+ * 获取年开始和结束的时间戳
+ *
+ * @param integer $timeStamp 默认当年
+ * @return array
+ */
+ public function getYearTime($timeStamp = '')
+ {
+ $date = $timeStamp ? $timeStamp : $this->date;
+ $y = date('Y', $date);
+ return [
+ mktime(0, 0, 0, 1, 1, $y),
+ mktime(23, 59, 59, 12, 31, $y)
+ ];
+ }
+
+ /**
+ * 根据指定日期和1~7来获取周一至周日对应的日期
+ *
+ * @param string $date 指定日期,为空则默认为当前天
+ * @param integer $weekday 指定返回周几的日期(1~7),默认为返回周一对应的日期
+ * @param string $format 指定返回日期的格式
+ * @return string
+ */
+ public function getWeekDay($weekday = 1, $date = '', $format = 'Y-m-d')
+ {
+ $time = strtotime($date);
+ $time = ($time == '') ? $this->date : $time;
+
+ return date($format, $time - 86400 * (date('N', $time) - $weekday));
+ }
+
+ /**
+ * 是否为闰年
+ *
+ * @param string $year 年份
+ * @return boolean
+ */
+ public function isLeapYear($year = '')
+ {
+ if (empty($year)) {
+ $year = $this->year;
+ }
+ return ((($year % 4) == 0) && (($year % 100) != 0) || (($year % 400) == 0));
+ }
+
+ /**
+ * 计算日期差
+ *
+ * w - 周
+ * d - 天
+ * h - 时
+ * m - 月
+ * s - 秒
+ * i - 分
+ * y - 年
+ *
+ * @param mixed $date 要比较的日期
+ * @param string $elaps 比较跨度
+ * @return integer
+ */
+ public function dateDiff($date, $elaps = "d")
+ {
+ $__DAYS_PER_WEEK__ = (7);
+ $__DAYS_PER_MONTH__ = (30);
+ $__DAYS_PER_YEAR__ = (365);
+ $__HOURS_IN_A_DAY__ = (24);
+ $__MINUTES_IN_A_DAY__ = (1440);
+ $__SECONDS_IN_A_DAY__ = (86400);
+ //计算天数差
+ $__DAYSELAPS = ($this->parse($date) - $this->date) / $__SECONDS_IN_A_DAY__;
+ switch ($elaps) {
+ case "y": //转换成年
+ $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_YEAR__;
+ break;
+ case "m": //转换成月
+ $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_MONTH__;
+ break;
+ case "w": //转换成星期
+ $__DAYSELAPS = $__DAYSELAPS / $__DAYS_PER_WEEK__;
+ break;
+ case "h": //转换成小时
+ $__DAYSELAPS = $__DAYSELAPS * $__HOURS_IN_A_DAY__;
+ break;
+ case "i": //转换成分钟
+ $__DAYSELAPS = $__DAYSELAPS * $__MINUTES_IN_A_DAY__;
+ break;
+ case "s": //转换成秒
+ $__DAYSELAPS = $__DAYSELAPS * $__SECONDS_IN_A_DAY__;
+ break;
+ }
+
+ return $__DAYSELAPS;
+ }
+
+ /**
+ * 人性化的计算日期差
+ *
+ * @param mixed $time 要比较的时间
+ * @param mixed $precision 返回的精度
+ * @return string
+ */
+ public function timeDiff($time, $precision = false)
+ {
+ if (!is_numeric($precision) && !is_bool($precision)) {
+ static $_diff = ['y' => '年', 'm' => '个月', 'd' => '天', 'h' => '小时', 'i' => '分钟', 's' => '秒', 'w' => '周'];
+ return ceil($this->dateDiff($time, $precision)) . $_diff[$precision] . '前';
+ }
+ $diff = abs($this->parse($time) - $this->date);
+ static $chunks = [[31536000, '年'], [2592000, '个月'], [604800, '周'], [86400, '天'], [3600, '小时'], [60, '分钟'], [1, '秒']];
+ $count = 0;
+ $since = '';
+ for ($i = 0; $i < count($chunks); $i++) {
+ if ($diff >= $chunks[$i][0]) {
+ $num = floor($diff / $chunks[$i][0]);
+ $since .= sprintf('%d' . $chunks[$i][1], $num);
+ $diff = (int) ($diff - $chunks[$i][0] * $num);
+ $count++;
+ if (!$precision || $count >= $precision) {
+ break;
+ }
+ }
+ }
+
+ return $since . '前';
+ }
+
+ /**
+ * 返回周的某一天 返回Date对象
+ *
+ * @param integer $n 星期几
+ * @return Date
+ */
+ public function getDayOfWeek($n)
+ {
+ $week = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
+ return (new self($week[$n]));
+ }
+
+ /**
+ * 计算周的第一天 返回Date对象
+ *
+ * @return Date
+ */
+ public function firstDayOfWeek()
+ {
+ return $this->getDayOfWeek(1);
+ }
+
+ /**
+ * 计算月份的第一天 返回Date对象
+ *
+ * @return Date
+ */
+ public function firstDayOfMonth()
+ {
+ return (new self(mktime(0, 0, 0, $this->month, 1, $this->year)));
+ }
+
+ /**
+ * 计算年份的第一天 返回Date对象
+ *
+ * @return Date
+ */
+ public function firstDayOfYear()
+ {
+ return (new self(mktime(0, 0, 0, 1, 1, $this->year)));
+ }
+
+ /**
+ * 计算周的最后一天 返回Date对象
+ *
+ * @return Date
+ */
+ public function lastDayOfWeek()
+ {
+ return $this->getDayOfWeek(0);
+ }
+
+ /**
+ * 计算月份的最后一天 返回Date对象
+ *
+ * @return Date
+ */
+ public function lastDayOfMonth()
+ {
+ return (new self(mktime(0, 0, 0, $this->month + 1, 0, $this->year)));
+ }
+
+ /**
+ * 计算年份的最后一天 返回Date对象
+ *
+ * @return Date
+ */
+ public function lastDayOfYear()
+ {
+ return (new self(mktime(0, 0, 0, 1, 0, $this->year + 1)));
+ }
+
+ /**
+ * 计算月份的最大天数
+ *
+ * @return integer
+ */
+ public function maxDayOfMonth()
+ {
+ return $this->dateDiff(strtotime($this->dateAdd(1, 'm')), 'd');
+ }
+
+ /**
+ * 取得指定间隔日期
+ *
+ * yyyy - 年
+ * q - 季度
+ * m - 月
+ * y - day of year
+ * d - 日
+ * w - 周
+ * ww - week of year
+ * h - 小时
+ * n - 分钟
+ * s - 秒
+ *
+ * @param integer $number 间隔数目
+ * @param string $interval 比较类型
+ * @return Date
+ */
+ public function dateAdd($number = 0, $interval = "d")
+ {
+ $hours = $this->hour;
+ $minutes = $this->minute;
+ $seconds = $this->second;
+ $month = $this->month;
+ $day = $this->day;
+ $year = $this->year;
+
+ switch ($interval) {
+ case "yyyy":
+ //---Add $number to year
+ $year += $number;
+ break;
+
+ case "q":
+ //---Add $number to quarter
+ $month += ($number * 3);
+ break;
+
+ case "m":
+ //---Add $number to month
+ $month += $number;
+ break;
+
+ case "y":
+ case "d":
+ case "w":
+ //---Add $number to day of year, day, day of week
+ $day += $number;
+ break;
+
+ case "ww":
+ //---Add $number to week
+ $day += ($number * 7);
+ break;
+
+ case "h":
+ //---Add $number to hours
+ $hours += $number;
+ break;
+
+ case "n":
+ //---Add $number to minutes
+ $minutes += $number;
+ break;
+
+ case "s":
+ //---Add $number to seconds
+ $seconds += $number;
+ break;
+ }
+
+ return (new self(mktime($hours, $minutes, $seconds, $month, $day, $year)));
+ }
+
+ /**
+ * 日期数字转中文,用于日和月、周
+ *
+ * @param integer $number 日期数字
+ * @return string
+ */
+ public function numberToCh($number)
+ {
+ $number = intval($number);
+ $array = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
+ $str = '';
+ if ($number == 0) {
+ $str .= "十";
+ }
+ if ($number < 10) {
+ $str .= $array[$number - 1];
+ } elseif ($number < 20) {
+ $str .= "十" . $array[$number - 11];
+ } elseif ($number < 30) {
+ $str .= "二十" . $array[$number - 21];
+ } else {
+ $str .= "三十" . $array[$number - 31];
+ }
+
+ return $str;
+ }
+
+ /**
+ * 年份数字转中文
+ *
+ * @param integer $yearStr 年份数字
+ * @param boolean $flag 是否显示公元
+ * @return string
+ */
+ public function yearToCh($yearStr, $flag = false)
+ {
+ $array = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
+ $str = $flag ? '公元' : '';
+ for ($i = 0; $i < 4; $i++) {
+ $str .= $array[mb_substr($yearStr, $i, 1)];
+ }
+
+ return $str;
+ }
+
+ /**
+ * 判断日期 所属 干支 生肖 星座
+ * type 参数:XZ 星座 GZ 干支 SX 生肖
+ *
+ * @param string $type 获取信息类型
+ * @return string
+ */
+ public function magicInfo($type)
+ {
+ $result = '';
+ $m = $this->month;
+ $y = $this->year;
+ $d = $this->day;
+
+ switch ($type) {
+ case 'XZ': //星座
+ $XZDict = ['摩羯', '宝瓶', '双鱼', '白羊', '金牛', '双子', '巨蟹', '狮子', '处女', '天秤', '天蝎', '射手'];
+ $Zone = [1222, 122, 222, 321, 421, 522, 622, 722, 822, 922, 1022, 1122, 1222];
+ if ((100 * $m + $d) >= $Zone[0] || (100 * $m + $d) < $Zone[1]) {
+ $i = 0;
+ } else {
+ for ($i = 1; $i < 12; $i++) {
+ if ((100 * $m + $d) >= $Zone[$i] && (100 * $m + $d) < $Zone[$i + 1]) {
+ break;
+ }
+ }
+ }
+ $result = $XZDict[$i] . '座';
+ break;
+
+ case 'GZ': //干支
+ $GZDict = array(
+ ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'],
+ ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']
+ );
+ $i = $y - 1900 + 36;
+ $result = $GZDict[0][$i % 10] . $GZDict[1][$i % 12];
+ break;
+
+ case 'SX': //生肖
+ $SXDict = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'];
+ $result = $SXDict[($y - 4) % 12];
+ break;
+ }
+
+ return $result;
+ }
+
+ /**
+ * 魔术方法,支持字符串输出对象
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->format();
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Dictionary.php b/vendor/mongdch/mon-util/src/Dictionary.php
new file mode 100644
index 0000000..c118646
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Dictionary.php
@@ -0,0 +1,339 @@
+
+ * @version 1.0.0 2019-12-19
+ */
+class Dictionary
+{
+ /**
+ * Mysql链接实例
+ *
+ * @var PDO
+ */
+ protected $db;
+
+ /**
+ * 数据库配置
+ *
+ * @var array
+ */
+ protected $config = [
+ // 数据库类型
+ 'type' => 'mysql',
+ // 服务器地址
+ 'host' => '127.0.0.1',
+ // 数据库名
+ 'database' => '',
+ // 用户名
+ 'username' => '',
+ // 密码
+ 'password' => '',
+ // 端口
+ 'port' => '3306',
+ // 数据库编码默认采用utf8
+ 'charset' => 'utf8mb4',
+ // 数据库连接参数
+ 'params' => []
+ ];
+
+ /**
+ * 视图表前缀标志
+ *
+ * @var string
+ */
+ protected $viewMark;
+
+ /**
+ * 构造方法
+ *
+ * @param array $config
+ */
+ public function __construct(array $config = [])
+ {
+ if (!empty($config)) {
+ $this->config = array_merge($this->config, $config);
+ }
+ }
+
+ /**
+ * 设置DB配置
+ *
+ * @param array $config DB配置信息
+ * @return Dictionary
+ */
+ public function setConfig(array $config)
+ {
+ $this->config = array_merge($this->config, $config);
+ return $this;
+ }
+
+ /**
+ * 设置视图前缀标志
+ *
+ * @param string $mark 视图前缀标志
+ * @return Dictionary
+ */
+ public function setViewMark($mark)
+ {
+ $this->viewMark = $mark;
+ return $this;
+ }
+
+ /**
+ * 获取所有表
+ *
+ * @return array
+ */
+ public function getTable()
+ {
+ $table = [];
+ $result = $this->query('SHOW TABLES');
+
+ // 取得所有的表名
+ foreach ($result as $index => $tableName) {
+ $table[]['TABLE_NAME'] = $tableName[0];
+ }
+ return $table;
+ }
+
+ /**
+ * 获取所有表信息
+ *
+ * @return array
+ */
+ public function getTableInfo()
+ {
+ $tables = $this->getTable();
+ foreach ($tables as $k => $v) {
+ $sql = "SHOW INDEX FROM " . $v['TABLE_NAME'];
+ $result = $this->query($sql);
+ foreach ($result as $item) {
+ $tables[$k]['INDEX'][] = $item;
+ }
+
+ $sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$this->config['database']}'";
+ $table_result = $this->query($sql);
+ foreach ($table_result as $item2) {
+ $tables[$k]['TABLE_COMMENT'][] = $item2['TABLE_COMMENT'];
+ }
+
+ $sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$this->config['database']}'";
+ $fields = [];
+ $filed_result = $this->query($sql);
+ foreach ($filed_result as $t) {
+ $fields[] = $t;
+ }
+ $tables[$k]['COLUMN'] = $fields;
+ }
+
+ return $tables;
+ }
+
+ /**
+ * 获取内容
+ *
+ * @param boolean $menu 是否需要菜单
+ * @return string
+ */
+ public function getContent($menu = true)
+ {
+ // 获取所有表信息
+ $tables = $this->getTableInfo();
+ // 构造HTMl
+ $html = '';
+ if ($menu) {
+ // 循环生成右边导航栏
+ $html .= '' . "\n";
+ $html .= '
' . "\n";
+ foreach ($tables as $key => $val) {
+ static $first = false;
+ if (!$first && !empty($this->viewMark)) {
+ if (strstr($val['TABLE_NAME'], $this->viewMark)) {
+ $first = true;
+ $html .= '
' . "\n";
+ }
+ }
+ $html .= '
' . $val['TABLE_NAME'] . '' . "\n";
+ }
+ $html .= '
' . "\n";
+ }
+
+ // 循环生成左边数据表内容
+ $html .= '' . "\n";
+ foreach ($tables as $k => $v) {
+ // 数据表头
+ $html .= '
' . "\n";
+ $html .= '';
+ $html .= '' . "\n";
+ $html .= '数据表名称:' . $v['TABLE_NAME'] . ' |
' . "\n";
+ $html .= '表备注:' . (isset($v['TABLE_COMMENT'][0]) ? $v['TABLE_COMMENT'][0] : '') . ' |
' . "\n";
+ $html .= '' . "\n";
+ $html .= '字段名 | ' . "\n";
+ $html .= '字段类型 | ' . "\n";
+ $html .= '默认值 | ' . "\n";
+ $html .= '允许为空 | ' . "\n";
+ $html .= '自动递增 | ' . "\n";
+ $html .= '备注 | ' . "\n";
+ $html .= '
' . "\n";
+ $html .= '' . "\n";
+ // 数据表内容
+ $html .= '' . "\n";
+ foreach ($v['COLUMN'] as $f) {
+ $html .= ' ' . "\n";
+ $html .= ' ' . $f['COLUMN_NAME'] . ' | ' . "\n";
+ $html .= ' ' . $f['COLUMN_TYPE'] . ' | ' . "\n";
+ $html .= ' ' . $f['COLUMN_DEFAULT'] . ' | ' . "\n";
+ $html .= ' ' . $f['IS_NULLABLE'] . ' | ' . "\n";
+ $html .= ' ' . ($f['EXTRA'] == 'auto_increment' ? '是' : ' ') . ' | ' . "\n";
+ $html .= ' ' . $f['COLUMN_COMMENT'] . ' | ' . "\n";
+ $html .= '
';
+ }
+ $html .= '' . "\n";
+ $html .= '
';
+
+ // 数据表索引表头
+ if (isset($v['INDEX']) && is_array($v['INDEX'])) {
+ $html .= '
' . "\n";
+ $html .= '';
+ $html .= '' . "\n";
+ $html .= '索引信息: |
' . "\n";
+ $html .= '' . "\n";
+ $html .= '字段名 | ' . "\n";
+ $html .= '是否唯一 | ' . "\n";
+ $html .= '索引名称 | ' . "\n";
+ $html .= '
' . "\n";
+ $html .= '' . "\n";
+
+ foreach ($v['INDEX'] as $idx) {
+ $html .= '' . "\n";
+ $html .= '' . $idx['Column_name'] . ' | ' . "\n";
+ $html .= '' . ($idx['Non_unique'] ? '否' : '是') . ' | ' . "\n";
+ $html .= '' . $idx['Key_name'] . ' | ' . "\n";
+ $html .= '
';
+ }
+ }
+
+ $html .= '
' . "\n" . '
' . "\n" . '
' . "\n";
+ }
+ $html .= '
' . "\n";
+
+ return $html;
+ }
+
+ /**
+ * 获取HTML内容
+ *
+ * @return string
+ */
+ public function getHTML()
+ {
+ $content = $this->getContent();
+ $html = "
+
+
+
+
+ {$this->config['database']}库数据字典
+
+
+
+ {$content}
+
+ ";
+
+ return $html;
+ }
+
+ /**
+ * 到处HTML数据字典
+ *
+ * @return void
+ */
+ public function exportHTML()
+ {
+ header("Content-Type: application/html");
+ header("Content-Disposition: attachment; filename={$this->config['database']}库数据字典.html");
+ echo $this->getHTML();
+ }
+
+ /**
+ * 获取DB链接
+ *
+ * @throws PDOException
+ * @return PDO
+ */
+ protected function getDB()
+ {
+ if (!$this->db) {
+ // 生成mysql连接dsn
+ $is_port = (isset($this->config['port']) && is_int($this->config['port'] * 1));
+ $dsn = 'mysql:host=' . $this->config['host'] . ($is_port ? ';port=' . $this->config['port'] : '') . ';dbname=' . $this->config['database'];
+ if (!empty($this->config['charset'])) {
+ $dsn .= ';charset=' . $this->config['charset'];
+ }
+ // 数据库连接参数
+ $params = [
+ PDO::ATTR_CASE => PDO::CASE_NATURAL,
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+ PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
+ PDO::ATTR_STRINGIFY_FETCHES => false,
+ PDO::ATTR_EMULATE_PREPARES => false,
+ ];
+ if (isset($config['params']) && is_array($config['params'])) {
+ $params = $config['params'] + $params;
+ }
+ // 链接
+ $this->db = new PDO(
+ $dsn,
+ $this->config['username'],
+ $this->config['password'],
+ $params
+ );
+ }
+
+ return $this->db;
+ }
+
+ /**
+ * 执行查询语句
+ *
+ * @param string $sql SQL语句
+ * @return array
+ */
+ protected function query($sql)
+ {
+ $query = $this->getDB()->prepare($sql);
+ $query->execute();
+ return $query->fetchAll(PDO::FETCH_BOTH);
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/DocParse.php b/vendor/mongdch/mon-util/src/DocParse.php
new file mode 100644
index 0000000..bddf196
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/DocParse.php
@@ -0,0 +1,180 @@
+
+ * @version 1.0.0
+ */
+class DocParse
+{
+ use Instance;
+
+ /**
+ * 解析类型对象, 获取类型注解文档
+ *
+ * @param string $class 对象名称
+ * @param integer $type ReflectionMethod对应的方法访问类型,默认Public
+ * @return mixed
+ */
+ public function parseClass($class, $type = ReflectionMethod::IS_PUBLIC)
+ {
+ if (class_exists($class)) {
+ $result = [];
+ $reflection = new ReflectionClass($class);
+ $method = $reflection->getMethods($type);
+ // 解析文档中所有的方法
+ foreach ($method as $action) {
+ $doc = $action->getDocComment();
+ $data = $this->parse($doc);
+ $result[$action->name] = $data;
+ }
+
+ return $result;
+ }
+
+ return false;
+ }
+
+ /**
+ * 解析文档,获取文档内容
+ *
+ * @param string $doc 注解文档内容
+ * @return array
+ */
+ public function parse($doc)
+ {
+ // 解析注解文本块,获取文档内容
+ if (preg_match('#^/\*\*(.*)\*/#s', $doc, $comment) === false) {
+ return [];
+ }
+ $comment = trim($comment[1]);
+ // 获取所有行并去除第一个 * 字符
+ if (preg_match_all('#^\s*\*(.*)#m', $comment, $lines) === false) {
+ return [];
+ }
+ // 解析每行注解,获取对应的内容信息
+ $result = $this->parseLines($lines[1]);
+ return $result;
+ }
+
+ /**
+ * 遍历解析注解信息,整理获取注解内容
+ *
+ * @param array $lines 注解内容
+ * @return array
+ */
+ protected function parseLines($lines)
+ {
+ $result = [];
+ $description = [];
+ foreach ($lines as $line) {
+ $lineData = $this->parseLine($line);
+ if (is_string($lineData)) {
+ $description[] = $lineData;
+ } else if (is_array($lineData)) {
+ $result[$lineData['type']][] = $lineData['data'];
+ }
+ }
+ $result['description'] = implode(PHP_EOL, $description);
+ return $result;
+ }
+
+ /**
+ * 逐行解析注解信息,获取注解内容
+ *
+ * @param string $line 行信息
+ * @return array|string
+ */
+ protected function parseLine($line)
+ {
+ $content = trim($line);
+
+ if (mb_strpos($content, '@') === 0) {
+ if (mb_strpos($content, ' ') > 0) {
+ // 获取参数名称
+ $param = mb_substr($content, 1, mb_strpos($content, ' ') - 1);
+ // 获取值
+ $value = mb_substr($content, mb_strlen($param) + 2);
+ } else {
+ $param = mb_substr($content, 1);
+ $value = '';
+ }
+
+ // 解析行参数
+ switch ($param) {
+ case 'param':
+ $value = $this->formatParam($value);
+ break;
+ case 'return':
+ case 'throws':
+ $value = $this->formatResult($value);
+ break;
+ }
+ return [
+ 'type' => $param,
+ 'data' => $value
+ ];
+ }
+
+ return $content;
+ }
+
+ /**
+ * 解析return或throws类型的参数
+ *
+ * @param string $string 注解字符串
+ * @return string|array
+ */
+ protected function formatResult($string)
+ {
+ $string = trim($string);
+ if (mb_strpos($string, ' ') !== false) {
+ $data = explode(' ', $string, 3);
+ $type = $data[0];
+ $desc = isset($data[1]) ? $data[1] : '';
+
+ return [
+ 'type' => $type,
+ 'name' => '',
+ 'desc' => trim($desc)
+ ];
+ }
+
+ return $string;
+ }
+
+ /**
+ * 解析param类型的参数
+ *
+ * @param string $string 注解字符串
+ * @return string|array
+ */
+ protected function formatParam($string)
+ {
+ $string = trim($string);
+ if (mb_strpos($string, ' ') !== false) {
+ $data = explode(' ', $string, 3);
+ $type = $data[0];
+ if (count($data) > 1) {
+ $name = $data[1];
+ $desc = $data[2];
+ } else {
+ $name = $data[1];
+ }
+
+ return [
+ 'type' => $type,
+ 'name' => $name,
+ 'desc' => isset($desc) ? trim($desc) : ''
+ ];
+ }
+
+ return $string;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/File.php b/vendor/mongdch/mon-util/src/File.php
new file mode 100644
index 0000000..ebcee0d
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/File.php
@@ -0,0 +1,554 @@
+
+ * @version 1.1.1 优化注解 2022-07-08
+ */
+class File
+{
+ use Instance;
+
+ /**
+ * 字节格式化 把字节数格式为 B K M G T P E Z Y 描述的大小
+ *
+ * @param integer $size 大小
+ * @param integer $dec 精准度,小数位数
+ * @param boolean $toString 输出字符串
+ * @return array|string
+ */
+ public function formatByte($size, $dec = 0, $toString = true)
+ {
+ $type = array("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB");
+ $pos = 0;
+ while ($size >= 1024) {
+ $size /= 1024;
+ $pos++;
+ }
+ $result = [
+ 'size' => round($size, $dec),
+ 'type' => $type[$pos]
+ ];
+ return $toString ? ($result['size'] . ' ' . $result['type']) : $result;
+ }
+
+ /**
+ * 改变文件和目录的相关属性
+ *
+ * @param string $file 文件路径
+ * @param string $type 操作类型, 支持:group、mode、ower
+ * @param mixed $ch_info 操作信息
+ * @throws InvalidArgumentException
+ * @return boolean
+ */
+ public function changeAuth($file, $type, $ch_info)
+ {
+ switch ($type) {
+ case 'group':
+ // 改变文件组。
+ return chgrp($file, $ch_info);
+ case 'mode':
+ // 改变文件模式。
+ return chmod($file, $ch_info);
+ case 'ower':
+ // 改变文件所有者。
+ return chown($file, $ch_info);
+ default:
+ throw new InvalidArgumentException("type prams invalid.[group|mode|ower]");
+ }
+ }
+
+ /**
+ * 获取上传文件信息
+ *
+ * @param string $field $_FILES 字段索引
+ * @param array $files 文件信息源,默认$_FILES
+ * @return array
+ */
+ public function uploadFileInfo($field, $files = [])
+ {
+ $files = empty($files) ? $_FILES : $files;
+ // 取得上传文件基本信息
+ $fileInfo = $files[$field];
+ $info = [];
+ // 取得文件类型
+ $info['type'] = strtolower(trim(stripslashes(preg_replace("/^(.+?);.*$/", "\\1", $fileInfo['type'])), '"'));
+ // 取得上传文件在服务器中临时保存目录
+ $info['temp'] = $fileInfo['tmp_name'];
+ // 取得上传文件大小
+ $info['size'] = $fileInfo['size'];
+ // 取得文件上传错误
+ $info['error'] = $fileInfo['error'];
+ // 取得上传文件名
+ $info['name'] = $fileInfo['name'];
+ // 取得上传文件后缀
+ $info['ext'] = $this->getExt($fileInfo['name']);
+ return $info;
+ }
+
+ /**
+ * 创建目录
+ *
+ * @param string $dirPath 目录路径
+ * @return boolean
+ */
+ public function createDir($dirPath)
+ {
+ if (is_dir($dirPath)) {
+ return true;
+ }
+ return mkdir($dirPath, 0755, true);
+ }
+
+ /**
+ * 复制文件夹
+ *
+ * @param string $source 源文件夹
+ * @param string $dest 目标文件夹
+ * @return void
+ */
+ public function copydir($source, $dest)
+ {
+ $this->createDir($dest);
+ $iterator = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
+ RecursiveIteratorIterator::SELF_FIRST
+ );
+ foreach ($iterator as $item) {
+ if ($item->isDir()) {
+ $sontDir = $dest . '/' . $iterator->getSubPathName();
+ $this->createDir($sontDir);
+ } else {
+ copy($item, $dest . '/' . $iterator->getSubPathName());
+ }
+ }
+ }
+
+ /**
+ * 删除非空目录
+ * 说明:只能删除非系统和特定权限的文件,否则会出现错误
+ *
+ * @param string $dirPath 目录路径
+ * @param boolean $all 是否删除所有
+ * @return boolean
+ */
+ public function removeDir($dirPath, $all = false)
+ {
+ $dirName = $this->pathReplace($dirPath);
+ $handle = @opendir($dirName);
+ while (($file = @readdir($handle)) !== FALSE) {
+ if ($file != '.' && $file != '..') {
+ $dir = $dirName . '/' . $file;
+ if ($all) {
+ is_dir($dir) ? $this->removeDir($dir) : $this->removeFile($dir);
+ } else {
+ if (is_file($dir)) {
+ $this->removeFile($dir);
+ }
+ }
+ }
+ }
+ closedir($handle);
+ return @rmdir($dirName);
+ }
+
+ /**
+ * 获取指定目录的信息
+ *
+ * @param string $dir 目录路径
+ * @return array
+ */
+ public function getDirInfo($dir)
+ {
+ $handle = @opendir($dir); //打开指定目录
+ $directory_count = 0;
+ $total_size = 0;
+ $file_cout = 0;
+ while (false !== ($path = readdir($handle))) {
+ if ($path != "." && $path != "..") {
+ $next_path = $dir . '/' . $path;
+ if (is_dir($next_path)) {
+ $directory_count++;
+ $result_value = $this->getDirInfo($next_path);
+ $total_size += $result_value['size'];
+ $file_cout += $result_value['filecount'];
+ $directory_count += $result_value['dircount'];
+ } elseif (is_file($next_path)) {
+ $total_size += filesize($next_path);
+ $file_cout++;
+ }
+ }
+ }
+ closedir($handle); //关闭指定目录
+ $result_value['size'] = $total_size;
+ $result_value['filecount'] = $file_cout;
+ $result_value['dircount'] = $directory_count;
+ return $result_value;
+ }
+
+ /**
+ * 获取目录内容
+ *
+ * @param string $dir 目录路径
+ * @throws InvalidArgumentException
+ * @return array
+ */
+ public function getDirContent($dir)
+ {
+ if (!is_dir($dir)) {
+ throw new InvalidArgumentException("dir path is not dir!");
+ }
+ //遍历目录取得文件信息
+ $data = [];
+ if ($handle = opendir($dir)) {
+ $i = 0;
+ while (false !== ($filename = readdir($handle))) {
+ if (mb_strpos($filename, '.') === 0) {
+ continue;
+ }
+ $file = rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $filename;
+ if (is_dir($file)) {
+ // 是否文件夹
+ $data[$i]['is_dir'] = true;
+ // 文件夹是否包含文件
+ $data[$i]['has_file'] = (count(scandir($file)) > 2);
+ // 文件大小
+ $data[$i]['filesize'] = 0;
+ // 文件类别,用扩展名判断
+ $data[$i]['filetype'] = '';
+ } else {
+ $data[$i]['is_dir'] = false;
+ $data[$i]['has_file'] = false;
+ $data[$i]['filesize'] = filesize($file);
+ $data[$i]['filetype'] = $this->getExt($file);
+ }
+ // 文件名,包含扩展名
+ $data[$i]['filename'] = $filename;
+ // 文件最后修改时间
+ $data[$i]['datetime'] = date('Y-m-d H:i:s', filemtime($file));
+ $i++;
+ }
+ closedir($handle);
+ }
+
+ return $data;
+ }
+
+ /**
+ * 创建文件
+ *
+ * @param string $content 写入内容
+ * @param string $path 文件路径
+ * @param boolean $append 存在文件是否继续写入
+ * @return boolean|integer
+ */
+ public function createFile($content, $path, $append = true)
+ {
+ $dirPath = dirname($path);
+ is_dir($dirPath) || $this->createDir($dirPath);
+ if ($append) {
+ // 添加写入
+ return file_put_contents($path, $content, FILE_APPEND);
+ } else {
+ // 重新写入
+ return file_put_contents($path, $content);
+ }
+ }
+
+ /**
+ * 删除文件
+ *
+ * @param string $path 文件路径
+ * @return boolean
+ */
+ public function removeFile($path)
+ {
+ $path = $this->pathReplace($path);
+ if (file_exists($path)) {
+ return unlink($path);
+ }
+
+ return true;
+ }
+
+ /**
+ * 获取完整文件名称
+ *
+ * @param string $path 目录路径
+ * @return string
+ */
+ public function getBaseName($path)
+ {
+ return basename(str_replace('\\', '/', $this->pathReplace($path)));
+ }
+
+ /**
+ * 获取文件后缀名
+ *
+ * @param string $path 文件路径
+ * @return string
+ */
+ public function getExt($path)
+ {
+ return pathinfo($this->pathReplace($path), PATHINFO_EXTENSION);
+ }
+
+ /**
+ * 重命名文件
+ *
+ * @param string $oldFileName 旧名称
+ * @param string $newFileNmae 新名称
+ * @return boolean
+ */
+ public function rename($oldFileName, $newFileNmae)
+ {
+ if (($oldFileName != $newFileNmae) && is_writable($oldFileName)) {
+ return rename($oldFileName, $newFileNmae);
+ }
+
+ return false;
+ }
+
+ /**
+ * 读取文件内容
+ *
+ * @param string $file 文件路径
+ * @throws InvalidArgumentException
+ * @return string
+ */
+ public function read($file)
+ {
+ if (!file_exists($file)) {
+ throw new InvalidArgumentException('file not found[' . $file . ']');
+ }
+ return file_get_contents($file);
+ }
+
+ /**
+ * 获取文件信息
+ *
+ * @param string $file 文件路径
+ * @return array
+ */
+ public function getFileInfo($file)
+ {
+ $info = [];
+ // 返回路径中的文件名部分
+ $info['filename'] = basename($file);
+ // 返回绝对路径名
+ $info['pathname'] = realpath($file);
+ // 文件的 user ID (所有者)
+ $info['owner'] = fileowner($file);
+ // 返回文件的 inode 编号
+ $info['perms'] = fileperms($file);
+ // 返回文件的 inode 编号
+ $info['inode'] = fileinode($file);
+ // 返回文件的组 ID
+ $info['group'] = filegroup($file);
+ // 返回路径中的目录名称部分
+ $info['path'] = dirname($file);
+ // 返回文件的上次访问时间
+ $info['atime'] = fileatime($file);
+ // 返回文件的上次改变时间
+ $info['ctime'] = filectime($file);
+ // 返回文件的权限
+ $info['perms'] = fileperms($file);
+ // 返回文件大小
+ $info['size'] = filesize($file);
+ // 返回文件类型
+ $info['type'] = filetype($file);
+ // 返回文件后缀名
+ $info['ext'] = is_file($file) ? pathinfo($file, PATHINFO_EXTENSION) : '';
+ // 返回文件的上次修改时间
+ $info['mtime'] = filemtime($file);
+ // 判断指定的文件名是否是一个目录
+ $info['isDir'] = is_dir($file);
+ // 判断指定文件是否为常规的文件
+ $info['isFile'] = is_file($file);
+ // 判断指定的文件是否是连接
+ $info['isLink'] = is_link($file);
+ // 判断文件是否可读
+ $info['isReadable'] = is_readable($file);
+ // 判断文件是否可写
+ $info['isWritable'] = is_writable($file);
+ // 判断文件是否是通过 HTTP POST 上传的
+ $info['isUpload'] = is_uploaded_file($file);
+ return $info;
+ }
+
+ /**
+ * 分卷记录文件
+ *
+ * @param string $content 记录的内容
+ * @param string $path 保存的路径, 不含后缀
+ * @param integer $maxSize 文件最大尺寸
+ * @param string $rollNum 分卷数
+ * @param string $postfix 文件后缀
+ * @throws RuntimeException
+ * @return boolean|integer
+ */
+ public function subsectionFile($content, $path, $maxSize = 20480000, $rollNum = 3, $postfix = '.log')
+ {
+ $destination = $path . $postfix;
+ $contentLength = mb_strlen($content);
+ // 判断写入内容的大小
+ if ($contentLength > $maxSize) {
+ throw new RuntimeException("Save content size cannot exceed {$maxSize}, content size: {$contentLength}");
+ }
+ // 判断记录文件是否已存在,存在时文件大小不足写入
+ elseif (file_exists($destination) && floor($maxSize) < (filesize($destination) + $contentLength)) {
+ // 超出剩余写入大小,分卷写入
+ $this->shiftFile($path, (int) $rollNum, $postfix);
+ return $this->createFile($content, $destination, false);
+ }
+ // 不存在文件或文件大小足够继续写入
+ else {
+ return $this->createFile($content, $destination);
+ }
+ }
+
+ /**
+ * 获取路径下所有的内容及后代内容
+ *
+ * @param string $path 路径
+ * @param boolean $tree 输出树结构还是数组
+ * @return array
+ */
+ public function getFoldersContent($path, $tree = false)
+ {
+ if ((!file_exists($path) || !is_dir($path))) {
+ return [];
+ }
+ $dir = new DirectoryIterator($path);
+
+ return $tree ? $this->directoryIteratorToTree($dir) : $this->directoryIteratorToArray($dir);
+ }
+
+ /**
+ * 获取路径下所有的内容及后代内容转数组辅助方法
+ *
+ * @param DirectoryIterator $dir
+ * @return array
+ */
+ protected function directoryIteratorToArray(DirectoryIterator $dir)
+ {
+ $result = [];
+ foreach ($dir as $key => $child) {
+ if ($child->isDot()) {
+ continue;
+ }
+ $name = $child->getBasename();
+ if ($child->isDir()) {
+ $subit = new DirectoryIterator($child->getPathname());
+ $result[$name] = $this->DirectoryIteratorToArray($subit);
+ } else {
+ $result[] = $name;
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * 获取路径下所有的内容及后代内容转树结构辅助方法
+ *
+ * @param DirectoryIterator $dir
+ * @return array
+ */
+ protected function directoryIteratorToTree(DirectoryIterator $dir)
+ {
+ $result = [];
+ foreach ($dir as $key => $child) {
+ if ($child->isDot()) {
+ continue;
+ }
+ $name = $child->getBasename();
+ if ($child->isDir()) {
+ $path = $child->getPathname();
+ $subit = new DirectoryIterator($path);
+ $result[$key] = [
+ 'children' => $this->directoryIteratorToTree($subit),
+ 'title' => $name,
+ 'path' => $path,
+ ];
+ } else {
+ $result[$key] = [
+ 'title' => $name,
+ 'path' => $child->getPathname(),
+ ];
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * 分卷重命名文件
+ *
+ * @param string $path 文件路径
+ * @param int $rollNum 分卷数
+ * @param string $postfix 后缀名
+ * @throws RuntimeException
+ * @return void
+ */
+ protected function shiftFile($path, $rollNum, $postfix = '.log')
+ {
+ // 判断是否存在最老的一份文件,存在则删除
+ $oldest = $this->buildShiftName($path, ($rollNum - 1));
+ $oldestFile = $oldest . $postfix;
+ if (!$this->removeFile($oldestFile)) {
+ throw new RuntimeException("Failed to delete old file, oldFileName: {$oldestFile}");
+ }
+
+ // 循环重命名文件
+ for ($i = ($rollNum - 2); $i >= 0; $i--) {
+ // 最新的一卷不需要加上分卷号
+ if ($i == 0) {
+ $oldFile = $path;
+ } else {
+ // 获取分卷号文件名称
+ $oldFile = $this->buildShiftName($path, $i);
+ }
+
+ // 重命名文件
+ $oldFileName = $oldFile . $postfix;
+ if (file_exists($oldFileName)) {
+ $newFileNmae = $this->buildShiftName($path, ($i + 1)) . $postfix;
+ // 重命名
+ if (!$this->rename($oldFile, $newFileNmae)) {
+ throw new RuntimeException("Failed to rename volume file name, oldFileName: {$oldFileName}, newFileNmae: {$newFileNmae}");
+ }
+ }
+ }
+ }
+
+ /**
+ * 构造分卷文件名称
+ *
+ * @param string $fileName 文件名称,不含后缀
+ * @param integer $num 分卷数
+ * @return string
+ */
+ protected function buildShiftName($fileName, $num)
+ {
+ return $fileName . '_' . $num;
+ }
+
+ /**
+ * 路径替换相应的字符
+ *
+ * @param string $path 路径
+ * @return string
+ */
+ protected function pathReplace($path)
+ {
+ return str_replace('//', '/', str_replace('\\', '/', $path));
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Gif.php b/vendor/mongdch/mon-util/src/Gif.php
new file mode 100644
index 0000000..566960b
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Gif.php
@@ -0,0 +1,494 @@
+frames = $de->GIFGetFrames();
+ $this->delays = $de->GIFGetDelays();
+ } catch (Exception $e) {
+ throw new ImgException("解码GIF图片出错!" . $e->getMessage(), ImgException::ERROR_GIT_PARSE);
+ }
+ }
+ }
+
+ /**
+ * 设置或获取当前帧的数据
+ *
+ * @param string $stream 二进制数据流
+ * @return mixed 获取到的数据
+ */
+ public function image($stream = null)
+ {
+ if (is_null($stream)) {
+ $current = current($this->frames);
+ return false === $current ? reset($this->frames) : $current;
+ } else {
+ $this->frames[key($this->frames)] = $stream;
+ }
+ }
+
+ /**
+ * 将当前帧移动到下一帧
+ *
+ * @return mixed 当前帧数据
+ */
+ public function nextImage()
+ {
+ return next($this->frames);
+ }
+
+ /**
+ * 保存当前GIF图片
+ *
+ * @param string $gifname 图片名称
+ * @return boolean|integer
+ */
+ public function save($gifname)
+ {
+ $gif = new GIFEncoder($this->frames, $this->delays, 0, 2, 0, 0, 0, 'bin');
+ return file_put_contents($gifname, $gif->GetAnimation());
+ }
+}
+
+/**
+ * 解析GIF
+ */
+class GIFEncoder
+{
+ private $GIF = "GIF89a";
+ private $VER = "GIFEncoder V2.05";
+ private $BUF = [];
+ private $LOP = 0;
+ private $DIS = 2;
+ private $COL = -1;
+ private $IMG = -1;
+ private $ERR = array(
+ 'ERR00' => "Does not supported function for only one image!",
+ 'ERR01' => "Source is not a GIF image!",
+ 'ERR02' => "Unintelligible flag ",
+ 'ERR03' => "Does not make animation from animated GIF source",
+ );
+
+ /**
+ * 构造方法
+ *
+ * @param [type] $GIF_src
+ * @param [type] $GIF_dly
+ * @param [type] $GIF_lop
+ * @param [type] $GIF_dis
+ * @param [type] $GIF_red
+ * @param [type] $GIF_grn
+ * @param [type] $GIF_blu
+ * @param [type] $GIF_mod
+ */
+ public function __construct($GIF_src, $GIF_dly, $GIF_lop, $GIF_dis, $GIF_red, $GIF_grn, $GIF_blu, $GIF_mod)
+ {
+ if (!is_array($GIF_src)) {
+ printf("%s: %s", $this->VER, $this->ERR['ERR00']);
+ exit(0);
+ }
+ $this->LOP = ($GIF_lop > -1) ? $GIF_lop : 0;
+ $this->DIS = ($GIF_dis > -1) ? (($GIF_dis < 3) ? $GIF_dis : 3) : 2;
+ $this->COL = ($GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1) ? ($GIF_red | ($GIF_grn << 8) | ($GIF_blu << 16)) : -1;
+
+ for ($i = 0; $i < count($GIF_src); $i++) {
+ if (strToLower($GIF_mod) == "url") {
+ $this->BUF[] = fread(fopen($GIF_src[$i], "rb"), filesize($GIF_src[$i]));
+ } else if (strToLower($GIF_mod) == "bin") {
+ $this->BUF[] = $GIF_src[$i];
+ } else {
+ printf("%s: %s ( %s )!", $this->VER, $this->ERR['ERR02'], $GIF_mod);
+ exit(0);
+ }
+ if (substr($this->BUF[$i], 0, 6) != "GIF87a" && substr($this->BUF[$i], 0, 6) != "GIF89a") {
+ printf("%s: %d %s", $this->VER, $i, $this->ERR['ERR01']);
+ exit(0);
+ }
+ for ($j = (13 + 3 * (2 << (ord($this->BUF[$i][10]) & 0x07))), $k = TRUE; $k; $j++) {
+ switch ($this->BUF[$i][$j]) {
+ case "!":
+ if ((substr($this->BUF[$i], ($j + 3), 8)) == "NETSCAPE") {
+ printf("%s: %s ( %s source )!", $this->VER, $this->ERR['ERR03'], ($i + 1));
+ exit(0);
+ }
+ break;
+ case ";":
+ $k = FALSE;
+ break;
+ }
+ }
+ }
+ $this->GIFAddHeader();
+ for ($i = 0; $i < count($this->BUF); $i++) {
+ $this->GIFAddFrames($i, $GIF_dly[$i]);
+ }
+ $this->GIFAddFooter();
+ }
+
+ /**
+ * GIFAddHeader
+ */
+ private function GIFAddHeader()
+ {
+ $cmap = 0;
+
+ if (ord($this->BUF[0][10]) & 0x80) {
+ $cmap = 3 * (2 << (ord($this->BUF[0][10]) & 0x07));
+
+ $this->GIF .= substr($this->BUF[0], 6, 7);
+ $this->GIF .= substr($this->BUF[0], 13, $cmap);
+ $this->GIF .= "!\377\13NETSCAPE2.0\3\1" . $this->GIFWord($this->LOP) . "\0";
+ }
+ }
+
+ /**
+ * GIFAddFrames
+ *
+ * @param [type] $i
+ * @param [type] $d
+ * @return void
+ */
+ private function GIFAddFrames($i, $d)
+ {
+
+ $Locals_str = 13 + 3 * (2 << (ord($this->BUF[$i][10]) & 0x07));
+
+ $Locals_end = strlen($this->BUF[$i]) - $Locals_str - 1;
+ $Locals_tmp = substr($this->BUF[$i], $Locals_str, $Locals_end);
+
+ $Global_len = 2 << (ord($this->BUF[0][10]) & 0x07);
+ $Locals_len = 2 << (ord($this->BUF[$i][10]) & 0x07);
+
+ $Global_rgb = substr($this->BUF[0], 13, 3 * (2 << (ord($this->BUF[0][10]) & 0x07)));
+ $Locals_rgb = substr($this->BUF[$i], 13, 3 * (2 << (ord($this->BUF[$i][10]) & 0x07)));
+
+ $Locals_ext = "!\xF9\x04" . chr(($this->DIS << 2) + 0) .
+ chr(($d >> 0) & 0xFF) . chr(($d >> 8) & 0xFF) . "\x0\x0";
+
+ if ($this->COL > -1 && ord($this->BUF[$i][10]) & 0x80) {
+ for ($j = 0; $j < (2 << (ord($this->BUF[$i][10]) & 0x07)); $j++) {
+ if (
+ ord($Locals_rgb[3 * $j + 0]) == (($this->COL >> 16) & 0xFF) &&
+ ord($Locals_rgb[3 * $j + 1]) == (($this->COL >> 8) & 0xFF) &&
+ ord($Locals_rgb[3 * $j + 2]) == (($this->COL >> 0) & 0xFF)
+ ) {
+ $Locals_ext = "!\xF9\x04" . chr(($this->DIS << 2) + 1) . chr(($d >> 0) & 0xFF) . chr(($d >> 8) & 0xFF) . chr($j) . "\x0";
+ break;
+ }
+ }
+ }
+ switch ($Locals_tmp[0]) {
+ case "!":
+ $Locals_img = substr($Locals_tmp, 8, 10);
+ $Locals_tmp = substr($Locals_tmp, 18, strlen($Locals_tmp) - 18);
+ break;
+ case ",":
+ $Locals_img = substr($Locals_tmp, 0, 10);
+ $Locals_tmp = substr($Locals_tmp, 10, strlen($Locals_tmp) - 10);
+ break;
+ }
+ if (ord($this->BUF[$i][10]) & 0x80 && $this->IMG > -1) {
+ if ($Global_len == $Locals_len) {
+ if ($this->GIFBlockCompare($Global_rgb, $Locals_rgb, $Global_len)) {
+ $this->GIF .= ($Locals_ext . $Locals_img . $Locals_tmp);
+ } else {
+ $byte = ord($Locals_img[9]);
+ $byte |= 0x80;
+ $byte &= 0xF8;
+ $byte |= (ord($this->BUF[0][10]) & 0x07);
+ $Locals_img[9] = chr($byte);
+ $this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);
+ }
+ } else {
+ $byte = ord($Locals_img[9]);
+ $byte |= 0x80;
+ $byte &= 0xF8;
+ $byte |= (ord($this->BUF[$i][10]) & 0x07);
+ $Locals_img[9] = chr($byte);
+ $this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);
+ }
+ } else {
+ $this->GIF .= ($Locals_ext . $Locals_img . $Locals_tmp);
+ }
+ $this->IMG = 1;
+ }
+
+ /**
+ * GIFAddFooter
+ *
+ * @return void
+ */
+ private function GIFAddFooter()
+ {
+ $this->GIF .= ";";
+ }
+
+ /**
+ * GIFBlockCompare
+ *
+ * @param [type] $GlobalBlock
+ * @param [type] $LocalBlock
+ * @param [type] $Len
+ * @return void
+ */
+ private function GIFBlockCompare($GlobalBlock, $LocalBlock, $Len)
+ {
+
+ for ($i = 0; $i < $Len; $i++) {
+ if (
+ $GlobalBlock[3 * $i + 0] != $LocalBlock[3 * $i + 0] ||
+ $GlobalBlock[3 * $i + 0] != $LocalBlock[3 * $i + 0] ||
+ $GlobalBlock[3 * $i + 2] != $LocalBlock[3 * $i + 2]
+ ) {
+ return (0);
+ }
+ }
+
+ return (1);
+ }
+
+ /**
+ * GIFWord
+ *
+ * @param [type] $int
+ * @return void
+ */
+ private function GIFWord($int)
+ {
+
+ return (chr($int & 0xFF) . chr(($int >> 8) & 0xFF));
+ }
+
+ /**
+ * GetAnimation
+ *
+ * @return void
+ */
+ public function GetAnimation()
+ {
+ return ($this->GIF);
+ }
+}
+
+/**
+ * 解析GIF
+ */
+class GIFDecoder
+{
+ private $GIF_buffer = [];
+ private $GIF_arrays = [];
+ private $GIF_delays = [];
+ private $GIF_stream = "";
+ private $GIF_string = "";
+ private $GIF_bfseek = 0;
+
+ private $GIF_screen = [];
+ private $GIF_global = [];
+ private $GIF_sorted;
+ private $GIF_colorS;
+ private $GIF_colorC;
+ private $GIF_colorF;
+
+ /**
+ * 构造方法
+ *
+ * @param [type] $GIF_pointer
+ */
+ public function __construct($GIF_pointer)
+ {
+ $this->GIF_stream = $GIF_pointer;
+
+ $this->GIFGetByte(6); // GIF89a
+ $this->GIFGetByte(7); // Logical Screen Descriptor
+
+ $this->GIF_screen = $this->GIF_buffer;
+ $this->GIF_colorF = $this->GIF_buffer[4] & 0x80 ? 1 : 0;
+ $this->GIF_sorted = $this->GIF_buffer[4] & 0x08 ? 1 : 0;
+ $this->GIF_colorC = $this->GIF_buffer[4] & 0x07;
+ $this->GIF_colorS = 2 << $this->GIF_colorC;
+
+ if ($this->GIF_colorF == 1) {
+ $this->GIFGetByte(3 * $this->GIF_colorS);
+ $this->GIF_global = $this->GIF_buffer;
+ }
+ for ($cycle = 1; $cycle;) {
+ if ($this->GIFGetByte(1)) {
+ switch ($this->GIF_buffer[0]) {
+ case 0x21:
+ $this->GIFReadExtensions();
+ break;
+ case 0x2C:
+ $this->GIFReadDescriptor();
+ break;
+ case 0x3B:
+ $cycle = 0;
+ break;
+ }
+ } else {
+ $cycle = 0;
+ }
+ }
+ }
+
+ /**
+ * GIFReadExtension
+ *
+ * @return void
+ */
+ private function GIFReadExtensions()
+ {
+ $this->GIFGetByte(1);
+ for (;;) {
+ $this->GIFGetByte(1);
+ if (($u = $this->GIF_buffer[0]) == 0x00) {
+ break;
+ }
+ $this->GIFGetByte($u);
+ if ($u == 4) {
+ $this->GIF_delays[] = ($this->GIF_buffer[1] | $this->GIF_buffer[2] << 8);
+ }
+ }
+ }
+
+ /**
+ * GIFReadExtension
+ *
+ * @return void
+ */
+ private function GIFReadDescriptor()
+ {
+ $GIF_screen = [];
+
+ $this->GIFGetByte(9);
+ $GIF_screen = $this->GIF_buffer;
+ $GIF_colorF = $this->GIF_buffer[8] & 0x80 ? 1 : 0;
+ if ($GIF_colorF) {
+ $GIF_code = $this->GIF_buffer[8] & 0x07;
+ $GIF_sort = $this->GIF_buffer[8] & 0x20 ? 1 : 0;
+ } else {
+ $GIF_code = $this->GIF_colorC;
+ $GIF_sort = $this->GIF_sorted;
+ }
+ $GIF_size = 2 << $GIF_code;
+ $this->GIF_screen[4] &= 0x70;
+ $this->GIF_screen[4] |= 0x80;
+ $this->GIF_screen[4] |= $GIF_code;
+ if ($GIF_sort) {
+ $this->GIF_screen[4] |= 0x08;
+ }
+ $this->GIF_string = "GIF87a";
+ $this->GIFPutByte($this->GIF_screen);
+ if ($GIF_colorF == 1) {
+ $this->GIFGetByte(3 * $GIF_size);
+ $this->GIFPutByte($this->GIF_buffer);
+ } else {
+ $this->GIFPutByte($this->GIF_global);
+ }
+ $this->GIF_string .= chr(0x2C);
+ $GIF_screen[8] &= 0x40;
+ $this->GIFPutByte($GIF_screen);
+ $this->GIFGetByte(1);
+ $this->GIFPutByte($this->GIF_buffer);
+ for (;;) {
+ $this->GIFGetByte(1);
+ $this->GIFPutByte($this->GIF_buffer);
+ if (($u = $this->GIF_buffer[0]) == 0x00) {
+ break;
+ }
+ $this->GIFGetByte($u);
+ $this->GIFPutByte($this->GIF_buffer);
+ }
+ $this->GIF_string .= chr(0x3B);
+ $this->GIF_arrays[] = $this->GIF_string;
+ }
+
+ /**
+ * GIFGetByte
+ *
+ * @param [type] $len
+ * @return void
+ */
+ private function GIFGetByte($len)
+ {
+ $this->GIF_buffer = [];
+
+ for ($i = 0; $i < $len; $i++) {
+ if ($this->GIF_bfseek > strlen($this->GIF_stream)) {
+ return 0;
+ }
+ $this->GIF_buffer[] = ord($this->GIF_stream[$this->GIF_bfseek++]);
+ }
+ return 1;
+ }
+
+ /**
+ * GIFPutByte
+ *
+ * @param [type] $bytes
+ * @return void
+ */
+ private function GIFPutByte($bytes)
+ {
+ for ($i = 0; $i < count($bytes); $i++) {
+ $this->GIF_string .= chr($bytes[$i]);
+ }
+ }
+
+ /**
+ * GIFGetFrames
+ *
+ * @return void
+ */
+ public function GIFGetFrames()
+ {
+ return ($this->GIF_arrays);
+ }
+
+ /**
+ * GIFGetDelays
+ *
+ * @return void
+ */
+ public function GIFGetDelays()
+ {
+ return ($this->GIF_delays);
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/IPLocation.php b/vendor/mongdch/mon-util/src/IPLocation.php
new file mode 100644
index 0000000..69f58d8
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/IPLocation.php
@@ -0,0 +1,495 @@
+
+ * @version 1.0.1 优化注解 2022-07-08
+ */
+class IPLocation
+{
+ use Instance;
+
+ /**
+ * qqwry.dat 文件指针
+ *
+ * @var resource
+ */
+ private $fp;
+
+ /**
+ * 第一条IP记录的偏移地址
+ *
+ * @var integer
+ */
+ private $firstip;
+
+ /**
+ * 最后一条IP记录的偏移地址
+ *
+ * @var integer
+ */
+ private $lastip;
+
+ /**
+ * IP记录的总条数(不包含版本信息记录)
+ *
+ * @var integer
+ */
+ private $totalip;
+
+ /**
+ * 运营商
+ *
+ * @var array
+ */
+ private $dict_isp = ['联通', '移动', '铁通', '电信', '长城', '鹏博士'];
+
+ /**
+ * 直辖市
+ *
+ * @var array
+ */
+ private $dict_city_directly = ['北京', '天津', '重庆', '上海'];
+
+ /**
+ * 省份
+ *
+ * @var array
+ */
+ private $dict_province = [
+ '北京', '天津', '重庆', '上海', '河北', '山西', '辽宁', '吉林', '黑龙江', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南',
+ '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '广西', '宁夏', '新疆', '西藏', '香港', '澳门'
+ ];
+
+ /**
+ * 初始化标志
+ *
+ * @var boolean
+ */
+ private $init = false;
+
+ /**
+ * 构造方法
+ *
+ * @param string $db IP库文件路径
+ */
+ public function __construct($db = '')
+ {
+ if (!empty($db)) {
+ $this->init($db);
+ }
+ }
+
+ /**
+ * 析构函数,关闭打开的IP库文件
+ */
+ public function __destruct()
+ {
+ if ($this->fp) {
+ fclose($this->fp);
+ }
+ $this->fp = 0;
+ }
+
+ /**
+ * 初始化
+ *
+ * @param string $db IP库文件路径
+ * @return IPLocation
+ */
+ public function init($db)
+ {
+ if (!file_exists($db)) {
+ throw new IPLocationException('IP数据文件未找到', IPLocationException::ERROR_DATA_NOT_FOUND);
+ }
+
+ $this->fp = 0;
+ if (($this->fp = fopen($db, 'rb')) !== false) {
+ $this->firstip = $this->getlong();
+ $this->lastip = $this->getlong();
+ $this->totalip = ($this->lastip - $this->firstip) / 7;
+ }
+
+ $this->init = true;
+ return $this;
+ }
+
+ /**
+ * 获取IP所在位置信息
+ * 注:province city county isp 对中国以外的ip无法识别
+ *
+ *
+ * $result 是返回的数组
+ * $result['ip'] 输入的ip
+ * $result['country'] 国家 如 中国
+ * $result['province'] 省份信息 如 河北省
+ * $result['city'] 市区 如 邢台市
+ * $result['county'] 郡县 如 威县
+ * $result['isp'] 运营商 如 联通
+ * $result['area'] 最完整的信息 如 中国河北省邢台市威县新科网吧(北外街)
+ *
+ *
+ * @param string $ip IP地址
+ * @throws IPLocationException
+ * @return array
+ */
+ public function getLocation($ip)
+ {
+ if (!$this->init) {
+ throw new IPLocationException('未初始化实例', IPLocationException::ERROR_NOT_INIT);
+ }
+ $result = [];
+ $location = [];
+ $is_china = false;
+ $seperator_sheng = '省';
+ $seperator_shi = '市';
+ $seperator_xian = '县';
+ $seperator_qu = '区';
+
+ if (!$this->isValidIpV4($ip)) {
+ // 验证IP格式
+ throw new IPLocationException('无效的IPv4地址', IPLocationException::ERROR_IPV4_FAILD);
+ } else {
+ // 获取所在地区信息
+ $location = $this->getLocationFromIP($ip);
+ if (!$location) {
+ throw new IPLocationException('读取IP数据文件失败', IPLocationException::ERROR_DATA_READ_FAILD);
+ }
+
+ // 原国家数据(例:北京市朝阳区)
+ $location['org_country'] = $location['country'];
+ // 原地区数据(例:// 金桥国际小区)
+ $location['org_area'] = $location['area'];
+ // 定义省市区参数
+ $location['province'] = '';
+ $location['city'] = '';
+ $location['county'] = '';
+ // 获取省市区信息
+ $_tmp_province = explode($seperator_sheng, $location['country']);
+ // 存在 省 标志 xxx省yyyy 中的yyyy
+ if (isset($_tmp_province[1])) {
+ $is_china = true;
+ $location['province'] = $_tmp_province[0];
+ // 存在市
+ if (mb_strpos($_tmp_province[1], $seperator_shi) !== false) {
+ $_tmp_city = explode($seperator_shi, $_tmp_province[1]);
+ $location['city'] = $_tmp_city[0] . $seperator_shi;
+ // 存在县
+ if (isset($_tmp_city[1])) {
+ if (mb_strpos($_tmp_city[1], $seperator_xian) !== false) {
+ $_tmp_county = explode($seperator_xian, $_tmp_city[1]);
+ $location['county'] = $_tmp_county[0] . $seperator_xian;
+ }
+ // 存在区
+ if (!$location['county'] && mb_strpos($_tmp_city[1], $seperator_qu) !== false) {
+ $_tmp_qu = explode($seperator_qu, $_tmp_city[1]);
+ $location['county'] = $_tmp_qu[0] . $seperator_qu;
+ }
+ }
+ }
+ } else {
+ // 处理如内蒙古等不带省份类型的和直辖市
+ foreach ($this->dict_province as $key => $value) {
+ if (false !== mb_strpos($location['country'], $value)) {
+ $is_china = true;
+ // 存在直辖市
+ if (in_array($value, $this->dict_city_directly)) {
+ $_tmp_province = explode($seperator_shi, $location['country']);
+ // 上海市浦江区xxx
+ if ($_tmp_province[0] == $value) {
+ $location['province'] = $_tmp_province[0];
+ // 市辖区
+ if (isset($_tmp_province[1])) {
+ if (mb_strpos($_tmp_province[1], $seperator_qu) !== false) {
+ $_tmp_qu = explode($seperator_qu, $_tmp_province[1]);
+ $location['city'] = $_tmp_qu[0] . $seperator_qu;
+ }
+ }
+ } else {
+ // 上海交通大学
+ $location['province'] = $value;
+ $location['org_area'] = $location['org_country'] . $location['org_area'];
+ }
+ } else {
+ // 省
+ $location['province'] = $value;
+ //没有省份标志 只能替换
+ $_tmp_city = str_replace($location['province'], '', $location['country']);
+ //防止直辖市捣乱 上海市xxx区 =》 市xx区
+ $_tmp_shi_pos = mb_stripos($_tmp_city, $seperator_shi);
+ if ($_tmp_shi_pos === 0) {
+ $_tmp_city = mb_substr($_tmp_city, 1);
+ }
+
+ // 内蒙古类型的获取市县信息
+ if (mb_strpos($_tmp_city, $seperator_shi) !== false) {
+ // 市
+ $_tmp_city = explode($seperator_shi, $_tmp_city);
+ $location['city'] = $_tmp_city[0] . $seperator_shi;
+ // 县
+ if (isset($_tmp_city[1])) {
+ if (mb_strpos($_tmp_city[1], $seperator_xian) !== false) {
+ $_tmp_county = explode($seperator_xian, $_tmp_city[1]);
+ $location['county'] = $_tmp_county[0] . $seperator_xian;
+ }
+ // 区
+ if (!$location['county'] && mb_strpos($_tmp_city[1], $seperator_qu) !== false) {
+ $_tmp_qu = explode($seperator_qu, $_tmp_city[1]);
+ $location['county'] = $_tmp_qu[0] . $seperator_qu;
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ // 标志国家为中国
+ if ($is_china) {
+ $location['country'] = '中国';
+ }
+ // 获取运营商信息
+ $location['isp'] = $this->getIsp($location['area']);
+
+ // $result['beginip'] = $location['beginip'];
+ // $result['endip'] = $location['endip'];
+ // $result['org_country'] = $location['org_country'];
+ // $result['org_area'] = $location['org_area'];
+
+ // 返回数据
+ $result['ip'] = $location['ip'];
+ $result['country'] = $location['country'];
+ $result['province'] = $location['province'];
+ $result['city'] = $location['city'];
+ $result['county'] = $location['county'];
+ $result['isp'] = $location['isp'];
+ $result['area'] = $location['country'] . $location['province'] . $location['city'] . $location['county'] . $location['org_area'];
+ }
+ return $result;
+ }
+
+ /**
+ * 根据所给IP地址或域名获取所在地区信息
+ *
+ * @param string $ip IP地址
+ * @return array
+ */
+ private function getLocationFromIP($ip)
+ {
+ // 如果数据文件没有被正确打开,则直接返回空
+ if (!$this->fp) {
+ return null;
+ }
+ $location['ip'] = $ip;
+ // 将输入的IP地址转化为可比较的IP地址,不合法的IP地址会被转化为255.255.255.255
+ $ip = $this->packip($location['ip']);
+ // 搜索的下边界
+ $l = 0;
+ // 搜索的上边界
+ $u = $this->totalip;
+ // 如果没有找到就返回最后一条IP记录(qqwry.dat的版本信息)
+ $findip = $this->lastip;
+ // 当上边界小于下边界时,查找失败
+ while ($l <= $u) {
+ // 计算近似中间记录
+ $i = floor(($l + $u) / 2);
+ fseek($this->fp, $this->firstip + $i * 7);
+ // 获取中间记录的开始IP地址
+ $beginip = strrev(fread($this->fp, 4));
+ // strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式,以便用于比较,后面相同。
+ if ($ip < $beginip) {
+ // 用户的IP小于中间记录的开始IP地址时,将搜索的上边界修改为中间记录减一
+ $u = $i - 1;
+ } else {
+ fseek($this->fp, $this->getlong3());
+ // 获取中间记录的结束IP地址
+ $endip = strrev(fread($this->fp, 4));
+ if ($ip > $endip) {
+ // 用户的IP大于中间记录的结束IP地址时,将搜索的下边界修改为中间记录加一
+ $l = $i + 1;
+ } else {
+ // 用户的IP在中间记录的IP范围内时,则表示找到结果,退出循环
+ $findip = $this->firstip + $i * 7;
+ break;
+ }
+ }
+ }
+ // 获取查找到的IP地理位置信息
+ fseek($this->fp, $findip);
+ // 用户IP所在范围的开始地址
+ $location['beginip'] = long2ip($this->getlong());
+ $offset = $this->getlong3();
+ fseek($this->fp, $offset);
+ // 用户IP所在范围的结束地址
+ $location['endip'] = long2ip($this->getlong());
+ $byte = fread($this->fp, 1);
+ switch (ord($byte)) {
+ case 1:
+ // 标志字节为1,表示国家和区域信息都被同时重定向
+ $countryOffset = $this->getlong3();
+ fseek($this->fp, $countryOffset);
+ $byte = fread($this->fp, 1);
+ switch (ord($byte)) {
+ case 2:
+ // 标志字节为2,表示国家信息被重定向
+ fseek($this->fp, $this->getlong3());
+ $location['country'] = $this->getstring();
+ fseek($this->fp, $countryOffset + 4);
+ $location['area'] = $this->getarea();
+ break;
+ default:
+ // 否则,表示国家信息没有被重定向
+ $location['country'] = $this->getstring($byte);
+ $location['area'] = $this->getarea();
+ break;
+ }
+ break;
+ case 2:
+ // 标志字节为2,表示国家信息被重定向
+ fseek($this->fp, $this->getlong3());
+ $location['country'] = $this->getstring();
+ fseek($this->fp, $offset + 8);
+ $location['area'] = $this->getarea();
+ break;
+ default:
+ // 否则,表示国家信息没有被重定向
+ $location['country'] = $this->getstring($byte);
+ $location['area'] = $this->getarea();
+ break;
+ }
+ // GBK转UTF8
+ $location['country'] = iconv("GBK", "UTF-8", $location['country']);
+ $location['area'] = iconv("GBK", "UTF-8", $location['area']);
+ // CZ88.NET表示没有有效信息
+ if ((mb_strpos($location['country'], 'CZ88.NET') !== false)) {
+ $location['country'] = "未知";
+ }
+ if (mb_strpos($location['area'], 'CZ88.NET') !== false) {
+ $location['area'] = '';
+ }
+ return $location;
+ }
+
+ /**
+ * 返回读取的长整型数
+ *
+ * @return integer
+ */
+ private function getlong()
+ {
+ // 将读取的little-endian编码的4个字节转化为长整型数
+ $result = unpack('Vlong', fread($this->fp, 4));
+
+ return $result['long'];
+ }
+
+ /**
+ * 返回读取的3个字节的长整型数
+ *
+ * @return integer
+ */
+ private function getlong3()
+ {
+ // 将读取的little-endian编码的3个字节转化为长整型数
+ $result = unpack('Vlong', fread($this->fp, 3) . chr(0));
+
+ return $result['long'];
+ }
+
+ /**
+ * 验证IP地址是否为IPV4
+ *
+ * @param string $ip IP地址
+ * @return boolean
+ */
+ private function isValidIpV4($ip)
+ {
+ return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
+ }
+
+ /**
+ * 返回压缩后可进行比较的IP地址
+ *
+ * @param string $ip IP地址
+ * @return string
+ */
+ private function packip($ip)
+ {
+ // 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,
+ // 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串
+ return pack('N', intval(Common::instance()->mIp2long($ip)));
+ }
+
+ /**
+ * 返回读取的字符串
+ *
+ * @param string $data
+ * @return string
+ */
+ private function getstring($data = "")
+ {
+ $char = fread($this->fp, 1);
+ while (ord($char) > 0) {
+ // 字符串按照C格式保存,以\0结束
+ $data .= $char;
+ // 将读取的字符连接到给定字符串之后
+ $char = fread($this->fp, 1);
+ }
+
+ return $data;
+ }
+
+ /**
+ * 获取地区信息
+ *
+ * @return string
+ */
+ private function getarea()
+ {
+ // 标志字节
+ $byte = fread($this->fp, 1);
+ switch (ord($byte)) {
+ case 0:
+ // 没有区域信息
+ $area = "";
+ break;
+ case 1:
+ case 2:
+ // 标志字节为1或2,表示区域信息被重定向
+ fseek($this->fp, $this->getlong3());
+ $area = $this->getstring();
+ break;
+ default:
+ // 否则,表示区域信息没有被重定向
+ $area = $this->getstring($byte);
+ break;
+ }
+
+ return $area;
+ }
+
+ /**
+ * 获取运营商信息
+ *
+ * @param $str
+ * @return string
+ */
+ private function getIsp($str)
+ {
+ $ret = '';
+ foreach ($this->dict_isp as $k => $v) {
+ if (false !== mb_strpos($str, $v)) {
+ $ret = $v;
+ break;
+ }
+ }
+
+ return $ret;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/IdCard.php b/vendor/mongdch/mon-util/src/IdCard.php
new file mode 100644
index 0000000..4e84ab2
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/IdCard.php
@@ -0,0 +1,226 @@
+
+ * @version 1.0.1 增加获取省份城市信息
+ */
+class IdCard
+{
+ use Instance;
+
+ /**
+ * 省份城市地区扩展数据配置文件路径
+ *
+ * @var string
+ */
+ public $dataFile = __DIR__ . '/data/idcard.php';
+
+ /**
+ * 正则验证规则
+ *
+ * @var string
+ */
+ protected $regx = '/^([\d]{17}[xX\d]|[\d]{15})$/';
+
+ /**
+ * 省份信息
+ *
+ * @var array
+ */
+ protected $provinces = [
+ 11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古",
+ 21 => "辽宁", 22 => "吉林", 23 => "黑龙江", 31 => "上海", 32 => "江苏",
+ 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东", 41 => "河南",
+ 42 => "湖北", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南", 50 => "重庆",
+ 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏", 61 => "陕西", 62 => "甘肃",
+ 63 => "青海", 64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外"
+ ];
+
+ /**
+ * 详细的省份城市地区信息
+ *
+ * @var array
+ */
+ protected $location = null;
+
+ /**
+ * 校验身份证号码
+ *
+ * @param string $idcard 身份证号码
+ * @return boolean
+ */
+ public function check($idcard)
+ {
+ // 校验位数
+ if (!preg_match($this->regx, $idcard)) {
+ return false;
+ }
+ // 校验省份码
+ if (!isset($this->provinces[mb_substr($idcard, 0, 2)])) {
+ return false;
+ }
+ // 校验生日
+ $birthday = $this->getBirthday($idcard);
+ if (date('Y-m-d', strtotime($birthday)) != $birthday) {
+ return false;
+ }
+ // 验证校验码
+ if (mb_strlen($idcard) == 18) {
+ $vSum = 0;
+ for ($i = 17; $i >= 0; $i--) {
+ $vSubStr = mb_substr($idcard, 17 - $i, 1);
+ $vSum += (pow(2, $i) % 11) * (($vSubStr == 'a') ? 10 : intval($vSubStr, 11));
+ }
+ if ($vSum % 11 != 1) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 获取所属省份
+ *
+ * @param string $idcard 身份证号码
+ * @return string
+ */
+ public function getProvinces($idcard)
+ {
+ $code = mb_substr($idcard, 0, 2);
+ return isset($this->provinces[$code]) ? $this->provinces[$code] : '';
+ }
+
+ /**
+ * 获取所属省份城市
+ *
+ * @param string $idcard 身份证号码
+ * @throws RuntimeException
+ * @return string
+ */
+ public function getCity($idcard)
+ {
+ if (is_null($this->location)) {
+ $this->location = include($this->dataFile);
+ if (empty($this->location) || !is_array($this->location)) {
+ throw new RuntimeException('Failed to get extended location information data!');
+ }
+ }
+
+ $code = mb_substr($idcard, 0, 4) . '00';
+ return isset($this->location[$code]) ? $this->location[$code] : '';
+ }
+
+ /**
+ * 获取所属省份城市地区信息
+ *
+ * @param string $idcard 身份证号码
+ * @throws RuntimeException
+ * @return string
+ */
+ public function getLocation($idcard)
+ {
+ if (is_null($this->location)) {
+ $this->location = include($this->dataFile);
+ if (empty($this->location) || !is_array($this->location)) {
+ throw new RuntimeException('Failed to get extended location information data!');
+ }
+ }
+ $code = mb_substr($idcard, 0, 6);
+ return isset($this->location[$code]) ? $this->location[$code] : '';
+ }
+
+ /**
+ * 获取生日
+ *
+ * @param string $idcard 身份证号
+ * @return string
+ */
+ public function getBirthday($idcard)
+ {
+ $idcard = preg_replace('/[xX]$/i', 'a', $idcard);
+ $vLength = mb_strlen($idcard);
+ if ($vLength == 18) {
+ $birthday = mb_substr($idcard, 6, 4) . '-' . mb_substr($idcard, 10, 2) . '-' . mb_substr($idcard, 12, 2);
+ } else {
+ $birthday = '19' . mb_substr($idcard, 6, 2) . '-' . mb_substr($idcard, 8, 2) . '-' . mb_substr($idcard, 10, 2);
+ }
+ return $birthday;
+ }
+
+ /**
+ * 获取性别
+ *
+ * @param string $idcard 身份证号码
+ * @return integer 1男 2女
+ */
+ public function getSex($idcard)
+ {
+ // 转18位身份证号码
+ $idcard = $this->fifteen2Eighteen($idcard);
+ return (int)mb_substr($idcard, 16, 1) % 2 === 0 ? 2 : 1;
+ }
+
+ /**
+ * 获取年龄
+ *
+ * @param string $idcard 身份证号码
+ * @return integer
+ */
+ public function getAge($idcard)
+ {
+ $birthday = $this->getBirthday($idcard) . '000000';
+ $birthday_ts = strtotime($birthday);
+ $curr_ts = time();
+ //得到两个日期相差的大体年数
+ $diff = floor(($curr_ts - $birthday_ts) / 86400 / 365);
+ $age = strtotime(mb_substr($birthday, 0, 8) . ' +' . $diff . 'years') > $curr_ts ? ($diff + 1) : $diff;
+ return intval($age);
+ }
+
+ /**
+ * 15位转18位身份证号
+ *
+ * @param string $idcard 身份证号
+ * @return string
+ */
+ public function fifteen2Eighteen($idcard)
+ {
+ if (mb_strlen($idcard) != 15) {
+ return $idcard;
+ }
+
+ $code = '19';
+ $idCardBase = mb_substr($idcard, 0, 6) . $code . mb_substr($idcard, 6, 9);
+ return $idCardBase . $this->getCode($idCardBase);
+ }
+
+ /**
+ * 获取校验码
+ *
+ * @param string $idCardBase 17位以上的身份号码
+ * @throws InvalidArgumentException
+ * @return string
+ */
+ protected function getCode($idCardBase)
+ {
+ $length = 17;
+ if (mb_strlen($idCardBase) < $length) {
+ throw new InvalidArgumentException('idCardBase params faild');
+ }
+ $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
+ $verifyNumbers = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
+ $sum = 0;
+ for ($i = 0; $i < $length; $i++) {
+ $sum += mb_substr($idCardBase, $i, 1) * $factor[$i];
+ }
+ $index = $sum % 11;
+ return $verifyNumbers[$index];
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/IdCode.php b/vendor/mongdch/mon-util/src/IdCode.php
new file mode 100644
index 0000000..5c0a410
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/IdCode.php
@@ -0,0 +1,157 @@
+
+ * @version 1.0.1 优化代码 2022-07-08
+ */
+class IdCode
+{
+ use Instance;
+
+ /**
+ * 起始数
+ *
+ * @var integer
+ */
+ private $initNum = 4015732869;
+
+ /**
+ * 进制的基本字符串
+ *
+ * @var string
+ */
+ private $baseChar = '8745692031ZYXWVTSRQPNMKJHGFEDCBA';
+
+ /**
+ * 使用32进制运算
+ *
+ * @var integer
+ */
+ private $type = 32;
+
+ /**
+ * 补足第3位
+ *
+ * @var string
+ */
+ private $three = 'K';
+
+ /**
+ * 补足第4位
+ *
+ * @var string
+ */
+ private $four = 'X';
+
+ /**
+ * 初始化
+ *
+ * @param integer $initNum 起始数
+ * @param string $baseChar 进制的基本字符串
+ * @return IdCode
+ */
+ public function init($initNum = 4015732869, $baseChar = '8745692031ZYXWVTSRQPNMKJHGFEDCBA', $three = 'K', $four = 'X')
+ {
+ $this->initNum = $initNum;
+ $this->baseChar = $baseChar;
+ $this->three = $three;
+ $this->four = $four;
+ return $this;
+ }
+
+ /**
+ * ID转code(10位内id 返回7位字母数字)
+ *
+ * @see 10进制数转换成32进制数
+ * @param integer $id id值
+ * @return string
+ */
+ public function id2code($id)
+ {
+ //数组 增加备用数值
+ $id += $this->initNum;
+ //左补0 补齐10位
+ $str = str_pad($id, 10, '0', STR_PAD_LEFT);
+ //按位 拆分 4 6位(32进制 4 6位划分)
+ $num1 = intval($str[0] . $str[2] . $str[6] . $str[9]);
+ $num2 = intval($str[1] . $str[3] . $str[4] . $str[5] . $str[7] . $str[8]);
+ $str1 = $str2 = '';
+ $str1 = $this->id2String($num1);
+ $str1 = strrev($str1);
+ $str2 = $this->id2String($num2);
+ $str2 = strrev($str2);
+ // 补足第3、4位
+ return str_pad($str1, 3, $this->three, STR_PAD_RIGHT) . str_pad($str2, 4, $this->four, STR_PAD_RIGHT);
+ }
+
+ /**
+ * code转ID
+ *
+ * @see 三十二进制数转换成十机制数
+ * @param integer $id id值
+ * @return integer
+ */
+ public function code2id($code)
+ {
+ // 清除3、4位补足位
+ $str1 = trim(mb_substr($code, 0, 3), $this->three);
+ $str2 = trim(mb_substr($code, 3, 4), $this->four);
+ // 转换数值
+ $num1 = $this->string2Id($str1);
+ $num2 = $this->string2Id($str2);
+ // 补位拼接
+ $str1 = str_pad($num1, 4, '0', STR_PAD_LEFT);
+ $str2 = str_pad($num2, 6, '0', STR_PAD_LEFT);
+ $id = ltrim($str1[0] . $str2[0] . $str1[1] . $str2[1] . $str2[2] . $str2[3] . $str1[2] . $str2[4] . $str2[5] . $str1[3], '0');
+ if ($id === '') {
+ return $id;
+ }
+ // 减去初始数值
+ $id -= $this->initNum;
+ return $id;
+ }
+
+ /**
+ * 数字进行进制转换
+ *
+ * @param integer $num 数值
+ * @return string
+ */
+ protected function id2String($num)
+ {
+ $str = '';
+ while ($num != 0) {
+ $tmp = $num % $this->type;
+ $str .= $this->baseChar[$tmp];
+ $num = intval($num / $this->type);
+ }
+
+ return $str;
+ }
+
+ /**
+ * 字符串转数字
+ *
+ * @param string $str
+ * @return float|int|string
+ */
+ protected function string2Id($str)
+ {
+ //转换为数组
+ $charArr = array_flip((array)str_split($this->baseChar));
+ $num = 0;
+ for ($i = 0, $l = mb_strlen($str); $i <= $l - 1; $i++) {
+ $linshi = mb_substr($str, $i, 1);
+ if (!isset($charArr[$linshi])) {
+ return '';
+ }
+ $num += $charArr[$linshi] * pow($this->type, mb_strlen($str) - $i - 1);
+ }
+
+ return $num;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Image.php b/vendor/mongdch/mon-util/src/Image.php
new file mode 100644
index 0000000..145997a
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Image.php
@@ -0,0 +1,646 @@
+
+ * @version 1.1.1 优化代码 2022-07-8
+ */
+class Image
+{
+ /**
+ * 图像资源对象
+ *
+ * @var \GdImage
+ */
+ private $img;
+
+ /**
+ * 图像信息,包括width,height,type,mime,size
+ *
+ * @var array
+ */
+ private $info;
+
+ /**
+ * gif图片特殊处理实例
+ *
+ * @var GIF
+ */
+ protected $gif;
+
+ /**
+ * 构造方法
+ *
+ * @throws ImgException
+ * @param string $img 图片地址
+ */
+ public function __construct($img = null)
+ {
+ if (!extension_loaded('gd')) {
+ throw new ImgException('未启用GD扩展');
+ }
+ if (is_string($img)) {
+ $this->open($img);
+ }
+ }
+
+ /**
+ * 打开一张图片
+ *
+ * @param string $imgname 图片路径
+ * @throws ImgException
+ * @return Image
+ */
+ public function open($imgname)
+ {
+ // 检测图像文件
+ if (!is_file($imgname)) {
+ throw new ImgException('不存在的图像文件', ImgException::ERROR_IMG_NOT_FOUND);
+ }
+ // 获取图像信息
+ $info = getimagesize($imgname);
+ // 检测图像合法性
+ if (false === $info || (IMAGETYPE_GIF === $info[2] && empty($info['bits']))) {
+ throw new ImgException('非法图像文件', ImgException::ERROR_IMG_FAILD);
+ }
+ // 设置图像信息
+ $this->info = [
+ 'width' => $info[0],
+ 'height' => $info[1],
+ 'type' => image_type_to_extension($info[2], false),
+ 'mime' => $info['mime'],
+ ];
+
+ // 销毁已存在的图像
+ empty($this->img) || imagedestroy($this->img);
+
+ //打开图像
+ if ('gif' == $this->info['type']) {
+ $this->gif = new GIF($imgname);
+ $this->img = imagecreatefromstring($this->gif->image());
+ } else {
+ $fun = "imagecreatefrom{$this->info['type']}";
+ if (!function_exists($fun)) {
+ throw new ImgException('不支持的图片类型', ImgException::ERROR_IMG_TYPE_NOT_SUPPORT);
+ }
+ $this->img = call_user_func($fun, $imgname);
+ }
+
+ return $this;
+ }
+
+ /**
+ * 保存图像
+ *
+ * @param string $imgname 图像保存名称
+ * @param string $type 图像类型
+ * @param boolean $interlace 是否对JPEG类型图像设置隔行扫描
+ * @throws ImgException
+ * @return boolean|integer
+ */
+ public function save($imgname, $type = null, $interlace = true)
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有可以被保存的图像资源', ImgException::ERROR_IMG_SAVE);
+ }
+ // 自动获取图像类型
+ if (is_null($type)) {
+ $type = $this->info['type'];
+ } else {
+ $type = strtolower($type);
+ }
+ // JPEG图像设置隔行扫描
+ if ('jpeg' == $type || 'jpg' == $type) {
+ $type = 'jpeg';
+ imageinterlace($this->img, $interlace);
+ }
+ // 保存图像
+ if ('gif' == $type && !empty($this->gif)) {
+ $save = $this->gif->save($imgname);
+ } else {
+ $fun = "image{$type}";
+ if (!function_exists($fun)) {
+ throw new ImgException('不支持的图片类型', ImgException::ERROR_IMG_TYPE_NOT_SUPPORT);
+ }
+ $save = call_user_func($fun, $this->img, $imgname);
+ }
+
+ return $save;
+ }
+
+ /**
+ * 输出图片
+ *
+ * @param boolean $echo 是否直接输出
+ * @throws ImgException
+ * @return mixed
+ */
+ public function output($type = null, $interlace = true, $echo = true)
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有可以被保存的图像资源', ImgException::ERROR_IMG_SAVE);
+ }
+ // 自动获取图像类型
+ if (is_null($type)) {
+ $type = $this->info['type'];
+ } else {
+ $type = strtolower($type);
+ }
+ // JPEG图像设置隔行扫描
+ if ('jpeg' == $type || 'jpg' == $type) {
+ $type = 'jpeg';
+ imageinterlace($this->img, $interlace);
+ }
+ $fun = "image{$type}";
+ if (!function_exists($fun)) {
+ throw new ImgException('不支持的图片类型', ImgException::ERROR_IMG_TYPE_NOT_SUPPORT);
+ }
+ // 获取输出图像
+ ob_start();
+ call_user_func($fun, $this->img);
+ $content = ob_get_clean();
+ // 输出图像
+ if ($echo) {
+ header("Content-type: image/" . $type);
+ echo $content;
+ }
+
+ return $content;
+ }
+
+ /**
+ * 返回图像宽度
+ *
+ * @throws ImgException
+ * @return integer 图像宽度
+ */
+ public function width()
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+
+ return $this->info['width'];
+ }
+
+ /**
+ * 返回图像高度
+ *
+ * @throws ImgException
+ * @return integer 图像高度
+ */
+ public function height()
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+
+ return $this->info['height'];
+ }
+
+ /**
+ * 返回图像类型
+ *
+ * @throws ImgException
+ * @return string 图像类型
+ */
+ public function type()
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+
+ return $this->info['type'];
+ }
+
+ /**
+ * 返回图像MIME类型
+ *
+ * @throws ImgException
+ * @return string 图像MIME类型
+ */
+ public function mime()
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+
+ return $this->info['mime'];
+ }
+
+ /**
+ * 返回图像尺寸数组 0 - 图像宽度,1 - 图像高度
+ *
+ * @throws ImgException
+ * @return array 图像尺寸
+ */
+ public function size()
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+
+ return [
+ 'width' => $this->info['width'],
+ 'height' => $this->info['height']
+ ];
+ }
+
+ /**
+ * 裁剪图像
+ *
+ * @param integer $w 裁剪区域宽度
+ * @param integer $h 裁剪区域高度
+ * @param integer $x 裁剪区域x坐标
+ * @param integer $y 裁剪区域y坐标
+ * @param integer $width 图像保存宽度
+ * @param integer $height 图像保存高度
+ * @throws ImgException
+ * @return Image
+ */
+ public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null)
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+
+ //设置保存尺寸
+ empty($width) && $width = $w;
+ empty($height) && $height = $h;
+ do {
+ // 创建新图像
+ $img = imagecreatetruecolor($width, $height);
+ // 调整默认颜色
+ $color = imagecolorallocate($img, 255, 255, 255);
+ imagefill($img, 0, 0, $color);
+ // 裁剪
+ imagecopyresampled($img, $this->img, 0, 0, $x, $y, $width, $height, $w, $h);
+ // 销毁原图
+ imagedestroy($this->img);
+ // 设置新图像
+ $this->img = $img;
+ } while (!empty($this->gif) && $this->gifNext());
+
+ $this->info['width'] = $width;
+ $this->info['height'] = $height;
+
+ return $this;
+ }
+
+ /**
+ * 生成缩略图
+ *
+ * @param integer $width 缩略图最大宽度
+ * @param integer $height 缩略图最大高度
+ * @param integer $type 缩略图裁剪类型, 1:等比例缩放;2:居中裁剪;3:左上角裁剪;4:右下角裁剪;5:填充;6:固定
+ * @throws ImgException
+ * @return Image
+ */
+ public function thumb($width, $height, $type = 1)
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+
+ // 原图宽度和高度
+ $w = $this->info['width'];
+ $h = $this->info['height'];
+ // 计算缩略图生成的必要参数
+ switch ($type) {
+ case 1:
+ // 等比例缩放 原图尺寸小于缩略图尺寸则不进行缩略
+ if ($w < $width && $h < $height) {
+ return;
+ };
+ // 计算缩放比例
+ $scale = min($width / $w, $height / $h);
+ // 设置缩略图的坐标及宽度和高度
+ $x = $y = 0;
+ $width = $w * $scale;
+ $height = $h * $scale;
+ break;
+
+ case 2:
+ // 居中裁剪
+ $scale = max($width / $w, $height / $h);
+ // 设置缩略图的坐标及宽度和高度
+ $w = $width / $scale;
+ $h = $height / $scale;
+ $x = ($this->info['width'] - $w) / 2;
+ $y = ($this->info['height'] - $h) / 2;
+ break;
+ case 3:
+ // 左上角裁剪
+ $scale = max($width / $w, $height / $h);
+ // 设置缩略图的坐标及宽度和高度
+ $x = $y = 0;
+ $w = $width / $scale;
+ $h = $height / $scale;
+ break;
+ case 4:
+ // 右下角裁剪
+ $scale = max($width / $w, $height / $h);
+ // 设置缩略图的坐标及宽度和高度
+ $w = $width / $scale;
+ $h = $height / $scale;
+ $x = $this->info['width'] - $w;
+ $y = $this->info['height'] - $h;
+ break;
+ case 5:
+ // 填充
+ if ($w < $width && $h < $height) {
+ $scale = 1;
+ } else {
+ $scale = min($width / $w, $height / $h);
+ }
+ // 设置缩略图的坐标及宽度和高度
+ $neww = $w * $scale;
+ $newh = $h * $scale;
+ $posx = ($width - $w * $scale) / 2;
+ $posy = ($height - $h * $scale) / 2;
+ $x = $y = 0;
+ do {
+ // 创建新图像
+ $img = imagecreatetruecolor($width, $height);
+ // 调整默认颜色
+ $color = imagecolorallocate($img, 255, 255, 255);
+ imagefill($img, 0, 0, $color);
+ // 裁剪
+ imagecopyresampled($img, $this->img, $posx, $posy, $x, $y, $neww, $newh, $w, $h);
+ imagedestroy($this->img); //销毁原图
+ $this->img = $img;
+ } while (!empty($this->gif) && $this->gifNext());
+
+ $this->info['width'] = $width;
+ $this->info['height'] = $height;
+ return $this;
+ case 6:
+ // 固定
+ $x = $y = 0;
+ break;
+ default:
+ throw new ImgException('不支持的缩略图裁剪类型', ImgException::ERROR_IMG_NOT_SUPPORT);
+ }
+
+ // 裁剪图像
+ return $this->crop($w, $h, $x, $y, $width, $height);
+ }
+
+ /**
+ * 添加水印
+ *
+ * @param string $source 水印图片路径
+ * @param integer $locate 水印位置, 1-9对应数字键盘位置
+ * @throws ImgException
+ * @return Image
+ */
+ public function water($source, $locate = 3)
+ {
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+ if (!is_file($source)) {
+ throw new ImgException('水印图像不存在', ImgException::ERROR_IMG_NOT_FOUND_WATER);
+ }
+
+ // 获取水印图像信息
+ $info = getimagesize($source);
+ if (false === $info || (IMAGETYPE_GIF === $info[2] && empty($info['bits']))) {
+ throw new ImgException('非法水印文件', ImgException::ERROR_IMG_FAILD_WATER);
+ }
+ // 创建水印图像资源
+ $fun = 'imagecreatefrom' . image_type_to_extension($info[2], false);
+ $water = $fun($source);
+ // 设定水印图像的混色模式
+ imagealphablending($water, true);
+ // 设定水印位置
+ switch ($locate) {
+ case 3:
+ // 右下角水印
+ $x = $this->info['width'] - $info[0];
+ $y = $this->info['height'] - $info[1];
+ break;
+ case 1:
+ // 左下角水印
+ $x = 0;
+ $y = $this->info['height'] - $info[1];
+ break;
+ case 7:
+ // 左上角水印
+ $x = $y = 0;
+ break;
+ case 9:
+ // 右上角水印
+ $x = $this->info['width'] - $info[0];
+ $y = 0;
+ break;
+ case 5:
+ // 居中水印
+ $x = ($this->info['width'] - $info[0]) / 2;
+ $y = ($this->info['height'] - $info[1]) / 2;
+ break;
+ case 2:
+ // 下居中水印
+ $x = ($this->info['width'] - $info[0]) / 2;
+ $y = $this->info['height'] - $info[1];
+ break;
+ case 6:
+ // 右居中水印
+ $x = $this->info['width'] - $info[0];
+ $y = ($this->info['height'] - $info[1]) / 2;
+ break;
+ case 8:
+ // 上居中水印
+ $x = ($this->info['width'] - $info[0]) / 2;
+ $y = 0;
+ break;
+ case 4:
+ // 左居中水印
+ $x = 0;
+ $y = ($this->info['height'] - $info[1]) / 2;
+ break;
+ default:
+ // 自定义水印坐标
+ if (is_array($locate)) {
+ list($x, $y) = $locate;
+ } else {
+ throw new ImgException('不支持的水印位置类型', ImgException::ERROR_IMG_NOT_SUPPORT_WATER);
+ }
+ break;
+ }
+
+ do {
+ // 添加水印
+ $src = imagecreatetruecolor($info[0], $info[1]);
+ // 调整默认颜色
+ $color = imagecolorallocate($src, 255, 255, 255);
+ imagefill($src, 0, 0, $color);
+ imagecopy($src, $this->img, 0, 0, $x, $y, $info[0], $info[1]);
+ imagecopy($src, $water, 0, 0, 0, 0, $info[0], $info[1]);
+ imagecopymerge($this->img, $src, $x, $y, 0, 0, $info[0], $info[1], 100);
+ //销毁零时图片资源
+ imagedestroy($src);
+ } while (!empty($this->gif) && $this->gifNext());
+ // 销毁水印资源
+ imagedestroy($water);
+
+ return $this;
+ }
+
+ /**
+ * 图像添加文字
+ *
+ * @param string $text 添加的文字
+ * @param string $font 字体路径
+ * @param integer $size 字号
+ * @param string $color 文字颜色
+ * @param integer $locate 文字写入位置, 1-9对应小键盘位置
+ * @param integer|array $offset 文字相对当前位置的偏移量
+ * @param integer $angle 文字倾斜角度
+ * @throws ImgException
+ * @return Image
+ */
+ public function text($text, $font, $size, $color = '#00000000', $locate = 3, $offset = 0, $angle = 0)
+ {
+ // 资源检测
+ if (empty($this->img)) {
+ throw new ImgException('没有指定图像资源', ImgException::ERROR_IMG_NOT_SPECIFIED);
+ }
+ if (!is_file($font)) {
+ throw new ImgException("不存在的字体文件:{$font}", ImgException::ERROR_IMG_NOT_FOUND_FONT);
+ }
+ // 获取文字信息
+ $info = imagettfbbox($size, $angle, realpath($font), $text);
+ $minx = min($info[0], $info[2], $info[4], $info[6]);
+ $maxx = max($info[0], $info[2], $info[4], $info[6]);
+ $miny = min($info[1], $info[3], $info[5], $info[7]);
+ $maxy = max($info[1], $info[3], $info[5], $info[7]);
+
+ // 计算文字初始坐标和尺寸
+ $x = $minx;
+ $y = abs($miny);
+ $w = $maxx - $minx;
+ $h = $maxy - $miny;
+
+ // 设定文字位置
+ switch ($locate) {
+ case 3:
+ // 右下角文字
+ $x += $this->info['width'] - $w;
+ $y += $this->info['height'] - $h;
+ break;
+ case 1:
+ // 左下角文字
+ $y += $this->info['height'] - $h;
+ break;
+ case 7:
+ // 左上角文字,起始坐标即为左上角坐标,无需调整
+ break;
+ case 9:
+ // 右上角文字
+ $x += $this->info['width'] - $w;
+ break;
+ case 5:
+ // 居中文字
+ $x += ($this->info['width'] - $w) / 2;
+ $y += ($this->info['height'] - $h) / 2;
+ break;
+ case 2:
+ // 下居中文字
+ $x += ($this->info['width'] - $w) / 2;
+ $y += $this->info['height'] - $h;
+ break;
+ case 6:
+ // 右居中文字
+ $x += $this->info['width'] - $w;
+ $y += ($this->info['height'] - $h) / 2;
+ break;
+ case 8:
+ // 上居中文字
+ $x += ($this->info['width'] - $w) / 2;
+ break;
+ case 4:
+ // 左居中文字
+ $y += ($this->info['height'] - $h) / 2;
+ break;
+ default:
+ // 自定义文字坐标
+ if (is_array($locate)) {
+ list($posx, $posy) = $locate;
+ $x += $posx;
+ $y += $posy;
+ } else {
+ throw new ImgException('不支持的文字位置类型', ImgException::ERROR_IMG_NOT_SUPPORT_FONT);
+ }
+ break;
+ }
+
+ // 设置偏移量
+ if (is_array($offset)) {
+ $offset = array_map('intval', $offset);
+ list($ox, $oy) = $offset;
+ } else {
+ $offset = intval($offset);
+ $ox = $oy = $offset;
+ }
+
+ // 设置颜色
+ if (is_string($color) && 0 === mb_strpos($color, '#')) {
+ $color = str_split(mb_substr($color, 1), 2);
+ $color = array_map('hexdec', (array) $color);
+ if (empty($color[3]) || $color[3] > 127) {
+ $color[3] = 0;
+ }
+ } elseif (!is_array($color)) {
+ throw new ImgException('错误的颜色值', ImgException::ERROR_IMG_FAILD_COLOR);
+ }
+
+ do {
+ // 写入文字
+ $col = imagecolorallocatealpha($this->img, $color[0], $color[1], $color[2], $color[3]);
+ imagettftext($this->img, $size, $angle, $x + $ox, $y + $oy, $col, realpath($font), $text);
+ } while (!empty($this->gif) && $this->gifNext());
+
+ return $this;
+ }
+
+ /**
+ * 切换到GIF的下一帧并保存当前帧
+ *
+ * @return mixed
+ */
+ protected function gifNext()
+ {
+ ob_start();
+ ob_implicit_flush(0);
+ imagegif($this->img);
+ $img = ob_get_clean();
+ $this->gif->image($img);
+ $next = $this->gif->nextImage();
+ if ($next) {
+ imagedestroy($this->img);
+ $this->img = imagecreatefromstring($next);
+ return $next;
+ } else {
+ imagedestroy($this->img);
+ $this->img = imagecreatefromstring($this->gif->image());
+ return false;
+ }
+ }
+
+ /**
+ * 析构方法,用于销毁图像资源
+ *
+ * @return void
+ */
+ public function __destruct()
+ {
+ empty($this->img) || imagedestroy($this->img);
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Instance.php b/vendor/mongdch/mon-util/src/Instance.php
new file mode 100644
index 0000000..45aabbf
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Instance.php
@@ -0,0 +1,56 @@
+ " . $method);
+ }
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Lang.php b/vendor/mongdch/mon-util/src/Lang.php
new file mode 100644
index 0000000..095f1fd
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Lang.php
@@ -0,0 +1,183 @@
+
+ * @version 1.0.0
+ */
+class Lang
+{
+ use Instance;
+
+ /**
+ * 语言信息
+ *
+ * @var array
+ */
+ protected $lang = [];
+
+ /**
+ * 当前选择的默认语言
+ *
+ * @var string
+ */
+ protected $range = 'zh-cn';
+
+ /**
+ * 多语言cookie标志
+ *
+ * @var string
+ */
+ protected $lang_var = 'mon_lang_var';
+
+ /**
+ * 设定当前的语言
+ *
+ * @param string $range 语言类型
+ * @return string
+ */
+ public function range($range = '')
+ {
+ if ($range) {
+ $this->range = $range;
+ }
+
+ return $this->range;
+ }
+
+ /**
+ * 动态语言定义
+ *
+ * @param string|array $name 键名
+ * @param string $value 值
+ * @param string $range 语言作用域
+ */
+ public function set($name, $value = '', $range = '')
+ {
+ $range = $range ?: $this->range;
+
+ if (!isset($this->lang[$range])) {
+ $this->lang[$range] = [];
+ }
+
+ if (is_array($name)) {
+ return $this->lang[$range] = array_change_key_case((array) $name) + $this->lang[$range];
+ }
+
+ return $this->lang[$range][strtolower($name)] = $value;
+ }
+
+ /**
+ * 加载语言包
+ *
+ * @param array|string $file 语言文件
+ * @param string $range 语言作用域
+ * @return mixed
+ */
+ public function load($file, $range = '')
+ {
+ $range = $range ?: $this->range;
+
+ if (!isset($this->lang[$range])) {
+ $this->lang[$range] = [];
+ }
+
+ $lang = [];
+ if (is_file($file)) {
+ $_lang = include $file;
+ if (is_array($_lang)) {
+ $lang = array_change_key_case($_lang) + $lang;
+ }
+ }
+
+ if (!empty($lang)) {
+ $this->lang[$range] = $lang + $this->lang[$range];
+ }
+
+ return $this->lang[$range];
+ }
+
+ /**
+ * 判断语言是否已定义
+ *
+ * @param string $name 键名
+ * @param string $range 语言作用域
+ * @return boolean
+ */
+ public function has($name, $range = '')
+ {
+ $range = $range ?: $this->range;
+
+ return isset($this->lang[$range][strtolower($name)]);
+ }
+
+ /**
+ * 获取语言定义
+ *
+ * @param string $name 键名
+ * @param array $vars 替换变量
+ * @param string $range 语言类型
+ * @return mixed
+ */
+ public function get($name, $vars = [], $range = '')
+ {
+ $range = $range ?: $this->range;
+
+ // 空参数返回所有定义
+ if (empty($name)) {
+ return $this->lang[$range];
+ }
+
+ $key = strtolower($name);
+ $value = isset($this->lang[$range][$key]) ? $this->lang[$range][$key] : $name;
+
+ // 变量解析
+ if (!empty($vars) && is_array($vars)) {
+ /**
+ * Notes:
+ * 为了检测的方便,数字索引的判断仅仅是参数数组的第一个元素的key为数字0
+ * 数字索引采用的是系统的 sprintf 函数替换,用法请参考 sprintf 函数
+ */
+ if (key($vars) === 0) {
+ // 数字索引解析
+ array_unshift($vars, $value);
+ $value = call_user_func_array('sprintf', $vars);
+ } else {
+ // 关联索引解析
+ $replace = array_keys($vars);
+ foreach ($replace as &$v) {
+ $v = "{$v}";
+ }
+ $value = str_replace($replace, $vars, $value);
+ }
+ }
+
+ return $value;
+ }
+
+ /**
+ * 检测设置获取当前语言
+ *
+ * @return mixed
+ */
+ public function detect()
+ {
+ if (isset($_COOKIE[$this->lang_var])) {
+ $this->range = strtolower($_COOKIE[$this->lang_var]);
+ } else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+ // 自动侦测浏览器语言
+ preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
+ $lang = strtolower($matches[1]);
+ if (isset($this->lang[$lang])) {
+ $this->range = $this->lang[$lang];
+ }
+ }
+
+ return $this->range;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Log.php b/vendor/mongdch/mon-util/src/Log.php
new file mode 100644
index 0000000..9b8810c
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Log.php
@@ -0,0 +1,242 @@
+
+ * @version 1.0.0
+ */
+class Log
+{
+ use Instance;
+
+ /**
+ * 日志级别
+ */
+ const ERROR = 'error';
+ const WARNING = 'warning';
+ const NOTICE = 'notice';
+ const INFO = 'info';
+ const DEBUG = 'debug';
+
+ /**
+ * 日志配置
+ *
+ * @var array
+ */
+ protected $config = [
+ 'maxSize' => 20480000, // 日志文件大小
+ 'logPath' => '', // 日志目录
+ 'rollNum' => 3, // 日志滚动卷数
+ 'logName' => '', // 日志名称,空则使用当前日期作为名称
+ 'splitLine' => '====================================================================================',
+ ];
+
+ /**
+ * 日志信息
+ *
+ * @var array
+ */
+ protected $log = [];
+
+ /**
+ * 初始化日志配置
+ *
+ * @param array $config 配置信息
+ */
+ protected function __construct(array $config = [])
+ {
+ $this->setConfig($config);
+ }
+
+ /**
+ * 定义日志配置信息
+ *
+ * @param array $config 配置信息
+ * @return Log
+ */
+ public function setConfig(array $config)
+ {
+ $this->config = array_merge($this->config, $config);
+ return $this;
+ }
+
+ /**
+ * 获取配置信息
+ *
+ * @return array
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * 获取日志信息
+ *
+ * @param string $type 信息类型
+ * @return array
+ */
+ public function getLog($type = null)
+ {
+ return $type ? $this->log[$type] : $this->log;
+ }
+
+ /**
+ * 清空日志信息
+ *
+ * @return Log
+ */
+ public function clear()
+ {
+ $this->log = [];
+ return $this;
+ }
+
+ /**
+ * 记录日志信息
+ *
+ * @param string $message 日志信息
+ * @param string $type 日志类型
+ * @param boolean $trace 是否开启日志追踪
+ * @param integer $level 日志追踪层级,一般不需要自定义
+ * @return Log
+ */
+ public function record($message, $type = Log::INFO, $trace = false, $level = 1)
+ {
+ if ($trace) {
+ $traceInfo = debug_backtrace(false, $level);
+ $infoLevel = $level - 1;
+ $file = $traceInfo[$infoLevel]['file'];
+ $line = $traceInfo[$infoLevel]['line'];
+ $message = "[{$file} => {$line}] " . $message;
+ }
+
+ $this->log[strtolower($type)][] = $message;
+ return $this;
+ }
+
+ /**
+ * 记录调试信息
+ *
+ * @param string $message 日志信息
+ * @param boolean $trace 是否开启日志追踪
+ * @return Log
+ */
+ public function debug($message, $trace = false)
+ {
+ $level = $trace ? 2 : 1;
+ return $this->record($message, Log::DEBUG, $trace, $level);
+ }
+
+ /**
+ * 记录一般信息
+ *
+ * @param string $message 日志信息
+ * @param boolean $trace 是否开启日志追踪
+ * @return Log
+ */
+ public function info($message, $trace = false)
+ {
+ $level = $trace ? 2 : 1;
+ return $this->record($message, Log::INFO, $trace, $level);
+ }
+
+ /**
+ * 记录通知信息
+ *
+ * @param string $message 日志信息
+ * @param boolean $trace 是否开启日志追踪
+ * @return Log
+ */
+ public function notice($message, $trace = false)
+ {
+ $level = $trace ? 2 : 1;
+ return $this->record($message, Log::NOTICE, $trace, $level);
+ }
+
+ /**
+ * 记录警告信息
+ *
+ * @param string $message 日志信息
+ * @param boolean $trace 是否开启日志追踪
+ * @return Log
+ */
+ public function warning($message, $trace = false)
+ {
+ $level = $trace ? 2 : 1;
+ return $this->record($message, Log::WARNING, $trace, $level);
+ }
+
+ /**
+ * 记录错误信息
+ *
+ * @param string $message 日志信息
+ * @param boolean $trace 是否开启日志追踪
+ * @return Log
+ */
+ public function error($message, $trace = false)
+ {
+ $level = $trace ? 2 : 1;
+ return $this->record($message, Log::ERROR, $trace, $level);
+ }
+
+ /**
+ * 批量写入日志
+ *
+ * @return boolean
+ */
+ public function save()
+ {
+ if (!empty($this->log)) {
+ // 解析获取日志内容
+ $log = $this->parseLog($this->log);
+ $time = time();
+ $logName = empty($this->config['logName']) ? date('Ym', $time) . DIRECTORY_SEPARATOR . date('Ymd', $time) : $this->config['logName'];
+ $path = $this->config['logPath'] . DIRECTORY_SEPARATOR . $logName;
+ // 分卷记录日志
+ $save = File::instance()->subsectionFile($log, $path, $this->config['maxSize'], $this->config['rollNum']);
+ // 保存成功,清空日志
+ if ($save) {
+ $this->clear();
+ }
+ return $save;
+ }
+
+ return true;
+ }
+
+ /**
+ * 解析日志
+ *
+ * @param array $logs 日志列表
+ * @return string 解析生成的日志字符串
+ */
+ protected function parseLog($logs)
+ {
+ $log = '';
+ $now = date('Y-m-d H:i:s', time());
+ foreach ($logs as $type => $value) {
+ $offset = "[{$now}] [{$type}] ";
+
+ if (is_array($value)) {
+ $info = '';
+ foreach ($value as $msg) {
+ $info = $info . $offset . $msg . PHP_EOL;
+ }
+ } else {
+ $info = $offset . $value . PHP_EOL;
+ }
+ $log .= $info;
+ }
+
+ // 添加分割线
+ if (!empty($this->config['splitLine'])) {
+ $log .= $this->config['splitLine'] . PHP_EOL;
+ }
+
+ return $log;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Lottery.php b/vendor/mongdch/mon-util/src/Lottery.php
new file mode 100644
index 0000000..f61370c
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Lottery.php
@@ -0,0 +1,126 @@
+
+ * @version 1.0.0 2021-03-18
+ */
+class Lottery
+{
+ /**
+ * 初始化标志
+ *
+ * @var boolean
+ */
+ protected $init = false;
+
+ /**
+ * 奖品列表
+ *
+ * @var array
+ */
+ protected $awards = [];
+
+ /**
+ * 概率总和
+ *
+ * @var integer
+ */
+ protected $probabilityCount = 100;
+
+ /**
+ * 奖品概率索引
+ *
+ * @var string
+ */
+ protected $probabilityKey = 'probability';
+
+ /**
+ * 支持概率的小数位数
+ *
+ * @var integer
+ */
+ protected $scale = 4;
+
+ /**
+ * 初始化
+ *
+ * @param array $awards 奖品列表
+ * @param string $probabilityKey 奖品概率索引
+ * @param string $notWin 未中奖信息
+ * @param integer $scale 支持概率的小数位数
+ * @param integer $probabilityCount 概率总和
+ * @throws LotteryException
+ * @return Lottery
+ */
+ public function init(array $awards, $probabilityKey = 'probability', $notWin = '抱歉,您未中奖', $scale = 4, $probabilityCount = 100)
+ {
+ $this->awards = $awards;
+ $this->probabilityKey = $probabilityKey;
+ $this->scale = $scale;
+ $this->probabilityCount = $probabilityCount;
+ // 计算奖品总概率
+ $probabilityCount = 0;
+ foreach ($this->awards as &$item) {
+ $probabilityCount = bcadd($probabilityCount, $item[$this->probabilityKey], $this->scale);
+ // 标记中奖
+ $item['isWin'] = true;
+ }
+ if (bccomp($probabilityCount, $this->probabilityCount, $this->scale) > 0) {
+ throw new LotteryException('概率总和必须小于等于概率总和(' . $this->probabilityCount . '),当前总和为:' . $probabilityCount, LotteryException::ERROR_PROBABILITY_MIN);
+ }
+ // 未中奖奖项
+ $notAward = [
+ 'title' => $notWin,
+ 'isWin' => false,
+ $this->probabilityKey => bcsub($this->probabilityCount, $probabilityCount, $this->scale)
+ ];
+ $this->awards[] = $notAward;
+ // 打乱顺序
+ shuffle($this->awards);
+ $this->init = true;
+ return $this;
+ }
+
+ /**
+ * 采用经典概率算法进行抽奖
+ *
+ * @throws LotteryException
+ * @return array 返回数据中,isWin为true则表示中奖
+ */
+ public function getDraw()
+ {
+ if (!$this->init) {
+ throw new LotteryException('未初始化抽奖配置', LotteryException::ERROR_NOT_INIT);
+ }
+ $probabilityCount = $this->probabilityCount;
+ $pow = pow(10, $this->scale);
+ foreach ($this->awards as $item) {
+ $randProbability = $probabilityCount * $pow;
+ $randInum = mt_rand(1, $randProbability);
+ $randNum = bcdiv($randInum, $pow, $this->scale);
+ $bccomp = bccomp($randNum, $item[$this->probabilityKey], $this->scale);
+ if ($bccomp == 0 || $bccomp == -1) {
+ return $item;
+ }
+ $probabilityCount = bcsub($probabilityCount, $item[$this->probabilityKey], $this->scale);
+ }
+
+ throw new LotteryException('抽奖失败,未抽到奖品', LotteryException::ERROR_NOT_AWARD);
+ }
+
+ /**
+ * 获取奖品列表
+ *
+ * @return array
+ */
+ public function getAwards()
+ {
+ return $this->awards;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Migrate.php b/vendor/mongdch/mon-util/src/Migrate.php
new file mode 100644
index 0000000..d76f47c
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Migrate.php
@@ -0,0 +1,625 @@
+
+ * @version 1.0.0 2022-07-13
+ */
+class Migrate
+{
+ use Instance;
+
+ /**
+ * 数据库连接
+ *
+ * @var PDO
+ */
+ protected $db = null;
+
+ /**
+ * 文件指针
+ *
+ * @var resource
+ */
+
+ protected $fp = null;
+
+ /**
+ * 备份文件信息 part - 卷号,name - 文件名
+ *
+ * @var array
+ */
+ protected $file = [];
+
+ /**
+ * 当前打开文件大小
+ *
+ * @var integer
+ */
+ protected $size = 0;
+
+ /**
+ * 备份配置
+ *
+ * @var array
+ */
+ protected $config = [
+ // 数据库备份路径
+ 'path' => './data/',
+ // 数据库备份卷大小
+ 'part' => 20971520,
+ // 数据库备份文件是否启用压缩 0不压缩 1 压缩
+ 'compress' => 0,
+ // 压缩级别
+ 'level' => 9,
+ // 数据库配置
+ 'db' => [
+ // 数据库类型
+ 'type' => 'mysql',
+ // 服务器地址
+ 'host' => '127.0.0.1',
+ // 数据库名
+ 'database' => '',
+ // 用户名
+ 'username' => '',
+ // 密码
+ 'password' => '',
+ // 端口
+ 'port' => '3306',
+ // 数据库编码默认采用utf8
+ 'charset' => 'utf8mb4',
+ // 数据库连接参数
+ 'params' => []
+ ]
+ ];
+
+ /**
+ * 数据库备份构造方法
+ *
+ * @param array $config 配置信息
+ */
+ public function __construct(array $config = [])
+ {
+ $this->config = array_merge($this->config, $config);
+ // 初始化文件名
+ $this->setFile();
+ }
+
+ /**
+ * 析构方法,用于关闭文件资源
+ */
+ public function __destruct()
+ {
+ $this->close();
+ }
+
+ /**
+ * 设置配置信息
+ *
+ * @param array $config 配置信息
+ * @return Migrate
+ */
+ public function setConfig(array $config)
+ {
+ $this->config = array_merge($this->config, $config);
+ return $this;
+ }
+
+ /**
+ * 获取配置信息
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function getConfig($name = null)
+ {
+ return is_null($name) ? $this->config : $this->config[$name];
+ }
+
+ /**
+ * 设置备份文件名
+ *
+ * @param array $file 文件信息
+ * @demo setFile(['name' => '20220713', 'part' => 1])
+ * @return Migrate
+ */
+ public function setFile($file = null)
+ {
+ if (is_null($file)) {
+ $this->file = ['name' => date('Ymd-His'), 'part' => 1];
+ } else {
+ $this->file = $file;
+ }
+
+ return $this;
+ }
+
+ /**
+ * 获取文件信息
+ *
+ * @return void
+ */
+ public function getFile()
+ {
+ return $this->file;
+ }
+
+ /**
+ * 获取数据库表数据
+ *
+ * @return array
+ */
+ public function tableList()
+ {
+ $list = $this->query("SHOW TABLE STATUS");
+ return array_map('array_change_key_case', (array) $list);
+ }
+
+ /**
+ * 获取表结构
+ *
+ * @param string $table
+ * @return array
+ */
+ public function tableStruct($table)
+ {
+ $sql = "SELECT * FROM `information_schema`.`columns` WHERE `TABLE_NAME` = '{$table}' AND `TABLE_SCHEMA` = '{$this->config['db']['database']}'";
+ $data = $this->query($sql);
+ return $data;
+ }
+
+ /**
+ * 数据库备份文件列表
+ *
+ * @throws MigrateException
+ * @return array
+ */
+ public function fileList()
+ {
+ // 检查文件是否可写
+ if (!File::instance()->createDir($this->config['path'])) {
+ throw new MigrateException("The current directory is not writable");
+ }
+ $path = realpath($this->config['path']);
+ $glob = new FilesystemIterator($path, FilesystemIterator::KEY_AS_FILENAME);
+ $list = [];
+ foreach ($glob as $name => $file) {
+ if (preg_match('/^\\d{8,8}-\\d{6,6}-\\d+\\.sql(?:\\.gz)?$/', $name)) {
+ $info['filename'] = $name;
+ $name = sscanf($name, '%4s%2s%2s-%2s%2s%2s-%d');
+ $date = "{$name[0]}-{$name[1]}-{$name[2]}";
+ $time = "{$name[3]}:{$name[4]}:{$name[5]}";
+ $part = $name[6];
+ if (isset($list["{$date} {$time}"])) {
+ $info = $list["{$date} {$time}"];
+ $info['part'] = max($info['part'], $part);
+ $info['size'] = $info['size'] + $file->getSize();
+ } else {
+ $info['part'] = $part;
+ $info['size'] = $file->getSize();
+ }
+ $extension = strtoupper(pathinfo($file->getFilename(), PATHINFO_EXTENSION));
+ $info['compress'] = $extension === 'SQL' ? '-' : $extension;
+ $info['time'] = strtotime("{$date} {$time}");
+ $list["{$date} {$time}"] = $info;
+ }
+ }
+ return $list;
+ }
+
+ /**
+ * 获取备份的数据库文件信息
+ *
+ * @param string $type 操作类型
+ * @param integer $time 时间戳
+ * @throws MigrateException
+ * @return array|false|string
+ */
+ public function fileInfo($type = '', $time = 0)
+ {
+ if (!is_numeric($time)) {
+ throw new MigrateException("Time [{$time}] illegal data type");
+ }
+ switch ($type) {
+ case 'time':
+ $name = date('Ymd-His', $time) . '-*.sql*';
+ $path = realpath($this->config['path']) . DIRECTORY_SEPARATOR . $name;
+ return glob($path);
+ case 'timeverif':
+ $name = date('Ymd-His', $time) . '-*.sql*';
+ $path = realpath($this->config['path']) . DIRECTORY_SEPARATOR . $name;
+ $files = glob($path);
+ $list = array();
+ foreach ($files as $name) {
+ $basename = basename($name);
+ $match = sscanf($basename, '%4s%2s%2s-%2s%2s%2s-%d');
+ $gz = preg_match('/^\\d{8,8}-\\d{6,6}-\\d+\\.sql.gz$/', $basename);
+ $list[$match[6]] = array($match[6], $name, $gz);
+ }
+ $last = end($list);
+ if (count($list) === $last[0]) {
+ return $list;
+ } else {
+ throw new MigrateException("File [{$files['0']}] may be damaged, please check again");
+ }
+ case 'pathname':
+ return "{$this->config['path']}{$this->file['name']}-{$this->file['part']}.sql";
+ case 'filename':
+ return "{$this->file['name']}-{$this->file['part']}.sql";
+ case 'filepath':
+ return $this->config['path'];
+ default:
+ $arr = [
+ 'pathname' => "{$this->config['path']}{$this->file['name']}-{$this->file['part']}.sql",
+ 'filename' => "{$this->file['name']}-{$this->file['part']}.sql",
+ 'filepath' => $this->config['path'],
+ 'file' => $this->file
+ ];
+ return $arr;
+ }
+ }
+
+ /**
+ * 删除备份文件
+ *
+ * @param integer $time 时间戳
+ * @throws MigrateException
+ * @return mixed
+ */
+ public function del($time)
+ {
+ if (!$time) {
+ throw new MigrateException("{$time} Time parameter is incorrect");
+ }
+ $filePathArr = $this->fileInfo('time', $time);
+ array_map("unlink", $filePathArr);
+ if (count($this->fileInfo('time', $time))) {
+ throw new MigrateException("File {$time} deleted failed");
+ } else {
+ return $time;
+ }
+ }
+
+ /**
+ * 导出下载备份
+ *
+ * @param integer $time 文件名时间戳
+ * @param integer $part
+ * @throws MigrateException
+ * @throws InvalidArgumentException
+ * @return void
+ */
+ public function export($time, $part = 0)
+ {
+ $file = $this->fileInfo('time', $time);
+ if (!isset($file[$part])) {
+ throw new MigrateException("{$time} Part is abnormal");
+ }
+ $fileName = $file[$part];
+ if (!file_exists($fileName)) {
+ throw new MigrateException("{$time} File is abnormal");
+ }
+
+ return Tool::instance()->exportFile($fileName, basename($fileName));
+ }
+
+ /**
+ * 导入数据库文件
+ *
+ * @param integer $time 文件名时间戳
+ * @param integer $part
+ * @throws MigrateException
+ * @throws SqlException
+ * @return true
+ */
+ public function import($time, $part = 0)
+ {
+ $file = $this->fileInfo('time', $time);
+ if (!isset($file[$part])) {
+ throw new MigrateException("{$time} Part is abnormal");
+ }
+ $fileName = $file[$part];
+ if (!file_exists($fileName)) {
+ throw new MigrateException("{$time} File is abnormal");
+ }
+ // 读取sql文件
+ $ext = pathinfo($fileName, PATHINFO_EXTENSION);
+ if (strtolower($ext) == 'gz') {
+ $content = $this->read($fileName);
+ $sqls = Sql::instance()->parseSql($content);
+ } else {
+
+ $sqls = Sql::instance()->parseFile($fileName);
+ }
+ // 执行sql
+ foreach ($sqls as $sql) {
+ $this->execute($sql);
+ }
+
+ return true;
+ }
+
+ /**
+ * 备份表
+ *
+ * @param array $tables 表名列表,空则备份所有表
+ * @param boolean $bakData 是否备份数据
+ * @return array 备份失败的表名,空则表示成功
+ */
+ public function migrate(array $tables = [], $bakData = true)
+ {
+ $error = [];
+ if (empty($tables)) {
+ $tableList = $this->tableList();
+ $tables = array_column($tableList, 'name');
+ }
+ for ($i = 0, $l = count($tables); $i < $l; $i++) {
+ $table = $tables[$i];
+ $backup = Migrate::instance()->backup($table, 0, $bakData, ($i + 1 == $l));
+ if ($backup === false) {
+ $error[] = $table;
+ }
+ }
+
+ return $error;
+ }
+
+ /**
+ * 备份表
+ *
+ * @param string $table 表名
+ * @param integer $start 起始位
+ * @param boolean $bakData 是否备份数据
+ * @param boolean $closeFp 是否关闭文件句柄
+ * @return boolean
+ */
+ public function backup($table, $start = 0, $bakData = true, $closeFp = true)
+ {
+ // 查询表结构
+ $result = $this->query("SHOW CREATE TABLE `{$table}`");
+ if (!$result) {
+ if ($closeFp) {
+ $this->close();
+ }
+ throw new MigrateException("{$table} not found!");
+ }
+ $tableInfo = $result[0];
+ // 备份表结构
+ if (0 == $start) {
+ $sql = "\n";
+ $sql .= "-- -----------------------------\n";
+ // 获取建表语言或者视图语句
+ if (isset($tableInfo['Create Table'])) {
+ $sql .= "-- Table structure for `{$table}`\n";
+ $sql .= "-- -----------------------------\n";
+ $sql .= "DROP TABLE IF EXISTS `{$table}`;\n";
+ $sql .= trim($tableInfo['Create Table']) . ";\n\n";
+ } else if (isset($tableInfo['Create View'])) {
+ $sql .= "-- View structure for `{$table}`\n";
+ $sql .= "-- -----------------------------\n";
+ $sql .= "DROP VIEW IF EXISTS `{$table}`;\n";
+ $sql .= trim($tableInfo['Create View']) . ";\n\n";
+ }
+ if (false === $this->write($sql)) {
+ if ($closeFp) {
+ $this->close();
+ }
+ return false;
+ }
+ }
+
+ // 备份表数据
+ if ($bakData && isset($tableInfo['Table'])) {
+ // 数据总数
+ $countData = $this->query("SELECT count(*) AS 'count' FROM `{$table}`");
+ $count = isset($countData[0]) && isset($countData[0]['count']) ? $countData[0]['count'] : false;
+ // 备份表数据
+ if ($count) {
+ // 写入数据注释
+ if (0 == $start) {
+ $sql = "-- -----------------------------\n";
+ $sql .= "-- Records of `{$table}`\n";
+ $sql .= "-- -----------------------------\n";
+ $this->write($sql);
+ }
+ // 备份数据记录
+ $start = intval($start);
+ $result = $this->query("SELECT * FROM `{$table}` LIMIT {$start}, 1000");
+ foreach ($result as $row) {
+ $row = array_map('addslashes', $row);
+ $sql = "INSERT INTO `{$table}` VALUES ('" . str_replace(["\r", "\n"], ['\\r', '\\n'], implode("', '", $row)) . "');\n";
+ if (false === $this->write($sql)) {
+ if ($closeFp) {
+ $this->close();
+ }
+ return false;
+ }
+ }
+ // 还有更多数据
+ if ($count > $start + 1000) {
+ return $this->backup($table, $start + 1000, $bakData, $closeFp);
+ }
+ }
+ }
+ // 备份完成
+ if ($closeFp) {
+ $this->close();
+ }
+ return true;
+ }
+
+ /**
+ * 执行查询语句
+ *
+ * @param string $sql SQL语句
+ * @return array
+ */
+ public function query($sql)
+ {
+ $query = $this->getDB()->prepare($sql);
+ $query->execute();
+ return $query->fetchAll(PDO::FETCH_ASSOC);
+ }
+
+ /**
+ * 执行更新语句
+ *
+ * @param string $sql
+ * @return integer
+ */
+ public function execute($sql)
+ {
+ $query = $this->getDB()->prepare($sql);
+ $query->execute();
+ return $query->rowCount();
+ }
+
+ /**
+ * 获取DB链接
+ *
+ * @return PDO
+ */
+ public function getDB()
+ {
+ if (!$this->db) {
+ // 生成mysql连接dsn
+ $config = $this->config['db'];
+ $is_port = (isset($config['port']) && is_int($config['port'] * 1));
+ $dsn = 'mysql:host=' . $config['host'] . ($is_port ? ';port=' . $config['port'] : '') . ';dbname=' . $config['database'];
+ if (!empty($config['charset'])) {
+ $dsn .= ';charset=' . $config['charset'];
+ }
+ // 数据库连接参数
+ $params = [
+ PDO::ATTR_CASE => PDO::CASE_NATURAL,
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+ PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
+ PDO::ATTR_STRINGIFY_FETCHES => false,
+ PDO::ATTR_EMULATE_PREPARES => false,
+ ];
+ if (isset($config['params']) && is_array($config['params'])) {
+ $params = $config['params'] + $params;
+ }
+
+ // 链接
+ $this->db = new PDO(
+ $dsn,
+ $config['username'],
+ $config['password'],
+ $params
+ );
+ }
+
+ return $this->db;
+ }
+
+ /**
+ * 读取gzip文件内容
+ *
+ * @param string $file 文件路径
+ * @return string
+ */
+ protected function read($file)
+ {
+ // 一次读取4kb的内容
+ $buffer_size = 4096;
+ $file = gzopen($file, 'rb');
+ $str = '';
+ while (!gzeof($file)) {
+ $str .= gzread($file, $buffer_size);
+ }
+ gzclose($file);
+ return $str;
+ }
+
+
+ /**
+ * 写入SQL语句
+ *
+ * @param string $sql 要写入的SQL语句
+ * @return boolean true - 写入成功,false - 写入失败!
+ */
+ protected function write($sql)
+ {
+ $size = strlen($sql);
+ // 由于压缩原因,无法计算出压缩后的长度,这里假设压缩率为50%,
+ // 一般情况压缩率都会高于50%;
+ $size = $this->config['compress'] ? $size / 2 : $size;
+ $this->open($size);
+ return $this->config['compress'] ? gzwrite($this->fp, $sql) : fwrite($this->fp, $sql);
+ }
+
+ /**
+ * 打开一个文件,用于写入数据
+ *
+ * @param integer $size 写入数据的大小
+ * @return void
+ */
+ protected function open($size)
+ {
+ if ($this->fp) {
+ $this->size += $size;
+ if ($this->size > $this->config['part']) {
+ $this->config['compress'] ? gzclose($this->fp) : fclose($this->fp);
+ $this->fp = null;
+ $this->file['part']++;
+ $this->backupInit();
+ }
+ } else {
+ $backuppath = $this->config['path'];
+ $filename = "{$backuppath}{$this->file['name']}-{$this->file['part']}.sql";
+ if ($this->config['compress']) {
+ $filename = "{$filename}.gz";
+ $this->fp = gzopen($filename, "a{$this->config['level']}");
+ } else {
+ $this->fp = fopen($filename, 'a');
+ }
+ $this->size = filesize($filename) + $size;
+ }
+ }
+
+ /**
+ * 关闭文件句柄
+ *
+ * @return void
+ */
+ protected function close()
+ {
+ if (!is_null($this->fp)) {
+ $this->config['compress'] ? gzclose($this->fp) : fclose($this->fp);
+ $this->fp = null;
+ }
+ }
+
+ /**
+ * 写入初始数据
+ *
+ * @return boolean true - 写入成功,false - 写入失败
+ */
+ protected function backupInit()
+ {
+ $sql = "-- -----------------------------\n";
+ $sql .= "-- Mon MySQL Data Migrate\n";
+ $sql .= "-- \n";
+ $sql .= "-- Host : " . $this->config['db']['host'] . "\n";
+ $sql .= "-- Port : " . $this->config['db']['port'] . "\n";
+ $sql .= "-- Database : " . $this->config['db']['database'] . "\n";
+ $sql .= "-- UserName : " . $this->config['db']['username'] . "\n";
+ $sql .= "-- \n";
+ $sql .= "-- Version : 1.0.0";
+ $sql .= "-- Part : #{$this->file['part']}\n";
+ $sql .= "-- Date : " . date("Y-m-d H:i:s") . "\n";
+ $sql .= "-- -----------------------------\n\n";
+ $sql .= "SET FOREIGN_KEY_CHECKS = 0;\n\n";
+ return $this->write($sql);
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Network.php b/vendor/mongdch/mon-util/src/Network.php
new file mode 100644
index 0000000..79b6f7d
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Network.php
@@ -0,0 +1,380 @@
+
+ * @version 1.1.0 优化错误处理,增加模拟表单上传
+ */
+class Network
+{
+ use Instance;
+
+ /**
+ * 默认的user-agent
+ *
+ * @var string
+ */
+ protected $userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36';
+
+ /**
+ * 数组转换成uri
+ *
+ * @param array $data 一维数组
+ * @return string uri
+ */
+ public function arrToUri(array $data)
+ {
+ $ds = "&";
+ $result = "";
+ foreach ($data as $key => $value) {
+ $result = $result . $ds . trim($key) . "=" . trim($value);
+ }
+
+ return $result;
+ }
+
+ /**
+ * HTTP以URL的形式发送请求
+ *
+ * @param string $url 请求地址
+ * @param array $data 传递数据
+ * @param string $type 请求类型
+ * @param boolean $toJson 解析json返回数组
+ * @param integer $timeOut 请求超时时间
+ * @param array $header 请求头
+ * @param string $agent 请求user-agent
+ * @return mixed 结果集
+ */
+ public function sendHTTP($url, $data = [], $type = 'GET', $toJson = false, $timeOut = 2, array $header = [], $agent = '')
+ {
+ $method = strtoupper($type);
+ $queryData = $data;
+ // get请求
+ if ($method == 'GET' && is_array($data) && count($data) > 0) {
+ $uri = $this->arrToUri($data);
+ $url = $url . (strpos($url, '?') === false ? '?' : '') . $uri;
+ $queryData = [];
+ }
+
+ $ch = $this->getRequest($url, $queryData, $method, $timeOut, $header, $agent);
+ // 发起请求
+ $html = curl_exec($ch);
+ if ($html === false) {
+ throw new NetWorkException('发起HTTP请求失败!', 0, null, $ch);
+ }
+ // 关闭请求句柄
+ curl_close($ch);
+ $result = ($toJson) ? json_decode($html, true) : $html;
+ return $result;
+ }
+
+ /**
+ * 批量发起HTTP请求
+ *
+ * @param array $queryList 请求列表
+ * @param integer $rolling 默认最大滚动窗口数
+ * @param integer $timeOut 默认超时时间
+ * @param array $header 默认请求头
+ * @param string $agent 默认user-agent
+ * @return array 成功结果集与失败结果集
+ */
+ public function sendMultiHTTP($queryList, $rolling = 5, $timeOut = 2, $header = [], $agent = '')
+ {
+ $result = [];
+ $errors = [];
+ $curls = [];
+ $master = curl_multi_init();
+ // 确保滚动窗口不大于网址数量
+ $rolling = (count($queryList) < $rolling) ? count($queryList) : $rolling;
+ for ($i = 0; $i < $rolling; $i++) {
+ $item = $queryList[$i];
+ // 获取curl
+ $ch = $this->getCh($item, $timeOut, $header, $agent);
+ // 写入批量请求
+ curl_multi_add_handle($master, $ch);
+ // 记录队列
+ $key = (string)$ch;
+ $curls[$key] = [
+ 'index' => $i,
+ 'data' => $item,
+ ];
+ }
+ // 发起请求
+ do {
+ while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
+ if ($execrun != CURLM_OK) {
+ break;
+ }
+
+ while ($done = curl_multi_info_read($master)) {
+ // 获取请求信息
+ $info = curl_getinfo($done['handle']);
+ // 请求成功
+ if ($info['http_code'] == 200) {
+ // 获取返回内容
+ $output = curl_multi_getcontent($done['handle']);
+ // 请求成功,存在回调函数,执行回调函数
+ $key = (string) $done['handle'];
+ if (isset($curls[$key]) && isset($curls[$key]['data']['callback']) && !empty($curls[$key]['data']['callback'])) {
+ $output = Container::instance()->invoke($curls[$key]['data']['callback'], [$output, $curls[$key], $done['handle']]);
+ }
+ $result[] = $output;
+ } else {
+ // 请求失败,执行错误处理
+ $key = (string) $done['handle'];
+ $errors[] = [
+ 'ch' => $done['handle'],
+ 'item' => $curls[$key]
+ ];
+ }
+
+ // 发起新请求(在删除旧请求之前,请务必先执行此操作), 当$i等于$urls数组大小时不用再增加了
+ if ($i < count($queryList)) {
+ $ch = $this->getCh($queryList[$i++]);
+ curl_multi_add_handle($master, $ch);
+ // 记录队列
+ $key = (string)$ch;
+ $curls[$key] = [
+ 'index' => $i,
+ 'data' => $item,
+ ];
+ }
+ // 执行下一个句柄
+ curl_multi_remove_handle($master, $done['handle']);
+ }
+ } while ($running);
+
+ return [
+ 'success' => $result,
+ 'error' => $errors
+ ];
+ }
+
+ /**
+ * 文件上传
+ *
+ * @param string $url 上传路径
+ * @param string $path 文件路径
+ * @param array $data 额外的post参数
+ * @param string $filename 模拟post表单input的name值
+ * @param string $name 文件名
+ * @param array $header 额外的请求头
+ * @param string $agent 请求user-agent
+ * @param integer $timeout 上传超时时间
+ * @return mixed
+ */
+ public function sendFile($url, $path, $data = [], $filename = '', $name = 'file', $toJson = false, $header = [], $agent = '', $timeout = 300)
+ {
+ // 处理文件上传数据集
+ $filename = empty($filename) ? basename($path) : $filename;
+ $sendData = array_merge($data, [$name => new \CURLFile(realpath($path), mime_content_type($path), $filename)]);
+ $header = array_merge(['Content-Type: multipart/form-data'], $header);
+ $ch = $this->getRequest($url, $sendData, 'post', $timeout, $header, $agent);
+ // 发起请求
+ $html = curl_exec($ch);
+ if ($html === false) {
+ throw new NetWorkException('发起文件上传请求失败!', 0, null, $ch);
+ }
+ // 关闭请求句柄
+ curl_close($ch);
+ $result = ($toJson) ? json_decode($html, true) : $html;
+ return $result;
+ }
+
+ /**
+ * 发送TCP请求
+ *
+ * @param string $ip IP
+ * @param integer $port 端口
+ * @param string $cmd 请求命令套接字
+ * @param integer $timeOut 超时时间
+ * @param boolean $toJson 是否转换JSON数组为数组
+ * @param boolean $close 是否关闭链接
+ * @return mixed 结果集
+ */
+ public function sendTCP($ip, $port, $cmd, $timeOut = 2, $toJson = false, $close = true)
+ {
+ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+ if (!$socket) {
+ throw new NetWorkException('创建TCP-Socket失败');
+ }
+ $timeouter = ['sec' => $timeOut, 'usec' => 0];
+ socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeouter);
+ socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeouter);
+ if (socket_connect($socket, $ip, $port) == false) {
+ throw new NetWorkException('链接TCP-Socket失败');
+ }
+ $send_len = strlen($cmd);
+ $sent = socket_write($socket, $cmd, $send_len);
+ if ($sent != $send_len) {
+ throw new NetWorkException('发送TCP套接字数据失败');
+ }
+ // 读取返回数据
+ $data = socket_read($socket, 1024);
+ // 是否转换Json格式
+ $result = $toJson ? json_decode($data, true) : $data;
+ // 是否关闭链接
+ if ($close) {
+ socket_close($socket);
+ }
+ // 返回结果集
+ return $result;
+ }
+
+ /**
+ * 发送UDP请求
+ *
+ * @param string $ip IP
+ * @param integer $port 端口
+ * @param string $cmd 请求命令套接字
+ * @param integer $timeOut 超时时间
+ * @param boolean $toJson 是否转换JSON数组为数组
+ * @param boolean $close 是否关闭链接
+ * @return mixed 结果集
+ */
+ public function sendUDP($ip, $port, $cmd, $timeOut = 2, $toJson = false, $close = true)
+ {
+ $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+ if (!$socket) {
+ throw new NetWorkException('创建UDP-Socket失败');
+ }
+ $timeouter = ['sec' => $timeOut, 'usec' => 0];
+ socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeouter);
+ socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeouter);
+ if (socket_connect($socket, $ip, $port) == false) {
+ // 执行链接Socket失败钩子
+ throw new NetWorkException('链接UDP-Socket失败');
+ }
+ $send_len = strlen($cmd);
+ $sent = socket_write($socket, $cmd, $send_len);
+ if ($sent != $send_len) {
+ throw new NetWorkException('发送UDP套接字数据失败');
+ }
+ // 读取返回数据
+ $data = socket_read($socket, 1024);
+ // 是否转换Json格式
+ $result = $toJson ? json_decode($data, true) : $data;
+ // 是否关闭链接
+ if ($close) {
+ socket_close($socket);
+ }
+
+ // 执行返回结果集
+ return $result;
+ }
+
+ /**
+ * 生成CURL请求
+ *
+ * @param string $url 请求的URL
+ * @param array $data 请求的数据
+ * @param string $type 请求方式
+ * @param integer $timeOut 超时时间
+ * @param array $header 请求头
+ * @param string $agent 请求user-agent
+ * @return mixed cURL句柄
+ */
+ public function getRequest($url, $data = [], $type = 'GET', $timeOut = 2, array $header = [], $agent = '')
+ {
+ // 判断是否为https请求
+ $ssl = strtolower(substr($url, 0, 8)) == "https://" ? true : false;
+ $ch = curl_init();
+ // 设置请求URL
+ curl_setopt($ch, CURLOPT_URL, $url);
+ // 判断请求类型
+ switch (strtoupper($type)) {
+ case 'GET':
+ curl_setopt($ch, CURLOPT_HTTPGET, true);
+ break;
+ case 'POST':
+ curl_setopt($ch, CURLOPT_POST, true);
+ break;
+ case 'PUT':
+ case 'DELETE':
+ case 'PATCH':
+ $data = empty($data) ? $data : json_encode($data, JSON_UNESCAPED_UNICODE);
+ $header[] = 'Content-Type:application/json';
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $type);
+ break;
+ default:
+ throw new NetWorkException("不支持的HTTP请求类型({$type})");
+ }
+ // 判断是否需要传递数据
+ if (!empty($data)) {
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+ }
+ // 设置超时时间
+ if ($timeOut > 0) {
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeOut);
+ }
+ // 设置内容以文本形式返回,而不直接返回
+ curl_setopt($ch, CURLOPT_HEADER, false);
+ curl_setopt($ch, CURLOPT_VERBOSE, false);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ // 防止无限重定向
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+ curl_setopt($ch, CURLOPT_MAXREDIRS, 6);
+ // 设置user-agent
+ $userAgent = $agent ? $agent : $this->userAgent;
+ curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
+ // 设置请求头
+ curl_setopt($ch, CURLINFO_HEADER_OUT, true);
+ if (!empty($header)) {
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+ }
+ if ($ssl) {
+ // 跳过证书检查
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ // 从证书中检查SSL加密算法是否存在
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+ }
+
+ return $ch;
+ }
+
+ /**
+ * 解析请求列表项,获取curl
+ *
+ * @param array $item 请求配置信息
+ * @param integer $timeOut 超时时间
+ * @param array $header 请求头
+ * @param string $agent 请求user-agent
+ * @return mixed cURL句柄
+ */
+ protected function getCh($item, $timeOut = 2, $header = [], $agent = '')
+ {
+ // 请求URL
+ if (!isset($item['url']) || empty($item['url'])) {
+ throw new NetWorkException('HTTP请求列表必须存在url参数');
+ }
+ $url = $item['url'];
+ // 请求方式,默认使用get请求
+ $method = (isset($item['method']) && !empty($item['method'])) ? strtoupper($item['method']) : 'GET';
+ // 请求数据
+ $data = [];
+ if (isset($item['data']) && !empty($item['data'])) {
+ $data = $item['data'];
+ if ($method == 'GET') {
+ $uri = $this->arrToUri($data);
+ $url = $url . (strpos($url, '?') === false ? '?' : '') . $uri;
+ $data = [];
+ }
+ }
+ // 超时时间
+ $timeOut = (isset($item['timeout']) && is_numeric($item['timeout'])) ? $item['timeout'] : $timeOut;
+ // 请求头
+ $header = (isset($item['header']) && !empty($item['header'])) ? $item['header'] : $header;
+ // 请求user-agent
+ $agent = (isset($item['agent']) && !empty($item['agent'])) ? $item['agent'] : $agent;
+ // 获取curl请求
+ $ch = $this->getRequest($url, $data, $method, $timeOut, $header, $agent);
+
+ return $ch;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Pinyin.php b/vendor/mongdch/mon-util/src/Pinyin.php
new file mode 100644
index 0000000..d41aa79
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Pinyin.php
@@ -0,0 +1,479 @@
+
+ * @version 1.0.0
+ */
+class Pinyin
+{
+ use Instance;
+
+ /**
+ * 字体库
+ *
+ * @var array
+ */
+ protected $pinyins = [
+ '' => '', ',' => ',', '!' => '!', '.' => '.', ',' => ',', '!' => '!', '。' => '.',
+ '一' => 'yi', '乁' => 'yi', '乂' => 'yi', '义' => 'yi', '乙' => 'yi', '亄' => 'yi', '亦' => 'yi', '亿' => 'yi', '仡' => 'yi', '以' => 'yi', '仪' => 'yi', '伇' => 'yi', '伊' => 'yi', '伿' => 'yi', '佁' => 'yi', '佚' => 'yi', '佾' => 'yi', '侇' => 'yi', '依' => 'yi', '俋' => 'yi', '倚' => 'yi', '偯' => 'yi', '儀' => 'yi', '億' => 'yi', '兿' => 'yi', '冝' => 'yi', '刈' => 'yi', '劓' => 'yi', '劮' => 'yi', '勚' => 'yi', '勩' => 'yi', '匇' => 'yi', '匜' => 'yi', '医' => 'yi', '吚' => 'yi', '呓' => 'yi', '呭' => 'yi', '呹' => 'yi', '咦' => 'yi', '咿' => 'yi', '唈' => 'yi', '噫' => 'yi', '囈' => 'yi', '圛' => 'yi', '圯' => 'yi', '坄' => 'yi', '垼' => 'yi', '埶' => 'yi', '埸' => 'yi', '墿' => 'yi', '壱' => 'yi', '壹' => 'yi', '夁' => 'yi', '夷' => 'yi', '奕' => 'yi', '妷' => 'yi', '姨' => 'yi', '媐' => 'yi', '嫕' => 'yi', '嫛' => 'yi', '嬄' => 'yi', '嬑' => 'yi', '嬟' => 'yi', '宐' => 'yi', '宜' => 'yi', '宧' => 'yi', '寱' => 'yi', '寲' => 'yi', '屹' => 'yi', '峄' => 'yi', '峓' => 'yi', '崺' => 'yi', '嶧' => 'yi', '嶬' => 'yi', '嶷' => 'yi', '已' => 'yi', '巸' => 'yi', '帟' => 'yi', '帠' => 'yi', '幆' => 'yi', '庡' => 'yi', '廙' => 'yi', '异' => 'yi', '弈' => 'yi', '弋' => 'yi', '弌' => 'yi', '弬' => 'yi', '彛' => 'yi', '彜' => 'yi', '彝' => 'yi', '彞' => 'yi', '役' => 'yi', '忆' => 'yi', '忔' => 'yi', '怈' => 'yi', '怡' => 'yi', '怿' => 'yi', '恞' => 'yi', '悒' => 'yi', '悘' => 'yi', '悥' => 'yi', '意' => 'yi', '憶' => 'yi', '懌' => 'yi', '懿' => 'yi', '扅' => 'yi', '扆' => 'yi', '抑' => 'yi', '挹' => 'yi', '揖' => 'yi', '撎' => 'yi', '攺' => 'yi', '敡' => 'yi', '敼' => 'yi', '斁' => 'yi', '旑' => 'yi', '旖' => 'yi', '易' => 'yi', '晹' => 'yi', '暆' => 'yi', '曀' => 'yi', '曎' => 'yi', '曵' => 'yi', '杙' => 'yi', '杝' => 'yi', '枍' => 'yi', '枻' => 'yi', '柂' => 'yi', '栘' => 'yi', '栧' => 'yi', '栺' => 'yi', '桋' => 'yi', '棭' => 'yi', '椅' => 'yi', '椬' => 'yi', '椸' => 'yi', '榏' => 'yi', '槸' => 'yi', '檍' => 'yi', '檥' => 'yi', '檹' => 'yi', '欭' => 'yi', '欹' => 'yi', '歝' => 'yi', '殔' => 'yi', '殪' => 'yi', '殹' => 'yi', '毅' => 'yi', '毉' => 'yi', '沂' => 'yi', '沶' => 'yi', '泆' => 'yi', '洢' => 'yi', '浂' => 'yi', '浥' => 'yi', '浳' => 'yi', '湙' => 'yi', '溢' => 'yi', '漪' => 'yi', '潩' => 'yi', '澺' => 'yi', '瀷' => 'yi', '炈' => 'yi', '焲' => 'yi', '熠' => 'yi', '熤' => 'yi', '熪' => 'yi', '熼' => 'yi', '燚' => 'yi', '燡' => 'yi', '燱' => 'yi', '狋' => 'yi', '猗' => 'yi', '獈' => 'yi', '玴' => 'yi', '瑿' => 'yi', '瓵' => 'yi', '畩' => 'yi', '異' => 'yi', '疑' => 'yi', '疫' => 'yi', '痍' => 'yi', '痬' => 'yi', '瘗' => 'yi', '瘞' => 'yi', '瘱' => 'yi', '癔' => 'yi', '益' => 'yi', '眙' => 'yi', '瞖' => 'yi', '矣' => 'yi', '礒' => 'yi', '祎' => 'yi', '禕' => 'yi', '秇' => 'yi', '移' => 'yi', '稦' => 'yi', '穓' => 'yi', '竩' => 'yi', '笖' => 'yi', '簃' => 'yi', '籎' => 'yi', '縊' => 'yi', '繄' => 'yi', '繶' => 'yi', '繹' => 'yi', '绎' => 'yi', '缢' => 'yi', '羛' => 'yi', '羠' => 'yi', '義' => 'yi', '羿' => 'yi', '翊' => 'yi', '翌' => 'yi', '翳' => 'yi', '翼' => 'yi', '耴' => 'yi', '肄' => 'yi', '肊' => 'yi', '胰' => 'yi', '膉' => 'yi', '臆' => 'yi', '舣' => 'yi', '艗' => 'yi', '艤' => 'yi', '艺' => 'yi', '芅' => 'yi', '苅' => 'yi', '苡' => 'yi', '苢' => 'yi', '荑' => 'yi', '萓' => 'yi', '萟' => 'yi', '蓺' => 'yi', '薏' => 'yi', '藙' => 'yi', '藝' => 'yi', '蘙' => 'yi', '虉' => 'yi', '蚁' => 'yi', '蛜' => 'yi', '蛡' => 'yi', '蛦' => 'yi', '蜴' => 'yi', '螔' => 'yi', '螘' => 'yi', '螠' => 'yi', '蟻' => 'yi', '衣' => 'yi', '衤' => 'yi', '衪' => 'yi', '衵' => 'yi', '袘' => 'yi', '袣' => 'yi', '裔' => 'yi', '裛' => 'yi', '褹' => 'yi', '襼' => 'yi', '觺' => 'yi', '訲' => 'yi', '訳' => 'yi', '詍' => 'yi', '詒' => 'yi', '詣' => 'yi', '誃' => 'yi', '誼' => 'yi', '謻' => 'yi', '譩' => 'yi', '譯' => 'yi', '議' => 'yi', '讉' => 'yi', '讛' => 'yi', '议' => 'yi', '译' => 'yi', '诒' => 'yi', '诣' => 'yi', '谊' => 'yi', '豙' => 'yi', '豛' => 'yi', '豷' => 'yi', '貖' => 'yi', '貤' => 'yi', '貽' => 'yi', '贀' => 'yi', '贻' => 'yi', '跇' => 'yi', '跠' => 'yi', '軼' => 'yi', '輢' => 'yi', '轙' => 'yi', '轶' => 'yi', '辷' => 'yi', '迆' => 'yi', '迤' => 'yi', '迻' => 'yi', '逘' => 'yi', '逸' => 'yi', '遗' => 'yi', '遺' => 'yi', '邑' => 'yi', '郼' => 'yi', '酏' => 'yi', '醫' => 'yi', '醳' => 'yi', '醷' => 'yi', '釔' => 'yi', '釴' => 'yi', '鈘' => 'yi', '鈠' => 'yi', '鉯' => 'yi', '銥' => 'yi', '鎰' => 'yi', '鏔' => 'yi', '鐿' => 'yi', '钇' => 'yi', '铱' => 'yi', '镒' => 'yi', '镱' => 'yi', '阣' => 'yi', '陭' => 'yi', '隿' => 'yi', '霬' => 'yi', '靾' => 'yi', '頉' => 'yi', '頤' => 'yi', '頥' => 'yi', '顊' => 'yi', '顗' => 'yi', '颐' => 'yi', '飴' => 'yi', '饐' => 'yi', '饴' => 'yi', '駅' => 'yi', '驛' => 'yi', '驿' => 'yi', '骮' => 'yi', '鮧' => 'yi', '鮨' => 'yi', '鯣' => 'yi', '鳦' => 'yi', '鶂' => 'yi', '鶃' => 'yi', '鶍' => 'yi', '鷁' => 'yi', '鷊' => 'yi', '鷖' => 'yi', '鷧' => 'yi', '鷾' => 'yi', '鸃' => 'yi', '鹝' => 'yi', '鹢' => 'yi', '鹥' => 'yi', '黓' => 'yi', '黟' => 'yi', '黳' => 'yi', '齮' => 'yi', '齸' => 'yi', '㐹' => 'yi', '㑊' => 'yi', '㑜' => 'yi', '㑥' => 'yi', '㓷' => 'yi', '㔴' => 'yi', '㕥' => 'yi', '㖂' => 'yi', '㘁' => 'yi', '㘈' => 'yi', '㘊' => 'yi', '㘦' => 'yi', '㙠' => 'yi', '㙯' => 'yi', '㚤' => 'yi', '㚦' => 'yi', '㛕' => 'yi', '㜋' => 'yi', '㜒' => 'yi', '㝖' => 'yi', '㞔' => 'yi', '㠯' => 'yi', '㡫' => 'yi', '㡼' => 'yi', '㢞' => 'yi', '㣂' => 'yi', '㣻' => 'yi', '㥴' => 'yi', '㦉' => 'yi', '㦤' => 'yi', '㦾' => 'yi', '㩘' => 'yi', '㫊' => 'yi', '㰘' => 'yi', '㰝' => 'yi', '㰻' => 'yi', '㱅' => 'yi', '㱲' => 'yi', '㲼' => 'yi', '㳑' => 'yi', '㴁' => 'yi', '㴒' => 'yi', '㵝' => 'yi', '㵩' => 'yi', '㶠' => 'yi', '㹓' => 'yi', '㹭' => 'yi', '㺿' => 'yi', '㽈' => 'yi', '䄁' => 'yi', '䄬' => 'yi', '䄿' => 'yi', '䆿' => 'yi', '䇩' => 'yi', '䇵' => 'yi', '䉨' => 'yi', '䋚' => 'yi', '䋵' => 'yi', '䌻' => 'yi', '䎈' => 'yi', '䐅' => 'yi', '䐖' => 'yi', '䓃' => 'yi', '䓈' => 'yi', '䓹' => 'yi', '䔬' => 'yi', '䕍' => 'yi', '䖁' => 'yi', '䖊' => 'yi', '䗑' => 'yi', '䗟' => 'yi', '䗷' => 'yi', '䘝' => 'yi', '䘸' => 'yi', '䝘' => 'yi', '䝝' => 'yi', '䝯' => 'yi', '䞅' => 'yi', '䢃' => 'yi', '䣧' => 'yi', '䦴' => 'yi', '䧧' => 'yi', '䩟' => 'yi', '䬁' => 'yi', '䬥' => 'yi', '䬮' => 'yi', '䭂' => 'yi', '䭇' => 'yi', '䭞' => 'yi', '䭿' => 'yi', '䮊' => 'yi', '䯆' => 'yi', '䰙' => 'yi', '䱌' => 'yi', '䱒' => 'yi', '䲑' => 'yi', '䴊' => 'yi', '䴬' => 'yi',
+ '丁' => 'ding', '仃' => 'ding', '叮' => 'ding', '啶' => 'ding', '奵' => 'ding', '定' => 'ding', '嵿' => 'ding', '帄' => 'ding', '忊' => 'ding', '椗' => 'ding', '玎' => 'ding', '甼' => 'ding', '疔' => 'ding', '盯' => 'ding', '矴' => 'ding', '碇' => 'ding', '碠' => 'ding', '磸' => 'ding', '耵' => 'ding', '聢' => 'ding', '聣' => 'ding', '腚' => 'ding', '萣' => 'ding', '薡' => 'ding', '訂' => 'ding', '订' => 'ding', '酊' => 'ding', '釘' => 'ding', '錠' => 'ding', '鐤' => 'ding', '钉' => 'ding', '锭' => 'ding', '靪' => 'ding', '頂' => 'ding', '顁' => 'ding', '顶' => 'ding', '飣' => 'ding', '饤' => 'ding', '鼎' => 'ding', '鼑' => 'ding', '㝎' => 'ding', '㫀' => 'ding', '㴿' => 'ding', '㼗' => 'ding',
+ '丂' => 'kao', '尻' => 'kao', '拷' => 'kao', '攷' => 'kao', '栲' => 'kao', '洘' => 'kao', '烤' => 'kao', '犒' => 'kao', '考' => 'kao', '銬' => 'kao', '铐' => 'kao', '靠' => 'kao', '髛' => 'kao', '鮳' => 'kao', '鯌' => 'kao', '鲓' => 'kao', '䐧' => 'kao', '䯪' => 'kao',
+ '七' => 'qi', '乞' => 'qi', '亓' => 'qi', '亝' => 'qi', '企' => 'qi', '倛' => 'qi', '僛' => 'qi', '其' => 'qi', '凄' => 'qi', '剘' => 'qi', '启' => 'qi', '呇' => 'qi', '呮' => 'qi', '咠' => 'qi', '唘' => 'qi', '唭' => 'qi', '啓' => 'qi', '啔' => 'qi', '啟' => 'qi', '嘁' => 'qi', '噐' => 'qi', '器' => 'qi', '圻' => 'qi', '埼' => 'qi', '夡' => 'qi', '奇' => 'qi', '契' => 'qi', '妻' => 'qi', '娸' => 'qi', '婍' => 'qi', '屺' => 'qi', '岂' => 'qi', '岐' => 'qi', '岓' => 'qi', '崎' => 'qi', '嵜' => 'qi', '帺' => 'qi', '弃' => 'qi', '忯' => 'qi', '恓' => 'qi', '悽' => 'qi', '愒' => 'qi', '愭' => 'qi', '慼' => 'qi', '慽' => 'qi', '憇' => 'qi', '憩' => 'qi', '懠' => 'qi', '戚' => 'qi', '捿' => 'qi', '掑' => 'qi', '摖' => 'qi', '斉' => 'qi', '斊' => 'qi', '旂' => 'qi', '旗' => 'qi', '晵' => 'qi', '暣' => 'qi', '朞' => 'qi', '期' => 'qi', '杞' => 'qi', '柒' => 'qi', '栔' => 'qi', '栖' => 'qi', '桤' => 'qi', '桼' => 'qi', '棄' => 'qi', '棊' => 'qi', '棋' => 'qi', '棨' => 'qi', '棲' => 'qi', '榿' => 'qi', '槭' => 'qi', '檱' => 'qi', '櫀' => 'qi', '欫' => 'qi', '欺' => 'qi', '歧' => 'qi', '气' => 'qi', '気' => 'qi', '氣' => 'qi', '汔' => 'qi', '汽' => 'qi', '沏' => 'qi', '泣' => 'qi', '淇' => 'qi', '淒' => 'qi', '渏' => 'qi', '湆' => 'qi', '湇' => 'qi', '漆' => 'qi', '濝' => 'qi', '炁' => 'qi', '猉' => 'qi', '玂' => 'qi', '玘' => 'qi', '琦' => 'qi', '琪' => 'qi', '璂' => 'qi', '甈' => 'qi', '畦' => 'qi', '疧' => 'qi', '盀' => 'qi', '盵' => 'qi', '矵' => 'qi', '砌' => 'qi', '碁' => 'qi', '碕' => 'qi', '碛' => 'qi', '碶' => 'qi', '磎' => 'qi', '磜' => 'qi', '磧' => 'qi', '磩' => 'qi', '礘' => 'qi', '祁' => 'qi', '祇' => 'qi', '祈' => 'qi', '祺' => 'qi', '禥' => 'qi', '竒' => 'qi', '簯' => 'qi', '簱' => 'qi', '籏' => 'qi', '粸' => 'qi', '紪' => 'qi', '綥' => 'qi', '綦' => 'qi', '綨' => 'qi', '綮' => 'qi', '綺' => 'qi', '緀' => 'qi', '緕' => 'qi', '纃' => 'qi', '绮' => 'qi', '缼' => 'qi', '罊' => 'qi', '耆' => 'qi', '肵' => 'qi', '脐' => 'qi', '臍' => 'qi', '艩' => 'qi', '芑' => 'qi', '芞' => 'qi', '芪' => 'qi', '荠' => 'qi', '萁' => 'qi', '萋' => 'qi', '葺' => 'qi', '蕲' => 'qi', '薺' => 'qi', '藄' => 'qi', '蘄' => 'qi', '蚑' => 'qi', '蚔' => 'qi', '蚚' => 'qi', '蛴' => 'qi', '蜝' => 'qi', '蜞' => 'qi', '螧' => 'qi', '蟿' => 'qi', '蠐' => 'qi', '裿' => 'qi', '褀' => 'qi', '褄' => 'qi', '訖' => 'qi', '諆' => 'qi', '諬' => 'qi', '諿' => 'qi', '讫' => 'qi', '豈' => 'qi', '起' => 'qi', '跂' => 'qi', '踑' => 'qi', '踦' => 'qi', '蹊' => 'qi', '軝' => 'qi', '迄' => 'qi', '迉' => 'qi', '邔' => 'qi', '郪' => 'qi', '釮' => 'qi', '錡' => 'qi', '鏚' => 'qi', '锜' => 'qi', '闙' => 'qi', '霋' => 'qi', '頎' => 'qi', '颀' => 'qi', '騎' => 'qi', '騏' => 'qi', '騹' => 'qi', '骐' => 'qi', '骑' => 'qi', '鬐' => 'qi', '鬾' => 'qi', '鬿' => 'qi', '魌' => 'qi', '魕' => 'qi', '鯕' => 'qi', '鰭' => 'qi', '鲯' => 'qi', '鳍' => 'qi', '鵸' => 'qi', '鶀' => 'qi', '鶈' => 'qi', '麒' => 'qi', '麡' => 'qi', '齊' => 'qi', '齐' => 'qi', '㒅' => 'qi', '㓞' => 'qi', '㜎' => 'qi', '㞓' => 'qi', '㞚' => 'qi', '㟓' => 'qi', '㟚' => 'qi', '㟢' => 'qi', '㣬' => 'qi', '㥓' => 'qi', '㩩' => 'qi', '㩽' => 'qi', '㫓' => 'qi', '㮑' => 'qi', '㯦' => 'qi', '㼤' => 'qi', '㾨' => 'qi', '䀈' => 'qi', '䀙' => 'qi', '䁈' => 'qi', '䁉' => 'qi', '䄎' => 'qi', '䄢' => 'qi', '䄫' => 'qi', '䅤' => 'qi', '䅲' => 'qi', '䉝' => 'qi', '䉻' => 'qi', '䋯' => 'qi', '䌌' => 'qi', '䎢' => 'qi', '䏅' => 'qi', '䏌' => 'qi', '䏠' => 'qi', '䏿' => 'qi', '䐡' => 'qi', '䑴' => 'qi', '䒗' => 'qi', '䒻' => 'qi', '䓅' => 'qi', '䔇' => 'qi', '䙄' => 'qi', '䚉' => 'qi', '䚍' => 'qi', '䛴' => 'qi', '䞚' => 'qi', '䟄' => 'qi', '䟚' => 'qi', '䡋' => 'qi', '䡔' => 'qi', '䢀' => 'qi', '䧘' => 'qi', '䧵' => 'qi', '䩓' => 'qi', '䫔' => 'qi', '䬣' => 'qi', '䭫' => 'qi', '䭬' => 'qi', '䭶' => 'qi', '䭼' => 'qi', '䰇' => 'qi', '䰴' => 'qi', '䱈' => 'qi', '䲬' => 'qi', '䳢' => 'qi', '䶒' => 'qi', '䶞' => 'qi',
+ '丄' => 'shang', '上' => 'shang', '仩' => 'shang', '伤' => 'shang', '傷' => 'shang', '商' => 'shang', '垧' => 'shang', '墒' => 'shang', '尙' => 'shang', '尚' => 'shang', '恦' => 'shang', '愓' => 'shang', '慯' => 'shang', '扄' => 'shang', '晌' => 'shang', '殇' => 'shang', '殤' => 'shang', '滳' => 'shang', '漡' => 'shang', '熵' => 'shang', '緔' => 'shang', '绱' => 'shang', '蔏' => 'shang', '螪' => 'shang', '裳' => 'shang', '觞' => 'shang', '觴' => 'shang', '謪' => 'shang', '賞' => 'shang', '赏' => 'shang', '鑜' => 'shang', '鬺' => 'shang', '䬕' => 'shang',
+ '丅' => 'xia', '下' => 'xia', '侠' => 'xia', '俠' => 'xia', '傄' => 'xia', '匣' => 'xia', '厦' => 'xia', '吓' => 'xia', '呷' => 'xia', '嚇' => 'xia', '圷' => 'xia', '夏' => 'xia', '夓' => 'xia', '峡' => 'xia', '峽' => 'xia', '廈' => 'xia', '懗' => 'xia', '搳' => 'xia', '敮' => 'xia', '暇' => 'xia', '柙' => 'xia', '梺' => 'xia', '溊' => 'xia', '炠' => 'xia', '烚' => 'xia', '煆' => 'xia', '狎' => 'xia', '狭' => 'xia', '狹' => 'xia', '珨' => 'xia', '瑕' => 'xia', '疜' => 'xia', '疨' => 'xia', '睱' => 'xia', '瞎' => 'xia', '硖' => 'xia', '硤' => 'xia', '碬' => 'xia', '磍' => 'xia', '祫' => 'xia', '笚' => 'xia', '筪' => 'xia', '縀' => 'xia', '縖' => 'xia', '罅' => 'xia', '翈' => 'xia', '舝' => 'xia', '舺' => 'xia', '蕸' => 'xia', '虾' => 'xia', '蝦' => 'xia', '諕' => 'xia', '谺' => 'xia', '赮' => 'xia', '轄' => 'xia', '辖' => 'xia', '遐' => 'xia', '鍜' => 'xia', '鎋' => 'xia', '鏬' => 'xia', '閕' => 'xia', '閜' => 'xia', '陜' => 'xia', '陿' => 'xia', '霞' => 'xia', '颬' => 'xia', '騢' => 'xia', '魻' => 'xia', '鰕' => 'xia', '鶷' => 'xia', '黠' => 'xia', '㗇' => 'xia', '㗿' => 'xia', '㘡' => 'xia', '㙤' => 'xia', '㰺' => 'xia', '㽠' => 'xia', '䖎' => 'xia', '䖖' => 'xia', '䘥' => 'xia', '䛅' => 'xia', '䦖' => 'xia', '䪗' => 'xia', '䫗' => 'xia',
+ '丆' => 'mu', '亩' => 'mu', '仫' => 'mu', '凩' => 'mu', '募' => 'mu', '坶' => 'mu', '墓' => 'mu', '墲' => 'mu', '姆' => 'mu', '娒' => 'mu', '峔' => 'mu', '幕' => 'mu', '幙' => 'mu', '慔' => 'mu', '慕' => 'mu', '拇' => 'mu', '旀' => 'mu', '暮' => 'mu', '木' => 'mu', '椧' => 'mu', '楘' => 'mu', '樢' => 'mu', '母' => 'mu', '毣' => 'mu', '毪' => 'mu', '氁' => 'mu', '沐' => 'mu', '炑' => 'mu', '牡' => 'mu', '牧' => 'mu', '牳' => 'mu', '狇' => 'mu', '獏' => 'mu', '畆' => 'mu', '畒' => 'mu', '畝' => 'mu', '畞' => 'mu', '畮' => 'mu', '目' => 'mu', '睦' => 'mu', '砪' => 'mu', '穆' => 'mu', '胟' => 'mu', '艒' => 'mu', '苜' => 'mu', '莯' => 'mu', '萺' => 'mu', '蚞' => 'mu', '踇' => 'mu', '鉧' => 'mu', '鉬' => 'mu', '钼' => 'mu', '雮' => 'mu', '霂' => 'mu', '鞪' => 'mu', '㒇' => 'mu', '㜈' => 'mu', '㣎' => 'mu', '㧅' => 'mu', '㾇' => 'mu', '䀲' => 'mu', '䊾' => 'mu', '䑵' => 'mu', '䥈' => 'mu', '䧔' => 'mu', '䱯' => 'mu',
+ '万' => 'wan', '丸' => 'wan', '乛' => 'wan', '倇' => 'wan', '刓' => 'wan', '剜' => 'wan', '卍' => 'wan', '卐' => 'wan', '唍' => 'wan', '埦' => 'wan', '塆' => 'wan', '壪' => 'wan', '妧' => 'wan', '婉' => 'wan', '婠' => 'wan', '完' => 'wan', '宛' => 'wan', '岏' => 'wan', '帵' => 'wan', '弯' => 'wan', '彎' => 'wan', '忨' => 'wan', '惋' => 'wan', '抏' => 'wan', '挽' => 'wan', '捖' => 'wan', '捥' => 'wan', '晚' => 'wan', '晩' => 'wan', '晼' => 'wan', '杤' => 'wan', '梚' => 'wan', '椀' => 'wan', '汍' => 'wan', '涴' => 'wan', '湾' => 'wan', '潫' => 'wan', '灣' => 'wan', '烷' => 'wan', '玩' => 'wan', '琓' => 'wan', '琬' => 'wan', '畹' => 'wan', '皖' => 'wan', '盌' => 'wan', '睕' => 'wan', '碗' => 'wan', '笂' => 'wan', '紈' => 'wan', '綩' => 'wan', '綰' => 'wan', '纨' => 'wan', '绾' => 'wan', '翫' => 'wan', '脘' => 'wan', '腕' => 'wan', '芄' => 'wan', '莞' => 'wan', '菀' => 'wan', '萬' => 'wan', '薍' => 'wan', '蜿' => 'wan', '豌' => 'wan', '貦' => 'wan', '贃' => 'wan', '贎' => 'wan', '踠' => 'wan', '輓' => 'wan', '邜' => 'wan', '鋄' => 'wan', '鋔' => 'wan', '錽' => 'wan', '鍐' => 'wan', '鎫' => 'wan', '頑' => 'wan', '顽' => 'wan', '㜶' => 'wan', '㝴' => 'wan', '㸘' => 'wan', '㽜' => 'wan', '㿸' => 'wan', '䂺' => 'wan', '䅋' => 'wan', '䖤' => 'wan', '䗕' => 'wan', '䘼' => 'wan', '䛷' => 'wan', '䝹' => 'wan', '䥑' => 'wan', '䩊' => 'wan', '䯈' => 'wan', '䳃' => 'wan',
+ '丈' => 'zhang', '仉' => 'zhang', '仗' => 'zhang', '傽' => 'zhang', '墇' => 'zhang', '嫜' => 'zhang', '嶂' => 'zhang', '帐' => 'zhang', '帳' => 'zhang', '幛' => 'zhang', '幥' => 'zhang', '张' => 'zhang', '弡' => 'zhang', '張' => 'zhang', '彰' => 'zhang', '慞' => 'zhang', '扙' => 'zhang', '掌' => 'zhang', '暲' => 'zhang', '杖' => 'zhang', '樟' => 'zhang', '涨' => 'zhang', '涱' => 'zhang', '漲' => 'zhang', '漳' => 'zhang', '獐' => 'zhang', '璋' => 'zhang', '痮' => 'zhang', '瘬' => 'zhang', '瘴' => 'zhang', '瞕' => 'zhang', '礃' => 'zhang', '章' => 'zhang', '粀' => 'zhang', '粻' => 'zhang', '胀' => 'zhang', '脹' => 'zhang', '蔁' => 'zhang', '蟑' => 'zhang', '賬' => 'zhang', '账' => 'zhang', '遧' => 'zhang', '鄣' => 'zhang', '鏱' => 'zhang', '鐣' => 'zhang', '障' => 'zhang', '鞝' => 'zhang', '餦' => 'zhang', '騿' => 'zhang', '鱆' => 'zhang', '麞' => 'zhang', '㕩' => 'zhang', '㙣' => 'zhang', '㽴' => 'zhang', '䍤' => 'zhang',
+ '三' => 'san', '伞' => 'san', '俕' => 'san', '傘' => 'san', '厁' => 'san', '叁' => 'san', '壭' => 'san', '弎' => 'san', '散' => 'san', '橵' => 'san', '毵' => 'san', '毶' => 'san', '毿' => 'san', '犙' => 'san', '糁' => 'san', '糂' => 'san', '糝' => 'san', '糣' => 'san', '糤' => 'san', '繖' => 'san', '鏒' => 'san', '閐' => 'san', '饊' => 'san', '馓' => 'san', '鬖' => 'san', '㤾' => 'san', '㧲' => 'san', '㪔' => 'san', '㪚' => 'san', '䀐' => 'san', '䉈' => 'san', '䊉' => 'san', '䫅' => 'san', '䫩' => 'san',
+ '丌' => 'ji', '丮' => 'ji', '乩' => 'ji', '亟' => 'ji', '亼' => 'ji', '伋' => 'ji', '伎' => 'ji', '佶' => 'ji', '偈' => 'ji', '偮' => 'ji', '僟' => 'ji', '兾' => 'ji', '冀' => 'ji', '几' => 'ji', '击' => 'ji', '刉' => 'ji', '刏' => 'ji', '剂' => 'ji', '剞' => 'ji', '剤' => 'ji', '劑' => 'ji', '勣' => 'ji', '卙' => 'ji', '即' => 'ji', '卽' => 'ji', '及' => 'ji', '叝' => 'ji', '叽' => 'ji', '吉' => 'ji', '咭' => 'ji', '哜' => 'ji', '唧' => 'ji', '喞' => 'ji', '嗘' => 'ji', '嘰' => 'ji', '嚌' => 'ji', '圾' => 'ji', '坖' => 'ji', '垍' => 'ji', '基' => 'ji', '塉' => 'ji', '墍' => 'ji', '墼' => 'ji', '妀' => 'ji', '妓' => 'ji', '姞' => 'ji', '姬' => 'ji', '嫉' => 'ji', '季' => 'ji', '寂' => 'ji', '寄' => 'ji', '屐' => 'ji', '岌' => 'ji', '峜' => 'ji', '嵆' => 'ji', '嵇' => 'ji', '嵴' => 'ji', '嶯' => 'ji', '己' => 'ji', '幾' => 'ji', '庴' => 'ji', '廭' => 'ji', '彐' => 'ji', '彑' => 'ji', '彶' => 'ji', '徛' => 'ji', '忌' => 'ji', '忣' => 'ji', '急' => 'ji', '悸' => 'ji', '惎' => 'ji', '愱' => 'ji', '憿' => 'ji', '懻' => 'ji', '戟' => 'ji', '戢' => 'ji', '技' => 'ji', '挤' => 'ji', '掎' => 'ji', '揤' => 'ji', '撃' => 'ji', '撠' => 'ji', '擊' => 'ji', '擠' => 'ji', '攲' => 'ji', '敧' => 'ji', '旡' => 'ji', '既' => 'ji', '旣' => 'ji', '暨' => 'ji', '暩' => 'ji', '曁' => 'ji', '机' => 'ji', '极' => 'ji', '枅' => 'ji', '梞' => 'ji', '棘' => 'ji', '楖' => 'ji', '楫' => 'ji', '極' => 'ji', '槉' => 'ji', '槣' => 'ji', '樭' => 'ji', '機' => 'ji', '橶' => 'ji', '檕' => 'ji', '檝' => 'ji', '檵' => 'ji', '櫅' => 'ji', '殛' => 'ji', '毄' => 'ji', '汲' => 'ji', '泲' => 'ji', '洎' => 'ji', '济' => 'ji', '済' => 'ji', '湒' => 'ji', '漃' => 'ji', '漈' => 'ji', '潗' => 'ji', '激' => 'ji', '濈' => 'ji', '濟' => 'ji', '瀱' => 'ji', '焏' => 'ji', '犄' => 'ji', '犱' => 'ji', '狤' => 'ji', '玑' => 'ji', '璣' => 'ji', '璾' => 'ji', '畸' => 'ji', '畿' => 'ji', '疾' => 'ji', '痵' => 'ji', '瘠' => 'ji', '癠' => 'ji', '癪' => 'ji', '皍' => 'ji', '矶' => 'ji', '磯' => 'ji', '祭' => 'ji', '禝' => 'ji', '禨' => 'ji', '积' => 'ji', '稘' => 'ji', '稩' => 'ji', '稷' => 'ji', '稽' => 'ji', '穄' => 'ji', '穊' => 'ji', '積' => 'ji', '穖' => 'ji', '穧' => 'ji', '笄' => 'ji', '笈' => 'ji', '筓' => 'ji', '箕' => 'ji', '箿' => 'ji', '簊' => 'ji', '籍' => 'ji', '糭' => 'ji', '紀' => 'ji', '紒' => 'ji', '級' => 'ji', '継' => 'ji', '緝' => 'ji', '縘' => 'ji', '績' => 'ji', '繋' => 'ji', '繫' => 'ji', '繼' => 'ji', '级' => 'ji', '纪' => 'ji', '继' => 'ji', '绩' => 'ji', '缉' => 'ji', '罽' => 'ji', '羁' => 'ji', '羇' => 'ji', '羈' => 'ji', '耤' => 'ji', '耭' => 'ji', '肌' => 'ji', '脊' => 'ji', '脨' => 'ji', '膌' => 'ji', '臮' => 'ji', '艥' => 'ji', '芨' => 'ji', '芰' => 'ji', '芶' => 'ji', '茍' => 'ji', '萕' => 'ji', '葪' => 'ji', '蒺' => 'ji', '蓟' => 'ji', '蔇' => 'ji', '蕀' => 'ji', '蕺' => 'ji', '薊' => 'ji', '蘎' => 'ji', '蘮' => 'ji', '蘻' => 'ji', '虀' => 'ji', '虮' => 'ji', '蝍' => 'ji', '螏' => 'ji', '蟣' => 'ji', '裚' => 'ji', '襀' => 'ji', '襋' => 'ji', '覉' => 'ji', '覊' => 'ji', '覬' => 'ji', '觊' => 'ji', '觙' => 'ji', '觭' => 'ji', '計' => 'ji', '記' => 'ji', '誋' => 'ji', '諅' => 'ji', '譏' => 'ji', '譤' => 'ji', '计' => 'ji', '讥' => 'ji', '记' => 'ji', '谻' => 'ji', '賫' => 'ji', '賷' => 'ji', '赍' => 'ji', '趌' => 'ji', '跡' => 'ji', '跻' => 'ji', '跽' => 'ji', '踖' => 'ji', '蹐' => 'ji', '蹟' => 'ji', '躋' => 'ji', '躤' => 'ji', '躸' => 'ji', '輯' => 'ji', '轚' => 'ji', '辑' => 'ji', '迹' => 'ji', '郆' => 'ji', '鄿' => 'ji', '銈' => 'ji', '銡' => 'ji', '錤' => 'ji', '鍓' => 'ji', '鏶' => 'ji', '鐖' => 'ji', '鑇' => 'ji', '鑙' => 'ji', '际' => 'ji', '際' => 'ji', '隮' => 'ji', '集' => 'ji', '雞' => 'ji', '雦' => 'ji', '雧' => 'ji', '霁' => 'ji', '霵' => 'ji', '霽' => 'ji', '鞊' => 'ji', '鞿' => 'ji', '韲' => 'ji', '飢' => 'ji', '饑' => 'ji', '饥' => 'ji', '驥' => 'ji', '骥' => 'ji', '髻' => 'ji', '魢' => 'ji', '鮆' => 'ji', '鯚' => 'ji', '鯽' => 'ji', '鰶' => 'ji', '鰿' => 'ji', '鱀' => 'ji', '鱭' => 'ji', '鱾' => 'ji', '鲚' => 'ji', '鲫' => 'ji', '鳮' => 'ji', '鵋' => 'ji', '鶏' => 'ji', '鶺' => 'ji', '鷄' => 'ji', '鷑' => 'ji', '鸄' => 'ji', '鸡' => 'ji', '鹡' => 'ji', '麂' => 'ji', '齌' => 'ji', '齎' => 'ji', '齏' => 'ji', '齑' => 'ji', '㑧' => 'ji', '㒫' => 'ji', '㔕' => 'ji', '㖢' => 'ji', '㗊' => 'ji', '㗱' => 'ji', '㘍' => 'ji', '㙨' => 'ji', '㙫' => 'ji', '㚡' => 'ji', '㞃' => 'ji', '㞆' => 'ji', '㞛' => 'ji', '㞦' => 'ji', '㠍' => 'ji', '㠎' => 'ji', '㠖' => 'ji', '㠱' => 'ji', '㡇' => 'ji', '㡭' => 'ji', '㡮' => 'ji', '㡶' => 'ji', '㤂' => 'ji', '㥍' => 'ji', '㥛' => 'ji', '㦸' => 'ji', '㧀' => 'ji', '㨈' => 'ji', '㪠' => 'ji', '㭰' => 'ji', '㭲' => 'ji', '㮟' => 'ji', '㮨' => 'ji', '㰟' => 'ji', '㱞' => 'ji', '㲅' => 'ji', '㲺' => 'ji', '㳵' => 'ji', '㴉' => 'ji', '㴕' => 'ji', '㸄' => 'ji', '㹄' => 'ji', '㻑' => 'ji', '㻷' => 'ji', '㽺' => 'ji', '㾊' => 'ji', '㾒' => 'ji', '㾵' => 'ji', '䁒' => 'ji', '䋟' => 'ji', '䐀' => 'ji', '䐕' => 'ji', '䐚' => 'ji', '䒁' => 'ji', '䓫' => 'ji', '䓽' => 'ji', '䗁' => 'ji', '䚐' => 'ji', '䜞' => 'ji', '䝸' => 'ji', '䞘' => 'ji', '䟌' => 'ji', '䠏' => 'ji', '䢋' => 'ji', '䢳' => 'ji', '䣢' => 'ji', '䤒' => 'ji', '䤠' => 'ji', '䦇' => 'ji', '䨖' => 'ji', '䩯' => 'ji', '䮺' => 'ji', '䯂' => 'ji', '䰏' => 'ji', '䲯' => 'ji', '䳭' => 'ji', '䶓' => 'ji', '䶩' => 'ji',
+ '不' => 'bu', '佈' => 'bu', '勏' => 'bu', '卟' => 'bu', '吥' => 'bu', '咘' => 'bu', '哺' => 'bu', '埗' => 'bu', '埠' => 'bu', '峬' => 'bu', '布' => 'bu', '庯' => 'bu', '廍' => 'bu', '怖' => 'bu', '悑' => 'bu', '捗' => 'bu', '晡' => 'bu', '步' => 'bu', '歨' => 'bu', '歩' => 'bu', '獛' => 'bu', '瓿' => 'bu', '篰' => 'bu', '簿' => 'bu', '荹' => 'bu', '蔀' => 'bu', '补' => 'bu', '補' => 'bu', '誧' => 'bu', '踄' => 'bu', '轐' => 'bu', '逋' => 'bu', '部' => 'bu', '郶' => 'bu', '醭' => 'bu', '鈈' => 'bu', '鈽' => 'bu', '钚' => 'bu', '钸' => 'bu', '餔' => 'bu', '餢' => 'bu', '鳪' => 'bu', '鵏' => 'bu', '鸔' => 'bu', '㘵' => 'bu', '㙛' => 'bu', '㚴' => 'bu', '㨐' => 'bu', '㳍' => 'bu', '㻉' => 'bu', '㾟' => 'bu', '䀯' => 'bu', '䊇' => 'bu', '䋠' => 'bu', '䍌' => 'bu', '䏽' => 'bu', '䑰' => 'bu', '䒈' => 'bu', '䝵' => 'bu', '䪁' => 'bu', '䪔' => 'bu', '䬏' => 'bu', '䳝' => 'bu', '䴝' => 'bu', '䴺' => 'bu',
+ '与' => 'yu', '予' => 'yu', '于' => 'yu', '亐' => 'yu', '伃' => 'yu', '伛' => 'yu', '余' => 'yu', '俁' => 'yu', '俞' => 'yu', '俣' => 'yu', '俼' => 'yu', '偊' => 'yu', '傴' => 'yu', '儥' => 'yu', '兪' => 'yu', '匬' => 'yu', '吁' => 'yu', '唹' => 'yu', '喅' => 'yu', '喐' => 'yu', '喩' => 'yu', '喻' => 'yu', '噊' => 'yu', '噳' => 'yu', '圄' => 'yu', '圉' => 'yu', '圫' => 'yu', '域' => 'yu', '堉' => 'yu', '堣' => 'yu', '堬' => 'yu', '妤' => 'yu', '妪' => 'yu', '娛' => 'yu', '娯' => 'yu', '娱' => 'yu', '媀' => 'yu', '嫗' => 'yu', '嬩' => 'yu', '宇' => 'yu', '寓' => 'yu', '寙' => 'yu', '屿' => 'yu', '峪' => 'yu', '峿' => 'yu', '崳' => 'yu', '嵎' => 'yu', '嵛' => 'yu', '嶎' => 'yu', '嶼' => 'yu', '庽' => 'yu', '庾' => 'yu', '彧' => 'yu', '御' => 'yu', '忬' => 'yu', '悆' => 'yu', '惐' => 'yu', '愈' => 'yu', '愉' => 'yu', '愚' => 'yu', '慾' => 'yu', '懙' => 'yu', '戫' => 'yu', '扜' => 'yu', '扵' => 'yu', '挧' => 'yu', '揄' => 'yu', '敔' => 'yu', '斔' => 'yu', '斞' => 'yu', '於' => 'yu', '旟' => 'yu', '昱' => 'yu', '杅' => 'yu', '栯' => 'yu', '棛' => 'yu', '棜' => 'yu', '棫' => 'yu', '楀' => 'yu', '楡' => 'yu', '楰' => 'yu', '榆' => 'yu', '櫲' => 'yu', '欎' => 'yu', '欝' => 'yu', '欤' => 'yu', '欲' => 'yu', '歈' => 'yu', '歟' => 'yu', '歶' => 'yu', '毓' => 'yu', '浴' => 'yu', '淢' => 'yu', '淤' => 'yu', '淯' => 'yu', '渔' => 'yu', '渝' => 'yu', '湡' => 'yu', '滪' => 'yu', '漁' => 'yu', '澞' => 'yu', '澦' => 'yu', '灪' => 'yu', '焴' => 'yu', '煜' => 'yu', '燏' => 'yu', '燠' => 'yu', '爩' => 'yu', '牏' => 'yu', '狱' => 'yu', '狳' => 'yu', '獄' => 'yu', '玉' => 'yu', '玗' => 'yu', '玙' => 'yu', '琙' => 'yu', '瑀' => 'yu', '瑜' => 'yu', '璵' => 'yu', '畬' => 'yu', '畭' => 'yu', '瘀' => 'yu', '瘉' => 'yu', '瘐' => 'yu', '癒' => 'yu', '盂' => 'yu', '盓' => 'yu', '睮' => 'yu', '矞' => 'yu', '砡' => 'yu', '硢' => 'yu', '礇' => 'yu', '礖' => 'yu', '礜' => 'yu', '祤' => 'yu', '禦' => 'yu', '禹' => 'yu', '禺' => 'yu', '秗' => 'yu', '稢' => 'yu', '稶' => 'yu', '穥' => 'yu', '穻' => 'yu', '窬' => 'yu', '窳' => 'yu', '竽' => 'yu', '箊' => 'yu', '篽' => 'yu', '籅' => 'yu', '籞' => 'yu', '籲' => 'yu', '紆' => 'yu', '緎' => 'yu', '繘' => 'yu', '纡' => 'yu', '罭' => 'yu', '羭' => 'yu', '羽' => 'yu', '聿' => 'yu', '育' => 'yu', '腴' => 'yu', '臾' => 'yu', '舁' => 'yu', '舆' => 'yu', '與' => 'yu', '艅' => 'yu', '芋' => 'yu', '芌' => 'yu', '茟' => 'yu', '茰' => 'yu', '荢' => 'yu', '萭' => 'yu', '萮' => 'yu', '萸' => 'yu', '蒮' => 'yu', '蓣' => 'yu', '蓹' => 'yu', '蕍' => 'yu', '蕷' => 'yu', '薁' => 'yu', '蘌' => 'yu', '蘛' => 'yu', '虞' => 'yu', '虶' => 'yu', '蜟' => 'yu', '蜮' => 'yu', '蝓' => 'yu', '螸' => 'yu', '衧' => 'yu', '袬' => 'yu', '裕' => 'yu', '褕' => 'yu', '覦' => 'yu', '觎' => 'yu', '誉' => 'yu', '語' => 'yu', '諛' => 'yu', '諭' => 'yu', '謣' => 'yu', '譽' => 'yu', '语' => 'yu', '谀' => 'yu', '谕' => 'yu', '豫' => 'yu', '貐' => 'yu', '踰' => 'yu', '軉' => 'yu', '輍' => 'yu', '輿' => 'yu', '轝' => 'yu', '迃' => 'yu', '逳' => 'yu', '逾' => 'yu', '遇' => 'yu', '遹' => 'yu', '邘' => 'yu', '郁' => 'yu', '鄅' => 'yu', '酑' => 'yu', '醧' => 'yu', '釪' => 'yu', '鈺' => 'yu', '銉' => 'yu', '鋊' => 'yu', '鋙' => 'yu', '錥' => 'yu', '鍝' => 'yu', '鐭' => 'yu', '钰' => 'yu', '铻' => 'yu', '閾' => 'yu', '阈' => 'yu', '陓' => 'yu', '隃' => 'yu', '隅' => 'yu', '隩' => 'yu', '雓' => 'yu', '雨' => 'yu', '雩' => 'yu', '霱' => 'yu', '預' => 'yu', '预' => 'yu', '飫' => 'yu', '餘' => 'yu', '饇' => 'yu', '饫' => 'yu', '馀' => 'yu', '馭' => 'yu', '騟' => 'yu', '驈' => 'yu', '驭' => 'yu', '骬' => 'yu', '髃' => 'yu', '鬰' => 'yu', '鬱' => 'yu', '鬻' => 'yu', '魊' => 'yu', '魚' => 'yu', '魣' => 'yu', '鮽' => 'yu', '鯲' => 'yu', '鰅' => 'yu', '鱊' => 'yu', '鱼' => 'yu', '鳿' => 'yu', '鴥' => 'yu', '鴧' => 'yu', '鴪' => 'yu', '鵒' => 'yu', '鷠' => 'yu', '鷸' => 'yu', '鸆' => 'yu', '鸒' => 'yu', '鹆' => 'yu', '鹬' => 'yu', '麌' => 'yu', '齬' => 'yu', '龉' => 'yu', '㑨' => 'yu', '㒁' => 'yu', '㒜' => 'yu', '㔱' => 'yu', '㙑' => 'yu', '㚥' => 'yu', '㝢' => 'yu', '㠘' => 'yu', '㠨' => 'yu', '㡰' => 'yu', '㣃' => 'yu', '㤤' => 'yu', '㥔' => 'yu', '㥚' => 'yu', '㥥' => 'yu', '㦛' => 'yu', '㪀' => 'yu', '㬂' => 'yu', '㬰' => 'yu', '㲾' => 'yu', '㳚' => 'yu', '㳛' => 'yu', '㶛' => 'yu', '㷒' => 'yu', '㺄' => 'yu', '㺞' => 'yu', '㺮' => 'yu', '㼌' => 'yu', '㼶' => 'yu', '㽣' => 'yu', '䁌' => 'yu', '䁩' => 'yu', '䂊' => 'yu', '䂛' => 'yu', '䃋' => 'yu', '䄏' => 'yu', '䄨' => 'yu', '䆷' => 'yu', '䈅' => 'yu', '䉛' => 'yu', '䋖' => 'yu', '䍂' => 'yu', '䍞' => 'yu', '䏸' => 'yu', '䐳' => 'yu', '䔡' => 'yu', '䖇' => 'yu', '䗨' => 'yu', '䘘' => 'yu', '䘱' => 'yu', '䛕' => 'yu', '䜽' => 'yu', '䢓' => 'yu', '䢩' => 'yu', '䣁' => 'yu', '䥏' => 'yu', '䨒' => 'yu', '䨞' => 'yu', '䩒' => 'yu', '䬄' => 'yu', '䮇' => 'yu', '䮙' => 'yu', '䰻' => 'yu', '䱷' => 'yu', '䲣' => 'yu', '䴁' => 'yu', '䵫' => 'yu',
+ '丏' => 'mian', '俛' => 'mian', '偭' => 'mian', '免' => 'mian', '冕' => 'mian', '勉' => 'mian', '勔' => 'mian', '喕' => 'mian', '娩' => 'mian', '婂' => 'mian', '媔' => 'mian', '嬵' => 'mian', '宀' => 'mian', '愐' => 'mian', '棉' => 'mian', '檰' => 'mian', '櫋' => 'mian', '汅' => 'mian', '沔' => 'mian', '湎' => 'mian', '眄' => 'mian', '眠' => 'mian', '矈' => 'mian', '矊' => 'mian', '矏' => 'mian', '糆' => 'mian', '綿' => 'mian', '緜' => 'mian', '緬' => 'mian', '绵' => 'mian', '缅' => 'mian', '腼' => 'mian', '臱' => 'mian', '芇' => 'mian', '葂' => 'mian', '蝒' => 'mian', '面' => 'mian', '靣' => 'mian', '鮸' => 'mian', '麪' => 'mian', '麫' => 'mian', '麵' => 'mian', '麺' => 'mian', '黾' => 'mian', '㒙' => 'mian', '㛯' => 'mian', '㝰' => 'mian', '㤁' => 'mian', '㬆' => 'mian', '㮌' => 'mian', '㰃' => 'mian', '㴐' => 'mian', '㻰' => 'mian', '䀎' => 'mian', '䃇' => 'mian', '䏃' => 'mian', '䤄' => 'mian', '䫵' => 'mian', '䰓' => 'mian',
+ '丐' => 'gai', '乢' => 'gai', '侅' => 'gai', '匃' => 'gai', '匄' => 'gai', '垓' => 'gai', '姟' => 'gai', '峐' => 'gai', '忋' => 'gai', '戤' => 'gai', '摡' => 'gai', '改' => 'gai', '晐' => 'gai', '杚' => 'gai', '概' => 'gai', '槩' => 'gai', '槪' => 'gai', '溉' => 'gai', '漑' => 'gai', '瓂' => 'gai', '畡' => 'gai', '盖' => 'gai', '祴' => 'gai', '絠' => 'gai', '絯' => 'gai', '荄' => 'gai', '葢' => 'gai', '蓋' => 'gai', '該' => 'gai', '该' => 'gai', '豥' => 'gai', '賅' => 'gai', '賌' => 'gai', '赅' => 'gai', '郂' => 'gai', '鈣' => 'gai', '鎅' => 'gai', '钙' => 'gai', '陔' => 'gai', '隑' => 'gai', '㕢' => 'gai', '㧉' => 'gai', '㮣' => 'gai', '䏗' => 'gai', '䪱' => 'gai',
+ '丑' => 'chou', '丒' => 'chou', '仇' => 'chou', '侴' => 'chou', '俦' => 'chou', '偢' => 'chou', '儔' => 'chou', '吜' => 'chou', '嬦' => 'chou', '帱' => 'chou', '幬' => 'chou', '惆' => 'chou', '愁' => 'chou', '懤' => 'chou', '抽' => 'chou', '搊' => 'chou', '杽' => 'chou', '栦' => 'chou', '椆' => 'chou', '殠' => 'chou', '燽' => 'chou', '犨' => 'chou', '犫' => 'chou', '畴' => 'chou', '疇' => 'chou', '瘳' => 'chou', '皗' => 'chou', '瞅' => 'chou', '矁' => 'chou', '稠' => 'chou', '筹' => 'chou', '篘' => 'chou', '籌' => 'chou', '紬' => 'chou', '絒' => 'chou', '綢' => 'chou', '绸' => 'chou', '臭' => 'chou', '臰' => 'chou', '菗' => 'chou', '薵' => 'chou', '裯' => 'chou', '詶' => 'chou', '讎' => 'chou', '讐' => 'chou', '踌' => 'chou', '躊' => 'chou', '遚' => 'chou', '酧' => 'chou', '酬' => 'chou', '醜' => 'chou', '醻' => 'chou', '雔' => 'chou', '雠' => 'chou', '魗' => 'chou', '㐜' => 'chou', '㛶' => 'chou', '㤽' => 'chou', '㦞' => 'chou', '㨶' => 'chou', '㵞' => 'chou', '㿧' => 'chou', '䇺' => 'chou', '䊭' => 'chou', '䌧' => 'chou', '䌷' => 'chou', '䓓' => 'chou', '䔏' => 'chou', '䛬' => 'chou', '䥒' => 'chou', '䪮' => 'chou', '䲖' => 'chou',
+ '专' => 'zhuan', '僎' => 'zhuan', '叀' => 'zhuan', '啭' => 'zhuan', '囀' => 'zhuan', '堟' => 'zhuan', '嫥' => 'zhuan', '孨' => 'zhuan', '専' => 'zhuan', '專' => 'zhuan', '撰' => 'zhuan', '灷' => 'zhuan', '瑑' => 'zhuan', '瑼' => 'zhuan', '甎' => 'zhuan', '砖' => 'zhuan', '磚' => 'zhuan', '竱' => 'zhuan', '篆' => 'zhuan', '籑' => 'zhuan', '縳' => 'zhuan', '膞' => 'zhuan', '蒃' => 'zhuan', '蟤' => 'zhuan', '襈' => 'zhuan', '諯' => 'zhuan', '譔' => 'zhuan', '賺' => 'zhuan', '赚' => 'zhuan', '転' => 'zhuan', '轉' => 'zhuan', '转' => 'zhuan', '鄟' => 'zhuan', '顓' => 'zhuan', '颛' => 'zhuan', '饌' => 'zhuan', '馔' => 'zhuan', '鱄' => 'zhuan', '䉵' => 'zhuan', '䡱' => 'zhuan',
+ '且' => 'qie', '倿' => 'qie', '切' => 'qie', '匧' => 'qie', '厒' => 'qie', '妾' => 'qie', '怯' => 'qie', '悏' => 'qie', '惬' => 'qie', '愜' => 'qie', '挈' => 'qie', '朅' => 'qie', '洯' => 'qie', '淁' => 'qie', '癿' => 'qie', '穕' => 'qie', '窃' => 'qie', '竊' => 'qie', '笡' => 'qie', '箧' => 'qie', '篋' => 'qie', '籡' => 'qie', '緁' => 'qie', '聺' => 'qie', '苆' => 'qie', '茄' => 'qie', '藒' => 'qie', '蛪' => 'qie', '踥' => 'qie', '鍥' => 'qie', '鐑' => 'qie', '锲' => 'qie', '魥' => 'qie', '鯜' => 'qie', '㓶' => 'qie', '㗫' => 'qie', '㚗' => 'qie', '㛍' => 'qie', '㛙' => 'qie', '㤲' => 'qie', '㥦' => 'qie', '㫸' => 'qie', '㰰' => 'qie', '㰼' => 'qie', '㹤' => 'qie', '㾀' => 'qie', '㾜' => 'qie', '䟙' => 'qie', '䤿' => 'qie', '䦧' => 'qie', '䬊' => 'qie',
+ '丕' => 'pi', '仳' => 'pi', '伓' => 'pi', '伾' => 'pi', '僻' => 'pi', '劈' => 'pi', '匹' => 'pi', '啤' => 'pi', '噼' => 'pi', '噽' => 'pi', '嚊' => 'pi', '嚭' => 'pi', '圮' => 'pi', '坯' => 'pi', '埤' => 'pi', '壀' => 'pi', '媲' => 'pi', '嫓' => 'pi', '屁' => 'pi', '岯' => 'pi', '崥' => 'pi', '庀' => 'pi', '怶' => 'pi', '悂' => 'pi', '憵' => 'pi', '批' => 'pi', '披' => 'pi', '抷' => 'pi', '揊' => 'pi', '擗' => 'pi', '旇' => 'pi', '朇' => 'pi', '枇' => 'pi', '椑' => 'pi', '榌' => 'pi', '毗' => 'pi', '毘' => 'pi', '毞' => 'pi', '淠' => 'pi', '渒' => 'pi', '潎' => 'pi', '澼' => 'pi', '炋' => 'pi', '焷' => 'pi', '狉' => 'pi', '狓' => 'pi', '琵' => 'pi', '甓' => 'pi', '疈' => 'pi', '疲' => 'pi', '痞' => 'pi', '癖' => 'pi', '皮' => 'pi', '睤' => 'pi', '睥' => 'pi', '砒' => 'pi', '磇' => 'pi', '礔' => 'pi', '礕' => 'pi', '秛' => 'pi', '秠' => 'pi', '笓' => 'pi', '篺' => 'pi', '簲' => 'pi', '紕' => 'pi', '纰' => 'pi', '罴' => 'pi', '羆' => 'pi', '翍' => 'pi', '耚' => 'pi', '肶' => 'pi', '脴' => 'pi', '脾' => 'pi', '腗' => 'pi', '膍' => 'pi', '芘' => 'pi', '苉' => 'pi', '蚍' => 'pi', '蚽' => 'pi', '蜱' => 'pi', '螷' => 'pi', '蠯' => 'pi', '諀' => 'pi', '譬' => 'pi', '豼' => 'pi', '豾' => 'pi', '貔' => 'pi', '邳' => 'pi', '郫' => 'pi', '釽' => 'pi', '鈚' => 'pi', '鈹' => 'pi', '鉟' => 'pi', '銔' => 'pi', '銢' => 'pi', '錃' => 'pi', '錍' => 'pi', '铍' => 'pi', '闢' => 'pi', '阰' => 'pi', '陴' => 'pi', '隦' => 'pi', '霹' => 'pi', '駓' => 'pi', '髬' => 'pi', '魮' => 'pi', '魾' => 'pi', '鮍' => 'pi', '鲏' => 'pi', '鴄' => 'pi', '鵧' => 'pi', '鷿' => 'pi', '鸊' => 'pi', '鼙' => 'pi', '㔥' => 'pi', '㨽' => 'pi', '㯅' => 'pi', '㿙' => 'pi', '䏘' => 'pi', '䑀' => 'pi', '䑄' => 'pi', '䚰' => 'pi', '䚹' => 'pi', '䠘' => 'pi', '䡟' => 'pi', '䤏' => 'pi', '䤨' => 'pi', '䫌' => 'pi', '䰦' => 'pi', '䴙' => 'pi',
+ '世' => 'shi', '丗' => 'shi', '乨' => 'shi', '亊' => 'shi', '事' => 'shi', '什' => 'shi', '仕' => 'shi', '佦' => 'shi', '使' => 'shi', '侍' => 'shi', '兘' => 'shi', '兙' => 'shi', '冟' => 'shi', '势' => 'shi', '勢' => 'shi', '十' => 'shi', '卋' => 'shi', '叓' => 'shi', '史' => 'shi', '呞' => 'shi', '呩' => 'shi', '嗜' => 'shi', '噬' => 'shi', '埘' => 'shi', '塒' => 'shi', '士' => 'shi', '失' => 'shi', '奭' => 'shi', '始' => 'shi', '姼' => 'shi', '嬕' => 'shi', '实' => 'shi', '実' => 'shi', '室' => 'shi', '宩' => 'shi', '寔' => 'shi', '實' => 'shi', '尸' => 'shi', '屍' => 'shi', '屎' => 'shi', '峕' => 'shi', '崼' => 'shi', '嵵' => 'shi', '市' => 'shi', '师' => 'shi', '師' => 'shi', '式' => 'shi', '弑' => 'shi', '弒' => 'shi', '徥' => 'shi', '忕' => 'shi', '恀' => 'shi', '恃' => 'shi', '戺' => 'shi', '拭' => 'shi', '拾' => 'shi', '揓' => 'shi', '施' => 'shi', '时' => 'shi', '旹' => 'shi', '是' => 'shi', '昰' => 'shi', '時' => 'shi', '枾' => 'shi', '柹' => 'shi', '柿' => 'shi', '栻' => 'shi', '榁' => 'shi', '榯' => 'shi', '檡' => 'shi', '氏' => 'shi', '浉' => 'shi', '湜' => 'shi', '湤' => 'shi', '湿' => 'shi', '溡' => 'shi', '溮' => 'shi', '溼' => 'shi', '澨' => 'shi', '濕' => 'shi', '炻' => 'shi', '烒' => 'shi', '煶' => 'shi', '狮' => 'shi', '獅' => 'shi', '瑡' => 'shi', '瓧' => 'shi', '眂' => 'shi', '眎' => 'shi', '眡' => 'shi', '睗' => 'shi', '矢' => 'shi', '石' => 'shi', '示' => 'shi', '礻' => 'shi', '祏' => 'shi', '竍' => 'shi', '笶' => 'shi', '笹' => 'shi', '筮' => 'shi', '箷' => 'shi', '篒' => 'shi', '簭' => 'shi', '籂' => 'shi', '籭' => 'shi', '絁' => 'shi', '舐' => 'shi', '舓' => 'shi', '莳' => 'shi', '葹' => 'shi', '蒒' => 'shi', '蒔' => 'shi', '蓍' => 'shi', '虱' => 'shi', '虲' => 'shi', '蚀' => 'shi', '蝕' => 'shi', '蝨' => 'shi', '螫' => 'shi', '褆' => 'shi', '褷' => 'shi', '襫' => 'shi', '襹' => 'shi', '視' => 'shi', '视' => 'shi', '觢' => 'shi', '試' => 'shi', '詩' => 'shi', '誓' => 'shi', '諟' => 'shi', '諡' => 'shi', '謚' => 'shi', '識' => 'shi', '识' => 'shi', '试' => 'shi', '诗' => 'shi', '谥' => 'shi', '豕' => 'shi', '貰' => 'shi', '贳' => 'shi', '軾' => 'shi', '轼' => 'shi', '辻' => 'shi', '适' => 'shi', '逝' => 'shi', '遈' => 'shi', '適' => 'shi', '遾' => 'shi', '邿' => 'shi', '酾' => 'shi', '釃' => 'shi', '釈' => 'shi', '释' => 'shi', '釋' => 'shi', '釶' => 'shi', '鈰' => 'shi', '鉂' => 'shi', '鉃' => 'shi', '鉇' => 'shi', '鉐' => 'shi', '鉽' => 'shi', '銴' => 'shi', '鍦' => 'shi', '铈' => 'shi', '食' => 'shi', '飠' => 'shi', '飾' => 'shi', '餝' => 'shi', '饣' => 'shi', '饰' => 'shi', '駛' => 'shi', '驶' => 'shi', '鮖' => 'shi', '鯴' => 'shi', '鰘' => 'shi', '鰣' => 'shi', '鰤' => 'shi', '鲥' => 'shi', '鲺' => 'shi', '鳲' => 'shi', '鳾' => 'shi', '鶳' => 'shi', '鸤' => 'shi', '鼫' => 'shi', '鼭' => 'shi', '齛' => 'shi', '㒾' => 'shi', '㔺' => 'shi', '㕜' => 'shi', '㖷' => 'shi', '㫑' => 'shi', '㮶' => 'shi', '㱁' => 'shi', '㵓' => 'shi', '㸷' => 'shi', '㹝' => 'shi', '㹬' => 'shi', '㹷' => 'shi', '䁺' => 'shi', '䂖' => 'shi', '䊓' => 'shi', '䏡' => 'shi', '䒨' => 'shi', '䖨' => 'shi', '䛈' => 'shi', '䟗' => 'shi', '䤱' => 'shi', '䦠' => 'shi', '䦹' => 'shi', '䩃' => 'shi', '䭄' => 'shi', '䰄' => 'shi', '䴓' => 'shi', '䶡' => 'shi',
+ '丘' => 'qiu', '丠' => 'qiu', '俅' => 'qiu', '叴' => 'qiu', '唒' => 'qiu', '囚' => 'qiu', '坵' => 'qiu', '媝' => 'qiu', '寈' => 'qiu', '崷' => 'qiu', '巯' => 'qiu', '巰' => 'qiu', '恘' => 'qiu', '扏' => 'qiu', '搝' => 'qiu', '朹' => 'qiu', '梂' => 'qiu', '楸' => 'qiu', '殏' => 'qiu', '毬' => 'qiu', '求' => 'qiu', '汓' => 'qiu', '泅' => 'qiu', '浗' => 'qiu', '渞' => 'qiu', '湭' => 'qiu', '煪' => 'qiu', '犰' => 'qiu', '玌' => 'qiu', '球' => 'qiu', '璆' => 'qiu', '皳' => 'qiu', '盚' => 'qiu', '秋' => 'qiu', '秌' => 'qiu', '穐' => 'qiu', '篍' => 'qiu', '糗' => 'qiu', '紌' => 'qiu', '絿' => 'qiu', '緧' => 'qiu', '肍' => 'qiu', '莍' => 'qiu', '萩' => 'qiu', '蓲' => 'qiu', '蘒' => 'qiu', '虬' => 'qiu', '虯' => 'qiu', '蚯' => 'qiu', '蛷' => 'qiu', '蝤' => 'qiu', '蝵' => 'qiu', '蟗' => 'qiu', '蠤' => 'qiu', '裘' => 'qiu', '觓' => 'qiu', '觩' => 'qiu', '訄' => 'qiu', '訅' => 'qiu', '賕' => 'qiu', '赇' => 'qiu', '趥' => 'qiu', '逎' => 'qiu', '逑' => 'qiu', '遒' => 'qiu', '邱' => 'qiu', '酋' => 'qiu', '醔' => 'qiu', '釚' => 'qiu', '釻' => 'qiu', '銶' => 'qiu', '鞦' => 'qiu', '鞧' => 'qiu', '鮂' => 'qiu', '鯄' => 'qiu', '鰌' => 'qiu', '鰍' => 'qiu', '鰽' => 'qiu', '鱃' => 'qiu', '鳅' => 'qiu', '鵭' => 'qiu', '鶖' => 'qiu', '鹙' => 'qiu', '鼽' => 'qiu', '龝' => 'qiu', '㐀' => 'qiu', '㐤' => 'qiu', '㕤' => 'qiu', '㞗' => 'qiu', '㟈' => 'qiu', '㤹' => 'qiu', '㥢' => 'qiu', '㧨' => 'qiu', '㭝' => 'qiu', '㷕' => 'qiu', '㺫' => 'qiu', '㼒' => 'qiu', '䆋' => 'qiu', '䊵' => 'qiu', '䎿' => 'qiu', '䜪' => 'qiu', '䞭' => 'qiu', '䟬' => 'qiu', '䟵' => 'qiu', '䠗' => 'qiu', '䣇' => 'qiu', '䤛' => 'qiu',
+ '丙' => 'bing', '並' => 'bing', '仌' => 'bing', '併' => 'bing', '倂' => 'bing', '偋' => 'bing', '傡' => 'bing', '兵' => 'bing', '冫' => 'bing', '冰' => 'bing', '垪' => 'bing', '寎' => 'bing', '并' => 'bing', '幷' => 'bing', '庰' => 'bing', '怲' => 'bing', '抦' => 'bing', '掤' => 'bing', '摒' => 'bing', '昞' => 'bing', '昺' => 'bing', '柄' => 'bing', '栟' => 'bing', '栤' => 'bing', '梹' => 'bing', '棅' => 'bing', '檳' => 'bing', '氷' => 'bing', '炳' => 'bing', '燷' => 'bing', '病' => 'bing', '眪' => 'bing', '禀' => 'bing', '秉' => 'bing', '窉' => 'bing', '竝' => 'bing', '苪' => 'bing', '蛃' => 'bing', '誁' => 'bing', '邴' => 'bing', '鈵' => 'bing', '鉼' => 'bing', '鋲' => 'bing', '陃' => 'bing', '靐' => 'bing', '鞆' => 'bing', '餅' => 'bing', '餠' => 'bing', '饼' => 'bing', '鮩' => 'bing', '㓈' => 'bing', '㨀' => 'bing', '䈂' => 'bing', '䋑' => 'bing', '䓑' => 'bing', '䗒' => 'bing', '䴵' => 'bing',
+ '业' => 'ye', '也' => 'ye', '亪' => 'ye', '亱' => 'ye', '倻' => 'ye', '偞' => 'ye', '僷' => 'ye', '冶' => 'ye', '叶' => 'ye', '吔' => 'ye', '嘢' => 'ye', '噎' => 'ye', '嚈' => 'ye', '埜' => 'ye', '堨' => 'ye', '墷' => 'ye', '壄' => 'ye', '夜' => 'ye', '嶪' => 'ye', '嶫' => 'ye', '抴' => 'ye', '捓' => 'ye', '捙' => 'ye', '掖' => 'ye', '揶' => 'ye', '擖' => 'ye', '擛' => 'ye', '擨' => 'ye', '擪' => 'ye', '擫' => 'ye', '晔' => 'ye', '暍' => 'ye', '曄' => 'ye', '曅' => 'ye', '曗' => 'ye', '曳' => 'ye', '枼' => 'ye', '枽' => 'ye', '椰' => 'ye', '楪' => 'ye', '業' => 'ye', '歋' => 'ye', '殗' => 'ye', '洂' => 'ye', '液' => 'ye', '漜' => 'ye', '潱' => 'ye', '澲' => 'ye', '烨' => 'ye', '燁' => 'ye', '爗' => 'ye', '爷' => 'ye', '爺' => 'ye', '皣' => 'ye', '瞱' => 'ye', '瞸' => 'ye', '礏' => 'ye', '耶' => 'ye', '腋' => 'ye', '葉' => 'ye', '蠮' => 'ye', '謁' => 'ye', '谒' => 'ye', '邺' => 'ye', '鄓' => 'ye', '鄴' => 'ye', '野' => 'ye', '釾' => 'ye', '鋣' => 'ye', '鍱' => 'ye', '鎁' => 'ye', '鎑' => 'ye', '铘' => 'ye', '靥' => 'ye', '靨' => 'ye', '頁' => 'ye', '页' => 'ye', '餣' => 'ye', '饁' => 'ye', '馌' => 'ye', '驜' => 'ye', '鵺' => 'ye', '鸈' => 'ye', '㐖' => 'ye', '㖡' => 'ye', '㖶' => 'ye', '㗼' => 'ye', '㙒' => 'ye', '㙪' => 'ye', '㝣' => 'ye', '㥷' => 'ye', '㩎' => 'ye', '㪑' => 'ye', '㱉' => 'ye', '㸣' => 'ye', '䈎' => 'ye', '䓉' => 'ye', '䤳' => 'ye', '䤶' => 'ye', '䥟' => 'ye', '䥡' => 'ye', '䥺' => 'ye', '䧨' => 'ye', '䭟' => 'ye', '䲜' => 'ye',
+ '丛' => 'cong', '从' => 'cong', '匆' => 'cong', '叢' => 'cong', '囪' => 'cong', '囱' => 'cong', '婃' => 'cong', '孮' => 'cong', '従' => 'cong', '徖' => 'cong', '從' => 'cong', '忩' => 'cong', '怱' => 'cong', '悤' => 'cong', '悰' => 'cong', '慒' => 'cong', '憁' => 'cong', '暰' => 'cong', '枞' => 'cong', '棇' => 'cong', '楤' => 'cong', '樅' => 'cong', '樬' => 'cong', '樷' => 'cong', '欉' => 'cong', '淙' => 'cong', '漎' => 'cong', '漗' => 'cong', '潀' => 'cong', '潈' => 'cong', '潨' => 'cong', '灇' => 'cong', '焧' => 'cong', '熜' => 'cong', '爜' => 'cong', '琮' => 'cong', '瑽' => 'cong', '璁' => 'cong', '瞛' => 'cong', '篵' => 'cong', '緫' => 'cong', '繱' => 'cong', '聡' => 'cong', '聦' => 'cong', '聪' => 'cong', '聰' => 'cong', '苁' => 'cong', '茐' => 'cong', '葱' => 'cong', '蓯' => 'cong', '蔥' => 'cong', '藂' => 'cong', '蟌' => 'cong', '誴' => 'cong', '謥' => 'cong', '賨' => 'cong', '賩' => 'cong', '鏦' => 'cong', '騘' => 'cong', '驄' => 'cong', '骢' => 'cong', '㼻' => 'cong', '䉘' => 'cong', '䕺' => 'cong', '䧚' => 'cong', '䳷' => 'cong',
+ '东' => 'dong', '侗' => 'dong', '倲' => 'dong', '働' => 'dong', '冬' => 'dong', '冻' => 'dong', '凍' => 'dong', '动' => 'dong', '動' => 'dong', '咚' => 'dong', '垌' => 'dong', '埬' => 'dong', '墥' => 'dong', '姛' => 'dong', '娻' => 'dong', '嬞' => 'dong', '岽' => 'dong', '峒' => 'dong', '峝' => 'dong', '崠' => 'dong', '崬' => 'dong', '恫' => 'dong', '懂' => 'dong', '戙' => 'dong', '挏' => 'dong', '昸' => 'dong', '東' => 'dong', '栋' => 'dong', '棟' => 'dong', '氡' => 'dong', '氭' => 'dong', '洞' => 'dong', '涷' => 'dong', '湩' => 'dong', '硐' => 'dong', '笗' => 'dong', '箽' => 'dong', '胨' => 'dong', '胴' => 'dong', '腖' => 'dong', '苳' => 'dong', '菄' => 'dong', '董' => 'dong', '蕫' => 'dong', '蝀' => 'dong', '詷' => 'dong', '諌' => 'dong', '迵' => 'dong', '霘' => 'dong', '駧' => 'dong', '鮗' => 'dong', '鯟' => 'dong', '鶇' => 'dong', '鶫' => 'dong', '鸫' => 'dong', '鼕' => 'dong', '㑈' => 'dong', '㓊' => 'dong', '㖦' => 'dong', '㗢' => 'dong', '㜱' => 'dong', '㢥' => 'dong', '㨂' => 'dong', '㼯' => 'dong', '䂢' => 'dong', '䅍' => 'dong', '䍶' => 'dong', '䞒' => 'dong', '䵔' => 'dong',
+ '丝' => 'si', '乺' => 'si', '亖' => 'si', '伺' => 'si', '似' => 'si', '佀' => 'si', '価' => 'si', '俟' => 'si', '俬' => 'si', '儩' => 'si', '兕' => 'si', '凘' => 'si', '厮' => 'si', '厶' => 'si', '司' => 'si', '咝' => 'si', '嗣' => 'si', '嘶' => 'si', '噝' => 'si', '四' => 'si', '姒' => 'si', '娰' => 'si', '媤' => 'si', '孠' => 'si', '寺' => 'si', '巳' => 'si', '廝' => 'si', '思' => 'si', '恖' => 'si', '撕' => 'si', '斯' => 'si', '枱' => 'si', '柶' => 'si', '梩' => 'si', '楒' => 'si', '榹' => 'si', '死' => 'si', '汜' => 'si', '泀' => 'si', '泗' => 'si', '泤' => 'si', '洍' => 'si', '涘' => 'si', '澌' => 'si', '瀃' => 'si', '燍' => 'si', '牭' => 'si', '磃' => 'si', '祀' => 'si', '禗' => 'si', '禠' => 'si', '禩' => 'si', '私' => 'si', '竢' => 'si', '笥' => 'si', '糹' => 'si', '絲' => 'si', '緦' => 'si', '纟' => 'si', '缌' => 'si', '罒' => 'si', '罳' => 'si', '耜' => 'si', '肂' => 'si', '肆' => 'si', '蕬' => 'si', '蕼' => 'si', '虒' => 'si', '蛳' => 'si', '蜤' => 'si', '螄' => 'si', '螦' => 'si', '蟖' => 'si', '蟴' => 'si', '覗' => 'si', '貄' => 'si', '釲' => 'si', '鈻' => 'si', '鉰' => 'si', '銯' => 'si', '鋖' => 'si', '鍶' => 'si', '鐁' => 'si', '锶' => 'si', '颸' => 'si', '飔' => 'si', '飤' => 'si', '飼' => 'si', '饲' => 'si', '駟' => 'si', '騃' => 'si', '騦' => 'si', '驷' => 'si', '鷥' => 'si', '鸶' => 'si', '鼶' => 'si', '㐌' => 'si', '㕽' => 'si', '㚶' => 'si', '㣈' => 'si', '㭒' => 'si', '㸻' => 'si', '㹑' => 'si', '㾅' => 'si', '䇃' => 'si', '䎣' => 'si', '䏤' => 'si', '䦙' => 'si',
+ '丞' => 'cheng', '乗' => 'cheng', '乘' => 'cheng', '侱' => 'cheng', '偁' => 'cheng', '呈' => 'cheng', '城' => 'cheng', '埕' => 'cheng', '堘' => 'cheng', '塍' => 'cheng', '塖' => 'cheng', '娍' => 'cheng', '宬' => 'cheng', '峸' => 'cheng', '庱' => 'cheng', '徎' => 'cheng', '悜' => 'cheng', '惩' => 'cheng', '憆' => 'cheng', '憕' => 'cheng', '懲' => 'cheng', '成' => 'cheng', '承' => 'cheng', '挰' => 'cheng', '掁' => 'cheng', '摚' => 'cheng', '撐' => 'cheng', '撑' => 'cheng', '朾' => 'cheng', '枨' => 'cheng', '柽' => 'cheng', '棖' => 'cheng', '棦' => 'cheng', '椉' => 'cheng', '橕' => 'cheng', '橙' => 'cheng', '檉' => 'cheng', '檙' => 'cheng', '泟' => 'cheng', '洆' => 'cheng', '浾' => 'cheng', '溗' => 'cheng', '澂' => 'cheng', '澄' => 'cheng', '瀓' => 'cheng', '爯' => 'cheng', '牚' => 'cheng', '珵' => 'cheng', '珹' => 'cheng', '琤' => 'cheng', '畻' => 'cheng', '睈' => 'cheng', '瞠' => 'cheng', '碀' => 'cheng', '秤' => 'cheng', '称' => 'cheng', '程' => 'cheng', '穪' => 'cheng', '窚' => 'cheng', '竀' => 'cheng', '筬' => 'cheng', '絾' => 'cheng', '緽' => 'cheng', '脀' => 'cheng', '脭' => 'cheng', '荿' => 'cheng', '虰' => 'cheng', '蛏' => 'cheng', '蟶' => 'cheng', '裎' => 'cheng', '誠' => 'cheng', '诚' => 'cheng', '赪' => 'cheng', '赬' => 'cheng', '逞' => 'cheng', '郕' => 'cheng', '酲' => 'cheng', '鋮' => 'cheng', '鏳' => 'cheng', '鏿' => 'cheng', '鐺' => 'cheng', '铖' => 'cheng', '铛' => 'cheng', '阷' => 'cheng', '靗' => 'cheng', '頳' => 'cheng', '饓' => 'cheng', '騁' => 'cheng', '騬' => 'cheng', '骋' => 'cheng', '鯎' => 'cheng', '㐼' => 'cheng', '㞼' => 'cheng', '㨃' => 'cheng', '㲂' => 'cheng', '㼩' => 'cheng', '䀕' => 'cheng', '䁎' => 'cheng', '䄇' => 'cheng', '䆑' => 'cheng', '䆵' => 'cheng', '䆸' => 'cheng', '䇸' => 'cheng', '䔲' => 'cheng', '䗊' => 'cheng', '䞓' => 'cheng', '䧕' => 'cheng', '䫆' => 'cheng', '䮪' => 'cheng',
+ '丟' => 'diu', '丢' => 'diu', '銩' => 'diu', '铥' => 'diu', '颩' => 'diu',
+ '両' => 'liang', '两' => 'liang', '亮' => 'liang', '俍' => 'liang', '兩' => 'liang', '凉' => 'liang', '哴' => 'liang', '唡' => 'liang', '啢' => 'liang', '喨' => 'liang', '墚' => 'liang', '掚' => 'liang', '晾' => 'liang', '梁' => 'liang', '椋' => 'liang', '樑' => 'liang', '涼' => 'liang', '湸' => 'liang', '煷' => 'liang', '簗' => 'liang', '粮' => 'liang', '粱' => 'liang', '糧' => 'liang', '綡' => 'liang', '緉' => 'liang', '脼' => 'liang', '良' => 'liang', '蜽' => 'liang', '裲' => 'liang', '諒' => 'liang', '谅' => 'liang', '踉' => 'liang', '輌' => 'liang', '輛' => 'liang', '輬' => 'liang', '辆' => 'liang', '辌' => 'liang', '量' => 'liang', '鍄' => 'liang', '魉' => 'liang', '魎' => 'liang', '㒳' => 'liang', '㔝' => 'liang', '㹁' => 'liang', '䓣' => 'liang', '䝶' => 'liang', '䠃' => 'liang', '䣼' => 'liang', '䩫' => 'liang', '䭪' => 'liang',
+ '丣' => 'you', '亴' => 'you', '优' => 'you', '佑' => 'you', '侑' => 'you', '偤' => 'you', '優' => 'you', '卣' => 'you', '又' => 'you', '友' => 'you', '右' => 'you', '呦' => 'you', '哊' => 'you', '唀' => 'you', '嚘' => 'you', '囿' => 'you', '姷' => 'you', '孧' => 'you', '宥' => 'you', '尢' => 'you', '尤' => 'you', '峟' => 'you', '峳' => 'you', '幼' => 'you', '幽' => 'you', '庮' => 'you', '忧' => 'you', '怞' => 'you', '怣' => 'you', '怮' => 'you', '悠' => 'you', '憂' => 'you', '懮' => 'you', '攸' => 'you', '斿' => 'you', '有' => 'you', '柚' => 'you', '梄' => 'you', '梎' => 'you', '楢' => 'you', '槱' => 'you', '櫌' => 'you', '櫾' => 'you', '沋' => 'you', '油' => 'you', '泑' => 'you', '浟' => 'you', '游' => 'you', '湵' => 'you', '滺' => 'you', '瀀' => 'you', '牖' => 'you', '牗' => 'you', '牰' => 'you', '犹' => 'you', '狖' => 'you', '猶' => 'you', '猷' => 'you', '由' => 'you', '疣' => 'you', '祐' => 'you', '禉' => 'you', '秞' => 'you', '糿' => 'you', '纋' => 'you', '羐' => 'you', '羑' => 'you', '耰' => 'you', '聈' => 'you', '肬' => 'you', '脜' => 'you', '苃' => 'you', '莜' => 'you', '莠' => 'you', '莤' => 'you', '莸' => 'you', '蒏' => 'you', '蕕' => 'you', '蚰' => 'you', '蚴' => 'you', '蜏' => 'you', '蝣' => 'you', '訧' => 'you', '誘' => 'you', '诱' => 'you', '貁' => 'you', '輏' => 'you', '輶' => 'you', '迂' => 'you', '迶' => 'you', '逌' => 'you', '逰' => 'you', '遊' => 'you', '邎' => 'you', '邮' => 'you', '郵' => 'you', '鄾' => 'you', '酉' => 'you', '酭' => 'you', '釉' => 'you', '鈾' => 'you', '銪' => 'you', '铀' => 'you', '铕' => 'you', '駀' => 'you', '魷' => 'you', '鮋' => 'you', '鱿' => 'you', '鲉' => 'you', '麀' => 'you', '黝' => 'you', '鼬' => 'you', '㒡' => 'you', '㓜' => 'you', '㕗' => 'you', '㕱' => 'you', '㘥' => 'you', '㚭' => 'you', '㛜' => 'you', '㤑' => 'you', '㫍' => 'you', '㮋' => 'you', '㰶' => 'you', '㳺' => 'you', '㹨' => 'you', '㺠' => 'you', '㻀' => 'you', '㽕' => 'you', '㾞' => 'you', '䀁' => 'you', '䅎' => 'you', '䆜' => 'you', '䑻' => 'you', '䒴' => 'you', '䖻' => 'you', '䚃' => 'you', '䛻' => 'you', '䞥' => 'you', '䢊' => 'you', '䢟' => 'you', '䬀' => 'you', '䱂' => 'you', '䳑' => 'you',
+ '严' => 'yan', '乵' => 'yan', '俨' => 'yan', '偃' => 'yan', '偐' => 'yan', '偣' => 'yan', '傿' => 'yan', '儼' => 'yan', '兖' => 'yan', '兗' => 'yan', '円' => 'yan', '剦' => 'yan', '匽' => 'yan', '厌' => 'yan', '厣' => 'yan', '厭' => 'yan', '厳' => 'yan', '厴' => 'yan', '咽' => 'yan', '唁' => 'yan', '喭' => 'yan', '噞' => 'yan', '嚥' => 'yan', '嚴' => 'yan', '堰' => 'yan', '塩' => 'yan', '墕' => 'yan', '壛' => 'yan', '壧' => 'yan', '夵' => 'yan', '奄' => 'yan', '妍' => 'yan', '妟' => 'yan', '姲' => 'yan', '姸' => 'yan', '娫' => 'yan', '娮' => 'yan', '嫣' => 'yan', '嬊' => 'yan', '嬮' => 'yan', '嬿' => 'yan', '孍' => 'yan', '宴' => 'yan', '岩' => 'yan', '崦' => 'yan', '嵃' => 'yan', '嵒' => 'yan', '嵓' => 'yan', '嶖' => 'yan', '巌' => 'yan', '巖' => 'yan', '巗' => 'yan', '巘' => 'yan', '巚' => 'yan', '延' => 'yan', '弇' => 'yan', '彥' => 'yan', '彦' => 'yan', '恹' => 'yan', '愝' => 'yan', '懕' => 'yan', '戭' => 'yan', '扊' => 'yan', '抁' => 'yan', '掞' => 'yan', '掩' => 'yan', '揅' => 'yan', '揜' => 'yan', '敥' => 'yan', '昖' => 'yan', '晏' => 'yan', '暥' => 'yan', '曕' => 'yan', '曮' => 'yan', '棪' => 'yan', '椻' => 'yan', '椼' => 'yan', '楌' => 'yan', '樮' => 'yan', '檐' => 'yan', '檿' => 'yan', '櫩' => 'yan', '欕' => 'yan', '沇' => 'yan', '沿' => 'yan', '淹' => 'yan', '渰' => 'yan', '渷' => 'yan', '湮' => 'yan', '滟' => 'yan', '演' => 'yan', '漹' => 'yan', '灎' => 'yan', '灔' => 'yan', '灧' => 'yan', '灩' => 'yan', '炎' => 'yan', '烟' => 'yan', '焉' => 'yan', '焔' => 'yan', '焰' => 'yan', '焱' => 'yan', '煙' => 'yan', '熖' => 'yan', '燄' => 'yan', '燕' => 'yan', '爓' => 'yan', '牪' => 'yan', '狿' => 'yan', '猒' => 'yan', '珚' => 'yan', '琂' => 'yan', '琰' => 'yan', '甗' => 'yan', '盐' => 'yan', '眼' => 'yan', '研' => 'yan', '砚' => 'yan', '硏' => 'yan', '硯' => 'yan', '硽' => 'yan', '碞' => 'yan', '礹' => 'yan', '筵' => 'yan', '篶' => 'yan', '簷' => 'yan', '綖' => 'yan', '縯' => 'yan', '罨' => 'yan', '胭' => 'yan', '腌' => 'yan', '臙' => 'yan', '艳' => 'yan', '艶' => 'yan', '艷' => 'yan', '芫' => 'yan', '莚' => 'yan', '菸' => 'yan', '萒' => 'yan', '葕' => 'yan', '蔅' => 'yan', '虤' => 'yan', '蜒' => 'yan', '蝘' => 'yan', '衍' => 'yan', '裺' => 'yan', '褗' => 'yan', '覎' => 'yan', '觃' => 'yan', '觾' => 'yan', '言' => 'yan', '訁' => 'yan', '訮' => 'yan', '詽' => 'yan', '諺' => 'yan', '讌' => 'yan', '讞' => 'yan', '讠' => 'yan', '谚' => 'yan', '谳' => 'yan', '豓' => 'yan', '豔' => 'yan', '贋' => 'yan', '贗' => 'yan', '贘' => 'yan', '赝' => 'yan', '躽' => 'yan', '軅' => 'yan', '遃' => 'yan', '郔' => 'yan', '郾' => 'yan', '鄢' => 'yan', '酀' => 'yan', '酓' => 'yan', '酽' => 'yan', '醃' => 'yan', '醶' => 'yan', '醼' => 'yan', '釅' => 'yan', '閆' => 'yan', '閹' => 'yan', '閻' => 'yan', '闫' => 'yan', '阉' => 'yan', '阎' => 'yan', '隁' => 'yan', '隒' => 'yan', '雁' => 'yan', '顏' => 'yan', '顔' => 'yan', '顩' => 'yan', '颜' => 'yan', '餍' => 'yan', '饜' => 'yan', '騐' => 'yan', '験' => 'yan', '騴' => 'yan', '驗' => 'yan', '驠' => 'yan', '验' => 'yan', '鬳' => 'yan', '魇' => 'yan', '魘' => 'yan', '鰋' => 'yan', '鳫' => 'yan', '鴈' => 'yan', '鴳' => 'yan', '鶠' => 'yan', '鷃' => 'yan', '鷰' => 'yan', '鹽' => 'yan', '麙' => 'yan', '麣' => 'yan', '黡' => 'yan', '黤' => 'yan', '黫' => 'yan', '黬' => 'yan', '黭' => 'yan', '黶' => 'yan', '鼴' => 'yan', '鼹' => 'yan', '齞' => 'yan', '齴' => 'yan', '龑' => 'yan', '㓧' => 'yan', '㕣' => 'yan', '㗴' => 'yan', '㘖' => 'yan', '㘙' => 'yan', '㚧' => 'yan', '㛪' => 'yan', '㢂' => 'yan', '㢛' => 'yan', '㦔' => 'yan', '㫃' => 'yan', '㫟' => 'yan', '㬫' => 'yan', '㭺' => 'yan', '㳂' => 'yan', '㶄' => 'yan', '㷔' => 'yan', '㷳' => 'yan', '㷼' => 'yan', '㿕' => 'yan', '㿼' => 'yan', '䀋' => 'yan', '䀽' => 'yan', '䁙' => 'yan', '䂩' => 'yan', '䂴' => 'yan', '䄋' => 'yan', '䅧' => 'yan', '䊙' => 'yan', '䊻' => 'yan', '䌪' => 'yan', '䎦' => 'yan', '䑍' => 'yan', '䓂' => 'yan', '䕾' => 'yan', '䖗' => 'yan', '䗡' => 'yan', '䗺' => 'yan', '䜩' => 'yan', '䢥' => 'yan', '䢭' => 'yan', '䣍' => 'yan', '䤷' => 'yan', '䨄' => 'yan', '䭘' => 'yan', '䱲' => 'yan', '䲓' => 'yan', '䳛' => 'yan', '䳺' => 'yan', '䴏' => 'yan', '䶮' => 'yan',
+ '丧' => 'sang', '喪' => 'sang', '嗓' => 'sang', '搡' => 'sang', '桑' => 'sang', '桒' => 'sang', '槡' => 'sang', '磉' => 'sang', '褬' => 'sang', '鎟' => 'sang', '顙' => 'sang', '颡' => 'sang', '䡦' => 'sang', '䫙' => 'sang',
+ '丨' => 'gun', '惃' => 'gun', '棍' => 'gun', '棞' => 'gun', '滚' => 'gun', '滾' => 'gun', '璭' => 'gun', '睔' => 'gun', '睴' => 'gun', '磙' => 'gun', '緄' => 'gun', '緷' => 'gun', '绲' => 'gun', '蓘' => 'gun', '蔉' => 'gun', '衮' => 'gun', '袞' => 'gun', '裷' => 'gun', '謴' => 'gun', '輥' => 'gun', '辊' => 'gun', '鮌' => 'gun', '鯀' => 'gun', '鲧' => 'gun', '㙥' => 'gun', '㫎' => 'gun', '㯻' => 'gun', '䃂' => 'gun', '䎾' => 'gun', '䜇' => 'gun', '䵪' => 'gun',
+ '丩' => 'jiu', '久' => 'jiu', '乆' => 'jiu', '九' => 'jiu', '乣' => 'jiu', '倃' => 'jiu', '僦' => 'jiu', '勼' => 'jiu', '匓' => 'jiu', '匛' => 'jiu', '匶' => 'jiu', '厩' => 'jiu', '咎' => 'jiu', '啾' => 'jiu', '奺' => 'jiu', '就' => 'jiu', '廄' => 'jiu', '廏' => 'jiu', '廐' => 'jiu', '慦' => 'jiu', '揂' => 'jiu', '揪' => 'jiu', '揫' => 'jiu', '摎' => 'jiu', '救' => 'jiu', '旧' => 'jiu', '朻' => 'jiu', '杦' => 'jiu', '柩' => 'jiu', '柾' => 'jiu', '桕' => 'jiu', '樛' => 'jiu', '欍' => 'jiu', '殧' => 'jiu', '汣' => 'jiu', '灸' => 'jiu', '牞' => 'jiu', '玖' => 'jiu', '畂' => 'jiu', '疚' => 'jiu', '究' => 'jiu', '糺' => 'jiu', '糾' => 'jiu', '紤' => 'jiu', '纠' => 'jiu', '臼' => 'jiu', '舅' => 'jiu', '舊' => 'jiu', '舏' => 'jiu', '萛' => 'jiu', '赳' => 'jiu', '酒' => 'jiu', '镹' => 'jiu', '阄' => 'jiu', '韭' => 'jiu', '韮' => 'jiu', '鬏' => 'jiu', '鬮' => 'jiu', '鯦' => 'jiu', '鳩' => 'jiu', '鷲' => 'jiu', '鸠' => 'jiu', '鹫' => 'jiu', '麔' => 'jiu', '齨' => 'jiu', '㠇' => 'jiu', '㡱' => 'jiu', '㧕' => 'jiu', '㩆' => 'jiu', '㲃' => 'jiu', '㶭' => 'jiu', '㺩' => 'jiu', '㺵' => 'jiu', '䅢' => 'jiu', '䆒' => 'jiu', '䊆' => 'jiu', '䊘' => 'jiu', '䓘' => 'jiu', '䛮' => 'jiu', '䡂' => 'jiu', '䳎' => 'jiu', '䳔' => 'jiu',
+ '个' => 'ge', '佮' => 'ge', '個' => 'ge', '割' => 'ge', '匌' => 'ge', '各' => 'ge', '呄' => 'ge', '哥' => 'ge', '哿' => 'ge', '嗝' => 'ge', '圪' => 'ge', '塥' => 'ge', '彁' => 'ge', '愅' => 'ge', '戈' => 'ge', '戓' => 'ge', '戨' => 'ge', '挌' => 'ge', '搁' => 'ge', '搿' => 'ge', '擱' => 'ge', '敋' => 'ge', '格' => 'ge', '槅' => 'ge', '櫊' => 'ge', '歌' => 'ge', '滆' => 'ge', '滒' => 'ge', '牫' => 'ge', '牱' => 'ge', '犵' => 'ge', '獦' => 'ge', '疙' => 'ge', '硌' => 'ge', '箇' => 'ge', '紇' => 'ge', '纥' => 'ge', '肐' => 'ge', '胳' => 'ge', '膈' => 'ge', '臵' => 'ge', '舸' => 'ge', '茖' => 'ge', '葛' => 'ge', '虼' => 'ge', '蛒' => 'ge', '蛤' => 'ge', '袼' => 'ge', '裓' => 'ge', '觡' => 'ge', '諽' => 'ge', '謌' => 'ge', '輵' => 'ge', '轕' => 'ge', '鉻' => 'ge', '鎘' => 'ge', '鎶' => 'ge', '铬' => 'ge', '镉' => 'ge', '閣' => 'ge', '閤' => 'ge', '阁' => 'ge', '隔' => 'ge', '革' => 'ge', '鞈' => 'ge', '鞷' => 'ge', '韐' => 'ge', '韚' => 'ge', '騔' => 'ge', '骼' => 'ge', '鬲' => 'ge', '鮯' => 'ge', '鰪' => 'ge', '鴐' => 'ge', '鴚' => 'ge', '鴿' => 'ge', '鸽' => 'ge', '㗆' => 'ge', '㝓' => 'ge', '㠷' => 'ge', '㦴' => 'ge', '㨰' => 'ge', '㪾' => 'ge', '㵧' => 'ge', '㷴' => 'ge', '䆟' => 'ge', '䈓' => 'ge', '䐙' => 'ge', '䕻' => 'ge', '䗘' => 'ge', '䘁' => 'ge', '䛋' => 'ge', '䛿' => 'ge', '䢔' => 'ge', '䧄' => 'ge', '䨣' => 'ge', '䩐' => 'ge', '䪂' => 'ge', '䪺' => 'ge', '䫦' => 'ge',
+ '丫' => 'ya', '亚' => 'ya', '亜' => 'ya', '亞' => 'ya', '伢' => 'ya', '俹' => 'ya', '劜' => 'ya', '厊' => 'ya', '压' => 'ya', '厓' => 'ya', '呀' => 'ya', '哑' => 'ya', '唖' => 'ya', '啞' => 'ya', '圔' => 'ya', '圠' => 'ya', '垭' => 'ya', '埡' => 'ya', '堐' => 'ya', '壓' => 'ya', '娅' => 'ya', '婭' => 'ya', '孲' => 'ya', '岈' => 'ya', '崕' => 'ya', '崖' => 'ya', '庌' => 'ya', '庘' => 'ya', '押' => 'ya', '挜' => 'ya', '掗' => 'ya', '揠' => 'ya', '枒' => 'ya', '桠' => 'ya', '椏' => 'ya', '氩' => 'ya', '氬' => 'ya', '涯' => 'ya', '漄' => 'ya', '牙' => 'ya', '犽' => 'ya', '猚' => 'ya', '猰' => 'ya', '玡' => 'ya', '琊' => 'ya', '瑘' => 'ya', '疋' => 'ya', '痖' => 'ya', '瘂' => 'ya', '睚' => 'ya', '砑' => 'ya', '稏' => 'ya', '穵' => 'ya', '窫' => 'ya', '笌' => 'ya', '聐' => 'ya', '芽' => 'ya', '蕥' => 'ya', '蚜' => 'ya', '衙' => 'ya', '襾' => 'ya', '訝' => 'ya', '讶' => 'ya', '迓' => 'ya', '錏' => 'ya', '鐚' => 'ya', '铔' => 'ya', '雅' => 'ya', '鴉' => 'ya', '鴨' => 'ya', '鵶' => 'ya', '鸦' => 'ya', '鸭' => 'ya', '齖' => 'ya', '齾' => 'ya', '㝞' => 'ya', '㧎' => 'ya', '㰳' => 'ya', '㿿' => 'ya', '䄰' => 'ya', '䅉' => 'ya', '䊦' => 'ya', '䝟' => 'ya', '䢝' => 'ya', '䦪' => 'ya', '䪵' => 'ya', '䯉' => 'ya', '䰲' => 'ya', '䵝' => 'ya',
+ '丬' => 'zhuang', '壮' => 'zhuang', '壯' => 'zhuang', '壵' => 'zhuang', '妆' => 'zhuang', '妝' => 'zhuang', '娤' => 'zhuang', '庄' => 'zhuang', '庒' => 'zhuang', '戅' => 'zhuang', '撞' => 'zhuang', '桩' => 'zhuang', '梉' => 'zhuang', '樁' => 'zhuang', '湷' => 'zhuang', '焋' => 'zhuang', '状' => 'zhuang', '狀' => 'zhuang', '粧' => 'zhuang', '糚' => 'zhuang', '荘' => 'zhuang', '莊' => 'zhuang', '装' => 'zhuang', '裝' => 'zhuang',
+ '中' => 'zhong', '仲' => 'zhong', '伀' => 'zhong', '众' => 'zhong', '偅' => 'zhong', '冢' => 'zhong', '刣' => 'zhong', '喠' => 'zhong', '堹' => 'zhong', '塚' => 'zhong', '妐' => 'zhong', '妕' => 'zhong', '媑' => 'zhong', '尰' => 'zhong', '幒' => 'zhong', '彸' => 'zhong', '忠' => 'zhong', '柊' => 'zhong', '歱' => 'zhong', '汷' => 'zhong', '泈' => 'zhong', '炂' => 'zhong', '煄' => 'zhong', '狆' => 'zhong', '瘇' => 'zhong', '盅' => 'zhong', '眾' => 'zhong', '祌' => 'zhong', '祍' => 'zhong', '种' => 'zhong', '種' => 'zhong', '筗' => 'zhong', '籦' => 'zhong', '終' => 'zhong', '终' => 'zhong', '肿' => 'zhong', '腫' => 'zhong', '舯' => 'zhong', '茽' => 'zhong', '蔠' => 'zhong', '蚛' => 'zhong', '螤' => 'zhong', '螽' => 'zhong', '衆' => 'zhong', '衳' => 'zhong', '衶' => 'zhong', '衷' => 'zhong', '諥' => 'zhong', '踵' => 'zhong', '蹱' => 'zhong', '迚' => 'zhong', '重' => 'zhong', '鈡' => 'zhong', '鍾' => 'zhong', '鐘' => 'zhong', '钟' => 'zhong', '锺' => 'zhong', '鴤' => 'zhong', '鼨' => 'zhong', '㐺' => 'zhong', '㣫' => 'zhong', '㲴' => 'zhong', '䱰' => 'zhong',
+ '丯' => 'jie', '介' => 'jie', '借' => 'jie', '倢' => 'jie', '偼' => 'jie', '傑' => 'jie', '刦' => 'jie', '刧' => 'jie', '刼' => 'jie', '劫' => 'jie', '劼' => 'jie', '卩' => 'jie', '卪' => 'jie', '吤' => 'jie', '喈' => 'jie', '嗟' => 'jie', '堦' => 'jie', '堺' => 'jie', '姐' => 'jie', '婕' => 'jie', '媎' => 'jie', '媘' => 'jie', '媫' => 'jie', '嫅' => 'jie', '孑' => 'jie', '尐' => 'jie', '屆' => 'jie', '届' => 'jie', '岊' => 'jie', '岕' => 'jie', '崨' => 'jie', '嵥' => 'jie', '嶻' => 'jie', '巀' => 'jie', '幯' => 'jie', '庎' => 'jie', '徣' => 'jie', '忦' => 'jie', '悈' => 'jie', '戒' => 'jie', '截' => 'jie', '拮' => 'jie', '捷' => 'jie', '接' => 'jie', '掲' => 'jie', '揭' => 'jie', '擑' => 'jie', '擮' => 'jie', '擳' => 'jie', '斺' => 'jie', '昅' => 'jie', '杰' => 'jie', '桀' => 'jie', '桔' => 'jie', '桝' => 'jie', '椄' => 'jie', '楐' => 'jie', '楬' => 'jie', '楶' => 'jie', '榤' => 'jie', '檞' => 'jie', '櫭' => 'jie', '毑' => 'jie', '洁' => 'jie', '湝' => 'jie', '滐' => 'jie', '潔' => 'jie', '煯' => 'jie', '犗' => 'jie', '玠' => 'jie', '琾' => 'jie', '界' => 'jie', '畍' => 'jie', '疌' => 'jie', '疖' => 'jie', '疥' => 'jie', '痎' => 'jie', '癤' => 'jie', '皆' => 'jie', '睫' => 'jie', '砎' => 'jie', '碣' => 'jie', '礍' => 'jie', '秸' => 'jie', '稭' => 'jie', '竭' => 'jie', '節' => 'jie', '結' => 'jie', '繲' => 'jie', '结' => 'jie', '羯' => 'jie', '脻' => 'jie', '节' => 'jie', '芥' => 'jie', '莭' => 'jie', '菨' => 'jie', '蓵' => 'jie', '藉' => 'jie', '蚧' => 'jie', '蛣' => 'jie', '蛶' => 'jie', '蜐' => 'jie', '蝔' => 'jie', '蠘' => 'jie', '蠞' => 'jie', '蠽' => 'jie', '街' => 'jie', '衱' => 'jie', '衸' => 'jie', '袺' => 'jie', '褯' => 'jie', '解' => 'jie', '觧' => 'jie', '訐' => 'jie', '詰' => 'jie', '誡' => 'jie', '誱' => 'jie', '讦' => 'jie', '诘' => 'jie', '诫' => 'jie', '踕' => 'jie', '迼' => 'jie', '鉣' => 'jie', '鍻' => 'jie', '阶' => 'jie', '階' => 'jie', '鞂' => 'jie', '頡' => 'jie', '颉' => 'jie', '飷' => 'jie', '骱' => 'jie', '魝' => 'jie', '魪' => 'jie', '鮚' => 'jie', '鲒' => 'jie', '鶛' => 'jie', '㑘' => 'jie', '㓗' => 'jie', '㓤' => 'jie', '㔾' => 'jie', '㘶' => 'jie', '㛃' => 'jie', '㝌' => 'jie', '㝏' => 'jie', '㞯' => 'jie', '㠹' => 'jie', '㦢' => 'jie', '㨗' => 'jie', '㨩' => 'jie', '㮞' => 'jie', '㮮' => 'jie', '㸅' => 'jie', '㾏' => 'jie', '㿍' => 'jie', '䀷' => 'jie', '䀹' => 'jie', '䁓' => 'jie', '䂒' => 'jie', '䂝' => 'jie', '䂶' => 'jie', '䅥' => 'jie', '䇒' => 'jie', '䌖' => 'jie', '䔿' => 'jie', '䕙' => 'jie', '䗻' => 'jie', '䛺' => 'jie', '䣠' => 'jie', '䥛' => 'jie', '䯰' => 'jie', '䰺' => 'jie', '䱄' => 'jie', '䲙' => 'jie', '䲸' => 'jie',
+ '丰' => 'feng', '仹' => 'feng', '俸' => 'feng', '偑' => 'feng', '僼' => 'feng', '冯' => 'feng', '凤' => 'feng', '凨' => 'feng', '凬' => 'feng', '凮' => 'feng', '唪' => 'feng', '堸' => 'feng', '夆' => 'feng', '奉' => 'feng', '妦' => 'feng', '寷' => 'feng', '封' => 'feng', '峯' => 'feng', '峰' => 'feng', '崶' => 'feng', '捀' => 'feng', '摓' => 'feng', '枫' => 'feng', '桻' => 'feng', '楓' => 'feng', '檒' => 'feng', '沣' => 'feng', '沨' => 'feng', '浲' => 'feng', '渢' => 'feng', '湗' => 'feng', '溄' => 'feng', '灃' => 'feng', '烽' => 'feng', '焨' => 'feng', '煈' => 'feng', '犎' => 'feng', '猦' => 'feng', '琒' => 'feng', '瓰' => 'feng', '甮' => 'feng', '疯' => 'feng', '瘋' => 'feng', '盽' => 'feng', '砜' => 'feng', '碸' => 'feng', '篈' => 'feng', '綘' => 'feng', '縫' => 'feng', '缝' => 'feng', '艂' => 'feng', '葑' => 'feng', '蘕' => 'feng', '蘴' => 'feng', '蜂' => 'feng', '覂' => 'feng', '諷' => 'feng', '讽' => 'feng', '豐' => 'feng', '賵' => 'feng', '赗' => 'feng', '逢' => 'feng', '鄷' => 'feng', '酆' => 'feng', '鋒' => 'feng', '鎽' => 'feng', '鏠' => 'feng', '锋' => 'feng', '靊' => 'feng', '風' => 'feng', '飌' => 'feng', '风' => 'feng', '馮' => 'feng', '鳯' => 'feng', '鳳' => 'feng', '鴌' => 'feng', '麷' => 'feng', '㡝' => 'feng', '㦀' => 'feng', '㵯' => 'feng', '䏎' => 'feng', '䙜' => 'feng', '䟪' => 'feng', '䩼' => 'feng',
+ '丱' => 'guan', '倌' => 'guan', '关' => 'guan', '冠' => 'guan', '卝' => 'guan', '官' => 'guan', '悹' => 'guan', '悺' => 'guan', '惯' => 'guan', '慣' => 'guan', '掼' => 'guan', '摜' => 'guan', '棺' => 'guan', '樌' => 'guan', '毌' => 'guan', '泴' => 'guan', '涫' => 'guan', '潅' => 'guan', '灌' => 'guan', '爟' => 'guan', '琯' => 'guan', '瓘' => 'guan', '痯' => 'guan', '瘝' => 'guan', '癏' => 'guan', '盥' => 'guan', '矔' => 'guan', '礶' => 'guan', '祼' => 'guan', '窤' => 'guan', '筦' => 'guan', '管' => 'guan', '罆' => 'guan', '罐' => 'guan', '舘' => 'guan', '萖' => 'guan', '蒄' => 'guan', '覌' => 'guan', '観' => 'guan', '觀' => 'guan', '观' => 'guan', '貫' => 'guan', '贯' => 'guan', '躀' => 'guan', '輨' => 'guan', '遦' => 'guan', '錧' => 'guan', '鏆' => 'guan', '鑵' => 'guan', '関' => 'guan', '闗' => 'guan', '關' => 'guan', '雚' => 'guan', '館' => 'guan', '馆' => 'guan', '鰥' => 'guan', '鱞' => 'guan', '鱹' => 'guan', '鳏' => 'guan', '鳤' => 'guan', '鸛' => 'guan', '鹳' => 'guan', '㮡' => 'guan', '㴦' => 'guan', '䌯' => 'guan', '䎚' => 'guan', '䏓' => 'guan', '䗆' => 'guan', '䗰' => 'guan', '䘾' => 'guan', '䙛' => 'guan', '䙮' => 'guan', '䝺' => 'guan', '䦎' => 'guan', '䩪' => 'guan', '䪀' => 'guan', '䲘' => 'guan',
+ '串' => 'chuan', '传' => 'chuan', '傳' => 'chuan', '僢' => 'chuan', '剶' => 'chuan', '喘' => 'chuan', '圌' => 'chuan', '巛' => 'chuan', '川' => 'chuan', '暷' => 'chuan', '椽' => 'chuan', '歂' => 'chuan', '氚' => 'chuan', '汌' => 'chuan', '猭' => 'chuan', '玔' => 'chuan', '瑏' => 'chuan', '穿' => 'chuan', '篅' => 'chuan', '舛' => 'chuan', '舡' => 'chuan', '舩' => 'chuan', '船' => 'chuan', '荈' => 'chuan', '賗' => 'chuan', '輲' => 'chuan', '遄' => 'chuan', '釧' => 'chuan', '钏' => 'chuan', '镩' => 'chuan', '鶨' => 'chuan', '㯌' => 'chuan', '㱛' => 'chuan', '㼷' => 'chuan', '䁣' => 'chuan',
+ '丳' => 'chan', '产' => 'chan', '僝' => 'chan', '儃' => 'chan', '儳' => 'chan', '冁' => 'chan', '刬' => 'chan', '剗' => 'chan', '剷' => 'chan', '劖' => 'chan', '嚵' => 'chan', '囅' => 'chan', '壥' => 'chan', '婵' => 'chan', '嬋' => 'chan', '孱' => 'chan', '嵼' => 'chan', '巉' => 'chan', '幝' => 'chan', '幨' => 'chan', '廛' => 'chan', '忏' => 'chan', '懴' => 'chan', '懺' => 'chan', '掺' => 'chan', '搀' => 'chan', '摌' => 'chan', '摲' => 'chan', '摻' => 'chan', '攙' => 'chan', '旵' => 'chan', '梴' => 'chan', '棎' => 'chan', '欃' => 'chan', '毚' => 'chan', '浐' => 'chan', '湹' => 'chan', '滻' => 'chan', '潹' => 'chan', '潺' => 'chan', '瀍' => 'chan', '瀺' => 'chan', '灛' => 'chan', '煘' => 'chan', '燀' => 'chan', '獑' => 'chan', '產' => 'chan', '産' => 'chan', '硟' => 'chan', '磛' => 'chan', '禅' => 'chan', '禪' => 'chan', '簅' => 'chan', '緾' => 'chan', '繟' => 'chan', '繵' => 'chan', '纏' => 'chan', '纒' => 'chan', '缠' => 'chan', '羼' => 'chan', '艬' => 'chan', '蒇' => 'chan', '蕆' => 'chan', '蝉' => 'chan', '蝊' => 'chan', '蟬' => 'chan', '蟾' => 'chan', '裧' => 'chan', '襜' => 'chan', '覘' => 'chan', '觇' => 'chan', '誗' => 'chan', '諂' => 'chan', '譂' => 'chan', '讇' => 'chan', '讒' => 'chan', '谄' => 'chan', '谗' => 'chan', '躔' => 'chan', '辿' => 'chan', '鄽' => 'chan', '酁' => 'chan', '醦' => 'chan', '鋋' => 'chan', '鋓' => 'chan', '鏟' => 'chan', '鑱' => 'chan', '铲' => 'chan', '镡' => 'chan', '镵' => 'chan', '閳' => 'chan', '闡' => 'chan', '阐' => 'chan', '韂' => 'chan', '顫' => 'chan', '颤' => 'chan', '饞' => 'chan', '馋' => 'chan', '㔆' => 'chan', '㙴' => 'chan', '㙻' => 'chan', '㢆' => 'chan', '㢟' => 'chan', '㦃' => 'chan', '㬄' => 'chan', '㯆' => 'chan', '㵌' => 'chan', '㶣' => 'chan', '㸥' => 'chan', '㹌' => 'chan', '㹽' => 'chan', '㺥' => 'chan', '䀡' => 'chan', '䂁' => 'chan', '䊲' => 'chan', '䐮' => 'chan', '䑎' => 'chan', '䜛' => 'chan', '䠨' => 'chan', '䡪' => 'chan', '䡲' => 'chan', '䣑' => 'chan', '䤘' => 'chan', '䤫' => 'chan', '䥀' => 'chan', '䧯' => 'chan', '䩶' => 'chan', '䪜' => 'chan', '䮭' => 'chan', '䱿' => 'chan', '䴼' => 'chan', '䵐' => 'chan',
+ '临' => 'lin', '亃' => 'lin', '僯' => 'lin', '凛' => 'lin', '凜' => 'lin', '厸' => 'lin', '吝' => 'lin', '啉' => 'lin', '壣' => 'lin', '崊' => 'lin', '嶙' => 'lin', '廩' => 'lin', '廪' => 'lin', '恡' => 'lin', '悋' => 'lin', '惏' => 'lin', '懍' => 'lin', '懔' => 'lin', '拎' => 'lin', '撛' => 'lin', '斴' => 'lin', '晽' => 'lin', '暽' => 'lin', '林' => 'lin', '橉' => 'lin', '檁' => 'lin', '檩' => 'lin', '淋' => 'lin', '潾' => 'lin', '澟' => 'lin', '瀶' => 'lin', '焛' => 'lin', '燐' => 'lin', '獜' => 'lin', '琳' => 'lin', '璘' => 'lin', '甐' => 'lin', '疄' => 'lin', '痳' => 'lin', '癛' => 'lin', '癝' => 'lin', '瞵' => 'lin', '碄' => 'lin', '磷' => 'lin', '稟' => 'lin', '箖' => 'lin', '粦' => 'lin', '粼' => 'lin', '繗' => 'lin', '翷' => 'lin', '膦' => 'lin', '臨' => 'lin', '菻' => 'lin', '蔺' => 'lin', '藺' => 'lin', '賃' => 'lin', '赁' => 'lin', '蹸' => 'lin', '躏' => 'lin', '躙' => 'lin', '躪' => 'lin', '轔' => 'lin', '轥' => 'lin', '辚' => 'lin', '遴' => 'lin', '邻' => 'lin', '鄰' => 'lin', '鏻' => 'lin', '閵' => 'lin', '隣' => 'lin', '霖' => 'lin', '顲' => 'lin', '驎' => 'lin', '鱗' => 'lin', '鳞' => 'lin', '麐' => 'lin', '麟' => 'lin', '㐭' => 'lin', '㔂' => 'lin', '㖁' => 'lin', '㝝' => 'lin', '㨆' => 'lin', '㷠' => 'lin', '䉮' => 'lin', '䕲' => 'lin', '䗲' => 'lin', '䚬' => 'lin', '䢯' => 'lin', '䫐' => 'lin', '䫰' => 'lin', '䮼' => 'lin',
+ '丵' => 'zhuo', '倬' => 'zhuo', '劅' => 'zhuo', '卓' => 'zhuo', '叕' => 'zhuo', '啄' => 'zhuo', '啅' => 'zhuo', '圴' => 'zhuo', '妰' => 'zhuo', '娺' => 'zhuo', '彴' => 'zhuo', '拙' => 'zhuo', '捉' => 'zhuo', '撯' => 'zhuo', '擆' => 'zhuo', '擢' => 'zhuo', '斀' => 'zhuo', '斫' => 'zhuo', '斮' => 'zhuo', '斱' => 'zhuo', '斲' => 'zhuo', '斵' => 'zhuo', '晫' => 'zhuo', '桌' => 'zhuo', '梲' => 'zhuo', '棁' => 'zhuo', '棳' => 'zhuo', '椓' => 'zhuo', '槕' => 'zhuo', '櫡' => 'zhuo', '浊' => 'zhuo', '浞' => 'zhuo', '涿' => 'zhuo', '濁' => 'zhuo', '濯' => 'zhuo', '灂' => 'zhuo', '灼' => 'zhuo', '炪' => 'zhuo', '烵' => 'zhuo', '犳' => 'zhuo', '琢' => 'zhuo', '琸' => 'zhuo', '着' => 'zhuo', '硺' => 'zhuo', '禚' => 'zhuo', '穛' => 'zhuo', '穱' => 'zhuo', '窡' => 'zhuo', '窧' => 'zhuo', '篧' => 'zhuo', '籗' => 'zhuo', '籱' => 'zhuo', '罬' => 'zhuo', '茁' => 'zhuo', '蠗' => 'zhuo', '蠿' => 'zhuo', '諁' => 'zhuo', '諑' => 'zhuo', '謶' => 'zhuo', '诼' => 'zhuo', '酌' => 'zhuo', '鋜' => 'zhuo', '鐯' => 'zhuo', '鐲' => 'zhuo', '镯' => 'zhuo', '鵫' => 'zhuo', '鷟' => 'zhuo', '㑁' => 'zhuo', '㣿' => 'zhuo', '㪬' => 'zhuo', '㭬' => 'zhuo', '㺟' => 'zhuo', '䅵' => 'zhuo', '䕴' => 'zhuo', '䶂' => 'zhuo',
+ '丶' => 'zhu', '主' => 'zhu', '伫' => 'zhu', '佇' => 'zhu', '住' => 'zhu', '侏' => 'zhu', '劚' => 'zhu', '助' => 'zhu', '劯' => 'zhu', '嘱' => 'zhu', '囑' => 'zhu', '坾' => 'zhu', '墸' => 'zhu', '壴' => 'zhu', '孎' => 'zhu', '宔' => 'zhu', '屬' => 'zhu', '嵀' => 'zhu', '拄' => 'zhu', '斸' => 'zhu', '曯' => 'zhu', '朱' => 'zhu', '杼' => 'zhu', '柱' => 'zhu', '柷' => 'zhu', '株' => 'zhu', '槠' => 'zhu', '樦' => 'zhu', '橥' => 'zhu', '櫧' => 'zhu', '櫫' => 'zhu', '欘' => 'zhu', '殶' => 'zhu', '泏' => 'zhu', '注' => 'zhu', '洙' => 'zhu', '渚' => 'zhu', '潴' => 'zhu', '濐' => 'zhu', '瀦' => 'zhu', '灟' => 'zhu', '炢' => 'zhu', '炷' => 'zhu', '烛' => 'zhu', '煑' => 'zhu', '煮' => 'zhu', '燭' => 'zhu', '爥' => 'zhu', '猪' => 'zhu', '珠' => 'zhu', '疰' => 'zhu', '瘃' => 'zhu', '眝' => 'zhu', '瞩' => 'zhu', '矚' => 'zhu', '砫' => 'zhu', '硃' => 'zhu', '祝' => 'zhu', '祩' => 'zhu', '秼' => 'zhu', '窋' => 'zhu', '竚' => 'zhu', '竹' => 'zhu', '竺' => 'zhu', '笁' => 'zhu', '笜' => 'zhu', '筑' => 'zhu', '筯' => 'zhu', '箸' => 'zhu', '築' => 'zhu', '篫' => 'zhu', '紵' => 'zhu', '紸' => 'zhu', '絑' => 'zhu', '纻' => 'zhu', '罜' => 'zhu', '羜' => 'zhu', '翥' => 'zhu', '舳' => 'zhu', '芧' => 'zhu', '苎' => 'zhu', '苧' => 'zhu', '茱' => 'zhu', '茿' => 'zhu', '莇' => 'zhu', '著' => 'zhu', '蓫' => 'zhu', '藸' => 'zhu', '蛀' => 'zhu', '蛛' => 'zhu', '蝫' => 'zhu', '蠋' => 'zhu', '蠩' => 'zhu', '蠾' => 'zhu', '袾' => 'zhu', '註' => 'zhu', '詝' => 'zhu', '誅' => 'zhu', '諸' => 'zhu', '诛' => 'zhu', '诸' => 'zhu', '豬' => 'zhu', '貯' => 'zhu', '贮' => 'zhu', '跓' => 'zhu', '跦' => 'zhu', '躅' => 'zhu', '軴' => 'zhu', '迬' => 'zhu', '逐' => 'zhu', '邾' => 'zhu', '鉒' => 'zhu', '銖' => 'zhu', '鋳' => 'zhu', '鑄' => 'zhu', '钃' => 'zhu', '铢' => 'zhu', '铸' => 'zhu', '陼' => 'zhu', '霔' => 'zhu', '飳' => 'zhu', '馵' => 'zhu', '駐' => 'zhu', '駯' => 'zhu', '驻' => 'zhu', '鮢' => 'zhu', '鯺' => 'zhu', '鱁' => 'zhu', '鴸' => 'zhu', '麆' => 'zhu', '麈' => 'zhu', '鼄' => 'zhu', '㑏' => 'zhu', '㔉' => 'zhu', '㝉' => 'zhu', '㤖' => 'zhu', '㧣' => 'zhu', '㫂' => 'zhu', '㵭' => 'zhu', '㹥' => 'zhu', '㺛' => 'zhu', '㾻' => 'zhu', '㿾' => 'zhu', '䇡' => 'zhu', '䇧' => 'zhu', '䌵' => 'zhu', '䍆' => 'zhu', '䎷' => 'zhu', '䐢' => 'zhu', '䕽' => 'zhu', '䘚' => 'zhu', '䘢' => 'zhu', '䝒' => 'zhu', '䝬' => 'zhu', '䟉' => 'zhu', '䥮' => 'zhu', '䬡' => 'zhu', '䭖' => 'zhu', '䮱' => 'zhu', '䰞' => 'zhu',
+ '丷' => 'ha', '哈' => 'ha', '妎' => 'ha', '鉿' => 'ha', '铪' => 'ha',
+ '丹' => 'dan', '亶' => 'dan', '伔' => 'dan', '但' => 'dan', '僤' => 'dan', '儋' => 'dan', '刐' => 'dan', '勯' => 'dan', '匰' => 'dan', '单' => 'dan', '単' => 'dan', '啖' => 'dan', '啗' => 'dan', '啿' => 'dan', '單' => 'dan', '嘾' => 'dan', '噉' => 'dan', '嚪' => 'dan', '妉' => 'dan', '媅' => 'dan', '帎' => 'dan', '弹' => 'dan', '彈' => 'dan', '惮' => 'dan', '憚' => 'dan', '憺' => 'dan', '担' => 'dan', '掸' => 'dan', '撣' => 'dan', '擔' => 'dan', '旦' => 'dan', '柦' => 'dan', '殚' => 'dan', '殫' => 'dan', '氮' => 'dan', '沊' => 'dan', '泹' => 'dan', '淡' => 'dan', '澸' => 'dan', '澹' => 'dan', '狚' => 'dan', '玬' => 'dan', '瓭' => 'dan', '甔' => 'dan', '疍' => 'dan', '疸' => 'dan', '瘅' => 'dan', '癉' => 'dan', '癚' => 'dan', '眈' => 'dan', '砃' => 'dan', '禫' => 'dan', '窞' => 'dan', '箪' => 'dan', '簞' => 'dan', '紞' => 'dan', '耼' => 'dan', '耽' => 'dan', '聃' => 'dan', '聸' => 'dan', '胆' => 'dan', '腅' => 'dan', '膽' => 'dan', '萏' => 'dan', '蛋' => 'dan', '蜑' => 'dan', '衴' => 'dan', '褝' => 'dan', '襌' => 'dan', '觛' => 'dan', '訑' => 'dan', '誕' => 'dan', '诞' => 'dan', '贉' => 'dan', '躭' => 'dan', '郸' => 'dan', '鄲' => 'dan', '酖' => 'dan', '霮' => 'dan', '頕' => 'dan', '餤' => 'dan', '饏' => 'dan', '馾' => 'dan', '駳' => 'dan', '髧' => 'dan', '鴠' => 'dan', '黕' => 'dan', '㔊' => 'dan', '㕪' => 'dan', '㗖' => 'dan', '㡺' => 'dan', '㫜' => 'dan', '㱽' => 'dan', '㲷' => 'dan', '㵅' => 'dan', '㺗' => 'dan', '㽎' => 'dan', '䃫' => 'dan', '䄷' => 'dan', '䉞' => 'dan', '䉷' => 'dan', '䨢' => 'dan', '䨵' => 'dan', '䩥' => 'dan', '䭛' => 'dan', '䮰' => 'dan', '䱋' => 'dan', '䳉' => 'dan',
+ '为' => 'wei', '亹' => 'wei', '伟' => 'wei', '伪' => 'wei', '位' => 'wei', '偉' => 'wei', '偎' => 'wei', '偽' => 'wei', '僞' => 'wei', '儰' => 'wei', '卫' => 'wei', '危' => 'wei', '厃' => 'wei', '叞' => 'wei', '味' => 'wei', '唯' => 'wei', '喂' => 'wei', '喡' => 'wei', '喴' => 'wei', '囗' => 'wei', '围' => 'wei', '圍' => 'wei', '圩' => 'wei', '墛' => 'wei', '壝' => 'wei', '委' => 'wei', '威' => 'wei', '娓' => 'wei', '媁' => 'wei', '媙' => 'wei', '媦' => 'wei', '寪' => 'wei', '尉' => 'wei', '尾' => 'wei', '峗' => 'wei', '峞' => 'wei', '崣' => 'wei', '嵔' => 'wei', '嵬' => 'wei', '嶶' => 'wei', '巍' => 'wei', '帏' => 'wei', '帷' => 'wei', '幃' => 'wei', '廆' => 'wei', '徫' => 'wei', '微' => 'wei', '惟' => 'wei', '愄' => 'wei', '愇' => 'wei', '慰' => 'wei', '懀' => 'wei', '捤' => 'wei', '揋' => 'wei', '揻' => 'wei', '斖' => 'wei', '昷' => 'wei', '暐' => 'wei', '未' => 'wei', '桅' => 'wei', '梶' => 'wei', '椲' => 'wei', '椳' => 'wei', '楲' => 'wei', '沩' => 'wei', '洈' => 'wei', '洧' => 'wei', '浘' => 'wei', '涠' => 'wei', '渨' => 'wei', '渭' => 'wei', '湋' => 'wei', '溈' => 'wei', '溦' => 'wei', '潍' => 'wei', '潙' => 'wei', '潿' => 'wei', '濊' => 'wei', '濰' => 'wei', '濻' => 'wei', '瀢' => 'wei', '炜' => 'wei', '為' => 'wei', '烓' => 'wei', '煀' => 'wei', '煒' => 'wei', '煟' => 'wei', '煨' => 'wei', '熭' => 'wei', '燰' => 'wei', '爲' => 'wei', '犚' => 'wei', '犩' => 'wei', '猥' => 'wei', '猬' => 'wei', '玮' => 'wei', '琟' => 'wei', '瑋' => 'wei', '璏' => 'wei', '畏' => 'wei', '痏' => 'wei', '痿' => 'wei', '癐' => 'wei', '癓' => 'wei', '硊' => 'wei', '硙' => 'wei', '碨' => 'wei', '磑' => 'wei', '維' => 'wei', '緭' => 'wei', '緯' => 'wei', '縅' => 'wei', '纬' => 'wei', '维' => 'wei', '罻' => 'wei', '胃' => 'wei', '腲' => 'wei', '艉' => 'wei', '芛' => 'wei', '苇' => 'wei', '苿' => 'wei', '荱' => 'wei', '菋' => 'wei', '萎' => 'wei', '葦' => 'wei', '葨' => 'wei', '葳' => 'wei', '蒍' => 'wei', '蓶' => 'wei', '蔚' => 'wei', '蔿' => 'wei', '薇' => 'wei', '薳' => 'wei', '藯' => 'wei', '蘶' => 'wei', '蜲' => 'wei', '蜼' => 'wei', '蝛' => 'wei', '蝟' => 'wei', '螱' => 'wei', '衛' => 'wei', '衞' => 'wei', '褽' => 'wei', '覣' => 'wei', '覹' => 'wei', '詴' => 'wei', '諉' => 'wei', '謂' => 'wei', '讆' => 'wei', '讏' => 'wei', '诿' => 'wei', '谓' => 'wei', '踓' => 'wei', '躗' => 'wei', '躛' => 'wei', '軎' => 'wei', '轊' => 'wei', '违' => 'wei', '逶' => 'wei', '違' => 'wei', '鄬' => 'wei', '醀' => 'wei', '錗' => 'wei', '鍏' => 'wei', '鍡' => 'wei', '鏏' => 'wei', '闈' => 'wei', '闱' => 'wei', '隇' => 'wei', '隈' => 'wei', '隗' => 'wei', '霨' => 'wei', '霺' => 'wei', '霻' => 'wei', '韋' => 'wei', '韑' => 'wei', '韙' => 'wei', '韡' => 'wei', '韦' => 'wei', '韪' => 'wei', '頠' => 'wei', '颹' => 'wei', '餧' => 'wei', '餵' => 'wei', '饖' => 'wei', '骩' => 'wei', '骪' => 'wei', '骫' => 'wei', '魏' => 'wei', '鮇' => 'wei', '鮠' => 'wei', '鮪' => 'wei', '鰃' => 'wei', '鰄' => 'wei', '鲔' => 'wei', '鳂' => 'wei', '鳚' => 'wei', '㕒' => 'wei', '㖐' => 'wei', '㞇' => 'wei', '㞑' => 'wei', '㟪' => 'wei', '㠕' => 'wei', '㢻' => 'wei', '㣲' => 'wei', '㥜' => 'wei', '㦣' => 'wei', '㧑' => 'wei', '㨊' => 'wei', '㬙' => 'wei', '㭏' => 'wei', '㱬' => 'wei', '㷉' => 'wei', '䃬' => 'wei', '䈧' => 'wei', '䉠' => 'wei', '䑊' => 'wei', '䔺' => 'wei', '䗽' => 'wei', '䘙' => 'wei', '䙿' => 'wei', '䜅' => 'wei', '䜜' => 'wei', '䝐' => 'wei', '䞔' => 'wei', '䡺' => 'wei', '䥩' => 'wei', '䧦' => 'wei', '䪋' => 'wei', '䪘' => 'wei', '䬐' => 'wei', '䬑' => 'wei', '䬿' => 'wei', '䭳' => 'wei', '䮹' => 'wei', '䲁' => 'wei', '䵋' => 'wei', '䵳' => 'wei',
+ '丼' => 'jing', '井' => 'jing', '京' => 'jing', '亰' => 'jing', '俓' => 'jing', '倞' => 'jing', '傹' => 'jing', '儆' => 'jing', '兢' => 'jing', '净' => 'jing', '凈' => 'jing', '刭' => 'jing', '剄' => 'jing', '坓' => 'jing', '坕' => 'jing', '坙' => 'jing', '境' => 'jing', '妌' => 'jing', '婙' => 'jing', '婛' => 'jing', '婧' => 'jing', '宑' => 'jing', '巠' => 'jing', '幜' => 'jing', '弪' => 'jing', '弳' => 'jing', '径' => 'jing', '徑' => 'jing', '惊' => 'jing', '憬' => 'jing', '憼' => 'jing', '敬' => 'jing', '旌' => 'jing', '旍' => 'jing', '景' => 'jing', '晶' => 'jing', '暻' => 'jing', '曔' => 'jing', '桱' => 'jing', '梷' => 'jing', '橸' => 'jing', '汫' => 'jing', '汬' => 'jing', '泾' => 'jing', '浄' => 'jing', '涇' => 'jing', '淨' => 'jing', '瀞' => 'jing', '燝' => 'jing', '燞' => 'jing', '猄' => 'jing', '獍' => 'jing', '璄' => 'jing', '璟' => 'jing', '璥' => 'jing', '痉' => 'jing', '痙' => 'jing', '睛' => 'jing', '秔' => 'jing', '稉' => 'jing', '穽' => 'jing', '竞' => 'jing', '竟' => 'jing', '竧' => 'jing', '竫' => 'jing', '競' => 'jing', '竸' => 'jing', '粳' => 'jing', '精' => 'jing', '経' => 'jing', '經' => 'jing', '经' => 'jing', '聙' => 'jing', '肼' => 'jing', '胫' => 'jing', '脛' => 'jing', '腈' => 'jing', '茎' => 'jing', '荆' => 'jing', '荊' => 'jing', '莖' => 'jing', '菁' => 'jing', '蟼' => 'jing', '誩' => 'jing', '警' => 'jing', '踁' => 'jing', '迳' => 'jing', '逕' => 'jing', '鏡' => 'jing', '镜' => 'jing', '阱' => 'jing', '靓' => 'jing', '靖' => 'jing', '静' => 'jing', '靚' => 'jing', '靜' => 'jing', '頚' => 'jing', '頸' => 'jing', '颈' => 'jing', '驚' => 'jing', '鯨' => 'jing', '鲸' => 'jing', '鵛' => 'jing', '鶁' => 'jing', '鶄' => 'jing', '麖' => 'jing', '麠' => 'jing', '鼱' => 'jing', '㕋' => 'jing', '㘫' => 'jing', '㢣' => 'jing', '㣏' => 'jing', '㬌' => 'jing', '㵾' => 'jing', '㹵' => 'jing', '䔔' => 'jing', '䜘' => 'jing', '䡖' => 'jing', '䴖' => 'jing', '䵞' => 'jing',
+ '丽' => 'li', '例' => 'li', '俐' => 'li', '俚' => 'li', '俪' => 'li', '傈' => 'li', '儮' => 'li', '儷' => 'li', '凓' => 'li', '刕' => 'li', '利' => 'li', '剓' => 'li', '剺' => 'li', '劙' => 'li', '力' => 'li', '励' => 'li', '勵' => 'li', '历' => 'li', '厉' => 'li', '厘' => 'li', '厤' => 'li', '厯' => 'li', '厲' => 'li', '吏' => 'li', '呖' => 'li', '哩' => 'li', '唎' => 'li', '唳' => 'li', '喱' => 'li', '嚟' => 'li', '嚦' => 'li', '囄' => 'li', '囇' => 'li', '坜' => 'li', '塛' => 'li', '壢' => 'li', '娌' => 'li', '娳' => 'li', '婯' => 'li', '嫠' => 'li', '孋' => 'li', '孷' => 'li', '屴' => 'li', '岦' => 'li', '峛' => 'li', '峲' => 'li', '巁' => 'li', '廲' => 'li', '悡' => 'li', '悧' => 'li', '悷' => 'li', '慄' => 'li', '戾' => 'li', '搮' => 'li', '攊' => 'li', '攦' => 'li', '攭' => 'li', '斄' => 'li', '暦' => 'li', '曆' => 'li', '曞' => 'li', '朸' => 'li', '李' => 'li', '枥' => 'li', '栃' => 'li', '栎' => 'li', '栗' => 'li', '栛' => 'li', '栵' => 'li', '梨' => 'li', '梸' => 'li', '棃' => 'li', '棙' => 'li', '樆' => 'li', '檪' => 'li', '櫔' => 'li', '櫟' => 'li', '櫪' => 'li', '欐' => 'li', '欚' => 'li', '歴' => 'li', '歷' => 'li', '氂' => 'li', '沥' => 'li', '沴' => 'li', '浬' => 'li', '涖' => 'li', '溧' => 'li', '漓' => 'li', '澧' => 'li', '濿' => 'li', '瀝' => 'li', '灕' => 'li', '爄' => 'li', '爏' => 'li', '犁' => 'li', '犂' => 'li', '犛' => 'li', '犡' => 'li', '狸' => 'li', '猁' => 'li', '珕' => 'li', '理' => 'li', '琍' => 'li', '瑮' => 'li', '璃' => 'li', '瓅' => 'li', '瓈' => 'li', '瓑' => 'li', '瓥' => 'li', '疠' => 'li', '疬' => 'li', '痢' => 'li', '癘' => 'li', '癧' => 'li', '皪' => 'li', '盠' => 'li', '盭' => 'li', '睝' => 'li', '砅' => 'li', '砺' => 'li', '砾' => 'li', '磿' => 'li', '礪' => 'li', '礫' => 'li', '礰' => 'li', '礼' => 'li', '禮' => 'li', '禲' => 'li', '离' => 'li', '秝' => 'li', '穲' => 'li', '立' => 'li', '竰' => 'li', '笠' => 'li', '筣' => 'li', '篥' => 'li', '篱' => 'li', '籬' => 'li', '粒' => 'li', '粝' => 'li', '粴' => 'li', '糎' => 'li', '糲' => 'li', '綟' => 'li', '縭' => 'li', '缡' => 'li', '罹' => 'li', '艃' => 'li', '苈' => 'li', '苙' => 'li', '茘' => 'li', '荔' => 'li', '荲' => 'li', '莅' => 'li', '莉' => 'li', '菞' => 'li', '蒚' => 'li', '蒞' => 'li', '蓠' => 'li', '蔾' => 'li', '藜' => 'li', '藶' => 'li', '蘺' => 'li', '蚸' => 'li', '蛎' => 'li', '蛠' => 'li', '蜊' => 'li', '蜧' => 'li', '蟍' => 'li', '蟸' => 'li', '蠇' => 'li', '蠡' => 'li', '蠣' => 'li', '蠫' => 'li', '裏' => 'li', '裡' => 'li', '褵' => 'li', '詈' => 'li', '謧' => 'li', '讈' => 'li', '豊' => 'li', '貍' => 'li', '赲' => 'li', '跞' => 'li', '躒' => 'li', '轢' => 'li', '轣' => 'li', '轹' => 'li', '逦' => 'li', '邌' => 'li', '邐' => 'li', '郦' => 'li', '酈' => 'li', '醨' => 'li', '醴' => 'li', '里' => 'li', '釐' => 'li', '鉝' => 'li', '鋫' => 'li', '鋰' => 'li', '錅' => 'li', '鏫' => 'li', '鑗' => 'li', '锂' => 'li', '隶' => 'li', '隷' => 'li', '隸' => 'li', '離' => 'li', '雳' => 'li', '靂' => 'li', '靋' => 'li', '驪' => 'li', '骊' => 'li', '鬁' => 'li', '鯉' => 'li', '鯏' => 'li', '鯬' => 'li', '鱧' => 'li', '鱱' => 'li', '鱺' => 'li', '鲡' => 'li', '鲤' => 'li', '鳢' => 'li', '鳨' => 'li', '鴗' => 'li', '鵹' => 'li', '鷅' => 'li', '鸝' => 'li', '鹂' => 'li', '麗' => 'li', '麜' => 'li', '黎' => 'li', '黧' => 'li', '㑦' => 'li', '㒧' => 'li', '㒿' => 'li', '㓯' => 'li', '㔏' => 'li', '㕸' => 'li', '㗚' => 'li', '㘑' => 'li', '㟳' => 'li', '㠟' => 'li', '㡂' => 'li', '㤡' => 'li', '㤦' => 'li', '㦒' => 'li', '㧰' => 'li', '㬏' => 'li', '㮚' => 'li', '㯤' => 'li', '㰀' => 'li', '㰚' => 'li', '㱹' => 'li', '㴝' => 'li', '㷰' => 'li', '㸚' => 'li', '㹈' => 'li', '㺡' => 'li', '㻎' => 'li', '㻺' => 'li', '㼖' => 'li', '㽁' => 'li', '㽝' => 'li', '㾐' => 'li', '㾖' => 'li', '㿛' => 'li', '㿨' => 'li', '䁻' => 'li', '䃯' => 'li', '䄜' => 'li', '䅄' => 'li', '䅻' => 'li', '䇐' => 'li', '䉫' => 'li', '䊍' => 'li', '䊪' => 'li', '䋥' => 'li', '䍠' => 'li', '䍦' => 'li', '䍽' => 'li', '䓞' => 'li', '䔁' => 'li', '䔆' => 'li', '䔉' => 'li', '䔣' => 'li', '䔧' => 'li', '䖥' => 'li', '䖽' => 'li', '䖿' => 'li', '䗍' => 'li', '䘈' => 'li', '䙰' => 'li', '䚕' => 'li', '䟏' => 'li', '䟐' => 'li', '䡃' => 'li', '䣓' => 'li', '䣫' => 'li', '䤙' => 'li', '䤚' => 'li', '䥶' => 'li', '䧉' => 'li', '䬅' => 'li', '䬆' => 'li', '䮋' => 'li', '䮥' => 'li', '䰛' => 'li', '䰜' => 'li', '䱘' => 'li', '䲞' => 'li', '䴄' => 'li', '䴡' => 'li', '䴻' => 'li', '䵓' => 'li', '䵩' => 'li', '䶘' => 'li',
+ '举' => 'ju', '侷' => 'ju', '俱' => 'ju', '倨' => 'ju', '倶' => 'ju', '僪' => 'ju', '具' => 'ju', '冣' => 'ju', '凥' => 'ju', '剧' => 'ju', '劇' => 'ju', '勮' => 'ju', '匊' => 'ju', '句' => 'ju', '咀' => 'ju', '圧' => 'ju', '埧' => 'ju', '埾' => 'ju', '壉' => 'ju', '姖' => 'ju', '娵' => 'ju', '婅' => 'ju', '婮' => 'ju', '寠' => 'ju', '局' => 'ju', '居' => 'ju', '屦' => 'ju', '屨' => 'ju', '岠' => 'ju', '崌' => 'ju', '巈' => 'ju', '巨' => 'ju', '弆' => 'ju', '怇' => 'ju', '怚' => 'ju', '惧' => 'ju', '愳' => 'ju', '懅' => 'ju', '懼' => 'ju', '抅' => 'ju', '拒' => 'ju', '拘' => 'ju', '拠' => 'ju', '挙' => 'ju', '挶' => 'ju', '捄' => 'ju', '据' => 'ju', '掬' => 'ju', '據' => 'ju', '擧' => 'ju', '昛' => 'ju', '梮' => 'ju', '椇' => 'ju', '椈' => 'ju', '椐' => 'ju', '榉' => 'ju', '榘' => 'ju', '橘' => 'ju', '檋' => 'ju', '櫸' => 'ju', '欅' => 'ju', '歫' => 'ju', '毩' => 'ju', '毱' => 'ju', '沮' => 'ju', '泃' => 'ju', '泦' => 'ju', '洰' => 'ju', '涺' => 'ju', '淗' => 'ju', '湨' => 'ju', '澽' => 'ju', '炬' => 'ju', '焗' => 'ju', '焣' => 'ju', '爠' => 'ju', '犋' => 'ju', '犑' => 'ju', '狊' => 'ju', '狙' => 'ju', '琚' => 'ju', '疽' => 'ju', '痀' => 'ju', '眗' => 'ju', '瞿' => 'ju', '矩' => 'ju', '砠' => 'ju', '秬' => 'ju', '窭' => 'ju', '窶' => 'ju', '筥' => 'ju', '簴' => 'ju', '粔' => 'ju', '粷' => 'ju', '罝' => 'ju', '耟' => 'ju', '聚' => 'ju', '聥' => 'ju', '腒' => 'ju', '舉' => 'ju', '艍' => 'ju', '苣' => 'ju', '苴' => 'ju', '莒' => 'ju', '菊' => 'ju', '蒟' => 'ju', '蓻' => 'ju', '蘜' => 'ju', '虡' => 'ju', '蚷' => 'ju', '蜛' => 'ju', '袓' => 'ju', '裾' => 'ju', '襷' => 'ju', '詎' => 'ju', '諊' => 'ju', '讵' => 'ju', '豦' => 'ju', '貗' => 'ju', '趄' => 'ju', '趜' => 'ju', '跔' => 'ju', '跙' => 'ju', '距' => 'ju', '跼' => 'ju', '踘' => 'ju', '踞' => 'ju', '踽' => 'ju', '蹫' => 'ju', '躆' => 'ju', '躹' => 'ju', '輂' => 'ju', '遽' => 'ju', '邭' => 'ju', '郹' => 'ju', '醵' => 'ju', '鉅' => 'ju', '鋦' => 'ju', '鋸' => 'ju', '鐻' => 'ju', '钜' => 'ju', '锔' => 'ju', '锯' => 'ju', '閰' => 'ju', '陱' => 'ju', '雎' => 'ju', '鞠' => 'ju', '鞫' => 'ju', '颶' => 'ju', '飓' => 'ju', '駏' => 'ju', '駒' => 'ju', '駶' => 'ju', '驧' => 'ju', '驹' => 'ju', '鮈' => 'ju', '鮔' => 'ju', '鴡' => 'ju', '鵙' => 'ju', '鵴' => 'ju', '鶋' => 'ju', '鶪' => 'ju', '鼰' => 'ju', '鼳' => 'ju', '齟' => 'ju', '龃' => 'ju', '㘌' => 'ju', '㘲' => 'ju', '㜘' => 'ju', '㞐' => 'ju', '㞫' => 'ju', '㠪' => 'ju', '㥌' => 'ju', '㨿' => 'ju', '㩀' => 'ju', '㩴' => 'ju', '㬬' => 'ju', '㮂' => 'ju', '㳥' => 'ju', '㽤' => 'ju', '䃊' => 'ju', '䄔' => 'ju', '䅓' => 'ju', '䆽' => 'ju', '䈮' => 'ju', '䋰' => 'ju', '䏱' => 'ju', '䕮' => 'ju', '䗇' => 'ju', '䛯' => 'ju', '䜯' => 'ju', '䡞' => 'ju', '䢹' => 'ju', '䣰' => 'ju', '䤎' => 'ju', '䪕' => 'ju', '䰬' => 'ju', '䱟' => 'ju', '䱡' => 'ju', '䴗' => 'ju', '䵕' => 'ju', '䶙' => 'ju', '䶥' => 'ju',
+ '丿' => 'pie', '嫳' => 'pie', '撆' => 'pie', '撇' => 'pie', '暼' => 'pie', '氕' => 'pie', '瞥' => 'pie', '苤' => 'pie', '鐅' => 'pie', '䥕' => 'pie',
+ '乀' => 'fu', '付' => 'fu', '伏' => 'fu', '伕' => 'fu', '俌' => 'fu', '俘' => 'fu', '俯' => 'fu', '偩' => 'fu', '傅' => 'fu', '冨' => 'fu', '冹' => 'fu', '凫' => 'fu', '刜' => 'fu', '副' => 'fu', '匐' => 'fu', '呋' => 'fu', '呒' => 'fu', '咈' => 'fu', '咐' => 'fu', '哹' => 'fu', '坿' => 'fu', '垘' => 'fu', '复' => 'fu', '夫' => 'fu', '妇' => 'fu', '妋' => 'fu', '姇' => 'fu', '娐' => 'fu', '婏' => 'fu', '婦' => 'fu', '媍' => 'fu', '孚' => 'fu', '孵' => 'fu', '富' => 'fu', '尃' => 'fu', '岪' => 'fu', '峊' => 'fu', '巿' => 'fu', '帗' => 'fu', '幅' => 'fu', '幞' => 'fu', '府' => 'fu', '弗' => 'fu', '弣' => 'fu', '彿' => 'fu', '復' => 'fu', '怤' => 'fu', '怫' => 'fu', '懯' => 'fu', '扶' => 'fu', '抚' => 'fu', '拂' => 'fu', '拊' => 'fu', '捬' => 'fu', '撫' => 'fu', '敷' => 'fu', '斧' => 'fu', '旉' => 'fu', '服' => 'fu', '枎' => 'fu', '枹' => 'fu', '柎' => 'fu', '柫' => 'fu', '栿' => 'fu', '桴' => 'fu', '棴' => 'fu', '椨' => 'fu', '椱' => 'fu', '榑' => 'fu', '氟' => 'fu', '泭' => 'fu', '洑' => 'fu', '浮' => 'fu', '涪' => 'fu', '滏' => 'fu', '澓' => 'fu', '炥' => 'fu', '烰' => 'fu', '焤' => 'fu', '父' => 'fu', '猤' => 'fu', '玞' => 'fu', '玸' => 'fu', '琈' => 'fu', '甫' => 'fu', '甶' => 'fu', '畉' => 'fu', '畐' => 'fu', '畗' => 'fu', '癁' => 'fu', '盙' => 'fu', '砆' => 'fu', '砩' => 'fu', '祓' => 'fu', '祔' => 'fu', '福' => 'fu', '禣' => 'fu', '秿' => 'fu', '稃' => 'fu', '稪' => 'fu', '竎' => 'fu', '符' => 'fu', '笰' => 'fu', '筟' => 'fu', '箙' => 'fu', '簠' => 'fu', '粰' => 'fu', '糐' => 'fu', '紨' => 'fu', '紱' => 'fu', '紼' => 'fu', '絥' => 'fu', '綍' => 'fu', '綒' => 'fu', '緮' => 'fu', '縛' => 'fu', '绂' => 'fu', '绋' => 'fu', '缚' => 'fu', '罘' => 'fu', '罦' => 'fu', '翇' => 'fu', '肤' => 'fu', '胕' => 'fu', '脯' => 'fu', '腐' => 'fu', '腑' => 'fu', '腹' => 'fu', '膚' => 'fu', '艀' => 'fu', '艴' => 'fu', '芙' => 'fu', '芣' => 'fu', '芾' => 'fu', '苻' => 'fu', '茀' => 'fu', '茯' => 'fu', '荂' => 'fu', '荴' => 'fu', '莩' => 'fu', '菔' => 'fu', '萯' => 'fu', '葍' => 'fu', '蕧' => 'fu', '虙' => 'fu', '蚥' => 'fu', '蚨' => 'fu', '蚹' => 'fu', '蛗' => 'fu', '蜅' => 'fu', '蜉' => 'fu', '蝜' => 'fu', '蝠' => 'fu', '蝮' => 'fu', '衭' => 'fu', '袝' => 'fu', '袱' => 'fu', '複' => 'fu', '褔' => 'fu', '襆' => 'fu', '襥' => 'fu', '覄' => 'fu', '覆' => 'fu', '訃' => 'fu', '詂' => 'fu', '諨' => 'fu', '讣' => 'fu', '豧' => 'fu', '負' => 'fu', '賦' => 'fu', '賻' => 'fu', '负' => 'fu', '赋' => 'fu', '赙' => 'fu', '赴' => 'fu', '趺' => 'fu', '跗' => 'fu', '踾' => 'fu', '輔' => 'fu', '輹' => 'fu', '輻' => 'fu', '辅' => 'fu', '辐' => 'fu', '邞' => 'fu', '郙' => 'fu', '郛' => 'fu', '鄜' => 'fu', '酜' => 'fu', '釜' => 'fu', '釡' => 'fu', '鈇' => 'fu', '鉘' => 'fu', '鉜' => 'fu', '鍑' => 'fu', '鍢' => 'fu', '阜' => 'fu', '阝' => 'fu', '附' => 'fu', '陚' => 'fu', '韍' => 'fu', '韨' => 'fu', '颫' => 'fu', '馥' => 'fu', '駙' => 'fu', '驸' => 'fu', '髴' => 'fu', '鬴' => 'fu', '鮄' => 'fu', '鮒' => 'fu', '鮲' => 'fu', '鰒' => 'fu', '鲋' => 'fu', '鳆' => 'fu', '鳧' => 'fu', '鳬' => 'fu', '鳺' => 'fu', '鴔' => 'fu', '鵩' => 'fu', '鶝' => 'fu', '麩' => 'fu', '麬' => 'fu', '麱' => 'fu', '麸' => 'fu', '黻' => 'fu', '黼' => 'fu', '㓡' => 'fu', '㕮' => 'fu', '㙏' => 'fu', '㚆' => 'fu', '㚕' => 'fu', '㜑' => 'fu', '㟊' => 'fu', '㠅' => 'fu', '㤔' => 'fu', '㤱' => 'fu', '㪄' => 'fu', '㫙' => 'fu', '㬼' => 'fu', '㳇' => 'fu', '㵗' => 'fu', '㽬' => 'fu', '㾈' => 'fu', '䂤' => 'fu', '䃽' => 'fu', '䋨' => 'fu', '䋹' => 'fu', '䌗' => 'fu', '䌿' => 'fu', '䍖' => 'fu', '䎅' => 'fu', '䑧' => 'fu', '䒀' => 'fu', '䒇' => 'fu', '䓛' => 'fu', '䔰' => 'fu', '䕎' => 'fu', '䗄' => 'fu', '䘀' => 'fu', '䘄' => 'fu', '䘠' => 'fu', '䝾' => 'fu', '䞜' => 'fu', '䞞' => 'fu', '䞯' => 'fu', '䞸' => 'fu', '䟔' => 'fu', '䟮' => 'fu', '䠵' => 'fu', '䡍' => 'fu', '䦣' => 'fu', '䧞' => 'fu', '䨗' => 'fu', '䨱' => 'fu', '䩉' => 'fu', '䪙' => 'fu', '䫍' => 'fu', '䫝' => 'fu', '䭸' => 'fu', '䮛' => 'fu', '䯱' => 'fu', '䯽' => 'fu', '䵗' => 'fu', '䵾' => 'fu',
+ '乃' => 'nai', '倷' => 'nai', '奈' => 'nai', '奶' => 'nai', '妳' => 'nai', '嬭' => 'nai', '孻' => 'nai', '廼' => 'nai', '摨' => 'nai', '柰' => 'nai', '氖' => 'nai', '渿' => 'nai', '熋' => 'nai', '疓' => 'nai', '耐' => 'nai', '腉' => 'nai', '艿' => 'nai', '萘' => 'nai', '螚' => 'nai', '褦' => 'nai', '迺' => 'nai', '釢' => 'nai', '錼' => 'nai', '鼐' => 'nai', '㮈' => 'nai', '㮏' => 'nai', '㲡' => 'nai', '㾍' => 'nai', '䍲' => 'nai', '䘅' => 'nai', '䯮' => 'nai',
+ '乄' => 'wu', '乌' => 'wu', '五' => 'wu', '仵' => 'wu', '伆' => 'wu', '伍' => 'wu', '侮' => 'wu', '俉' => 'wu', '倵' => 'wu', '儛' => 'wu', '兀' => 'wu', '剭' => 'wu', '务' => 'wu', '務' => 'wu', '勿' => 'wu', '午' => 'wu', '吳' => 'wu', '吴' => 'wu', '吾' => 'wu', '呉' => 'wu', '呜' => 'wu', '唔' => 'wu', '啎' => 'wu', '嗚' => 'wu', '圬' => 'wu', '坞' => 'wu', '塢' => 'wu', '奦' => 'wu', '妩' => 'wu', '娪' => 'wu', '娬' => 'wu', '婺' => 'wu', '嫵' => 'wu', '寤' => 'wu', '屋' => 'wu', '屼' => 'wu', '岉' => 'wu', '嵍' => 'wu', '嵨' => 'wu', '巫' => 'wu', '庑' => 'wu', '廡' => 'wu', '弙' => 'wu', '忢' => 'wu', '忤' => 'wu', '怃' => 'wu', '悞' => 'wu', '悟' => 'wu', '悮' => 'wu', '憮' => 'wu', '戊' => 'wu', '扤' => 'wu', '捂' => 'wu', '摀' => 'wu', '敄' => 'wu', '无' => 'wu', '旿' => 'wu', '晤' => 'wu', '杇' => 'wu', '杌' => 'wu', '梧' => 'wu', '橆' => 'wu', '歍' => 'wu', '武' => 'wu', '毋' => 'wu', '汙' => 'wu', '汚' => 'wu', '污' => 'wu', '洖' => 'wu', '洿' => 'wu', '浯' => 'wu', '溩' => 'wu', '潕' => 'wu', '烏' => 'wu', '焐' => 'wu', '焑' => 'wu', '無' => 'wu', '熃' => 'wu', '熓' => 'wu', '物' => 'wu', '牾' => 'wu', '玝' => 'wu', '珷' => 'wu', '珸' => 'wu', '瑦' => 'wu', '璑' => 'wu', '甒' => 'wu', '痦' => 'wu', '矹' => 'wu', '碔' => 'wu', '祦' => 'wu', '禑' => 'wu', '窏' => 'wu', '窹' => 'wu', '箼' => 'wu', '粅' => 'wu', '舞' => 'wu', '芜' => 'wu', '芴' => 'wu', '茣' => 'wu', '莁' => 'wu', '蕪' => 'wu', '蘁' => 'wu', '蜈' => 'wu', '螐' => 'wu', '誈' => 'wu', '誣' => 'wu', '誤' => 'wu', '诬' => 'wu', '误' => 'wu', '趶' => 'wu', '躌' => 'wu', '迕' => 'wu', '逜' => 'wu', '邬' => 'wu', '郚' => 'wu', '鄔' => 'wu', '釫' => 'wu', '鋈' => 'wu', '錻' => 'wu', '鎢' => 'wu', '钨' => 'wu', '阢' => 'wu', '隖' => 'wu', '雾' => 'wu', '霚' => 'wu', '霧' => 'wu', '靰' => 'wu', '騖' => 'wu', '骛' => 'wu', '鯃' => 'wu', '鰞' => 'wu', '鴮' => 'wu', '鵐' => 'wu', '鵡' => 'wu', '鶩' => 'wu', '鷡' => 'wu', '鹀' => 'wu', '鹉' => 'wu', '鹜' => 'wu', '鼯' => 'wu', '鼿' => 'wu', '齀' => 'wu', '㐅' => 'wu', '㐳' => 'wu', '㑄' => 'wu', '㡔' => 'wu', '㬳' => 'wu', '㵲' => 'wu', '㷻' => 'wu', '㹳' => 'wu', '㻍' => 'wu', '㽾' => 'wu', '䃖' => 'wu', '䍢' => 'wu', '䎸' => 'wu', '䑁' => 'wu', '䒉' => 'wu', '䛩' => 'wu', '䟼' => 'wu', '䡧' => 'wu', '䦍' => 'wu', '䦜' => 'wu', '䫓' => 'wu', '䮏' => 'wu', '䳇' => 'wu', '䳱' => 'wu',
+ '乇' => 'tuo', '佗' => 'tuo', '侂' => 'tuo', '侻' => 'tuo', '咃' => 'tuo', '唾' => 'tuo', '坨' => 'tuo', '堶' => 'tuo', '妥' => 'tuo', '媠' => 'tuo', '嫷' => 'tuo', '岮' => 'tuo', '庹' => 'tuo', '彵' => 'tuo', '托' => 'tuo', '扡' => 'tuo', '拓' => 'tuo', '拕' => 'tuo', '拖' => 'tuo', '挩' => 'tuo', '捝' => 'tuo', '撱' => 'tuo', '杔' => 'tuo', '柁' => 'tuo', '柝' => 'tuo', '椭' => 'tuo', '楕' => 'tuo', '槖' => 'tuo', '橐' => 'tuo', '橢' => 'tuo', '毤' => 'tuo', '毻' => 'tuo', '汑' => 'tuo', '沰' => 'tuo', '沱' => 'tuo', '涶' => 'tuo', '狏' => 'tuo', '砣' => 'tuo', '砤' => 'tuo', '碢' => 'tuo', '箨' => 'tuo', '籜' => 'tuo', '紽' => 'tuo', '脫' => 'tuo', '脱' => 'tuo', '莌' => 'tuo', '萚' => 'tuo', '蘀' => 'tuo', '袉' => 'tuo', '袥' => 'tuo', '託' => 'tuo', '詑' => 'tuo', '讬' => 'tuo', '跅' => 'tuo', '跎' => 'tuo', '踻' => 'tuo', '迱' => 'tuo', '酡' => 'tuo', '陀' => 'tuo', '陁' => 'tuo', '飥' => 'tuo', '饦' => 'tuo', '馱' => 'tuo', '馲' => 'tuo', '駄' => 'tuo', '駝' => 'tuo', '駞' => 'tuo', '騨' => 'tuo', '驒' => 'tuo', '驝' => 'tuo', '驮' => 'tuo', '驼' => 'tuo', '魠' => 'tuo', '鮀' => 'tuo', '鰖' => 'tuo', '鴕' => 'tuo', '鵎' => 'tuo', '鸵' => 'tuo', '鼉' => 'tuo', '鼍' => 'tuo', '鼧' => 'tuo', '㟎' => 'tuo', '㸰' => 'tuo', '㸱' => 'tuo', '㼠' => 'tuo', '㾃' => 'tuo', '䍫' => 'tuo', '䓕' => 'tuo', '䡐' => 'tuo', '䪑' => 'tuo', '䭾' => 'tuo', '䰿' => 'tuo', '䲊' => 'tuo', '䴱' => 'tuo',
+ '么' => 'me', '嚒' => 'me', '嚰' => 'me', '庅' => 'me', '濹' => 'me', '癦' => 'me',
+ '乊' => 'ho', '乥' => 'ho',
+ '之' => 'zhi', '乿' => 'zhi', '侄' => 'zhi', '俧' => 'zhi', '倁' => 'zhi', '値' => 'zhi', '值' => 'zhi', '偫' => 'zhi', '傂' => 'zhi', '儨' => 'zhi', '凪' => 'zhi', '制' => 'zhi', '劕' => 'zhi', '劧' => 'zhi', '卮' => 'zhi', '厔' => 'zhi', '只' => 'zhi', '吱' => 'zhi', '咫' => 'zhi', '址' => 'zhi', '坁' => 'zhi', '坧' => 'zhi', '垁' => 'zhi', '埴' => 'zhi', '執' => 'zhi', '墆' => 'zhi', '墌' => 'zhi', '夂' => 'zhi', '姪' => 'zhi', '娡' => 'zhi', '嬂' => 'zhi', '寘' => 'zhi', '峙' => 'zhi', '崻' => 'zhi', '巵' => 'zhi', '帋' => 'zhi', '帙' => 'zhi', '帜' => 'zhi', '幟' => 'zhi', '庢' => 'zhi', '庤' => 'zhi', '廌' => 'zhi', '彘' => 'zhi', '徏' => 'zhi', '徔' => 'zhi', '徝' => 'zhi', '志' => 'zhi', '忮' => 'zhi', '恉' => 'zhi', '慹' => 'zhi', '憄' => 'zhi', '懥' => 'zhi', '懫' => 'zhi', '戠' => 'zhi', '执' => 'zhi', '扺' => 'zhi', '扻' => 'zhi', '抧' => 'zhi', '挃' => 'zhi', '指' => 'zhi', '挚' => 'zhi', '掷' => 'zhi', '搘' => 'zhi', '搱' => 'zhi', '摭' => 'zhi', '摯' => 'zhi', '擲' => 'zhi', '擿' => 'zhi', '支' => 'zhi', '旘' => 'zhi', '旨' => 'zhi', '晊' => 'zhi', '智' => 'zhi', '枝' => 'zhi', '枳' => 'zhi', '柣' => 'zhi', '栀' => 'zhi', '栉' => 'zhi', '桎' => 'zhi', '梔' => 'zhi', '梽' => 'zhi', '植' => 'zhi', '椥' => 'zhi', '榰' => 'zhi', '槜' => 'zhi', '樴' => 'zhi', '櫍' => 'zhi', '櫛' => 'zhi', '止' => 'zhi', '殖' => 'zhi', '汁' => 'zhi', '汥' => 'zhi', '汦' => 'zhi', '沚' => 'zhi', '治' => 'zhi', '洔' => 'zhi', '洷' => 'zhi', '淽' => 'zhi', '滍' => 'zhi', '滞' => 'zhi', '滯' => 'zhi', '漐' => 'zhi', '潌' => 'zhi', '潪' => 'zhi', '瀄' => 'zhi', '炙' => 'zhi', '熫' => 'zhi', '狾' => 'zhi', '猘' => 'zhi', '瓆' => 'zhi', '瓡' => 'zhi', '畤' => 'zhi', '疐' => 'zhi', '疷' => 'zhi', '疻' => 'zhi', '痔' => 'zhi', '痣' => 'zhi', '瘈' => 'zhi', '直' => 'zhi', '知' => 'zhi', '砋' => 'zhi', '礩' => 'zhi', '祉' => 'zhi', '祑' => 'zhi', '祗' => 'zhi', '祬' => 'zhi', '禃' => 'zhi', '禔' => 'zhi', '禵' => 'zhi', '秓' => 'zhi', '秖' => 'zhi', '秩' => 'zhi', '秪' => 'zhi', '秲' => 'zhi', '秷' => 'zhi', '稙' => 'zhi', '稚' => 'zhi', '稺' => 'zhi', '穉' => 'zhi', '窒' => 'zhi', '筫' => 'zhi', '紙' => 'zhi', '紩' => 'zhi', '絷' => 'zhi', '綕' => 'zhi', '緻' => 'zhi', '縶' => 'zhi', '織' => 'zhi', '纸' => 'zhi', '织' => 'zhi', '置' => 'zhi', '翐' => 'zhi', '聀' => 'zhi', '聁' => 'zhi', '职' => 'zhi', '職' => 'zhi', '肢' => 'zhi', '胑' => 'zhi', '胝' => 'zhi', '脂' => 'zhi', '膣' => 'zhi', '膱' => 'zhi', '至' => 'zhi', '致' => 'zhi', '臸' => 'zhi', '芖' => 'zhi', '芝' => 'zhi', '芷' => 'zhi', '茋' => 'zhi', '藢' => 'zhi', '蘵' => 'zhi', '蛭' => 'zhi', '蜘' => 'zhi', '螲' => 'zhi', '蟙' => 'zhi', '衹' => 'zhi', '衼' => 'zhi', '袟' => 'zhi', '袠' => 'zhi', '製' => 'zhi', '襧' => 'zhi', '覟' => 'zhi', '觗' => 'zhi', '觯' => 'zhi', '觶' => 'zhi', '訨' => 'zhi', '誌' => 'zhi', '謢' => 'zhi', '豑' => 'zhi', '豒' => 'zhi', '豸' => 'zhi', '貭' => 'zhi', '質' => 'zhi', '贄' => 'zhi', '质' => 'zhi', '贽' => 'zhi', '趾' => 'zhi', '跖' => 'zhi', '跱' => 'zhi', '踬' => 'zhi', '踯' => 'zhi', '蹠' => 'zhi', '蹢' => 'zhi', '躑' => 'zhi', '躓' => 'zhi', '軄' => 'zhi', '軹' => 'zhi', '輊' => 'zhi', '轵' => 'zhi', '轾' => 'zhi', '郅' => 'zhi', '酯' => 'zhi', '釞' => 'zhi', '銍' => 'zhi', '鋕' => 'zhi', '鑕' => 'zhi', '铚' => 'zhi', '锧' => 'zhi', '阤' => 'zhi', '阯' => 'zhi', '陟' => 'zhi', '隲' => 'zhi', '隻' => 'zhi', '雉' => 'zhi', '馶' => 'zhi', '馽' => 'zhi', '駤' => 'zhi', '騭' => 'zhi', '騺' => 'zhi', '驇' => 'zhi', '骘' => 'zhi', '鯯' => 'zhi', '鳷' => 'zhi', '鴙' => 'zhi', '鴲' => 'zhi', '鷙' => 'zhi', '鸷' => 'zhi', '黹' => 'zhi', '鼅' => 'zhi', '㕄' => 'zhi', '㗌' => 'zhi', '㗧' => 'zhi', '㘉' => 'zhi', '㙷' => 'zhi', '㛿' => 'zhi', '㜼' => 'zhi', '㝂' => 'zhi', '㣥' => 'zhi', '㧻' => 'zhi', '㨁' => 'zhi', '㨖' => 'zhi', '㮹' => 'zhi', '㲛' => 'zhi', '㴛' => 'zhi', '䄺' => 'zhi', '䅩' => 'zhi', '䆈' => 'zhi', '䇛' => 'zhi', '䇽' => 'zhi', '䉅' => 'zhi', '䉜' => 'zhi', '䌤' => 'zhi', '䎺' => 'zhi', '䏄' => 'zhi', '䏯' => 'zhi', '䐈' => 'zhi', '䐭' => 'zhi', '䑇' => 'zhi', '䓌' => 'zhi', '䕌' => 'zhi', '䚦' => 'zhi', '䛗' => 'zhi', '䝷' => 'zhi', '䞃' => 'zhi', '䟈' => 'zhi', '䡹' => 'zhi', '䥍' => 'zhi', '䦯' => 'zhi', '䫕' => 'zhi', '䬹' => 'zhi', '䭁' => 'zhi', '䱥' => 'zhi', '䱨' => 'zhi', '䳅' => 'zhi', '䵂' => 'zhi',
+ '乍' => 'zha', '偧' => 'zha', '劄' => 'zha', '厏' => 'zha', '吒' => 'zha', '咋' => 'zha', '咤' => 'zha', '哳' => 'zha', '喳' => 'zha', '奓' => 'zha', '宱' => 'zha', '扎' => 'zha', '抯' => 'zha', '挓' => 'zha', '揸' => 'zha', '搩' => 'zha', '搾' => 'zha', '摣' => 'zha', '札' => 'zha', '柤' => 'zha', '柵' => 'zha', '栅' => 'zha', '楂' => 'zha', '榨' => 'zha', '樝' => 'zha', '渣' => 'zha', '溠' => 'zha', '灹' => 'zha', '炸' => 'zha', '煠' => 'zha', '牐' => 'zha', '甴' => 'zha', '痄' => 'zha', '皶' => 'zha', '皻' => 'zha', '皼' => 'zha', '眨' => 'zha', '砟' => 'zha', '箚' => 'zha', '膪' => 'zha', '苲' => 'zha', '蚱' => 'zha', '蚻' => 'zha', '觰' => 'zha', '詐' => 'zha', '譇' => 'zha', '譗' => 'zha', '诈' => 'zha', '踷' => 'zha', '軋' => 'zha', '轧' => 'zha', '迊' => 'zha', '醡' => 'zha', '鍘' => 'zha', '铡' => 'zha', '閘' => 'zha', '闸' => 'zha', '霅' => 'zha', '鮓' => 'zha', '鮺' => 'zha', '鲊' => 'zha', '鲝' => 'zha', '齄' => 'zha', '齇' => 'zha', '㒀' => 'zha', '㡸' => 'zha', '㱜' => 'zha', '㴙' => 'zha', '㷢' => 'zha', '䋾' => 'zha', '䕢' => 'zha', '䖳' => 'zha', '䛽' => 'zha', '䞢' => 'zha', '䥷' => 'zha', '䵙' => 'zha', '䵵' => 'zha',
+ '乎' => 'hu', '乕' => 'hu', '互' => 'hu', '冱' => 'hu', '冴' => 'hu', '匢' => 'hu', '匫' => 'hu', '呼' => 'hu', '唬' => 'hu', '唿' => 'hu', '喖' => 'hu', '嘑' => 'hu', '嘝' => 'hu', '嚛' => 'hu', '囫' => 'hu', '垀' => 'hu', '壶' => 'hu', '壷' => 'hu', '壺' => 'hu', '婟' => 'hu', '媩' => 'hu', '嫭' => 'hu', '嫮' => 'hu', '寣' => 'hu', '岵' => 'hu', '帍' => 'hu', '幠' => 'hu', '弖' => 'hu', '弧' => 'hu', '忽' => 'hu', '怙' => 'hu', '恗' => 'hu', '惚' => 'hu', '戶' => 'hu', '户' => 'hu', '戸' => 'hu', '戽' => 'hu', '扈' => 'hu', '抇' => 'hu', '护' => 'hu', '搰' => 'hu', '摢' => 'hu', '斛' => 'hu', '昈' => 'hu', '昒' => 'hu', '曶' => 'hu', '枑' => 'hu', '楜' => 'hu', '槲' => 'hu', '槴' => 'hu', '歑' => 'hu', '汻' => 'hu', '沍' => 'hu', '沪' => 'hu', '泘' => 'hu', '浒' => 'hu', '淴' => 'hu', '湖' => 'hu', '滬' => 'hu', '滸' => 'hu', '滹' => 'hu', '瀫' => 'hu', '烀' => 'hu', '焀' => 'hu', '煳' => 'hu', '熩' => 'hu', '狐' => 'hu', '猢' => 'hu', '琥' => 'hu', '瑚' => 'hu', '瓠' => 'hu', '瓳' => 'hu', '祜' => 'hu', '笏' => 'hu', '箎' => 'hu', '箶' => 'hu', '簄' => 'hu', '粐' => 'hu', '糊' => 'hu', '絗' => 'hu', '綔' => 'hu', '縠' => 'hu', '胡' => 'hu', '膴' => 'hu', '芐' => 'hu', '苸' => 'hu', '萀' => 'hu', '葫' => 'hu', '蔛' => 'hu', '蔰' => 'hu', '虍' => 'hu', '虎' => 'hu', '虖' => 'hu', '虝' => 'hu', '蝴' => 'hu', '螜' => 'hu', '衚' => 'hu', '觳' => 'hu', '謼' => 'hu', '護' => 'hu', '軤' => 'hu', '轷' => 'hu', '鄠' => 'hu', '醐' => 'hu', '錿' => 'hu', '鍙' => 'hu', '鍸' => 'hu', '雐' => 'hu', '雽' => 'hu', '韄' => 'hu', '頀' => 'hu', '頶' => 'hu', '餬' => 'hu', '鬍' => 'hu', '魱' => 'hu', '鯱' => 'hu', '鰗' => 'hu', '鱯' => 'hu', '鳠' => 'hu', '鳸' => 'hu', '鶘' => 'hu', '鶦' => 'hu', '鶮' => 'hu', '鸌' => 'hu', '鹕' => 'hu', '鹱' => 'hu', '㕆' => 'hu', '㗅' => 'hu', '㦿' => 'hu', '㨭' => 'hu', '㪶' => 'hu', '㫚' => 'hu', '㯛' => 'hu', '㸦' => 'hu', '㹱' => 'hu', '㺉' => 'hu', '㾰' => 'hu', '㿥' => 'hu', '䁫' => 'hu', '䇘' => 'hu', '䈸' => 'hu', '䉉' => 'hu', '䉿' => 'hu', '䊀' => 'hu', '䍓' => 'hu', '䎁' => 'hu', '䔯' => 'hu', '䕶' => 'hu', '䗂' => 'hu', '䚛' => 'hu', '䛎' => 'hu', '䞱' => 'hu', '䠒' => 'hu', '䧼' => 'hu', '䨥' => 'hu', '䨼' => 'hu', '䩴' => 'hu', '䪝' => 'hu', '䭅' => 'hu', '䭌' => 'hu', '䭍' => 'hu', '䮸' => 'hu', '䲵' => 'hu',
+ '乏' => 'fa', '伐' => 'fa', '佱' => 'fa', '傠' => 'fa', '发' => 'fa', '垡' => 'fa', '姂' => 'fa', '彂' => 'fa', '栰' => 'fa', '橃' => 'fa', '沷' => 'fa', '法' => 'fa', '灋' => 'fa', '珐' => 'fa', '琺' => 'fa', '疺' => 'fa', '発' => 'fa', '發' => 'fa', '瞂' => 'fa', '砝' => 'fa', '筏' => 'fa', '罚' => 'fa', '罰' => 'fa', '罸' => 'fa', '茷' => 'fa', '藅' => 'fa', '醗' => 'fa', '鍅' => 'fa', '閥' => 'fa', '阀' => 'fa', '髪' => 'fa', '髮' => 'fa', '㕹' => 'fa', '㘺' => 'fa', '㛲' => 'fa', '䂲' => 'fa', '䇅' => 'fa', '䒥' => 'fa', '䣹' => 'fa',
+ '乐' => 'le', '仂' => 'le', '勒' => 'le', '叻' => 'le', '忇' => 'le', '扐' => 'le', '楽' => 'le', '樂' => 'le', '氻' => 'le', '泐' => 'le', '玏' => 'le', '砳' => 'le', '竻' => 'le', '簕' => 'le', '艻' => 'le', '阞' => 'le', '韷' => 'le', '餎' => 'le', '饹' => 'le', '鰳' => 'le', '鳓' => 'le', '㔹' => 'le', '㖀' => 'le', '㦡' => 'le',
+ '乑' => 'yin', '乚' => 'yin', '侌' => 'yin', '冘' => 'yin', '凐' => 'yin', '印' => 'yin', '吟' => 'yin', '吲' => 'yin', '唫' => 'yin', '喑' => 'yin', '噖' => 'yin', '噾' => 'yin', '嚚' => 'yin', '囙' => 'yin', '因' => 'yin', '圁' => 'yin', '垔' => 'yin', '垠' => 'yin', '垽' => 'yin', '堙' => 'yin', '夤' => 'yin', '姻' => 'yin', '婣' => 'yin', '婬' => 'yin', '寅' => 'yin', '尹' => 'yin', '峾' => 'yin', '崟' => 'yin', '崯' => 'yin', '嶾' => 'yin', '廕' => 'yin', '廴' => 'yin', '引' => 'yin', '愔' => 'yin', '慇' => 'yin', '慭' => 'yin', '憖' => 'yin', '憗' => 'yin', '懚' => 'yin', '斦' => 'yin', '朄' => 'yin', '栶' => 'yin', '檃' => 'yin', '檭' => 'yin', '檼' => 'yin', '櫽' => 'yin', '歅' => 'yin', '殥' => 'yin', '殷' => 'yin', '氤' => 'yin', '泿' => 'yin', '洇' => 'yin', '洕' => 'yin', '淫' => 'yin', '淾' => 'yin', '湚' => 'yin', '溵' => 'yin', '滛' => 'yin', '濥' => 'yin', '濦' => 'yin', '烎' => 'yin', '犾' => 'yin', '狺' => 'yin', '猌' => 'yin', '珢' => 'yin', '璌' => 'yin', '瘖' => 'yin', '瘾' => 'yin', '癊' => 'yin', '癮' => 'yin', '碒' => 'yin', '磤' => 'yin', '禋' => 'yin', '秵' => 'yin', '筃' => 'yin', '粌' => 'yin', '絪' => 'yin', '緸' => 'yin', '胤' => 'yin', '苂' => 'yin', '茚' => 'yin', '茵' => 'yin', '荫' => 'yin', '荶' => 'yin', '蒑' => 'yin', '蔩' => 'yin', '蔭' => 'yin', '蘟' => 'yin', '蚓' => 'yin', '螾' => 'yin', '蟫' => 'yin', '裀' => 'yin', '訔' => 'yin', '訚' => 'yin', '訡' => 'yin', '誾' => 'yin', '諲' => 'yin', '讔' => 'yin', '趛' => 'yin', '鄞' => 'yin', '酳' => 'yin', '釿' => 'yin', '鈏' => 'yin', '鈝' => 'yin', '銀' => 'yin', '銦' => 'yin', '铟' => 'yin', '银' => 'yin', '闉' => 'yin', '阥' => 'yin', '阴' => 'yin', '陰' => 'yin', '陻' => 'yin', '隂' => 'yin', '隐' => 'yin', '隠' => 'yin', '隱' => 'yin', '霒' => 'yin', '霠' => 'yin', '霪' => 'yin', '靷' => 'yin', '鞇' => 'yin', '音' => 'yin', '韾' => 'yin', '飮' => 'yin', '飲' => 'yin', '饮' => 'yin', '駰' => 'yin', '骃' => 'yin', '鮣' => 'yin', '鷣' => 'yin', '齗' => 'yin', '齦' => 'yin', '龂' => 'yin', '龈' => 'yin', '㐆' => 'yin', '㕂' => 'yin', '㖗' => 'yin', '㙬' => 'yin', '㝙' => 'yin', '㞤' => 'yin', '㡥' => 'yin', '㣧' => 'yin', '㥯' => 'yin', '㥼' => 'yin', '㦩' => 'yin', '㧈' => 'yin', '㪦' => 'yin', '㱃' => 'yin', '㴈' => 'yin', '㸒' => 'yin', '㹜' => 'yin', '㹞' => 'yin', '㼉' => 'yin', '㾙' => 'yin', '䇙' => 'yin', '䌥' => 'yin', '䒡' => 'yin', '䓄' => 'yin', '䕃' => 'yin', '䖜' => 'yin', '䚿' => 'yin', '䡛' => 'yin', '䤃' => 'yin', '䤺' => 'yin', '䨸' => 'yin', '䪩' => 'yin', '䲟' => 'yin',
+ '乒' => 'ping', '俜' => 'ping', '凭' => 'ping', '凴' => 'ping', '呯' => 'ping', '坪' => 'ping', '塀' => 'ping', '娦' => 'ping', '屏' => 'ping', '屛' => 'ping', '岼' => 'ping', '帡' => 'ping', '帲' => 'ping', '幈' => 'ping', '平' => 'ping', '慿' => 'ping', '憑' => 'ping', '枰' => 'ping', '檘' => 'ping', '洴' => 'ping', '涄' => 'ping', '淜' => 'ping', '焩' => 'ping', '玶' => 'ping', '瓶' => 'ping', '甁' => 'ping', '甹' => 'ping', '砯' => 'ping', '竮' => 'ping', '箳' => 'ping', '簈' => 'ping', '缾' => 'ping', '聠' => 'ping', '艵' => 'ping', '苹' => 'ping', '荓' => 'ping', '萍' => 'ping', '蓱' => 'ping', '蘋' => 'ping', '蚲' => 'ping', '蛢' => 'ping', '評' => 'ping', '评' => 'ping', '軿' => 'ping', '輧' => 'ping', '郱' => 'ping', '頩' => 'ping', '鮃' => 'ping', '鲆' => 'ping', '㺸' => 'ping', '㻂' => 'ping', '䍈' => 'ping', '䶄' => 'ping',
+ '乓' => 'pang', '厐' => 'pang', '嗙' => 'pang', '嫎' => 'pang', '庞' => 'pang', '旁' => 'pang', '汸' => 'pang', '沗' => 'pang', '滂' => 'pang', '炐' => 'pang', '篣' => 'pang', '耪' => 'pang', '肨' => 'pang', '胖' => 'pang', '胮' => 'pang', '膖' => 'pang', '舽' => 'pang', '螃' => 'pang', '蠭' => 'pang', '覫' => 'pang', '逄' => 'pang', '雱' => 'pang', '霶' => 'pang', '髈' => 'pang', '鰟' => 'pang', '鳑' => 'pang', '龎' => 'pang', '龐' => 'pang', '㜊' => 'pang', '㤶' => 'pang', '㥬' => 'pang', '㫄' => 'pang', '䅭' => 'pang', '䒍' => 'pang', '䨦' => 'pang', '䮾' => 'pang',
+ '乔' => 'qiao', '侨' => 'qiao', '俏' => 'qiao', '僑' => 'qiao', '僺' => 'qiao', '劁' => 'qiao', '喬' => 'qiao', '嘺' => 'qiao', '墝' => 'qiao', '墽' => 'qiao', '嫶' => 'qiao', '峭' => 'qiao', '嵪' => 'qiao', '巧' => 'qiao', '帩' => 'qiao', '幧' => 'qiao', '悄' => 'qiao', '愀' => 'qiao', '憔' => 'qiao', '撬' => 'qiao', '撽' => 'qiao', '敲' => 'qiao', '桥' => 'qiao', '槗' => 'qiao', '樵' => 'qiao', '橇' => 'qiao', '橋' => 'qiao', '殼' => 'qiao', '燆' => 'qiao', '犞' => 'qiao', '癄' => 'qiao', '睄' => 'qiao', '瞧' => 'qiao', '硗' => 'qiao', '硚' => 'qiao', '碻' => 'qiao', '磽' => 'qiao', '礄' => 'qiao', '窍' => 'qiao', '竅' => 'qiao', '繑' => 'qiao', '繰' => 'qiao', '缲' => 'qiao', '翘' => 'qiao', '翹' => 'qiao', '荍' => 'qiao', '荞' => 'qiao', '菬' => 'qiao', '蕎' => 'qiao', '藮' => 'qiao', '誚' => 'qiao', '譙' => 'qiao', '诮' => 'qiao', '谯' => 'qiao', '趫' => 'qiao', '趬' => 'qiao', '跷' => 'qiao', '踍' => 'qiao', '蹺' => 'qiao', '蹻' => 'qiao', '躈' => 'qiao', '郻' => 'qiao', '鄗' => 'qiao', '鄡' => 'qiao', '鄥' => 'qiao', '釥' => 'qiao', '鍫' => 'qiao', '鍬' => 'qiao', '鐈' => 'qiao', '鐰' => 'qiao', '锹' => 'qiao', '陗' => 'qiao', '鞒' => 'qiao', '鞘' => 'qiao', '鞩' => 'qiao', '鞽' => 'qiao', '韒' => 'qiao', '頝' => 'qiao', '顦' => 'qiao', '骹' => 'qiao', '髚' => 'qiao', '髜' => 'qiao', '㚁' => 'qiao', '㚽' => 'qiao', '㝯' => 'qiao', '㡑' => 'qiao', '㢗' => 'qiao', '㤍' => 'qiao', '㪣' => 'qiao', '㴥' => 'qiao', '䀉' => 'qiao', '䃝' => 'qiao', '䆻' => 'qiao', '䇌' => 'qiao', '䎗' => 'qiao', '䩌' => 'qiao', '䱁' => 'qiao', '䲾' => 'qiao',
+ '乖' => 'guai', '叏' => 'guai', '夬' => 'guai', '怪' => 'guai', '恠' => 'guai', '拐' => 'guai', '枴' => 'guai', '柺' => 'guai', '箉' => 'guai', '㧔' => 'guai', '㷇' => 'guai', '㽇' => 'guai', '䂯' => 'guai', '䊽' => 'guai',
+ '乜' => 'mie', '吀' => 'mie', '咩' => 'mie', '哶' => 'mie', '孭' => 'mie', '幭' => 'mie', '懱' => 'mie', '搣' => 'mie', '櫗' => 'mie', '滅' => 'mie', '瀎' => 'mie', '灭' => 'mie', '瓱' => 'mie', '篾' => 'mie', '蔑' => 'mie', '薎' => 'mie', '蠛' => 'mie', '衊' => 'mie', '覕' => 'mie', '鑖' => 'mie', '鱴' => 'mie', '鴓' => 'mie', '㒝' => 'mie', '䁾' => 'mie', '䈼' => 'mie', '䘊' => 'mie', '䩏' => 'mie',
+ '习' => 'xi', '係' => 'xi', '俙' => 'xi', '傒' => 'xi', '僖' => 'xi', '兮' => 'xi', '凞' => 'xi', '匸' => 'xi', '卌' => 'xi', '卥' => 'xi', '厀' => 'xi', '吸' => 'xi', '呬' => 'xi', '咥' => 'xi', '唏' => 'xi', '唽' => 'xi', '喜' => 'xi', '嘻' => 'xi', '噏' => 'xi', '嚱' => 'xi', '塈' => 'xi', '壐' => 'xi', '夕' => 'xi', '奚' => 'xi', '娭' => 'xi', '媳' => 'xi', '嬆' => 'xi', '嬉' => 'xi', '屃' => 'xi', '屖' => 'xi', '屗' => 'xi', '屣' => 'xi', '嵠' => 'xi', '嶍' => 'xi', '巇' => 'xi', '希' => 'xi', '席' => 'xi', '徆' => 'xi', '徙' => 'xi', '徚' => 'xi', '徯' => 'xi', '忚' => 'xi', '忥' => 'xi', '怬' => 'xi', '怸' => 'xi', '恄' => 'xi', '息' => 'xi', '悉' => 'xi', '悕' => 'xi', '惁' => 'xi', '惜' => 'xi', '慀' => 'xi', '憘' => 'xi', '憙' => 'xi', '戏' => 'xi', '戯' => 'xi', '戱' => 'xi', '戲' => 'xi', '扸' => 'xi', '昔' => 'xi', '晞' => 'xi', '晰' => 'xi', '晳' => 'xi', '暿' => 'xi', '曦' => 'xi', '杫' => 'xi', '析' => 'xi', '枲' => 'xi', '桸' => 'xi', '椞' => 'xi', '椺' => 'xi', '榽' => 'xi', '槢' => 'xi', '樨' => 'xi', '橀' => 'xi', '橲' => 'xi', '檄' => 'xi', '欯' => 'xi', '欷' => 'xi', '歖' => 'xi', '歙' => 'xi', '歚' => 'xi', '氥' => 'xi', '汐' => 'xi', '洗' => 'xi', '浠' => 'xi', '淅' => 'xi', '渓' => 'xi', '溪' => 'xi', '滊' => 'xi', '漇' => 'xi', '漝' => 'xi', '潝' => 'xi', '潟' => 'xi', '澙' => 'xi', '烯' => 'xi', '焁' => 'xi', '焈' => 'xi', '焟' => 'xi', '焬' => 'xi', '煕' => 'xi', '熂' => 'xi', '熄' => 'xi', '熈' => 'xi', '熙' => 'xi', '熹' => 'xi', '熺' => 'xi', '熻' => 'xi', '燨' => 'xi', '爔' => 'xi', '牺' => 'xi', '犀' => 'xi', '犔' => 'xi', '犠' => 'xi', '犧' => 'xi', '狶' => 'xi', '玺' => 'xi', '琋' => 'xi', '璽' => 'xi', '瘜' => 'xi', '皙' => 'xi', '盻' => 'xi', '睎' => 'xi', '瞦' => 'xi', '矖' => 'xi', '矽' => 'xi', '硒' => 'xi', '磶' => 'xi', '礂' => 'xi', '禊' => 'xi', '禧' => 'xi', '稀' => 'xi', '稧' => 'xi', '穸' => 'xi', '窸' => 'xi', '粞' => 'xi', '系' => 'xi', '細' => 'xi', '綌' => 'xi', '緆' => 'xi', '縰' => 'xi', '繥' => 'xi', '纚' => 'xi', '细' => 'xi', '绤' => 'xi', '羲' => 'xi', '習' => 'xi', '翕' => 'xi', '翖' => 'xi', '肸' => 'xi', '肹' => 'xi', '膝' => 'xi', '舄' => 'xi', '舾' => 'xi', '莃' => 'xi', '菥' => 'xi', '葈' => 'xi', '葸' => 'xi', '蒠' => 'xi', '蒵' => 'xi', '蓆' => 'xi', '蓰' => 'xi', '蕮' => 'xi', '薂' => 'xi', '虩' => 'xi', '蜥' => 'xi', '蝷' => 'xi', '螅' => 'xi', '螇' => 'xi', '蟋' => 'xi', '蟢' => 'xi', '蠵' => 'xi', '衋' => 'xi', '袭' => 'xi', '襲' => 'xi', '西' => 'xi', '覀' => 'xi', '覡' => 'xi', '覤' => 'xi', '觋' => 'xi', '觹' => 'xi', '觽' => 'xi', '觿' => 'xi', '誒' => 'xi', '諰' => 'xi', '謑' => 'xi', '謵' => 'xi', '譆' => 'xi', '诶' => 'xi', '谿' => 'xi', '豀' => 'xi', '豨' => 'xi', '豯' => 'xi', '貕' => 'xi', '赥' => 'xi', '赩' => 'xi', '趇' => 'xi', '趘' => 'xi', '蹝' => 'xi', '躧' => 'xi', '郄' => 'xi', '郋' => 'xi', '郗' => 'xi', '郤' => 'xi', '鄎' => 'xi', '酅' => 'xi', '醯' => 'xi', '釳' => 'xi', '釸' => 'xi', '鈢' => 'xi', '銑' => 'xi', '錫' => 'xi', '鎴' => 'xi', '鏭' => 'xi', '鑴' => 'xi', '铣' => 'xi', '锡' => 'xi', '闟' => 'xi', '阋' => 'xi', '隙' => 'xi', '隟' => 'xi', '隰' => 'xi', '隵' => 'xi', '雟' => 'xi', '霫' => 'xi', '霼' => 'xi', '飁' => 'xi', '餏' => 'xi', '餙' => 'xi', '餼' => 'xi', '饩' => 'xi', '饻' => 'xi', '騱' => 'xi', '騽' => 'xi', '驨' => 'xi', '鬩' => 'xi', '鯑' => 'xi', '鰼' => 'xi', '鱚' => 'xi', '鳛' => 'xi', '鵗' => 'xi', '鸂' => 'xi', '黖' => 'xi', '鼷' => 'xi', '㑶' => 'xi', '㔒' => 'xi', '㗩' => 'xi', '㙾' => 'xi', '㚛' => 'xi', '㞒' => 'xi', '㠄' => 'xi', '㣟' => 'xi', '㤴' => 'xi', '㤸' => 'xi', '㥡' => 'xi', '㦻' => 'xi', '㩗' => 'xi', '㭡' => 'xi', '㳧' => 'xi', '㵿' => 'xi', '㸍' => 'xi', '㹫' => 'xi', '㽯' => 'xi', '㿇' => 'xi', '䀘' => 'xi', '䂀' => 'xi', '䈪' => 'xi', '䊠' => 'xi', '䏮' => 'xi', '䐼' => 'xi', '䓇' => 'xi', '䙽' => 'xi', '䚷' => 'xi', '䛥' => 'xi', '䜁' => 'xi', '䢄' => 'xi', '䧍' => 'xi', '䨳' => 'xi', '䩤' => 'xi', '䫣' => 'xi', '䮎' => 'xi', '䲪' => 'xi',
+ '乡' => 'xiang', '享' => 'xiang', '亯' => 'xiang', '佭' => 'xiang', '像' => 'xiang', '勨' => 'xiang', '厢' => 'xiang', '向' => 'xiang', '响' => 'xiang', '啌' => 'xiang', '嚮' => 'xiang', '姠' => 'xiang', '嶑' => 'xiang', '巷' => 'xiang', '庠' => 'xiang', '廂' => 'xiang', '忀' => 'xiang', '想' => 'xiang', '晑' => 'xiang', '曏' => 'xiang', '栙' => 'xiang', '楿' => 'xiang', '橡' => 'xiang', '欀' => 'xiang', '湘' => 'xiang', '珦' => 'xiang', '瓖' => 'xiang', '瓨' => 'xiang', '相' => 'xiang', '祥' => 'xiang', '箱' => 'xiang', '絴' => 'xiang', '緗' => 'xiang', '缃' => 'xiang', '缿' => 'xiang', '翔' => 'xiang', '膷' => 'xiang', '芗' => 'xiang', '萫' => 'xiang', '葙' => 'xiang', '薌' => 'xiang', '蚃' => 'xiang', '蟓' => 'xiang', '蠁' => 'xiang', '襄' => 'xiang', '襐' => 'xiang', '詳' => 'xiang', '详' => 'xiang', '象' => 'xiang', '跭' => 'xiang', '郷' => 'xiang', '鄉' => 'xiang', '鄊' => 'xiang', '鄕' => 'xiang', '銄' => 'xiang', '鐌' => 'xiang', '鑲' => 'xiang', '镶' => 'xiang', '響' => 'xiang', '項' => 'xiang', '项' => 'xiang', '飨' => 'xiang', '餉' => 'xiang', '饗' => 'xiang', '饟' => 'xiang', '饷' => 'xiang', '香' => 'xiang', '驤' => 'xiang', '骧' => 'xiang', '鮝' => 'xiang', '鯗' => 'xiang', '鱌' => 'xiang', '鱜' => 'xiang', '鱶' => 'xiang', '鲞' => 'xiang', '麘' => 'xiang', '㐮' => 'xiang', '㗽' => 'xiang', '㟄' => 'xiang', '㟟' => 'xiang', '䊑' => 'xiang', '䐟' => 'xiang', '䔗' => 'xiang', '䖮' => 'xiang', '䜶' => 'xiang', '䢽' => 'xiang',
+ '乤' => 'hai', '亥' => 'hai', '咍' => 'hai', '嗐' => 'hai', '嗨' => 'hai', '嚡' => 'hai', '塰' => 'hai', '孩' => 'hai', '害' => 'hai', '氦' => 'hai', '海' => 'hai', '烸' => 'hai', '胲' => 'hai', '酼' => 'hai', '醢' => 'hai', '餀' => 'hai', '饚' => 'hai', '駭' => 'hai', '駴' => 'hai', '骇' => 'hai', '骸' => 'hai', '㜾' => 'hai', '㤥' => 'hai', '㦟' => 'hai', '㧡' => 'hai', '㨟' => 'hai', '㺔' => 'hai', '䇋' => 'hai', '䠽' => 'hai', '䯐' => 'hai', '䱺' => 'hai',
+ '书' => 'shu', '侸' => 'shu', '倏' => 'shu', '倐' => 'shu', '儵' => 'shu', '叔' => 'shu', '咰' => 'shu', '塾' => 'shu', '墅' => 'shu', '姝' => 'shu', '婌' => 'shu', '孰' => 'shu', '尌' => 'shu', '尗' => 'shu', '属' => 'shu', '庶' => 'shu', '庻' => 'shu', '怷' => 'shu', '恕' => 'shu', '戍' => 'shu', '抒' => 'shu', '掓' => 'shu', '摅' => 'shu', '攄' => 'shu', '数' => 'shu', '數' => 'shu', '暏' => 'shu', '暑' => 'shu', '曙' => 'shu', '書' => 'shu', '朮' => 'shu', '术' => 'shu', '束' => 'shu', '杸' => 'shu', '枢' => 'shu', '柕' => 'shu', '树' => 'shu', '梳' => 'shu', '樞' => 'shu', '樹' => 'shu', '橾' => 'shu', '殊' => 'shu', '殳' => 'shu', '毹' => 'shu', '毺' => 'shu', '沭' => 'shu', '淑' => 'shu', '漱' => 'shu', '潄' => 'shu', '潻' => 'shu', '澍' => 'shu', '濖' => 'shu', '瀭' => 'shu', '焂' => 'shu', '熟' => 'shu', '瑹' => 'shu', '璹' => 'shu', '疎' => 'shu', '疏' => 'shu', '癙' => 'shu', '秫' => 'shu', '竖' => 'shu', '竪' => 'shu', '籔' => 'shu', '糬' => 'shu', '紓' => 'shu', '絉' => 'shu', '綀' => 'shu', '纾' => 'shu', '署' => 'shu', '腧' => 'shu', '舒' => 'shu', '荗' => 'shu', '菽' => 'shu', '蒁' => 'shu', '蔬' => 'shu', '薥' => 'shu', '薯' => 'shu', '藷' => 'shu', '虪' => 'shu', '蜀' => 'shu', '蠴' => 'shu', '術' => 'shu', '裋' => 'shu', '襡' => 'shu', '襩' => 'shu', '豎' => 'shu', '贖' => 'shu', '赎' => 'shu', '跾' => 'shu', '踈' => 'shu', '軗' => 'shu', '輸' => 'shu', '输' => 'shu', '述' => 'shu', '鄃' => 'shu', '鉥' => 'shu', '錰' => 'shu', '鏣' => 'shu', '陎' => 'shu', '鮛' => 'shu', '鱪' => 'shu', '鱰' => 'shu', '鵨' => 'shu', '鶐' => 'shu', '鶑' => 'shu', '鸀' => 'shu', '黍' => 'shu', '鼠' => 'shu', '鼡' => 'shu', '㒔' => 'shu', '㛸' => 'shu', '㜐' => 'shu', '㟬' => 'shu', '㣽' => 'shu', '㯮' => 'shu', '㳆' => 'shu', '㶖' => 'shu', '㷂' => 'shu', '㻿' => 'shu', '㽰' => 'shu', '㾁' => 'shu', '䃞' => 'shu', '䆝' => 'shu', '䉀' => 'shu', '䎉' => 'shu', '䘤' => 'shu', '䜹' => 'shu', '䝂' => 'shu', '䝪' => 'shu', '䞖' => 'shu', '䠱' => 'shu', '䢤' => 'shu', '䩱' => 'shu', '䩳' => 'shu', '䴰' => 'shu',
+ '乧' => 'dou', '兜' => 'dou', '兠' => 'dou', '剅' => 'dou', '吺' => 'dou', '唗' => 'dou', '抖' => 'dou', '斗' => 'dou', '斣' => 'dou', '枓' => 'dou', '梪' => 'dou', '橷' => 'dou', '毭' => 'dou', '浢' => 'dou', '痘' => 'dou', '窦' => 'dou', '竇' => 'dou', '篼' => 'dou', '脰' => 'dou', '艔' => 'dou', '荳' => 'dou', '蔸' => 'dou', '蚪' => 'dou', '豆' => 'dou', '逗' => 'dou', '郖' => 'dou', '酘' => 'dou', '鈄' => 'dou', '鋀' => 'dou', '钭' => 'dou', '閗' => 'dou', '闘' => 'dou', '阧' => 'dou', '陡' => 'dou', '餖' => 'dou', '饾' => 'dou', '鬥' => 'dou', '鬦' => 'dou', '鬪' => 'dou', '鬬' => 'dou', '鬭' => 'dou', '㛒' => 'dou', '㞳' => 'dou', '㢄' => 'dou', '㨮' => 'dou', '㪷' => 'dou', '㷆' => 'dou', '䄈' => 'dou', '䕆' => 'dou', '䕱' => 'dou', '䛠' => 'dou', '䬦' => 'dou',
+ '乪' => 'nang', '儾' => 'nang', '嚢' => 'nang', '囊' => 'nang', '囔' => 'nang', '擃' => 'nang', '攮' => 'nang', '曩' => 'nang', '欜' => 'nang', '灢' => 'nang', '蠰' => 'nang', '饢' => 'nang', '馕' => 'nang', '鬞' => 'nang', '齉' => 'nang', '㒄' => 'nang', '㶞' => 'nang', '䂇' => 'nang',
+ '乫' => 'kai', '凯' => 'kai', '凱' => 'kai', '剀' => 'kai', '剴' => 'kai', '勓' => 'kai', '嘅' => 'kai', '垲' => 'kai', '塏' => 'kai', '奒' => 'kai', '开' => 'kai', '忾' => 'kai', '恺' => 'kai', '愷' => 'kai', '愾' => 'kai', '慨' => 'kai', '揩' => 'kai', '暟' => 'kai', '楷' => 'kai', '欬' => 'kai', '炌' => 'kai', '炏' => 'kai', '烗' => 'kai', '蒈' => 'kai', '衉' => 'kai', '輆' => 'kai', '鍇' => 'kai', '鎎' => 'kai', '鎧' => 'kai', '鐦' => 'kai', '铠' => 'kai', '锎' => 'kai', '锴' => 'kai', '開' => 'kai', '闓' => 'kai', '闿' => 'kai', '颽' => 'kai', '㡁' => 'kai', '㲉' => 'kai', '䁗' => 'kai', '䐩' => 'kai', '䒓' => 'kai', '䡷' => 'kai',
+ '乬' => 'keng', '劥' => 'keng', '厼' => 'keng', '吭' => 'keng', '唟' => 'keng', '坈' => 'keng', '坑' => 'keng', '巪' => 'keng', '怾' => 'keng', '挳' => 'keng', '牼' => 'keng', '硁' => 'keng', '硜' => 'keng', '硻' => 'keng', '誙' => 'keng', '銵' => 'keng', '鍞' => 'keng', '鏗' => 'keng', '铿' => 'keng', '䡰' => 'keng',
+ '乭' => 'ting', '亭' => 'ting', '侹' => 'ting', '停' => 'ting', '厅' => 'ting', '厛' => 'ting', '听' => 'ting', '圢' => 'ting', '娗' => 'ting', '婷' => 'ting', '嵉' => 'ting', '庁' => 'ting', '庭' => 'ting', '廰' => 'ting', '廳' => 'ting', '廷' => 'ting', '挺' => 'ting', '桯' => 'ting', '梃' => 'ting', '楟' => 'ting', '榳' => 'ting', '汀' => 'ting', '涏' => 'ting', '渟' => 'ting', '濎' => 'ting', '烃' => 'ting', '烴' => 'ting', '烶' => 'ting', '珽' => 'ting', '町' => 'ting', '筳' => 'ting', '綎' => 'ting', '耓' => 'ting', '聤' => 'ting', '聴' => 'ting', '聼' => 'ting', '聽' => 'ting', '脡' => 'ting', '艇' => 'ting', '艈' => 'ting', '艼' => 'ting', '莛' => 'ting', '葶' => 'ting', '蜓' => 'ting', '蝏' => 'ting', '誔' => 'ting', '諪' => 'ting', '邒' => 'ting', '鋌' => 'ting', '铤' => 'ting', '閮' => 'ting', '霆' => 'ting', '鞓' => 'ting', '頲' => 'ting', '颋' => 'ting', '鼮' => 'ting', '㹶' => 'ting', '䋼' => 'ting', '䗴' => 'ting', '䦐' => 'ting', '䱓' => 'ting', '䵺' => 'ting',
+ '乮' => 'mo', '劘' => 'mo', '劰' => 'mo', '嗼' => 'mo', '嚤' => 'mo', '嚩' => 'mo', '圽' => 'mo', '塻' => 'mo', '墨' => 'mo', '妺' => 'mo', '嫫' => 'mo', '嫼' => 'mo', '寞' => 'mo', '尛' => 'mo', '帓' => 'mo', '帞' => 'mo', '怽' => 'mo', '懡' => 'mo', '抹' => 'mo', '摩' => 'mo', '摸' => 'mo', '摹' => 'mo', '擵' => 'mo', '昩' => 'mo', '暯' => 'mo', '末' => 'mo', '枺' => 'mo', '模' => 'mo', '橅' => 'mo', '歾' => 'mo', '歿' => 'mo', '殁' => 'mo', '沫' => 'mo', '漠' => 'mo', '爅' => 'mo', '瘼' => 'mo', '皌' => 'mo', '眜' => 'mo', '眽' => 'mo', '眿' => 'mo', '瞐' => 'mo', '瞙' => 'mo', '砞' => 'mo', '磨' => 'mo', '礳' => 'mo', '秣' => 'mo', '粖' => 'mo', '糢' => 'mo', '絈' => 'mo', '縸' => 'mo', '纆' => 'mo', '耱' => 'mo', '膜' => 'mo', '茉' => 'mo', '莈' => 'mo', '莫' => 'mo', '蓦' => 'mo', '藦' => 'mo', '蘑' => 'mo', '蛨' => 'mo', '蟔' => 'mo', '袹' => 'mo', '謨' => 'mo', '謩' => 'mo', '譕' => 'mo', '谟' => 'mo', '貃' => 'mo', '貊' => 'mo', '貘' => 'mo', '銆' => 'mo', '鏌' => 'mo', '镆' => 'mo', '陌' => 'mo', '靺' => 'mo', '饃' => 'mo', '饝' => 'mo', '馍' => 'mo', '驀' => 'mo', '髍' => 'mo', '魔' => 'mo', '魩' => 'mo', '魹' => 'mo', '麼' => 'mo', '麽' => 'mo', '麿' => 'mo', '默' => 'mo', '黙' => 'mo', '㱄' => 'mo', '㱳' => 'mo', '㷬' => 'mo', '㷵' => 'mo', '㹮' => 'mo', '䁼' => 'mo', '䁿' => 'mo', '䃺' => 'mo', '䉑' => 'mo', '䏞' => 'mo', '䒬' => 'mo', '䘃' => 'mo', '䜆' => 'mo', '䩋' => 'mo', '䬴' => 'mo', '䮬' => 'mo', '䯢' => 'mo', '䱅' => 'mo', '䳮' => 'mo', '䴲' => 'mo',
+ '乯' => 'ou', '偶' => 'ou', '吘' => 'ou', '呕' => 'ou', '嘔' => 'ou', '噢' => 'ou', '塸' => 'ou', '夞' => 'ou', '怄' => 'ou', '慪' => 'ou', '櫙' => 'ou', '欧' => 'ou', '歐' => 'ou', '殴' => 'ou', '毆' => 'ou', '毮' => 'ou', '沤' => 'ou', '漚' => 'ou', '熰' => 'ou', '瓯' => 'ou', '甌' => 'ou', '筽' => 'ou', '耦' => 'ou', '腢' => 'ou', '膒' => 'ou', '蕅' => 'ou', '藕' => 'ou', '藲' => 'ou', '謳' => 'ou', '讴' => 'ou', '鏂' => 'ou', '鞰' => 'ou', '鴎' => 'ou', '鷗' => 'ou', '鸥' => 'ou', '齵' => 'ou', '㒖' => 'ou', '㛏' => 'ou', '㼴' => 'ou', '䌂' => 'ou', '䌔' => 'ou', '䚆' => 'ou', '䯚' => 'ou',
+ '买' => 'mai', '佅' => 'mai', '劢' => 'mai', '勱' => 'mai', '卖' => 'mai', '嘪' => 'mai', '埋' => 'mai', '売' => 'mai', '脈' => 'mai', '脉' => 'mai', '荬' => 'mai', '蕒' => 'mai', '薶' => 'mai', '衇' => 'mai', '買' => 'mai', '賣' => 'mai', '迈' => 'mai', '邁' => 'mai', '霡' => 'mai', '霢' => 'mai', '霾' => 'mai', '鷶' => 'mai', '麥' => 'mai', '麦' => 'mai', '㜥' => 'mai', '㼮' => 'mai', '䁲' => 'mai', '䈿' => 'mai', '䘑' => 'mai', '䚑' => 'mai', '䜕' => 'mai', '䨪' => 'mai', '䨫' => 'mai', '䮮' => 'mai',
+ '乱' => 'luan', '亂' => 'luan', '卵' => 'luan', '圝' => 'luan', '圞' => 'luan', '奱' => 'luan', '孌' => 'luan', '孪' => 'luan', '孿' => 'luan', '峦' => 'luan', '巒' => 'luan', '挛' => 'luan', '攣' => 'luan', '曫' => 'luan', '栾' => 'luan', '欒' => 'luan', '滦' => 'luan', '灓' => 'luan', '灤' => 'luan', '癴' => 'luan', '癵' => 'luan', '羉' => 'luan', '脔' => 'luan', '臠' => 'luan', '虊' => 'luan', '釠' => 'luan', '銮' => 'luan', '鑾' => 'luan', '鵉' => 'luan', '鸞' => 'luan', '鸾' => 'luan', '㝈' => 'luan', '㡩' => 'luan', '㱍' => 'luan', '䖂' => 'luan', '䜌' => 'luan',
+ '乲' => 'cai', '倸' => 'cai', '偲' => 'cai', '埰' => 'cai', '婇' => 'cai', '寀' => 'cai', '彩' => 'cai', '戝' => 'cai', '才' => 'cai', '採' => 'cai', '材' => 'cai', '棌' => 'cai', '猜' => 'cai', '睬' => 'cai', '綵' => 'cai', '縩' => 'cai', '纔' => 'cai', '菜' => 'cai', '蔡' => 'cai', '裁' => 'cai', '財' => 'cai', '财' => 'cai', '跴' => 'cai', '踩' => 'cai', '采' => 'cai', '㒲' => 'cai', '㥒' => 'cai', '䌨' => 'cai', '䌽' => 'cai', '䐆' => 'cai', '䣋' => 'cai', '䰂' => 'cai', '䴭' => 'cai',
+ '乳' => 'ru', '侞' => 'ru', '儒' => 'ru', '入' => 'ru', '嗕' => 'ru', '嚅' => 'ru', '如' => 'ru', '媷' => 'ru', '嬬' => 'ru', '孺' => 'ru', '嶿' => 'ru', '帤' => 'ru', '扖' => 'ru', '擩' => 'ru', '曘' => 'ru', '杁' => 'ru', '桇' => 'ru', '汝' => 'ru', '洳' => 'ru', '渪' => 'ru', '溽' => 'ru', '濡' => 'ru', '燸' => 'ru', '筎' => 'ru', '縟' => 'ru', '繻' => 'ru', '缛' => 'ru', '肗' => 'ru', '茹' => 'ru', '蒘' => 'ru', '蓐' => 'ru', '蕠' => 'ru', '薷' => 'ru', '蠕' => 'ru', '袽' => 'ru', '褥' => 'ru', '襦' => 'ru', '辱' => 'ru', '込' => 'ru', '邚' => 'ru', '鄏' => 'ru', '醹' => 'ru', '銣' => 'ru', '铷' => 'ru', '顬' => 'ru', '颥' => 'ru', '鱬' => 'ru', '鳰' => 'ru', '鴑' => 'ru', '鴽' => 'ru', '㦺' => 'ru', '㨎' => 'ru', '㹘' => 'ru', '䋈' => 'ru', '䰰' => 'ru',
+ '乴' => 'xue', '吷' => 'xue', '坹' => 'xue', '学' => 'xue', '學' => 'xue', '岤' => 'xue', '峃' => 'xue', '嶨' => 'xue', '怴' => 'xue', '斈' => 'xue', '桖' => 'xue', '樰' => 'xue', '泧' => 'xue', '泶' => 'xue', '澩' => 'xue', '瀥' => 'xue', '烕' => 'xue', '燢' => 'xue', '狘' => 'xue', '疦' => 'xue', '疶' => 'xue', '穴' => 'xue', '膤' => 'xue', '艝' => 'xue', '茓' => 'xue', '蒆' => 'xue', '薛' => 'xue', '血' => 'xue', '袕' => 'xue', '觷' => 'xue', '謔' => 'xue', '谑' => 'xue', '趐' => 'xue', '踅' => 'xue', '轌' => 'xue', '辥' => 'xue', '雤' => 'xue', '雪' => 'xue', '靴' => 'xue', '鞾' => 'xue', '鱈' => 'xue', '鳕' => 'xue', '鷽' => 'xue', '鸴' => 'xue', '㖸' => 'xue', '㞽' => 'xue', '㡜' => 'xue', '㧒' => 'xue', '㶅' => 'xue', '㿱' => 'xue', '䎀' => 'xue', '䤕' => 'xue', '䨮' => 'xue', '䫻' => 'xue', '䫼' => 'xue', '䬂' => 'xue', '䭥' => 'xue', '䱑' => 'xue',
+ '乶' => 'peng', '倗' => 'peng', '傰' => 'peng', '剻' => 'peng', '匉' => 'peng', '喸' => 'peng', '嘭' => 'peng', '堋' => 'peng', '塜' => 'peng', '塳' => 'peng', '巼' => 'peng', '弸' => 'peng', '彭' => 'peng', '怦' => 'peng', '恲' => 'peng', '憉' => 'peng', '抨' => 'peng', '挷' => 'peng', '捧' => 'peng', '掽' => 'peng', '搒' => 'peng', '朋' => 'peng', '梈' => 'peng', '棚' => 'peng', '椖' => 'peng', '椪' => 'peng', '槰' => 'peng', '樥' => 'peng', '泙' => 'peng', '浌' => 'peng', '淎' => 'peng', '漨' => 'peng', '漰' => 'peng', '澎' => 'peng', '烹' => 'peng', '熢' => 'peng', '皏' => 'peng', '砰' => 'peng', '硑' => 'peng', '硼' => 'peng', '碰' => 'peng', '磞' => 'peng', '稝' => 'peng', '竼' => 'peng', '篷' => 'peng', '纄' => 'peng', '胓' => 'peng', '膨' => 'peng', '芃' => 'peng', '莑' => 'peng', '蓬' => 'peng', '蟚' => 'peng', '蟛' => 'peng', '踫' => 'peng', '軯' => 'peng', '輣' => 'peng', '錋' => 'peng', '鑝' => 'peng', '閛' => 'peng', '闏' => 'peng', '韸' => 'peng', '韼' => 'peng', '駍' => 'peng', '騯' => 'peng', '髼' => 'peng', '鬅' => 'peng', '鬔' => 'peng', '鵬' => 'peng', '鹏' => 'peng', '㛔' => 'peng', '㥊' => 'peng', '㼞' => 'peng', '䄘' => 'peng', '䡫' => 'peng', '䰃' => 'peng', '䴶' => 'peng',
+ '乷' => 'sha', '倽' => 'sha', '傻' => 'sha', '儍' => 'sha', '刹' => 'sha', '唦' => 'sha', '唼' => 'sha', '啥' => 'sha', '喢' => 'sha', '帹' => 'sha', '挱' => 'sha', '杀' => 'sha', '榝' => 'sha', '樧' => 'sha', '歃' => 'sha', '殺' => 'sha', '沙' => 'sha', '煞' => 'sha', '猀' => 'sha', '痧' => 'sha', '砂' => 'sha', '硰' => 'sha', '箑' => 'sha', '粆' => 'sha', '紗' => 'sha', '繌' => 'sha', '繺' => 'sha', '纱' => 'sha', '翜' => 'sha', '翣' => 'sha', '莎' => 'sha', '萐' => 'sha', '蔱' => 'sha', '裟' => 'sha', '鎩' => 'sha', '铩' => 'sha', '閯' => 'sha', '閷' => 'sha', '霎' => 'sha', '魦' => 'sha', '鯊' => 'sha', '鯋' => 'sha', '鲨' => 'sha', '㚫' => 'sha', '㛼' => 'sha', '㰱' => 'sha', '䈉' => 'sha', '䝊' => 'sha', '䮜' => 'sha', '䵘' => 'sha', '䶎' => 'sha',
+ '乸' => 'na', '吶' => 'na', '呐' => 'na', '哪' => 'na', '嗱' => 'na', '妠' => 'na', '娜' => 'na', '拏' => 'na', '拿' => 'na', '挐' => 'na', '捺' => 'na', '笝' => 'na', '納' => 'na', '纳' => 'na', '肭' => 'na', '蒳' => 'na', '衲' => 'na', '袦' => 'na', '誽' => 'na', '豽' => 'na', '貀' => 'na', '軜' => 'na', '那' => 'na', '鈉' => 'na', '鎿' => 'na', '钠' => 'na', '镎' => 'na', '雫' => 'na', '靹' => 'na', '魶' => 'na', '㗙' => 'na', '㨥' => 'na', '㴸' => 'na', '䀑' => 'na', '䅞' => 'na', '䇣' => 'na', '䇱' => 'na', '䈫' => 'na', '䎎' => 'na', '䏧' => 'na', '䖓' => 'na', '䖧' => 'na', '䛔' => 'na', '䟜' => 'na', '䪏' => 'na', '䫱' => 'na', '䱹' => 'na',
+ '乹' => 'qian', '乾' => 'qian', '仟' => 'qian', '仱' => 'qian', '伣' => 'qian', '佥' => 'qian', '俔' => 'qian', '倩' => 'qian', '偂' => 'qian', '傔' => 'qian', '僉' => 'qian', '儙' => 'qian', '凵' => 'qian', '刋' => 'qian', '前' => 'qian', '千' => 'qian', '嗛' => 'qian', '圱' => 'qian', '圲' => 'qian', '堑' => 'qian', '塹' => 'qian', '墘' => 'qian', '壍' => 'qian', '奷' => 'qian', '婜' => 'qian', '媊' => 'qian', '嬱' => 'qian', '孯' => 'qian', '岍' => 'qian', '岒' => 'qian', '嵌' => 'qian', '嵰' => 'qian', '忴' => 'qian', '悓' => 'qian', '悭' => 'qian', '愆' => 'qian', '慊' => 'qian', '慳' => 'qian', '扦' => 'qian', '扲' => 'qian', '拑' => 'qian', '拪' => 'qian', '掔' => 'qian', '掮' => 'qian', '揵' => 'qian', '搴' => 'qian', '摼' => 'qian', '撁' => 'qian', '攐' => 'qian', '攑' => 'qian', '攓' => 'qian', '杄' => 'qian', '棈' => 'qian', '椠' => 'qian', '榩' => 'qian', '槏' => 'qian', '槧' => 'qian', '橬' => 'qian', '檶' => 'qian', '櫏' => 'qian', '欠' => 'qian', '欦' => 'qian', '歉' => 'qian', '歬' => 'qian', '汘' => 'qian', '汧' => 'qian', '浅' => 'qian', '淺' => 'qian', '潛' => 'qian', '潜' => 'qian', '濳' => 'qian', '灊' => 'qian', '牵' => 'qian', '牽' => 'qian', '皘' => 'qian', '竏' => 'qian', '签' => 'qian', '箝' => 'qian', '箞' => 'qian', '篏' => 'qian', '篟' => 'qian', '簽' => 'qian', '籖' => 'qian', '籤' => 'qian', '粁' => 'qian', '綪' => 'qian', '縴' => 'qian', '繾' => 'qian', '缱' => 'qian', '羬' => 'qian', '肷' => 'qian', '膁' => 'qian', '臤' => 'qian', '芊' => 'qian', '芡' => 'qian', '茜' => 'qian', '茾' => 'qian', '荨' => 'qian', '蒨' => 'qian', '蔳' => 'qian', '蕁' => 'qian', '虔' => 'qian', '蚈' => 'qian', '蜸' => 'qian', '褰' => 'qian', '諐' => 'qian', '謙' => 'qian', '譴' => 'qian', '谦' => 'qian', '谴' => 'qian', '谸' => 'qian', '軡' => 'qian', '輤' => 'qian', '迁' => 'qian', '遣' => 'qian', '遷' => 'qian', '釺' => 'qian', '鈆' => 'qian', '鈐' => 'qian', '鉆' => 'qian', '鉗' => 'qian', '鉛' => 'qian', '銭' => 'qian', '錢' => 'qian', '鎆' => 'qian', '鏲' => 'qian', '鐱' => 'qian', '鑓' => 'qian', '钎' => 'qian', '钤' => 'qian', '钱' => 'qian', '钳' => 'qian', '铅' => 'qian', '阡' => 'qian', '雃' => 'qian', '韆' => 'qian', '顅' => 'qian', '騚' => 'qian', '騝' => 'qian', '騫' => 'qian', '骞' => 'qian', '鬜' => 'qian', '鬝' => 'qian', '鰬' => 'qian', '鵮' => 'qian', '鹐' => 'qian', '黔' => 'qian', '黚' => 'qian', '㐸' => 'qian', '㜞' => 'qian', '㟻' => 'qian', '㡨' => 'qian', '㦮' => 'qian', '㧄' => 'qian', '㨜' => 'qian', '㩮' => 'qian', '㯠' => 'qian', '㸫' => 'qian', '䁮' => 'qian', '䈤' => 'qian', '䈴' => 'qian', '䊴' => 'qian', '䍉' => 'qian', '䖍' => 'qian', '䥅' => 'qian', '䦲' => 'qian', '䨿' => 'qian', '䪈' => 'qian', '䫡' => 'qian', '䭤' => 'qian',
+ '乻' => 'er', '二' => 'er', '仒' => 'er', '佴' => 'er', '侕' => 'er', '儿' => 'er', '児' => 'er', '兒' => 'er', '刵' => 'er', '咡' => 'er', '唲' => 'er', '尒' => 'er', '尓' => 'er', '尔' => 'er', '峏' => 'er', '弍' => 'er', '弐' => 'er', '旕' => 'er', '栭' => 'er', '栮' => 'er', '樲' => 'er', '毦' => 'er', '洏' => 'er', '洱' => 'er', '爾' => 'er', '珥' => 'er', '粫' => 'er', '而' => 'er', '耏' => 'er', '耳' => 'er', '聏' => 'er', '胹' => 'er', '荋' => 'er', '薾' => 'er', '衈' => 'er', '袻' => 'er', '誀' => 'er', '貮' => 'er', '貳' => 'er', '贰' => 'er', '趰' => 'er', '輀' => 'er', '轜' => 'er', '迩' => 'er', '邇' => 'er', '鉺' => 'er', '铒' => 'er', '陑' => 'er', '隭' => 'er', '餌' => 'er', '饵' => 'er', '駬' => 'er', '髵' => 'er', '鮞' => 'er', '鲕' => 'er', '鴯' => 'er', '鸸' => 'er', '㒃' => 'er', '㖇' => 'er', '㚷' => 'er', '㛅' => 'er', '㜨' => 'er', '㢽' => 'er', '㧫' => 'er', '㮕' => 'er', '䋙' => 'er', '䋩' => 'er', '䌺' => 'er', '䎟' => 'er', '䎠' => 'er', '䎶' => 'er', '䏪' => 'er', '䣵' => 'er', '䮘' => 'er',
+ '乼' => 'cui', '伜' => 'cui', '倅' => 'cui', '催' => 'cui', '凗' => 'cui', '啐' => 'cui', '啛' => 'cui', '墔' => 'cui', '崔' => 'cui', '嶉' => 'cui', '忰' => 'cui', '悴' => 'cui', '慛' => 'cui', '摧' => 'cui', '榱' => 'cui', '槯' => 'cui', '毳' => 'cui', '淬' => 'cui', '漼' => 'cui', '焠' => 'cui', '獕' => 'cui', '璀' => 'cui', '疩' => 'cui', '瘁' => 'cui', '皠' => 'cui', '磪' => 'cui', '竁' => 'cui', '粹' => 'cui', '紣' => 'cui', '綷' => 'cui', '縗' => 'cui', '缞' => 'cui', '翆' => 'cui', '翠' => 'cui', '脃' => 'cui', '脆' => 'cui', '膬' => 'cui', '膵' => 'cui', '臎' => 'cui', '萃' => 'cui', '襊' => 'cui', '趡' => 'cui', '鏙' => 'cui', '顇' => 'cui', '㝮' => 'cui', '㥞' => 'cui', '㧘' => 'cui', '㯔' => 'cui', '㯜' => 'cui', '㱖' => 'cui', '㳃' => 'cui', '㵏' => 'cui', '㷃' => 'cui', '㷪' => 'cui', '䂱' => 'cui', '䃀' => 'cui', '䄟' => 'cui', '䆊' => 'cui', '䊫' => 'cui', '䧽' => 'cui',
+ '乽' => 'ceng', '噌' => 'ceng', '层' => 'ceng', '層' => 'ceng', '岾' => 'ceng', '嶒' => 'ceng', '猠' => 'ceng', '硛' => 'ceng', '硳' => 'ceng', '竲' => 'ceng', '蹭' => 'ceng', '驓' => 'ceng', '㣒' => 'ceng', '㬝' => 'ceng', '䁬' => 'ceng', '䉕' => 'ceng',
+ '亀' => 'gui', '佹' => 'gui', '刽' => 'gui', '刿' => 'gui', '劊' => 'gui', '劌' => 'gui', '匦' => 'gui', '匭' => 'gui', '厬' => 'gui', '圭' => 'gui', '垝' => 'gui', '妫' => 'gui', '姽' => 'gui', '媯' => 'gui', '嫢' => 'gui', '嬀' => 'gui', '宄' => 'gui', '嶲' => 'gui', '巂' => 'gui', '帰' => 'gui', '庋' => 'gui', '庪' => 'gui', '归' => 'gui', '恑' => 'gui', '摫' => 'gui', '撌' => 'gui', '攰' => 'gui', '攱' => 'gui', '昋' => 'gui', '晷' => 'gui', '柜' => 'gui', '桂' => 'gui', '椝' => 'gui', '椢' => 'gui', '槶' => 'gui', '槻' => 'gui', '槼' => 'gui', '櫃' => 'gui', '櫷' => 'gui', '歸' => 'gui', '氿' => 'gui', '湀' => 'gui', '溎' => 'gui', '炅' => 'gui', '珪' => 'gui', '瑰' => 'gui', '璝' => 'gui', '瓌' => 'gui', '癸' => 'gui', '皈' => 'gui', '瞆' => 'gui', '瞡' => 'gui', '瞶' => 'gui', '硅' => 'gui', '祪' => 'gui', '禬' => 'gui', '窐' => 'gui', '筀' => 'gui', '簂' => 'gui', '簋' => 'gui', '胿' => 'gui', '膭' => 'gui', '茥' => 'gui', '蓕' => 'gui', '蛫' => 'gui', '蟡' => 'gui', '袿' => 'gui', '襘' => 'gui', '規' => 'gui', '规' => 'gui', '觤' => 'gui', '詭' => 'gui', '诡' => 'gui', '貴' => 'gui', '贵' => 'gui', '跪' => 'gui', '軌' => 'gui', '轨' => 'gui', '邽' => 'gui', '郌' => 'gui', '閨' => 'gui', '闺' => 'gui', '陒' => 'gui', '鞼' => 'gui', '騩' => 'gui', '鬶' => 'gui', '鬹' => 'gui', '鬼' => 'gui', '鮭' => 'gui', '鱖' => 'gui', '鱥' => 'gui', '鲑' => 'gui', '鳜' => 'gui', '龜' => 'gui', '龟' => 'gui', '㔳' => 'gui', '㙺' => 'gui', '㧪' => 'gui', '㨳' => 'gui', '㩻' => 'gui', '㪈' => 'gui', '㲹' => 'gui', '㸵' => 'gui', '䁛' => 'gui', '䇈' => 'gui', '䌆' => 'gui', '䍯' => 'gui', '䍷' => 'gui', '䐴' => 'gui', '䖯' => 'gui', '䙆' => 'gui', '䝿' => 'gui', '䞈' => 'gui', '䞨' => 'gui', '䠩' => 'gui', '䣀' => 'gui', '䤥' => 'gui', '䯣' => 'gui', '䰎' => 'gui', '䳏' => 'gui',
+ '亁' => 'gan', '仠' => 'gan', '倝' => 'gan', '凎' => 'gan', '凲' => 'gan', '坩' => 'gan', '尲' => 'gan', '尴' => 'gan', '尶' => 'gan', '尷' => 'gan', '干' => 'gan', '幹' => 'gan', '忓' => 'gan', '感' => 'gan', '擀' => 'gan', '攼' => 'gan', '敢' => 'gan', '旰' => 'gan', '杆' => 'gan', '柑' => 'gan', '桿' => 'gan', '榦' => 'gan', '橄' => 'gan', '檊' => 'gan', '汵' => 'gan', '泔' => 'gan', '淦' => 'gan', '漧' => 'gan', '澉' => 'gan', '灨' => 'gan', '玕' => 'gan', '甘' => 'gan', '疳' => 'gan', '皯' => 'gan', '盰' => 'gan', '矸' => 'gan', '秆' => 'gan', '稈' => 'gan', '竿' => 'gan', '笴' => 'gan', '筸' => 'gan', '簳' => 'gan', '粓' => 'gan', '紺' => 'gan', '绀' => 'gan', '肝' => 'gan', '芉' => 'gan', '苷' => 'gan', '衦' => 'gan', '詌' => 'gan', '贛' => 'gan', '赣' => 'gan', '赶' => 'gan', '趕' => 'gan', '迀' => 'gan', '酐' => 'gan', '骭' => 'gan', '魐' => 'gan', '鱤' => 'gan', '鳡' => 'gan', '鳱' => 'gan', '㺂' => 'gan', '䃭' => 'gan', '䇞' => 'gan', '䔈' => 'gan', '䤗' => 'gan', '䯎' => 'gan', '䲺' => 'gan', '䵟' => 'gan',
+ '亅' => 'jue', '倔' => 'jue', '傕' => 'jue', '决' => 'jue', '刔' => 'jue', '劂' => 'jue', '勪' => 'jue', '厥' => 'jue', '噘' => 'jue', '噱' => 'jue', '妜' => 'jue', '孒' => 'jue', '孓' => 'jue', '屩' => 'jue', '屫' => 'jue', '崛' => 'jue', '嶡' => 'jue', '嶥' => 'jue', '彏' => 'jue', '憠' => 'jue', '憰' => 'jue', '戄' => 'jue', '抉' => 'jue', '挗' => 'jue', '捔' => 'jue', '掘' => 'jue', '撅' => 'jue', '撧' => 'jue', '攫' => 'jue', '斍' => 'jue', '桷' => 'jue', '橛' => 'jue', '橜' => 'jue', '欔' => 'jue', '欮' => 'jue', '殌' => 'jue', '氒' => 'jue', '決' => 'jue', '泬' => 'jue', '潏' => 'jue', '灍' => 'jue', '焆' => 'jue', '熦' => 'jue', '爑' => 'jue', '爝' => 'jue', '爴' => 'jue', '爵' => 'jue', '獗' => 'jue', '玃' => 'jue', '玦' => 'jue', '玨' => 'jue', '珏' => 'jue', '瑴' => 'jue', '瘚' => 'jue', '矍' => 'jue', '矡' => 'jue', '砄' => 'jue', '絕' => 'jue', '絶' => 'jue', '绝' => 'jue', '臄' => 'jue', '芵' => 'jue', '蕝' => 'jue', '蕨' => 'jue', '虳' => 'jue', '蚗' => 'jue', '蟨' => 'jue', '蟩' => 'jue', '覐' => 'jue', '覚' => 'jue', '覺' => 'jue', '觉' => 'jue', '觖' => 'jue', '觼' => 'jue', '訣' => 'jue', '譎' => 'jue', '诀' => 'jue', '谲' => 'jue', '貜' => 'jue', '赽' => 'jue', '趉' => 'jue', '趹' => 'jue', '蹶' => 'jue', '蹷' => 'jue', '躩' => 'jue', '逫' => 'jue', '鈌' => 'jue', '鐍' => 'jue', '鐝' => 'jue', '钁' => 'jue', '镢' => 'jue', '镼' => 'jue', '駃' => 'jue', '鴂' => 'jue', '鴃' => 'jue', '鶌' => 'jue', '鷢' => 'jue', '龣' => 'jue', '㓸' => 'jue', '㔃' => 'jue', '㔢' => 'jue', '㟲' => 'jue', '㤜' => 'jue', '㩱' => 'jue', '㭈' => 'jue', '㭾' => 'jue', '㰐' => 'jue', '㵐' => 'jue', '㷾' => 'jue', '㸕' => 'jue', '㹟' => 'jue', '㻕' => 'jue', '䀗' => 'jue', '䁷' => 'jue', '䆕' => 'jue', '䆢' => 'jue', '䇶' => 'jue', '䋉' => 'jue', '䍊' => 'jue', '䏐' => 'jue', '䏣' => 'jue', '䐘' => 'jue', '䖼' => 'jue', '䘿' => 'jue', '䙠' => 'jue', '䝌' => 'jue', '䞵' => 'jue', '䞷' => 'jue', '䟾' => 'jue', '䠇' => 'jue', '䡈' => 'jue', '䦆' => 'jue', '䦼' => 'jue',
+ '了' => 'liao', '僚' => 'liao', '嘹' => 'liao', '嫽' => 'liao', '寥' => 'liao', '寮' => 'liao', '尞' => 'liao', '尥' => 'liao', '尦' => 'liao', '屪' => 'liao', '嵺' => 'liao', '嶚' => 'liao', '嶛' => 'liao', '廖' => 'liao', '廫' => 'liao', '憀' => 'liao', '憭' => 'liao', '撂' => 'liao', '撩' => 'liao', '敹' => 'liao', '料' => 'liao', '暸' => 'liao', '漻' => 'liao', '潦' => 'liao', '炓' => 'liao', '燎' => 'liao', '爎' => 'liao', '爒' => 'liao', '獠' => 'liao', '璙' => 'liao', '疗' => 'liao', '療' => 'liao', '瞭' => 'liao', '窷' => 'liao', '竂' => 'liao', '簝' => 'liao', '繚' => 'liao', '缭' => 'liao', '聊' => 'liao', '膋' => 'liao', '膫' => 'liao', '蓼' => 'liao', '蟟' => 'liao', '豂' => 'liao', '賿' => 'liao', '蹘' => 'liao', '蹽' => 'liao', '辽' => 'liao', '遼' => 'liao', '鄝' => 'liao', '釕' => 'liao', '鐐' => 'liao', '钌' => 'liao', '镣' => 'liao', '镽' => 'liao', '飉' => 'liao', '髎' => 'liao', '鷯' => 'liao', '鹩' => 'liao', '㙩' => 'liao', '㝋' => 'liao', '㡻' => 'liao', '㵳' => 'liao', '㶫' => 'liao', '㺒' => 'liao', '䄦' => 'liao', '䉼' => 'liao', '䍡' => 'liao', '䎆' => 'liao', '䑠' => 'liao', '䜍' => 'liao', '䜮' => 'liao', '䝀' => 'liao', '䢧' => 'liao', '䨅' => 'liao', '䩍' => 'liao',
+ '亇' => 'ma', '傌' => 'ma', '吗' => 'ma', '唛' => 'ma', '嗎' => 'ma', '嘛' => 'ma', '嘜' => 'ma', '妈' => 'ma', '媽' => 'ma', '嫲' => 'ma', '嬤' => 'ma', '嬷' => 'ma', '杩' => 'ma', '榪' => 'ma', '溤' => 'ma', '犘' => 'ma', '犸' => 'ma', '獁' => 'ma', '玛' => 'ma', '瑪' => 'ma', '痲' => 'ma', '睰' => 'ma', '码' => 'ma', '碼' => 'ma', '礣' => 'ma', '祃' => 'ma', '禡' => 'ma', '罵' => 'ma', '蔴' => 'ma', '蚂' => 'ma', '螞' => 'ma', '蟆' => 'ma', '蟇' => 'ma', '遤' => 'ma', '鎷' => 'ma', '閁' => 'ma', '馬' => 'ma', '駡' => 'ma', '马' => 'ma', '骂' => 'ma', '鬕' => 'ma', '鰢' => 'ma', '鷌' => 'ma', '麻' => 'ma', '㐷' => 'ma', '㑻' => 'ma', '㜫' => 'ma', '㦄' => 'ma', '㨸' => 'ma', '㾺' => 'ma', '䗫' => 'ma', '䣕' => 'ma', '䣖' => 'ma', '䯦' => 'ma', '䳸' => 'ma',
+ '争' => 'zheng', '佂' => 'zheng', '凧' => 'zheng', '埩' => 'zheng', '塣' => 'zheng', '姃' => 'zheng', '媜' => 'zheng', '峥' => 'zheng', '崝' => 'zheng', '崢' => 'zheng', '帧' => 'zheng', '幀' => 'zheng', '征' => 'zheng', '徰' => 'zheng', '徴' => 'zheng', '徵' => 'zheng', '怔' => 'zheng', '愸' => 'zheng', '抍' => 'zheng', '拯' => 'zheng', '挣' => 'zheng', '掙' => 'zheng', '掟' => 'zheng', '揁' => 'zheng', '撜' => 'zheng', '政' => 'zheng', '整' => 'zheng', '晸' => 'zheng', '正' => 'zheng', '氶' => 'zheng', '炡' => 'zheng', '烝' => 'zheng', '爭' => 'zheng', '狰' => 'zheng', '猙' => 'zheng', '症' => 'zheng', '癥' => 'zheng', '眐' => 'zheng', '睁' => 'zheng', '睜' => 'zheng', '筝' => 'zheng', '箏' => 'zheng', '篜' => 'zheng', '糽' => 'zheng', '聇' => 'zheng', '蒸' => 'zheng', '証' => 'zheng', '諍' => 'zheng', '證' => 'zheng', '证' => 'zheng', '诤' => 'zheng', '踭' => 'zheng', '郑' => 'zheng', '鄭' => 'zheng', '鉦' => 'zheng', '錚' => 'zheng', '钲' => 'zheng', '铮' => 'zheng', '鬇' => 'zheng', '鴊' => 'zheng', '㡠' => 'zheng', '㡧' => 'zheng', '㱏' => 'zheng', '㽀' => 'zheng', '䂻' => 'zheng', '䈣' => 'zheng', '䛫' => 'zheng', '䡕' => 'zheng', '䥌' => 'zheng', '䥭' => 'zheng', '䦛' => 'zheng', '䦶' => 'zheng',
+ '亍' => 'chu', '俶' => 'chu', '傗' => 'chu', '储' => 'chu', '儊' => 'chu', '儲' => 'chu', '処' => 'chu', '出' => 'chu', '刍' => 'chu', '初' => 'chu', '厨' => 'chu', '嘼' => 'chu', '埱' => 'chu', '处' => 'chu', '岀' => 'chu', '幮' => 'chu', '廚' => 'chu', '怵' => 'chu', '憷' => 'chu', '懨' => 'chu', '拀' => 'chu', '搋' => 'chu', '搐' => 'chu', '摴' => 'chu', '敊' => 'chu', '斶' => 'chu', '杵' => 'chu', '椘' => 'chu', '楚' => 'chu', '楮' => 'chu', '榋' => 'chu', '樗' => 'chu', '橱' => 'chu', '橻' => 'chu', '檚' => 'chu', '櫉' => 'chu', '櫥' => 'chu', '欪' => 'chu', '歜' => 'chu', '滀' => 'chu', '滁' => 'chu', '濋' => 'chu', '犓' => 'chu', '珿' => 'chu', '琡' => 'chu', '璴' => 'chu', '矗' => 'chu', '础' => 'chu', '礎' => 'chu', '禇' => 'chu', '竌' => 'chu', '竐' => 'chu', '篨' => 'chu', '絀' => 'chu', '绌' => 'chu', '耡' => 'chu', '臅' => 'chu', '芻' => 'chu', '蒢' => 'chu', '蒭' => 'chu', '蕏' => 'chu', '處' => 'chu', '蜍' => 'chu', '蟵' => 'chu', '褚' => 'chu', '触' => 'chu', '觸' => 'chu', '諔' => 'chu', '豖' => 'chu', '豠' => 'chu', '貙' => 'chu', '趎' => 'chu', '踀' => 'chu', '蹰' => 'chu', '躇' => 'chu', '躕' => 'chu', '鄐' => 'chu', '鉏' => 'chu', '鋤' => 'chu', '锄' => 'chu', '閦' => 'chu', '除' => 'chu', '雏' => 'chu', '雛' => 'chu', '鶵' => 'chu', '黜' => 'chu', '齣' => 'chu', '齭' => 'chu', '齼' => 'chu', '㔘' => 'chu', '㕏' => 'chu', '㕑' => 'chu', '㗰' => 'chu', '㙇' => 'chu', '㡡' => 'chu', '㤕' => 'chu', '㤘' => 'chu', '㶆' => 'chu', '㹼' => 'chu', '㼥' => 'chu', '䅳' => 'chu', '䊰' => 'chu', '䎝' => 'chu', '䎤' => 'chu', '䖏' => 'chu', '䙕' => 'chu', '䙘' => 'chu', '䜴' => 'chu', '䟞' => 'chu', '䟣' => 'chu', '䠂' => 'chu', '䠧' => 'chu', '䦌' => 'chu', '䧁' => 'chu', '䮞' => 'chu',
+ '亏' => 'kui', '傀' => 'kui', '刲' => 'kui', '匮' => 'kui', '匱' => 'kui', '卼' => 'kui', '喟' => 'kui', '喹' => 'kui', '嘳' => 'kui', '夔' => 'kui', '奎' => 'kui', '媿' => 'kui', '嬇' => 'kui', '尯' => 'kui', '岿' => 'kui', '巋' => 'kui', '巙' => 'kui', '悝' => 'kui', '愦' => 'kui', '愧' => 'kui', '憒' => 'kui', '戣' => 'kui', '揆' => 'kui', '晆' => 'kui', '暌' => 'kui', '楏' => 'kui', '楑' => 'kui', '樻' => 'kui', '櫆' => 'kui', '欳' => 'kui', '殨' => 'kui', '溃' => 'kui', '潰' => 'kui', '煃' => 'kui', '盔' => 'kui', '睽' => 'kui', '磈' => 'kui', '窥' => 'kui', '窺' => 'kui', '篑' => 'kui', '簣' => 'kui', '籄' => 'kui', '聧' => 'kui', '聩' => 'kui', '聭' => 'kui', '聵' => 'kui', '葵' => 'kui', '蒉' => 'kui', '蒊' => 'kui', '蕢' => 'kui', '藈' => 'kui', '蘬' => 'kui', '蘷' => 'kui', '虁' => 'kui', '虧' => 'kui', '蝰' => 'kui', '謉' => 'kui', '跬' => 'kui', '蹞' => 'kui', '躨' => 'kui', '逵' => 'kui', '鄈' => 'kui', '鍨' => 'kui', '鍷' => 'kui', '鐀' => 'kui', '鑎' => 'kui', '闚' => 'kui', '頄' => 'kui', '頍' => 'kui', '頯' => 'kui', '顝' => 'kui', '餽' => 'kui', '饋' => 'kui', '馈' => 'kui', '馗' => 'kui', '騤' => 'kui', '骙' => 'kui', '魁' => 'kui', '㕟' => 'kui', '㙓' => 'kui', '㚝' => 'kui', '㛻' => 'kui', '㨒' => 'kui', '䈐' => 'kui', '䍪' => 'kui', '䕚' => 'kui', '䕫' => 'kui', '䟸' => 'kui', '䠑' => 'kui', '䤆' => 'kui', '䦱' => 'kui', '䧶' => 'kui', '䫥' => 'kui', '䯓' => 'kui', '䳫' => 'kui',
+ '云' => 'yun', '伝' => 'yun', '傊' => 'yun', '允' => 'yun', '勻' => 'yun', '匀' => 'yun', '呍' => 'yun', '喗' => 'yun', '囩' => 'yun', '夽' => 'yun', '奫' => 'yun', '妘' => 'yun', '孕' => 'yun', '恽' => 'yun', '惲' => 'yun', '愠' => 'yun', '愪' => 'yun', '慍' => 'yun', '抎' => 'yun', '抣' => 'yun', '昀' => 'yun', '晕' => 'yun', '暈' => 'yun', '枟' => 'yun', '橒' => 'yun', '殒' => 'yun', '殞' => 'yun', '氲' => 'yun', '氳' => 'yun', '沄' => 'yun', '涢' => 'yun', '溳' => 'yun', '澐' => 'yun', '煴' => 'yun', '熅' => 'yun', '熉' => 'yun', '熨' => 'yun', '狁' => 'yun', '玧' => 'yun', '畇' => 'yun', '眃' => 'yun', '磒' => 'yun', '秐' => 'yun', '筼' => 'yun', '篔' => 'yun', '紜' => 'yun', '緼' => 'yun', '縕' => 'yun', '縜' => 'yun', '繧' => 'yun', '纭' => 'yun', '缊' => 'yun', '耘' => 'yun', '耺' => 'yun', '腪' => 'yun', '芸' => 'yun', '荺' => 'yun', '蒀' => 'yun', '蒕' => 'yun', '蒷' => 'yun', '蕓' => 'yun', '蕰' => 'yun', '蕴' => 'yun', '薀' => 'yun', '藴' => 'yun', '蘊' => 'yun', '蝹' => 'yun', '褞' => 'yun', '賱' => 'yun', '贇' => 'yun', '赟' => 'yun', '运' => 'yun', '運' => 'yun', '郓' => 'yun', '郧' => 'yun', '鄆' => 'yun', '鄖' => 'yun', '酝' => 'yun', '醖' => 'yun', '醞' => 'yun', '鈗' => 'yun', '鋆' => 'yun', '阭' => 'yun', '陨' => 'yun', '隕' => 'yun', '雲' => 'yun', '霣' => 'yun', '韗' => 'yun', '韞' => 'yun', '韫' => 'yun', '韵' => 'yun', '韻' => 'yun', '頵' => 'yun', '餫' => 'yun', '馧' => 'yun', '馻' => 'yun', '齫' => 'yun', '齳' => 'yun', '㚃' => 'yun', '㚺' => 'yun', '㜏' => 'yun', '㞌' => 'yun', '㟦' => 'yun', '䆬' => 'yun', '䇖' => 'yun', '䉙' => 'yun', '䚋' => 'yun', '䞫' => 'yun', '䡝' => 'yun', '䢵' => 'yun', '䤞' => 'yun', '䦾' => 'yun', '䨶' => 'yun', '䩵' => 'yun', '䪳' => 'yun', '䲰' => 'yun', '䵴' => 'yun',
+ '亗' => 'sui', '倠' => 'sui', '哸' => 'sui', '埣' => 'sui', '夊' => 'sui', '嬘' => 'sui', '岁' => 'sui', '嵗' => 'sui', '旞' => 'sui', '檖' => 'sui', '歲' => 'sui', '歳' => 'sui', '浽' => 'sui', '滖' => 'sui', '澻' => 'sui', '濉' => 'sui', '瀡' => 'sui', '煫' => 'sui', '熣' => 'sui', '燧' => 'sui', '璲' => 'sui', '瓍' => 'sui', '眭' => 'sui', '睟' => 'sui', '睢' => 'sui', '砕' => 'sui', '碎' => 'sui', '祟' => 'sui', '禭' => 'sui', '穂' => 'sui', '穗' => 'sui', '穟' => 'sui', '粋' => 'sui', '綏' => 'sui', '繀' => 'sui', '繐' => 'sui', '繸' => 'sui', '绥' => 'sui', '脺' => 'sui', '膸' => 'sui', '芕' => 'sui', '荽' => 'sui', '荾' => 'sui', '葰' => 'sui', '虽' => 'sui', '襚' => 'sui', '誶' => 'sui', '譢' => 'sui', '谇' => 'sui', '賥' => 'sui', '遀' => 'sui', '遂' => 'sui', '邃' => 'sui', '鐆' => 'sui', '鐩' => 'sui', '隋' => 'sui', '随' => 'sui', '隧' => 'sui', '隨' => 'sui', '雖' => 'sui', '鞖' => 'sui', '髄' => 'sui', '髓' => 'sui', '㒸' => 'sui', '㞸' => 'sui', '㴚' => 'sui', '㵦' => 'sui', '㻟' => 'sui', '㻪' => 'sui', '㻽' => 'sui', '䅗' => 'sui', '䉌' => 'sui', '䍁' => 'sui', '䔹' => 'sui', '䜔' => 'sui', '䠔' => 'sui', '䡵' => 'sui', '䢫' => 'sui', '䥙' => 'sui', '䭉' => 'sui', '䯝' => 'sui',
+ '亘' => 'gen', '哏' => 'gen', '揯' => 'gen', '搄' => 'gen', '根' => 'gen', '艮' => 'gen', '茛' => 'gen', '跟' => 'gen', '㫔' => 'gen', '㮓' => 'gen', '䫀' => 'gen',
+ '亙' => 'geng', '刯' => 'geng', '哽' => 'geng', '啹' => 'geng', '喼' => 'geng', '嗰' => 'geng', '埂' => 'geng', '堩' => 'geng', '峺' => 'geng', '庚' => 'geng', '挭' => 'geng', '掶' => 'geng', '更' => 'geng', '梗' => 'geng', '椩' => 'geng', '浭' => 'geng', '焿' => 'geng', '畊' => 'geng', '絚' => 'geng', '綆' => 'geng', '緪' => 'geng', '縆' => 'geng', '绠' => 'geng', '羮' => 'geng', '羹' => 'geng', '耕' => 'geng', '耿' => 'geng', '莄' => 'geng', '菮' => 'geng', '賡' => 'geng', '赓' => 'geng', '郠' => 'geng', '骾' => 'geng', '鯁' => 'geng', '鲠' => 'geng', '鶊' => 'geng', '鹒' => 'geng', '㾘' => 'geng', '䋁' => 'geng', '䌄' => 'geng', '䱍' => 'geng', '䱎' => 'geng', '䱭' => 'geng', '䱴' => 'geng',
+ '些' => 'xie', '亵' => 'xie', '伳' => 'xie', '偕' => 'xie', '偰' => 'xie', '僁' => 'xie', '写' => 'xie', '冩' => 'xie', '劦' => 'xie', '勰' => 'xie', '协' => 'xie', '協' => 'xie', '卨' => 'xie', '卸' => 'xie', '嗋' => 'xie', '噧' => 'xie', '垥' => 'xie', '塮' => 'xie', '夑' => 'xie', '奊' => 'xie', '娎' => 'xie', '媟' => 'xie', '寫' => 'xie', '屑' => 'xie', '屓' => 'xie', '屟' => 'xie', '屧' => 'xie', '屭' => 'xie', '峫' => 'xie', '嶰' => 'xie', '廨' => 'xie', '徢' => 'xie', '恊' => 'xie', '愶' => 'xie', '懈' => 'xie', '拹' => 'xie', '挟' => 'xie', '挾' => 'xie', '揳' => 'xie', '携' => 'xie', '撷' => 'xie', '擕' => 'xie', '擷' => 'xie', '攜' => 'xie', '斜' => 'xie', '旪' => 'xie', '暬' => 'xie', '械' => 'xie', '楔' => 'xie', '榍' => 'xie', '榭' => 'xie', '歇' => 'xie', '泄' => 'xie', '泻' => 'xie', '洩' => 'xie', '渫' => 'xie', '澥' => 'xie', '瀉' => 'xie', '瀣' => 'xie', '灺' => 'xie', '炧' => 'xie', '炨' => 'xie', '焎' => 'xie', '熁' => 'xie', '燮' => 'xie', '燲' => 'xie', '爕' => 'xie', '猲' => 'xie', '獬' => 'xie', '瑎' => 'xie', '祄' => 'xie', '禼' => 'xie', '糏' => 'xie', '紲' => 'xie', '絏' => 'xie', '絜' => 'xie', '絬' => 'xie', '綊' => 'xie', '緤' => 'xie', '緳' => 'xie', '纈' => 'xie', '绁' => 'xie', '缬' => 'xie', '缷' => 'xie', '翓' => 'xie', '胁' => 'xie', '脅' => 'xie', '脇' => 'xie', '脋' => 'xie', '膎' => 'xie', '薢' => 'xie', '薤' => 'xie', '藛' => 'xie', '蝎' => 'xie', '蝢' => 'xie', '蟹' => 'xie', '蠍' => 'xie', '蠏' => 'xie', '衺' => 'xie', '褉' => 'xie', '褻' => 'xie', '襭' => 'xie', '諧' => 'xie', '謝' => 'xie', '讗' => 'xie', '谐' => 'xie', '谢' => 'xie', '躞' => 'xie', '躠' => 'xie', '邂' => 'xie', '邪' => 'xie', '鐷' => 'xie', '鞋' => 'xie', '鞢' => 'xie', '鞵' => 'xie', '韰' => 'xie', '齂' => 'xie', '齘' => 'xie', '齥' => 'xie', '龤' => 'xie', '㒠' => 'xie', '㓔' => 'xie', '㔎' => 'xie', '㕐' => 'xie', '㖑' => 'xie', '㖿' => 'xie', '㙝' => 'xie', '㙰' => 'xie', '㝍' => 'xie', '㞕' => 'xie', '㣯' => 'xie', '㣰' => 'xie', '㥟' => 'xie', '㦪' => 'xie', '㨙' => 'xie', '㨝' => 'xie', '㩉' => 'xie', '㩦' => 'xie', '㩪' => 'xie', '㭨' => 'xie', '㰔' => 'xie', '㰡' => 'xie', '㳦' => 'xie', '㳿' => 'xie', '㴬' => 'xie', '㴮' => 'xie', '㴽' => 'xie', '㸉' => 'xie', '㽊' => 'xie', '䉏' => 'xie', '䉣' => 'xie', '䊝' => 'xie', '䔑' => 'xie', '䕈' => 'xie', '䕵' => 'xie', '䙊' => 'xie', '䙎' => 'xie', '䙝' => 'xie', '䚳' => 'xie', '䚸' => 'xie', '䡡' => 'xie', '䢡' => 'xie', '䥱' => 'xie', '䥾' => 'xie', '䦏' => 'xie', '䦑' => 'xie', '䩧' => 'xie', '䭎' => 'xie', '䲒' => 'xie', '䵦' => 'xie',
+ '亠' => 'tou', '偷' => 'tou', '偸' => 'tou', '头' => 'tou', '妵' => 'tou', '婾' => 'tou', '媮' => 'tou', '投' => 'tou', '敨' => 'tou', '斢' => 'tou', '殕' => 'tou', '紏' => 'tou', '緰' => 'tou', '蘣' => 'tou', '透' => 'tou', '鍮' => 'tou', '頭' => 'tou', '骰' => 'tou', '黈' => 'tou', '㓱' => 'tou', '㖣' => 'tou', '㡏' => 'tou', '㢏' => 'tou', '㪗' => 'tou', '䞬' => 'tou', '䟝' => 'tou', '䱏' => 'tou', '䵉' => 'tou',
+ '亡' => 'wang', '亾' => 'wang', '仼' => 'wang', '兦' => 'wang', '妄' => 'wang', '尣' => 'wang', '尩' => 'wang', '尪' => 'wang', '尫' => 'wang', '彺' => 'wang', '往' => 'wang', '徃' => 'wang', '忘' => 'wang', '忹' => 'wang', '惘' => 'wang', '旺' => 'wang', '暀' => 'wang', '望' => 'wang', '朢' => 'wang', '枉' => 'wang', '棢' => 'wang', '汪' => 'wang', '瀇' => 'wang', '焹' => 'wang', '王' => 'wang', '盳' => 'wang', '網' => 'wang', '网' => 'wang', '罔' => 'wang', '莣' => 'wang', '菵' => 'wang', '蚟' => 'wang', '蛧' => 'wang', '蝄' => 'wang', '誷' => 'wang', '輞' => 'wang', '辋' => 'wang', '迋' => 'wang', '魍' => 'wang', '㑌' => 'wang', '㓁' => 'wang', '㲿' => 'wang', '㳹' => 'wang', '㴏' => 'wang', '䋄' => 'wang', '䋞' => 'wang', '䛃' => 'wang', '䤑' => 'wang', '䰣' => 'wang',
+ '亢' => 'kang', '伉' => 'kang', '匟' => 'kang', '囥' => 'kang', '嫝' => 'kang', '嵻' => 'kang', '康' => 'kang', '忼' => 'kang', '慷' => 'kang', '扛' => 'kang', '抗' => 'kang', '摃' => 'kang', '槺' => 'kang', '漮' => 'kang', '炕' => 'kang', '犺' => 'kang', '砊' => 'kang', '穅' => 'kang', '粇' => 'kang', '糠' => 'kang', '躿' => 'kang', '邟' => 'kang', '鈧' => 'kang', '鏮' => 'kang', '钪' => 'kang', '閌' => 'kang', '闶' => 'kang', '鱇' => 'kang', '㰠' => 'kang', '䡉' => 'kang',
+ '亣' => 'da', '剳' => 'da', '匒' => 'da', '呾' => 'da', '咑' => 'da', '哒' => 'da', '嗒' => 'da', '噠' => 'da', '垯' => 'da', '墶' => 'da', '大' => 'da', '妲' => 'da', '怛' => 'da', '打' => 'da', '搭' => 'da', '撘' => 'da', '橽' => 'da', '沓' => 'da', '溚' => 'da', '炟' => 'da', '燵' => 'da', '畣' => 'da', '瘩' => 'da', '眔' => 'da', '笪' => 'da', '答' => 'da', '繨' => 'da', '羍' => 'da', '耷' => 'da', '荅' => 'da', '荙' => 'da', '薘' => 'da', '蟽' => 'da', '褡' => 'da', '詚' => 'da', '跶' => 'da', '躂' => 'da', '达' => 'da', '迏' => 'da', '迖' => 'da', '逹' => 'da', '達' => 'da', '鎉' => 'da', '鎝' => 'da', '鐽' => 'da', '靼' => 'da', '鞑' => 'da', '韃' => 'da', '龖' => 'da', '龘' => 'da', '㙮' => 'da', '㜓' => 'da', '㟷' => 'da', '㯚' => 'da', '㾑' => 'da', '㿯' => 'da', '䃮' => 'da', '䐊' => 'da', '䑽' => 'da', '䩢' => 'da', '䳴' => 'da', '䵣' => 'da',
+ '交' => 'jiao', '佼' => 'jiao', '侥' => 'jiao', '僥' => 'jiao', '僬' => 'jiao', '儌' => 'jiao', '剿' => 'jiao', '劋' => 'jiao', '勦' => 'jiao', '叫' => 'jiao', '呌' => 'jiao', '嘂' => 'jiao', '嘄' => 'jiao', '嘦' => 'jiao', '噍' => 'jiao', '噭' => 'jiao', '嚼' => 'jiao', '姣' => 'jiao', '娇' => 'jiao', '嬌' => 'jiao', '嬓' => 'jiao', '孂' => 'jiao', '峤' => 'jiao', '峧' => 'jiao', '嶕' => 'jiao', '嶠' => 'jiao', '嶣' => 'jiao', '徼' => 'jiao', '憍' => 'jiao', '挍' => 'jiao', '挢' => 'jiao', '捁' => 'jiao', '搅' => 'jiao', '摷' => 'jiao', '撟' => 'jiao', '撹' => 'jiao', '攪' => 'jiao', '敎' => 'jiao', '教' => 'jiao', '敫' => 'jiao', '敽' => 'jiao', '敿' => 'jiao', '斠' => 'jiao', '晈' => 'jiao', '暞' => 'jiao', '曒' => 'jiao', '椒' => 'jiao', '櫵' => 'jiao', '浇' => 'jiao', '湫' => 'jiao', '湬' => 'jiao', '滘' => 'jiao', '漖' => 'jiao', '潐' => 'jiao', '澆' => 'jiao', '灚' => 'jiao', '烄' => 'jiao', '焦' => 'jiao', '焳' => 'jiao', '煍' => 'jiao', '燋' => 'jiao', '狡' => 'jiao', '獥' => 'jiao', '珓' => 'jiao', '璬' => 'jiao', '皎' => 'jiao', '皦' => 'jiao', '皭' => 'jiao', '矫' => 'jiao', '矯' => 'jiao', '礁' => 'jiao', '穚' => 'jiao', '窌' => 'jiao', '窖' => 'jiao', '笅' => 'jiao', '筊' => 'jiao', '簥' => 'jiao', '絞' => 'jiao', '繳' => 'jiao', '纐' => 'jiao', '绞' => 'jiao', '缴' => 'jiao', '胶' => 'jiao', '脚' => 'jiao', '腳' => 'jiao', '膠' => 'jiao', '膲' => 'jiao', '臫' => 'jiao', '艽' => 'jiao', '芁' => 'jiao', '茭' => 'jiao', '茮' => 'jiao', '蕉' => 'jiao', '藠' => 'jiao', '虠' => 'jiao', '蛟' => 'jiao', '蟜' => 'jiao', '蟭' => 'jiao', '角' => 'jiao', '訆' => 'jiao', '譑' => 'jiao', '譥' => 'jiao', '賋' => 'jiao', '趭' => 'jiao', '跤' => 'jiao', '踋' => 'jiao', '較' => 'jiao', '轇' => 'jiao', '轎' => 'jiao', '轿' => 'jiao', '较' => 'jiao', '郊' => 'jiao', '酵' => 'jiao', '醮' => 'jiao', '釂' => 'jiao', '鉸' => 'jiao', '鐎' => 'jiao', '铰' => 'jiao', '餃' => 'jiao', '饺' => 'jiao', '驕' => 'jiao', '骄' => 'jiao', '鮫' => 'jiao', '鱎' => 'jiao', '鲛' => 'jiao', '鵁' => 'jiao', '鵤' => 'jiao', '鷦' => 'jiao', '鷮' => 'jiao', '鹪' => 'jiao', '㠐' => 'jiao', '㩰' => 'jiao', '㬭' => 'jiao', '㭂' => 'jiao', '㰾' => 'jiao', '㳅' => 'jiao', '㽱' => 'jiao', '㽲' => 'jiao', '䀊' => 'jiao', '䁶' => 'jiao', '䂃' => 'jiao', '䆗' => 'jiao', '䘨' => 'jiao', '䚩' => 'jiao', '䠛' => 'jiao', '䣤' => 'jiao', '䥞' => 'jiao', '䪒' => 'jiao', '䴔' => 'jiao', '䴛' => 'jiao',
+ '亨' => 'heng', '哼' => 'heng', '啈' => 'heng', '囍' => 'heng', '堼' => 'heng', '姮' => 'heng', '恆' => 'heng', '恒' => 'heng', '悙' => 'heng', '桁' => 'heng', '横' => 'heng', '橫' => 'heng', '涥' => 'heng', '烆' => 'heng', '珩' => 'heng', '胻' => 'heng', '脝' => 'heng', '蘅' => 'heng', '衡' => 'heng', '鑅' => 'heng', '鴴' => 'heng', '鵆' => 'heng', '鸻' => 'heng', '㔰' => 'heng', '㶇' => 'heng', '䄓' => 'heng', '䒛' => 'heng', '䬖' => 'heng', '䬝' => 'heng', '䯒' => 'heng',
+ '亲' => 'qin', '侵' => 'qin', '勤' => 'qin', '吢' => 'qin', '吣' => 'qin', '唚' => 'qin', '嗪' => 'qin', '噙' => 'qin', '坅' => 'qin', '埁' => 'qin', '媇' => 'qin', '嫀' => 'qin', '寑' => 'qin', '寝' => 'qin', '寢' => 'qin', '寴' => 'qin', '嵚' => 'qin', '嶔' => 'qin', '庈' => 'qin', '懃' => 'qin', '懄' => 'qin', '抋' => 'qin', '捦' => 'qin', '揿' => 'qin', '搇' => 'qin', '撳' => 'qin', '擒' => 'qin', '斳' => 'qin', '昑' => 'qin', '梫' => 'qin', '檎' => 'qin', '欽' => 'qin', '沁' => 'qin', '溱' => 'qin', '澿' => 'qin', '瀙' => 'qin', '珡' => 'qin', '琴' => 'qin', '琹' => 'qin', '瘽' => 'qin', '矝' => 'qin', '禽' => 'qin', '秦' => 'qin', '笉' => 'qin', '綅' => 'qin', '耹' => 'qin', '芩' => 'qin', '芹' => 'qin', '菣' => 'qin', '菦' => 'qin', '菳' => 'qin', '藽' => 'qin', '蚙' => 'qin', '螓' => 'qin', '螼' => 'qin', '蠄' => 'qin', '衾' => 'qin', '親' => 'qin', '誛' => 'qin', '赺' => 'qin', '赾' => 'qin', '鈙' => 'qin', '鋟' => 'qin', '钦' => 'qin', '锓' => 'qin', '雂' => 'qin', '靲' => 'qin', '顉' => 'qin', '駸' => 'qin', '骎' => 'qin', '鮼' => 'qin', '鳹' => 'qin', '㝲' => 'qin', '㞬' => 'qin', '㢙' => 'qin', '㤈' => 'qin', '㩒' => 'qin', '㪁' => 'qin', '㮗' => 'qin', '㾛' => 'qin', '䈜' => 'qin', '䔷' => 'qin', '䖌' => 'qin', '䠴' => 'qin', '䦦' => 'qin',
+ '亳' => 'bo', '仢' => 'bo', '伯' => 'bo', '侼' => 'bo', '僠' => 'bo', '僰' => 'bo', '勃' => 'bo', '博' => 'bo', '卜' => 'bo', '啵' => 'bo', '嚗' => 'bo', '壆' => 'bo', '孛' => 'bo', '孹' => 'bo', '嶓' => 'bo', '帛' => 'bo', '愽' => 'bo', '懪' => 'bo', '拨' => 'bo', '挬' => 'bo', '捕' => 'bo', '搏' => 'bo', '撥' => 'bo', '播' => 'bo', '擘' => 'bo', '柭' => 'bo', '桲' => 'bo', '檗' => 'bo', '欂' => 'bo', '泊' => 'bo', '波' => 'bo', '浡' => 'bo', '淿' => 'bo', '渤' => 'bo', '湐' => 'bo', '煿' => 'bo', '牔' => 'bo', '犦' => 'bo', '犻' => 'bo', '狛' => 'bo', '猼' => 'bo', '玻' => 'bo', '瓝' => 'bo', '瓟' => 'bo', '癶' => 'bo', '癷' => 'bo', '盋' => 'bo', '砵' => 'bo', '碆' => 'bo', '磻' => 'bo', '礡' => 'bo', '礴' => 'bo', '秡' => 'bo', '箔' => 'bo', '箥' => 'bo', '簙' => 'bo', '簸' => 'bo', '糪' => 'bo', '紴' => 'bo', '缽' => 'bo', '胉' => 'bo', '脖' => 'bo', '膊' => 'bo', '舶' => 'bo', '艊' => 'bo', '苩' => 'bo', '菠' => 'bo', '葧' => 'bo', '蔔' => 'bo', '蘗' => 'bo', '蚾' => 'bo', '袚' => 'bo', '袯' => 'bo', '袰' => 'bo', '襏' => 'bo', '襮' => 'bo', '譒' => 'bo', '豰' => 'bo', '跛' => 'bo', '踣' => 'bo', '蹳' => 'bo', '郣' => 'bo', '鈸' => 'bo', '鉑' => 'bo', '鉢' => 'bo', '鋍' => 'bo', '鎛' => 'bo', '鑮' => 'bo', '钵' => 'bo', '钹' => 'bo', '铂' => 'bo', '镈' => 'bo', '餑' => 'bo', '餺' => 'bo', '饽' => 'bo', '馎' => 'bo', '馛' => 'bo', '馞' => 'bo', '駁' => 'bo', '駮' => 'bo', '驋' => 'bo', '驳' => 'bo', '髆' => 'bo', '髉' => 'bo', '鮊' => 'bo', '鱍' => 'bo', '鲌' => 'bo', '鵓' => 'bo', '鹁' => 'bo', '㖕' => 'bo', '㗘' => 'bo', '㝿' => 'bo', '㟑' => 'bo', '㧳' => 'bo', '㩧' => 'bo', '㩭' => 'bo', '㪍' => 'bo', '㬍' => 'bo', '㬧' => 'bo', '㱟' => 'bo', '㴾' => 'bo', '㶿' => 'bo', '㹀' => 'bo', '䂍' => 'bo', '䊿' => 'bo', '䍨' => 'bo', '䍸' => 'bo', '䑈' => 'bo', '䒄' => 'bo', '䗚' => 'bo', '䙏' => 'bo', '䞳' => 'bo', '䟛' => 'bo', '䢌' => 'bo', '䥬' => 'bo', '䪇' => 'bo', '䪬' => 'bo', '䫊' => 'bo', '䬪' => 'bo', '䭦' => 'bo', '䭯' => 'bo', '䮀' => 'bo', '䮂' => 'bo', '䯋' => 'bo', '䰊' => 'bo', '䶈' => 'bo',
+ '亷' => 'lian', '僆' => 'lian', '劆' => 'lian', '匲' => 'lian', '匳' => 'lian', '嗹' => 'lian', '噒' => 'lian', '堜' => 'lian', '奁' => 'lian', '奩' => 'lian', '娈' => 'lian', '媡' => 'lian', '嫾' => 'lian', '嬚' => 'lian', '帘' => 'lian', '廉' => 'lian', '怜' => 'lian', '恋' => 'lian', '慩' => 'lian', '憐' => 'lian', '戀' => 'lian', '摙' => 'lian', '敛' => 'lian', '斂' => 'lian', '梿' => 'lian', '楝' => 'lian', '槤' => 'lian', '櫣' => 'lian', '歛' => 'lian', '殓' => 'lian', '殮' => 'lian', '浰' => 'lian', '涟' => 'lian', '湅' => 'lian', '溓' => 'lian', '漣' => 'lian', '潋' => 'lian', '澰' => 'lian', '濂' => 'lian', '濓' => 'lian', '瀲' => 'lian', '炼' => 'lian', '煉' => 'lian', '熑' => 'lian', '燫' => 'lian', '琏' => 'lian', '瑓' => 'lian', '璉' => 'lian', '磏' => 'lian', '稴' => 'lian', '簾' => 'lian', '籢' => 'lian', '籨' => 'lian', '練' => 'lian', '縺' => 'lian', '纞' => 'lian', '练' => 'lian', '羷' => 'lian', '翴' => 'lian', '联' => 'lian', '聨' => 'lian', '聫' => 'lian', '聮' => 'lian', '聯' => 'lian', '脸' => 'lian', '臁' => 'lian', '臉' => 'lian', '莲' => 'lian', '萰' => 'lian', '蓮' => 'lian', '蔹' => 'lian', '薕' => 'lian', '蘝' => 'lian', '蘞' => 'lian', '螊' => 'lian', '蠊' => 'lian', '裢' => 'lian', '裣' => 'lian', '褳' => 'lian', '襝' => 'lian', '覝' => 'lian', '謰' => 'lian', '譧' => 'lian', '蹥' => 'lian', '连' => 'lian', '連' => 'lian', '鄻' => 'lian', '錬' => 'lian', '鍊' => 'lian', '鎌' => 'lian', '鏈' => 'lian', '鐮' => 'lian', '链' => 'lian', '镰' => 'lian', '鬑' => 'lian', '鰊' => 'lian', '鰱' => 'lian', '鲢' => 'lian', '㓎' => 'lian', '㜃' => 'lian', '㜕' => 'lian', '㜻' => 'lian', '㝺' => 'lian', '㟀' => 'lian', '㡘' => 'lian', '㢘' => 'lian', '㥕' => 'lian', '㦁' => 'lian', '㦑' => 'lian', '㪘' => 'lian', '㪝' => 'lian', '㯬' => 'lian', '㰈' => 'lian', '㰸' => 'lian', '㱨' => 'lian', '㶌' => 'lian', '㶑' => 'lian', '㺦' => 'lian', '㼑' => 'lian', '㼓' => 'lian', '㾾' => 'lian', '䁠' => 'lian', '䃛' => 'lian', '䆂' => 'lian', '䇜' => 'lian', '䌞' => 'lian', '䏈' => 'lian', '䙺' => 'lian', '䥥' => 'lian', '䨬' => 'lian', '䭑' => 'lian',
+ '亸' => 'duo', '仛' => 'duo', '凙' => 'duo', '刴' => 'duo', '剁' => 'duo', '剟' => 'duo', '剫' => 'duo', '咄' => 'duo', '哆' => 'duo', '哚' => 'duo', '喥' => 'duo', '嚉' => 'duo', '嚲' => 'duo', '垛' => 'duo', '垜' => 'duo', '埵' => 'duo', '堕' => 'duo', '墮' => 'duo', '墯' => 'duo', '多' => 'duo', '夛' => 'duo', '夺' => 'duo', '奪' => 'duo', '尮' => 'duo', '崜' => 'duo', '嶞' => 'duo', '惰' => 'duo', '憜' => 'duo', '挅' => 'duo', '挆' => 'duo', '掇' => 'duo', '敓' => 'duo', '敚' => 'duo', '敠' => 'duo', '敪' => 'duo', '朵' => 'duo', '朶' => 'duo', '柮' => 'duo', '桗' => 'duo', '椯' => 'duo', '毲' => 'duo', '沲' => 'duo', '痥' => 'duo', '綞' => 'duo', '缍' => 'duo', '舵' => 'duo', '茤' => 'duo', '裰' => 'duo', '趓' => 'duo', '跢' => 'duo', '跥' => 'duo', '跺' => 'duo', '踱' => 'duo', '躱' => 'duo', '躲' => 'duo', '軃' => 'duo', '鈬' => 'duo', '鐸' => 'duo', '铎' => 'duo', '陊' => 'duo', '陏' => 'duo', '飿' => 'duo', '饳' => 'duo', '鬌' => 'duo', '鮵' => 'duo', '鵽' => 'duo', '㔍' => 'duo', '㖼' => 'duo', '㙐' => 'duo', '㛆' => 'duo', '㛊' => 'duo', '㣞' => 'duo', '㥩' => 'duo', '㧷' => 'duo', '㻔' => 'duo', '㻧' => 'duo', '䅜' => 'duo', '䍴' => 'duo', '䐾' => 'duo', '䑨' => 'duo', '䒳' => 'duo', '䙃' => 'duo', '䙟' => 'duo', '䙤' => 'duo', '䠤' => 'duo', '䤪' => 'duo', '䤻' => 'duo', '䩔' => 'duo', '䩣' => 'duo', '䫂' => 'duo', '䯬' => 'duo',
+ '人' => 'ren', '亻' => 'ren', '仁' => 'ren', '仞' => 'ren', '仭' => 'ren', '任' => 'ren', '刃' => 'ren', '刄' => 'ren', '壬' => 'ren', '妊' => 'ren', '姙' => 'ren', '屻' => 'ren', '忈' => 'ren', '忍' => 'ren', '忎' => 'ren', '恁' => 'ren', '扨' => 'ren', '朲' => 'ren', '杒' => 'ren', '栠' => 'ren', '栣' => 'ren', '梕' => 'ren', '棯' => 'ren', '牣' => 'ren', '秂' => 'ren', '秹' => 'ren', '稔' => 'ren', '紉' => 'ren', '紝' => 'ren', '絍' => 'ren', '綛' => 'ren', '纫' => 'ren', '纴' => 'ren', '肕' => 'ren', '腍' => 'ren', '芢' => 'ren', '荏' => 'ren', '荵' => 'ren', '葚' => 'ren', '衽' => 'ren', '袵' => 'ren', '訒' => 'ren', '認' => 'ren', '认' => 'ren', '讱' => 'ren', '躵' => 'ren', '軔' => 'ren', '轫' => 'ren', '鈓' => 'ren', '銋' => 'ren', '靭' => 'ren', '靱' => 'ren', '韌' => 'ren', '韧' => 'ren', '飪' => 'ren', '餁' => 'ren', '饪' => 'ren', '魜' => 'ren', '鵀' => 'ren', '㠴' => 'ren', '㣼' => 'ren', '㶵' => 'ren', '㸾' => 'ren', '䀼' => 'ren', '䇮' => 'ren', '䋕' => 'ren', '䌾' => 'ren', '䏕' => 'ren', '䏰' => 'ren', '䭃' => 'ren', '䴦' => 'ren',
+ '亽' => 'ra', '囕' => 'ra', '罖' => 'ra',
+ '仄' => 'ze', '伬' => 'ze', '则' => 'ze', '則' => 'ze', '唶' => 'ze', '啧' => 'ze', '啫' => 'ze', '嘖' => 'ze', '夨' => 'ze', '嫧' => 'ze', '崱' => 'ze', '帻' => 'ze', '幘' => 'ze', '庂' => 'ze', '択' => 'ze', '择' => 'ze', '捑' => 'ze', '擇' => 'ze', '昃' => 'ze', '昗' => 'ze', '樍' => 'ze', '歵' => 'ze', '汄' => 'ze', '沢' => 'ze', '泎' => 'ze', '泽' => 'ze', '溭' => 'ze', '澤' => 'ze', '皟' => 'ze', '瞔' => 'ze', '矠' => 'ze', '礋' => 'ze', '稄' => 'ze', '笮' => 'ze', '箦' => 'ze', '簀' => 'ze', '耫' => 'ze', '舴' => 'ze', '蔶' => 'ze', '蠌' => 'ze', '襗' => 'ze', '諎' => 'ze', '謮' => 'ze', '責' => 'ze', '賾' => 'ze', '责' => 'ze', '赜' => 'ze', '迮' => 'ze', '鸅' => 'ze', '齚' => 'ze', '齰' => 'ze', '㖽' => 'ze', '㣱' => 'ze', '㳁' => 'ze', '㳻' => 'ze', '䃎' => 'ze', '䇥' => 'ze', '䕉' => 'ze', '䕪' => 'ze', '䰹' => 'ze', '䶦' => 'ze',
+ '仅' => 'jin', '今' => 'jin', '伒' => 'jin', '侭' => 'jin', '僅' => 'jin', '僸' => 'jin', '儘' => 'jin', '兓' => 'jin', '凚' => 'jin', '劤' => 'jin', '劲' => 'jin', '勁' => 'jin', '卺' => 'jin', '厪' => 'jin', '噤' => 'jin', '嚍' => 'jin', '埐' => 'jin', '堇' => 'jin', '堻' => 'jin', '墐' => 'jin', '壗' => 'jin', '妗' => 'jin', '嫤' => 'jin', '嬧' => 'jin', '寖' => 'jin', '尽' => 'jin', '嶜' => 'jin', '巹' => 'jin', '巾' => 'jin', '廑' => 'jin', '惍' => 'jin', '慬' => 'jin', '搢' => 'jin', '斤' => 'jin', '晉' => 'jin', '晋' => 'jin', '枃' => 'jin', '槿' => 'jin', '歏' => 'jin', '殣' => 'jin', '津' => 'jin', '浕' => 'jin', '浸' => 'jin', '溍' => 'jin', '漌' => 'jin', '濅' => 'jin', '濜' => 'jin', '烬' => 'jin', '煡' => 'jin', '燼' => 'jin', '珒' => 'jin', '琎' => 'jin', '琻' => 'jin', '瑨' => 'jin', '瑾' => 'jin', '璡' => 'jin', '璶' => 'jin', '盡' => 'jin', '矜' => 'jin', '砛' => 'jin', '祲' => 'jin', '禁' => 'jin', '筋' => 'jin', '紟' => 'jin', '紧' => 'jin', '緊' => 'jin', '縉' => 'jin', '缙' => 'jin', '荕' => 'jin', '荩' => 'jin', '菫' => 'jin', '蓳' => 'jin', '藎' => 'jin', '衿' => 'jin', '襟' => 'jin', '覲' => 'jin', '觐' => 'jin', '觔' => 'jin', '謹' => 'jin', '谨' => 'jin', '賮' => 'jin', '贐' => 'jin', '赆' => 'jin', '近' => 'jin', '进' => 'jin', '進' => 'jin', '金' => 'jin', '釒' => 'jin', '錦' => 'jin', '钅' => 'jin', '锦' => 'jin', '靳' => 'jin', '饉' => 'jin', '馑' => 'jin', '鹶' => 'jin', '黅' => 'jin', '齽' => 'jin', '㝻' => 'jin', '㨷' => 'jin', '㬐' => 'jin', '㬜' => 'jin', '㯲' => 'jin', '㯸' => 'jin', '㰹' => 'jin', '㱈' => 'jin', '㴆' => 'jin', '㶦' => 'jin', '㶳' => 'jin', '㹏' => 'jin', '䀆' => 'jin', '䆮' => 'jin', '䋮' => 'jin', '䌝' => 'jin', '䐶' => 'jin', '䑤' => 'jin', '䒺' => 'jin', '䖐' => 'jin', '䗯' => 'jin', '䝲' => 'jin', '䤐' => 'jin', '䥆' => 'jin', '䫴' => 'jin', '䭙' => 'jin', '䶖' => 'jin',
+ '仆' => 'pu', '僕' => 'pu', '匍' => 'pu', '噗' => 'pu', '圃' => 'pu', '圑' => 'pu', '圤' => 'pu', '埔' => 'pu', '墣' => 'pu', '巬' => 'pu', '巭' => 'pu', '扑' => 'pu', '抪' => 'pu', '撲' => 'pu', '擈' => 'pu', '攴' => 'pu', '攵' => 'pu', '普' => 'pu', '暜' => 'pu', '曝' => 'pu', '朴' => 'pu', '柨' => 'pu', '樸' => 'pu', '檏' => 'pu', '氆' => 'pu', '浦' => 'pu', '溥' => 'pu', '潽' => 'pu', '濮' => 'pu', '瀑' => 'pu', '炇' => 'pu', '烳' => 'pu', '璞' => 'pu', '痡' => 'pu', '瞨' => 'pu', '穙' => 'pu', '纀' => 'pu', '舖' => 'pu', '舗' => 'pu', '莆' => 'pu', '菐' => 'pu', '菩' => 'pu', '葡' => 'pu', '蒱' => 'pu', '蒲' => 'pu', '諩' => 'pu', '譜' => 'pu', '谱' => 'pu', '贌' => 'pu', '蹼' => 'pu', '酺' => 'pu', '鋪' => 'pu', '鏷' => 'pu', '鐠' => 'pu', '铺' => 'pu', '镤' => 'pu', '镨' => 'pu', '陠' => 'pu', '駇' => 'pu', '鯆' => 'pu', '㒒' => 'pu', '㬥' => 'pu', '㯷' => 'pu', '㲫' => 'pu', '㹒' => 'pu', '㺪' => 'pu', '䈬' => 'pu', '䈻' => 'pu', '䑑' => 'pu', '䔕' => 'pu', '䗱' => 'pu', '䧤' => 'pu', '䲕' => 'pu', '䴆' => 'pu',
+ '仈' => 'ba', '八' => 'ba', '叐' => 'ba', '叭' => 'ba', '吧' => 'ba', '哵' => 'ba', '坝' => 'ba', '坺' => 'ba', '垻' => 'ba', '墢' => 'ba', '壩' => 'ba', '夿' => 'ba', '妭' => 'ba', '岜' => 'ba', '巴' => 'ba', '弝' => 'ba', '扒' => 'ba', '把' => 'ba', '抜' => 'ba', '拔' => 'ba', '捌' => 'ba', '朳' => 'ba', '欛' => 'ba', '灞' => 'ba', '炦' => 'ba', '爸' => 'ba', '犮' => 'ba', '玐' => 'ba', '疤' => 'ba', '癹' => 'ba', '矲' => 'ba', '笆' => 'ba', '粑' => 'ba', '紦' => 'ba', '罢' => 'ba', '罷' => 'ba', '羓' => 'ba', '耙' => 'ba', '胈' => 'ba', '芭' => 'ba', '茇' => 'ba', '菝' => 'ba', '蚆' => 'ba', '覇' => 'ba', '詙' => 'ba', '豝' => 'ba', '跁' => 'ba', '跋' => 'ba', '軷' => 'ba', '釛' => 'ba', '釟' => 'ba', '鈀' => 'ba', '钯' => 'ba', '霸' => 'ba', '靶' => 'ba', '颰' => 'ba', '魃' => 'ba', '魞' => 'ba', '鮁' => 'ba', '鲃' => 'ba', '鲅' => 'ba', '鼥' => 'ba', '㔜' => 'ba', '㖠' => 'ba', '㞎' => 'ba', '㧊' => 'ba', '㶚' => 'ba', '䃻' => 'ba', '䆉' => 'ba', '䇑' => 'ba', '䎬' => 'ba', '䟦' => 'ba', '䥯' => 'ba', '䩗' => 'ba', '䩻' => 'ba', '䰾' => 'ba', '䱝' => 'ba', '䳁' => 'ba', '䳊' => 'ba',
+ '仍' => 'reng', '扔' => 'reng', '礽' => 'reng', '芿' => 'reng', '辸' => 'reng', '陾' => 'reng', '㭁' => 'reng', '㺱' => 'reng', '䄧' => 'reng', '䚮' => 'reng',
+ '仏' => 'fo', '佛' => 'fo', '坲' => 'fo', '梻' => 'fo',
+ '仐' => 'tao', '匋' => 'tao', '咷' => 'tao', '啕' => 'tao', '夲' => 'tao', '套' => 'tao', '嫍' => 'tao', '幍' => 'tao', '弢' => 'tao', '慆' => 'tao', '掏' => 'tao', '搯' => 'tao', '桃' => 'tao', '梼' => 'tao', '槄' => 'tao', '檮' => 'tao', '洮' => 'tao', '涛' => 'tao', '淘' => 'tao', '滔' => 'tao', '濤' => 'tao', '瑫' => 'tao', '畓' => 'tao', '祹' => 'tao', '絛' => 'tao', '綯' => 'tao', '縚' => 'tao', '縧' => 'tao', '绦' => 'tao', '绹' => 'tao', '萄' => 'tao', '蜪' => 'tao', '裪' => 'tao', '討' => 'tao', '詜' => 'tao', '謟' => 'tao', '讨' => 'tao', '迯' => 'tao', '逃' => 'tao', '醄' => 'tao', '鋾' => 'tao', '錭' => 'tao', '陶' => 'tao', '鞀' => 'tao', '鞉' => 'tao', '鞱' => 'tao', '韜' => 'tao', '韬' => 'tao', '飸' => 'tao', '饀' => 'tao', '饕' => 'tao', '駣' => 'tao', '騊' => 'tao', '鼗' => 'tao', '㚐' => 'tao', '㹗' => 'tao', '䚯' => 'tao', '䚵' => 'tao', '䬞' => 'tao', '䵚' => 'tao',
+ '仑' => 'lun', '伦' => 'lun', '侖' => 'lun', '倫' => 'lun', '囵' => 'lun', '圇' => 'lun', '埨' => 'lun', '婨' => 'lun', '崘' => 'lun', '崙' => 'lun', '惀' => 'lun', '抡' => 'lun', '掄' => 'lun', '棆' => 'lun', '沦' => 'lun', '淪' => 'lun', '溣' => 'lun', '碖' => 'lun', '磮' => 'lun', '稐' => 'lun', '綸' => 'lun', '纶' => 'lun', '耣' => 'lun', '腀' => 'lun', '菕' => 'lun', '蜦' => 'lun', '論' => 'lun', '论' => 'lun', '踚' => 'lun', '輪' => 'lun', '轮' => 'lun', '錀' => 'lun', '陯' => 'lun', '鯩' => 'lun', '㖮' => 'lun', '㷍' => 'lun', '䈁' => 'lun', '䑳' => 'lun',
+ '仓' => 'cang', '仺' => 'cang', '伧' => 'cang', '倉' => 'cang', '傖' => 'cang', '凔' => 'cang', '匨' => 'cang', '嵢' => 'cang', '欌' => 'cang', '沧' => 'cang', '滄' => 'cang', '濸' => 'cang', '獊' => 'cang', '罉' => 'cang', '舱' => 'cang', '艙' => 'cang', '苍' => 'cang', '蒼' => 'cang', '蔵' => 'cang', '藏' => 'cang', '螥' => 'cang', '賶' => 'cang', '鑶' => 'cang', '鶬' => 'cang', '鸧' => 'cang', '㵴' => 'cang', '㶓' => 'cang', '䅮' => 'cang', '䢢' => 'cang',
+ '仔' => 'zi', '倳' => 'zi', '兹' => 'zi', '剚' => 'zi', '吇' => 'zi', '呰' => 'zi', '咨' => 'zi', '唨' => 'zi', '啙' => 'zi', '嗞' => 'zi', '姉' => 'zi', '姊' => 'zi', '姕' => 'zi', '姿' => 'zi', '子' => 'zi', '孖' => 'zi', '字' => 'zi', '孜' => 'zi', '孳' => 'zi', '孶' => 'zi', '崰' => 'zi', '嵫' => 'zi', '恣' => 'zi', '杍' => 'zi', '栥' => 'zi', '梓' => 'zi', '椔' => 'zi', '榟' => 'zi', '橴' => 'zi', '淄' => 'zi', '渍' => 'zi', '湽' => 'zi', '滋' => 'zi', '滓' => 'zi', '漬' => 'zi', '澬' => 'zi', '牸' => 'zi', '玆' => 'zi', '眥' => 'zi', '眦' => 'zi', '矷' => 'zi', '禌' => 'zi', '秄' => 'zi', '秭' => 'zi', '秶' => 'zi', '稵' => 'zi', '笫' => 'zi', '籽' => 'zi', '粢' => 'zi', '紎' => 'zi', '紫' => 'zi', '緇' => 'zi', '缁' => 'zi', '耔' => 'zi', '胏' => 'zi', '胔' => 'zi', '胾' => 'zi', '自' => 'zi', '芓' => 'zi', '茊' => 'zi', '茡' => 'zi', '茲' => 'zi', '葘' => 'zi', '虸' => 'zi', '觜' => 'zi', '訾' => 'zi', '訿' => 'zi', '諮' => 'zi', '谘' => 'zi', '貲' => 'zi', '資' => 'zi', '赀' => 'zi', '资' => 'zi', '赼' => 'zi', '趑' => 'zi', '趦' => 'zi', '輜' => 'zi', '輺' => 'zi', '辎' => 'zi', '鄑' => 'zi', '釨' => 'zi', '鈭' => 'zi', '錙' => 'zi', '鍿' => 'zi', '鎡' => 'zi', '锱' => 'zi', '镃' => 'zi', '頾' => 'zi', '頿' => 'zi', '髭' => 'zi', '鯔' => 'zi', '鰦' => 'zi', '鲻' => 'zi', '鶅' => 'zi', '鼒' => 'zi', '齍' => 'zi', '齜' => 'zi', '龇' => 'zi', '㜽' => 'zi', '㧗' => 'zi', '㰣' => 'zi', '㰷' => 'zi', '㱴' => 'zi', '㺭' => 'zi', '䅆' => 'zi', '䐉' => 'zi', '䔂' => 'zi', '䘣' => 'zi',
+ '他' => 'ta', '侤' => 'ta', '咜' => 'ta', '嚃' => 'ta', '嚺' => 'ta', '塌' => 'ta', '塔' => 'ta', '墖' => 'ta', '她' => 'ta', '它' => 'ta', '崉' => 'ta', '挞' => 'ta', '搨' => 'ta', '撻' => 'ta', '榙' => 'ta', '榻' => 'ta', '毾' => 'ta', '涾' => 'ta', '溻' => 'ta', '澾' => 'ta', '濌' => 'ta', '牠' => 'ta', '狧' => 'ta', '獭' => 'ta', '獺' => 'ta', '祂' => 'ta', '禢' => 'ta', '褟' => 'ta', '襨' => 'ta', '誻' => 'ta', '譶' => 'ta', '趿' => 'ta', '踏' => 'ta', '蹋' => 'ta', '蹹' => 'ta', '躢' => 'ta', '遝' => 'ta', '遢' => 'ta', '鉈' => 'ta', '錔' => 'ta', '铊' => 'ta', '闒' => 'ta', '闥' => 'ta', '闼' => 'ta', '阘' => 'ta', '鞜' => 'ta', '鞳' => 'ta', '鮙' => 'ta', '鰨' => 'ta', '鳎' => 'ta', '㒓' => 'ta', '㗳' => 'ta', '㛥' => 'ta', '㣛' => 'ta', '㣵' => 'ta', '㧺' => 'ta', '㭼' => 'ta', '㯓' => 'ta', '㳠' => 'ta', '㳫' => 'ta', '㹺' => 'ta', '㺚' => 'ta', '㿹' => 'ta', '䂿' => 'ta', '䈋' => 'ta', '䈳' => 'ta', '䌈' => 'ta', '䍇' => 'ta', '䍝' => 'ta', '䎓' => 'ta', '䑜' => 'ta', '䓠' => 'ta', '䜚' => 'ta', '䵬' => 'ta', '䶀' => 'ta', '䶁' => 'ta',
+ '仙' => 'xian', '仚' => 'xian', '伭' => 'xian', '佡' => 'xian', '僊' => 'xian', '僩' => 'xian', '僲' => 'xian', '僴' => 'xian', '先' => 'xian', '冼' => 'xian', '县' => 'xian', '咞' => 'xian', '咸' => 'xian', '哯' => 'xian', '唌' => 'xian', '啣' => 'xian', '嘕' => 'xian', '垷' => 'xian', '奾' => 'xian', '妶' => 'xian', '姭' => 'xian', '娊' => 'xian', '娨' => 'xian', '娴' => 'xian', '娹' => 'xian', '婱' => 'xian', '嫌' => 'xian', '嫺' => 'xian', '嫻' => 'xian', '嬐' => 'xian', '孅' => 'xian', '宪' => 'xian', '尟' => 'xian', '尠' => 'xian', '屳' => 'xian', '岘' => 'xian', '峴' => 'xian', '崄' => 'xian', '嶮' => 'xian', '幰' => 'xian', '廯' => 'xian', '弦' => 'xian', '忺' => 'xian', '憪' => 'xian', '憲' => 'xian', '憸' => 'xian', '挦' => 'xian', '掀' => 'xian', '搟' => 'xian', '撊' => 'xian', '撏' => 'xian', '攇' => 'xian', '攕' => 'xian', '显' => 'xian', '晛' => 'xian', '暹' => 'xian', '杴' => 'xian', '枮' => 'xian', '橌' => 'xian', '櫶' => 'xian', '毨' => 'xian', '氙' => 'xian', '涀' => 'xian', '涎' => 'xian', '湺' => 'xian', '澖' => 'xian', '瀗' => 'xian', '灦' => 'xian', '烍' => 'xian', '燹' => 'xian', '狝' => 'xian', '猃' => 'xian', '献' => 'xian', '獫' => 'xian', '獮' => 'xian', '獻' => 'xian', '玁' => 'xian', '现' => 'xian', '珗' => 'xian', '現' => 'xian', '甉' => 'xian', '痫' => 'xian', '癇' => 'xian', '癎' => 'xian', '県' => 'xian', '睍' => 'xian', '硍' => 'xian', '礥' => 'xian', '祆' => 'xian', '禒' => 'xian', '秈' => 'xian', '筅' => 'xian', '箲' => 'xian', '籼' => 'xian', '粯' => 'xian', '糮' => 'xian', '絃' => 'xian', '絤' => 'xian', '綫' => 'xian', '線' => 'xian', '縣' => 'xian', '繊' => 'xian', '纎' => 'xian', '纖' => 'xian', '纤' => 'xian', '线' => 'xian', '缐' => 'xian', '羡' => 'xian', '羨' => 'xian', '胘' => 'xian', '腺' => 'xian', '臔' => 'xian', '臽' => 'xian', '舷' => 'xian', '苋' => 'xian', '苮' => 'xian', '莧' => 'xian', '莶' => 'xian', '薟' => 'xian', '藓' => 'xian', '藔' => 'xian', '藖' => 'xian', '蘚' => 'xian', '蚬' => 'xian', '蚿' => 'xian', '蛝' => 'xian', '蜆' => 'xian', '衔' => 'xian', '衘' => 'xian', '褼' => 'xian', '襳' => 'xian', '誢' => 'xian', '誸' => 'xian', '諴' => 'xian', '譣' => 'xian', '豏' => 'xian', '賢' => 'xian', '贒' => 'xian', '贤' => 'xian', '赻' => 'xian', '跣' => 'xian', '跹' => 'xian', '蹮' => 'xian', '躚' => 'xian', '輱' => 'xian', '酰' => 'xian', '醎' => 'xian', '銛' => 'xian', '銜' => 'xian', '鋧' => 'xian', '錎' => 'xian', '鍁' => 'xian', '鍂' => 'xian', '鍌' => 'xian', '鏾' => 'xian', '鑦' => 'xian', '铦' => 'xian', '锨' => 'xian', '閑' => 'xian', '闲' => 'xian', '限' => 'xian', '陥' => 'xian', '险' => 'xian', '陷' => 'xian', '険' => 'xian', '險' => 'xian', '霰' => 'xian', '韅' => 'xian', '韯' => 'xian', '韱' => 'xian', '顕' => 'xian', '顯' => 'xian', '餡' => 'xian', '馅' => 'xian', '馦' => 'xian', '鮮' => 'xian', '鱻' => 'xian', '鲜' => 'xian', '鶱' => 'xian', '鷳' => 'xian', '鷴' => 'xian', '鷼' => 'xian', '鹇' => 'xian', '鹹' => 'xian', '麲' => 'xian', '鼸' => 'xian', '㔵' => 'xian', '㘅' => 'xian', '㘋' => 'xian', '㛾' => 'xian', '㜪' => 'xian', '㡉' => 'xian', '㡾' => 'xian', '㢺' => 'xian', '㦓' => 'xian', '㧋' => 'xian', '㧥' => 'xian', '㩈' => 'xian', '㪇' => 'xian', '㫫' => 'xian', '㬎' => 'xian', '㬗' => 'xian', '㭠' => 'xian', '㭹' => 'xian', '㮭' => 'xian', '㯀' => 'xian', '㳄' => 'xian', '㳭' => 'xian', '㵪' => 'xian', '㶍' => 'xian', '㺌' => 'xian', '㿅' => 'xian', '䀏' => 'xian', '䁂' => 'xian', '䃱' => 'xian', '䃸' => 'xian', '䉯' => 'xian', '䉳' => 'xian', '䏹' => 'xian', '䒸' => 'xian', '䕔' => 'xian', '䗾' => 'xian', '䘆' => 'xian', '䚚' => 'xian', '䜢' => 'xian', '䝨' => 'xian', '䞁' => 'xian', '䢾' => 'xian', '䤼' => 'xian', '䥪' => 'xian', '䦥' => 'xian', '䧋' => 'xian', '䧟' => 'xian', '䧮' => 'xian', '䨘' => 'xian', '䨷' => 'xian', '䱤' => 'xian', '䲗' => 'xian', '䵇' => 'xian', '䶟' => 'xian', '䶢' => 'xian',
+ '仜' => 'hong', '叿' => 'hong', '吰' => 'hong', '哄' => 'hong', '嗊' => 'hong', '嚝' => 'hong', '垬' => 'hong', '妅' => 'hong', '娂' => 'hong', '宏' => 'hong', '宖' => 'hong', '弘' => 'hong', '彋' => 'hong', '揈' => 'hong', '撔' => 'hong', '晎' => 'hong', '汯' => 'hong', '泓' => 'hong', '洪' => 'hong', '浤' => 'hong', '渱' => 'hong', '渹' => 'hong', '潂' => 'hong', '澋' => 'hong', '澒' => 'hong', '灴' => 'hong', '烘' => 'hong', '焢' => 'hong', '玒' => 'hong', '玜' => 'hong', '硔' => 'hong', '硡' => 'hong', '竑' => 'hong', '竤' => 'hong', '篊' => 'hong', '粠' => 'hong', '紅' => 'hong', '紘' => 'hong', '紭' => 'hong', '綋' => 'hong', '红' => 'hong', '纮' => 'hong', '翃' => 'hong', '翝' => 'hong', '耾' => 'hong', '苰' => 'hong', '荭' => 'hong', '葒' => 'hong', '葓' => 'hong', '蕻' => 'hong', '薨' => 'hong', '虹' => 'hong', '訇' => 'hong', '訌' => 'hong', '讧' => 'hong', '谹' => 'hong', '谼' => 'hong', '谾' => 'hong', '軣' => 'hong', '輷' => 'hong', '轟' => 'hong', '轰' => 'hong', '鈜' => 'hong', '鉷' => 'hong', '銾' => 'hong', '鋐' => 'hong', '鍧' => 'hong', '閎' => 'hong', '閧' => 'hong', '闀' => 'hong', '闂' => 'hong', '闳' => 'hong', '霐' => 'hong', '霟' => 'hong', '鞃' => 'hong', '鬨' => 'hong', '魟' => 'hong', '鴻' => 'hong', '鸿' => 'hong', '黉' => 'hong', '黌' => 'hong', '㖓' => 'hong', '㢬' => 'hong', '㬴' => 'hong', '㶹' => 'hong', '䀧' => 'hong', '䂫' => 'hong', '䃔' => 'hong', '䆖' => 'hong', '䉺' => 'hong', '䍔' => 'hong', '䜫' => 'hong', '䞑' => 'hong', '䡌' => 'hong', '䡏' => 'hong', '䧆' => 'hong', '䨎' => 'hong', '䩑' => 'hong', '䪦' => 'hong', '䫹' => 'hong', '䫺' => 'hong', '䲨' => 'hong',
+ '仝' => 'tong', '佟' => 'tong', '僮' => 'tong', '勭' => 'tong', '同' => 'tong', '哃' => 'tong', '嗵' => 'tong', '囲' => 'tong', '峂' => 'tong', '庝' => 'tong', '彤' => 'tong', '恸' => 'tong', '慟' => 'tong', '憅' => 'tong', '捅' => 'tong', '晍' => 'tong', '曈' => 'tong', '朣' => 'tong', '桐' => 'tong', '桶' => 'tong', '樋' => 'tong', '橦' => 'tong', '氃' => 'tong', '浵' => 'tong', '潼' => 'tong', '炵' => 'tong', '烔' => 'tong', '熥' => 'tong', '犝' => 'tong', '狪' => 'tong', '獞' => 'tong', '痌' => 'tong', '痛' => 'tong', '眮' => 'tong', '瞳' => 'tong', '砼' => 'tong', '秱' => 'tong', '穜' => 'tong', '童' => 'tong', '筒' => 'tong', '筩' => 'tong', '粡' => 'tong', '絧' => 'tong', '統' => 'tong', '綂' => 'tong', '统' => 'tong', '膧' => 'tong', '茼' => 'tong', '蓪' => 'tong', '蚒' => 'tong', '衕' => 'tong', '赨' => 'tong', '通' => 'tong', '酮' => 'tong', '鉖' => 'tong', '鉵' => 'tong', '銅' => 'tong', '铜' => 'tong', '餇' => 'tong', '鮦' => 'tong', '鲖' => 'tong', '㛚' => 'tong', '㠉' => 'tong', '㠽' => 'tong', '㣚' => 'tong', '㣠' => 'tong', '㤏' => 'tong', '㪌' => 'tong', '㮔' => 'tong', '㸗' => 'tong', '㼧' => 'tong', '㼿' => 'tong', '䂈' => 'tong', '䆚' => 'tong', '䆹' => 'tong', '䮵' => 'tong', '䳋' => 'tong', '䴀' => 'tong', '䶱' => 'tong',
+ '代' => 'dai', '侢' => 'dai', '傣' => 'dai', '叇' => 'dai', '呆' => 'dai', '呔' => 'dai', '垈' => 'dai', '埭' => 'dai', '岱' => 'dai', '帒' => 'dai', '带' => 'dai', '帯' => 'dai', '帶' => 'dai', '廗' => 'dai', '待' => 'dai', '怠' => 'dai', '懛' => 'dai', '戴' => 'dai', '曃' => 'dai', '柋' => 'dai', '歹' => 'dai', '殆' => 'dai', '汏' => 'dai', '瀻' => 'dai', '獃' => 'dai', '玳' => 'dai', '瑇' => 'dai', '甙' => 'dai', '簤' => 'dai', '紿' => 'dai', '緿' => 'dai', '绐' => 'dai', '艜' => 'dai', '蚮' => 'dai', '袋' => 'dai', '襶' => 'dai', '貸' => 'dai', '贷' => 'dai', '蹛' => 'dai', '軑' => 'dai', '軚' => 'dai', '軩' => 'dai', '轪' => 'dai', '迨' => 'dai', '逮' => 'dai', '霴' => 'dai', '靆' => 'dai', '鮘' => 'dai', '鴏' => 'dai', '黛' => 'dai', '黱' => 'dai', '㐲' => 'dai', '㞭' => 'dai', '㫹' => 'dai', '㯂' => 'dai', '㶡' => 'dai', '㻖' => 'dai', '㿃' => 'dai', '䈆' => 'dai', '䒫' => 'dai', '䚞' => 'dai', '䚟' => 'dai',
+ '令' => 'ling', '伶' => 'ling', '凌' => 'ling', '刢' => 'ling', '另' => 'ling', '呤' => 'ling', '囹' => 'ling', '坽' => 'ling', '夌' => 'ling', '姈' => 'ling', '婈' => 'ling', '孁' => 'ling', '岭' => 'ling', '岺' => 'ling', '崚' => 'ling', '嶺' => 'ling', '彾' => 'ling', '掕' => 'ling', '昤' => 'ling', '朎' => 'ling', '柃' => 'ling', '棂' => 'ling', '櫺' => 'ling', '欞' => 'ling', '泠' => 'ling', '淩' => 'ling', '澪' => 'ling', '瀮' => 'ling', '灵' => 'ling', '炩' => 'ling', '燯' => 'ling', '爧' => 'ling', '狑' => 'ling', '玲' => 'ling', '琌' => 'ling', '瓴' => 'ling', '皊' => 'ling', '砱' => 'ling', '祾' => 'ling', '秢' => 'ling', '竛' => 'ling', '笭' => 'ling', '紷' => 'ling', '綾' => 'ling', '绫' => 'ling', '羚' => 'ling', '翎' => 'ling', '聆' => 'ling', '舲' => 'ling', '苓' => 'ling', '菱' => 'ling', '蓤' => 'ling', '蔆' => 'ling', '蕶' => 'ling', '蘦' => 'ling', '蛉' => 'ling', '衑' => 'ling', '袊' => 'ling', '裬' => 'ling', '詅' => 'ling', '跉' => 'ling', '軨' => 'ling', '輘' => 'ling', '酃' => 'ling', '醽' => 'ling', '鈴' => 'ling', '錂' => 'ling', '铃' => 'ling', '閝' => 'ling', '阾' => 'ling', '陵' => 'ling', '零' => 'ling', '霊' => 'ling', '霗' => 'ling', '霛' => 'ling', '霝' => 'ling', '靈' => 'ling', '領' => 'ling', '领' => 'ling', '駖' => 'ling', '魿' => 'ling', '鯪' => 'ling', '鲮' => 'ling', '鴒' => 'ling', '鸰' => 'ling', '鹷' => 'ling', '麢' => 'ling', '齡' => 'ling', '齢' => 'ling', '龄' => 'ling', '龗' => 'ling', '㖫' => 'ling', '㡵' => 'ling', '㥄' => 'ling', '㦭' => 'ling', '㪮' => 'ling', '㬡' => 'ling', '㯪' => 'ling', '㱥' => 'ling', '㲆' => 'ling', '㸳' => 'ling', '㻏' => 'ling', '㾉' => 'ling', '䄥' => 'ling', '䈊' => 'ling', '䉁' => 'ling', '䉖' => 'ling', '䉹' => 'ling', '䌢' => 'ling', '䍅' => 'ling', '䔖' => 'ling', '䕘' => 'ling', '䖅' => 'ling', '䙥' => 'ling', '䚖' => 'ling', '䠲' => 'ling', '䡼' => 'ling', '䡿' => 'ling', '䧙' => 'ling', '䨩' => 'ling', '䯍' => 'ling', '䰱' => 'ling', '䴇' => 'ling', '䴒' => 'ling', '䴫' => 'ling',
+ '仦' => 'chao', '仯' => 'chao', '吵' => 'chao', '嘲' => 'chao', '巐' => 'chao', '巢' => 'chao', '巣' => 'chao', '弨' => 'chao', '怊' => 'chao', '抄' => 'chao', '晁' => 'chao', '朝' => 'chao', '樔' => 'chao', '欩' => 'chao', '漅' => 'chao', '潮' => 'chao', '炒' => 'chao', '焯' => 'chao', '煼' => 'chao', '牊' => 'chao', '眧' => 'chao', '窲' => 'chao', '繛' => 'chao', '罺' => 'chao', '耖' => 'chao', '觘' => 'chao', '訬' => 'chao', '謿' => 'chao', '超' => 'chao', '轈' => 'chao', '鄛' => 'chao', '鈔' => 'chao', '钞' => 'chao', '麨' => 'chao', '鼂' => 'chao', '鼌' => 'chao', '㶤' => 'chao', '㷅' => 'chao', '䄻' => 'chao', '䎐' => 'chao', '䏚' => 'chao', '䬤' => 'chao', '䰫' => 'chao',
+ '仧' => 'chang', '伥' => 'chang', '倀' => 'chang', '倡' => 'chang', '偿' => 'chang', '僘' => 'chang', '償' => 'chang', '兏' => 'chang', '厂' => 'chang', '厰' => 'chang', '唱' => 'chang', '嘗' => 'chang', '嚐' => 'chang', '场' => 'chang', '場' => 'chang', '塲' => 'chang', '娼' => 'chang', '嫦' => 'chang', '尝' => 'chang', '常' => 'chang', '廠' => 'chang', '徜' => 'chang', '怅' => 'chang', '悵' => 'chang', '惝' => 'chang', '敞' => 'chang', '昌' => 'chang', '昶' => 'chang', '晿' => 'chang', '暢' => 'chang', '椙' => 'chang', '氅' => 'chang', '淐' => 'chang', '猖' => 'chang', '玚' => 'chang', '琩' => 'chang', '瑒' => 'chang', '瑺' => 'chang', '瓺' => 'chang', '甞' => 'chang', '畅' => 'chang', '畼' => 'chang', '肠' => 'chang', '腸' => 'chang', '膓' => 'chang', '苌' => 'chang', '菖' => 'chang', '萇' => 'chang', '蟐' => 'chang', '裮' => 'chang', '誯' => 'chang', '鋹' => 'chang', '鋿' => 'chang', '錩' => 'chang', '鏛' => 'chang', '锠' => 'chang', '長' => 'chang', '镸' => 'chang', '长' => 'chang', '閶' => 'chang', '阊' => 'chang', '韔' => 'chang', '鬯' => 'chang', '鯧' => 'chang', '鱨' => 'chang', '鲳' => 'chang', '鲿' => 'chang', '鼚' => 'chang', '㙊' => 'chang', '㦂' => 'chang', '㫤' => 'chang', '䕋' => 'chang', '䗅' => 'chang', '䠀' => 'chang', '䠆' => 'chang', '䩨' => 'chang', '䯴' => 'chang',
+ '仨' => 'sa', '卅' => 'sa', '摋' => 'sa', '撒' => 'sa', '栍' => 'sa', '桬' => 'sa', '櫒' => 'sa', '洒' => 'sa', '潵' => 'sa', '灑' => 'sa', '脎' => 'sa', '萨' => 'sa', '薩' => 'sa', '訯' => 'sa', '鈒' => 'sa', '钑' => 'sa', '隡' => 'sa', '靸' => 'sa', '颯' => 'sa', '飒' => 'sa', '馺' => 'sa', '㒎' => 'sa', '㪪' => 'sa', '㳐' => 'sa', '㽂' => 'sa', '䊛' => 'sa', '䘮' => 'sa', '䙣' => 'sa', '䬃' => 'sa',
+ '们' => 'men', '們' => 'men', '悶' => 'men', '懑' => 'men', '懣' => 'men', '扪' => 'men', '捫' => 'men', '暪' => 'men', '椚' => 'men', '焖' => 'men', '燜' => 'men', '玣' => 'men', '璊' => 'men', '穈' => 'men', '菛' => 'men', '虋' => 'men', '鍆' => 'men', '钔' => 'men', '門' => 'men', '閅' => 'men', '门' => 'men', '闷' => 'men', '㡈' => 'men', '㥃' => 'men', '㦖' => 'men', '㨺' => 'men', '㱪' => 'men', '㵍' => 'men', '䊟' => 'men', '䝧' => 'men', '䫒' => 'men',
+ '仮' => 'fan', '凡' => 'fan', '凢' => 'fan', '凣' => 'fan', '勫' => 'fan', '匥' => 'fan', '反' => 'fan', '噃' => 'fan', '墦' => 'fan', '奿' => 'fan', '嬎' => 'fan', '嬏' => 'fan', '嬔' => 'fan', '帆' => 'fan', '幡' => 'fan', '忛' => 'fan', '憣' => 'fan', '払' => 'fan', '旙' => 'fan', '旛' => 'fan', '杋' => 'fan', '柉' => 'fan', '梵' => 'fan', '棥' => 'fan', '樊' => 'fan', '橎' => 'fan', '氾' => 'fan', '汎' => 'fan', '泛' => 'fan', '滼' => 'fan', '瀪' => 'fan', '瀿' => 'fan', '烦' => 'fan', '煩' => 'fan', '燔' => 'fan', '犯' => 'fan', '犿' => 'fan', '璠' => 'fan', '畈' => 'fan', '番' => 'fan', '盕' => 'fan', '矾' => 'fan', '礬' => 'fan', '笲' => 'fan', '笵' => 'fan', '範' => 'fan', '籓' => 'fan', '籵' => 'fan', '緐' => 'fan', '繁' => 'fan', '繙' => 'fan', '羳' => 'fan', '翻' => 'fan', '膰' => 'fan', '舤' => 'fan', '舧' => 'fan', '范' => 'fan', '蕃' => 'fan', '薠' => 'fan', '藩' => 'fan', '蘩' => 'fan', '蠜' => 'fan', '襎' => 'fan', '訉' => 'fan', '販' => 'fan', '贩' => 'fan', '蹯' => 'fan', '軓' => 'fan', '軬' => 'fan', '轓' => 'fan', '辺' => 'fan', '返' => 'fan', '釩' => 'fan', '鐇' => 'fan', '钒' => 'fan', '颿' => 'fan', '飜' => 'fan', '飯' => 'fan', '飰' => 'fan', '饭' => 'fan', '鱕' => 'fan', '鷭' => 'fan', '㕨' => 'fan', '㝃' => 'fan', '㠶' => 'fan', '㤆' => 'fan', '㴀' => 'fan', '㶗' => 'fan', '㸋' => 'fan', '㺕' => 'fan', '㼝' => 'fan', '㽹' => 'fan', '䀀' => 'fan', '䀟' => 'fan', '䉊' => 'fan', '䉒' => 'fan', '䊩' => 'fan', '䋣' => 'fan', '䋦' => 'fan', '䌓' => 'fan', '䐪' => 'fan', '䒠' => 'fan', '䒦' => 'fan', '䛀' => 'fan', '䡊' => 'fan', '䣲' => 'fan', '䪛' => 'fan', '䪤' => 'fan', '䫶' => 'fan', '䭵' => 'fan', '䮳' => 'fan',
+ '仰' => 'yang', '佒' => 'yang', '佯' => 'yang', '傟' => 'yang', '养' => 'yang', '劷' => 'yang', '卬' => 'yang', '咉' => 'yang', '坱' => 'yang', '垟' => 'yang', '央' => 'yang', '奍' => 'yang', '姎' => 'yang', '岟' => 'yang', '崵' => 'yang', '崸' => 'yang', '徉' => 'yang', '怏' => 'yang', '恙' => 'yang', '慃' => 'yang', '懩' => 'yang', '扬' => 'yang', '抰' => 'yang', '揚' => 'yang', '攁' => 'yang', '敭' => 'yang', '旸' => 'yang', '昜' => 'yang', '暘' => 'yang', '杨' => 'yang', '柍' => 'yang', '样' => 'yang', '楊' => 'yang', '楧' => 'yang', '様' => 'yang', '樣' => 'yang', '殃' => 'yang', '氜' => 'yang', '氧' => 'yang', '氱' => 'yang', '泱' => 'yang', '洋' => 'yang', '漾' => 'yang', '瀁' => 'yang', '炀' => 'yang', '炴' => 'yang', '烊' => 'yang', '煬' => 'yang', '珜' => 'yang', '疡' => 'yang', '痒' => 'yang', '瘍' => 'yang', '癢' => 'yang', '眏' => 'yang', '眻' => 'yang', '礢' => 'yang', '禓' => 'yang', '秧' => 'yang', '紻' => 'yang', '羊' => 'yang', '羏' => 'yang', '羕' => 'yang', '羪' => 'yang', '胦' => 'yang', '蛘' => 'yang', '詇' => 'yang', '諹' => 'yang', '軮' => 'yang', '輰' => 'yang', '鉠' => 'yang', '鍈' => 'yang', '鍚' => 'yang', '鐊' => 'yang', '钖' => 'yang', '阦' => 'yang', '阳' => 'yang', '陽' => 'yang', '雵' => 'yang', '霷' => 'yang', '鞅' => 'yang', '颺' => 'yang', '飏' => 'yang', '養' => 'yang', '駚' => 'yang', '鰑' => 'yang', '鴦' => 'yang', '鴹' => 'yang', '鸉' => 'yang', '鸯' => 'yang', '㔦' => 'yang', '㟅' => 'yang', '㨾' => 'yang', '㬕' => 'yang', '㺊' => 'yang', '㿮' => 'yang', '䁑' => 'yang', '䇦' => 'yang', '䑆' => 'yang', '䒋' => 'yang', '䖹' => 'yang', '䬗' => 'yang', '䬬' => 'yang', '䬺' => 'yang', '䭐' => 'yang', '䵮' => 'yang',
+ '仴' => 'wo', '倭' => 'wo', '偓' => 'wo', '卧' => 'wo', '唩' => 'wo', '喔' => 'wo', '婐' => 'wo', '婑' => 'wo', '媉' => 'wo', '幄' => 'wo', '我' => 'wo', '挝' => 'wo', '捰' => 'wo', '捾' => 'wo', '握' => 'wo', '撾' => 'wo', '斡' => 'wo', '楃' => 'wo', '沃' => 'wo', '涡' => 'wo', '涹' => 'wo', '渥' => 'wo', '渦' => 'wo', '濣' => 'wo', '焥' => 'wo', '猧' => 'wo', '瓁' => 'wo', '瞃' => 'wo', '硪' => 'wo', '窝' => 'wo', '窩' => 'wo', '肟' => 'wo', '腛' => 'wo', '臒' => 'wo', '臥' => 'wo', '莴' => 'wo', '萵' => 'wo', '蜗' => 'wo', '蝸' => 'wo', '踒' => 'wo', '齷' => 'wo', '龌' => 'wo', '㠛' => 'wo', '㦱' => 'wo', '㧴' => 'wo', '㱧' => 'wo', '䁊' => 'wo', '䠎' => 'wo', '䰀' => 'wo',
+ '件' => 'jian', '侟' => 'jian', '俭' => 'jian', '俴' => 'jian', '倹' => 'jian', '健' => 'jian', '僭' => 'jian', '儉' => 'jian', '兼' => 'jian', '冿' => 'jian', '减' => 'jian', '剑' => 'jian', '剣' => 'jian', '剪' => 'jian', '剱' => 'jian', '劍' => 'jian', '劎' => 'jian', '劒' => 'jian', '劔' => 'jian', '囏' => 'jian', '囝' => 'jian', '坚' => 'jian', '堅' => 'jian', '墹' => 'jian', '奸' => 'jian', '姦' => 'jian', '姧' => 'jian', '寋' => 'jian', '尖' => 'jian', '帴' => 'jian', '幵' => 'jian', '建' => 'jian', '弿' => 'jian', '彅' => 'jian', '徤' => 'jian', '惤' => 'jian', '戋' => 'jian', '戔' => 'jian', '戩' => 'jian', '戬' => 'jian', '拣' => 'jian', '挸' => 'jian', '捡' => 'jian', '揀' => 'jian', '揃' => 'jian', '搛' => 'jian', '撿' => 'jian', '擶' => 'jian', '旔' => 'jian', '暕' => 'jian', '枧' => 'jian', '柬' => 'jian', '栫' => 'jian', '梘' => 'jian', '检' => 'jian', '検' => 'jian', '椷' => 'jian', '椾' => 'jian', '楗' => 'jian', '榗' => 'jian', '槛' => 'jian', '樫' => 'jian', '橺' => 'jian', '檢' => 'jian', '檻' => 'jian', '櫼' => 'jian', '歼' => 'jian', '殱' => 'jian', '殲' => 'jian', '毽' => 'jian', '洊' => 'jian', '涧' => 'jian', '渐' => 'jian', '減' => 'jian', '湔' => 'jian', '湕' => 'jian', '溅' => 'jian', '漸' => 'jian', '澗' => 'jian', '濺' => 'jian', '瀐' => 'jian', '瀳' => 'jian', '瀸' => 'jian', '瀽' => 'jian', '煎' => 'jian', '熞' => 'jian', '熸' => 'jian', '牋' => 'jian', '牮' => 'jian', '犍' => 'jian', '猏' => 'jian', '玪' => 'jian', '珔' => 'jian', '瑊' => 'jian', '瑐' => 'jian', '监' => 'jian', '監' => 'jian', '睑' => 'jian', '睷' => 'jian', '瞯' => 'jian', '瞷' => 'jian', '瞼' => 'jian', '硷' => 'jian', '碊' => 'jian', '碱' => 'jian', '磵' => 'jian', '礀' => 'jian', '礆' => 'jian', '礛' => 'jian', '笕' => 'jian', '笺' => 'jian', '筧' => 'jian', '简' => 'jian', '箋' => 'jian', '箭' => 'jian', '篯' => 'jian', '簡' => 'jian', '籛' => 'jian', '糋' => 'jian', '絸' => 'jian', '緘' => 'jian', '縑' => 'jian', '繝' => 'jian', '繭' => 'jian', '缄' => 'jian', '缣' => 'jian', '翦' => 'jian', '聻' => 'jian', '肩' => 'jian', '腱' => 'jian', '臶' => 'jian', '舰' => 'jian', '艦' => 'jian', '艰' => 'jian', '艱' => 'jian', '茧' => 'jian', '荐' => 'jian', '菅' => 'jian', '菺' => 'jian', '葌' => 'jian', '葏' => 'jian', '葥' => 'jian', '蒹' => 'jian', '蕑' => 'jian', '蕳' => 'jian', '薦' => 'jian', '藆' => 'jian', '虃' => 'jian', '螹' => 'jian', '蠒' => 'jian', '袸' => 'jian', '裥' => 'jian', '襇' => 'jian', '襉' => 'jian', '襺' => 'jian', '見' => 'jian', '覵' => 'jian', '覸' => 'jian', '见' => 'jian', '詃' => 'jian', '諓' => 'jian', '諫' => 'jian', '謇' => 'jian', '謭' => 'jian', '譼' => 'jian', '譾' => 'jian', '谏' => 'jian', '谫' => 'jian', '豜' => 'jian', '豣' => 'jian', '賎' => 'jian', '賤' => 'jian', '贱' => 'jian', '趝' => 'jian', '趼' => 'jian', '跈' => 'jian', '践' => 'jian', '踐' => 'jian', '踺' => 'jian', '蹇' => 'jian', '轞' => 'jian', '釼' => 'jian', '鉴' => 'jian', '鋻' => 'jian', '鍳' => 'jian', '鍵' => 'jian', '鏩' => 'jian', '鐗' => 'jian', '鐧' => 'jian', '鑑' => 'jian', '鑒' => 'jian', '鑬' => 'jian', '鑯' => 'jian', '鑳' => 'jian', '锏' => 'jian', '键' => 'jian', '閒' => 'jian', '間' => 'jian', '间' => 'jian', '靬' => 'jian', '鞬' => 'jian', '鞯' => 'jian', '韀' => 'jian', '韉' => 'jian', '餞' => 'jian', '餰' => 'jian', '饯' => 'jian', '馢' => 'jian', '鬋' => 'jian', '鰎' => 'jian', '鰔' => 'jian', '鰜' => 'jian', '鰹' => 'jian', '鲣' => 'jian', '鳒' => 'jian', '鳽' => 'jian', '鵳' => 'jian', '鶼' => 'jian', '鹣' => 'jian', '鹸' => 'jian', '鹻' => 'jian', '鹼' => 'jian', '麉' => 'jian', '㓺' => 'jian', '㔋' => 'jian', '㔓' => 'jian', '㣤' => 'jian', '㦗' => 'jian', '㨴' => 'jian', '㨵' => 'jian', '㯺' => 'jian', '㰄' => 'jian', '㳨' => 'jian', '㶕' => 'jian', '㺝' => 'jian', '䄯' => 'jian', '䅐' => 'jian', '䇟' => 'jian', '䉍' => 'jian', '䛳' => 'jian', '䟅' => 'jian', '䟰' => 'jian', '䤔' => 'jian', '䥜' => 'jian', '䧖' => 'jian', '䩆' => 'jian', '䬻' => 'jian', '䭈' => 'jian', '䭕' => 'jian', '䭠' => 'jian', '䮿' => 'jian', '䯛' => 'jian', '䯡' => 'jian', '䵖' => 'jian', '䵛' => 'jian', '䵡' => 'jian', '䵤' => 'jian', '䶠' => 'jian',
+ '价' => 'jia', '佳' => 'jia', '假' => 'jia', '傢' => 'jia', '價' => 'jia', '加' => 'jia', '叚' => 'jia', '唊' => 'jia', '嗧' => 'jia', '嘉' => 'jia', '圿' => 'jia', '埉' => 'jia', '夹' => 'jia', '夾' => 'jia', '婽' => 'jia', '嫁' => 'jia', '宊' => 'jia', '家' => 'jia', '岬' => 'jia', '幏' => 'jia', '徦' => 'jia', '恝' => 'jia', '戛' => 'jia', '戞' => 'jia', '扴' => 'jia', '抸' => 'jia', '拁' => 'jia', '斚' => 'jia', '斝' => 'jia', '架' => 'jia', '枷' => 'jia', '梜' => 'jia', '椵' => 'jia', '榎' => 'jia', '榢' => 'jia', '槚' => 'jia', '檟' => 'jia', '毠' => 'jia', '泇' => 'jia', '浃' => 'jia', '浹' => 'jia', '犌' => 'jia', '猳' => 'jia', '玾' => 'jia', '珈' => 'jia', '甲' => 'jia', '痂' => 'jia', '瘕' => 'jia', '稼' => 'jia', '笳' => 'jia', '糘' => 'jia', '耞' => 'jia', '胛' => 'jia', '脥' => 'jia', '腵' => 'jia', '荚' => 'jia', '莢' => 'jia', '葭' => 'jia', '蛱' => 'jia', '蛺' => 'jia', '袈' => 'jia', '袷' => 'jia', '裌' => 'jia', '豭' => 'jia', '貑' => 'jia', '賈' => 'jia', '贾' => 'jia', '跏' => 'jia', '跲' => 'jia', '迦' => 'jia', '郏' => 'jia', '郟' => 'jia', '鉀' => 'jia', '鉫' => 'jia', '鋏' => 'jia', '鎵' => 'jia', '钾' => 'jia', '铗' => 'jia', '镓' => 'jia', '頬' => 'jia', '頰' => 'jia', '颊' => 'jia', '餄' => 'jia', '駕' => 'jia', '驾' => 'jia', '鴶' => 'jia', '鵊' => 'jia', '麚' => 'jia', '㕅' => 'jia', '㪴' => 'jia', '㮖' => 'jia', '㼪' => 'jia', '㿓' => 'jia', '䀫' => 'jia', '䁍' => 'jia', '䑝' => 'jia', '䕛' => 'jia', '䛟' => 'jia', '䩡' => 'jia',
+ '仸' => 'yao', '倄' => 'yao', '偠' => 'yao', '傜' => 'yao', '吆' => 'yao', '咬' => 'yao', '喓' => 'yao', '嗂' => 'yao', '垚' => 'yao', '堯' => 'yao', '夭' => 'yao', '妖' => 'yao', '姚' => 'yao', '婹' => 'yao', '媱' => 'yao', '宎' => 'yao', '尧' => 'yao', '尭' => 'yao', '岆' => 'yao', '峣' => 'yao', '崾' => 'yao', '嶢' => 'yao', '嶤' => 'yao', '幺' => 'yao', '徭' => 'yao', '徺' => 'yao', '愮' => 'yao', '抭' => 'yao', '揺' => 'yao', '搖' => 'yao', '摇' => 'yao', '摿' => 'yao', '暚' => 'yao', '曜' => 'yao', '曣' => 'yao', '杳' => 'yao', '枖' => 'yao', '柼' => 'yao', '楆' => 'yao', '榚' => 'yao', '榣' => 'yao', '殀' => 'yao', '殽' => 'yao', '溔' => 'yao', '烑' => 'yao', '熎' => 'yao', '燿' => 'yao', '爻' => 'yao', '狕' => 'yao', '猺' => 'yao', '獟' => 'yao', '珧' => 'yao', '瑤' => 'yao', '瑶' => 'yao', '眑' => 'yao', '矅' => 'yao', '磘' => 'yao', '祅' => 'yao', '穾' => 'yao', '窅' => 'yao', '窈' => 'yao', '窑' => 'yao', '窔' => 'yao', '窯' => 'yao', '窰' => 'yao', '筄' => 'yao', '繇' => 'yao', '纅' => 'yao', '耀' => 'yao', '肴' => 'yao', '腰' => 'yao', '舀' => 'yao', '艞' => 'yao', '苭' => 'yao', '药' => 'yao', '葯' => 'yao', '葽' => 'yao', '蓔' => 'yao', '薬' => 'yao', '藥' => 'yao', '蘨' => 'yao', '袎' => 'yao', '要' => 'yao', '覞' => 'yao', '訞' => 'yao', '詏' => 'yao', '謠' => 'yao', '謡' => 'yao', '讑' => 'yao', '谣' => 'yao', '軺' => 'yao', '轺' => 'yao', '遙' => 'yao', '遥' => 'yao', '邀' => 'yao', '銚' => 'yao', '鎐' => 'yao', '鑰' => 'yao', '闄' => 'yao', '靿' => 'yao', '顤' => 'yao', '颻' => 'yao', '飖' => 'yao', '餆' => 'yao', '餚' => 'yao', '騕' => 'yao', '鰩' => 'yao', '鳐' => 'yao', '鴁' => 'yao', '鴢' => 'yao', '鷂' => 'yao', '鷕' => 'yao', '鹞' => 'yao', '鼼' => 'yao', '齩' => 'yao', '㔽' => 'yao', '㝔' => 'yao', '㞁' => 'yao', '㟱' => 'yao', '㢓' => 'yao', '㨱' => 'yao', '㫏' => 'yao', '㫐' => 'yao', '㮁' => 'yao', '㴭' => 'yao', '㵸' => 'yao', '㿑' => 'yao', '㿢' => 'yao', '䁏' => 'yao', '䁘' => 'yao', '䂚' => 'yao', '䆙' => 'yao', '䆞' => 'yao', '䉰' => 'yao', '䋂' => 'yao', '䋤' => 'yao', '䌊' => 'yao', '䌛' => 'yao', '䍃' => 'yao', '䑬' => 'yao', '䔄' => 'yao', '䖴' => 'yao', '䙅' => 'yao', '䚺' => 'yao', '䚻' => 'yao', '䢣' => 'yao', '䬙' => 'yao', '䴠' => 'yao', '䶧' => 'yao',
+ '份' => 'fen', '偾' => 'fen', '僨' => 'fen', '分' => 'fen', '吩' => 'fen', '坆' => 'fen', '坋' => 'fen', '坟' => 'fen', '墳' => 'fen', '奋' => 'fen', '奮' => 'fen', '妢' => 'fen', '岎' => 'fen', '帉' => 'fen', '幩' => 'fen', '弅' => 'fen', '忿' => 'fen', '愤' => 'fen', '憤' => 'fen', '昐' => 'fen', '朆' => 'fen', '枌' => 'fen', '梤' => 'fen', '棻' => 'fen', '棼' => 'fen', '橨' => 'fen', '氛' => 'fen', '汾' => 'fen', '瀵' => 'fen', '炃' => 'fen', '焚' => 'fen', '燌' => 'fen', '燓' => 'fen', '玢' => 'fen', '瞓' => 'fen', '秎' => 'fen', '竕' => 'fen', '粉' => 'fen', '粪' => 'fen', '糞' => 'fen', '紛' => 'fen', '纷' => 'fen', '羒' => 'fen', '羵' => 'fen', '翂' => 'fen', '肦' => 'fen', '膹' => 'fen', '芬' => 'fen', '蒶' => 'fen', '蕡' => 'fen', '蚠' => 'fen', '蚡' => 'fen', '衯' => 'fen', '訜' => 'fen', '豮' => 'fen', '豶' => 'fen', '躮' => 'fen', '轒' => 'fen', '酚' => 'fen', '鈖' => 'fen', '鐼' => 'fen', '隫' => 'fen', '雰' => 'fen', '餴' => 'fen', '饙' => 'fen', '馚' => 'fen', '馩' => 'fen', '魵' => 'fen', '鱝' => 'fen', '鲼' => 'fen', '鳻' => 'fen', '黂' => 'fen', '黺' => 'fen', '鼖' => 'fen', '鼢' => 'fen', '㖹' => 'fen', '㥹' => 'fen', '㮥' => 'fen', '㷊' => 'fen', '㸮' => 'fen', '㿎' => 'fen', '䩿' => 'fen', '䯨' => 'fen', '䴅' => 'fen',
+ '仾' => 'di', '低' => 'di', '俤' => 'di', '偙' => 'di', '僀' => 'di', '厎' => 'di', '呧' => 'di', '唙' => 'di', '啇' => 'di', '啲' => 'di', '嘀' => 'di', '嚁' => 'di', '地' => 'di', '坔' => 'di', '坻' => 'di', '埊' => 'di', '埞' => 'di', '堤' => 'di', '墑' => 'di', '墬' => 'di', '奃' => 'di', '娣' => 'di', '媂' => 'di', '嫡' => 'di', '嶳' => 'di', '帝' => 'di', '底' => 'di', '廸' => 'di', '弚' => 'di', '弟' => 'di', '弤' => 'di', '彽' => 'di', '怟' => 'di', '慸' => 'di', '抵' => 'di', '拞' => 'di', '掋' => 'di', '摕' => 'di', '敌' => 'di', '敵' => 'di', '旳' => 'di', '杕' => 'di', '枤' => 'di', '柢' => 'di', '梊' => 'di', '梑' => 'di', '棣' => 'di', '氐' => 'di', '涤' => 'di', '滌' => 'di', '滴' => 'di', '焍' => 'di', '牴' => 'di', '狄' => 'di', '玓' => 'di', '甋' => 'di', '眱' => 'di', '睇' => 'di', '砥' => 'di', '碲' => 'di', '磾' => 'di', '祶' => 'di', '禘' => 'di', '笛' => 'di', '第' => 'di', '篴' => 'di', '籴' => 'di', '糴' => 'di', '締' => 'di', '缔' => 'di', '羝' => 'di', '翟' => 'di', '聜' => 'di', '肑' => 'di', '腣' => 'di', '苐' => 'di', '苖' => 'di', '荻' => 'di', '菂' => 'di', '菧' => 'di', '蒂' => 'di', '蔋' => 'di', '蔐' => 'di', '蔕' => 'di', '藡' => 'di', '蝃' => 'di', '螮' => 'di', '袛' => 'di', '覿' => 'di', '觌' => 'di', '觝' => 'di', '詆' => 'di', '諦' => 'di', '诋' => 'di', '谛' => 'di', '豴' => 'di', '趆' => 'di', '踶' => 'di', '軧' => 'di', '迪' => 'di', '递' => 'di', '逓' => 'di', '遞' => 'di', '遰' => 'di', '邸' => 'di', '釱' => 'di', '鉪' => 'di', '鍉' => 'di', '鏑' => 'di', '镝' => 'di', '阺' => 'di', '隄' => 'di', '靮' => 'di', '鞮' => 'di', '頔' => 'di', '馰' => 'di', '骶' => 'di', '髢' => 'di', '魡' => 'di', '鯳' => 'di', '鸐' => 'di', '㡳' => 'di', '㢩' => 'di', '㣙' => 'di', '㦅' => 'di', '㪆' => 'di', '㭽' => 'di', '㰅' => 'di', '㹍' => 'di', '㼵' => 'di', '䀸' => 'di', '䀿' => 'di', '䂡' => 'di', '䊮' => 'di', '䍕' => 'di', '䏑' => 'di', '䑭' => 'di', '䑯' => 'di', '䞶' => 'di', '䟡' => 'di', '䢑' => 'di', '䣌' => 'di', '䧝' => 'di', '䨀' => 'di', '䨤' => 'di', '䩘' => 'di', '䩚' => 'di', '䮤' => 'di', '䯼' => 'di', '䱃' => 'di', '䱱' => 'di', '䴞' => 'di', '䵠' => 'di', '䶍' => 'di',
+ '仿' => 'fang', '倣' => 'fang', '匚' => 'fang', '坊' => 'fang', '埅' => 'fang', '堏' => 'fang', '妨' => 'fang', '彷' => 'fang', '房' => 'fang', '放' => 'fang', '方' => 'fang', '旊' => 'fang', '昉' => 'fang', '昘' => 'fang', '枋' => 'fang', '淓' => 'fang', '牥' => 'fang', '瓬' => 'fang', '眆' => 'fang', '紡' => 'fang', '纺' => 'fang', '肪' => 'fang', '舫' => 'fang', '芳' => 'fang', '蚄' => 'fang', '訪' => 'fang', '访' => 'fang', '趽' => 'fang', '邡' => 'fang', '鈁' => 'fang', '錺' => 'fang', '钫' => 'fang', '防' => 'fang', '髣' => 'fang', '魴' => 'fang', '鲂' => 'fang', '鴋' => 'fang', '鶭' => 'fang', '㑂' => 'fang', '㕫' => 'fang', '㤃' => 'fang', '㧍' => 'fang', '㯐' => 'fang', '䢍' => 'fang', '䦈' => 'fang', '䲱' => 'fang',
+ '伂' => 'pei', '佩' => 'pei', '俖' => 'pei', '呸' => 'pei', '培' => 'pei', '姵' => 'pei', '嶏' => 'pei', '帔' => 'pei', '怌' => 'pei', '斾' => 'pei', '旆' => 'pei', '柸' => 'pei', '毰' => 'pei', '沛' => 'pei', '浿' => 'pei', '珮' => 'pei', '笩' => 'pei', '肧' => 'pei', '胚' => 'pei', '蓜' => 'pei', '衃' => 'pei', '裴' => 'pei', '裵' => 'pei', '賠' => 'pei', '赔' => 'pei', '轡' => 'pei', '辔' => 'pei', '配' => 'pei', '醅' => 'pei', '錇' => 'pei', '锫' => 'pei', '阫' => 'pei', '陪' => 'pei', '陫' => 'pei', '霈' => 'pei', '馷' => 'pei', '㟝' => 'pei', '㤄' => 'pei', '㧩' => 'pei', '㫲' => 'pei', '㳈' => 'pei', '䊃' => 'pei', '䣙' => 'pei', '䪹' => 'pei', '䫠' => 'pei', '䲹' => 'pei',
+ '伄' => 'diao', '凋' => 'diao', '刁' => 'diao', '刟' => 'diao', '叼' => 'diao', '吊' => 'diao', '奝' => 'diao', '屌' => 'diao', '弔' => 'diao', '弴' => 'diao', '彫' => 'diao', '扚' => 'diao', '掉' => 'diao', '殦' => 'diao', '汈' => 'diao', '琱' => 'diao', '瘹' => 'diao', '瞗' => 'diao', '碉' => 'diao', '窎' => 'diao', '窵' => 'diao', '竨' => 'diao', '簓' => 'diao', '蓧' => 'diao', '藋' => 'diao', '虭' => 'diao', '蛁' => 'diao', '訋' => 'diao', '調' => 'diao', '调' => 'diao', '貂' => 'diao', '釣' => 'diao', '鈟' => 'diao', '銱' => 'diao', '鋽' => 'diao', '鑃' => 'diao', '钓' => 'diao', '铞' => 'diao', '雕' => 'diao', '雿' => 'diao', '鮉' => 'diao', '鯛' => 'diao', '鲷' => 'diao', '鳭' => 'diao', '鵰' => 'diao', '鼦' => 'diao', '㒛' => 'diao', '㪕' => 'diao', '㹿' => 'diao', '䂪' => 'diao', '䂽' => 'diao', '䉆' => 'diao', '䔙' => 'diao', '䠼' => 'diao', '䵲' => 'diao',
+ '伅' => 'dun', '吨' => 'dun', '噸' => 'dun', '囤' => 'dun', '墩' => 'dun', '墪' => 'dun', '壿' => 'dun', '庉' => 'dun', '惇' => 'dun', '憞' => 'dun', '撉' => 'dun', '撴' => 'dun', '敦' => 'dun', '橔' => 'dun', '沌' => 'dun', '潡' => 'dun', '炖' => 'dun', '燉' => 'dun', '犜' => 'dun', '獤' => 'dun', '盹' => 'dun', '盾' => 'dun', '砘' => 'dun', '碷' => 'dun', '礅' => 'dun', '腞' => 'dun', '蜳' => 'dun', '趸' => 'dun', '踲' => 'dun', '蹲' => 'dun', '蹾' => 'dun', '躉' => 'dun', '逇' => 'dun', '遁' => 'dun', '遯' => 'dun', '鈍' => 'dun', '钝' => 'dun', '頓' => 'dun', '顿' => 'dun', '驐' => 'dun', '㬿' => 'dun', '䤜' => 'dun',
+ '伈' => 'xin', '伩' => 'xin', '信' => 'xin', '俽' => 'xin', '噷' => 'xin', '噺' => 'xin', '囟' => 'xin', '妡' => 'xin', '嬜' => 'xin', '孞' => 'xin', '廞' => 'xin', '心' => 'xin', '忄' => 'xin', '忻' => 'xin', '惞' => 'xin', '新' => 'xin', '昕' => 'xin', '杺' => 'xin', '枔' => 'xin', '欣' => 'xin', '歆' => 'xin', '潃' => 'xin', '炘' => 'xin', '焮' => 'xin', '盺' => 'xin', '脪' => 'xin', '舋' => 'xin', '芯' => 'xin', '莘' => 'xin', '薪' => 'xin', '衅' => 'xin', '訢' => 'xin', '訫' => 'xin', '軐' => 'xin', '辛' => 'xin', '邤' => 'xin', '釁' => 'xin', '鈊' => 'xin', '鋅' => 'xin', '鐔' => 'xin', '鑫' => 'xin', '锌' => 'xin', '阠' => 'xin', '顖' => 'xin', '馨' => 'xin', '馫' => 'xin', '馸' => 'xin', '鬵' => 'xin', '㐰' => 'xin', '㚯' => 'xin', '㛛' => 'xin', '㭄' => 'xin', '䒖' => 'xin', '䚱' => 'xin', '䛨' => 'xin', '䜗' => 'xin', '䜣' => 'xin', '䰼' => 'xin',
+ '伌' => 'ai', '僾' => 'ai', '凒' => 'ai', '叆' => 'ai', '哀' => 'ai', '哎' => 'ai', '唉' => 'ai', '啀' => 'ai', '嗌' => 'ai', '嗳' => 'ai', '嘊' => 'ai', '噯' => 'ai', '埃' => 'ai', '塧' => 'ai', '壒' => 'ai', '娾' => 'ai', '嫒' => 'ai', '嬡' => 'ai', '嵦' => 'ai', '愛' => 'ai', '懓' => 'ai', '懝' => 'ai', '挨' => 'ai', '捱' => 'ai', '敱' => 'ai', '敳' => 'ai', '昹' => 'ai', '暧' => 'ai', '曖' => 'ai', '欸' => 'ai', '毐' => 'ai', '溰' => 'ai', '溾' => 'ai', '濭' => 'ai', '爱' => 'ai', '瑷' => 'ai', '璦' => 'ai', '癌' => 'ai', '皑' => 'ai', '皚' => 'ai', '皧' => 'ai', '瞹' => 'ai', '矮' => 'ai', '砹' => 'ai', '硋' => 'ai', '碍' => 'ai', '礙' => 'ai', '艾' => 'ai', '蔼' => 'ai', '薆' => 'ai', '藹' => 'ai', '譪' => 'ai', '譺' => 'ai', '賹' => 'ai', '躷' => 'ai', '鎄' => 'ai', '鑀' => 'ai', '锿' => 'ai', '隘' => 'ai', '霭' => 'ai', '靄' => 'ai', '靉' => 'ai', '餲' => 'ai', '馤' => 'ai', '鱫' => 'ai', '鴱' => 'ai', '㑸' => 'ai', '㕌' => 'ai', '㗒' => 'ai', '㗨' => 'ai', '㘷' => 'ai', '㝶' => 'ai', '㢊' => 'ai', '㤅' => 'ai', '㱯' => 'ai', '㿄' => 'ai', '䀳' => 'ai', '䅬' => 'ai', '䑂' => 'ai', '䔽' => 'ai', '䝽' => 'ai', '䠹' => 'ai', '䨠' => 'ai', '䬵' => 'ai', '䶣' => 'ai',
+ '休' => 'xiu', '俢' => 'xiu', '修' => 'xiu', '咻' => 'xiu', '嗅' => 'xiu', '岫' => 'xiu', '庥' => 'xiu', '朽' => 'xiu', '樇' => 'xiu', '溴' => 'xiu', '滫' => 'xiu', '烋' => 'xiu', '烌' => 'xiu', '珛' => 'xiu', '琇' => 'xiu', '璓' => 'xiu', '秀' => 'xiu', '糔' => 'xiu', '綇' => 'xiu', '綉' => 'xiu', '繍' => 'xiu', '繡' => 'xiu', '绣' => 'xiu', '羞' => 'xiu', '脙' => 'xiu', '脩' => 'xiu', '臹' => 'xiu', '苬' => 'xiu', '螑' => 'xiu', '袖' => 'xiu', '裦' => 'xiu', '褎' => 'xiu', '褏' => 'xiu', '貅' => 'xiu', '銝' => 'xiu', '銹' => 'xiu', '鎀' => 'xiu', '鏅' => 'xiu', '鏥' => 'xiu', '鏽' => 'xiu', '锈' => 'xiu', '飍' => 'xiu', '饈' => 'xiu', '馐' => 'xiu', '髤' => 'xiu', '髹' => 'xiu', '鮴' => 'xiu', '鵂' => 'xiu', '鸺' => 'xiu', '齅' => 'xiu', '㗜' => 'xiu', '㱙' => 'xiu', '㾋' => 'xiu',
+ '伖' => 'nu', '伮' => 'nu', '傉' => 'nu', '努' => 'nu', '奴' => 'nu', '孥' => 'nu', '弩' => 'nu', '怒' => 'nu', '搙' => 'nu', '砮' => 'nu', '笯' => 'nu', '胬' => 'nu', '駑' => 'nu', '驽' => 'nu', '㚢' => 'nu', '䢞' => 'nu',
+ '伙' => 'huo', '佸' => 'huo', '俰' => 'huo', '剨' => 'huo', '劐' => 'huo', '吙' => 'huo', '咟' => 'huo', '嗀' => 'huo', '嚄' => 'huo', '嚯' => 'huo', '嚿' => 'huo', '夥' => 'huo', '夻' => 'huo', '奯' => 'huo', '惑' => 'huo', '或' => 'huo', '捇' => 'huo', '掝' => 'huo', '擭' => 'huo', '攉' => 'huo', '旤' => 'huo', '曤' => 'huo', '檴' => 'huo', '沎' => 'huo', '活' => 'huo', '湱' => 'huo', '漷' => 'huo', '濩' => 'huo', '瀖' => 'huo', '火' => 'huo', '獲' => 'huo', '癨' => 'huo', '眓' => 'huo', '矆' => 'huo', '矐' => 'huo', '祸' => 'huo', '禍' => 'huo', '秮' => 'huo', '秳' => 'huo', '穫' => 'huo', '耠' => 'huo', '耯' => 'huo', '臛' => 'huo', '艧' => 'huo', '获' => 'huo', '蒦' => 'huo', '藿' => 'huo', '蠖' => 'huo', '謋' => 'huo', '豁' => 'huo', '貨' => 'huo', '货' => 'huo', '邩' => 'huo', '鈥' => 'huo', '鍃' => 'huo', '鑊' => 'huo', '钬' => 'huo', '锪' => 'huo', '镬' => 'huo', '閄' => 'huo', '雘' => 'huo', '霍' => 'huo', '靃' => 'huo', '騞' => 'huo', '㗲' => 'huo', '㘞' => 'huo', '㦜' => 'huo', '㦯' => 'huo', '㨯' => 'huo', '㯉' => 'huo', '㸌' => 'huo', '䁨' => 'huo', '䂄' => 'huo', '䄀' => 'huo', '䄆' => 'huo', '䄑' => 'huo', '䉟' => 'huo', '䋭' => 'huo', '䣶' => 'huo', '䦚' => 'huo', '䯏' => 'huo', '䰥' => 'huo',
+ '会' => 'hui', '佪' => 'hui', '僡' => 'hui', '儶' => 'hui', '匯' => 'hui', '卉' => 'hui', '咴' => 'hui', '哕' => 'hui', '喙' => 'hui', '嘒' => 'hui', '噅' => 'hui', '噕' => 'hui', '噦' => 'hui', '嚖' => 'hui', '囘' => 'hui', '回' => 'hui', '囬' => 'hui', '圚' => 'hui', '婎' => 'hui', '媈' => 'hui', '孈' => 'hui', '寭' => 'hui', '屷' => 'hui', '幑' => 'hui', '廻' => 'hui', '廽' => 'hui', '彗' => 'hui', '彙' => 'hui', '彚' => 'hui', '徻' => 'hui', '徽' => 'hui', '恚' => 'hui', '恛' => 'hui', '恢' => 'hui', '恵' => 'hui', '悔' => 'hui', '惠' => 'hui', '慧' => 'hui', '憓' => 'hui', '懳' => 'hui', '拻' => 'hui', '挥' => 'hui', '揮' => 'hui', '撝' => 'hui', '晖' => 'hui', '晦' => 'hui', '暉' => 'hui', '暳' => 'hui', '會' => 'hui', '桧' => 'hui', '楎' => 'hui', '槥' => 'hui', '橞' => 'hui', '檅' => 'hui', '檓' => 'hui', '檜' => 'hui', '櫘' => 'hui', '毀' => 'hui', '毁' => 'hui', '毇' => 'hui', '汇' => 'hui', '泋' => 'hui', '洃' => 'hui', '洄' => 'hui', '浍' => 'hui', '湏' => 'hui', '滙' => 'hui', '潓' => 'hui', '澮' => 'hui', '瀈' => 'hui', '灰' => 'hui', '灳' => 'hui', '烠' => 'hui', '烣' => 'hui', '烩' => 'hui', '烪' => 'hui', '煇' => 'hui', '燬' => 'hui', '燴' => 'hui', '獩' => 'hui', '珲' => 'hui', '琿' => 'hui', '璤' => 'hui', '璯' => 'hui', '痐' => 'hui', '瘣' => 'hui', '睳' => 'hui', '瞺' => 'hui', '禈' => 'hui', '秽' => 'hui', '穢' => 'hui', '篲' => 'hui', '絵' => 'hui', '繢' => 'hui', '繪' => 'hui', '绘' => 'hui', '缋' => 'hui', '翙' => 'hui', '翚' => 'hui', '翬' => 'hui', '翽' => 'hui', '芔' => 'hui', '茴' => 'hui', '荟' => 'hui', '蔧' => 'hui', '蕙' => 'hui', '薈' => 'hui', '薉' => 'hui', '藱' => 'hui', '虺' => 'hui', '蚘' => 'hui', '蛔' => 'hui', '蛕' => 'hui', '蜖' => 'hui', '螝' => 'hui', '蟪' => 'hui', '袆' => 'hui', '褘' => 'hui', '詯' => 'hui', '詼' => 'hui', '誨' => 'hui', '諱' => 'hui', '譓' => 'hui', '譭' => 'hui', '譮' => 'hui', '譿' => 'hui', '讳' => 'hui', '诙' => 'hui', '诲' => 'hui', '豗' => 'hui', '賄' => 'hui', '贿' => 'hui', '輝' => 'hui', '辉' => 'hui', '迴' => 'hui', '逥' => 'hui', '鏸' => 'hui', '鐬' => 'hui', '闠' => 'hui', '阓' => 'hui', '隓' => 'hui', '隳' => 'hui', '靧' => 'hui', '韢' => 'hui', '頮' => 'hui', '顪' => 'hui', '餯' => 'hui', '鮰' => 'hui', '鰴' => 'hui', '麾' => 'hui', '㑰' => 'hui', '㑹' => 'hui', '㒑' => 'hui', '㜇' => 'hui', '㞧' => 'hui', '㤬' => 'hui', '㥣' => 'hui', '㨤' => 'hui', '㨹' => 'hui', '㩓' => 'hui', '㩨' => 'hui', '㬩' => 'hui', '㰥' => 'hui', '㱱' => 'hui', '㷄' => 'hui', '㷐' => 'hui', '㻅' => 'hui', '䂕' => 'hui', '䃣' => 'hui', '䅏' => 'hui', '䇻' => 'hui', '䌇' => 'hui', '䏨' => 'hui', '䕇' => 'hui', '䙌' => 'hui', '䙡' => 'hui', '䛛' => 'hui', '䛼' => 'hui', '䜋' => 'hui', '䤧' => 'hui', '䧥' => 'hui', '䩈' => 'hui', '䫭' => 'hui',
+ '伡' => 'che', '俥' => 'che', '偖' => 'che', '勶' => 'che', '唓' => 'che', '坼' => 'che', '奲' => 'che', '屮' => 'che', '彻' => 'che', '徹' => 'che', '扯' => 'che', '掣' => 'che', '撤' => 'che', '撦' => 'che', '澈' => 'che', '烢' => 'che', '烲' => 'che', '爡' => 'che', '瞮' => 'che', '砗' => 'che', '硨' => 'che', '硩' => 'che', '聅' => 'che', '莗' => 'che', '蛼' => 'che', '車' => 'che', '车' => 'che', '迠' => 'che', '頙' => 'che', '㔭' => 'che', '㥉' => 'che', '㨋' => 'che', '㬚' => 'che', '㯙' => 'che', '㱌' => 'che', '㵃' => 'che', '㵔' => 'che', '㾝' => 'che', '㿭' => 'che', '䁤' => 'che', '䋲' => 'che', '䑲' => 'che', '䒆' => 'che', '䚢' => 'che', '䛸' => 'che', '䜠' => 'che', '䞣' => 'che', '䧪' => 'che', '䨁' => 'che', '䰩' => 'che',
+ '伨' => 'xun', '侚' => 'xun', '偱' => 'xun', '勋' => 'xun', '勛' => 'xun', '勲' => 'xun', '勳' => 'xun', '卂' => 'xun', '噀' => 'xun', '噚' => 'xun', '嚑' => 'xun', '坃' => 'xun', '埙' => 'xun', '塤' => 'xun', '壎' => 'xun', '壦' => 'xun', '奞' => 'xun', '寻' => 'xun', '尋' => 'xun', '峋' => 'xun', '巡' => 'xun', '巽' => 'xun', '廵' => 'xun', '徇' => 'xun', '循' => 'xun', '恂' => 'xun', '愻' => 'xun', '揗' => 'xun', '攳' => 'xun', '旬' => 'xun', '曛' => 'xun', '杊' => 'xun', '栒' => 'xun', '桪' => 'xun', '樳' => 'xun', '殉' => 'xun', '殾' => 'xun', '毥' => 'xun', '汛' => 'xun', '洵' => 'xun', '浔' => 'xun', '潯' => 'xun', '灥' => 'xun', '焄' => 'xun', '熏' => 'xun', '燂' => 'xun', '燅' => 'xun', '燖' => 'xun', '燻' => 'xun', '爋' => 'xun', '狥' => 'xun', '獯' => 'xun', '珣' => 'xun', '璕' => 'xun', '矄' => 'xun', '窨' => 'xun', '紃' => 'xun', '纁' => 'xun', '臐' => 'xun', '荀' => 'xun', '蔒' => 'xun', '蕈' => 'xun', '薫' => 'xun', '薰' => 'xun', '蘍' => 'xun', '蟳' => 'xun', '襑' => 'xun', '訊' => 'xun', '訓' => 'xun', '訙' => 'xun', '詢' => 'xun', '训' => 'xun', '讯' => 'xun', '询' => 'xun', '賐' => 'xun', '迅' => 'xun', '迿' => 'xun', '逊' => 'xun', '遜' => 'xun', '鄩' => 'xun', '醺' => 'xun', '鑂' => 'xun', '顨' => 'xun', '馴' => 'xun', '駨' => 'xun', '驯' => 'xun', '鱏' => 'xun', '鱘' => 'xun', '鲟' => 'xun', '㜄' => 'xun', '㝁' => 'xun', '㢲' => 'xun', '㨚' => 'xun', '㰊' => 'xun', '㰬' => 'xun', '㽦' => 'xun', '䋸' => 'xun', '䑕' => 'xun', '䖲' => 'xun', '䙉' => 'xun', '䛜' => 'xun', '䞊' => 'xun', '䭀' => 'xun',
+ '估' => 'gu', '傦' => 'gu', '僱' => 'gu', '凅' => 'gu', '古' => 'gu', '咕' => 'gu', '唂' => 'gu', '唃' => 'gu', '啒' => 'gu', '嘏' => 'gu', '固' => 'gu', '堌' => 'gu', '夃' => 'gu', '姑' => 'gu', '嫴' => 'gu', '孤' => 'gu', '尳' => 'gu', '峠' => 'gu', '崓' => 'gu', '崮' => 'gu', '怘' => 'gu', '愲' => 'gu', '扢' => 'gu', '故' => 'gu', '柧' => 'gu', '梏' => 'gu', '棝' => 'gu', '榖' => 'gu', '榾' => 'gu', '橭' => 'gu', '毂' => 'gu', '汩' => 'gu', '沽' => 'gu', '泒' => 'gu', '淈' => 'gu', '濲' => 'gu', '瀔' => 'gu', '焸' => 'gu', '牯' => 'gu', '牿' => 'gu', '痼' => 'gu', '皷' => 'gu', '盬' => 'gu', '瞽' => 'gu', '硲' => 'gu', '祻' => 'gu', '稒' => 'gu', '穀' => 'gu', '笟' => 'gu', '箍' => 'gu', '箛' => 'gu', '篐' => 'gu', '糓' => 'gu', '縎' => 'gu', '罛' => 'gu', '罟' => 'gu', '羖' => 'gu', '股' => 'gu', '脵' => 'gu', '臌' => 'gu', '菇' => 'gu', '菰' => 'gu', '蓇' => 'gu', '薣' => 'gu', '蛄' => 'gu', '蛊' => 'gu', '蛌' => 'gu', '蠱' => 'gu', '觚' => 'gu', '詁' => 'gu', '诂' => 'gu', '谷' => 'gu', '軱' => 'gu', '軲' => 'gu', '轂' => 'gu', '轱' => 'gu', '辜' => 'gu', '逧' => 'gu', '酤' => 'gu', '鈲' => 'gu', '鈷' => 'gu', '錮' => 'gu', '钴' => 'gu', '锢' => 'gu', '雇' => 'gu', '頋' => 'gu', '顧' => 'gu', '顾' => 'gu', '餶' => 'gu', '馉' => 'gu', '骨' => 'gu', '鮕' => 'gu', '鯝' => 'gu', '鲴' => 'gu', '鴣' => 'gu', '鵠' => 'gu', '鶻' => 'gu', '鸪' => 'gu', '鹄' => 'gu', '鹘' => 'gu', '鼓' => 'gu', '鼔' => 'gu', '㒴' => 'gu', '㚉' => 'gu', '㧽' => 'gu', '㯏' => 'gu', '㼋' => 'gu', '㽽' => 'gu', '㾶' => 'gu', '䀇' => 'gu', '䀜' => 'gu', '䀦' => 'gu', '䀰' => 'gu', '䅽' => 'gu', '䊺' => 'gu', '䍍' => 'gu', '䍛' => 'gu', '䐨' => 'gu', '䓢' => 'gu', '䜼' => 'gu', '䡩' => 'gu', '䮩' => 'gu', '䵻' => 'gu', '䶜' => 'gu',
+ '伱' => 'ni', '伲' => 'ni', '你' => 'ni', '倪' => 'ni', '儗' => 'ni', '儞' => 'ni', '匿' => 'ni', '坭' => 'ni', '埿' => 'ni', '堄' => 'ni', '妮' => 'ni', '婗' => 'ni', '嫟' => 'ni', '嬺' => 'ni', '孴' => 'ni', '尼' => 'ni', '屔' => 'ni', '屰' => 'ni', '怩' => 'ni', '惄' => 'ni', '愵' => 'ni', '抳' => 'ni', '拟' => 'ni', '掜' => 'ni', '擬' => 'ni', '旎' => 'ni', '昵' => 'ni', '晲' => 'ni', '暱' => 'ni', '柅' => 'ni', '棿' => 'ni', '檷' => 'ni', '氼' => 'ni', '泥' => 'ni', '淣' => 'ni', '溺' => 'ni', '狔' => 'ni', '猊' => 'ni', '痆' => 'ni', '眤' => 'ni', '睨' => 'ni', '秜' => 'ni', '籾' => 'ni', '縌' => 'ni', '胒' => 'ni', '腻' => 'ni', '膩' => 'ni', '臡' => 'ni', '苨' => 'ni', '薿' => 'ni', '蚭' => 'ni', '蜺' => 'ni', '觬' => 'ni', '貎' => 'ni', '跜' => 'ni', '輗' => 'ni', '迡' => 'ni', '逆' => 'ni', '郳' => 'ni', '鈮' => 'ni', '鉨' => 'ni', '鑈' => 'ni', '铌' => 'ni', '隬' => 'ni', '霓' => 'ni', '馜' => 'ni', '鯢' => 'ni', '鲵' => 'ni', '麑' => 'ni', '齯' => 'ni', '㞾' => 'ni', '㠜' => 'ni', '㣇' => 'ni', '㥾' => 'ni', '㦐' => 'ni', '㪒' => 'ni', '㲻' => 'ni', '㵫' => 'ni', '㹸' => 'ni', '䁥' => 'ni', '䕥' => 'ni', '䘌' => 'ni', '䘦' => 'ni', '䘽' => 'ni', '䛏' => 'ni', '䝚' => 'ni', '䦵' => 'ni', '䧇' => 'ni', '䭲' => 'ni', '䰯' => 'ni', '䵑' => 'ni', '䵒' => 'ni',
+ '伴' => 'ban', '办' => 'ban', '半' => 'ban', '坂' => 'ban', '姅' => 'ban', '岅' => 'ban', '怑' => 'ban', '扮' => 'ban', '扳' => 'ban', '拌' => 'ban', '搬' => 'ban', '攽' => 'ban', '斑' => 'ban', '斒' => 'ban', '昄' => 'ban', '朌' => 'ban', '板' => 'ban', '湴' => 'ban', '版' => 'ban', '班' => 'ban', '瓣' => 'ban', '瓪' => 'ban', '瘢' => 'ban', '癍' => 'ban', '秚' => 'ban', '粄' => 'ban', '絆' => 'ban', '绊' => 'ban', '舨' => 'ban', '般' => 'ban', '蝂' => 'ban', '螁' => 'ban', '螌' => 'ban', '褩' => 'ban', '辦' => 'ban', '辬' => 'ban', '鈑' => 'ban', '鉡' => 'ban', '钣' => 'ban', '闆' => 'ban', '阪' => 'ban', '靽' => 'ban', '頒' => 'ban', '颁' => 'ban', '魬' => 'ban', '㚘' => 'ban', '㩯' => 'ban', '㪵' => 'ban', '㸞' => 'ban', '㺜' => 'ban', '䉽' => 'ban', '䕰' => 'ban', '䬳' => 'ban',
+ '伵' => 'xu', '侐' => 'xu', '俆' => 'xu', '偦' => 'xu', '冔' => 'xu', '勖' => 'xu', '勗' => 'xu', '卹' => 'xu', '叙' => 'xu', '呴' => 'xu', '喣' => 'xu', '嘘' => 'xu', '噓' => 'xu', '垿' => 'xu', '墟' => 'xu', '壻' => 'xu', '姁' => 'xu', '婿' => 'xu', '媭' => 'xu', '嬃' => 'xu', '幁' => 'xu', '序' => 'xu', '徐' => 'xu', '恤' => 'xu', '慉' => 'xu', '戌' => 'xu', '揟' => 'xu', '敍' => 'xu', '敘' => 'xu', '旭' => 'xu', '旴' => 'xu', '昫' => 'xu', '暊' => 'xu', '朂' => 'xu', '栩' => 'xu', '楈' => 'xu', '槒' => 'xu', '欨' => 'xu', '欰' => 'xu', '欻' => 'xu', '歔' => 'xu', '歘' => 'xu', '殈' => 'xu', '汿' => 'xu', '沀' => 'xu', '洫' => 'xu', '湑' => 'xu', '溆' => 'xu', '漵' => 'xu', '潊' => 'xu', '烅' => 'xu', '烼' => 'xu', '煦' => 'xu', '獝' => 'xu', '珝' => 'xu', '珬' => 'xu', '畜' => 'xu', '疞' => 'xu', '盢' => 'xu', '盨' => 'xu', '盱' => 'xu', '瞁' => 'xu', '瞲' => 'xu', '砉' => 'xu', '稰' => 'xu', '稸' => 'xu', '窢' => 'xu', '糈' => 'xu', '絮' => 'xu', '続' => 'xu', '緒' => 'xu', '緖' => 'xu', '縃' => 'xu', '續' => 'xu', '绪' => 'xu', '续' => 'xu', '聟' => 'xu', '胥' => 'xu', '蒣' => 'xu', '蓄' => 'xu', '蓿' => 'xu', '蕦' => 'xu', '藇' => 'xu', '藚' => 'xu', '虗' => 'xu', '虚' => 'xu', '虛' => 'xu', '蝑' => 'xu', '訏' => 'xu', '許' => 'xu', '訹' => 'xu', '詡' => 'xu', '諝' => 'xu', '譃' => 'xu', '许' => 'xu', '诩' => 'xu', '谞' => 'xu', '賉' => 'xu', '鄦' => 'xu', '酗' => 'xu', '醑' => 'xu', '銊' => 'xu', '鑐' => 'xu', '需' => 'xu', '須' => 'xu', '頊' => 'xu', '须' => 'xu', '顼' => 'xu', '驉' => 'xu', '鬚' => 'xu', '魆' => 'xu', '魖' => 'xu', '鱮' => 'xu', '㐨' => 'xu', '㑔' => 'xu', '㑯' => 'xu', '㕛' => 'xu', '㖅' => 'xu', '㗵' => 'xu', '㘧' => 'xu', '㚜' => 'xu', '㜅' => 'xu', '㜿' => 'xu', '㞊' => 'xu', '㞰' => 'xu', '㤢' => 'xu', '㥠' => 'xu', '㦽' => 'xu', '㰲' => 'xu', '㵰' => 'xu', '㷦' => 'xu', '㺷' => 'xu', '㾥' => 'xu', '䂆' => 'xu', '䅡' => 'xu', '䋶' => 'xu', '䍱' => 'xu', '䔓' => 'xu', '䘏' => 'xu', '䙒' => 'xu', '䛙' => 'xu', '䜡' => 'xu', '䢕' => 'xu', '䣱' => 'xu', '䣴' => 'xu', '䦗' => 'xu', '䦽' => 'xu', '䬔' => 'xu', '䱛' => 'xu', '䳳' => 'xu',
+ '伷' => 'zhou', '侜' => 'zhou', '僽' => 'zhou', '冑' => 'zhou', '周' => 'zhou', '呪' => 'zhou', '咒' => 'zhou', '咮' => 'zhou', '喌' => 'zhou', '噣' => 'zhou', '嚋' => 'zhou', '妯' => 'zhou', '婤' => 'zhou', '宙' => 'zhou', '州' => 'zhou', '帚' => 'zhou', '徟' => 'zhou', '昼' => 'zhou', '晝' => 'zhou', '晭' => 'zhou', '洀' => 'zhou', '洲' => 'zhou', '淍' => 'zhou', '炿' => 'zhou', '烐' => 'zhou', '珘' => 'zhou', '甃' => 'zhou', '疛' => 'zhou', '皱' => 'zhou', '皺' => 'zhou', '盩' => 'zhou', '睭' => 'zhou', '矪' => 'zhou', '碡' => 'zhou', '箒' => 'zhou', '籀' => 'zhou', '籒' => 'zhou', '籕' => 'zhou', '粙' => 'zhou', '粥' => 'zhou', '紂' => 'zhou', '縐' => 'zhou', '纣' => 'zhou', '绉' => 'zhou', '肘' => 'zhou', '胄' => 'zhou', '舟' => 'zhou', '荮' => 'zhou', '菷' => 'zhou', '葤' => 'zhou', '詋' => 'zhou', '謅' => 'zhou', '譸' => 'zhou', '诌' => 'zhou', '诪' => 'zhou', '賙' => 'zhou', '赒' => 'zhou', '軸' => 'zhou', '輈' => 'zhou', '輖' => 'zhou', '轴' => 'zhou', '辀' => 'zhou', '週' => 'zhou', '郮' => 'zhou', '酎' => 'zhou', '銂' => 'zhou', '霌' => 'zhou', '駎' => 'zhou', '駲' => 'zhou', '騆' => 'zhou', '驟' => 'zhou', '骤' => 'zhou', '鯞' => 'zhou', '鵃' => 'zhou', '鸼' => 'zhou', '㑇' => 'zhou', '㑳' => 'zhou', '㔌' => 'zhou', '㛩' => 'zhou', '㥮' => 'zhou', '㼙' => 'zhou', '㾭' => 'zhou', '䇠' => 'zhou', '䈙' => 'zhou', '䋓' => 'zhou', '䎻' => 'zhou', '䏲' => 'zhou', '䐍' => 'zhou', '䖞' => 'zhou', '䛆' => 'zhou', '䩜' => 'zhou', '䶇' => 'zhou',
+ '伸' => 'shen', '侁' => 'shen', '侺' => 'shen', '兟' => 'shen', '呻' => 'shen', '哂' => 'shen', '堔' => 'shen', '妽' => 'shen', '姺' => 'shen', '娠' => 'shen', '婶' => 'shen', '嬸' => 'shen', '审' => 'shen', '宷' => 'shen', '審' => 'shen', '屾' => 'shen', '峷' => 'shen', '弞' => 'shen', '愼' => 'shen', '慎' => 'shen', '扟' => 'shen', '抌' => 'shen', '昚' => 'shen', '曋' => 'shen', '柛' => 'shen', '椮' => 'shen', '椹' => 'shen', '榊' => 'shen', '氠' => 'shen', '沈' => 'shen', '涁' => 'shen', '深' => 'shen', '渖' => 'shen', '渗' => 'shen', '滲' => 'shen', '瀋' => 'shen', '燊' => 'shen', '珅' => 'shen', '甚' => 'shen', '甡' => 'shen', '甧' => 'shen', '申' => 'shen', '瘆' => 'shen', '瘮' => 'shen', '眒' => 'shen', '眘' => 'shen', '瞫' => 'shen', '矤' => 'shen', '矧' => 'shen', '砷' => 'shen', '神' => 'shen', '祳' => 'shen', '穼' => 'shen', '籶' => 'shen', '籸' => 'shen', '紳' => 'shen', '绅' => 'shen', '罙' => 'shen', '罧' => 'shen', '肾' => 'shen', '胂' => 'shen', '脤' => 'shen', '腎' => 'shen', '葠' => 'shen', '蓡' => 'shen', '蔘' => 'shen', '薓' => 'shen', '蜃' => 'shen', '裑' => 'shen', '覾' => 'shen', '訠' => 'shen', '訷' => 'shen', '詵' => 'shen', '諗' => 'shen', '讅' => 'shen', '诜' => 'shen', '谂' => 'shen', '谉' => 'shen', '身' => 'shen', '邥' => 'shen', '鉮' => 'shen', '鋠' => 'shen', '頣' => 'shen', '駪' => 'shen', '魫' => 'shen', '鯓' => 'shen', '鯵' => 'shen', '鰰' => 'shen', '鰺' => 'shen', '鲹' => 'shen', '鵢' => 'shen', '㔤' => 'shen', '㜤' => 'shen', '㥲' => 'shen', '㰂' => 'shen', '㰮' => 'shen', '㵊' => 'shen', '㵕' => 'shen', '㾕' => 'shen', '䆦' => 'shen', '䰠' => 'shen',
+ '伹' => 'qu', '佉' => 'qu', '佢' => 'qu', '刞' => 'qu', '劬' => 'qu', '匤' => 'qu', '匷' => 'qu', '区' => 'qu', '區' => 'qu', '厺' => 'qu', '去' => 'qu', '取' => 'qu', '呿' => 'qu', '坥' => 'qu', '娶' => 'qu', '屈' => 'qu', '岖' => 'qu', '岨' => 'qu', '岴' => 'qu', '嶇' => 'qu', '忂' => 'qu', '憈' => 'qu', '戵' => 'qu', '抾' => 'qu', '敺' => 'qu', '斪' => 'qu', '曲' => 'qu', '朐' => 'qu', '朑' => 'qu', '欋' => 'qu', '氍' => 'qu', '浀' => 'qu', '淭' => 'qu', '渠' => 'qu', '灈' => 'qu', '璖' => 'qu', '璩' => 'qu', '癯' => 'qu', '磲' => 'qu', '祛' => 'qu', '竘' => 'qu', '竬' => 'qu', '筁' => 'qu', '籧' => 'qu', '粬' => 'qu', '紶' => 'qu', '絇' => 'qu', '翑' => 'qu', '翵' => 'qu', '耝' => 'qu', '胊' => 'qu', '胠' => 'qu', '臞' => 'qu', '菃' => 'qu', '葋' => 'qu', '蕖' => 'qu', '蘧' => 'qu', '蛆' => 'qu', '蛐' => 'qu', '蝺' => 'qu', '螶' => 'qu', '蟝' => 'qu', '蠷' => 'qu', '蠼' => 'qu', '衐' => 'qu', '衢' => 'qu', '袪' => 'qu', '覰' => 'qu', '覷' => 'qu', '覻' => 'qu', '觑' => 'qu', '詓' => 'qu', '詘' => 'qu', '誳' => 'qu', '诎' => 'qu', '趋' => 'qu', '趣' => 'qu', '趨' => 'qu', '躣' => 'qu', '躯' => 'qu', '軀' => 'qu', '軥' => 'qu', '迲' => 'qu', '郥' => 'qu', '鑺' => 'qu', '閴' => 'qu', '闃' => 'qu', '阒' => 'qu', '阹' => 'qu', '駆' => 'qu', '駈' => 'qu', '驅' => 'qu', '驱' => 'qu', '髷' => 'qu', '魼' => 'qu', '鰸' => 'qu', '鱋' => 'qu', '鴝' => 'qu', '鸜' => 'qu', '鸲' => 'qu', '麮' => 'qu', '麯' => 'qu', '麴' => 'qu', '麹' => 'qu', '黢' => 'qu', '鼁' => 'qu', '鼩' => 'qu', '齲' => 'qu', '龋' => 'qu', '㖆' => 'qu', '㜹' => 'qu', '㠊' => 'qu', '㣄' => 'qu', '㧁' => 'qu', '㫢' => 'qu', '㯫' => 'qu', '㰦' => 'qu', '㲘' => 'qu', '䀠' => 'qu', '䁦' => 'qu', '䂂' => 'qu', '䋧' => 'qu', '䒧' => 'qu', '䝣' => 'qu', '䞤' => 'qu', '䟊' => 'qu', '䠐' => 'qu', '䵶' => 'qu', '䶚' => 'qu',
+ '伻' => 'beng', '嘣' => 'beng', '埄' => 'beng', '埲' => 'beng', '塴' => 'beng', '奟' => 'beng', '崩' => 'beng', '嵭' => 'beng', '泵' => 'beng', '琣' => 'beng', '琫' => 'beng', '甏' => 'beng', '甭' => 'beng', '痭' => 'beng', '祊' => 'beng', '絣' => 'beng', '綳' => 'beng', '繃' => 'beng', '绷' => 'beng', '菶' => 'beng', '跰' => 'beng', '蹦' => 'beng', '迸' => 'beng', '逬' => 'beng', '鏰' => 'beng', '镚' => 'beng', '閍' => 'beng', '鞛' => 'beng', '㑟' => 'beng', '㱶' => 'beng', '㷯' => 'beng', '䋽' => 'beng', '䙀' => 'beng', '䨻' => 'beng', '䩬' => 'beng', '䭰' => 'beng', '䳞' => 'beng',
+ '伽' => 'ga', '嘎' => 'ga', '嘠' => 'ga', '噶' => 'ga', '尕' => 'ga', '尜' => 'ga', '尬' => 'ga', '旮' => 'ga', '玍' => 'ga', '釓' => 'ga', '錷' => 'ga', '钆' => 'ga', '魀' => 'ga',
+ '佃' => 'dian', '傎' => 'dian', '典' => 'dian', '厧' => 'dian', '唸' => 'dian', '坫' => 'dian', '垫' => 'dian', '墊' => 'dian', '壂' => 'dian', '奌' => 'dian', '奠' => 'dian', '婝' => 'dian', '婰' => 'dian', '嵮' => 'dian', '巅' => 'dian', '巓' => 'dian', '巔' => 'dian', '店' => 'dian', '惦' => 'dian', '扂' => 'dian', '掂' => 'dian', '攧' => 'dian', '敁' => 'dian', '敟' => 'dian', '椣' => 'dian', '槙' => 'dian', '橂' => 'dian', '殿' => 'dian', '淀' => 'dian', '滇' => 'dian', '澱' => 'dian', '点' => 'dian', '玷' => 'dian', '琔' => 'dian', '电' => 'dian', '甸' => 'dian', '瘨' => 'dian', '癜' => 'dian', '癫' => 'dian', '癲' => 'dian', '碘' => 'dian', '磹' => 'dian', '簟' => 'dian', '蒧' => 'dian', '蕇' => 'dian', '蜔' => 'dian', '踮' => 'dian', '蹎' => 'dian', '鈿' => 'dian', '钿' => 'dian', '阽' => 'dian', '電' => 'dian', '靛' => 'dian', '顚' => 'dian', '顛' => 'dian', '颠' => 'dian', '驔' => 'dian', '點' => 'dian', '齻' => 'dian', '㓠' => 'dian', '㚲' => 'dian', '㝪' => 'dian', '㞟' => 'dian', '㥆' => 'dian', '㵤' => 'dian', '㶘' => 'dian', '㸃' => 'dian', '㼭' => 'dian', '䍄' => 'dian', '䓦' => 'dian', '䟍' => 'dian', '䧃' => 'dian',
+ '佄' => 'han', '傼' => 'han', '兯' => 'han', '函' => 'han', '凾' => 'han', '厈' => 'han', '含' => 'han', '咁' => 'han', '哻' => 'han', '唅' => 'han', '喊' => 'han', '圅' => 'han', '垾' => 'han', '娢' => 'han', '嫨' => 'han', '寒' => 'han', '屽' => 'han', '崡' => 'han', '嵅' => 'han', '悍' => 'han', '憨' => 'han', '憾' => 'han', '扞' => 'han', '捍' => 'han', '撖' => 'han', '撼' => 'han', '旱' => 'han', '晗' => 'han', '晘' => 'han', '晥' => 'han', '暵' => 'han', '梒' => 'han', '汉' => 'han', '汗' => 'han', '浛' => 'han', '浫' => 'han', '涆' => 'han', '涵' => 'han', '淊' => 'han', '漢' => 'han', '澏' => 'han', '瀚' => 'han', '焊' => 'han', '焓' => 'han', '熯' => 'han', '爳' => 'han', '猂' => 'han', '琀' => 'han', '甝' => 'han', '皔' => 'han', '睅' => 'han', '筨' => 'han', '罕' => 'han', '翰' => 'han', '肣' => 'han', '莟' => 'han', '菡' => 'han', '蔊' => 'han', '蘫' => 'han', '虷' => 'han', '蚶' => 'han', '蛿' => 'han', '蜬' => 'han', '蜭' => 'han', '螒' => 'han', '譀' => 'han', '谽' => 'han', '豃' => 'han', '邗' => 'han', '邯' => 'han', '酣' => 'han', '釬' => 'han', '銲' => 'han', '鋎' => 'han', '鋡' => 'han', '閈' => 'han', '闬' => 'han', '雗' => 'han', '韓' => 'han', '韩' => 'han', '頇' => 'han', '頷' => 'han', '顄' => 'han', '顸' => 'han', '颔' => 'han', '馠' => 'han', '馯' => 'han', '駻' => 'han', '鬫' => 'han', '魽' => 'han', '鶾' => 'han', '鼾' => 'han', '㑵' => 'han', '㒈' => 'han', '㖤' => 'han', '㘎' => 'han', '㘕' => 'han', '㘚' => 'han', '㙈' => 'han', '㙔' => 'han', '㙳' => 'han', '㜦' => 'han', '㟏' => 'han', '㟔' => 'han', '㢨' => 'han', '㨔' => 'han', '㪋' => 'han', '㮀' => 'han', '㲦' => 'han', '㵄' => 'han', '㵎' => 'han', '㶰' => 'han', '㸁' => 'han', '㺖' => 'han', '㼨' => 'han', '㽉' => 'han', '㽳' => 'han', '䁔' => 'han', '䈄' => 'han', '䌍' => 'han', '䍐' => 'han', '䍑' => 'han', '䎯' => 'han', '䏷' => 'han', '䐄' => 'han', '䓍' => 'han', '䓿' => 'han', '䕿' => 'han', '䖔' => 'han', '䗙' => 'han', '䘶' => 'han', '䛞' => 'han', '䤴' => 'han', '䥁' => 'han', '䧲' => 'han', '䨡' => 'han', '䫲' => 'han', '䮧' => 'han', '䶃' => 'han',
+ '佊' => 'bi', '佖' => 'bi', '俾' => 'bi', '偪' => 'bi', '匂' => 'bi', '匕' => 'bi', '吡' => 'bi', '哔' => 'bi', '啚' => 'bi', '嗶' => 'bi', '坒' => 'bi', '堛' => 'bi', '壁' => 'bi', '夶' => 'bi', '奰' => 'bi', '妣' => 'bi', '妼' => 'bi', '婢' => 'bi', '嬖' => 'bi', '嬶' => 'bi', '屄' => 'bi', '币' => 'bi', '幣' => 'bi', '幤' => 'bi', '庇' => 'bi', '庳' => 'bi', '廦' => 'bi', '弊' => 'bi', '弻' => 'bi', '弼' => 'bi', '彃' => 'bi', '彼' => 'bi', '必' => 'bi', '怭' => 'bi', '愊' => 'bi', '愎' => 'bi', '敝' => 'bi', '斃' => 'bi', '朼' => 'bi', '枈' => 'bi', '柀' => 'bi', '柲' => 'bi', '梐' => 'bi', '楅' => 'bi', '比' => 'bi', '毕' => 'bi', '毖' => 'bi', '毙' => 'bi', '毴' => 'bi', '沘' => 'bi', '湢' => 'bi', '滗' => 'bi', '滭' => 'bi', '潷' => 'bi', '濞' => 'bi', '煏' => 'bi', '熚' => 'bi', '狴' => 'bi', '獘' => 'bi', '獙' => 'bi', '珌' => 'bi', '璧' => 'bi', '畀' => 'bi', '畁' => 'bi', '畢' => 'bi', '疕' => 'bi', '疪' => 'bi', '痹' => 'bi', '痺' => 'bi', '皀' => 'bi', '皕' => 'bi', '碧' => 'bi', '禆' => 'bi', '秕' => 'bi', '稫' => 'bi', '笔' => 'bi', '筆' => 'bi', '筚' => 'bi', '箅' => 'bi', '箆' => 'bi', '篦' => 'bi', '篳' => 'bi', '粃' => 'bi', '粊' => 'bi', '綼' => 'bi', '縪' => 'bi', '繴' => 'bi', '罼' => 'bi', '聛' => 'bi', '胇' => 'bi', '腷' => 'bi', '臂' => 'bi', '舭' => 'bi', '苾' => 'bi', '荜' => 'bi', '荸' => 'bi', '萆' => 'bi', '萞' => 'bi', '蓖' => 'bi', '蓽' => 'bi', '蔽' => 'bi', '薜' => 'bi', '蜌' => 'bi', '螕' => 'bi', '袐' => 'bi', '裨' => 'bi', '襅' => 'bi', '襞' => 'bi', '襣' => 'bi', '觱' => 'bi', '詖' => 'bi', '诐' => 'bi', '豍' => 'bi', '貏' => 'bi', '貱' => 'bi', '贔' => 'bi', '赑' => 'bi', '跸' => 'bi', '蹕' => 'bi', '躃' => 'bi', '躄' => 'bi', '辟' => 'bi', '逼' => 'bi', '避' => 'bi', '邲' => 'bi', '鄙' => 'bi', '鄨' => 'bi', '鄪' => 'bi', '鉍' => 'bi', '鎞' => 'bi', '鏎' => 'bi', '鐴' => 'bi', '铋' => 'bi', '閇' => 'bi', '閉' => 'bi', '閟' => 'bi', '闭' => 'bi', '陛' => 'bi', '鞞' => 'bi', '鞸' => 'bi', '韠' => 'bi', '飶' => 'bi', '饆' => 'bi', '馝' => 'bi', '駜' => 'bi', '驆' => 'bi', '髀' => 'bi', '髲' => 'bi', '魓' => 'bi', '鮅' => 'bi', '鰏' => 'bi', '鲾' => 'bi', '鵖' => 'bi', '鷝' => 'bi', '鷩' => 'bi', '鼊' => 'bi', '鼻' => 'bi', '㓖' => 'bi', '㗉' => 'bi', '㘠' => 'bi', '㘩' => 'bi', '㙄' => 'bi', '㚰' => 'bi', '㠲' => 'bi', '㡀' => 'bi', '㡙' => 'bi', '㢰' => 'bi', '㢶' => 'bi', '㢸' => 'bi', '㧙' => 'bi', '㪏' => 'bi', '㪤' => 'bi', '㮰' => 'bi', '㮿' => 'bi', '㯇' => 'bi', '㱸' => 'bi', '㳼' => 'bi', '㵥' => 'bi', '㵨' => 'bi', '㹃' => 'bi', '㻫' => 'bi', '㻶' => 'bi', '㿫' => 'bi', '䀣' => 'bi', '䁹' => 'bi', '䃾' => 'bi', '䄶' => 'bi', '䇷' => 'bi', '䊧' => 'bi', '䋔' => 'bi', '䌟' => 'bi', '䎵' => 'bi', '䏢' => 'bi', '䏶' => 'bi', '䕗' => 'bi', '䖩' => 'bi', '䘡' => 'bi', '䟆' => 'bi', '䟤' => 'bi', '䠋' => 'bi', '䣥' => 'bi', '䦘' => 'bi', '䧗' => 'bi', '䨆' => 'bi', '䩛' => 'bi', '䪐' => 'bi', '䫁' => 'bi', '䫾' => 'bi', '䭮' => 'bi', '䮡' => 'bi', '䯗' => 'bi', '䵄' => 'bi',
+ '佋' => 'zhao', '兆' => 'zhao', '召' => 'zhao', '啁' => 'zhao', '垗' => 'zhao', '妱' => 'zhao', '巶' => 'zhao', '找' => 'zhao', '招' => 'zhao', '旐' => 'zhao', '昭' => 'zhao', '曌' => 'zhao', '枛' => 'zhao', '棹' => 'zhao', '櫂' => 'zhao', '沼' => 'zhao', '炤' => 'zhao', '照' => 'zhao', '燳' => 'zhao', '爫' => 'zhao', '狣' => 'zhao', '瑵' => 'zhao', '盄' => 'zhao', '瞾' => 'zhao', '窼' => 'zhao', '笊' => 'zhao', '箌' => 'zhao', '罀' => 'zhao', '罩' => 'zhao', '羄' => 'zhao', '肁' => 'zhao', '肇' => 'zhao', '肈' => 'zhao', '詔' => 'zhao', '诏' => 'zhao', '赵' => 'zhao', '趙' => 'zhao', '釗' => 'zhao', '鉊' => 'zhao', '鍣' => 'zhao', '钊' => 'zhao', '駋' => 'zhao', '鮡' => 'zhao', '㕚' => 'zhao', '㡽' => 'zhao', '㨄' => 'zhao', '㷖' => 'zhao', '㺐' => 'zhao', '䃍' => 'zhao', '䈃' => 'zhao', '䈇' => 'zhao', '䍜' => 'zhao', '䍮' => 'zhao', '䝖' => 'zhao', '䮓' => 'zhao',
+ '佌' => 'ci', '佽' => 'ci', '偨' => 'ci', '刺' => 'ci', '刾' => 'ci', '呲' => 'ci', '嗭' => 'ci', '垐' => 'ci', '堲' => 'ci', '嬨' => 'ci', '庛' => 'ci', '慈' => 'ci', '朿' => 'ci', '柌' => 'ci', '栨' => 'ci', '次' => 'ci', '此' => 'ci', '泚' => 'ci', '濨' => 'ci', '玼' => 'ci', '珁' => 'ci', '瓷' => 'ci', '甆' => 'ci', '疵' => 'ci', '皉' => 'ci', '磁' => 'ci', '礠' => 'ci', '祠' => 'ci', '糍' => 'ci', '絘' => 'ci', '縒' => 'ci', '茈' => 'ci', '茦' => 'ci', '茨' => 'ci', '莿' => 'ci', '薋' => 'ci', '蛓' => 'ci', '螆' => 'ci', '蠀' => 'ci', '詞' => 'ci', '词' => 'ci', '賜' => 'ci', '赐' => 'ci', '趀' => 'ci', '跐' => 'ci', '辝' => 'ci', '辞' => 'ci', '辤' => 'ci', '辭' => 'ci', '鈶' => 'ci', '雌' => 'ci', '飺' => 'ci', '餈' => 'ci', '骴' => 'ci', '鴜' => 'ci', '鶿' => 'ci', '鷀' => 'ci', '鹚' => 'ci', '㓨' => 'ci', '㘂' => 'ci', '㘹' => 'ci', '㞖' => 'ci', '㠿' => 'ci', '㡹' => 'ci', '㢀' => 'ci', '㤵' => 'ci', '㩞' => 'ci', '㹂' => 'ci', '䂣' => 'ci', '䆅' => 'ci', '䈘' => 'ci', '䓧' => 'ci', '䖪' => 'ci', '䗹' => 'ci', '䛐' => 'ci', '䦻' => 'ci', '䧳' => 'ci', '䨏' => 'ci', '䭣' => 'ci', '䯸' => 'ci', '䰍' => 'ci', '䲿' => 'ci', '䳄' => 'ci', '䳐' => 'ci',
+ '佐' => 'zuo', '作' => 'zuo', '侳' => 'zuo', '做' => 'zuo', '咗' => 'zuo', '唑' => 'zuo', '坐' => 'zuo', '岝' => 'zuo', '岞' => 'zuo', '左' => 'zuo', '座' => 'zuo', '怍' => 'zuo', '捽' => 'zuo', '昨' => 'zuo', '柞' => 'zuo', '椊' => 'zuo', '祚' => 'zuo', '秨' => 'zuo', '稓' => 'zuo', '筰' => 'zuo', '糳' => 'zuo', '繓' => 'zuo', '胙' => 'zuo', '莋' => 'zuo', '葃' => 'zuo', '葄' => 'zuo', '蓙' => 'zuo', '袏' => 'zuo', '鈼' => 'zuo', '阼' => 'zuo', '飵' => 'zuo', '㑅' => 'zuo', '㘀' => 'zuo', '㘴' => 'zuo', '㛗' => 'zuo', '㝾' => 'zuo', '㭮' => 'zuo', '㸲' => 'zuo', '䋏' => 'zuo', '䎰' => 'zuo', '䔘' => 'zuo', '䝫' => 'zuo', '䞰' => 'zuo',
+ '体' => 'ti', '倜' => 'ti', '偍' => 'ti', '剃' => 'ti', '剔' => 'ti', '厗' => 'ti', '啼' => 'ti', '嗁' => 'ti', '嚏' => 'ti', '嚔' => 'ti', '媞' => 'ti', '屉' => 'ti', '屜' => 'ti', '崹' => 'ti', '徲' => 'ti', '悌' => 'ti', '悐' => 'ti', '惕' => 'ti', '惖' => 'ti', '惿' => 'ti', '戻' => 'ti', '挮' => 'ti', '掦' => 'ti', '提' => 'ti', '揥' => 'ti', '替' => 'ti', '梯' => 'ti', '楴' => 'ti', '歒' => 'ti', '殢' => 'ti', '洟' => 'ti', '涕' => 'ti', '渧' => 'ti', '漽' => 'ti', '珶' => 'ti', '瑅' => 'ti', '瓋' => 'ti', '碮' => 'ti', '稊' => 'ti', '籊' => 'ti', '綈' => 'ti', '緹' => 'ti', '绨' => 'ti', '缇' => 'ti', '罤' => 'ti', '蕛' => 'ti', '薙' => 'ti', '蝭' => 'ti', '裼' => 'ti', '褅' => 'ti', '謕' => 'ti', '趧' => 'ti', '趯' => 'ti', '踢' => 'ti', '蹄' => 'ti', '蹏' => 'ti', '躰' => 'ti', '軆' => 'ti', '逖' => 'ti', '逷' => 'ti', '遆' => 'ti', '醍' => 'ti', '銻' => 'ti', '鍗' => 'ti', '鐟' => 'ti', '锑' => 'ti', '題' => 'ti', '题' => 'ti', '騠' => 'ti', '骵' => 'ti', '體' => 'ti', '髰' => 'ti', '鬀' => 'ti', '鬄' => 'ti', '鮷' => 'ti', '鯷' => 'ti', '鳀' => 'ti', '鴺' => 'ti', '鵜' => 'ti', '鶗' => 'ti', '鶙' => 'ti', '鷈' => 'ti', '鷉' => 'ti', '鹈' => 'ti', '㖒' => 'ti', '㗣' => 'ti', '㡗' => 'ti', '㣢' => 'ti', '㬱' => 'ti', '㯩' => 'ti', '䅠' => 'ti', '䌡' => 'ti', '䎮' => 'ti', '䔶' => 'ti', '䙗' => 'ti', '䚣' => 'ti', '䛱' => 'ti', '䝰' => 'ti', '䣡' => 'ti', '䣽' => 'ti', '䧅' => 'ti', '䨑' => 'ti', '䪆' => 'ti', '䬾' => 'ti', '䯜' => 'ti', '䴘' => 'ti', '䶏' => 'ti', '䶑' => 'ti',
+ '佔' => 'zhan', '偡' => 'zhan', '占' => 'zhan', '噡' => 'zhan', '嫸' => 'zhan', '展' => 'zhan', '崭' => 'zhan', '嶃' => 'zhan', '嶄' => 'zhan', '嶘' => 'zhan', '嶦' => 'zhan', '惉' => 'zhan', '战' => 'zhan', '戦' => 'zhan', '戰' => 'zhan', '拃' => 'zhan', '搌' => 'zhan', '斩' => 'zhan', '斬' => 'zhan', '旃' => 'zhan', '旜' => 'zhan', '栈' => 'zhan', '栴' => 'zhan', '桟' => 'zhan', '棧' => 'zhan', '榐' => 'zhan', '橏' => 'zhan', '毡' => 'zhan', '氈' => 'zhan', '氊' => 'zhan', '沾' => 'zhan', '湛' => 'zhan', '澶' => 'zhan', '琖' => 'zhan', '皽' => 'zhan', '盏' => 'zhan', '盞' => 'zhan', '瞻' => 'zhan', '站' => 'zhan', '粘' => 'zhan', '綻' => 'zhan', '绽' => 'zhan', '菚' => 'zhan', '薝' => 'zhan', '蘸' => 'zhan', '虥' => 'zhan', '虦' => 'zhan', '蛅' => 'zhan', '覱' => 'zhan', '詀' => 'zhan', '詹' => 'zhan', '譫' => 'zhan', '讝' => 'zhan', '谵' => 'zhan', '趈' => 'zhan', '蹍' => 'zhan', '輚' => 'zhan', '輾' => 'zhan', '轏' => 'zhan', '辗' => 'zhan', '邅' => 'zhan', '醆' => 'zhan', '閚' => 'zhan', '霑' => 'zhan', '颭' => 'zhan', '飐' => 'zhan', '飦' => 'zhan', '饘' => 'zhan', '驏' => 'zhan', '驙' => 'zhan', '骣' => 'zhan', '魙' => 'zhan', '鱣' => 'zhan', '鳣' => 'zhan', '鸇' => 'zhan', '鹯' => 'zhan', '黵' => 'zhan', '㞡' => 'zhan', '㟞' => 'zhan', '㠭' => 'zhan', '㣶' => 'zhan', '㺘' => 'zhan', '㻵' => 'zhan', '䁴' => 'zhan', '䋎' => 'zhan', '䎒' => 'zhan', '䗃' => 'zhan', '䘺' => 'zhan', '䟋' => 'zhan', '䡀' => 'zhan', '䩅' => 'zhan', '䪌' => 'zhan', '䱠' => 'zhan', '䱼' => 'zhan',
+ '何' => 'he', '佫' => 'he', '劾' => 'he', '合' => 'he', '呵' => 'he', '咊' => 'he', '和' => 'he', '哬' => 'he', '啝' => 'he', '喝' => 'he', '嗃' => 'he', '嗬' => 'he', '垎' => 'he', '壑' => 'he', '姀' => 'he', '寉' => 'he', '峆' => 'he', '惒' => 'he', '抲' => 'he', '敆' => 'he', '曷' => 'he', '柇' => 'he', '核' => 'he', '楁' => 'he', '欱' => 'he', '毼' => 'he', '河' => 'he', '涸' => 'he', '渮' => 'he', '湼' => 'he', '澕' => 'he', '焃' => 'he', '煂' => 'he', '熆' => 'he', '熇' => 'he', '燺' => 'he', '爀' => 'he', '狢' => 'he', '癋' => 'he', '皬' => 'he', '盇' => 'he', '盉' => 'he', '盍' => 'he', '盒' => 'he', '碋' => 'he', '礉' => 'he', '禾' => 'he', '秴' => 'he', '篕' => 'he', '籺' => 'he', '粭' => 'he', '翮' => 'he', '翯' => 'he', '荷' => 'he', '菏' => 'he', '萂' => 'he', '蚵' => 'he', '螛' => 'he', '蠚' => 'he', '袔' => 'he', '褐' => 'he', '覈' => 'he', '訶' => 'he', '訸' => 'he', '詥' => 'he', '诃' => 'he', '貈' => 'he', '貉' => 'he', '賀' => 'he', '贺' => 'he', '赫' => 'he', '郃' => 'he', '鉌' => 'he', '鑉' => 'he', '閡' => 'he', '闔' => 'he', '阂' => 'he', '阖' => 'he', '隺' => 'he', '靍' => 'he', '靎' => 'he', '靏' => 'he', '鞨' => 'he', '頜' => 'he', '颌' => 'he', '饸' => 'he', '魺' => 'he', '鲄' => 'he', '鶡' => 'he', '鶴' => 'he', '鸖' => 'he', '鹖' => 'he', '鹤' => 'he', '麧' => 'he', '齃' => 'he', '齕' => 'he', '龁' => 'he', '龢' => 'he', '㓭' => 'he', '㔠' => 'he', '㕡' => 'he', '㕰' => 'he', '㥺' => 'he', '㦦' => 'he', '㪉' => 'he', '㬞' => 'he', '㭘' => 'he', '㭱' => 'he', '㮝' => 'he', '㮫' => 'he', '㵑' => 'he', '㷎' => 'he', '㷤' => 'he', '㹇' => 'he', '㿣' => 'he', '䃒' => 'he', '䅂' => 'he', '䎋' => 'he', '䒩' => 'he', '䓼' => 'he', '䕣' => 'he', '䚂' => 'he', '䞦' => 'he', '䢗' => 'he', '䪚' => 'he', '䫘' => 'he', '䳚' => 'he', '䳽' => 'he', '䴳' => 'he', '䵱' => 'he', '䶅' => 'he',
+ '佘' => 'she', '厍' => 'she', '厙' => 'she', '奢' => 'she', '射' => 'she', '弽' => 'she', '慑' => 'she', '慴' => 'she', '懾' => 'she', '捨' => 'she', '摂' => 'she', '摄' => 'she', '摵' => 'she', '攝' => 'she', '檨' => 'she', '欇' => 'she', '涉' => 'she', '涻' => 'she', '渉' => 'she', '滠' => 'she', '灄' => 'she', '猞' => 'she', '畲' => 'she', '社' => 'she', '舌' => 'she', '舍' => 'she', '舎' => 'she', '蔎' => 'she', '虵' => 'she', '蛇' => 'she', '蛥' => 'she', '蠂' => 'she', '設' => 'she', '设' => 'she', '賒' => 'she', '賖' => 'she', '赊' => 'she', '赦' => 'she', '輋' => 'she', '韘' => 'she', '騇' => 'she', '麝' => 'she', '㒤' => 'she', '㢵' => 'she', '㭙' => 'she', '㰒' => 'she', '㴇' => 'she', '䀅' => 'she', '䁋' => 'she', '䁯' => 'she', '䂠' => 'she', '䄕' => 'she', '䌰' => 'she', '䞌' => 'she', '䠶' => 'she', '䤮' => 'she', '䬷' => 'she', '䵥' => 'she',
+ '佝' => 'gou', '冓' => 'gou', '勾' => 'gou', '坸' => 'gou', '垢' => 'gou', '够' => 'gou', '夠' => 'gou', '姤' => 'gou', '媾' => 'gou', '岣' => 'gou', '彀' => 'gou', '搆' => 'gou', '撀' => 'gou', '构' => 'gou', '枸' => 'gou', '構' => 'gou', '沟' => 'gou', '溝' => 'gou', '煹' => 'gou', '狗' => 'gou', '玽' => 'gou', '笱' => 'gou', '篝' => 'gou', '簼' => 'gou', '緱' => 'gou', '缑' => 'gou', '耇' => 'gou', '耈' => 'gou', '耉' => 'gou', '苟' => 'gou', '茩' => 'gou', '蚼' => 'gou', '袧' => 'gou', '褠' => 'gou', '覯' => 'gou', '觏' => 'gou', '訽' => 'gou', '詬' => 'gou', '诟' => 'gou', '豿' => 'gou', '購' => 'gou', '购' => 'gou', '遘' => 'gou', '鈎' => 'gou', '鉤' => 'gou', '钩' => 'gou', '雊' => 'gou', '鞲' => 'gou', '韝' => 'gou', '㗕' => 'gou', '㜌' => 'gou', '㝅' => 'gou', '㝤' => 'gou', '㨌' => 'gou', '㳶' => 'gou', '㺃' => 'gou', '䃓' => 'gou', '䝭' => 'gou', '䞀' => 'gou',
+ '佞' => 'ning', '侫' => 'ning', '儜' => 'ning', '凝' => 'ning', '咛' => 'ning', '嚀' => 'ning', '嬣' => 'ning', '宁' => 'ning', '寍' => 'ning', '寕' => 'ning', '寗' => 'ning', '寜' => 'ning', '寧' => 'ning', '拧' => 'ning', '擰' => 'ning', '柠' => 'ning', '橣' => 'ning', '檸' => 'ning', '泞' => 'ning', '澝' => 'ning', '濘' => 'ning', '狞' => 'ning', '獰' => 'ning', '甯' => 'ning', '矃' => 'ning', '聍' => 'ning', '聹' => 'ning', '薴' => 'ning', '鑏' => 'ning', '鬡' => 'ning', '鸋' => 'ning', '㝕' => 'ning', '㣷' => 'ning', '㲰' => 'ning', '㿦' => 'ning', '䔭' => 'ning', '䗿' => 'ning', '䭢' => 'ning',
+ '佣' => 'yong', '俑' => 'yong', '傛' => 'yong', '傭' => 'yong', '勇' => 'yong', '勈' => 'yong', '咏' => 'yong', '喁' => 'yong', '嗈' => 'yong', '噰' => 'yong', '埇' => 'yong', '塎' => 'yong', '墉' => 'yong', '壅' => 'yong', '嫞' => 'yong', '嵱' => 'yong', '庸' => 'yong', '廱' => 'yong', '彮' => 'yong', '怺' => 'yong', '恿' => 'yong', '悀' => 'yong', '惥' => 'yong', '愑' => 'yong', '愹' => 'yong', '慂' => 'yong', '慵' => 'yong', '拥' => 'yong', '擁' => 'yong', '柡' => 'yong', '栐' => 'yong', '槦' => 'yong', '永' => 'yong', '泳' => 'yong', '涌' => 'yong', '湧' => 'yong', '滽' => 'yong', '澭' => 'yong', '灉' => 'yong', '牅' => 'yong', '用' => 'yong', '甬' => 'yong', '痈' => 'yong', '癕' => 'yong', '癰' => 'yong', '砽' => 'yong', '硧' => 'yong', '禜' => 'yong', '臃' => 'yong', '苚' => 'yong', '蛹' => 'yong', '詠' => 'yong', '踊' => 'yong', '踴' => 'yong', '邕' => 'yong', '郺' => 'yong', '鄘' => 'yong', '醟' => 'yong', '銿' => 'yong', '鏞' => 'yong', '镛' => 'yong', '雍' => 'yong', '雝' => 'yong', '顒' => 'yong', '颙' => 'yong', '饔' => 'yong', '鯒' => 'yong', '鰫' => 'yong', '鱅' => 'yong', '鲬' => 'yong', '鳙' => 'yong', '鷛' => 'yong', '㐯' => 'yong', '㙲' => 'yong', '㝘' => 'yong', '㞲' => 'yong', '㦷' => 'yong', '㶲' => 'yong', '㷏' => 'yong', '㽫' => 'yong', '䗤' => 'yong', '䞻' => 'yong',
+ '佤' => 'wa', '劸' => 'wa', '咓' => 'wa', '哇' => 'wa', '啘' => 'wa', '嗗' => 'wa', '嗢' => 'wa', '娃' => 'wa', '娲' => 'wa', '媧' => 'wa', '屲' => 'wa', '徍' => 'wa', '挖' => 'wa', '搲' => 'wa', '攨' => 'wa', '洼' => 'wa', '溛' => 'wa', '漥' => 'wa', '瓦' => 'wa', '瓲' => 'wa', '畖' => 'wa', '砙' => 'wa', '窊' => 'wa', '窪' => 'wa', '聉' => 'wa', '腽' => 'wa', '膃' => 'wa', '蛙' => 'wa', '袜' => 'wa', '襪' => 'wa', '邷' => 'wa', '韈' => 'wa', '韤' => 'wa', '鼃' => 'wa', '㧚' => 'wa', '㰪' => 'wa', '㼘' => 'wa', '䎳' => 'wa', '䚴' => 'wa', '䠚' => 'wa',
+ '佧' => 'ka', '卡' => 'ka', '咔' => 'ka', '咖' => 'ka', '咯' => 'ka', '喀' => 'ka', '垰' => 'ka', '胩' => 'ka', '裃' => 'ka', '鉲' => 'ka',
+ '佨' => 'bao', '保' => 'bao', '儤' => 'bao', '剝' => 'bao', '剥' => 'bao', '勹' => 'bao', '勽' => 'bao', '包' => 'bao', '堡' => 'bao', '堢' => 'bao', '報' => 'bao', '媬' => 'bao', '嫑' => 'bao', '孢' => 'bao', '宝' => 'bao', '寚' => 'bao', '寳' => 'bao', '寶' => 'bao', '忁' => 'bao', '怉' => 'bao', '报' => 'bao', '抱' => 'bao', '暴' => 'bao', '曓' => 'bao', '煲' => 'bao', '爆' => 'bao', '珤' => 'bao', '窇' => 'bao', '笣' => 'bao', '緥' => 'bao', '胞' => 'bao', '苞' => 'bao', '菢' => 'bao', '萡' => 'bao', '葆' => 'bao', '蕔' => 'bao', '薄' => 'bao', '藵' => 'bao', '虣' => 'bao', '袌' => 'bao', '褒' => 'bao', '褓' => 'bao', '襃' => 'bao', '豹' => 'bao', '賲' => 'bao', '趵' => 'bao', '鉋' => 'bao', '鑤' => 'bao', '铇' => 'bao', '闁' => 'bao', '雹' => 'bao', '靌' => 'bao', '靤' => 'bao', '飹' => 'bao', '飽' => 'bao', '饱' => 'bao', '駂' => 'bao', '骲' => 'bao', '髱' => 'bao', '鮑' => 'bao', '鲍' => 'bao', '鳵' => 'bao', '鴇' => 'bao', '鸨' => 'bao', '齙' => 'bao', '龅' => 'bao', '㙅' => 'bao', '㙸' => 'bao', '㫧' => 'bao', '㲏' => 'bao', '㲒' => 'bao', '㵡' => 'bao', '㻄' => 'bao', '㿺' => 'bao', '䈏' => 'bao', '䎂' => 'bao', '䤖' => 'bao', '䥤' => 'bao', '䨌' => 'bao', '䨔' => 'bao', '䪨' => 'bao', '䭋' => 'bao', '䳈' => 'bao', '䳰' => 'bao', '䴐' => 'bao',
+ '佬' => 'lao', '僗' => 'lao', '劳' => 'lao', '労' => 'lao', '勞' => 'lao', '咾' => 'lao', '哰' => 'lao', '唠' => 'lao', '嗠' => 'lao', '嘮' => 'lao', '姥' => 'lao', '嫪' => 'lao', '崂' => 'lao', '嶗' => 'lao', '恅' => 'lao', '憥' => 'lao', '憦' => 'lao', '捞' => 'lao', '撈' => 'lao', '朥' => 'lao', '栳' => 'lao', '橑' => 'lao', '橯' => 'lao', '浶' => 'lao', '涝' => 'lao', '澇' => 'lao', '烙' => 'lao', '牢' => 'lao', '狫' => 'lao', '珯' => 'lao', '痨' => 'lao', '癆' => 'lao', '硓' => 'lao', '磱' => 'lao', '窂' => 'lao', '簩' => 'lao', '粩' => 'lao', '老' => 'lao', '耂' => 'lao', '耢' => 'lao', '耮' => 'lao', '荖' => 'lao', '蛯' => 'lao', '蟧' => 'lao', '軂' => 'lao', '轑' => 'lao', '酪' => 'lao', '醪' => 'lao', '銠' => 'lao', '鐒' => 'lao', '铑' => 'lao', '铹' => 'lao', '顟' => 'lao', '髝' => 'lao', '鮱' => 'lao', '㗦' => 'lao', '㞠' => 'lao', '㟉' => 'lao', '㟙' => 'lao', '㟹' => 'lao', '㧯' => 'lao', '㨓' => 'lao', '䃕' => 'lao', '䇭' => 'lao', '䕩' => 'lao', '䜎' => 'lao', '䝁' => 'lao', '䝤' => 'lao', '䲏' => 'lao', '䳓' => 'lao', '䵏' => 'lao',
+ '佰' => 'bai', '兡' => 'bai', '呗' => 'bai', '唄' => 'bai', '庍' => 'bai', '拜' => 'bai', '拝' => 'bai', '挀' => 'bai', '捭' => 'bai', '掰' => 'bai', '摆' => 'bai', '擺' => 'bai', '敗' => 'bai', '柏' => 'bai', '栢' => 'bai', '猈' => 'bai', '瓸' => 'bai', '白' => 'bai', '百' => 'bai', '稗' => 'bai', '竡' => 'bai', '粨' => 'bai', '粺' => 'bai', '絔' => 'bai', '薭' => 'bai', '襬' => 'bai', '贁' => 'bai', '败' => 'bai', '鞁' => 'bai', '韛' => 'bai', '㗑' => 'bai', '㗗' => 'bai', '㠔' => 'bai', '㼟' => 'bai', '㼣' => 'bai', '㿟' => 'bai', '䒔' => 'bai', '䙓' => 'bai', '䢙' => 'bai', '䳆' => 'bai', '䴽' => 'bai',
+ '佲' => 'ming', '冥' => 'ming', '凕' => 'ming', '名' => 'ming', '命' => 'ming', '姳' => 'ming', '嫇' => 'ming', '慏' => 'ming', '掵' => 'ming', '明' => 'ming', '暝' => 'ming', '朙' => 'ming', '榠' => 'ming', '洺' => 'ming', '溟' => 'ming', '猽' => 'ming', '眀' => 'ming', '眳' => 'ming', '瞑' => 'ming', '茗' => 'ming', '蓂' => 'ming', '螟' => 'ming', '覭' => 'ming', '詺' => 'ming', '鄍' => 'ming', '酩' => 'ming', '銘' => 'ming', '铭' => 'ming', '鳴' => 'ming', '鸣' => 'ming', '㝠' => 'ming', '㟰' => 'ming', '㫥' => 'ming', '䄙' => 'ming', '䆨' => 'ming', '䆩' => 'ming', '䊅' => 'ming', '䒌' => 'ming', '䫤' => 'ming',
+ '佷' => 'hen', '很' => 'hen', '恨' => 'hen', '拫' => 'hen', '狠' => 'hen', '痕' => 'hen', '詪' => 'hen', '鞎' => 'hen', '㯊' => 'hen', '䓳' => 'hen',
+ '佺' => 'quan', '全' => 'quan', '券' => 'quan', '劝' => 'quan', '勧' => 'quan', '勸' => 'quan', '啳' => 'quan', '圈' => 'quan', '圏' => 'quan', '埢' => 'quan', '姾' => 'quan', '婘' => 'quan', '孉' => 'quan', '峑' => 'quan', '巏' => 'quan', '巻' => 'quan', '恮' => 'quan', '悛' => 'quan', '惓' => 'quan', '拳' => 'quan', '搼' => 'quan', '权' => 'quan', '棬' => 'quan', '椦' => 'quan', '楾' => 'quan', '権' => 'quan', '權' => 'quan', '汱' => 'quan', '泉' => 'quan', '洤' => 'quan', '湶' => 'quan', '烇' => 'quan', '牶' => 'quan', '牷' => 'quan', '犈' => 'quan', '犬' => 'quan', '犭' => 'quan', '瑔' => 'quan', '甽' => 'quan', '畎' => 'quan', '痊' => 'quan', '硂' => 'quan', '筌' => 'quan', '絟' => 'quan', '綣' => 'quan', '縓' => 'quan', '绻' => 'quan', '腃' => 'quan', '荃' => 'quan', '葲' => 'quan', '虇' => 'quan', '蜷' => 'quan', '蠸' => 'quan', '觠' => 'quan', '詮' => 'quan', '诠' => 'quan', '跧' => 'quan', '踡' => 'quan', '輇' => 'quan', '辁' => 'quan', '醛' => 'quan', '銓' => 'quan', '鐉' => 'quan', '铨' => 'quan', '闎' => 'quan', '韏' => 'quan', '顴' => 'quan', '颧' => 'quan', '駩' => 'quan', '騡' => 'quan', '鬈' => 'quan', '鰁' => 'quan', '鳈' => 'quan', '齤' => 'quan', '㒰' => 'quan', '㟨' => 'quan', '㟫' => 'quan', '䀬' => 'quan', '䄐' => 'quan', '䊎' => 'quan', '䑏' => 'quan', '䟒' => 'quan', '䠰' => 'quan',
+ '佻' => 'tiao', '嬥' => 'tiao', '宨' => 'tiao', '岧' => 'tiao', '岹' => 'tiao', '庣' => 'tiao', '恌' => 'tiao', '挑' => 'tiao', '旫' => 'tiao', '晀' => 'tiao', '朓' => 'tiao', '条' => 'tiao', '條' => 'tiao', '樤' => 'tiao', '眺' => 'tiao', '祒' => 'tiao', '祧' => 'tiao', '窕' => 'tiao', '窱' => 'tiao', '笤' => 'tiao', '粜' => 'tiao', '糶' => 'tiao', '絩' => 'tiao', '聎' => 'tiao', '脁' => 'tiao', '芀' => 'tiao', '蓚' => 'tiao', '蓨' => 'tiao', '蜩' => 'tiao', '螩' => 'tiao', '覜' => 'tiao', '誂' => 'tiao', '趒' => 'tiao', '跳' => 'tiao', '迢' => 'tiao', '鋚' => 'tiao', '鎥' => 'tiao', '铫' => 'tiao', '鞗' => 'tiao', '頫' => 'tiao', '髫' => 'tiao', '鯈' => 'tiao', '鰷' => 'tiao', '鲦' => 'tiao', '齠' => 'tiao', '龆' => 'tiao', '㑿' => 'tiao', '㟘' => 'tiao', '㸠' => 'tiao', '䎄' => 'tiao', '䒒' => 'tiao', '䖺' => 'tiao', '䟭' => 'tiao', '䠷' => 'tiao', '䩦' => 'tiao', '䯾' => 'tiao', '䱔' => 'tiao', '䳂' => 'tiao',
+ '侀' => 'xing', '倖' => 'xing', '兴' => 'xing', '刑' => 'xing', '哘' => 'xing', '型' => 'xing', '垶' => 'xing', '塂' => 'xing', '姓' => 'xing', '娙' => 'xing', '婞' => 'xing', '嬹' => 'xing', '幸' => 'xing', '形' => 'xing', '性' => 'xing', '悻' => 'xing', '惺' => 'xing', '擤' => 'xing', '星' => 'xing', '曐' => 'xing', '杏' => 'xing', '洐' => 'xing', '涬' => 'xing', '煋' => 'xing', '狌' => 'xing', '猩' => 'xing', '瑆' => 'xing', '皨' => 'xing', '睲' => 'xing', '硎' => 'xing', '箵' => 'xing', '篂' => 'xing', '緈' => 'xing', '腥' => 'xing', '臖' => 'xing', '興' => 'xing', '荇' => 'xing', '莕' => 'xing', '蛵' => 'xing', '行' => 'xing', '裄' => 'xing', '觪' => 'xing', '觲' => 'xing', '謃' => 'xing', '邢' => 'xing', '郉' => 'xing', '醒' => 'xing', '鈃' => 'xing', '鉶' => 'xing', '銒' => 'xing', '鋞' => 'xing', '钘' => 'xing', '铏' => 'xing', '陉' => 'xing', '陘' => 'xing', '騂' => 'xing', '骍' => 'xing', '鮏' => 'xing', '鯹' => 'xing', '㐩' => 'xing', '㓑' => 'xing', '㓝' => 'xing', '㝭' => 'xing', '㣜' => 'xing', '㨘' => 'xing', '㮐' => 'xing', '㼛' => 'xing', '㼬' => 'xing', '䁄' => 'xing', '䂔' => 'xing', '䓷' => 'xing', '䛭' => 'xing', '䣆' => 'xing', '䤯' => 'xing', '䰢' => 'xing', '䳙' => 'xing',
+ '侃' => 'kan', '偘' => 'kan', '冚' => 'kan', '刊' => 'kan', '勘' => 'kan', '坎' => 'kan', '埳' => 'kan', '堪' => 'kan', '堿' => 'kan', '塪' => 'kan', '墈' => 'kan', '崁' => 'kan', '嵁' => 'kan', '惂' => 'kan', '戡' => 'kan', '栞' => 'kan', '欿' => 'kan', '歁' => 'kan', '看' => 'kan', '瞰' => 'kan', '矙' => 'kan', '砍' => 'kan', '磡' => 'kan', '竷' => 'kan', '莰' => 'kan', '衎' => 'kan', '輡' => 'kan', '轁' => 'kan', '轗' => 'kan', '闞' => 'kan', '阚' => 'kan', '顑' => 'kan', '龕' => 'kan', '龛' => 'kan', '㸝' => 'kan', '䀍' => 'kan', '䘓' => 'kan', '䶫' => 'kan',
+ '來' => 'lai', '俫' => 'lai', '倈' => 'lai', '唻' => 'lai', '婡' => 'lai', '崃' => 'lai', '崍' => 'lai', '庲' => 'lai', '徕' => 'lai', '徠' => 'lai', '来' => 'lai', '梾' => 'lai', '棶' => 'lai', '涞' => 'lai', '淶' => 'lai', '濑' => 'lai', '瀨' => 'lai', '瀬' => 'lai', '猍' => 'lai', '琜' => 'lai', '癞' => 'lai', '癩' => 'lai', '睐' => 'lai', '睞' => 'lai', '筙' => 'lai', '箂' => 'lai', '籁' => 'lai', '籟' => 'lai', '莱' => 'lai', '萊' => 'lai', '藾' => 'lai', '襰' => 'lai', '賚' => 'lai', '賴' => 'lai', '赉' => 'lai', '赖' => 'lai', '逨' => 'lai', '郲' => 'lai', '錸' => 'lai', '铼' => 'lai', '頼' => 'lai', '顂' => 'lai', '騋' => 'lai', '鯠' => 'lai', '鵣' => 'lai', '鶆' => 'lai', '麳' => 'lai', '㚓' => 'lai', '㠣' => 'lai', '㥎' => 'lai', '㾢' => 'lai', '䂾' => 'lai', '䄤' => 'lai', '䅘' => 'lai', '䋱' => 'lai', '䓶' => 'lai', '䚅' => 'lai', '䠭' => 'lai', '䧒' => 'lai', '䲚' => 'lai',
+ '侈' => 'chi', '侙' => 'chi', '俿' => 'chi', '傺' => 'chi', '勅' => 'chi', '匙' => 'chi', '卶' => 'chi', '叱' => 'chi', '叺' => 'chi', '吃' => 'chi', '呎' => 'chi', '哧' => 'chi', '啻' => 'chi', '喫' => 'chi', '嗤' => 'chi', '噄' => 'chi', '坘' => 'chi', '垑' => 'chi', '墀' => 'chi', '妛' => 'chi', '媸' => 'chi', '尺' => 'chi', '岻' => 'chi', '弛' => 'chi', '彨' => 'chi', '彲' => 'chi', '彳' => 'chi', '恜' => 'chi', '恥' => 'chi', '慗' => 'chi', '憏' => 'chi', '懘' => 'chi', '抶' => 'chi', '拸' => 'chi', '持' => 'chi', '摛' => 'chi', '攡' => 'chi', '敕' => 'chi', '斥' => 'chi', '杘' => 'chi', '欼' => 'chi', '歭' => 'chi', '歯' => 'chi', '池' => 'chi', '泜' => 'chi', '淔' => 'chi', '湁' => 'chi', '漦' => 'chi', '灻' => 'chi', '炽' => 'chi', '烾' => 'chi', '熾' => 'chi', '瓻' => 'chi', '痓' => 'chi', '痴' => 'chi', '痸' => 'chi', '瘛' => 'chi', '癡' => 'chi', '眵' => 'chi', '瞝' => 'chi', '竾' => 'chi', '笞' => 'chi', '筂' => 'chi', '篪' => 'chi', '粚' => 'chi', '糦' => 'chi', '絺' => 'chi', '翄' => 'chi', '翅' => 'chi', '翤' => 'chi', '翨' => 'chi', '耛' => 'chi', '耻' => 'chi', '肔' => 'chi', '胣' => 'chi', '胵' => 'chi', '腟' => 'chi', '茌' => 'chi', '荎' => 'chi', '蚇' => 'chi', '蚩' => 'chi', '蚳' => 'chi', '螭' => 'chi', '袲' => 'chi', '袳' => 'chi', '裭' => 'chi', '褫' => 'chi', '訵' => 'chi', '誺' => 'chi', '謘' => 'chi', '豉' => 'chi', '貾' => 'chi', '赤' => 'chi', '赿' => 'chi', '趍' => 'chi', '趩' => 'chi', '跮' => 'chi', '踟' => 'chi', '迟' => 'chi', '迣' => 'chi', '遅' => 'chi', '遟' => 'chi', '遫' => 'chi', '遲' => 'chi', '鉓' => 'chi', '鉹' => 'chi', '銐' => 'chi', '雴' => 'chi', '飭' => 'chi', '饎' => 'chi', '饬' => 'chi', '馳' => 'chi', '驰' => 'chi', '魑' => 'chi', '鴟' => 'chi', '鵄' => 'chi', '鶒' => 'chi', '鷘' => 'chi', '鸱' => 'chi', '麶' => 'chi', '黐' => 'chi', '齒' => 'chi', '齝' => 'chi', '齿' => 'chi', '㒆' => 'chi', '㓼' => 'chi', '㓾' => 'chi', '㔑' => 'chi', '㘜' => 'chi', '㙜' => 'chi', '㞴' => 'chi', '㞿' => 'chi', '㟂' => 'chi', '㡿' => 'chi', '㢁' => 'chi', '㢋' => 'chi', '㢮' => 'chi', '㮛' => 'chi', '㱀' => 'chi', '㳏' => 'chi', '㶴' => 'chi', '㽚' => 'chi', '䆍' => 'chi', '䇼' => 'chi', '䈕' => 'chi', '䊼' => 'chi', '䐤' => 'chi', '䑛' => 'chi', '䔟' => 'chi', '䗖' => 'chi', '䙙' => 'chi', '䛂' => 'chi', '䜄' => 'chi', '䜵' => 'chi', '䜻' => 'chi', '䞾' => 'chi', '䟷' => 'chi', '䠠' => 'chi', '䤲' => 'chi', '䪧' => 'chi', '䮈' => 'chi', '䮻' => 'chi', '䰡' => 'chi', '䳵' => 'chi', '䶔' => 'chi', '䶵' => 'chi',
+ '侉' => 'kua', '咵' => 'kua', '垮' => 'kua', '夸' => 'kua', '姱' => 'kua', '挎' => 'kua', '晇' => 'kua', '胯' => 'kua', '舿' => 'kua', '誇' => 'kua', '跨' => 'kua', '銙' => 'kua', '骻' => 'kua', '㐄' => 'kua', '䋀' => 'kua',
+ '侊' => 'guang', '俇' => 'guang', '僙' => 'guang', '光' => 'guang', '咣' => 'guang', '垙' => 'guang', '姯' => 'guang', '广' => 'guang', '広' => 'guang', '廣' => 'guang', '撗' => 'guang', '桄' => 'guang', '欟' => 'guang', '洸' => 'guang', '灮' => 'guang', '炗' => 'guang', '炚' => 'guang', '炛' => 'guang', '烡' => 'guang', '犷' => 'guang', '獷' => 'guang', '珖' => 'guang', '硄' => 'guang', '胱' => 'guang', '臦' => 'guang', '臩' => 'guang', '茪' => 'guang', '輄' => 'guang', '逛' => 'guang', '銧' => 'guang', '黆' => 'guang', '㫛' => 'guang',
+ '侎' => 'mi', '冖' => 'mi', '冞' => 'mi', '冪' => 'mi', '咪' => 'mi', '嘧' => 'mi', '塓' => 'mi', '孊' => 'mi', '宓' => 'mi', '宻' => 'mi', '密' => 'mi', '峚' => 'mi', '幂' => 'mi', '幎' => 'mi', '幦' => 'mi', '弥' => 'mi', '弭' => 'mi', '彌' => 'mi', '戂' => 'mi', '擟' => 'mi', '攠' => 'mi', '敉' => 'mi', '榓' => 'mi', '樒' => 'mi', '櫁' => 'mi', '汨' => 'mi', '沕' => 'mi', '沵' => 'mi', '泌' => 'mi', '洣' => 'mi', '淧' => 'mi', '渳' => 'mi', '滵' => 'mi', '漞' => 'mi', '濔' => 'mi', '濗' => 'mi', '瀰' => 'mi', '灖' => 'mi', '熐' => 'mi', '爢' => 'mi', '猕' => 'mi', '獼' => 'mi', '瓕' => 'mi', '眫' => 'mi', '眯' => 'mi', '瞇' => 'mi', '祕' => 'mi', '祢' => 'mi', '禰' => 'mi', '秘' => 'mi', '簚' => 'mi', '米' => 'mi', '粎' => 'mi', '糜' => 'mi', '糸' => 'mi', '縻' => 'mi', '羃' => 'mi', '羋' => 'mi', '脒' => 'mi', '芈' => 'mi', '葞' => 'mi', '蒾' => 'mi', '蔝' => 'mi', '蔤' => 'mi', '藌' => 'mi', '蘼' => 'mi', '蜜' => 'mi', '蝆' => 'mi', '袮' => 'mi', '覓' => 'mi', '覔' => 'mi', '覛' => 'mi', '觅' => 'mi', '詸' => 'mi', '謎' => 'mi', '謐' => 'mi', '谜' => 'mi', '谧' => 'mi', '踎' => 'mi', '迷' => 'mi', '醚' => 'mi', '醾' => 'mi', '醿' => 'mi', '釄' => 'mi', '銤' => 'mi', '镾' => 'mi', '靡' => 'mi', '鸍' => 'mi', '麊' => 'mi', '麋' => 'mi', '麛' => 'mi', '鼏' => 'mi', '㜆' => 'mi', '㜷' => 'mi', '㝥' => 'mi', '㟜' => 'mi', '㠧' => 'mi', '㣆' => 'mi', '㥝' => 'mi', '㨠' => 'mi', '㩢' => 'mi', '㫘' => 'mi', '㰽' => 'mi', '㳴' => 'mi', '㳽' => 'mi', '㴵' => 'mi', '㵋' => 'mi', '㸏' => 'mi', '㸓' => 'mi', '䁇' => 'mi', '䉾' => 'mi', '䊳' => 'mi', '䋛' => 'mi', '䌏' => 'mi', '䌐' => 'mi', '䌕' => 'mi', '䌘' => 'mi', '䌩' => 'mi', '䍘' => 'mi', '䕳' => 'mi', '䕷' => 'mi', '䖑' => 'mi', '䛉' => 'mi', '䛑' => 'mi', '䛧' => 'mi', '䣾' => 'mi', '䤉' => 'mi', '䤍' => 'mi', '䥸' => 'mi', '䪾' => 'mi', '䭧' => 'mi', '䭩' => 'mi', '䱊' => 'mi', '䴢' => 'mi',
+ '侒' => 'an', '俺' => 'an', '儑' => 'an', '唵' => 'an', '啽' => 'an', '垵' => 'an', '埯' => 'an', '堓' => 'an', '婩' => 'an', '媕' => 'an', '安' => 'an', '岸' => 'an', '峖' => 'an', '庵' => 'an', '按' => 'an', '揞' => 'an', '晻' => 'an', '暗' => 'an', '案' => 'an', '桉' => 'an', '氨' => 'an', '洝' => 'an', '犴' => 'an', '玵' => 'an', '痷' => 'an', '盦' => 'an', '盫' => 'an', '罯' => 'an', '胺' => 'an', '腤' => 'an', '荌' => 'an', '菴' => 'an', '萻' => 'an', '葊' => 'an', '蓭' => 'an', '誝' => 'an', '諳' => 'an', '谙' => 'an', '豻' => 'an', '貋' => 'an', '銨' => 'an', '錌' => 'an', '铵' => 'an', '闇' => 'an', '隌' => 'an', '雸' => 'an', '鞌' => 'an', '鞍' => 'an', '韽' => 'an', '馣' => 'an', '鮟' => 'an', '鵪' => 'an', '鶕' => 'an', '鹌' => 'an', '黯' => 'an', '㜝' => 'an', '㟁' => 'an', '㱘' => 'an', '㸩' => 'an', '㽢' => 'an', '䁆' => 'an', '䅁' => 'an', '䅖' => 'an', '䎏' => 'an', '䎨' => 'an', '䜙' => 'an', '䬓' => 'an', '䮗' => 'an', '䯥' => 'an',
+ '侓' => 'lu', '僇' => 'lu', '剹' => 'lu', '勎' => 'lu', '勠' => 'lu', '卢' => 'lu', '卤' => 'lu', '噜' => 'lu', '嚕' => 'lu', '嚧' => 'lu', '圥' => 'lu', '坴' => 'lu', '垆' => 'lu', '塶' => 'lu', '塷' => 'lu', '壚' => 'lu', '娽' => 'lu', '峍' => 'lu', '庐' => 'lu', '廘' => 'lu', '廬' => 'lu', '彔' => 'lu', '录' => 'lu', '戮' => 'lu', '挔' => 'lu', '捛' => 'lu', '掳' => 'lu', '摝' => 'lu', '撸' => 'lu', '擄' => 'lu', '擼' => 'lu', '攎' => 'lu', '枦' => 'lu', '栌' => 'lu', '椂' => 'lu', '樐' => 'lu', '樚' => 'lu', '橹' => 'lu', '櫓' => 'lu', '櫨' => 'lu', '氇' => 'lu', '氌' => 'lu', '泸' => 'lu', '淕' => 'lu', '淥' => 'lu', '渌' => 'lu', '滷' => 'lu', '漉' => 'lu', '潞' => 'lu', '澛' => 'lu', '濾' => 'lu', '瀂' => 'lu', '瀘' => 'lu', '炉' => 'lu', '熝' => 'lu', '爐' => 'lu', '獹' => 'lu', '玈' => 'lu', '琭' => 'lu', '璐' => 'lu', '璷' => 'lu', '瓐' => 'lu', '甪' => 'lu', '盝' => 'lu', '盧' => 'lu', '睩' => 'lu', '矑' => 'lu', '硉' => 'lu', '硵' => 'lu', '碌' => 'lu', '磠' => 'lu', '祿' => 'lu', '禄' => 'lu', '稑' => 'lu', '穋' => 'lu', '箓' => 'lu', '簏' => 'lu', '簬' => 'lu', '簵' => 'lu', '簶' => 'lu', '籙' => 'lu', '籚' => 'lu', '粶' => 'lu', '纑' => 'lu', '罏' => 'lu', '胪' => 'lu', '膔' => 'lu', '膟' => 'lu', '臚' => 'lu', '舮' => 'lu', '舻' => 'lu', '艣' => 'lu', '艪' => 'lu', '艫' => 'lu', '芦' => 'lu', '菉' => 'lu', '蓾' => 'lu', '蔍' => 'lu', '蕗' => 'lu', '蘆' => 'lu', '虂' => 'lu', '虏' => 'lu', '虜' => 'lu', '螰' => 'lu', '蠦' => 'lu', '觮' => 'lu', '觻' => 'lu', '賂' => 'lu', '赂' => 'lu', '趢' => 'lu', '路' => 'lu', '踛' => 'lu', '蹗' => 'lu', '輅' => 'lu', '轆' => 'lu', '轤' => 'lu', '轳' => 'lu', '辂' => 'lu', '辘' => 'lu', '逯' => 'lu', '醁' => 'lu', '鈩' => 'lu', '錄' => 'lu', '録' => 'lu', '錴' => 'lu', '鏀' => 'lu', '鏕' => 'lu', '鏴' => 'lu', '鐪' => 'lu', '鑥' => 'lu', '鑪' => 'lu', '镥' => 'lu', '陆' => 'lu', '陸' => 'lu', '露' => 'lu', '顱' => 'lu', '颅' => 'lu', '騄' => 'lu', '騼' => 'lu', '髗' => 'lu', '魯' => 'lu', '魲' => 'lu', '鯥' => 'lu', '鱸' => 'lu', '鲁' => 'lu', '鲈' => 'lu', '鴼' => 'lu', '鵦' => 'lu', '鵱' => 'lu', '鷺' => 'lu', '鸕' => 'lu', '鸬' => 'lu', '鹭' => 'lu', '鹵' => 'lu', '鹿' => 'lu', '麓' => 'lu', '黸' => 'lu', '㓐' => 'lu', '㔪' => 'lu', '㖨' => 'lu', '㛬' => 'lu', '㜙' => 'lu', '㟤' => 'lu', '㠠' => 'lu', '㢚' => 'lu', '㢳' => 'lu', '㦇' => 'lu', '㪐' => 'lu', '㪖' => 'lu', '㪭' => 'lu', '㫽' => 'lu', '㭔' => 'lu', '㯝' => 'lu', '㯟' => 'lu', '㯭' => 'lu', '㱺' => 'lu', '㼾' => 'lu', '㿖' => 'lu', '䃙' => 'lu', '䌒' => 'lu', '䎑' => 'lu', '䎼' => 'lu', '䐂' => 'lu', '䕡' => 'lu', '䘵' => 'lu', '䚄' => 'lu', '䟿' => 'lu', '䡎' => 'lu', '䡜' => 'lu', '䩮' => 'lu', '䬛' => 'lu', '䮉' => 'lu', '䰕' => 'lu', '䱚' => 'lu', '䲐' => 'lu', '䴪' => 'lu',
+ '侔' => 'mou', '劺' => 'mou', '哞' => 'mou', '恈' => 'mou', '某' => 'mou', '桙' => 'mou', '洠' => 'mou', '牟' => 'mou', '眸' => 'mou', '瞴' => 'mou', '蟱' => 'mou', '謀' => 'mou', '谋' => 'mou', '鉾' => 'mou', '鍪' => 'mou', '鴾' => 'mou', '麰' => 'mou', '㭌' => 'mou', '䍒' => 'mou', '䏬' => 'mou', '䗋' => 'mou', '䥐' => 'mou', '䱕' => 'mou',
+ '侘' => 'cha', '偛' => 'cha', '剎' => 'cha', '叉' => 'cha', '嗏' => 'cha', '垞' => 'cha', '奼' => 'cha', '姹' => 'cha', '察' => 'cha', '岔' => 'cha', '嵖' => 'cha', '差' => 'cha', '扠' => 'cha', '扱' => 'cha', '挿' => 'cha', '插' => 'cha', '揷' => 'cha', '搽' => 'cha', '杈' => 'cha', '查' => 'cha', '査' => 'cha', '槎' => 'cha', '檫' => 'cha', '汊' => 'cha', '猹' => 'cha', '疀' => 'cha', '碴' => 'cha', '秅' => 'cha', '紁' => 'cha', '肞' => 'cha', '臿' => 'cha', '艖' => 'cha', '芆' => 'cha', '茬' => 'cha', '茶' => 'cha', '衩' => 'cha', '褨' => 'cha', '訍' => 'cha', '詧' => 'cha', '詫' => 'cha', '诧' => 'cha', '蹅' => 'cha', '釵' => 'cha', '銟' => 'cha', '鍤' => 'cha', '鎈' => 'cha', '鑔' => 'cha', '钗' => 'cha', '锸' => 'cha', '镲' => 'cha', '靫' => 'cha', '餷' => 'cha', '馇' => 'cha', '㛳' => 'cha', '㢉' => 'cha', '㢎' => 'cha', '㢒' => 'cha', '㣾' => 'cha', '㤞' => 'cha', '㪯' => 'cha', '㫅' => 'cha', '䁟' => 'cha', '䆛' => 'cha', '䊬' => 'cha', '䑘' => 'cha', '䒲' => 'cha', '䓭' => 'cha', '䕓' => 'cha', '䟕' => 'cha', '䡨' => 'cha', '䤩' => 'cha', '䰈' => 'cha', '䲦' => 'cha', '䶪' => 'cha',
+ '供' => 'gong', '兝' => 'gong', '兣' => 'gong', '公' => 'gong', '共' => 'gong', '功' => 'gong', '匑' => 'gong', '匔' => 'gong', '厷' => 'gong', '唝' => 'gong', '塨' => 'gong', '宫' => 'gong', '宮' => 'gong', '工' => 'gong', '巩' => 'gong', '幊' => 'gong', '廾' => 'gong', '弓' => 'gong', '恭' => 'gong', '愩' => 'gong', '慐' => 'gong', '拱' => 'gong', '拲' => 'gong', '攻' => 'gong', '杛' => 'gong', '栱' => 'gong', '汞' => 'gong', '熕' => 'gong', '珙' => 'gong', '碽' => 'gong', '篢' => 'gong', '糼' => 'gong', '羾' => 'gong', '肱' => 'gong', '蚣' => 'gong', '觥' => 'gong', '觵' => 'gong', '貢' => 'gong', '贑' => 'gong', '贡' => 'gong', '躬' => 'gong', '躳' => 'gong', '輁' => 'gong', '鞏' => 'gong', '髸' => 'gong', '龏' => 'gong', '龔' => 'gong', '龚' => 'gong', '㓋' => 'gong', '㔶' => 'gong', '㤨' => 'gong', '㧬' => 'gong', '㫒' => 'gong', '㭟' => 'gong', '㯯' => 'gong', '㺬' => 'gong', '㼦' => 'gong', '䂬' => 'gong', '䇨' => 'gong', '䡗' => 'gong', '䢚' => 'gong',
+ '侣' => 'lv', '侶' => 'lv', '儢' => 'lv', '勴' => 'lv', '吕' => 'lv', '呂' => 'lv', '哷' => 'lv', '垏' => 'lv', '寽' => 'lv', '屡' => 'lv', '屢' => 'lv', '履' => 'lv', '嵂' => 'lv', '律' => 'lv', '慮' => 'lv', '旅' => 'lv', '曥' => 'lv', '梠' => 'lv', '榈' => 'lv', '櫖' => 'lv', '櫚' => 'lv', '氀' => 'lv', '氯' => 'lv', '滤' => 'lv', '焒' => 'lv', '爈' => 'lv', '率' => 'lv', '祣' => 'lv', '稆' => 'lv', '穞' => 'lv', '穭' => 'lv', '箻' => 'lv', '絽' => 'lv', '綠' => 'lv', '緑' => 'lv', '縷' => 'lv', '繂' => 'lv', '绿' => 'lv', '缕' => 'lv', '膂' => 'lv', '膐' => 'lv', '膢' => 'lv', '葎' => 'lv', '藘' => 'lv', '虑' => 'lv', '褛' => 'lv', '褸' => 'lv', '郘' => 'lv', '鋁' => 'lv', '鑢' => 'lv', '铝' => 'lv', '閭' => 'lv', '闾' => 'lv', '馿' => 'lv', '驢' => 'lv', '驴' => 'lv', '鷜' => 'lv', '㔧' => 'lv', '㠥' => 'lv', '㭚' => 'lv', '㲶' => 'lv', '㻲' => 'lv', '㾔' => 'lv', '䔞' => 'lv', '䢖' => 'lv', '䥨' => 'lv',
+ '侦' => 'zhen', '侲' => 'zhen', '偵' => 'zhen', '圳' => 'zhen', '塦' => 'zhen', '姫' => 'zhen', '嫃' => 'zhen', '寊' => 'zhen', '屒' => 'zhen', '帪' => 'zhen', '弫' => 'zhen', '抮' => 'zhen', '挋' => 'zhen', '振' => 'zhen', '揕' => 'zhen', '搸' => 'zhen', '敒' => 'zhen', '敶' => 'zhen', '斟' => 'zhen', '昣' => 'zhen', '朕' => 'zhen', '枕' => 'zhen', '栕' => 'zhen', '栚' => 'zhen', '桢' => 'zhen', '桭' => 'zhen', '楨' => 'zhen', '榛' => 'zhen', '槇' => 'zhen', '樼' => 'zhen', '殝' => 'zhen', '浈' => 'zhen', '湞' => 'zhen', '潧' => 'zhen', '澵' => 'zhen', '獉' => 'zhen', '珍' => 'zhen', '珎' => 'zhen', '瑧' => 'zhen', '甄' => 'zhen', '畛' => 'zhen', '疹' => 'zhen', '眕' => 'zhen', '眞' => 'zhen', '真' => 'zhen', '眹' => 'zhen', '砧' => 'zhen', '碪' => 'zhen', '祯' => 'zhen', '禎' => 'zhen', '禛' => 'zhen', '稹' => 'zhen', '箴' => 'zhen', '籈' => 'zhen', '紖' => 'zhen', '紾' => 'zhen', '絼' => 'zhen', '縝' => 'zhen', '縥' => 'zhen', '纼' => 'zhen', '缜' => 'zhen', '聄' => 'zhen', '胗' => 'zhen', '臻' => 'zhen', '萙' => 'zhen', '葴' => 'zhen', '蒖' => 'zhen', '蓁' => 'zhen', '薽' => 'zhen', '蜄' => 'zhen', '袗' => 'zhen', '裖' => 'zhen', '覙' => 'zhen', '診' => 'zhen', '誫' => 'zhen', '诊' => 'zhen', '貞' => 'zhen', '賑' => 'zhen', '贞' => 'zhen', '赈' => 'zhen', '軫' => 'zhen', '轃' => 'zhen', '轸' => 'zhen', '辴' => 'zhen', '遉' => 'zhen', '酙' => 'zhen', '針' => 'zhen', '鉁' => 'zhen', '鋴' => 'zhen', '錱' => 'zhen', '鍖' => 'zhen', '鍼' => 'zhen', '鎭' => 'zhen', '鎮' => 'zhen', '针' => 'zhen', '镇' => 'zhen', '阵' => 'zhen', '陣' => 'zhen', '震' => 'zhen', '靕' => 'zhen', '駗' => 'zhen', '鬒' => 'zhen', '鱵' => 'zhen', '鴆' => 'zhen', '鸩' => 'zhen', '黮' => 'zhen', '黰' => 'zhen', '㐱' => 'zhen', '㓄' => 'zhen', '㣀' => 'zhen', '㪛' => 'zhen', '㮳' => 'zhen', '㯢' => 'zhen', '㴨' => 'zhen', '䂦' => 'zhen', '䂧' => 'zhen', '䊶' => 'zhen', '䏖' => 'zhen', '䑐' => 'zhen', '䝩' => 'zhen', '䟴' => 'zhen', '䨯' => 'zhen', '䪴' => 'zhen', '䫬' => 'zhen', '䲴' => 'zhen', '䳲' => 'zhen',
+ '侧' => 'ce', '側' => 'ce', '冊' => 'ce', '册' => 'ce', '厕' => 'ce', '厠' => 'ce', '墄' => 'ce', '廁' => 'ce', '恻' => 'ce', '惻' => 'ce', '憡' => 'ce', '拺' => 'ce', '敇' => 'ce', '测' => 'ce', '測' => 'ce', '畟' => 'ce', '笧' => 'ce', '策' => 'ce', '筞' => 'ce', '筴' => 'ce', '箣' => 'ce', '簎' => 'ce', '粣' => 'ce', '荝' => 'ce', '萗' => 'ce', '萴' => 'ce', '蓛' => 'ce', '㥽' => 'ce', '㨲' => 'ce', '㩍' => 'ce', '䇲' => 'ce', '䈟' => 'ce', '䊂' => 'ce', '䔴' => 'ce', '䜺' => 'ce',
+ '侩' => 'kuai', '儈' => 'kuai', '凷' => 'kuai', '哙' => 'kuai', '噲' => 'kuai', '圦' => 'kuai', '块' => 'kuai', '塊' => 'kuai', '墤' => 'kuai', '巜' => 'kuai', '廥' => 'kuai', '快' => 'kuai', '擓' => 'kuai', '旝' => 'kuai', '狯' => 'kuai', '獪' => 'kuai', '筷' => 'kuai', '糩' => 'kuai', '脍' => 'kuai', '膾' => 'kuai', '蒯' => 'kuai', '郐' => 'kuai', '鄶' => 'kuai', '鱠' => 'kuai', '鲙' => 'kuai', '㔞' => 'kuai', '㙕' => 'kuai', '㙗' => 'kuai', '㟴' => 'kuai', '㧟' => 'kuai', '㬮' => 'kuai', '㱮' => 'kuai', '䈛' => 'kuai', '䓒' => 'kuai', '䭝' => 'kuai', '䯤' => 'kuai', '䶐' => 'kuai',
+ '侪' => 'chai', '儕' => 'chai', '勑' => 'chai', '喍' => 'chai', '囆' => 'chai', '拆' => 'chai', '柴' => 'chai', '犲' => 'chai', '瘥' => 'chai', '祡' => 'chai', '茝' => 'chai', '虿' => 'chai', '蠆' => 'chai', '袃' => 'chai', '豺' => 'chai', '㑪' => 'chai', '㳗' => 'chai', '㾹' => 'chai', '䓱' => 'chai', '䘍' => 'chai',
+ '侬' => 'nong', '儂' => 'nong', '农' => 'nong', '哝' => 'nong', '噥' => 'nong', '弄' => 'nong', '憹' => 'nong', '挊' => 'nong', '挵' => 'nong', '欁' => 'nong', '浓' => 'nong', '濃' => 'nong', '癑' => 'nong', '禯' => 'nong', '秾' => 'nong', '穠' => 'nong', '繷' => 'nong', '脓' => 'nong', '膿' => 'nong', '蕽' => 'nong', '襛' => 'nong', '農' => 'nong', '辳' => 'nong', '醲' => 'nong', '齈' => 'nong', '㶶' => 'nong', '䁸' => 'nong', '䢉' => 'nong', '䵜' => 'nong',
+ '侯' => 'hou', '候' => 'hou', '厚' => 'hou', '后' => 'hou', '吼' => 'hou', '吽' => 'hou', '喉' => 'hou', '垕' => 'hou', '堠' => 'hou', '帿' => 'hou', '後' => 'hou', '洉' => 'hou', '犼' => 'hou', '猴' => 'hou', '瘊' => 'hou', '睺' => 'hou', '矦' => 'hou', '篌' => 'hou', '糇' => 'hou', '翭' => 'hou', '葔' => 'hou', '豞' => 'hou', '逅' => 'hou', '郈' => 'hou', '鄇' => 'hou', '銗' => 'hou', '鍭' => 'hou', '餱' => 'hou', '骺' => 'hou', '鮜' => 'hou', '鯸' => 'hou', '鱟' => 'hou', '鲎' => 'hou', '鲘' => 'hou', '齁' => 'hou', '㕈' => 'hou', '㖃' => 'hou', '㗋' => 'hou', '㤧' => 'hou', '㫗' => 'hou', '㬋' => 'hou', '㮢' => 'hou', '㸸' => 'hou', '㺅' => 'hou', '䂉' => 'hou', '䗔' => 'hou', '䙈' => 'hou', '䞧' => 'hou', '䪷' => 'hou', '䫛' => 'hou', '䳧' => 'hou',
+ '侰' => 'jiong', '僒' => 'jiong', '冂' => 'jiong', '冋' => 'jiong', '冏' => 'jiong', '囧' => 'jiong', '坰' => 'jiong', '埛' => 'jiong', '扃' => 'jiong', '泂' => 'jiong', '浻' => 'jiong', '澃' => 'jiong', '炯' => 'jiong', '烱' => 'jiong', '煚' => 'jiong', '煛' => 'jiong', '熲' => 'jiong', '燑' => 'jiong', '燛' => 'jiong', '窘' => 'jiong', '絅' => 'jiong', '綗' => 'jiong', '蘏' => 'jiong', '蘔' => 'jiong', '褧' => 'jiong', '迥' => 'jiong', '逈' => 'jiong', '顈' => 'jiong', '颎' => 'jiong', '駉' => 'jiong', '駫' => 'jiong', '㑋' => 'jiong', '㓏' => 'jiong', '㖥' => 'jiong', '㢠' => 'jiong', '㤯' => 'jiong', '㷗' => 'jiong', '㷡' => 'jiong', '䌹' => 'jiong', '䐃' => 'jiong', '䢛' => 'jiong',
+ '侽' => 'nan', '南' => 'nan', '喃' => 'nan', '囡' => 'nan', '娚' => 'nan', '婻' => 'nan', '戁' => 'nan', '抩' => 'nan', '揇' => 'nan', '暔' => 'nan', '枏' => 'nan', '枬' => 'nan', '柟' => 'nan', '楠' => 'nan', '湳' => 'nan', '煵' => 'nan', '男' => 'nan', '畘' => 'nan', '腩' => 'nan', '莮' => 'nan', '萳' => 'nan', '蝻' => 'nan', '諵' => 'nan', '赧' => 'nan', '遖' => 'nan', '难' => 'nan', '難' => 'nan', '㓓' => 'nan', '㫱' => 'nan', '㽖' => 'nan', '䁪' => 'nan', '䈒' => 'nan', '䔜' => 'nan', '䔳' => 'nan', '䕼' => 'nan', '䛁' => 'nan', '䶲' => 'nan',
+ '侾' => 'xiao', '俲' => 'xiao', '傚' => 'xiao', '削' => 'xiao', '効' => 'xiao', '呺' => 'xiao', '咲' => 'xiao', '哓' => 'xiao', '哮' => 'xiao', '啋' => 'xiao', '啸' => 'xiao', '嘋' => 'xiao', '嘐' => 'xiao', '嘨' => 'xiao', '嘯' => 'xiao', '嘵' => 'xiao', '嚣' => 'xiao', '嚻' => 'xiao', '囂' => 'xiao', '婋' => 'xiao', '孝' => 'xiao', '宯' => 'xiao', '宵' => 'xiao', '小' => 'xiao', '崤' => 'xiao', '庨' => 'xiao', '彇' => 'xiao', '恔' => 'xiao', '恷' => 'xiao', '憢' => 'xiao', '揱' => 'xiao', '撨' => 'xiao', '效' => 'xiao', '敩' => 'xiao', '斅' => 'xiao', '斆' => 'xiao', '晓' => 'xiao', '暁' => 'xiao', '曉' => 'xiao', '枭' => 'xiao', '枵' => 'xiao', '校' => 'xiao', '梟' => 'xiao', '櫹' => 'xiao', '歊' => 'xiao', '歗' => 'xiao', '毊' => 'xiao', '洨' => 'xiao', '消' => 'xiao', '涍' => 'xiao', '淆' => 'xiao', '滧' => 'xiao', '潇' => 'xiao', '瀟' => 'xiao', '灱' => 'xiao', '灲' => 'xiao', '焇' => 'xiao', '熽' => 'xiao', '猇' => 'xiao', '獢' => 'xiao', '痚' => 'xiao', '痟' => 'xiao', '皛' => 'xiao', '皢' => 'xiao', '硝' => 'xiao', '硣' => 'xiao', '穘' => 'xiao', '窙' => 'xiao', '笑' => 'xiao', '筱' => 'xiao', '筿' => 'xiao', '箫' => 'xiao', '篠' => 'xiao', '簘' => 'xiao', '簫' => 'xiao', '綃' => 'xiao', '绡' => 'xiao', '翛' => 'xiao', '肖' => 'xiao', '膮' => 'xiao', '萧' => 'xiao', '萷' => 'xiao', '蕭' => 'xiao', '藃' => 'xiao', '虈' => 'xiao', '虓' => 'xiao', '蟂' => 'xiao', '蟏' => 'xiao', '蟰' => 'xiao', '蠨' => 'xiao', '訤' => 'xiao', '詨' => 'xiao', '誟' => 'xiao', '誵' => 'xiao', '謏' => 'xiao', '謞' => 'xiao', '踃' => 'xiao', '逍' => 'xiao', '郩' => 'xiao', '銷' => 'xiao', '销' => 'xiao', '霄' => 'xiao', '驍' => 'xiao', '骁' => 'xiao', '髇' => 'xiao', '髐' => 'xiao', '魈' => 'xiao', '鴞' => 'xiao', '鴵' => 'xiao', '鷍' => 'xiao', '鸮' => 'xiao', '㑾' => 'xiao', '㔅' => 'xiao', '㗛' => 'xiao', '㚣' => 'xiao', '㤊' => 'xiao', '㬵' => 'xiao', '㹲' => 'xiao', '䊥' => 'xiao', '䒕' => 'xiao', '䒝' => 'xiao', '䕧' => 'xiao', '䥵' => 'xiao',
+ '便' => 'bian', '匾' => 'bian', '卞' => 'bian', '变' => 'bian', '変' => 'bian', '峅' => 'bian', '弁' => 'bian', '徧' => 'bian', '忭' => 'bian', '惼' => 'bian', '扁' => 'bian', '抃' => 'bian', '拚' => 'bian', '揙' => 'bian', '昪' => 'bian', '汳' => 'bian', '汴' => 'bian', '炞' => 'bian', '煸' => 'bian', '牑' => 'bian', '猵' => 'bian', '獱' => 'bian', '甂' => 'bian', '砭' => 'bian', '碥' => 'bian', '稨' => 'bian', '窆' => 'bian', '笾' => 'bian', '箯' => 'bian', '籩' => 'bian', '糄' => 'bian', '編' => 'bian', '緶' => 'bian', '缏' => 'bian', '编' => 'bian', '艑' => 'bian', '苄' => 'bian', '萹' => 'bian', '藊' => 'bian', '蝙' => 'bian', '褊' => 'bian', '覍' => 'bian', '變' => 'bian', '貶' => 'bian', '贬' => 'bian', '辡' => 'bian', '辧' => 'bian', '辨' => 'bian', '辩' => 'bian', '辪' => 'bian', '辫' => 'bian', '辮' => 'bian', '辯' => 'bian', '边' => 'bian', '遍' => 'bian', '邉' => 'bian', '邊' => 'bian', '釆' => 'bian', '鍽' => 'bian', '閞' => 'bian', '鞭' => 'bian', '頨' => 'bian', '鯾' => 'bian', '鯿' => 'bian', '鳊' => 'bian', '鴘' => 'bian', '㝸' => 'bian', '㣐' => 'bian', '㦚' => 'bian', '㭓' => 'bian', '㲢' => 'bian', '㳎' => 'bian', '㳒' => 'bian', '㴜' => 'bian', '㵷' => 'bian', '㺹' => 'bian', '㻞' => 'bian', '䁵' => 'bian', '䉸' => 'bian', '䒪' => 'bian', '䛒' => 'bian', '䡢' => 'bian', '䪻' => 'bian',
+ '俀' => 'tui', '僓' => 'tui', '娧' => 'tui', '尵' => 'tui', '推' => 'tui', '煺' => 'tui', '穨' => 'tui', '脮' => 'tui', '腿' => 'tui', '蓷' => 'tui', '藬' => 'tui', '蘈' => 'tui', '蛻' => 'tui', '蜕' => 'tui', '褪' => 'tui', '蹆' => 'tui', '蹪' => 'tui', '退' => 'tui', '隤' => 'tui', '頹' => 'tui', '頺' => 'tui', '頽' => 'tui', '颓' => 'tui', '駾' => 'tui', '骽' => 'tui', '魋' => 'tui', '㞂' => 'tui', '㢈' => 'tui', '㢑' => 'tui', '㦌' => 'tui', '㱣' => 'tui', '㷟' => 'tui', '㾯' => 'tui', '㾼' => 'tui', '㾽' => 'tui', '㿉' => 'tui', '㿗' => 'tui', '䀃' => 'tui', '䅪' => 'tui', '䍾' => 'tui', '䫋' => 'tui',
+ '促' => 'cu', '噈' => 'cu', '媨' => 'cu', '徂' => 'cu', '憱' => 'cu', '殂' => 'cu', '猝' => 'cu', '瘄' => 'cu', '瘯' => 'cu', '簇' => 'cu', '粗' => 'cu', '縬' => 'cu', '蔟' => 'cu', '觕' => 'cu', '誎' => 'cu', '趗' => 'cu', '踧' => 'cu', '蹙' => 'cu', '蹴' => 'cu', '蹵' => 'cu', '酢' => 'cu', '醋' => 'cu', '顣' => 'cu', '麁' => 'cu', '麄' => 'cu', '麤' => 'cu', '鼀' => 'cu', '㗤' => 'cu', '㰗' => 'cu', '䃚' => 'cu', '䎌' => 'cu', '䓚' => 'cu', '䙯' => 'cu', '䛤' => 'cu', '䟟' => 'cu', '䠓' => 'cu', '䠞' => 'cu', '䢐' => 'cu', '䥄' => 'cu', '䥘' => 'cu', '䬨' => 'cu',
+ '俄' => 'e', '偔' => 'e', '僫' => 'e', '匎' => 'e', '卾' => 'e', '厄' => 'e', '吪' => 'e', '呃' => 'e', '呝' => 'e', '咢' => 'e', '咹' => 'e', '噁' => 'e', '噩' => 'e', '囮' => 'e', '垩' => 'e', '堊' => 'e', '堮' => 'e', '妸' => 'e', '妿' => 'e', '姶' => 'e', '娥' => 'e', '娿' => 'e', '婀' => 'e', '屙' => 'e', '屵' => 'e', '岋' => 'e', '峉' => 'e', '峨' => 'e', '峩' => 'e', '崿' => 'e', '廅' => 'e', '恶' => 'e', '悪' => 'e', '惡' => 'e', '愕' => 'e', '戹' => 'e', '扼' => 'e', '搤' => 'e', '搹' => 'e', '擜' => 'e', '枙' => 'e', '櫮' => 'e', '歞' => 'e', '歺' => 'e', '涐' => 'e', '湂' => 'e', '珴' => 'e', '琧' => 'e', '皒' => 'e', '睋' => 'e', '砈' => 'e', '砐' => 'e', '砨' => 'e', '硆' => 'e', '磀' => 'e', '腭' => 'e', '苊' => 'e', '莪' => 'e', '萼' => 'e', '蕚' => 'e', '蚅' => 'e', '蛾' => 'e', '蝁' => 'e', '覨' => 'e', '訛' => 'e', '詻' => 'e', '誐' => 'e', '諤' => 'e', '譌' => 'e', '讍' => 'e', '讹' => 'e', '谔' => 'e', '豟' => 'e', '軛' => 'e', '軶' => 'e', '轭' => 'e', '迗' => 'e', '遌' => 'e', '遏' => 'e', '遻' => 'e', '鄂' => 'e', '鈋' => 'e', '鋨' => 'e', '鍔' => 'e', '鑩' => 'e', '锇' => 'e', '锷' => 'e', '閼' => 'e', '阏' => 'e', '阨' => 'e', '阸' => 'e', '頞' => 'e', '頟' => 'e', '額' => 'e', '顎' => 'e', '颚' => 'e', '额' => 'e', '餓' => 'e', '餩' => 'e', '饿' => 'e', '騀' => 'e', '魤' => 'e', '鰐' => 'e', '鱷' => 'e', '鳄' => 'e', '鵈' => 'e', '鵝' => 'e', '鵞' => 'e', '鶚' => 'e', '鹅' => 'e', '鹗' => 'e', '齶' => 'e', '㓵' => 'e', '㔩' => 'e', '㕎' => 'e', '㖾' => 'e', '㗁' => 'e', '㟧' => 'e', '㠋' => 'e', '㡋' => 'e', '㦍' => 'e', '㧖' => 'e', '㩵' => 'e', '㮙' => 'e', '㱦' => 'e', '㷈' => 'e', '㼂' => 'e', '㼢' => 'e', '㼰' => 'e', '䄉' => 'e', '䆓' => 'e', '䑥' => 'e', '䑪' => 'e', '䓊' => 'e', '䔾' => 'e', '䕏' => 'e', '䖸' => 'e', '䙳' => 'e', '䛖' => 'e', '䝈' => 'e', '䞩' => 'e', '䣞' => 'e', '䩹' => 'e', '䫷' => 'e', '䱮' => 'e', '䳗' => 'e', '䳘' => 'e', '䳬' => 'e',
+ '俈' => 'ku', '刳' => 'ku', '哭' => 'ku', '喾' => 'ku', '嚳' => 'ku', '圐' => 'ku', '堀' => 'ku', '崫' => 'ku', '库' => 'ku', '庫' => 'ku', '扝' => 'ku', '枯' => 'ku', '桍' => 'ku', '楛' => 'ku', '焅' => 'ku', '狜' => 'ku', '瘔' => 'ku', '矻' => 'ku', '秙' => 'ku', '窟' => 'ku', '絝' => 'ku', '绔' => 'ku', '苦' => 'ku', '袴' => 'ku', '裤' => 'ku', '褲' => 'ku', '跍' => 'ku', '郀' => 'ku', '酷' => 'ku', '骷' => 'ku', '鮬' => 'ku', '㒂' => 'ku', '㠸' => 'ku', '䇢' => 'ku',
+ '俊' => 'jun', '儁' => 'jun', '军' => 'jun', '君' => 'jun', '呁' => 'jun', '均' => 'jun', '埈' => 'jun', '姰' => 'jun', '寯' => 'jun', '峻' => 'jun', '懏' => 'jun', '捃' => 'jun', '攈' => 'jun', '晙' => 'jun', '桾' => 'jun', '汮' => 'jun', '浚' => 'jun', '濬' => 'jun', '焌' => 'jun', '燇' => 'jun', '珺' => 'jun', '畯' => 'jun', '皲' => 'jun', '皸' => 'jun', '皹' => 'jun', '碅' => 'jun', '竣' => 'jun', '筠' => 'jun', '箘' => 'jun', '箟' => 'jun', '莙' => 'jun', '菌' => 'jun', '蚐' => 'jun', '蜠' => 'jun', '袀' => 'jun', '覠' => 'jun', '軍' => 'jun', '郡' => 'jun', '鈞' => 'jun', '銁' => 'jun', '銞' => 'jun', '鍕' => 'jun', '钧' => 'jun', '陖' => 'jun', '餕' => 'jun', '馂' => 'jun', '駿' => 'jun', '骏' => 'jun', '鮶' => 'jun', '鲪' => 'jun', '鵔' => 'jun', '鵕' => 'jun', '鵘' => 'jun', '麇' => 'jun', '麏' => 'jun', '麕' => 'jun', '㑺' => 'jun', '㒞' => 'jun', '㓴' => 'jun', '㕙' => 'jun', '㝦' => 'jun', '㴫' => 'jun', '㻒' => 'jun', '㽙' => 'jun', '䇹' => 'jun', '䕑' => 'jun', '䜭' => 'jun', '䝍' => 'jun',
+ '俎' => 'zu', '傶' => 'zu', '卆' => 'zu', '卒' => 'zu', '哫' => 'zu', '崒' => 'zu', '崪' => 'zu', '族' => 'zu', '爼' => 'zu', '珇' => 'zu', '祖' => 'zu', '租' => 'zu', '稡' => 'zu', '箤' => 'zu', '組' => 'zu', '组' => 'zu', '菹' => 'zu', '葅' => 'zu', '蒩' => 'zu', '詛' => 'zu', '謯' => 'zu', '诅' => 'zu', '足' => 'zu', '踤' => 'zu', '踿' => 'zu', '鎺' => 'zu', '鏃' => 'zu', '镞' => 'zu', '阻' => 'zu', '靻' => 'zu', '㞺' => 'zu', '㰵' => 'zu', '㲞' => 'zu', '䅸' => 'zu', '䔃' => 'zu', '䖕' => 'zu', '䚝' => 'zu', '䯿' => 'zu', '䱣' => 'zu',
+ '俒' => 'hun', '倱' => 'hun', '圂' => 'hun', '婚' => 'hun', '忶' => 'hun', '惛' => 'hun', '惽' => 'hun', '慁' => 'hun', '掍' => 'hun', '昏' => 'hun', '昬' => 'hun', '棔' => 'hun', '殙' => 'hun', '浑' => 'hun', '涽' => 'hun', '混' => 'hun', '渾' => 'hun', '溷' => 'hun', '焝' => 'hun', '睧' => 'hun', '睯' => 'hun', '繉' => 'hun', '荤' => 'hun', '葷' => 'hun', '觨' => 'hun', '諢' => 'hun', '诨' => 'hun', '轋' => 'hun', '閽' => 'hun', '阍' => 'hun', '餛' => 'hun', '馄' => 'hun', '魂' => 'hun', '鼲' => 'hun', '㑮' => 'hun', '㥵' => 'hun', '㨡' => 'hun', '䅙' => 'hun', '䅱' => 'hun', '䚠' => 'hun', '䛰' => 'hun', '䧰' => 'hun', '䫟' => 'hun', '䰟' => 'hun', '䴷' => 'hun',
+ '俗' => 'su', '傃' => 'su', '僳' => 'su', '嗉' => 'su', '嗽' => 'su', '囌' => 'su', '塐' => 'su', '塑' => 'su', '夙' => 'su', '嫊' => 'su', '宿' => 'su', '愫' => 'su', '愬' => 'su', '憟' => 'su', '梀' => 'su', '榡' => 'su', '樎' => 'su', '樕' => 'su', '橚' => 'su', '櫯' => 'su', '殐' => 'su', '泝' => 'su', '洬' => 'su', '涑' => 'su', '溯' => 'su', '溸' => 'su', '潚' => 'su', '潥' => 'su', '玊' => 'su', '珟' => 'su', '璛' => 'su', '甦' => 'su', '碿' => 'su', '稣' => 'su', '穌' => 'su', '窣' => 'su', '簌' => 'su', '粛' => 'su', '粟' => 'su', '素' => 'su', '縤' => 'su', '肃' => 'su', '肅' => 'su', '膆' => 'su', '苏' => 'su', '蔌' => 'su', '藗' => 'su', '蘇' => 'su', '蘓' => 'su', '觫' => 'su', '訴' => 'su', '謖' => 'su', '诉' => 'su', '谡' => 'su', '趚' => 'su', '蹜' => 'su', '速' => 'su', '遡' => 'su', '遬' => 'su', '酥' => 'su', '鋉' => 'su', '餗' => 'su', '驌' => 'su', '骕' => 'su', '鯂' => 'su', '鱐' => 'su', '鷫' => 'su', '鹔' => 'su', '㑉' => 'su', '㑛' => 'su', '㓘' => 'su', '㔄' => 'su', '㕖' => 'su', '㜚' => 'su', '㝛' => 'su', '㨞' => 'su', '㩋' => 'su', '㪩' => 'su', '㬘' => 'su', '㯈' => 'su', '㴋' => 'su', '㴑' => 'su', '㴼' => 'su', '䃤' => 'su', '䅇' => 'su', '䌚' => 'su', '䎘' => 'su', '䏋' => 'su', '䑿' => 'su', '䔎' => 'su', '䘻' => 'su', '䛾' => 'su', '䥔' => 'su',
+ '俩' => 'lia', '倆' => 'lia',
+ '俳' => 'pai', '哌' => 'pai', '徘' => 'pai', '拍' => 'pai', '排' => 'pai', '棑' => 'pai', '派' => 'pai', '湃' => 'pai', '牌' => 'pai', '犤' => 'pai', '猅' => 'pai', '磗' => 'pai', '箄' => 'pai', '簰' => 'pai', '蒎' => 'pai', '輫' => 'pai', '鎃' => 'pai', '㭛' => 'pai', '㵺' => 'pai', '䖰' => 'pai',
+ '俵' => 'biao', '儦' => 'biao', '墂' => 'biao', '婊' => 'biao', '幖' => 'biao', '彪' => 'biao', '摽' => 'biao', '杓' => 'biao', '标' => 'biao', '標' => 'biao', '檦' => 'biao', '淲' => 'biao', '滮' => 'biao', '瀌' => 'biao', '灬' => 'biao', '熛' => 'biao', '爂' => 'biao', '猋' => 'biao', '瘭' => 'biao', '穮' => 'biao', '脿' => 'biao', '膘' => 'biao', '臕' => 'biao', '蔈' => 'biao', '藨' => 'biao', '表' => 'biao', '裱' => 'biao', '褾' => 'biao', '諘' => 'biao', '謤' => 'biao', '贆' => 'biao', '錶' => 'biao', '鏢' => 'biao', '鑣' => 'biao', '镖' => 'biao', '镳' => 'biao', '颮' => 'biao', '颷' => 'biao', '飆' => 'biao', '飇' => 'biao', '飈' => 'biao', '飊' => 'biao', '飑' => 'biao', '飙' => 'biao', '飚' => 'biao', '驃' => 'biao', '驫' => 'biao', '骉' => 'biao', '骠' => 'biao', '髟' => 'biao', '鰾' => 'biao', '鳔' => 'biao', '麃' => 'biao', '㟽' => 'biao', '㠒' => 'biao', '㧼' => 'biao', '㯱' => 'biao', '㯹' => 'biao', '䔸' => 'biao', '䞄' => 'biao',
+ '俷' => 'fei', '剕' => 'fei', '匪' => 'fei', '厞' => 'fei', '吠' => 'fei', '啡' => 'fei', '奜' => 'fei', '妃' => 'fei', '婓' => 'fei', '婔' => 'fei', '屝' => 'fei', '废' => 'fei', '廃' => 'fei', '廢' => 'fei', '悱' => 'fei', '扉' => 'fei', '斐' => 'fei', '昲' => 'fei', '暃' => 'fei', '曊' => 'fei', '朏' => 'fei', '杮' => 'fei', '棐' => 'fei', '榧' => 'fei', '櫠' => 'fei', '沸' => 'fei', '淝' => 'fei', '渄' => 'fei', '濷' => 'fei', '狒' => 'fei', '猆' => 'fei', '疿' => 'fei', '痱' => 'fei', '癈' => 'fei', '篚' => 'fei', '緋' => 'fei', '绯' => 'fei', '翡' => 'fei', '肥' => 'fei', '肺' => 'fei', '胐' => 'fei', '腓' => 'fei', '菲' => 'fei', '萉' => 'fei', '蕜' => 'fei', '蕟' => 'fei', '蜚' => 'fei', '蜰' => 'fei', '蟦' => 'fei', '裶' => 'fei', '誹' => 'fei', '诽' => 'fei', '費' => 'fei', '费' => 'fei', '鐨' => 'fei', '镄' => 'fei', '霏' => 'fei', '靅' => 'fei', '非' => 'fei', '靟' => 'fei', '飛' => 'fei', '飝' => 'fei', '飞' => 'fei', '餥' => 'fei', '馡' => 'fei', '騑' => 'fei', '騛' => 'fei', '鯡' => 'fei', '鲱' => 'fei', '鼣' => 'fei', '㔗' => 'fei', '㥱' => 'fei', '㩌' => 'fei', '㭭' => 'fei', '㵒' => 'fei', '䆏' => 'fei', '䈈' => 'fei', '䉬' => 'fei', '䑔' => 'fei', '䕁' => 'fei', '䕠' => 'fei', '䚨' => 'fei', '䛍' => 'fei', '䠊' => 'fei', '䤵' => 'fei', '䨽' => 'fei', '䨾' => 'fei', '䰁' => 'fei',
+ '俻' => 'bei', '倍' => 'bei', '偝' => 'bei', '偹' => 'bei', '備' => 'bei', '僃' => 'bei', '北' => 'bei', '卑' => 'bei', '喺' => 'bei', '备' => 'bei', '悖' => 'bei', '悲' => 'bei', '惫' => 'bei', '愂' => 'bei', '憊' => 'bei', '揹' => 'bei', '昁' => 'bei', '杯' => 'bei', '桮' => 'bei', '梖' => 'bei', '焙' => 'bei', '牬' => 'bei', '犕' => 'bei', '狈' => 'bei', '狽' => 'bei', '珼' => 'bei', '琲' => 'bei', '盃' => 'bei', '碑' => 'bei', '碚' => 'bei', '禙' => 'bei', '糒' => 'bei', '背' => 'bei', '苝' => 'bei', '蓓' => 'bei', '藣' => 'bei', '蛽' => 'bei', '被' => 'bei', '褙' => 'bei', '誖' => 'bei', '貝' => 'bei', '贝' => 'bei', '軰' => 'bei', '輩' => 'bei', '辈' => 'bei', '邶' => 'bei', '鄁' => 'bei', '鉳' => 'bei', '鋇' => 'bei', '鐾' => 'bei', '钡' => 'bei', '陂' => 'bei', '鞴' => 'bei', '骳' => 'bei', '鵯' => 'bei', '鹎' => 'bei', '㔨' => 'bei', '㛝' => 'bei', '㣁' => 'bei', '㤳' => 'bei', '㰆' => 'bei', '㶔' => 'bei', '㷶' => 'bei', '㸢' => 'bei', '㸬' => 'bei', '㸽' => 'bei', '㻗' => 'bei', '㼎' => 'bei', '㾱' => 'bei', '䁅' => 'bei', '䋳' => 'bei', '䔒' => 'bei', '䠙' => 'bei', '䡶' => 'bei', '䩀' => 'bei', '䰽' => 'bei',
+ '倊' => 'zong', '倧' => 'zong', '偬' => 'zong', '傯' => 'zong', '堫' => 'zong', '宗' => 'zong', '嵏' => 'zong', '嵕' => 'zong', '嵸' => 'zong', '总' => 'zong', '惣' => 'zong', '惾' => 'zong', '愡' => 'zong', '捴' => 'zong', '揔' => 'zong', '搃' => 'zong', '摠' => 'zong', '昮' => 'zong', '朡' => 'zong', '棕' => 'zong', '椶' => 'zong', '熧' => 'zong', '燪' => 'zong', '猔' => 'zong', '猣' => 'zong', '疭' => 'zong', '瘲' => 'zong', '碂' => 'zong', '磫' => 'zong', '稯' => 'zong', '粽' => 'zong', '糉' => 'zong', '綜' => 'zong', '緃' => 'zong', '総' => 'zong', '緵' => 'zong', '縂' => 'zong', '縦' => 'zong', '縱' => 'zong', '總' => 'zong', '纵' => 'zong', '综' => 'zong', '翪' => 'zong', '腙' => 'zong', '艐' => 'zong', '葼' => 'zong', '蓗' => 'zong', '蝬' => 'zong', '豵' => 'zong', '踨' => 'zong', '踪' => 'zong', '蹤' => 'zong', '錝' => 'zong', '鍯' => 'zong', '鏓' => 'zong', '鑁' => 'zong', '騌' => 'zong', '騣' => 'zong', '骔' => 'zong', '鬃' => 'zong', '鬉' => 'zong', '鬷' => 'zong', '鯮' => 'zong', '鯼' => 'zong', '㢔' => 'zong', '㯶' => 'zong', '㷓' => 'zong', '㹅' => 'zong', '䍟' => 'zong', '䝋' => 'zong', '䰌' => 'zong',
+ '倎' => 'tian', '兲' => 'tian', '唺' => 'tian', '塡' => 'tian', '填' => 'tian', '天' => 'tian', '婖' => 'tian', '屇' => 'tian', '忝' => 'tian', '恬' => 'tian', '悿' => 'tian', '捵' => 'tian', '掭' => 'tian', '搷' => 'tian', '晪' => 'tian', '殄' => 'tian', '沺' => 'tian', '淟' => 'tian', '添' => 'tian', '湉' => 'tian', '琠' => 'tian', '瑱' => 'tian', '璳' => 'tian', '甛' => 'tian', '甜' => 'tian', '田' => 'tian', '畋' => 'tian', '畑' => 'tian', '畠' => 'tian', '痶' => 'tian', '盷' => 'tian', '睓' => 'tian', '睼' => 'tian', '碵' => 'tian', '磌' => 'tian', '窴' => 'tian', '緂' => 'tian', '胋' => 'tian', '腆' => 'tian', '舔' => 'tian', '舚' => 'tian', '菾' => 'tian', '覥' => 'tian', '觍' => 'tian', '賟' => 'tian', '酟' => 'tian', '錪' => 'tian', '闐' => 'tian', '阗' => 'tian', '靔' => 'tian', '靝' => 'tian', '靦' => 'tian', '餂' => 'tian', '鴫' => 'tian', '鷆' => 'tian', '鷏' => 'tian', '黇' => 'tian', '㐁' => 'tian', '㖭' => 'tian', '㙉' => 'tian', '㥏' => 'tian', '㧂' => 'tian', '㮇' => 'tian', '㶺' => 'tian', '䄼' => 'tian', '䄽' => 'tian', '䐌' => 'tian', '䑚' => 'tian', '䟧' => 'tian', '䠄' => 'tian', '䡒' => 'tian', '䡘' => 'tian', '䣯' => 'tian', '䥖' => 'tian', '䩄' => 'tian',
+ '倒' => 'dao', '刀' => 'dao', '刂' => 'dao', '到' => 'dao', '叨' => 'dao', '噵' => 'dao', '壔' => 'dao', '宲' => 'dao', '导' => 'dao', '導' => 'dao', '屶' => 'dao', '岛' => 'dao', '島' => 'dao', '嶋' => 'dao', '嶌' => 'dao', '嶹' => 'dao', '忉' => 'dao', '悼' => 'dao', '捣' => 'dao', '捯' => 'dao', '搗' => 'dao', '擣' => 'dao', '朷' => 'dao', '椡' => 'dao', '槝' => 'dao', '檤' => 'dao', '氘' => 'dao', '焘' => 'dao', '燾' => 'dao', '瓙' => 'dao', '盗' => 'dao', '盜' => 'dao', '祷' => 'dao', '禂' => 'dao', '禱' => 'dao', '稲' => 'dao', '稻' => 'dao', '纛' => 'dao', '翢' => 'dao', '翿' => 'dao', '舠' => 'dao', '菿' => 'dao', '衜' => 'dao', '衟' => 'dao', '蹈' => 'dao', '軇' => 'dao', '道' => 'dao', '釖' => 'dao', '陦' => 'dao', '隝' => 'dao', '隯' => 'dao', '魛' => 'dao', '鱽' => 'dao', '㠀' => 'dao', '㿒' => 'dao', '䆃' => 'dao', '䌦' => 'dao', '䧂' => 'dao', '䲽' => 'dao',
+ '倓' => 'tan', '傝' => 'tan', '僋' => 'tan', '叹' => 'tan', '啴' => 'tan', '嗿' => 'tan', '嘆' => 'tan', '嘽' => 'tan', '坍' => 'tan', '坛' => 'tan', '坦' => 'tan', '埮' => 'tan', '墰' => 'tan', '墵' => 'tan', '壇' => 'tan', '壜' => 'tan', '婒' => 'tan', '弾' => 'tan', '忐' => 'tan', '怹' => 'tan', '惔' => 'tan', '憛' => 'tan', '憳' => 'tan', '憻' => 'tan', '探' => 'tan', '摊' => 'tan', '撢' => 'tan', '擹' => 'tan', '攤' => 'tan', '昙' => 'tan', '暺' => 'tan', '曇' => 'tan', '榃' => 'tan', '橝' => 'tan', '檀' => 'tan', '歎' => 'tan', '毯' => 'tan', '湠' => 'tan', '滩' => 'tan', '潬' => 'tan', '潭' => 'tan', '灘' => 'tan', '炭' => 'tan', '璮' => 'tan', '痑' => 'tan', '痰' => 'tan', '瘫' => 'tan', '癱' => 'tan', '碳' => 'tan', '罈' => 'tan', '罎' => 'tan', '舑' => 'tan', '舕' => 'tan', '菼' => 'tan', '藫' => 'tan', '袒' => 'tan', '襢' => 'tan', '覃' => 'tan', '談' => 'tan', '譚' => 'tan', '譠' => 'tan', '谈' => 'tan', '谭' => 'tan', '貚' => 'tan', '貪' => 'tan', '賧' => 'tan', '贪' => 'tan', '赕' => 'tan', '郯' => 'tan', '醈' => 'tan', '醓' => 'tan', '醰' => 'tan', '鉭' => 'tan', '錟' => 'tan', '钽' => 'tan', '锬' => 'tan', '顃' => 'tan', '鷤' => 'tan', '㲜' => 'tan', '㲭' => 'tan', '㷋' => 'tan', '㽑' => 'tan', '䃪' => 'tan', '䆱' => 'tan', '䉡' => 'tan', '䊤' => 'tan', '䏙' => 'tan', '䐺' => 'tan', '䕊' => 'tan', '䜖' => 'tan', '䞡' => 'tan', '䦔' => 'tan',
+ '倕' => 'chui', '吹' => 'chui', '垂' => 'chui', '埀' => 'chui', '捶' => 'chui', '搥' => 'chui', '桘' => 'chui', '棰' => 'chui', '槌' => 'chui', '炊' => 'chui', '箠' => 'chui', '腄' => 'chui', '菙' => 'chui', '錘' => 'chui', '鎚' => 'chui', '锤' => 'chui', '陲' => 'chui', '顀' => 'chui', '龡' => 'chui', '㓃' => 'chui', '㝽' => 'chui', '㥨' => 'chui', '㩾' => 'chui', '䄲' => 'chui', '䍋' => 'chui', '䞼' => 'chui', '䳠' => 'chui',
+ '倘' => 'tang', '偒' => 'tang', '傏' => 'tang', '傥' => 'tang', '儻' => 'tang', '劏' => 'tang', '唐' => 'tang', '啺' => 'tang', '嘡' => 'tang', '坣' => 'tang', '堂' => 'tang', '塘' => 'tang', '嵣' => 'tang', '帑' => 'tang', '戃' => 'tang', '搪' => 'tang', '摥' => 'tang', '曭' => 'tang', '棠' => 'tang', '榶' => 'tang', '樘' => 'tang', '橖' => 'tang', '汤' => 'tang', '淌' => 'tang', '湯' => 'tang', '溏' => 'tang', '漟' => 'tang', '烫' => 'tang', '煻' => 'tang', '燙' => 'tang', '爣' => 'tang', '瑭' => 'tang', '矘' => 'tang', '磄' => 'tang', '禟' => 'tang', '篖' => 'tang', '糃' => 'tang', '糖' => 'tang', '糛' => 'tang', '羰' => 'tang', '耥' => 'tang', '膅' => 'tang', '膛' => 'tang', '蓎' => 'tang', '薚' => 'tang', '蝪' => 'tang', '螗' => 'tang', '螳' => 'tang', '赯' => 'tang', '趟' => 'tang', '踼' => 'tang', '蹚' => 'tang', '躺' => 'tang', '鄌' => 'tang', '醣' => 'tang', '鎕' => 'tang', '鎲' => 'tang', '鏜' => 'tang', '鐋' => 'tang', '钂' => 'tang', '铴' => 'tang', '镋' => 'tang', '镗' => 'tang', '闛' => 'tang', '隚' => 'tang', '鞺' => 'tang', '餳' => 'tang', '餹' => 'tang', '饄' => 'tang', '饧' => 'tang', '鶶' => 'tang', '鼞' => 'tang', '㑽' => 'tang', '㒉' => 'tang', '㙶' => 'tang', '㜍' => 'tang', '㭻' => 'tang', '㲥' => 'tang', '㼺' => 'tang', '㿩' => 'tang', '䅯' => 'tang', '䉎' => 'tang', '䌅' => 'tang', '䟖' => 'tang', '䣘' => 'tang', '䧜' => 'tang',
+ '倥' => 'kong', '埪' => 'kong', '孔' => 'kong', '崆' => 'kong', '恐' => 'kong', '悾' => 'kong', '控' => 'kong', '涳' => 'kong', '硿' => 'kong', '空' => 'kong', '箜' => 'kong', '躻' => 'kong', '躼' => 'kong', '錓' => 'kong', '鞚' => 'kong', '鵼' => 'kong', '㤟' => 'kong', '㸜' => 'kong',
+ '倦' => 'juan', '劵' => 'juan', '勌' => 'juan', '勬' => 'juan', '卷' => 'juan', '呟' => 'juan', '埍' => 'juan', '奆' => 'juan', '姢' => 'juan', '娟' => 'juan', '帣' => 'juan', '弮' => 'juan', '慻' => 'juan', '捐' => 'juan', '捲' => 'juan', '桊' => 'juan', '涓' => 'juan', '淃' => 'juan', '狷' => 'juan', '獧' => 'juan', '瓹' => 'juan', '眷' => 'juan', '睊' => 'juan', '睠' => 'juan', '絭' => 'juan', '絹' => 'juan', '绢' => 'juan', '罥' => 'juan', '羂' => 'juan', '脧' => 'juan', '臇' => 'juan', '菤' => 'juan', '蔨' => 'juan', '蠲' => 'juan', '裐' => 'juan', '鄄' => 'juan', '鋑' => 'juan', '鋗' => 'juan', '錈' => 'juan', '鎸' => 'juan', '鐫' => 'juan', '锩' => 'juan', '镌' => 'juan', '隽' => 'juan', '雋' => 'juan', '飬' => 'juan', '餋' => 'juan', '鵑' => 'juan', '鹃' => 'juan', '㢧' => 'juan', '㢾' => 'juan', '㪻' => 'juan', '㯞' => 'juan', '㷷' => 'juan', '䄅' => 'juan', '䌸' => 'juan', '䖭' => 'juan', '䚈' => 'juan', '䡓' => 'juan', '䳪' => 'juan',
+ '倮' => 'luo', '儸' => 'luo', '剆' => 'luo', '啰' => 'luo', '囉' => 'luo', '峈' => 'luo', '捋' => 'luo', '摞' => 'luo', '攞' => 'luo', '曪' => 'luo', '椤' => 'luo', '欏' => 'luo', '泺' => 'luo', '洛' => 'luo', '洜' => 'luo', '漯' => 'luo', '濼' => 'luo', '犖' => 'luo', '猡' => 'luo', '玀' => 'luo', '珞' => 'luo', '瘰' => 'luo', '癳' => 'luo', '砢' => 'luo', '笿' => 'luo', '箩' => 'luo', '籮' => 'luo', '絡' => 'luo', '纙' => 'luo', '络' => 'luo', '罗' => 'luo', '羅' => 'luo', '脶' => 'luo', '腡' => 'luo', '臝' => 'luo', '荦' => 'luo', '萝' => 'luo', '落' => 'luo', '蓏' => 'luo', '蘿' => 'luo', '螺' => 'luo', '蠃' => 'luo', '裸' => 'luo', '覶' => 'luo', '覼' => 'luo', '躶' => 'luo', '逻' => 'luo', '邏' => 'luo', '鏍' => 'luo', '鑼' => 'luo', '锣' => 'luo', '镙' => 'luo', '雒' => 'luo', '頱' => 'luo', '饠' => 'luo', '駱' => 'luo', '騾' => 'luo', '驘' => 'luo', '骆' => 'luo', '骡' => 'luo', '鮥' => 'luo', '鱳' => 'luo', '鵅' => 'luo', '鸁' => 'luo', '㑩' => 'luo', '㒩' => 'luo', '㓢' => 'luo', '㦬' => 'luo', '㩡' => 'luo', '㰁' => 'luo', '㱻' => 'luo', '㴖' => 'luo', '㼈' => 'luo', '㽋' => 'luo', '㿚' => 'luo', '䀩' => 'luo', '䇔' => 'luo', '䈷' => 'luo', '䊨' => 'luo', '䌱' => 'luo', '䌴' => 'luo', '䯁' => 'luo',
+ '倯' => 'song', '傱' => 'song', '凇' => 'song', '娀' => 'song', '宋' => 'song', '崧' => 'song', '嵩' => 'song', '嵷' => 'song', '庺' => 'song', '忪' => 'song', '怂' => 'song', '悚' => 'song', '愯' => 'song', '慫' => 'song', '憽' => 'song', '捒' => 'song', '松' => 'song', '枀' => 'song', '枩' => 'song', '柗' => 'song', '梥' => 'song', '檧' => 'song', '淞' => 'song', '濍' => 'song', '硹' => 'song', '竦' => 'song', '耸' => 'song', '聳' => 'song', '菘' => 'song', '蜙' => 'song', '訟' => 'song', '誦' => 'song', '讼' => 'song', '诵' => 'song', '送' => 'song', '鎹' => 'song', '頌' => 'song', '颂' => 'song', '餸' => 'song', '駷' => 'song', '鬆' => 'song', '㕬' => 'song', '㧐' => 'song', '㨦' => 'song', '㩳' => 'song', '㮸' => 'song', '䉥' => 'song', '䛦' => 'song', '䜬' => 'song', '䢠' => 'song',
+ '倰' => 'leng', '冷' => 'leng', '堎' => 'leng', '塄' => 'leng', '愣' => 'leng', '棱' => 'leng', '楞' => 'leng', '睖' => 'leng', '碐' => 'leng', '稜' => 'leng', '薐' => 'leng', '踜' => 'leng', '䉄' => 'leng', '䚏' => 'leng', '䬋' => 'leng', '䮚' => 'leng',
+ '倴' => 'ben', '坌' => 'ben', '奔' => 'ben', '奙' => 'ben', '捹' => 'ben', '撪' => 'ben', '本' => 'ben', '桳' => 'ben', '楍' => 'ben', '泍' => 'ben', '渀' => 'ben', '犇' => 'ben', '獖' => 'ben', '畚' => 'ben', '笨' => 'ben', '苯' => 'ben', '賁' => 'ben', '贲' => 'ben', '輽' => 'ben', '逩' => 'ben', '錛' => 'ben', '锛' => 'ben', '㡷' => 'ben', '㤓' => 'ben', '㨧' => 'ben', '㮺' => 'ben', '㱵' => 'ben', '䬱' => 'ben',
+ '债' => 'zhai', '債' => 'zhai', '夈' => 'zhai', '宅' => 'zhai', '寨' => 'zhai', '捚' => 'zhai', '摘' => 'zhai', '斋' => 'zhai', '斎' => 'zhai', '斏' => 'zhai', '榸' => 'zhai', '瘵' => 'zhai', '砦' => 'zhai', '窄' => 'zhai', '粂' => 'zhai', '鉙' => 'zhai', '齋' => 'zhai', '㡯' => 'zhai', '㩟' => 'zhai',
+ '倾' => 'qing', '傾' => 'qing', '儬' => 'qing', '凊' => 'qing', '剠' => 'qing', '勍' => 'qing', '卿' => 'qing', '圊' => 'qing', '埥' => 'qing', '夝' => 'qing', '庆' => 'qing', '庼' => 'qing', '廎' => 'qing', '情' => 'qing', '慶' => 'qing', '掅' => 'qing', '擎' => 'qing', '擏' => 'qing', '晴' => 'qing', '暒' => 'qing', '棾' => 'qing', '樈' => 'qing', '檠' => 'qing', '檾' => 'qing', '櫦' => 'qing', '殑' => 'qing', '殸' => 'qing', '氢' => 'qing', '氫' => 'qing', '氰' => 'qing', '淸' => 'qing', '清' => 'qing', '漀' => 'qing', '濪' => 'qing', '甠' => 'qing', '硘' => 'qing', '碃' => 'qing', '磬' => 'qing', '箐' => 'qing', '罄' => 'qing', '苘' => 'qing', '葝' => 'qing', '蜻' => 'qing', '請' => 'qing', '謦' => 'qing', '请' => 'qing', '軽' => 'qing', '輕' => 'qing', '轻' => 'qing', '郬' => 'qing', '鑋' => 'qing', '靑' => 'qing', '青' => 'qing', '靘' => 'qing', '頃' => 'qing', '顷' => 'qing', '鯖' => 'qing', '鲭' => 'qing', '黥' => 'qing', '㯳' => 'qing', '㷫' => 'qing', '䋜' => 'qing', '䌠' => 'qing', '䔛' => 'qing', '䝼' => 'qing', '䞍' => 'qing', '䯧' => 'qing', '䲔' => 'qing',
+ '偀' => 'ying', '僌' => 'ying', '啨' => 'ying', '営' => 'ying', '嘤' => 'ying', '噟' => 'ying', '嚶' => 'ying', '塋' => 'ying', '婴' => 'ying', '媖' => 'ying', '媵' => 'ying', '嫈' => 'ying', '嬰' => 'ying', '嬴' => 'ying', '孆' => 'ying', '孾' => 'ying', '巆' => 'ying', '巊' => 'ying', '应' => 'ying', '廮' => 'ying', '影' => 'ying', '応' => 'ying', '愥' => 'ying', '應' => 'ying', '摬' => 'ying', '撄' => 'ying', '攍' => 'ying', '攖' => 'ying', '攚' => 'ying', '映' => 'ying', '暎' => 'ying', '朠' => 'ying', '桜' => 'ying', '梬' => 'ying', '楹' => 'ying', '樱' => 'ying', '櫻' => 'ying', '櫿' => 'ying', '浧' => 'ying', '渶' => 'ying', '溁' => 'ying', '溋' => 'ying', '滎' => 'ying', '滢' => 'ying', '潁' => 'ying', '潆' => 'ying', '濙' => 'ying', '濚' => 'ying', '濴' => 'ying', '瀅' => 'ying', '瀛' => 'ying', '瀠' => 'ying', '瀯' => 'ying', '瀴' => 'ying', '灐' => 'ying', '灜' => 'ying', '煐' => 'ying', '熒' => 'ying', '營' => 'ying', '珱' => 'ying', '瑛' => 'ying', '瑩' => 'ying', '璎' => 'ying', '瓔' => 'ying', '甇' => 'ying', '甖' => 'ying', '瘿' => 'ying', '癭' => 'ying', '盁' => 'ying', '盈' => 'ying', '矨' => 'ying', '硬' => 'ying', '碤' => 'ying', '礯' => 'ying', '穎' => 'ying', '籝' => 'ying', '籯' => 'ying', '緓' => 'ying', '縈' => 'ying', '纓' => 'ying', '绬' => 'ying', '缨' => 'ying', '罂' => 'ying', '罃' => 'ying', '罌' => 'ying', '膡' => 'ying', '膺' => 'ying', '英' => 'ying', '茔' => 'ying', '荥' => 'ying', '荧' => 'ying', '莹' => 'ying', '莺' => 'ying', '萤' => 'ying', '营' => 'ying', '萦' => 'ying', '萾' => 'ying', '蓥' => 'ying', '藀' => 'ying', '蘡' => 'ying', '蛍' => 'ying', '蝇' => 'ying', '蝧' => 'ying', '蝿' => 'ying', '螢' => 'ying', '蠅' => 'ying', '蠳' => 'ying', '褮' => 'ying', '覮' => 'ying', '謍' => 'ying', '譍' => 'ying', '譻' => 'ying', '賏' => 'ying', '贏' => 'ying', '赢' => 'ying', '軈' => 'ying', '迎' => 'ying', '郢' => 'ying', '鎣' => 'ying', '鐛' => 'ying', '鑍' => 'ying', '锳' => 'ying', '霙' => 'ying', '鞕' => 'ying', '韺' => 'ying', '頴' => 'ying', '颍' => 'ying', '颕' => 'ying', '颖' => 'ying', '鴬' => 'ying', '鶧' => 'ying', '鶯' => 'ying', '鷪' => 'ying', '鷹' => 'ying', '鸎' => 'ying', '鸚' => 'ying', '鹦' => 'ying', '鹰' => 'ying', '㑞' => 'ying', '㢍' => 'ying', '㨕' => 'ying', '㯋' => 'ying', '㲟' => 'ying', '㴄' => 'ying', '㵬' => 'ying', '㶈' => 'ying', '㹙' => 'ying', '㹚' => 'ying', '㿘' => 'ying', '䀴' => 'ying', '䁐' => 'ying', '䁝' => 'ying', '䃷' => 'ying', '䇾' => 'ying', '䑉' => 'ying', '䕦' => 'ying', '䙬' => 'ying', '䤝' => 'ying', '䨍' => 'ying', '䪯' => 'ying', '䭊' => 'ying', '䭗' => 'ying',
+ '偄' => 'ruan', '堧' => 'ruan', '壖' => 'ruan', '媆' => 'ruan', '嫰' => 'ruan', '愞' => 'ruan', '撋' => 'ruan', '朊' => 'ruan', '瑌' => 'ruan', '瓀' => 'ruan', '碝' => 'ruan', '礝' => 'ruan', '緛' => 'ruan', '耎' => 'ruan', '腝' => 'ruan', '蝡' => 'ruan', '軟' => 'ruan', '輭' => 'ruan', '软' => 'ruan', '阮' => 'ruan', '㼱' => 'ruan', '㽭' => 'ruan', '䓴' => 'ruan', '䞂' => 'ruan', '䪭' => 'ruan',
+ '偆' => 'chun', '唇' => 'chun', '堾' => 'chun', '媋' => 'chun', '惷' => 'chun', '旾' => 'chun', '春' => 'chun', '暙' => 'chun', '杶' => 'chun', '椿' => 'chun', '槆' => 'chun', '橁' => 'chun', '櫄' => 'chun', '浱' => 'chun', '淳' => 'chun', '湻' => 'chun', '滣' => 'chun', '漘' => 'chun', '犉' => 'chun', '瑃' => 'chun', '睶' => 'chun', '箺' => 'chun', '純' => 'chun', '纯' => 'chun', '脣' => 'chun', '莼' => 'chun', '萅' => 'chun', '萶' => 'chun', '蒓' => 'chun', '蓴' => 'chun', '蝽' => 'chun', '蠢' => 'chun', '賰' => 'chun', '踳' => 'chun', '輴' => 'chun', '醇' => 'chun', '醕' => 'chun', '錞' => 'chun', '陙' => 'chun', '鯙' => 'chun', '鰆' => 'chun', '鶉' => 'chun', '鶞' => 'chun', '鹑' => 'chun', '㖺' => 'chun', '㝄' => 'chun', '㝇' => 'chun', '㵮' => 'chun', '㸪' => 'chun', '㿤' => 'chun', '䄝' => 'chun', '䏛' => 'chun', '䏝' => 'chun', '䐇' => 'chun', '䐏' => 'chun', '䓐' => 'chun', '䔚' => 'chun', '䞐' => 'chun', '䣨' => 'chun', '䣩' => 'chun', '䥎' => 'chun', '䦮' => 'chun', '䫃' => 'chun',
+ '偌' => 'ruo', '叒' => 'ruo', '婼' => 'ruo', '嵶' => 'ruo', '弱' => 'ruo', '挼' => 'ruo', '捼' => 'ruo', '楉' => 'ruo', '渃' => 'ruo', '焫' => 'ruo', '爇' => 'ruo', '箬' => 'ruo', '篛' => 'ruo', '若' => 'ruo', '蒻' => 'ruo', '鄀' => 'ruo', '鰙' => 'ruo', '鰯' => 'ruo', '鶸' => 'ruo', '䐞' => 'ruo',
+ '偏' => 'pian', '囨' => 'pian', '媥' => 'pian', '楄' => 'pian', '楩' => 'pian', '片' => 'pian', '犏' => 'pian', '篇' => 'pian', '翩' => 'pian', '胼' => 'pian', '腁' => 'pian', '覑' => 'pian', '諚' => 'pian', '諞' => 'pian', '谝' => 'pian', '貵' => 'pian', '賆' => 'pian', '蹁' => 'pian', '駢' => 'pian', '騈' => 'pian', '騗' => 'pian', '騙' => 'pian', '骈' => 'pian', '骗' => 'pian', '骿' => 'pian', '魸' => 'pian', '鶣' => 'pian', '㓲' => 'pian', '㛹' => 'pian', '㸤' => 'pian', '㼐' => 'pian', '䏒' => 'pian', '䮁' => 'pian',
+ '偗' => 'sheng', '剩' => 'sheng', '剰' => 'sheng', '勝' => 'sheng', '升' => 'sheng', '呏' => 'sheng', '圣' => 'sheng', '墭' => 'sheng', '声' => 'sheng', '嵊' => 'sheng', '憴' => 'sheng', '斘' => 'sheng', '昇' => 'sheng', '晟' => 'sheng', '晠' => 'sheng', '曻' => 'sheng', '枡' => 'sheng', '榺' => 'sheng', '橳' => 'sheng', '殅' => 'sheng', '泩' => 'sheng', '渑' => 'sheng', '渻' => 'sheng', '湦' => 'sheng', '澠' => 'sheng', '焺' => 'sheng', '牲' => 'sheng', '珄' => 'sheng', '琞' => 'sheng', '生' => 'sheng', '甥' => 'sheng', '盛' => 'sheng', '省' => 'sheng', '眚' => 'sheng', '竔' => 'sheng', '笙' => 'sheng', '縄' => 'sheng', '繩' => 'sheng', '绳' => 'sheng', '聖' => 'sheng', '聲' => 'sheng', '胜' => 'sheng', '苼' => 'sheng', '蕂' => 'sheng', '譝' => 'sheng', '貹' => 'sheng', '賸' => 'sheng', '鉎' => 'sheng', '鍟' => 'sheng', '阩' => 'sheng', '陞' => 'sheng', '陹' => 'sheng', '鱦' => 'sheng', '鵿' => 'sheng', '鼪' => 'sheng', '㗂' => 'sheng', '㼳' => 'sheng', '㾪' => 'sheng', '䁞' => 'sheng', '䎴' => 'sheng', '䚇' => 'sheng', '䞉' => 'sheng', '䪿' => 'sheng', '䱆' => 'sheng',
+ '偟' => 'huang', '兤' => 'huang', '凰' => 'huang', '喤' => 'huang', '堭' => 'huang', '塃' => 'huang', '墴' => 'huang', '奛' => 'huang', '媓' => 'huang', '宺' => 'huang', '崲' => 'huang', '巟' => 'huang', '幌' => 'huang', '徨' => 'huang', '怳' => 'huang', '恍' => 'huang', '惶' => 'huang', '愰' => 'huang', '慌' => 'huang', '揘' => 'huang', '晃' => 'huang', '晄' => 'huang', '曂' => 'huang', '朚' => 'huang', '楻' => 'huang', '榥' => 'huang', '櫎' => 'huang', '湟' => 'huang', '滉' => 'huang', '潢' => 'huang', '炾' => 'huang', '煌' => 'huang', '熀' => 'huang', '熿' => 'huang', '獚' => 'huang', '瑝' => 'huang', '璜' => 'huang', '癀' => 'huang', '皇' => 'huang', '皝' => 'huang', '皩' => 'huang', '磺' => 'huang', '穔' => 'huang', '篁' => 'huang', '簧' => 'huang', '縨' => 'huang', '肓' => 'huang', '艎' => 'huang', '荒' => 'huang', '葟' => 'huang', '蝗' => 'huang', '蟥' => 'huang', '衁' => 'huang', '詤' => 'huang', '諻' => 'huang', '謊' => 'huang', '谎' => 'huang', '趪' => 'huang', '遑' => 'huang', '鍠' => 'huang', '鎤' => 'huang', '鐄' => 'huang', '锽' => 'huang', '隍' => 'huang', '韹' => 'huang', '餭' => 'huang', '騜' => 'huang', '鰉' => 'huang', '鱑' => 'huang', '鳇' => 'huang', '鷬' => 'huang', '黃' => 'huang', '黄' => 'huang', '㞷' => 'huang', '㤺' => 'huang', '㨪' => 'huang', '㬻' => 'huang', '㾠' => 'huang', '㾮' => 'huang', '䁜' => 'huang', '䅣' => 'huang', '䊗' => 'huang', '䊣' => 'huang', '䌙' => 'huang', '䍿' => 'huang', '䐠' => 'huang', '䐵' => 'huang', '䑟' => 'huang', '䞹' => 'huang', '䪄' => 'huang', '䮲' => 'huang', '䳨' => 'huang',
+ '偳' => 'duan', '塅' => 'duan', '媏' => 'duan', '断' => 'duan', '斷' => 'duan', '椴' => 'duan', '段' => 'duan', '毈' => 'duan', '煅' => 'duan', '瑖' => 'duan', '短' => 'duan', '碫' => 'duan', '端' => 'duan', '簖' => 'duan', '籪' => 'duan', '緞' => 'duan', '缎' => 'duan', '耑' => 'duan', '腶' => 'duan', '葮' => 'duan', '褍' => 'duan', '躖' => 'duan', '鍛' => 'duan', '鍴' => 'duan', '锻' => 'duan', '㫁' => 'duan', '㱭' => 'duan', '䠪' => 'duan',
+ '偺' => 'zan', '儧' => 'zan', '儹' => 'zan', '兂' => 'zan', '咱' => 'zan', '喒' => 'zan', '囋' => 'zan', '寁' => 'zan', '撍' => 'zan', '攒' => 'zan', '攢' => 'zan', '昝' => 'zan', '暂' => 'zan', '暫' => 'zan', '濽' => 'zan', '灒' => 'zan', '瓉' => 'zan', '瓒' => 'zan', '瓚' => 'zan', '禶' => 'zan', '簪' => 'zan', '簮' => 'zan', '糌' => 'zan', '襸' => 'zan', '讃' => 'zan', '讚' => 'zan', '賛' => 'zan', '贊' => 'zan', '赞' => 'zan', '趱' => 'zan', '趲' => 'zan', '蹔' => 'zan', '鄼' => 'zan', '酂' => 'zan', '酇' => 'zan', '錾' => 'zan', '鏨' => 'zan', '鐕' => 'zan', '饡' => 'zan', '㜺' => 'zan', '㟛' => 'zan', '㣅' => 'zan', '㤰' => 'zan',
+ '偻' => 'lou', '僂' => 'lou', '喽' => 'lou', '嘍' => 'lou', '塿' => 'lou', '娄' => 'lou', '婁' => 'lou', '屚' => 'lou', '嵝' => 'lou', '嶁' => 'lou', '廔' => 'lou', '慺' => 'lou', '搂' => 'lou', '摟' => 'lou', '楼' => 'lou', '樓' => 'lou', '溇' => 'lou', '漊' => 'lou', '漏' => 'lou', '熡' => 'lou', '甊' => 'lou', '瘘' => 'lou', '瘺' => 'lou', '瘻' => 'lou', '瞜' => 'lou', '篓' => 'lou', '簍' => 'lou', '耧' => 'lou', '耬' => 'lou', '艛' => 'lou', '蒌' => 'lou', '蔞' => 'lou', '蝼' => 'lou', '螻' => 'lou', '謱' => 'lou', '軁' => 'lou', '遱' => 'lou', '鏤' => 'lou', '镂' => 'lou', '陋' => 'lou', '鞻' => 'lou', '髅' => 'lou', '髏' => 'lou', '㔷' => 'lou', '㟺' => 'lou', '㥪' => 'lou', '㪹' => 'lou', '㲎' => 'lou', '㺏' => 'lou', '䁖' => 'lou', '䄛' => 'lou', '䅹' => 'lou', '䝏' => 'lou', '䣚' => 'lou', '䫫' => 'lou', '䮫' => 'lou', '䱾' => 'lou',
+ '傁' => 'sou', '凁' => 'sou', '叜' => 'sou', '叟' => 'sou', '嗖' => 'sou', '嗾' => 'sou', '廀' => 'sou', '廋' => 'sou', '捜' => 'sou', '搜' => 'sou', '摗' => 'sou', '擞' => 'sou', '擻' => 'sou', '櫢' => 'sou', '溲' => 'sou', '獀' => 'sou', '瘶' => 'sou', '瞍' => 'sou', '艘' => 'sou', '蒐' => 'sou', '蓃' => 'sou', '薮' => 'sou', '藪' => 'sou', '螋' => 'sou', '鄋' => 'sou', '醙' => 'sou', '鎪' => 'sou', '锼' => 'sou', '颼' => 'sou', '飕' => 'sou', '餿' => 'sou', '馊' => 'sou', '騪' => 'sou', '㖩' => 'sou', '㛐' => 'sou', '㵻' => 'sou', '䈹' => 'sou', '䉤' => 'sou', '䏂' => 'sou', '䮟' => 'sou',
+ '傆' => 'yuan', '元' => 'yuan', '冤' => 'yuan', '剈' => 'yuan', '原' => 'yuan', '厡' => 'yuan', '厵' => 'yuan', '员' => 'yuan', '員' => 'yuan', '噮' => 'yuan', '囦' => 'yuan', '园' => 'yuan', '圆' => 'yuan', '圎' => 'yuan', '園' => 'yuan', '圓' => 'yuan', '圜' => 'yuan', '垣' => 'yuan', '垸' => 'yuan', '塬' => 'yuan', '夗' => 'yuan', '妴' => 'yuan', '媛' => 'yuan', '媴' => 'yuan', '嫄' => 'yuan', '嬽' => 'yuan', '寃' => 'yuan', '弲' => 'yuan', '怨' => 'yuan', '悁' => 'yuan', '惌' => 'yuan', '愿' => 'yuan', '掾' => 'yuan', '援' => 'yuan', '杬' => 'yuan', '棩' => 'yuan', '榞' => 'yuan', '榬' => 'yuan', '橼' => 'yuan', '櫞' => 'yuan', '沅' => 'yuan', '淵' => 'yuan', '渁' => 'yuan', '渆' => 'yuan', '渊' => 'yuan', '渕' => 'yuan', '湲' => 'yuan', '源' => 'yuan', '溒' => 'yuan', '灁' => 'yuan', '爰' => 'yuan', '猨' => 'yuan', '猿' => 'yuan', '獂' => 'yuan', '瑗' => 'yuan', '盶' => 'yuan', '眢' => 'yuan', '禐' => 'yuan', '笎' => 'yuan', '箢' => 'yuan', '緣' => 'yuan', '縁' => 'yuan', '缘' => 'yuan', '羱' => 'yuan', '肙' => 'yuan', '苑' => 'yuan', '葾' => 'yuan', '蒝' => 'yuan', '蒬' => 'yuan', '薗' => 'yuan', '蚖' => 'yuan', '蜎' => 'yuan', '蜵' => 'yuan', '蝝' => 'yuan', '蝯' => 'yuan', '螈' => 'yuan', '衏' => 'yuan', '袁' => 'yuan', '裫' => 'yuan', '褑' => 'yuan', '褤' => 'yuan', '謜' => 'yuan', '貟' => 'yuan', '贠' => 'yuan', '轅' => 'yuan', '辕' => 'yuan', '远' => 'yuan', '逺' => 'yuan', '遠' => 'yuan', '邍' => 'yuan', '邧' => 'yuan', '酛' => 'yuan', '鈨' => 'yuan', '鋺' => 'yuan', '鎱' => 'yuan', '院' => 'yuan', '願' => 'yuan', '駌' => 'yuan', '騵' => 'yuan', '魭' => 'yuan', '鳶' => 'yuan', '鴛' => 'yuan', '鵷' => 'yuan', '鶢' => 'yuan', '鶰' => 'yuan', '鸢' => 'yuan', '鸳' => 'yuan', '鹓' => 'yuan', '黿' => 'yuan', '鼋' => 'yuan', '鼘' => 'yuan', '鼝' => 'yuan', '㟶' => 'yuan', '㤪' => 'yuan', '㥐' => 'yuan', '㥳' => 'yuan', '㭇' => 'yuan', '㹉' => 'yuan', '䅈' => 'yuan', '䏍' => 'yuan', '䖠' => 'yuan', '䛄' => 'yuan', '䛇' => 'yuan', '䩩' => 'yuan', '䬇' => 'yuan', '䬧' => 'yuan', '䬼' => 'yuan', '䲮' => 'yuan', '䳒' => 'yuan', '䳣' => 'yuan',
+ '傇' => 'rong', '冗' => 'rong', '媶' => 'rong', '嫆' => 'rong', '嬫' => 'rong', '宂' => 'rong', '容' => 'rong', '峵' => 'rong', '嵘' => 'rong', '嵤' => 'rong', '嶸' => 'rong', '戎' => 'rong', '搈' => 'rong', '搑' => 'rong', '摉' => 'rong', '曧' => 'rong', '栄' => 'rong', '榕' => 'rong', '榮' => 'rong', '榵' => 'rong', '毧' => 'rong', '氄' => 'rong', '溶' => 'rong', '瀜' => 'rong', '烿' => 'rong', '熔' => 'rong', '爃' => 'rong', '狨' => 'rong', '瑢' => 'rong', '穁' => 'rong', '穃' => 'rong', '絨' => 'rong', '縙' => 'rong', '绒' => 'rong', '羢' => 'rong', '肜' => 'rong', '茙' => 'rong', '茸' => 'rong', '荣' => 'rong', '蓉' => 'rong', '蝾' => 'rong', '融' => 'rong', '螎' => 'rong', '蠑' => 'rong', '褣' => 'rong', '軵' => 'rong', '鎔' => 'rong', '镕' => 'rong', '駥' => 'rong', '髶' => 'rong', '㘇' => 'rong', '㝐' => 'rong', '㣑' => 'rong', '㭜' => 'rong', '㲓' => 'rong', '㲝' => 'rong', '㲨' => 'rong', '㺎' => 'rong', '㼸' => 'rong', '䇀' => 'rong', '䇯' => 'rong', '䈶' => 'rong', '䘬' => 'rong', '䠜' => 'rong', '䡆' => 'rong', '䡥' => 'rong', '䢇' => 'rong', '䤊' => 'rong', '䩸' => 'rong',
+ '傋' => 'jiang', '僵' => 'jiang', '勥' => 'jiang', '匞' => 'jiang', '匠' => 'jiang', '壃' => 'jiang', '夅' => 'jiang', '奖' => 'jiang', '奨' => 'jiang', '奬' => 'jiang', '姜' => 'jiang', '将' => 'jiang', '將' => 'jiang', '嵹' => 'jiang', '弜' => 'jiang', '弶' => 'jiang', '彊' => 'jiang', '摪' => 'jiang', '摾' => 'jiang', '杢' => 'jiang', '桨' => 'jiang', '槳' => 'jiang', '橿' => 'jiang', '櫤' => 'jiang', '殭' => 'jiang', '江' => 'jiang', '洚' => 'jiang', '浆' => 'jiang', '滰' => 'jiang', '漿' => 'jiang', '犟' => 'jiang', '獎' => 'jiang', '畕' => 'jiang', '畺' => 'jiang', '疅' => 'jiang', '疆' => 'jiang', '礓' => 'jiang', '糡' => 'jiang', '糨' => 'jiang', '絳' => 'jiang', '繮' => 'jiang', '绛' => 'jiang', '缰' => 'jiang', '翞' => 'jiang', '耩' => 'jiang', '膙' => 'jiang', '茳' => 'jiang', '葁' => 'jiang', '蒋' => 'jiang', '蔣' => 'jiang', '薑' => 'jiang', '螀' => 'jiang', '螿' => 'jiang', '袶' => 'jiang', '講' => 'jiang', '謽' => 'jiang', '讲' => 'jiang', '豇' => 'jiang', '酱' => 'jiang', '醤' => 'jiang', '醬' => 'jiang', '降' => 'jiang', '韁' => 'jiang', '顜' => 'jiang', '鱂' => 'jiang', '鳉' => 'jiang', '㢡' => 'jiang', '㯍' => 'jiang', '䁰' => 'jiang', '䉃' => 'jiang', '䋌' => 'jiang', '䒂' => 'jiang', '䕭' => 'jiang', '䕯' => 'jiang', '䙹' => 'jiang', '䞪' => 'jiang',
+ '傍' => 'bang', '垹' => 'bang', '塝' => 'bang', '峀' => 'bang', '帮' => 'bang', '幇' => 'bang', '幚' => 'bang', '幫' => 'bang', '徬' => 'bang', '捠' => 'bang', '梆' => 'bang', '棒' => 'bang', '棓' => 'bang', '榜' => 'bang', '浜' => 'bang', '牓' => 'bang', '玤' => 'bang', '硥' => 'bang', '磅' => 'bang', '稖' => 'bang', '綁' => 'bang', '縍' => 'bang', '绑' => 'bang', '膀' => 'bang', '艕' => 'bang', '蒡' => 'bang', '蚌' => 'bang', '蜯' => 'bang', '謗' => 'bang', '谤' => 'bang', '邦' => 'bang', '邫' => 'bang', '鎊' => 'bang', '镑' => 'bang', '鞤' => 'bang', '㔙' => 'bang', '㭋' => 'bang', '㮄' => 'bang', '㯁' => 'bang', '㾦' => 'bang', '䂜' => 'bang', '䎧' => 'bang', '䖫' => 'bang', '䟺' => 'bang', '䧛' => 'bang', '䰷' => 'bang',
+ '傐' => 'hao', '儫' => 'hao', '兞' => 'hao', '号' => 'hao', '哠' => 'hao', '嗥' => 'hao', '嘷' => 'hao', '噑' => 'hao', '嚆' => 'hao', '嚎' => 'hao', '壕' => 'hao', '好' => 'hao', '恏' => 'hao', '悎' => 'hao', '昊' => 'hao', '昦' => 'hao', '晧' => 'hao', '暤' => 'hao', '暭' => 'hao', '曍' => 'hao', '椃' => 'hao', '毫' => 'hao', '浩' => 'hao', '淏' => 'hao', '滈' => 'hao', '澔' => 'hao', '濠' => 'hao', '灏' => 'hao', '灝' => 'hao', '獆' => 'hao', '獋' => 'hao', '皓' => 'hao', '皜' => 'hao', '皞' => 'hao', '皡' => 'hao', '皥' => 'hao', '秏' => 'hao', '竓' => 'hao', '籇' => 'hao', '耗' => 'hao', '聕' => 'hao', '茠' => 'hao', '蒿' => 'hao', '薃' => 'hao', '薅' => 'hao', '薧' => 'hao', '號' => 'hao', '蚝' => 'hao', '蠔' => 'hao', '譹' => 'hao', '豪' => 'hao', '郝' => 'hao', '顥' => 'hao', '颢' => 'hao', '鰝' => 'hao', '㕺' => 'hao', '㘪' => 'hao', '㙱' => 'hao', '㚪' => 'hao', '㝀' => 'hao', '㞻' => 'hao', '㠙' => 'hao', '㩝' => 'hao', '㬔' => 'hao', '㬶' => 'hao', '㵆' => 'hao', '䒵' => 'hao', '䚽' => 'hao', '䝞' => 'hao', '䝥' => 'hao', '䧫' => 'hao', '䪽' => 'hao', '䬉' => 'hao', '䯫' => 'hao',
+ '傓' => 'shan', '僐' => 'shan', '删' => 'shan', '刪' => 'shan', '剡' => 'shan', '剼' => 'shan', '善' => 'shan', '嘇' => 'shan', '圸' => 'shan', '埏' => 'shan', '墠' => 'shan', '墡' => 'shan', '姍' => 'shan', '姗' => 'shan', '嬗' => 'shan', '山' => 'shan', '幓' => 'shan', '彡' => 'shan', '扇' => 'shan', '挻' => 'shan', '搧' => 'shan', '擅' => 'shan', '敾' => 'shan', '晱' => 'shan', '曑' => 'shan', '杉' => 'shan', '杣' => 'shan', '椫' => 'shan', '樿' => 'shan', '檆' => 'shan', '汕' => 'shan', '潸' => 'shan', '澘' => 'shan', '灗' => 'shan', '炶' => 'shan', '烻' => 'shan', '煔' => 'shan', '煽' => 'shan', '熌' => 'shan', '狦' => 'shan', '珊' => 'shan', '疝' => 'shan', '痁' => 'shan', '睒' => 'shan', '磰' => 'shan', '笘' => 'shan', '縿' => 'shan', '繕' => 'shan', '缮' => 'shan', '羴' => 'shan', '羶' => 'shan', '脠' => 'shan', '膳' => 'shan', '膻' => 'shan', '舢' => 'shan', '芟' => 'shan', '苫' => 'shan', '蔪' => 'shan', '蟮' => 'shan', '蟺' => 'shan', '衫' => 'shan', '覢' => 'shan', '訕' => 'shan', '謆' => 'shan', '譱' => 'shan', '讪' => 'shan', '贍' => 'shan', '赡' => 'shan', '赸' => 'shan', '跚' => 'shan', '軕' => 'shan', '邖' => 'shan', '鄯' => 'shan', '釤' => 'shan', '銏' => 'shan', '鐥' => 'shan', '钐' => 'shan', '閃' => 'shan', '閊' => 'shan', '闪' => 'shan', '陕' => 'shan', '陝' => 'shan', '饍' => 'shan', '騸' => 'shan', '骟' => 'shan', '鯅' => 'shan', '鱓' => 'shan', '鱔' => 'shan', '鳝' => 'shan', '㚒' => 'shan', '㣌' => 'shan', '㣣' => 'shan', '㨛' => 'shan', '㪎' => 'shan', '㪨' => 'shan', '㶒' => 'shan', '䄠' => 'shan', '䆄' => 'shan', '䚲' => 'shan', '䠾' => 'shan', '䥇' => 'shan', '䦂' => 'shan', '䦅' => 'shan', '䱇' => 'shan', '䱉' => 'shan', '䴮' => 'shan',
+ '傞' => 'suo', '唆' => 'suo', '唢' => 'suo', '嗦' => 'suo', '嗩' => 'suo', '娑' => 'suo', '惢' => 'suo', '所' => 'suo', '挲' => 'suo', '摍' => 'suo', '暛' => 'suo', '桫' => 'suo', '梭' => 'suo', '溑' => 'suo', '溹' => 'suo', '琐' => 'suo', '琑' => 'suo', '瑣' => 'suo', '睃' => 'suo', '簑' => 'suo', '簔' => 'suo', '索' => 'suo', '縮' => 'suo', '缩' => 'suo', '羧' => 'suo', '莏' => 'suo', '蓑' => 'suo', '蜶' => 'suo', '趖' => 'suo', '逤' => 'suo', '鎍' => 'suo', '鎖' => 'suo', '鎻' => 'suo', '鎼' => 'suo', '鏁' => 'suo', '锁' => 'suo', '髿' => 'suo', '鮻' => 'suo', '㪽' => 'suo', '䂹' => 'suo', '䅴' => 'suo', '䈗' => 'suo', '䐝' => 'suo', '䖛' => 'suo', '䗢' => 'suo', '䞆' => 'suo', '䞽' => 'suo', '䣔' => 'suo', '䵀' => 'suo',
+ '傤' => 'zai', '儎' => 'zai', '再' => 'zai', '哉' => 'zai', '在' => 'zai', '宰' => 'zai', '崽' => 'zai', '扗' => 'zai', '栽' => 'zai', '洅' => 'zai', '渽' => 'zai', '溨' => 'zai', '災' => 'zai', '灾' => 'zai', '烖' => 'zai', '甾' => 'zai', '睵' => 'zai', '縡' => 'zai', '菑' => 'zai', '賳' => 'zai', '載' => 'zai', '载' => 'zai', '酨' => 'zai', '㞨' => 'zai', '㱰' => 'zai', '㴓' => 'zai', '䏁' => 'zai', '䣬' => 'zai', '䮨' => 'zai', '䵧' => 'zai',
+ '傧' => 'bin', '儐' => 'bin', '宾' => 'bin', '彬' => 'bin', '摈' => 'bin', '擯' => 'bin', '斌' => 'bin', '椕' => 'bin', '槟' => 'bin', '殡' => 'bin', '殯' => 'bin', '氞' => 'bin', '汃' => 'bin', '滨' => 'bin', '濒' => 'bin', '濱' => 'bin', '濵' => 'bin', '瀕' => 'bin', '瑸' => 'bin', '璸' => 'bin', '砏' => 'bin', '繽' => 'bin', '缤' => 'bin', '膑' => 'bin', '臏' => 'bin', '虨' => 'bin', '蠙' => 'bin', '豩' => 'bin', '豳' => 'bin', '賓' => 'bin', '賔' => 'bin', '邠' => 'bin', '鑌' => 'bin', '镔' => 'bin', '霦' => 'bin', '顮' => 'bin', '髌' => 'bin', '髕' => 'bin', '髩' => 'bin', '鬂' => 'bin', '鬓' => 'bin', '鬢' => 'bin', '䐔' => 'bin',
+ '傩' => 'nuo', '儺' => 'nuo', '喏' => 'nuo', '懦' => 'nuo', '懧' => 'nuo', '挪' => 'nuo', '掿' => 'nuo', '搦' => 'nuo', '搻' => 'nuo', '桛' => 'nuo', '梛' => 'nuo', '榒' => 'nuo', '橠' => 'nuo', '燶' => 'nuo', '硸' => 'nuo', '稬' => 'nuo', '穤' => 'nuo', '糑' => 'nuo', '糥' => 'nuo', '糯' => 'nuo', '諾' => 'nuo', '诺' => 'nuo', '蹃' => 'nuo', '逽' => 'nuo', '郍' => 'nuo', '鍩' => 'nuo', '锘' => 'nuo', '黁' => 'nuo', '㐡' => 'nuo', '㑚' => 'nuo', '㔮' => 'nuo', '㛂' => 'nuo', '㡅' => 'nuo', '㰙' => 'nuo', '䚥' => 'nuo',
+ '傪' => 'can', '儏' => 'can', '参' => 'can', '參' => 'can', '叄' => 'can', '叅' => 'can', '喰' => 'can', '噆' => 'can', '嬠' => 'can', '惨' => 'can', '惭' => 'can', '慘' => 'can', '慙' => 'can', '慚' => 'can', '憯' => 'can', '朁' => 'can', '残' => 'can', '殘' => 'can', '湌' => 'can', '澯' => 'can', '灿' => 'can', '燦' => 'can', '爘' => 'can', '璨' => 'can', '穇' => 'can', '粲' => 'can', '薒' => 'can', '蚕' => 'can', '蝅' => 'can', '蠶' => 'can', '蠺' => 'can', '謲' => 'can', '飡' => 'can', '餐' => 'can', '驂' => 'can', '骖' => 'can', '黪' => 'can', '黲' => 'can', '㘔' => 'can', '㛑' => 'can', '㜗' => 'can', '㣓' => 'can', '㥇' => 'can', '㦧' => 'can', '㨻' => 'can', '㱚' => 'can', '㺑' => 'can', '㻮' => 'can', '㽩' => 'can', '㿊' => 'can', '䅟' => 'can', '䍼' => 'can', '䏼' => 'can', '䑶' => 'can', '䗝' => 'can', '䗞' => 'can', '䘉' => 'can', '䙁' => 'can', '䛹' => 'can', '䝳' => 'can', '䣟' => 'can', '䫮' => 'can', '䬫' => 'can', '䳻' => 'can',
+ '傫' => 'lei', '儡' => 'lei', '儽' => 'lei', '厽' => 'lei', '嘞' => 'lei', '垒' => 'lei', '塁' => 'lei', '壘' => 'lei', '壨' => 'lei', '嫘' => 'lei', '擂' => 'lei', '攂' => 'lei', '樏' => 'lei', '檑' => 'lei', '櫐' => 'lei', '櫑' => 'lei', '欙' => 'lei', '泪' => 'lei', '洡' => 'lei', '涙' => 'lei', '淚' => 'lei', '灅' => 'lei', '瓃' => 'lei', '畾' => 'lei', '癗' => 'lei', '矋' => 'lei', '磊' => 'lei', '磥' => 'lei', '礌' => 'lei', '礧' => 'lei', '礨' => 'lei', '禷' => 'lei', '类' => 'lei', '累' => 'lei', '絫' => 'lei', '縲' => 'lei', '纇' => 'lei', '纍' => 'lei', '纝' => 'lei', '缧' => 'lei', '罍' => 'lei', '羸' => 'lei', '耒' => 'lei', '肋' => 'lei', '脷' => 'lei', '蔂' => 'lei', '蕌' => 'lei', '蕾' => 'lei', '藟' => 'lei', '蘱' => 'lei', '蘲' => 'lei', '蘽' => 'lei', '虆' => 'lei', '蠝' => 'lei', '誄' => 'lei', '讄' => 'lei', '诔' => 'lei', '轠' => 'lei', '酹' => 'lei', '銇' => 'lei', '錑' => 'lei', '鐳' => 'lei', '鑘' => 'lei', '鑸' => 'lei', '镭' => 'lei', '雷' => 'lei', '靁' => 'lei', '頛' => 'lei', '頪' => 'lei', '類' => 'lei', '颣' => 'lei', '鱩' => 'lei', '鸓' => 'lei', '鼺' => 'lei', '㑍' => 'lei', '㒍' => 'lei', '㒦' => 'lei', '㔣' => 'lei', '㙼' => 'lei', '㡞' => 'lei', '㭩' => 'lei', '㲕' => 'lei', '㴃' => 'lei', '㵢' => 'lei', '㶟' => 'lei', '㹎' => 'lei', '㼍' => 'lei', '㿔' => 'lei', '䉂' => 'lei', '䉓' => 'lei', '䉪' => 'lei', '䍣' => 'lei', '䍥' => 'lei', '䐯' => 'lei', '䒹' => 'lei', '䛶' => 'lei', '䢮' => 'lei', '䣂' => 'lei', '䣦' => 'lei', '䨓' => 'lei', '䮑' => 'lei', '䴎' => 'lei',
+ '傮' => 'zao', '凿' => 'zao', '唕' => 'zao', '唣' => 'zao', '喿' => 'zao', '噪' => 'zao', '慥' => 'zao', '早' => 'zao', '枣' => 'zao', '栆' => 'zao', '梍' => 'zao', '棗' => 'zao', '澡' => 'zao', '灶' => 'zao', '煰' => 'zao', '燥' => 'zao', '璅' => 'zao', '璪' => 'zao', '皁' => 'zao', '皂' => 'zao', '竃' => 'zao', '竈' => 'zao', '簉' => 'zao', '糟' => 'zao', '艁' => 'zao', '薻' => 'zao', '藻' => 'zao', '蚤' => 'zao', '譟' => 'zao', '趮' => 'zao', '蹧' => 'zao', '躁' => 'zao', '造' => 'zao', '遭' => 'zao', '醩' => 'zao', '鑿' => 'zao', '㲧' => 'zao', '㿷' => 'zao', '䜊' => 'zao', '䥣' => 'zao', '䲃' => 'zao',
+ '傲' => 'ao', '凹' => 'ao', '厫' => 'ao', '嗷' => 'ao', '嗸' => 'ao', '坳' => 'ao', '垇' => 'ao', '墺' => 'ao', '奡' => 'ao', '奥' => 'ao', '奧' => 'ao', '媪' => 'ao', '媼' => 'ao', '嫯' => 'ao', '岙' => 'ao', '岰' => 'ao', '嶅' => 'ao', '嶴' => 'ao', '廒' => 'ao', '慠' => 'ao', '懊' => 'ao', '扷' => 'ao', '抝' => 'ao', '拗' => 'ao', '摮' => 'ao', '擙' => 'ao', '敖' => 'ao', '柪' => 'ao', '滶' => 'ao', '澚' => 'ao', '澳' => 'ao', '熬' => 'ao', '爊' => 'ao', '獒' => 'ao', '獓' => 'ao', '璈' => 'ao', '磝' => 'ao', '翱' => 'ao', '翶' => 'ao', '翺' => 'ao', '聱' => 'ao', '芺' => 'ao', '蔜' => 'ao', '螯' => 'ao', '袄' => 'ao', '襖' => 'ao', '謷' => 'ao', '謸' => 'ao', '軪' => 'ao', '遨' => 'ao', '鏊' => 'ao', '鏖' => 'ao', '镺' => 'ao', '隞' => 'ao', '驁' => 'ao', '骜' => 'ao', '鰲' => 'ao', '鳌' => 'ao', '鷔' => 'ao', '鼇' => 'ao', '㑃' => 'ao', '㕭' => 'ao', '㘬' => 'ao', '㘭' => 'ao', '㜜' => 'ao', '㜩' => 'ao', '㟼' => 'ao', '㠂' => 'ao', '㠗' => 'ao', '㤇' => 'ao', '㥿' => 'ao', '㿰' => 'ao', '䁱' => 'ao', '䐿' => 'ao', '䚫' => 'ao', '䜒' => 'ao', '䞝' => 'ao', '䥝' => 'ao', '䦋' => 'ao', '䫨' => 'ao', '䮯' => 'ao', '䯠' => 'ao', '䴈' => 'ao', '䵅' => 'ao',
+ '傸' => 'chuang', '刅' => 'chuang', '创' => 'chuang', '刱' => 'chuang', '剏' => 'chuang', '剙' => 'chuang', '創' => 'chuang', '噇' => 'chuang', '幢' => 'chuang', '床' => 'chuang', '怆' => 'chuang', '愴' => 'chuang', '摐' => 'chuang', '漺' => 'chuang', '牀' => 'chuang', '牎' => 'chuang', '牕' => 'chuang', '疮' => 'chuang', '瘡' => 'chuang', '磢' => 'chuang', '窓' => 'chuang', '窗' => 'chuang', '窻' => 'chuang', '闖' => 'chuang', '闯' => 'chuang', '㡖' => 'chuang', '㵂' => 'chuang', '䃥' => 'chuang', '䆫' => 'chuang', '䇬' => 'chuang', '䎫' => 'chuang', '䚒' => 'chuang', '䡴' => 'chuang', '䭚' => 'chuang',
+ '僄' => 'piao', '剽' => 'piao', '勡' => 'piao', '嘌' => 'piao', '嫖' => 'piao', '彯' => 'piao', '徱' => 'piao', '慓' => 'piao', '旚' => 'piao', '殍' => 'piao', '漂' => 'piao', '犥' => 'piao', '瓢' => 'piao', '皫' => 'piao', '瞟' => 'piao', '磦' => 'piao', '票' => 'piao', '篻' => 'piao', '縹' => 'piao', '缥' => 'piao', '翲' => 'piao', '薸' => 'piao', '螵' => 'piao', '醥' => 'piao', '闝' => 'piao', '顠' => 'piao', '飃' => 'piao', '飄' => 'piao', '飘' => 'piao', '魒' => 'piao', '㩠' => 'piao', '㬓' => 'piao', '㵱' => 'piao', '㹾' => 'piao', '㺓' => 'piao', '㼼' => 'piao', '䏇' => 'piao', '䴩' => 'piao',
+ '僈' => 'man', '墁' => 'man', '姏' => 'man', '嫚' => 'man', '屘' => 'man', '幔' => 'man', '悗' => 'man', '慢' => 'man', '慲' => 'man', '摱' => 'man', '曼' => 'man', '槾' => 'man', '樠' => 'man', '満' => 'man', '满' => 'man', '滿' => 'man', '漫' => 'man', '澫' => 'man', '澷' => 'man', '熳' => 'man', '獌' => 'man', '睌' => 'man', '瞒' => 'man', '瞞' => 'man', '矕' => 'man', '縵' => 'man', '缦' => 'man', '蔄' => 'man', '蔓' => 'man', '蘰' => 'man', '蛮' => 'man', '螨' => 'man', '蟃' => 'man', '蟎' => 'man', '蠻' => 'man', '襔' => 'man', '謾' => 'man', '谩' => 'man', '鄤' => 'man', '鏋' => 'man', '鏝' => 'man', '镘' => 'man', '鞔' => 'man', '顢' => 'man', '颟' => 'man', '饅' => 'man', '馒' => 'man', '鬗' => 'man', '鬘' => 'man', '鰻' => 'man', '鳗' => 'man', '㒼' => 'man', '㗄' => 'man', '㗈' => 'man', '㙢' => 'man', '㛧' => 'man', '㡢' => 'man', '㬅' => 'man', '㵘' => 'man', '䅼' => 'man', '䊡' => 'man', '䐽' => 'man', '䑱' => 'man', '䕕' => 'man', '䛲' => 'man', '䜱' => 'man', '䝡' => 'man', '䝢' => 'man', '䟂' => 'man', '䡬' => 'man', '䯶' => 'man', '䰋' => 'man',
+ '僔' => 'zun', '噂' => 'zun', '尊' => 'zun', '嶟' => 'zun', '捘' => 'zun', '撙' => 'zun', '樽' => 'zun', '繜' => 'zun', '罇' => 'zun', '譐' => 'zun', '遵' => 'zun', '銌' => 'zun', '鐏' => 'zun', '鱒' => 'zun', '鳟' => 'zun', '鶎' => 'zun', '鷷' => 'zun',
+ '僜' => 'deng', '凳' => 'deng', '噔' => 'deng', '墱' => 'deng', '嬁' => 'deng', '嶝' => 'deng', '戥' => 'deng', '櫈' => 'deng', '灯' => 'deng', '燈' => 'deng', '璒' => 'deng', '登' => 'deng', '瞪' => 'deng', '磴' => 'deng', '竳' => 'deng', '等' => 'deng', '簦' => 'deng', '艠' => 'deng', '覴' => 'deng', '豋' => 'deng', '蹬' => 'deng', '邓' => 'deng', '鄧' => 'deng', '鐙' => 'deng', '镫' => 'deng', '隥' => 'deng', '䃶' => 'deng', '䒭' => 'deng', '䠬' => 'deng', '䮴' => 'deng',
+ '僣' => 'tie', '呫' => 'tie', '帖' => 'tie', '怗' => 'tie', '聑' => 'tie', '萜' => 'tie', '蛈' => 'tie', '貼' => 'tie', '贴' => 'tie', '跕' => 'tie', '鉄' => 'tie', '銕' => 'tie', '鐡' => 'tie', '鐢' => 'tie', '鐵' => 'tie', '铁' => 'tie', '飻' => 'tie', '餮' => 'tie', '驖' => 'tie', '鴩' => 'tie', '䥫' => 'tie', '䴴' => 'tie', '䵿' => 'tie',
+ '僧' => 'seng',
+ '僶' => 'min', '冧' => 'min', '冺' => 'min', '刡' => 'min', '勄' => 'min', '垊' => 'min', '姄' => 'min', '岷' => 'min', '崏' => 'min', '忞' => 'min', '怋' => 'min', '悯' => 'min', '愍' => 'min', '慜' => 'min', '憫' => 'min', '抿' => 'min', '捪' => 'min', '敃' => 'min', '敏' => 'min', '敯' => 'min', '旻' => 'min', '旼' => 'min', '暋' => 'min', '民' => 'min', '泯' => 'min', '湣' => 'min', '潣' => 'min', '玟' => 'min', '珉' => 'min', '琘' => 'min', '琝' => 'min', '瑉' => 'min', '痻' => 'min', '皿' => 'min', '盿' => 'min', '碈' => 'min', '笢' => 'min', '笽' => 'min', '簢' => 'min', '緍' => 'min', '緡' => 'min', '缗' => 'min', '罠' => 'min', '苠' => 'min', '蠠' => 'min', '賯' => 'min', '鈱' => 'min', '錉' => 'min', '鍲' => 'min', '閔' => 'min', '閩' => 'min', '闵' => 'min', '闽' => 'min', '鰵' => 'min', '鳘' => 'min', '鴖' => 'min', '黽' => 'min', '㞶' => 'min', '㟩' => 'min', '㟭' => 'min', '㢯' => 'min', '㥸' => 'min', '㨉' => 'min', '䁕' => 'min', '䂥' => 'min', '䃉' => 'min', '䋋' => 'min', '䟨' => 'min', '䡅' => 'min', '䡑' => 'min', '䡻' => 'min', '䪸' => 'min', '䲄' => 'min',
+ '僿' => 'sai', '嗮' => 'sai', '嘥' => 'sai', '噻' => 'sai', '塞' => 'sai', '愢' => 'sai', '揌' => 'sai', '毢' => 'sai', '毸' => 'sai', '簺' => 'sai', '腮' => 'sai', '虄' => 'sai', '賽' => 'sai', '赛' => 'sai', '顋' => 'sai', '鰓' => 'sai', '鳃' => 'sai', '㗷' => 'sai', '䈢' => 'sai',
+ '儅' => 'dang', '党' => 'dang', '凼' => 'dang', '噹' => 'dang', '圵' => 'dang', '垱' => 'dang', '壋' => 'dang', '婸' => 'dang', '宕' => 'dang', '当' => 'dang', '挡' => 'dang', '擋' => 'dang', '攩' => 'dang', '档' => 'dang', '檔' => 'dang', '欓' => 'dang', '氹' => 'dang', '潒' => 'dang', '澢' => 'dang', '灙' => 'dang', '珰' => 'dang', '璗' => 'dang', '璫' => 'dang', '瓽' => 'dang', '當' => 'dang', '盪' => 'dang', '瞊' => 'dang', '砀' => 'dang', '碭' => 'dang', '礑' => 'dang', '筜' => 'dang', '簜' => 'dang', '簹' => 'dang', '艡' => 'dang', '荡' => 'dang', '菪' => 'dang', '蕩' => 'dang', '蘯' => 'dang', '蟷' => 'dang', '裆' => 'dang', '襠' => 'dang', '譡' => 'dang', '讜' => 'dang', '谠' => 'dang', '趤' => 'dang', '逿' => 'dang', '闣' => 'dang', '雼' => 'dang', '黨' => 'dang', '䑗' => 'dang', '䣊' => 'dang', '䣣' => 'dang', '䦒' => 'dang',
+ '儇' => 'xuan', '吅' => 'xuan', '咺' => 'xuan', '喧' => 'xuan', '塇' => 'xuan', '媗' => 'xuan', '嫙' => 'xuan', '嬛' => 'xuan', '宣' => 'xuan', '怰' => 'xuan', '悬' => 'xuan', '愃' => 'xuan', '愋' => 'xuan', '懸' => 'xuan', '揎' => 'xuan', '旋' => 'xuan', '昍' => 'xuan', '昡' => 'xuan', '晅' => 'xuan', '暄' => 'xuan', '暅' => 'xuan', '暶' => 'xuan', '梋' => 'xuan', '楥' => 'xuan', '楦' => 'xuan', '檈' => 'xuan', '泫' => 'xuan', '渲' => 'xuan', '漩' => 'xuan', '炫' => 'xuan', '烜' => 'xuan', '煊' => 'xuan', '玄' => 'xuan', '玹' => 'xuan', '琁' => 'xuan', '琄' => 'xuan', '瑄' => 'xuan', '璇' => 'xuan', '璿' => 'xuan', '痃' => 'xuan', '癣' => 'xuan', '癬' => 'xuan', '眩' => 'xuan', '眴' => 'xuan', '睻' => 'xuan', '矎' => 'xuan', '碹' => 'xuan', '禤' => 'xuan', '箮' => 'xuan', '絢' => 'xuan', '縼' => 'xuan', '繏' => 'xuan', '绚' => 'xuan', '翧' => 'xuan', '翾' => 'xuan', '萱' => 'xuan', '萲' => 'xuan', '蓒' => 'xuan', '蔙' => 'xuan', '蕿' => 'xuan', '藼' => 'xuan', '蘐' => 'xuan', '蜁' => 'xuan', '蝖' => 'xuan', '蠉' => 'xuan', '衒' => 'xuan', '袨' => 'xuan', '諠' => 'xuan', '諼' => 'xuan', '譞' => 'xuan', '讂' => 'xuan', '谖' => 'xuan', '贙' => 'xuan', '軒' => 'xuan', '轩' => 'xuan', '选' => 'xuan', '選' => 'xuan', '鉉' => 'xuan', '鍹' => 'xuan', '鏇' => 'xuan', '铉' => 'xuan', '镟' => 'xuan', '鞙' => 'xuan', '颴' => 'xuan', '駽' => 'xuan', '鰚' => 'xuan', '㘣' => 'xuan', '㧦' => 'xuan', '㳙' => 'xuan', '㳬' => 'xuan', '㹡' => 'xuan', '㾌' => 'xuan', '䁢' => 'xuan', '䍗' => 'xuan', '䍻' => 'xuan', '䗠' => 'xuan', '䘩' => 'xuan', '䝮' => 'xuan', '䠣' => 'xuan', '䧎' => 'xuan', '䩙' => 'xuan', '䩰' => 'xuan', '䮄' => 'xuan', '䲂' => 'xuan', '䲻' => 'xuan', '䴉' => 'xuan', '䴋' => 'xuan',
+ '儓' => 'tai', '冭' => 'tai', '台' => 'tai', '囼' => 'tai', '坮' => 'tai', '太' => 'tai', '夳' => 'tai', '嬯' => 'tai', '孡' => 'tai', '忲' => 'tai', '态' => 'tai', '態' => 'tai', '抬' => 'tai', '擡' => 'tai', '旲' => 'tai', '檯' => 'tai', '汰' => 'tai', '泰' => 'tai', '溙' => 'tai', '炱' => 'tai', '炲' => 'tai', '燤' => 'tai', '珆' => 'tai', '箈' => 'tai', '籉' => 'tai', '粏' => 'tai', '肽' => 'tai', '胎' => 'tai', '臺' => 'tai', '舦' => 'tai', '苔' => 'tai', '菭' => 'tai', '薹' => 'tai', '跆' => 'tai', '邰' => 'tai', '酞' => 'tai', '鈦' => 'tai', '钛' => 'tai', '颱' => 'tai', '駘' => 'tai', '骀' => 'tai', '鮐' => 'tai', '鲐' => 'tai', '㑷' => 'tai', '㒗' => 'tai', '㘆' => 'tai', '㙵' => 'tai', '㣍' => 'tai', '㥭' => 'tai', '㬃' => 'tai', '㷘' => 'tai', '㸀' => 'tai', '䈚' => 'tai', '䑓' => 'tai', '䢰' => 'tai', '䣭' => 'tai',
+ '儖' => 'lan', '兰' => 'lan', '厱' => 'lan', '嚂' => 'lan', '囒' => 'lan', '壈' => 'lan', '壏' => 'lan', '婪' => 'lan', '嬾' => 'lan', '孄' => 'lan', '孏' => 'lan', '岚' => 'lan', '嵐' => 'lan', '幱' => 'lan', '懒' => 'lan', '懢' => 'lan', '懶' => 'lan', '拦' => 'lan', '揽' => 'lan', '擥' => 'lan', '攔' => 'lan', '攬' => 'lan', '斓' => 'lan', '斕' => 'lan', '栏' => 'lan', '榄' => 'lan', '欄' => 'lan', '欖' => 'lan', '欗' => 'lan', '浨' => 'lan', '滥' => 'lan', '漤' => 'lan', '澜' => 'lan', '濫' => 'lan', '瀾' => 'lan', '灆' => 'lan', '灠' => 'lan', '灡' => 'lan', '烂' => 'lan', '燗' => 'lan', '燣' => 'lan', '爁' => 'lan', '爛' => 'lan', '爤' => 'lan', '爦' => 'lan', '璼' => 'lan', '瓓' => 'lan', '礷' => 'lan', '篮' => 'lan', '籃' => 'lan', '籣' => 'lan', '糷' => 'lan', '繿' => 'lan', '纜' => 'lan', '缆' => 'lan', '罱' => 'lan', '葻' => 'lan', '蓝' => 'lan', '蓞' => 'lan', '藍' => 'lan', '蘭' => 'lan', '褴' => 'lan', '襕' => 'lan', '襤' => 'lan', '襴' => 'lan', '襽' => 'lan', '覧' => 'lan', '覽' => 'lan', '览' => 'lan', '譋' => 'lan', '讕' => 'lan', '谰' => 'lan', '躝' => 'lan', '醂' => 'lan', '鑭' => 'lan', '钄' => 'lan', '镧' => 'lan', '闌' => 'lan', '阑' => 'lan', '韊' => 'lan', '㑣' => 'lan', '㘓' => 'lan', '㛦' => 'lan', '㜮' => 'lan', '㞩' => 'lan', '㦨' => 'lan', '㨫' => 'lan', '㩜' => 'lan', '㰖' => 'lan', '㱫' => 'lan', '㳕' => 'lan', '䃹' => 'lan', '䆾' => 'lan', '䊖' => 'lan', '䌫' => 'lan', '䍀' => 'lan', '䑌' => 'lan', '䦨' => 'lan', '䪍' => 'lan', '䰐' => 'lan', '䳿' => 'lan',
+ '儚' => 'meng', '冡' => 'meng', '勐' => 'meng', '夢' => 'meng', '夣' => 'meng', '孟' => 'meng', '幪' => 'meng', '庬' => 'meng', '懜' => 'meng', '懞' => 'meng', '懵' => 'meng', '掹' => 'meng', '擝' => 'meng', '曚' => 'meng', '朦' => 'meng', '梦' => 'meng', '橗' => 'meng', '檬' => 'meng', '氋' => 'meng', '溕' => 'meng', '濛' => 'meng', '猛' => 'meng', '獴' => 'meng', '瓾' => 'meng', '甍' => 'meng', '甿' => 'meng', '盟' => 'meng', '瞢' => 'meng', '矇' => 'meng', '矒' => 'meng', '礞' => 'meng', '罞' => 'meng', '艋' => 'meng', '艨' => 'meng', '莔' => 'meng', '萌' => 'meng', '萠' => 'meng', '蒙' => 'meng', '蕄' => 'meng', '虻' => 'meng', '蜢' => 'meng', '蝱' => 'meng', '蠓' => 'meng', '鄳' => 'meng', '鄸' => 'meng', '錳' => 'meng', '锰' => 'meng', '雺' => 'meng', '霥' => 'meng', '霿' => 'meng', '靀' => 'meng', '顭' => 'meng', '饛' => 'meng', '鯍' => 'meng', '鯭' => 'meng', '鸏' => 'meng', '鹲' => 'meng', '鼆' => 'meng', '㙹' => 'meng', '㚞' => 'meng', '㜴' => 'meng', '㝱' => 'meng', '㠓' => 'meng', '㩚' => 'meng', '䀄' => 'meng', '䇇' => 'meng', '䉚' => 'meng', '䏵' => 'meng', '䑃' => 'meng', '䑅' => 'meng', '䒐' => 'meng', '䓝' => 'meng', '䗈' => 'meng', '䙦' => 'meng', '䙩' => 'meng', '䠢' => 'meng', '䤓' => 'meng', '䥂' => 'meng', '䥰' => 'meng', '䰒' => 'meng', '䲛' => 'meng', '䴌' => 'meng', '䴿' => 'meng', '䵆' => 'meng',
+ '儝' => 'qiong', '卭' => 'qiong', '宆' => 'qiong', '惸' => 'qiong', '憌' => 'qiong', '桏' => 'qiong', '橩' => 'qiong', '焪' => 'qiong', '焭' => 'qiong', '煢' => 'qiong', '熍' => 'qiong', '琼' => 'qiong', '璚' => 'qiong', '瓊' => 'qiong', '瓗' => 'qiong', '睘' => 'qiong', '瞏' => 'qiong', '穷' => 'qiong', '穹' => 'qiong', '窮' => 'qiong', '竆' => 'qiong', '笻' => 'qiong', '筇' => 'qiong', '舼' => 'qiong', '茕' => 'qiong', '藑' => 'qiong', '藭' => 'qiong', '蛩' => 'qiong', '蛬' => 'qiong', '赹' => 'qiong', '跫' => 'qiong', '邛' => 'qiong', '銎' => 'qiong', '㒌' => 'qiong', '㧭' => 'qiong', '㮪' => 'qiong', '㷀' => 'qiong', '㼇' => 'qiong', '䅃' => 'qiong', '䆳' => 'qiong', '䊄' => 'qiong', '䓖' => 'qiong', '䛪' => 'qiong', '䠻' => 'qiong',
+ '儠' => 'lie', '冽' => 'lie', '列' => 'lie', '劣' => 'lie', '劽' => 'lie', '咧' => 'lie', '埒' => 'lie', '埓' => 'lie', '姴' => 'lie', '峢' => 'lie', '巤' => 'lie', '挒' => 'lie', '挘' => 'lie', '捩' => 'lie', '擸' => 'lie', '毟' => 'lie', '洌' => 'lie', '浖' => 'lie', '烈' => 'lie', '烮' => 'lie', '煭' => 'lie', '犣' => 'lie', '猎' => 'lie', '猟' => 'lie', '獵' => 'lie', '睙' => 'lie', '聗' => 'lie', '脟' => 'lie', '茢' => 'lie', '蛚' => 'lie', '裂' => 'lie', '趔' => 'lie', '躐' => 'lie', '迾' => 'lie', '颲' => 'lie', '鬛' => 'lie', '鬣' => 'lie', '鮤' => 'lie', '鱲' => 'lie', '鴷' => 'lie', '㤠' => 'lie', '㧜' => 'lie', '㬯' => 'lie', '㭞' => 'lie', '㯿' => 'lie', '㲱' => 'lie', '㸹' => 'lie', '㼲' => 'lie', '㽟' => 'lie', '䁽' => 'lie', '䅀' => 'lie', '䉭' => 'lie', '䓟' => 'lie', '䜲' => 'lie', '䟩' => 'lie', '䟹' => 'lie', '䢪' => 'lie', '䴕' => 'lie',
+ '儣' => 'kuang', '况' => 'kuang', '劻' => 'kuang', '匡' => 'kuang', '匩' => 'kuang', '哐' => 'kuang', '圹' => 'kuang', '壙' => 'kuang', '夼' => 'kuang', '岲' => 'kuang', '恇' => 'kuang', '懬' => 'kuang', '懭' => 'kuang', '抂' => 'kuang', '旷' => 'kuang', '昿' => 'kuang', '曠' => 'kuang', '框' => 'kuang', '況' => 'kuang', '洭' => 'kuang', '爌' => 'kuang', '狂' => 'kuang', '狅' => 'kuang', '眖' => 'kuang', '眶' => 'kuang', '矌' => 'kuang', '矿' => 'kuang', '砿' => 'kuang', '礦' => 'kuang', '穬' => 'kuang', '筐' => 'kuang', '筺' => 'kuang', '絋' => 'kuang', '絖' => 'kuang', '纊' => 'kuang', '纩' => 'kuang', '誆' => 'kuang', '誑' => 'kuang', '诓' => 'kuang', '诳' => 'kuang', '貺' => 'kuang', '贶' => 'kuang', '軖' => 'kuang', '軠' => 'kuang', '軦' => 'kuang', '軭' => 'kuang', '邝' => 'kuang', '邼' => 'kuang', '鄺' => 'kuang', '鉱' => 'kuang', '鋛' => 'kuang', '鑛' => 'kuang', '鵟' => 'kuang', '黋' => 'kuang', '㤮' => 'kuang', '䊯' => 'kuang', '䵃' => 'kuang',
+ '儭' => 'chen', '嗔' => 'chen', '嚫' => 'chen', '塵' => 'chen', '墋' => 'chen', '夦' => 'chen', '宸' => 'chen', '尘' => 'chen', '忱' => 'chen', '愖' => 'chen', '抻' => 'chen', '揨' => 'chen', '敐' => 'chen', '晨' => 'chen', '曟' => 'chen', '棽' => 'chen', '榇' => 'chen', '樄' => 'chen', '櫬' => 'chen', '沉' => 'chen', '烥' => 'chen', '煁' => 'chen', '琛' => 'chen', '疢' => 'chen', '瘎' => 'chen', '瞋' => 'chen', '硶' => 'chen', '碜' => 'chen', '磣' => 'chen', '稱' => 'chen', '綝' => 'chen', '臣' => 'chen', '茞' => 'chen', '莀' => 'chen', '莐' => 'chen', '蔯' => 'chen', '薼' => 'chen', '螴' => 'chen', '衬' => 'chen', '襯' => 'chen', '訦' => 'chen', '諃' => 'chen', '諶' => 'chen', '謓' => 'chen', '讖' => 'chen', '谌' => 'chen', '谶' => 'chen', '賝' => 'chen', '贂' => 'chen', '趁' => 'chen', '趂' => 'chen', '趻' => 'chen', '踸' => 'chen', '軙' => 'chen', '辰' => 'chen', '迧' => 'chen', '郴' => 'chen', '鈂' => 'chen', '陈' => 'chen', '陳' => 'chen', '霃' => 'chen', '鷐' => 'chen', '麎' => 'chen', '齓' => 'chen', '齔' => 'chen', '龀' => 'chen', '㕴' => 'chen', '㧱' => 'chen', '㫳' => 'chen', '㲀' => 'chen', '㴴' => 'chen', '㽸' => 'chen', '䆣' => 'chen', '䒞' => 'chen', '䚘' => 'chen', '䜟' => 'chen', '䞋' => 'chen', '䟢' => 'chen', '䢅' => 'chen', '䢈' => 'chen', '䢻' => 'chen', '䣅' => 'chen', '䤟' => 'chen', '䫖' => 'chen',
+ '儯' => 'teng', '唞' => 'teng', '幐' => 'teng', '朰' => 'teng', '滕' => 'teng', '漛' => 'teng', '疼' => 'teng', '痋' => 'teng', '籐' => 'teng', '籘' => 'teng', '縢' => 'teng', '腾' => 'teng', '膯' => 'teng', '藤' => 'teng', '虅' => 'teng', '螣' => 'teng', '誊' => 'teng', '謄' => 'teng', '邆' => 'teng', '霯' => 'teng', '駦' => 'teng', '騰' => 'teng', '驣' => 'teng', '鰧' => 'teng', '鼟' => 'teng', '䒅' => 'teng', '䕨' => 'teng', '䠮' => 'teng', '䲍' => 'teng', '䲢' => 'teng',
+ '儱' => 'long', '咙' => 'long', '哢' => 'long', '嚨' => 'long', '垄' => 'long', '垅' => 'long', '壟' => 'long', '壠' => 'long', '屸' => 'long', '嶐' => 'long', '巃' => 'long', '巄' => 'long', '徿' => 'long', '拢' => 'long', '攏' => 'long', '昽' => 'long', '曨' => 'long', '朧' => 'long', '栊' => 'long', '梇' => 'long', '槞' => 'long', '櫳' => 'long', '泷' => 'long', '湰' => 'long', '漋' => 'long', '瀧' => 'long', '爖' => 'long', '珑' => 'long', '瓏' => 'long', '癃' => 'long', '眬' => 'long', '矓' => 'long', '砻' => 'long', '硦' => 'long', '礱' => 'long', '礲' => 'long', '窿' => 'long', '竉' => 'long', '竜' => 'long', '笼' => 'long', '篭' => 'long', '籠' => 'long', '聋' => 'long', '聾' => 'long', '胧' => 'long', '茏' => 'long', '蕯' => 'long', '蘢' => 'long', '蠪' => 'long', '蠬' => 'long', '衖' => 'long', '襱' => 'long', '豅' => 'long', '贚' => 'long', '躘' => 'long', '鏧' => 'long', '鑨' => 'long', '陇' => 'long', '隆' => 'long', '隴' => 'long', '霳' => 'long', '靇' => 'long', '驡' => 'long', '鸗' => 'long', '龍' => 'long', '龒' => 'long', '龓' => 'long', '龙' => 'long', '㑝' => 'long', '㙙' => 'long', '㚅' => 'long', '㛞' => 'long', '㝫' => 'long', '㟖' => 'long', '㡣' => 'long', '㢅' => 'long', '㦕' => 'long', '㰍' => 'long', '㴳' => 'long', '䃧' => 'long', '䏊' => 'long', '䙪' => 'long', '䡁' => 'long', '䥢' => 'long', '䪊' => 'long',
+ '儴' => 'rang', '勷' => 'rang', '嚷' => 'rang', '壌' => 'rang', '壤' => 'rang', '懹' => 'rang', '攘' => 'rang', '瀼' => 'rang', '爙' => 'rang', '獽' => 'rang', '瓤' => 'rang', '禳' => 'rang', '穣' => 'rang', '穰' => 'rang', '纕' => 'rang', '蘘' => 'rang', '譲' => 'rang', '讓' => 'rang', '让' => 'rang', '躟' => 'rang', '鬤' => 'rang', '㚂' => 'rang', '䉴' => 'rang',
+ '兄' => 'xiong', '兇' => 'xiong', '凶' => 'xiong', '匈' => 'xiong', '哅' => 'xiong', '夐' => 'xiong', '忷' => 'xiong', '恟' => 'xiong', '敻' => 'xiong', '汹' => 'xiong', '洶' => 'xiong', '熊' => 'xiong', '胷' => 'xiong', '胸' => 'xiong', '芎' => 'xiong', '訩' => 'xiong', '詗' => 'xiong', '詾' => 'xiong', '讻' => 'xiong', '诇' => 'xiong', '雄' => 'xiong', '㐫' => 'xiong', '䧺' => 'xiong',
+ '充' => 'chong', '冲' => 'chong', '嘃' => 'chong', '埫' => 'chong', '宠' => 'chong', '寵' => 'chong', '崇' => 'chong', '崈' => 'chong', '徸' => 'chong', '忡' => 'chong', '憃' => 'chong', '憧' => 'chong', '揰' => 'chong', '摏' => 'chong', '沖' => 'chong', '浺' => 'chong', '漴' => 'chong', '爞' => 'chong', '珫' => 'chong', '緟' => 'chong', '罿' => 'chong', '翀' => 'chong', '舂' => 'chong', '艟' => 'chong', '茺' => 'chong', '虫' => 'chong', '蝩' => 'chong', '蟲' => 'chong', '衝' => 'chong', '褈' => 'chong', '蹖' => 'chong', '銃' => 'chong', '铳' => 'chong', '隀' => 'chong', '㓽' => 'chong', '㧤' => 'chong', '㹐' => 'chong', '䌬' => 'chong', '䖝' => 'chong', '䳯' => 'chong',
+ '兊' => 'dui', '兌' => 'dui', '兑' => 'dui', '叾' => 'dui', '垖' => 'dui', '堆' => 'dui', '塠' => 'dui', '对' => 'dui', '対' => 'dui', '對' => 'dui', '嵟' => 'dui', '怼' => 'dui', '憝' => 'dui', '懟' => 'dui', '濧' => 'dui', '瀩' => 'dui', '痽' => 'dui', '碓' => 'dui', '磓' => 'dui', '祋' => 'dui', '綐' => 'dui', '薱' => 'dui', '譈' => 'dui', '譵' => 'dui', '鐓' => 'dui', '鐜' => 'dui', '镦' => 'dui', '队' => 'dui', '陮' => 'dui', '隊' => 'dui', '頧' => 'dui', '鴭' => 'dui', '㙂' => 'dui', '㟋' => 'dui', '㠚' => 'dui', '㬣' => 'dui', '㳔' => 'dui', '㵽' => 'dui', '䇏' => 'dui', '䇤' => 'dui', '䔪' => 'dui', '䨴' => 'dui', '䨺' => 'dui', '䬈' => 'dui', '䬽' => 'dui', '䯟' => 'dui',
+ '克' => 'ke', '刻' => 'ke', '剋' => 'ke', '勀' => 'ke', '勊' => 'ke', '匼' => 'ke', '可' => 'ke', '咳' => 'ke', '嗑' => 'ke', '坷' => 'ke', '堁' => 'ke', '壳' => 'ke', '娔' => 'ke', '客' => 'ke', '尅' => 'ke', '岢' => 'ke', '峇' => 'ke', '嵑' => 'ke', '嵙' => 'ke', '嶱' => 'ke', '恪' => 'ke', '愙' => 'ke', '揢' => 'ke', '搕' => 'ke', '敤' => 'ke', '柯' => 'ke', '棵' => 'ke', '榼' => 'ke', '樖' => 'ke', '殻' => 'ke', '氪' => 'ke', '渇' => 'ke', '渴' => 'ke', '溘' => 'ke', '炣' => 'ke', '牁' => 'ke', '犐' => 'ke', '珂' => 'ke', '疴' => 'ke', '痾' => 'ke', '瞌' => 'ke', '碦' => 'ke', '磕' => 'ke', '礊' => 'ke', '礚' => 'ke', '科' => 'ke', '稞' => 'ke', '窠' => 'ke', '緙' => 'ke', '缂' => 'ke', '翗' => 'ke', '胢' => 'ke', '苛' => 'ke', '萪' => 'ke', '薖' => 'ke', '蝌' => 'ke', '課' => 'ke', '课' => 'ke', '趷' => 'ke', '軻' => 'ke', '轲' => 'ke', '醘' => 'ke', '鈳' => 'ke', '錁' => 'ke', '钶' => 'ke', '锞' => 'ke', '頦' => 'ke', '顆' => 'ke', '颏' => 'ke', '颗' => 'ke', '騍' => 'ke', '骒' => 'ke', '髁' => 'ke', '㕉' => 'ke', '㞹' => 'ke', '㤩' => 'ke', '㪃' => 'ke', '㪙' => 'ke', '㪡' => 'ke', '㪼' => 'ke', '㰤' => 'ke', '㵣' => 'ke', '㾧' => 'ke', '䙐' => 'ke', '䶗' => 'ke',
+ '兎' => 'tu', '兔' => 'tu', '凃' => 'tu', '凸' => 'tu', '吐' => 'tu', '唋' => 'tu', '図' => 'tu', '图' => 'tu', '圖' => 'tu', '圗' => 'tu', '土' => 'tu', '圡' => 'tu', '堍' => 'tu', '堗' => 'tu', '塗' => 'tu', '屠' => 'tu', '峹' => 'tu', '嵞' => 'tu', '嶀' => 'tu', '庩' => 'tu', '廜' => 'tu', '徒' => 'tu', '怢' => 'tu', '悇' => 'tu', '捈' => 'tu', '捸' => 'tu', '揬' => 'tu', '梌' => 'tu', '汢' => 'tu', '涂' => 'tu', '涋' => 'tu', '湥' => 'tu', '潳' => 'tu', '痜' => 'tu', '瘏' => 'tu', '禿' => 'tu', '秃' => 'tu', '稌' => 'tu', '突' => 'tu', '筡' => 'tu', '腯' => 'tu', '荼' => 'tu', '莵' => 'tu', '菟' => 'tu', '葖' => 'tu', '蒤' => 'tu', '跿' => 'tu', '迌' => 'tu', '途' => 'tu', '酴' => 'tu', '釷' => 'tu', '鈯' => 'tu', '鋵' => 'tu', '鍎' => 'tu', '钍' => 'tu', '馟' => 'tu', '駼' => 'tu', '鵌' => 'tu', '鵚' => 'tu', '鵵' => 'tu', '鶟' => 'tu', '鷋' => 'tu', '鷵' => 'tu', '鼵' => 'tu', '㭸' => 'tu', '㻌' => 'tu', '㻠' => 'tu', '㻬' => 'tu', '㻯' => 'tu', '䅷' => 'tu', '䖘' => 'tu', '䠈' => 'tu', '䣄' => 'tu', '䣝' => 'tu', '䤅' => 'tu', '䳜' => 'tu',
+ '兛' => 'qiang', '呛' => 'qiang', '唴' => 'qiang', '嗆' => 'qiang', '嗴' => 'qiang', '墏' => 'qiang', '墙' => 'qiang', '墻' => 'qiang', '嫱' => 'qiang', '嬙' => 'qiang', '嶈' => 'qiang', '廧' => 'qiang', '強' => 'qiang', '强' => 'qiang', '戕' => 'qiang', '戗' => 'qiang', '戧' => 'qiang', '抢' => 'qiang', '搶' => 'qiang', '摤' => 'qiang', '斨' => 'qiang', '枪' => 'qiang', '椌' => 'qiang', '槍' => 'qiang', '樯' => 'qiang', '檣' => 'qiang', '溬' => 'qiang', '漒' => 'qiang', '炝' => 'qiang', '熗' => 'qiang', '牄' => 'qiang', '牆' => 'qiang', '猐' => 'qiang', '獇' => 'qiang', '玱' => 'qiang', '琷' => 'qiang', '瑲' => 'qiang', '瓩' => 'qiang', '篬' => 'qiang', '繈' => 'qiang', '繦' => 'qiang', '羌' => 'qiang', '羗' => 'qiang', '羟' => 'qiang', '羥' => 'qiang', '羫' => 'qiang', '羻' => 'qiang', '腔' => 'qiang', '艢' => 'qiang', '蔃' => 'qiang', '蔷' => 'qiang', '薔' => 'qiang', '蘠' => 'qiang', '蜣' => 'qiang', '襁' => 'qiang', '謒' => 'qiang', '跄' => 'qiang', '蹌' => 'qiang', '蹡' => 'qiang', '錆' => 'qiang', '鎗' => 'qiang', '鏘' => 'qiang', '鏹' => 'qiang', '锖' => 'qiang', '锵' => 'qiang', '镪' => 'qiang', '㛨' => 'qiang', '㩖' => 'qiang', '䅚' => 'qiang', '䵁' => 'qiang',
+ '內' => 'nei', '内' => 'nei', '娞' => 'nei', '氝' => 'nei', '焾' => 'nei', '腇' => 'nei', '餒' => 'nei', '馁' => 'nei', '鮾' => 'nei', '鯘' => 'nei', '㕯' => 'nei', '㖏' => 'nei', '㘨' => 'nei', '㨅' => 'nei', '㼏' => 'nei', '䡾' => 'nei', '䲎' => 'nei', '䳖' => 'nei',
+ '六' => 'liu', '刘' => 'liu', '劉' => 'liu', '嚠' => 'liu', '囖' => 'liu', '塯' => 'liu', '媹' => 'liu', '嬼' => 'liu', '嵧' => 'liu', '廇' => 'liu', '懰' => 'liu', '旈' => 'liu', '旒' => 'liu', '柳' => 'liu', '栁' => 'liu', '桞' => 'liu', '桺' => 'liu', '榴' => 'liu', '橊' => 'liu', '橮' => 'liu', '沠' => 'liu', '流' => 'liu', '浏' => 'liu', '溜' => 'liu', '澑' => 'liu', '瀏' => 'liu', '熘' => 'liu', '熮' => 'liu', '珋' => 'liu', '琉' => 'liu', '瑠' => 'liu', '瑬' => 'liu', '璢' => 'liu', '瓼' => 'liu', '甅' => 'liu', '畄' => 'liu', '留' => 'liu', '畱' => 'liu', '疁' => 'liu', '瘤' => 'liu', '癅' => 'liu', '硫' => 'liu', '磂' => 'liu', '磟' => 'liu', '綹' => 'liu', '绺' => 'liu', '罶' => 'liu', '羀' => 'liu', '翏' => 'liu', '蒥' => 'liu', '蓅' => 'liu', '藰' => 'liu', '蟉' => 'liu', '裗' => 'liu', '蹓' => 'liu', '遛' => 'liu', '鋶' => 'liu', '鎏' => 'liu', '鎦' => 'liu', '鏐' => 'liu', '鐂' => 'liu', '锍' => 'liu', '镏' => 'liu', '镠' => 'liu', '雡' => 'liu', '霤' => 'liu', '飀' => 'liu', '飂' => 'liu', '飅' => 'liu', '飗' => 'liu', '餾' => 'liu', '馏' => 'liu', '駠' => 'liu', '駵' => 'liu', '騮' => 'liu', '驑' => 'liu', '骝' => 'liu', '鬸' => 'liu', '鰡' => 'liu', '鶹' => 'liu', '鷚' => 'liu', '鹠' => 'liu', '鹨' => 'liu', '麍' => 'liu', '㐬' => 'liu', '㙀' => 'liu', '㨨' => 'liu', '㶯' => 'liu', '㽌' => 'liu', '㽞' => 'liu', '䄂' => 'liu', '䉧' => 'liu', '䋷' => 'liu', '䗜' => 'liu', '䚧' => 'liu', '䬟' => 'liu', '䭷' => 'liu', '䰘' => 'liu', '䱖' => 'liu', '䱞' => 'liu', '䶉' => 'liu',
+ '兺' => 'pou', '咅' => 'pou', '哛' => 'pou', '哣' => 'pou', '堷' => 'pou', '婄' => 'pou', '抔' => 'pou', '抙' => 'pou', '捊' => 'pou', '掊' => 'pou', '犃' => 'pou', '箁' => 'pou', '裒' => 'pou', '颒' => 'pou', '㕻' => 'pou', '㧵' => 'pou',
+ '兽' => 'shou', '収' => 'shou', '受' => 'shou', '售' => 'shou', '垨' => 'shou', '壽' => 'shou', '夀' => 'shou', '守' => 'shou', '寿' => 'shou', '手' => 'shou', '扌' => 'shou', '授' => 'shou', '收' => 'shou', '涭' => 'shou', '狩' => 'shou', '獣' => 'shou', '獸' => 'shou', '痩' => 'shou', '瘦' => 'shou', '綬' => 'shou', '绶' => 'shou', '膄' => 'shou', '艏' => 'shou', '鏉' => 'shou', '首' => 'shou', '㖟' => 'shou', '㝊' => 'shou', '㥅' => 'shou', '䛵' => 'shou', '䭭' => 'shou',
+ '冃' => 'mao', '冇' => 'mao', '冐' => 'mao', '冒' => 'mao', '卯' => 'mao', '唜' => 'mao', '堥' => 'mao', '夘' => 'mao', '媢' => 'mao', '峁' => 'mao', '帽' => 'mao', '愗' => 'mao', '懋' => 'mao', '戼' => 'mao', '旄' => 'mao', '昴' => 'mao', '暓' => 'mao', '枆' => 'mao', '楙' => 'mao', '毛' => 'mao', '毜' => 'mao', '毝' => 'mao', '毷' => 'mao', '泖' => 'mao', '渵' => 'mao', '牦' => 'mao', '猫' => 'mao', '瑁' => 'mao', '皃' => 'mao', '眊' => 'mao', '瞀' => 'mao', '矛' => 'mao', '笷' => 'mao', '緢' => 'mao', '耄' => 'mao', '芼' => 'mao', '茂' => 'mao', '茅' => 'mao', '茆' => 'mao', '蓩' => 'mao', '蛑' => 'mao', '蝐' => 'mao', '蝥' => 'mao', '蟊' => 'mao', '袤' => 'mao', '覒' => 'mao', '貌' => 'mao', '貓' => 'mao', '貿' => 'mao', '贸' => 'mao', '軞' => 'mao', '鄚' => 'mao', '鄮' => 'mao', '酕' => 'mao', '鉚' => 'mao', '錨' => 'mao', '铆' => 'mao', '锚' => 'mao', '髦' => 'mao', '髳' => 'mao', '鶜' => 'mao', '㒵' => 'mao', '㒻' => 'mao', '㚹' => 'mao', '㝟' => 'mao', '㡌' => 'mao', '㧇' => 'mao', '㧌' => 'mao', '㪞' => 'mao', '㫯' => 'mao', '㮘' => 'mao', '㲠' => 'mao', '㴘' => 'mao', '㺺' => 'mao', '㿞' => 'mao', '䀤' => 'mao', '䅦' => 'mao', '䋃' => 'mao', '䓮' => 'mao', '䡚' => 'mao', '䫉' => 'mao',
+ '冄' => 'ran', '冉' => 'ran', '呥' => 'ran', '嘫' => 'ran', '姌' => 'ran', '媣' => 'ran', '染' => 'ran', '橪' => 'ran', '然' => 'ran', '燃' => 'ran', '珃' => 'ran', '繎' => 'ran', '肰' => 'ran', '苒' => 'ran', '蒅' => 'ran', '蚦' => 'ran', '蚺' => 'ran', '衻' => 'ran', '袇' => 'ran', '袡' => 'ran', '髥' => 'ran', '髯' => 'ran', '㚩' => 'ran', '㜣' => 'ran', '㯗' => 'ran', '㲯' => 'ran', '㸐' => 'ran', '㾆' => 'ran', '㿵' => 'ran', '䎃' => 'ran', '䑙' => 'ran', '䒣' => 'ran', '䖄' => 'ran', '䡮' => 'ran', '䣸' => 'ran', '䤡' => 'ran', '䫇' => 'ran',
+ '冈' => 'gang', '冮' => 'gang', '刚' => 'gang', '剛' => 'gang', '堈' => 'gang', '堽' => 'gang', '岗' => 'gang', '岡' => 'gang', '崗' => 'gang', '戆' => 'gang', '戇' => 'gang', '掆' => 'gang', '杠' => 'gang', '棡' => 'gang', '槓' => 'gang', '港' => 'gang', '焵' => 'gang', '牨' => 'gang', '犅' => 'gang', '疘' => 'gang', '矼' => 'gang', '筻' => 'gang', '綱' => 'gang', '纲' => 'gang', '缸' => 'gang', '罁' => 'gang', '罓' => 'gang', '罡' => 'gang', '肛' => 'gang', '釭' => 'gang', '鋼' => 'gang', '鎠' => 'gang', '钢' => 'gang', '阬' => 'gang', '㟠' => 'gang', '㟵' => 'gang', '㽘' => 'gang', '䴚' => 'gang',
+ '冎' => 'gua', '刮' => 'gua', '剐' => 'gua', '剮' => 'gua', '劀' => 'gua', '卦' => 'gua', '叧' => 'gua', '呱' => 'gua', '啩' => 'gua', '坬' => 'gua', '寡' => 'gua', '挂' => 'gua', '掛' => 'gua', '歄' => 'gua', '焻' => 'gua', '煱' => 'gua', '瓜' => 'gua', '絓' => 'gua', '緺' => 'gua', '罣' => 'gua', '罫' => 'gua', '胍' => 'gua', '苽' => 'gua', '褂' => 'gua', '詿' => 'gua', '诖' => 'gua', '趏' => 'gua', '銽' => 'gua', '颪' => 'gua', '颳' => 'gua', '騧' => 'gua', '鴰' => 'gua', '鸹' => 'gua', '㒷' => 'gua', '䈑' => 'gua',
+ '冦' => 'kou', '剾' => 'kou', '劶' => 'kou', '口' => 'kou', '叩' => 'kou', '宼' => 'kou', '寇' => 'kou', '廤' => 'kou', '彄' => 'kou', '怐' => 'kou', '扣' => 'kou', '抠' => 'kou', '摳' => 'kou', '敂' => 'kou', '滱' => 'kou', '眍' => 'kou', '瞉' => 'kou', '瞘' => 'kou', '窛' => 'kou', '筘' => 'kou', '簆' => 'kou', '芤' => 'kou', '蔲' => 'kou', '蔻' => 'kou', '釦' => 'kou', '鷇' => 'kou', '㓂' => 'kou', '㔚' => 'kou', '㰯' => 'kou', '㲄' => 'kou', '㽛' => 'kou', '䳟' => 'kou', '䳹' => 'kou',
+ '冸' => 'pan', '判' => 'pan', '叛' => 'pan', '坢' => 'pan', '媻' => 'pan', '幋' => 'pan', '搫' => 'pan', '攀' => 'pan', '柈' => 'pan', '槃' => 'pan', '沜' => 'pan', '泮' => 'pan', '溿' => 'pan', '潘' => 'pan', '瀊' => 'pan', '炍' => 'pan', '爿' => 'pan', '牉' => 'pan', '畔' => 'pan', '畨' => 'pan', '盘' => 'pan', '盤' => 'pan', '盼' => 'pan', '眅' => 'pan', '磐' => 'pan', '縏' => 'pan', '蒰' => 'pan', '蟠' => 'pan', '袢' => 'pan', '襻' => 'pan', '詊' => 'pan', '跘' => 'pan', '蹒' => 'pan', '蹣' => 'pan', '鋬' => 'pan', '鎜' => 'pan', '鑻' => 'pan', '鞶' => 'pan', '頖' => 'pan', '鵥' => 'pan', '㐴' => 'pan', '㳪' => 'pan', '䃑' => 'pan', '䃲' => 'pan', '䈲' => 'pan', '䰉' => 'pan', '䰔' => 'pan',
+ '冾' => 'qia', '圶' => 'qia', '帢' => 'qia', '恰' => 'qia', '愘' => 'qia', '拤' => 'qia', '掐' => 'qia', '殎' => 'qia', '洽' => 'qia', '硈' => 'qia', '葜' => 'qia', '跒' => 'qia', '酠' => 'qia', '鞐' => 'qia', '髂' => 'qia', '㓣' => 'qia', '㡊' => 'qia', '㤉' => 'qia', '䜑' => 'qia', '䠍' => 'qia', '䨐' => 'qia', '䯊' => 'qia', '䶝' => 'qia',
+ '凂' => 'mei', '呅' => 'mei', '嚜' => 'mei', '堳' => 'mei', '塺' => 'mei', '妹' => 'mei', '媄' => 'mei', '媒' => 'mei', '媚' => 'mei', '媺' => 'mei', '嬍' => 'mei', '寐' => 'mei', '嵄' => 'mei', '嵋' => 'mei', '徾' => 'mei', '抺' => 'mei', '挴' => 'mei', '攗' => 'mei', '攟' => 'mei', '昧' => 'mei', '枚' => 'mei', '栂' => 'mei', '梅' => 'mei', '楣' => 'mei', '楳' => 'mei', '槑' => 'mei', '毎' => 'mei', '每' => 'mei', '沒' => 'mei', '没' => 'mei', '沬' => 'mei', '浼' => 'mei', '渼' => 'mei', '湄' => 'mei', '湈' => 'mei', '煝' => 'mei', '煤' => 'mei', '燘' => 'mei', '猸' => 'mei', '玫' => 'mei', '珻' => 'mei', '瑂' => 'mei', '痗' => 'mei', '眉' => 'mei', '眛' => 'mei', '睂' => 'mei', '睸' => 'mei', '矀' => 'mei', '祙' => 'mei', '禖' => 'mei', '篃' => 'mei', '美' => 'mei', '脄' => 'mei', '脢' => 'mei', '腜' => 'mei', '苺' => 'mei', '莓' => 'mei', '葿' => 'mei', '蘪' => 'mei', '蝞' => 'mei', '袂' => 'mei', '跊' => 'mei', '躾' => 'mei', '郿' => 'mei', '酶' => 'mei', '鋂' => 'mei', '鎂' => 'mei', '鎇' => 'mei', '镁' => 'mei', '镅' => 'mei', '霉' => 'mei', '韎' => 'mei', '鬽' => 'mei', '魅' => 'mei', '鶥' => 'mei', '鹛' => 'mei', '黣' => 'mei', '黴' => 'mei', '㭑' => 'mei', '㶬' => 'mei', '㺳' => 'mei', '䀛' => 'mei', '䆀' => 'mei', '䉋' => 'mei', '䊈' => 'mei', '䊊' => 'mei', '䍙' => 'mei', '䒽' => 'mei', '䓺' => 'mei', '䜸' => 'mei', '䤂' => 'mei', '䰨' => 'mei', '䰪' => 'mei', '䵢' => 'mei',
+ '准' => 'zhun', '凖' => 'zhun', '埻' => 'zhun', '宒' => 'zhun', '準' => 'zhun', '稕' => 'zhun', '窀' => 'zhun', '綧' => 'zhun', '肫' => 'zhun', '衠' => 'zhun', '訰' => 'zhun', '諄' => 'zhun', '谆' => 'zhun', '迍' => 'zhun',
+ '凑' => 'cou', '楱' => 'cou', '湊' => 'cou', '腠' => 'cou', '輳' => 'cou', '辏' => 'cou', '㫶' => 'cou',
+ '凟' => 'du', '剢' => 'du', '匵' => 'du', '厾' => 'du', '嘟' => 'du', '堵' => 'du', '妒' => 'du', '妬' => 'du', '嬻' => 'du', '帾' => 'du', '度' => 'du', '杜' => 'du', '椟' => 'du', '櫝' => 'du', '殬' => 'du', '殰' => 'du', '毒' => 'du', '涜' => 'du', '渎' => 'du', '渡' => 'du', '瀆' => 'du', '牍' => 'du', '牘' => 'du', '犊' => 'du', '犢' => 'du', '独' => 'du', '獨' => 'du', '琽' => 'du', '瓄' => 'du', '皾' => 'du', '督' => 'du', '睹' => 'du', '秺' => 'du', '笃' => 'du', '篤' => 'du', '肚' => 'du', '芏' => 'du', '荰' => 'du', '蝳' => 'du', '螙' => 'du', '蠧' => 'du', '蠹' => 'du', '裻' => 'du', '覩' => 'du', '読' => 'du', '讀' => 'du', '讟' => 'du', '读' => 'du', '豄' => 'du', '賭' => 'du', '贕' => 'du', '赌' => 'du', '都' => 'du', '醏' => 'du', '錖' => 'du', '鍍' => 'du', '鑟' => 'du', '镀' => 'du', '闍' => 'du', '阇' => 'du', '靯' => 'du', '韇' => 'du', '韣' => 'du', '韥' => 'du', '騳' => 'du', '髑' => 'du', '黩' => 'du', '黷' => 'du', '㱩' => 'du', '㸿' => 'du', '㾄' => 'du', '䀾' => 'du', '䄍' => 'du', '䅊' => 'du', '䈞' => 'du', '䐗' => 'du', '䓯' => 'du', '䙱' => 'du', '䟻' => 'du', '䢱' => 'du', '䪅' => 'du', '䫳' => 'du', '䮷' => 'du', '䲧' => 'du',
+ '刌' => 'cun', '吋' => 'cun', '墫' => 'cun', '存' => 'cun', '寸' => 'cun', '忖' => 'cun', '拵' => 'cun', '村' => 'cun', '澊' => 'cun', '皴' => 'cun', '竴' => 'cun', '籿' => 'cun', '踆' => 'cun', '邨' => 'cun', '䍎' => 'cun',
+ '刎' => 'wen', '吻' => 'wen', '呚' => 'wen', '呡' => 'wen', '問' => 'wen', '塭' => 'wen', '妏' => 'wen', '彣' => 'wen', '忟' => 'wen', '抆' => 'wen', '揾' => 'wen', '搵' => 'wen', '文' => 'wen', '桽' => 'wen', '榅' => 'wen', '榲' => 'wen', '殟' => 'wen', '汶' => 'wen', '渂' => 'wen', '温' => 'wen', '溫' => 'wen', '炆' => 'wen', '珳' => 'wen', '瑥' => 'wen', '璺' => 'wen', '瘒' => 'wen', '瘟' => 'wen', '砇' => 'wen', '稳' => 'wen', '穏' => 'wen', '穩' => 'wen', '紊' => 'wen', '紋' => 'wen', '絻' => 'wen', '纹' => 'wen', '聞' => 'wen', '肳' => 'wen', '脕' => 'wen', '脗' => 'wen', '芠' => 'wen', '莬' => 'wen', '蚉' => 'wen', '蚊' => 'wen', '螡' => 'wen', '蟁' => 'wen', '豱' => 'wen', '輼' => 'wen', '轀' => 'wen', '辒' => 'wen', '鈫' => 'wen', '鎾' => 'wen', '閺' => 'wen', '閿' => 'wen', '闅' => 'wen', '闦' => 'wen', '闧' => 'wen', '问' => 'wen', '闻' => 'wen', '阌' => 'wen', '雯' => 'wen', '顐' => 'wen', '饂' => 'wen', '馼' => 'wen', '魰' => 'wen', '鰛' => 'wen', '鰮' => 'wen', '鳁' => 'wen', '鳼' => 'wen', '鴍' => 'wen', '鼤' => 'wen', '㒚' => 'wen', '㖧' => 'wen', '㗃' => 'wen', '㝧' => 'wen', '㳷' => 'wen', '䎹' => 'wen', '䎽' => 'wen', '䘇' => 'wen', '䰚' => 'wen',
+ '划' => 'hua', '劃' => 'hua', '化' => 'hua', '华' => 'hua', '哗' => 'hua', '嘩' => 'hua', '埖' => 'hua', '姡' => 'hua', '婲' => 'hua', '婳' => 'hua', '嫿' => 'hua', '嬅' => 'hua', '崋' => 'hua', '摦' => 'hua', '撶' => 'hua', '杹' => 'hua', '桦' => 'hua', '椛' => 'hua', '槬' => 'hua', '樺' => 'hua', '滑' => 'hua', '澅' => 'hua', '猾' => 'hua', '璍' => 'hua', '画' => 'hua', '畫' => 'hua', '畵' => 'hua', '硴' => 'hua', '磆' => 'hua', '糀' => 'hua', '繣' => 'hua', '舙' => 'hua', '花' => 'hua', '芲' => 'hua', '華' => 'hua', '蕐' => 'hua', '蘤' => 'hua', '蘳' => 'hua', '螖' => 'hua', '觟' => 'hua', '話' => 'hua', '誮' => 'hua', '諙' => 'hua', '諣' => 'hua', '譁' => 'hua', '话' => 'hua', '鋘' => 'hua', '錵' => 'hua', '鏵' => 'hua', '铧' => 'hua', '驊' => 'hua', '骅' => 'hua', '鷨' => 'hua', '黊' => 'hua', '㓰' => 'hua', '㕦' => 'hua', '㕲' => 'hua', '㕷' => 'hua', '㚌' => 'hua', '㟆' => 'hua', '㠏' => 'hua', '㠢' => 'hua', '㦊' => 'hua', '㦎' => 'hua', '㩇' => 'hua', '㭉' => 'hua', '㮯' => 'hua', '䅿' => 'hua', '䏦' => 'hua', '䔢' => 'hua', '䛡' => 'hua', '䠉' => 'hua', '䱻' => 'hua', '䶤' => 'hua',
+ '刖' => 'yue', '嬳' => 'yue', '岄' => 'yue', '岳' => 'yue', '嶽' => 'yue', '彟' => 'yue', '彠' => 'yue', '恱' => 'yue', '悅' => 'yue', '悦' => 'yue', '戉' => 'yue', '抈' => 'yue', '捳' => 'yue', '曰' => 'yue', '曱' => 'yue', '月' => 'yue', '枂' => 'yue', '樾' => 'yue', '汋' => 'yue', '瀹' => 'yue', '爚' => 'yue', '玥' => 'yue', '矱' => 'yue', '礿' => 'yue', '禴' => 'yue', '箹' => 'yue', '篗' => 'yue', '籆' => 'yue', '籥' => 'yue', '籰' => 'yue', '粤' => 'yue', '粵' => 'yue', '約' => 'yue', '约' => 'yue', '蘥' => 'yue', '蚎' => 'yue', '蚏' => 'yue', '越' => 'yue', '跀' => 'yue', '跃' => 'yue', '躍' => 'yue', '軏' => 'yue', '鈅' => 'yue', '鉞' => 'yue', '钥' => 'yue', '钺' => 'yue', '閱' => 'yue', '閲' => 'yue', '阅' => 'yue', '鸑' => 'yue', '鸙' => 'yue', '黦' => 'yue', '龠' => 'yue', '龥' => 'yue', '㜧' => 'yue', '㜰' => 'yue', '㬦' => 'yue', '㰛' => 'yue', '㹊' => 'yue', '䋐' => 'yue', '䖃' => 'yue', '䟠' => 'yue', '䠯' => 'yue', '䡇' => 'yue', '䢁' => 'yue', '䢲' => 'yue', '䤦' => 'yue', '䥃' => 'yue', '䶳' => 'yue',
+ '別' => 'bie', '别' => 'bie', '咇' => 'bie', '彆' => 'bie', '徶' => 'bie', '憋' => 'bie', '瘪' => 'bie', '癟' => 'bie', '莂' => 'bie', '虌' => 'bie', '蛂' => 'bie', '蟞' => 'bie', '襒' => 'bie', '蹩' => 'bie', '鱉' => 'bie', '鳖' => 'bie', '鼈' => 'bie', '龞' => 'bie', '㢼' => 'bie', '㿜' => 'bie', '䉲' => 'bie', '䋢' => 'bie', '䏟' => 'bie', '䠥' => 'bie', '䭱' => 'bie',
+ '刨' => 'pao', '匏' => 'pao', '咆' => 'pao', '垉' => 'pao', '奅' => 'pao', '庖' => 'pao', '抛' => 'pao', '拋' => 'pao', '泡' => 'pao', '炮' => 'pao', '炰' => 'pao', '爮' => 'pao', '狍' => 'pao', '疱' => 'pao', '皰' => 'pao', '砲' => 'pao', '礟' => 'pao', '礮' => 'pao', '脬' => 'pao', '萢' => 'pao', '蚫' => 'pao', '袍' => 'pao', '褜' => 'pao', '跑' => 'pao', '軳' => 'pao', '鞄' => 'pao', '麅' => 'pao', '麭' => 'pao', '㘐' => 'pao', '㚿' => 'pao', '㯡' => 'pao', '䛌' => 'pao', '䩝' => 'pao', '䶌' => 'pao',
+ '刷' => 'shua', '唰' => 'shua', '耍' => 'shua', '誜' => 'shua',
+ '剉' => 'cuo', '剒' => 'cuo', '厝' => 'cuo', '夎' => 'cuo', '嵯' => 'cuo', '嵳' => 'cuo', '挫' => 'cuo', '措' => 'cuo', '搓' => 'cuo', '撮' => 'cuo', '棤' => 'cuo', '瑳' => 'cuo', '痤' => 'cuo', '睉' => 'cuo', '矬' => 'cuo', '磋' => 'cuo', '脞' => 'cuo', '莝' => 'cuo', '莡' => 'cuo', '蒫' => 'cuo', '蓌' => 'cuo', '蔖' => 'cuo', '虘' => 'cuo', '蹉' => 'cuo', '逪' => 'cuo', '遳' => 'cuo', '醝' => 'cuo', '銼' => 'cuo', '錯' => 'cuo', '锉' => 'cuo', '错' => 'cuo', '髊' => 'cuo', '鹺' => 'cuo', '鹾' => 'cuo', '齹' => 'cuo', '㟇' => 'cuo', '㽨' => 'cuo', '䂳' => 'cuo', '䐣' => 'cuo', '䟶' => 'cuo', '䠡' => 'cuo', '䣜' => 'cuo', '䱜' => 'cuo', '䴾' => 'cuo',
+ '剌' => 'la', '啦' => 'la', '喇' => 'la', '嚹' => 'la', '垃' => 'la', '拉' => 'la', '揦' => 'la', '揧' => 'la', '搚' => 'la', '攋' => 'la', '旯' => 'la', '柆' => 'la', '楋' => 'la', '櫴' => 'la', '溂' => 'la', '爉' => 'la', '瓎' => 'la', '瘌' => 'la', '砬' => 'la', '磖' => 'la', '翋' => 'la', '腊' => 'la', '臈' => 'la', '臘' => 'la', '菈' => 'la', '藞' => 'la', '蜡' => 'la', '蝋' => 'la', '蝲' => 'la', '蠟' => 'la', '辢' => 'la', '辣' => 'la', '邋' => 'la', '鑞' => 'la', '镴' => 'la', '鞡' => 'la', '鬎' => 'la', '鯻' => 'la', '㕇' => 'la', '㸊' => 'la', '㻋' => 'la', '㻝' => 'la', '䂰' => 'la', '䃳' => 'la', '䏀' => 'la', '䓥' => 'la', '䗶' => 'la', '䝓' => 'la', '䟑' => 'la', '䪉' => 'la', '䱫' => 'la', '䶛' => 'la',
+ '剖' => 'po', '叵' => 'po', '哱' => 'po', '嘙' => 'po', '坡' => 'po', '奤' => 'po', '娝' => 'po', '婆' => 'po', '尀' => 'po', '岥' => 'po', '岶' => 'po', '廹' => 'po', '敀' => 'po', '昢' => 'po', '櫇' => 'po', '泼' => 'po', '洦' => 'po', '溌' => 'po', '潑' => 'po', '烞' => 'po', '珀' => 'po', '皤' => 'po', '破' => 'po', '砶' => 'po', '笸' => 'po', '粕' => 'po', '蒪' => 'po', '蔢' => 'po', '謈' => 'po', '迫' => 'po', '鄱' => 'po', '酦' => 'po', '醱' => 'po', '釙' => 'po', '鉕' => 'po', '鏺' => 'po', '钋' => 'po', '钷' => 'po', '頗' => 'po', '颇' => 'po', '駊' => 'po', '魄' => 'po', '㛘' => 'po', '㨇' => 'po', '㰴' => 'po', '䄸' => 'po', '䎊' => 'po', '䞟' => 'po', '䣪' => 'po', '䣮' => 'po', '䨰' => 'po', '䪖' => 'po', '䯙' => 'po',
+ '剬' => 'tuan', '剸' => 'tuan', '团' => 'tuan', '団' => 'tuan', '圕' => 'tuan', '團' => 'tuan', '塼' => 'tuan', '彖' => 'tuan', '慱' => 'tuan', '抟' => 'tuan', '摶' => 'tuan', '槫' => 'tuan', '檲' => 'tuan', '湍' => 'tuan', '湪' => 'tuan', '漙' => 'tuan', '煓' => 'tuan', '猯' => 'tuan', '疃' => 'tuan', '篿' => 'tuan', '糰' => 'tuan', '褖' => 'tuan', '貒' => 'tuan', '鏄' => 'tuan', '鷒' => 'tuan', '鷻' => 'tuan', '㩛' => 'tuan', '䊜' => 'tuan', '䜝' => 'tuan', '䵯' => 'tuan',
+ '劗' => 'zuan', '揝' => 'zuan', '攥' => 'zuan', '籫' => 'zuan', '繤' => 'zuan', '纂' => 'zuan', '纉' => 'zuan', '纘' => 'zuan', '缵' => 'zuan', '躜' => 'zuan', '躦' => 'zuan', '鑚' => 'zuan', '鑽' => 'zuan', '钻' => 'zuan', '䂎' => 'zuan', '䌣' => 'zuan', '䎱' => 'zuan', '䤸' => 'zuan',
+ '劭' => 'shao', '勺' => 'shao', '卲' => 'shao', '哨' => 'shao', '娋' => 'shao', '少' => 'shao', '弰' => 'shao', '捎' => 'shao', '旓' => 'shao', '柖' => 'shao', '梢' => 'shao', '潲' => 'shao', '烧' => 'shao', '焼' => 'shao', '焽' => 'shao', '燒' => 'shao', '玿' => 'shao', '稍' => 'shao', '筲' => 'shao', '紹' => 'shao', '綤' => 'shao', '绍' => 'shao', '艄' => 'shao', '芍' => 'shao', '苕' => 'shao', '莦' => 'shao', '萔' => 'shao', '蕱' => 'shao', '蛸' => 'shao', '袑' => 'shao', '輎' => 'shao', '邵' => 'shao', '韶' => 'shao', '颵' => 'shao', '髾' => 'shao', '鮹' => 'shao', '㪢' => 'shao', '㲈' => 'shao', '㷹' => 'shao', '㸛' => 'shao', '䏴' => 'shao', '䒚' => 'shao', '䔠' => 'shao', '䙼' => 'shao', '䬰' => 'shao',
+ '勂' => 'gao', '吿' => 'gao', '告' => 'gao', '夰' => 'gao', '峼' => 'gao', '搞' => 'gao', '暠' => 'gao', '杲' => 'gao', '槀' => 'gao', '槁' => 'gao', '槔' => 'gao', '槹' => 'gao', '橰' => 'gao', '檺' => 'gao', '櫜' => 'gao', '滜' => 'gao', '獔' => 'gao', '皋' => 'gao', '皐' => 'gao', '睪' => 'gao', '睾' => 'gao', '祮' => 'gao', '祰' => 'gao', '禞' => 'gao', '稁' => 'gao', '稾' => 'gao', '稿' => 'gao', '筶' => 'gao', '篙' => 'gao', '糕' => 'gao', '縞' => 'gao', '缟' => 'gao', '羔' => 'gao', '羙' => 'gao', '膏' => 'gao', '臯' => 'gao', '菒' => 'gao', '藁' => 'gao', '藳' => 'gao', '誥' => 'gao', '诰' => 'gao', '郜' => 'gao', '鋯' => 'gao', '鎬' => 'gao', '锆' => 'gao', '镐' => 'gao', '韟' => 'gao', '餻' => 'gao', '高' => 'gao', '髙' => 'gao', '鷎' => 'gao', '鷱' => 'gao', '鼛' => 'gao', '㚏' => 'gao', '㚖' => 'gao', '㾸' => 'gao', '䗣' => 'gao',
+ '勆' => 'lang', '唥' => 'lang', '啷' => 'lang', '埌' => 'lang', '塱' => 'lang', '嫏' => 'lang', '崀' => 'lang', '廊' => 'lang', '悢' => 'lang', '朖' => 'lang', '朗' => 'lang', '朤' => 'lang', '桹' => 'lang', '榔' => 'lang', '樃' => 'lang', '欴' => 'lang', '浪' => 'lang', '烺' => 'lang', '狼' => 'lang', '琅' => 'lang', '瑯' => 'lang', '硠' => 'lang', '稂' => 'lang', '筤' => 'lang', '艆' => 'lang', '莨' => 'lang', '蒗' => 'lang', '蓈' => 'lang', '蓢' => 'lang', '蜋' => 'lang', '螂' => 'lang', '誏' => 'lang', '躴' => 'lang', '郎' => 'lang', '郒' => 'lang', '郞' => 'lang', '鋃' => 'lang', '鎯' => 'lang', '锒' => 'lang', '閬' => 'lang', '阆' => 'lang', '駺' => 'lang', '㓪' => 'lang', '㙟' => 'lang', '㝗' => 'lang', '㟍' => 'lang', '㢃' => 'lang', '㫰' => 'lang', '㮾' => 'lang', '㱢' => 'lang', '㾗' => 'lang', '㾿' => 'lang', '䀶' => 'lang', '䁁' => 'lang', '䆡' => 'lang', '䍚' => 'lang', '䕞' => 'lang', '䡙' => 'lang', '䯖' => 'lang', '䱶' => 'lang',
+ '勜' => 'weng', '嗡' => 'weng', '塕' => 'weng', '奣' => 'weng', '嵡' => 'weng', '暡' => 'weng', '滃' => 'weng', '瓮' => 'weng', '甕' => 'weng', '瞈' => 'weng', '罋' => 'weng', '翁' => 'weng', '聬' => 'weng', '蓊' => 'weng', '蕹' => 'weng', '螉' => 'weng', '鎓' => 'weng', '鶲' => 'weng', '鹟' => 'weng', '齆' => 'weng', '㘢' => 'weng', '㜲' => 'weng', '䐥' => 'weng', '䤰' => 'weng',
+ '匁' => 'mang', '厖' => 'mang', '吂' => 'mang', '哤' => 'mang', '壾' => 'mang', '娏' => 'mang', '尨' => 'mang', '忙' => 'mang', '恾' => 'mang', '杗' => 'mang', '杧' => 'mang', '氓' => 'mang', '汒' => 'mang', '浝' => 'mang', '漭' => 'mang', '牤' => 'mang', '牻' => 'mang', '狵' => 'mang', '痝' => 'mang', '盲' => 'mang', '硭' => 'mang', '笀' => 'mang', '芒' => 'mang', '茫' => 'mang', '茻' => 'mang', '莽' => 'mang', '莾' => 'mang', '蘉' => 'mang', '蛖' => 'mang', '蟒' => 'mang', '蠎' => 'mang', '邙' => 'mang', '釯' => 'mang', '鋩' => 'mang', '铓' => 'mang', '駹' => 'mang', '㙁' => 'mang', '㝑' => 'mang', '㟌' => 'mang', '㟐' => 'mang', '㟿' => 'mang', '㡛' => 'mang', '㬒' => 'mang', '㻊' => 'mang', '䀮' => 'mang', '䁳' => 'mang', '䅒' => 'mang', '䈍' => 'mang', '䒎' => 'mang', '䖟' => 'mang', '䟥' => 'mang', '䵨' => 'mang',
+ '匘' => 'nao', '呶' => 'nao', '垴' => 'nao', '堖' => 'nao', '夒' => 'nao', '婥' => 'nao', '嫐' => 'nao', '孬' => 'nao', '峱' => 'nao', '嶩' => 'nao', '巎' => 'nao', '怓' => 'nao', '恼' => 'nao', '悩' => 'nao', '惱' => 'nao', '挠' => 'nao', '撓' => 'nao', '檂' => 'nao', '淖' => 'nao', '猱' => 'nao', '獶' => 'nao', '獿' => 'nao', '瑙' => 'nao', '硇' => 'nao', '碙' => 'nao', '碯' => 'nao', '脑' => 'nao', '脳' => 'nao', '腦' => 'nao', '臑' => 'nao', '蛲' => 'nao', '蟯' => 'nao', '詉' => 'nao', '譊' => 'nao', '鐃' => 'nao', '铙' => 'nao', '閙' => 'nao', '闹' => 'nao', '鬧' => 'nao', '㑎' => 'nao', '㛴' => 'nao', '㞪' => 'nao', '㺀' => 'nao', '㺁' => 'nao', '䃩' => 'nao', '䄩' => 'nao', '䑋' => 'nao', '䛝' => 'nao', '䜀' => 'nao', '䜧' => 'nao', '䫸' => 'nao', '䴃' => 'nao',
+ '匝' => 'za', '咂' => 'za', '囐' => 'za', '帀' => 'za', '拶' => 'za', '杂' => 'za', '桚' => 'za', '沞' => 'za', '沯' => 'za', '砸' => 'za', '磼' => 'za', '紥' => 'za', '紮' => 'za', '臜' => 'za', '臢' => 'za', '襍' => 'za', '鉔' => 'za', '雑' => 'za', '雜' => 'za', '雥' => 'za', '韴' => 'za', '魳' => 'za', '䕹' => 'za', '䞙' => 'za', '䪞' => 'za',
+ '匴' => 'suan', '狻' => 'suan', '痠' => 'suan', '祘' => 'suan', '笇' => 'suan', '筭' => 'suan', '算' => 'suan', '蒜' => 'suan', '酸' => 'suan', '㔯' => 'suan',
+ '卄' => 'nian', '哖' => 'nian', '埝' => 'nian', '姩' => 'nian', '年' => 'nian', '廿' => 'nian', '念' => 'nian', '拈' => 'nian', '捻' => 'nian', '撚' => 'nian', '撵' => 'nian', '攆' => 'nian', '涊' => 'nian', '淰' => 'nian', '碾' => 'nian', '秊' => 'nian', '秥' => 'nian', '簐' => 'nian', '艌' => 'nian', '蔫' => 'nian', '蹨' => 'nian', '躎' => 'nian', '輦' => 'nian', '辇' => 'nian', '鮎' => 'nian', '鯰' => 'nian', '鲇' => 'nian', '鲶' => 'nian', '鵇' => 'nian', '黏' => 'nian', '㘝' => 'nian', '㞋' => 'nian', '㲽' => 'nian', '䄭' => 'nian', '䄹' => 'nian', '䚓' => 'nian', '䩞' => 'nian', '䬯' => 'nian',
+ '卛' => 'shuai', '帅' => 'shuai', '帥' => 'shuai', '摔' => 'shuai', '甩' => 'shuai', '蟀' => 'shuai', '衰' => 'shuai', '䢦' => 'shuai',
+ '却' => 'que', '卻' => 'que', '埆' => 'que', '塙' => 'que', '墧' => 'que', '崅' => 'que', '悫' => 'que', '愨' => 'que', '慤' => 'que', '搉' => 'que', '榷' => 'que', '毃' => 'que', '炔' => 'que', '燩' => 'que', '瘸' => 'que', '皵' => 'que', '硞' => 'que', '确' => 'que', '碏' => 'que', '確' => 'que', '礐' => 'que', '礭' => 'que', '缺' => 'que', '舃' => 'que', '蒛' => 'que', '趞' => 'que', '闋' => 'que', '闕' => 'que', '阕' => 'que', '阙' => 'que', '雀' => 'que', '鵲' => 'que', '鹊' => 'que', '㕁' => 'que', '㩁' => 'que', '㰌' => 'que', '㱋' => 'que', '㱿' => 'que', '㴶' => 'que', '㾡' => 'que', '䇎' => 'que', '䦬' => 'que', '䧿' => 'que',
+ '厇' => 'zhe', '哲' => 'zhe', '啠' => 'zhe', '喆' => 'zhe', '嗻' => 'zhe', '嚞' => 'zhe', '埑' => 'zhe', '嫬' => 'zhe', '悊' => 'zhe', '折' => 'zhe', '摺' => 'zhe', '晢' => 'zhe', '晣' => 'zhe', '柘' => 'zhe', '棏' => 'zhe', '樀' => 'zhe', '樜' => 'zhe', '歽' => 'zhe', '浙' => 'zhe', '淛' => 'zhe', '矺' => 'zhe', '砓' => 'zhe', '磔' => 'zhe', '籷' => 'zhe', '粍' => 'zhe', '者' => 'zhe', '蔗' => 'zhe', '虴' => 'zhe', '蛰' => 'zhe', '蜇' => 'zhe', '蟄' => 'zhe', '蟅' => 'zhe', '袩' => 'zhe', '褶' => 'zhe', '襵' => 'zhe', '詟' => 'zhe', '謫' => 'zhe', '謺' => 'zhe', '讁' => 'zhe', '讋' => 'zhe', '谪' => 'zhe', '赭' => 'zhe', '輒' => 'zhe', '輙' => 'zhe', '轍' => 'zhe', '辄' => 'zhe', '辙' => 'zhe', '这' => 'zhe', '這' => 'zhe', '遮' => 'zhe', '銸' => 'zhe', '鍺' => 'zhe', '锗' => 'zhe', '鮿' => 'zhe', '鷓' => 'zhe', '鹧' => 'zhe', '㞏' => 'zhe', '㪿' => 'zhe', '㯰' => 'zhe', '䂞' => 'zhe', '䊞' => 'zhe', '䎲' => 'zhe', '䏳' => 'zhe', '䐑' => 'zhe', '䐲' => 'zhe', '䓆' => 'zhe', '䗪' => 'zhe', '䝃' => 'zhe', '䝕' => 'zhe', '䠦' => 'zhe', '䩾' => 'zhe', '䵭' => 'zhe',
+ '厑' => 'a', '吖' => 'a', '啊' => 'a', '嗄' => 'a', '錒' => 'a', '锕' => 'a', '阿' => 'a',
+ '厜' => 'zui', '嗺' => 'zui', '嘴' => 'zui', '噿' => 'zui', '嶊' => 'zui', '嶵' => 'zui', '晬' => 'zui', '最' => 'zui', '朘' => 'zui', '枠' => 'zui', '栬' => 'zui', '樶' => 'zui', '檇' => 'zui', '檌' => 'zui', '欈' => 'zui', '濢' => 'zui', '璻' => 'zui', '祽' => 'zui', '穝' => 'zui', '絊' => 'zui', '纗' => 'zui', '罪' => 'zui', '蕞' => 'zui', '蟕' => 'zui', '辠' => 'zui', '酔' => 'zui', '酻' => 'zui', '醉' => 'zui', '鋷' => 'zui', '錊' => 'zui', '㝡' => 'zui', '㠑' => 'zui', '㰎' => 'zui', '䘹' => 'zui', '䮔' => 'zui',
+ '厹' => 'rou', '媃' => 'rou', '宍' => 'rou', '揉' => 'rou', '柔' => 'rou', '楺' => 'rou', '渘' => 'rou', '煣' => 'rou', '瑈' => 'rou', '瓇' => 'rou', '禸' => 'rou', '粈' => 'rou', '糅' => 'rou', '肉' => 'rou', '腬' => 'rou', '葇' => 'rou', '蝚' => 'rou', '蹂' => 'rou', '輮' => 'rou', '鍒' => 'rou', '鞣' => 'rou', '韖' => 'rou', '騥' => 'rou', '鰇' => 'rou', '鶔' => 'rou', '㖻' => 'rou', '㽥' => 'rou', '䄾' => 'rou', '䐓' => 'rou', '䧷' => 'rou', '䰆' => 'rou',
+ '双' => 'shuang', '塽' => 'shuang', '孀' => 'shuang', '孇' => 'shuang', '慡' => 'shuang', '樉' => 'shuang', '欆' => 'shuang', '滝' => 'shuang', '灀' => 'shuang', '爽' => 'shuang', '礵' => 'shuang', '縔' => 'shuang', '艭' => 'shuang', '鏯' => 'shuang', '雙' => 'shuang', '霜' => 'shuang', '騻' => 'shuang', '驦' => 'shuang', '骦' => 'shuang', '鷞' => 'shuang', '鸘' => 'shuang', '鹴' => 'shuang', '㦼' => 'shuang', '㼽' => 'shuang', '䗮' => 'shuang', '䡯' => 'shuang', '䫪' => 'shuang',
+ '叠' => 'die', '哋' => 'die', '啑' => 'die', '喋' => 'die', '嚸' => 'die', '垤' => 'die', '堞' => 'die', '峌' => 'die', '嵽' => 'die', '幉' => 'die', '恎' => 'die', '惵' => 'die', '戜' => 'die', '挕' => 'die', '揲' => 'die', '昳' => 'die', '曡' => 'die', '曢' => 'die', '殜' => 'die', '氎' => 'die', '爹' => 'die', '牃' => 'die', '牒' => 'die', '瓞' => 'die', '畳' => 'die', '疂' => 'die', '疉' => 'die', '疊' => 'die', '眣' => 'die', '眰' => 'die', '碟' => 'die', '絰' => 'die', '绖' => 'die', '耊' => 'die', '耋' => 'die', '胅' => 'die', '臷' => 'die', '艓' => 'die', '苵' => 'die', '蜨' => 'die', '蝶' => 'die', '褋' => 'die', '褺' => 'die', '詄' => 'die', '諜' => 'die', '谍' => 'die', '趃' => 'die', '跌' => 'die', '蹀' => 'die', '迭' => 'die', '镻' => 'die', '鰈' => 'die', '鲽' => 'die', '㑙' => 'die', '㥈' => 'die', '㦶' => 'die', '㩸' => 'die', '㩹' => 'die', '㫼' => 'die', '㬪' => 'die', '㭯' => 'die', '㲲' => 'die', '㲳' => 'die', '㷸' => 'die', '㻡' => 'die', '䘭' => 'die', '䞇' => 'die', '䞕' => 'die', '䠟' => 'die', '䪥' => 'die', '䮢' => 'die', '䲀' => 'die', '䳀' => 'die', '䴑' => 'die',
+ '叡' => 'rui', '壡' => 'rui', '枘' => 'rui', '桵' => 'rui', '橤' => 'rui', '汭' => 'rui', '瑞' => 'rui', '甤' => 'rui', '睿' => 'rui', '緌' => 'rui', '繠' => 'rui', '芮' => 'rui', '蕊' => 'rui', '蕋' => 'rui', '蕤' => 'rui', '蘂' => 'rui', '蘃' => 'rui', '蚋' => 'rui', '蜹' => 'rui', '銳' => 'rui', '鋭' => 'rui', '锐' => 'rui', '㓹' => 'rui', '㛱' => 'rui', '㪫' => 'rui', '㮃' => 'rui', '㲊' => 'rui', '䅑' => 'rui', '䌼' => 'rui', '䓲' => 'rui',
+ '吞' => 'tun', '呑' => 'tun', '啍' => 'tun', '坉' => 'tun', '屯' => 'tun', '忳' => 'tun', '旽' => 'tun', '暾' => 'tun', '朜' => 'tun', '氽' => 'tun', '涒' => 'tun', '焞' => 'tun', '畽' => 'tun', '臀' => 'tun', '臋' => 'tun', '芚' => 'tun', '豘' => 'tun', '豚' => 'tun', '軘' => 'tun', '霕' => 'tun', '飩' => 'tun', '饨' => 'tun', '魨' => 'tun', '鲀' => 'tun', '黗' => 'tun', '㖔' => 'tun', '㞘' => 'tun', '㩔' => 'tun', '㹠' => 'tun', '㼊' => 'tun',
+ '否' => 'fou', '垺' => 'fou', '妚' => 'fou', '紑' => 'fou', '缶' => 'fou', '缹' => 'fou', '缻' => 'fou', '雬' => 'fou', '鴀' => 'fou', '䳕' => 'fou',
+ '吮' => 'shun', '瞬' => 'shun', '舜' => 'shun', '顺' => 'shun', '㥧' => 'shun', '䀢' => 'shun', '䀵' => 'shun', '䑞' => 'shun',
+ '呙' => 'guo', '咼' => 'guo', '啯' => 'guo', '嘓' => 'guo', '囯' => 'guo', '囶' => 'guo', '囻' => 'guo', '国' => 'guo', '圀' => 'guo', '國' => 'guo', '埚' => 'guo', '堝' => 'guo', '墎' => 'guo', '崞' => 'guo', '帼' => 'guo', '幗' => 'guo', '彉' => 'guo', '彍' => 'guo', '惈' => 'guo', '慖' => 'guo', '掴' => 'guo', '摑' => 'guo', '果' => 'guo', '椁' => 'guo', '楇' => 'guo', '槨' => 'guo', '淉' => 'guo', '漍' => 'guo', '濄' => 'guo', '猓' => 'guo', '瘑' => 'guo', '粿' => 'guo', '綶' => 'guo', '聒' => 'guo', '聝' => 'guo', '腂' => 'guo', '腘' => 'guo', '膕' => 'guo', '菓' => 'guo', '蔮' => 'guo', '虢' => 'guo', '蜾' => 'guo', '蝈' => 'guo', '蟈' => 'guo', '裹' => 'guo', '褁' => 'guo', '輠' => 'guo', '过' => 'guo', '過' => 'guo', '郭' => 'guo', '鈛' => 'guo', '鍋' => 'guo', '鐹' => 'guo', '锅' => 'guo', '餜' => 'guo', '馃' => 'guo', '馘' => 'guo', '㕵' => 'guo', '㖪' => 'guo', '㚍' => 'guo', '㞅' => 'guo', '㳀' => 'guo', '㶁' => 'guo', '䂸' => 'guo', '䆐' => 'guo', '䐸' => 'guo', '䙨' => 'guo', '䤋' => 'guo', '䬎' => 'guo', '䴹' => 'guo',
+ '呠' => 'pen', '喯' => 'pen', '喷' => 'pen', '噴' => 'pen', '歕' => 'pen', '湓' => 'pen', '濆' => 'pen', '瓫' => 'pen', '盆' => 'pen', '翉' => 'pen', '翸' => 'pen', '葐' => 'pen',
+ '呢' => 'ne', '抐' => 'ne', '疒' => 'ne', '眲' => 'ne', '訥' => 'ne', '讷' => 'ne', '䎪' => 'ne', '䭆' => 'ne',
+ '呣' => 'm', '嘸' => 'm',
+ '咶' => 'huai', '坏' => 'huai', '壊' => 'huai', '壞' => 'huai', '徊' => 'huai', '怀' => 'huai', '懐' => 'huai', '懷' => 'huai', '槐' => 'huai', '櫰' => 'huai', '淮' => 'huai', '瀤' => 'huai', '耲' => 'huai', '蘹' => 'huai', '蘾' => 'huai', '褢' => 'huai', '褱' => 'huai', '踝' => 'huai', '㜳' => 'huai', '䈭' => 'huai', '䴜' => 'huai',
+ '品' => 'pin', '嚬' => 'pin', '姘' => 'pin', '娉' => 'pin', '嫔' => 'pin', '嬪' => 'pin', '拼' => 'pin', '朩' => 'pin', '榀' => 'pin', '汖' => 'pin', '牝' => 'pin', '玭' => 'pin', '琕' => 'pin', '矉' => 'pin', '礗' => 'pin', '穦' => 'pin', '聘' => 'pin', '薲' => 'pin', '貧' => 'pin', '贫' => 'pin', '頻' => 'pin', '顰' => 'pin', '频' => 'pin', '颦' => 'pin', '馪' => 'pin', '驞' => 'pin', '㰋' => 'pin', '䀻' => 'pin',
+ '哟' => 'yo', '唷' => 'yo', '喲' => 'yo',
+ '哦' => 'o',
+ '哾' => 'shui', '帨' => 'shui', '楯' => 'shui', '橓' => 'shui', '水' => 'shui', '氵' => 'shui', '氺' => 'shui', '涗' => 'shui', '涚' => 'shui', '睡' => 'shui', '瞚' => 'shui', '瞤' => 'shui', '祱' => 'shui', '稅' => 'shui', '税' => 'shui', '脽' => 'shui', '蕣' => 'shui', '裞' => 'shui', '說' => 'shui', '説' => 'shui', '誰' => 'shui', '谁' => 'shui', '閖' => 'shui', '順' => 'shui', '鬊' => 'shui', '㽷' => 'shui', '䭨' => 'shui',
+ '唤' => 'huan', '喚' => 'huan', '喛' => 'huan', '嚾' => 'huan', '堚' => 'huan', '奂' => 'huan', '奐' => 'huan', '宦' => 'huan', '寏' => 'huan', '寰' => 'huan', '峘' => 'huan', '嵈' => 'huan', '幻' => 'huan', '患' => 'huan', '愌' => 'huan', '懁' => 'huan', '懽' => 'huan', '换' => 'huan', '換' => 'huan', '擐' => 'huan', '攌' => 'huan', '桓' => 'huan', '梙' => 'huan', '槵' => 'huan', '欢' => 'huan', '欥' => 'huan', '歓' => 'huan', '歡' => 'huan', '洹' => 'huan', '浣' => 'huan', '涣' => 'huan', '渙' => 'huan', '漶' => 'huan', '澣' => 'huan', '澴' => 'huan', '烉' => 'huan', '焕' => 'huan', '煥' => 'huan', '狟' => 'huan', '獾' => 'huan', '环' => 'huan', '瑍' => 'huan', '環' => 'huan', '瓛' => 'huan', '痪' => 'huan', '瘓' => 'huan', '睆' => 'huan', '瞣' => 'huan', '糫' => 'huan', '絙' => 'huan', '綄' => 'huan', '緩' => 'huan', '繯' => 'huan', '缓' => 'huan', '缳' => 'huan', '羦' => 'huan', '肒' => 'huan', '荁' => 'huan', '萈' => 'huan', '萑' => 'huan', '藧' => 'huan', '讙' => 'huan', '豢' => 'huan', '豲' => 'huan', '貆' => 'huan', '貛' => 'huan', '輐' => 'huan', '轘' => 'huan', '还' => 'huan', '逭' => 'huan', '還' => 'huan', '郇' => 'huan', '酄' => 'huan', '鍰' => 'huan', '鐶' => 'huan', '锾' => 'huan', '镮' => 'huan', '闤' => 'huan', '阛' => 'huan', '雈' => 'huan', '驩' => 'huan', '鬟' => 'huan', '鯇' => 'huan', '鯶' => 'huan', '鰀' => 'huan', '鲩' => 'huan', '鴅' => 'huan', '鵍' => 'huan', '鹮' => 'huan', '㓉' => 'huan', '㕕' => 'huan', '㡲' => 'huan', '㣪' => 'huan', '㦥' => 'huan', '㪱' => 'huan', '㬇' => 'huan', '㬊' => 'huan', '㵹' => 'huan', '㶎' => 'huan', '㹖' => 'huan', '㼫' => 'huan', '㿪' => 'huan', '䀓' => 'huan', '䀨' => 'huan', '䆠' => 'huan', '䈠' => 'huan', '䍺' => 'huan', '䝠' => 'huan', '䥧' => 'huan', '䦡' => 'huan', '䭴' => 'huan', '䮝' => 'huan', '䯘' => 'huan', '䴟' => 'huan',
+ '啂' => 'nou', '槈' => 'nou', '檽' => 'nou', '獳' => 'nou', '羺' => 'nou', '耨' => 'nou', '譨' => 'nou', '譳' => 'nou', '鎒' => 'nou', '鐞' => 'nou', '㝹' => 'nou', '䅶' => 'nou', '䘫' => 'nou', '䨲' => 'nou', '䰭' => 'nou',
+ '啃' => 'ken', '垦' => 'ken', '墾' => 'ken', '恳' => 'ken', '懇' => 'ken', '掯' => 'ken', '肎' => 'ken', '肯' => 'ken', '肻' => 'ken', '裉' => 'ken', '褃' => 'ken', '豤' => 'ken', '貇' => 'ken', '錹' => 'ken', '㸧' => 'ken',
+ '啜' => 'chuai', '嘬' => 'chuai', '揣' => 'chuai', '膗' => 'chuai', '踹' => 'chuai', '㪓' => 'chuai', '㪜' => 'chuai', '䦟' => 'chuai', '䦤' => 'chuai', '䦷' => 'chuai',
+ '啪' => 'pa', '妑' => 'pa', '帊' => 'pa', '帕' => 'pa', '怕' => 'pa', '掱' => 'pa', '杷' => 'pa', '潖' => 'pa', '爬' => 'pa', '琶' => 'pa', '皅' => 'pa', '筢' => 'pa', '舥' => 'pa', '葩' => 'pa', '袙' => 'pa', '趴' => 'pa', '䯲' => 'pa', '䶕' => 'pa',
+ '啬' => 'se', '嗇' => 'se', '懎' => 'se', '擌' => 'se', '栜' => 'se', '槮' => 'se', '歮' => 'se', '歰' => 'se', '洓' => 'se', '涩' => 'se', '渋' => 'se', '澀' => 'se', '澁' => 'se', '濇' => 'se', '濏' => 'se', '瀒' => 'se', '琗' => 'se', '瑟' => 'se', '璱' => 'se', '瘷' => 'se', '穑' => 'se', '穡' => 'se', '穯' => 'se', '篸' => 'se', '縇' => 'se', '繬' => 'se', '聓' => 'se', '色' => 'se', '裇' => 'se', '襂' => 'se', '譅' => 'se', '轖' => 'se', '銫' => 'se', '鏼' => 'se', '铯' => 'se', '閪' => 'se', '雭' => 'se', '飋' => 'se', '鬙' => 'se', '㒊' => 'se', '㥶' => 'se', '㮦' => 'se', '㱇' => 'se', '㴔' => 'se', '㻭' => 'se', '䉢' => 'se', '䔼' => 'se', '䨛' => 'se',
+ '啮' => 'nie', '喦' => 'nie', '嗫' => 'nie', '噛' => 'nie', '嚙' => 'nie', '囁' => 'nie', '囓' => 'nie', '圼' => 'nie', '孼' => 'nie', '孽' => 'nie', '嵲' => 'nie', '嶭' => 'nie', '巕' => 'nie', '帇' => 'nie', '惗' => 'nie', '捏' => 'nie', '揑' => 'nie', '摰' => 'nie', '敜' => 'nie', '枿' => 'nie', '槷' => 'nie', '櫱' => 'nie', '涅' => 'nie', '篞' => 'nie', '籋' => 'nie', '糱' => 'nie', '糵' => 'nie', '聂' => 'nie', '聶' => 'nie', '肀' => 'nie', '臬' => 'nie', '臲' => 'nie', '苶' => 'nie', '菍' => 'nie', '蘖' => 'nie', '蠥' => 'nie', '讘' => 'nie', '踂' => 'nie', '踗' => 'nie', '踙' => 'nie', '蹑' => 'nie', '躡' => 'nie', '鉩' => 'nie', '錜' => 'nie', '鎳' => 'nie', '鑷' => 'nie', '钀' => 'nie', '镊' => 'nie', '镍' => 'nie', '闑' => 'nie', '陧' => 'nie', '隉' => 'nie', '顳' => 'nie', '颞' => 'nie', '齧' => 'nie', '㖖' => 'nie', '㘿' => 'nie', '㙞' => 'nie', '㚔' => 'nie', '㜸' => 'nie', '㡪' => 'nie', '㩶' => 'nie', '㮆' => 'nie', '㴪' => 'nie', '㸎' => 'nie', '䂼' => 'nie', '䄒' => 'nie', '䌜' => 'nie', '䜓' => 'nie', '䯀' => 'nie', '䯅' => 'nie', '䯵' => 'nie',
+ '啱' => 'n', '嗯' => 'n', '莻' => 'n', '鈪' => 'n', '銰' => 'n', '㐻' => 'n',
+ '喎' => 'wai', '外' => 'wai', '崴' => 'wai', '歪' => 'wai', '竵' => 'wai', '顡' => 'wai', '㖞' => 'wai', '䠿' => 'wai',
+ '喵' => 'miao', '妙' => 'miao', '媌' => 'miao', '嫹' => 'miao', '庙' => 'miao', '庿' => 'miao', '廟' => 'miao', '描' => 'miao', '杪' => 'miao', '淼' => 'miao', '渺' => 'miao', '玅' => 'miao', '眇' => 'miao', '瞄' => 'miao', '秒' => 'miao', '竗' => 'miao', '篎' => 'miao', '緲' => 'miao', '缈' => 'miao', '苗' => 'miao', '藐' => 'miao', '邈' => 'miao', '鱙' => 'miao', '鶓' => 'miao', '鹋' => 'miao', '㑤' => 'miao', '㠺' => 'miao', '㦝' => 'miao', '䁧' => 'miao', '䅺' => 'miao', '䖢' => 'miao',
+ '嗍' => 'shuo', '妁' => 'shuo', '搠' => 'shuo', '朔' => 'shuo', '槊' => 'shuo', '欶' => 'shuo', '烁' => 'shuo', '爍' => 'shuo', '獡' => 'shuo', '矟' => 'shuo', '硕' => 'shuo', '碩' => 'shuo', '箾' => 'shuo', '蒴' => 'shuo', '说' => 'shuo', '鎙' => 'shuo', '鑠' => 'shuo', '铄' => 'shuo', '䀥' => 'shuo', '䈾' => 'shuo', '䌃' => 'shuo',
+ '嗲' => 'dia',
+ '嘈' => 'cao', '嶆' => 'cao', '愺' => 'cao', '懆' => 'cao', '撡' => 'cao', '操' => 'cao', '曹' => 'cao', '曺' => 'cao', '槽' => 'cao', '漕' => 'cao', '糙' => 'cao', '肏' => 'cao', '艚' => 'cao', '艸' => 'cao', '艹' => 'cao', '草' => 'cao', '蓸' => 'cao', '螬' => 'cao', '褿' => 'cao', '襙' => 'cao', '鄵' => 'cao', '鏪' => 'cao', '騲' => 'cao', '鼜' => 'cao', '㜖' => 'cao', '㯥' => 'cao', '䄚' => 'cao', '䏆' => 'cao', '䐬' => 'cao', '䒃' => 'cao', '䒑' => 'cao',
+ '嘚' => 'de', '得' => 'de', '徳' => 'de', '德' => 'de', '恴' => 'de', '悳' => 'de', '惪' => 'de', '淂' => 'de', '的' => 'de', '鍀' => 'de', '锝' => 'de', '㝵' => 'de', '㤫' => 'de', '㥀' => 'de', '㥁' => 'de', '㯖' => 'de', '䙷' => 'de', '䙸' => 'de',
+ '嘿' => 'hei', '嬒' => 'hei', '潶' => 'hei', '黑' => 'hei', '黒' => 'hei',
+ '噋' => 'kuo', '廓' => 'kuo', '懖' => 'kuo', '扩' => 'kuo', '拡' => 'kuo', '括' => 'kuo', '挄' => 'kuo', '擴' => 'kuo', '栝' => 'kuo', '桰' => 'kuo', '濶' => 'kuo', '穒' => 'kuo', '筈' => 'kuo', '萿' => 'kuo', '葀' => 'kuo', '蛞' => 'kuo', '闊' => 'kuo', '阔' => 'kuo', '霩' => 'kuo', '鞟' => 'kuo', '鞹' => 'kuo', '韕' => 'kuo', '頢' => 'kuo', '髺' => 'kuo', '鬠' => 'kuo', '㗥' => 'kuo', '䟯' => 'kuo', '䦢' => 'kuo', '䯺' => 'kuo',
+ '嚓' => 'ca', '囃' => 'ca', '擦' => 'ca', '攃' => 'ca', '礤' => 'ca', '礸' => 'ca', '遪' => 'ca', '䟃' => 'ca', '䵽' => 'ca',
+ '嚽' => 'chuo', '娕' => 'chuo', '娖' => 'chuo', '惙' => 'chuo', '戳' => 'chuo', '擉' => 'chuo', '歠' => 'chuo', '涰' => 'chuo', '磭' => 'chuo', '綽' => 'chuo', '绰' => 'chuo', '腏' => 'chuo', '趠' => 'chuo', '踔' => 'chuo', '輟' => 'chuo', '辍' => 'chuo', '辵' => 'chuo', '辶' => 'chuo', '逴' => 'chuo', '酫' => 'chuo', '鑡' => 'chuo', '齪' => 'chuo', '齱' => 'chuo', '龊' => 'chuo', '㚟' => 'chuo', '㲋' => 'chuo', '䂐' => 'chuo', '䃗' => 'chuo', '䄪' => 'chuo', '䆯' => 'chuo', '䇍' => 'chuo', '䋘' => 'chuo', '䍳' => 'chuo', '䓎' => 'chuo', '䮕' => 'chuo',
+ '囎' => 'zen', '怎' => 'zen', '譖' => 'zen', '譛' => 'zen', '谮' => 'zen', '䫈' => 'zen',
+ '囜' => 'nin', '您' => 'nin', '拰' => 'nin', '脌' => 'nin', '㤛' => 'nin', '䋻' => 'nin', '䚾' => 'nin', '䛘' => 'nin',
+ '困' => 'kun', '坤' => 'kun', '堃' => 'kun', '堒' => 'kun', '壸' => 'kun', '壼' => 'kun', '婫' => 'kun', '尡' => 'kun', '崐' => 'kun', '崑' => 'kun', '悃' => 'kun', '捆' => 'kun', '昆' => 'kun', '晜' => 'kun', '梱' => 'kun', '涃' => 'kun', '潉' => 'kun', '焜' => 'kun', '熴' => 'kun', '猑' => 'kun', '琨' => 'kun', '瑻' => 'kun', '睏' => 'kun', '硱' => 'kun', '祵' => 'kun', '稇' => 'kun', '稛' => 'kun', '綑' => 'kun', '臗' => 'kun', '菎' => 'kun', '蜫' => 'kun', '裈' => 'kun', '裍' => 'kun', '裩' => 'kun', '褌' => 'kun', '醌' => 'kun', '錕' => 'kun', '锟' => 'kun', '閫' => 'kun', '閸' => 'kun', '阃' => 'kun', '騉' => 'kun', '髠' => 'kun', '髡' => 'kun', '髨' => 'kun', '鯤' => 'kun', '鲲' => 'kun', '鵾' => 'kun', '鶤' => 'kun', '鹍' => 'kun', '㩲' => 'kun', '㫻' => 'kun', '䠅' => 'kun',
+ '囷' => 'qun', '夋' => 'qun', '宭' => 'qun', '峮' => 'qun', '帬' => 'qun', '羣' => 'qun', '群' => 'qun', '裙' => 'qun', '裠' => 'qun', '輑' => 'qun', '逡' => 'qun', '㪊' => 'qun', '㿏' => 'qun', '䭽' => 'qun',
+ '囸' => 'ri', '日' => 'ri', '釰' => 'ri', '鈤' => 'ri', '馹' => 'ri', '驲' => 'ri', '䒤' => 'ri',
+ '圙' => 'lve', '擽' => 'lve', '畧' => 'lve', '稤' => 'lve', '稥' => 'lve', '鋝' => 'lve', '鋢' => 'lve', '锊' => 'lve', '㑼' => 'lve', '㔀' => 'lve', '㨼' => 'lve', '䂮' => 'lve', '䌎' => 'lve', '䛚' => 'lve', '䤣' => 'lve',
+ '坠' => 'zhui', '墜' => 'zhui', '娷' => 'zhui', '惴' => 'zhui', '椎' => 'zhui', '沝' => 'zhui', '甀' => 'zhui', '畷' => 'zhui', '硾' => 'zhui', '礈' => 'zhui', '笍' => 'zhui', '綴' => 'zhui', '縋' => 'zhui', '缀' => 'zhui', '缒' => 'zhui', '膇' => 'zhui', '諈' => 'zhui', '贅' => 'zhui', '赘' => 'zhui', '轛' => 'zhui', '追' => 'zhui', '醊' => 'zhui', '錐' => 'zhui', '錣' => 'zhui', '鑆' => 'zhui', '锥' => 'zhui', '隹' => 'zhui', '餟' => 'zhui', '騅' => 'zhui', '骓' => 'zhui', '鵻' => 'zhui', '䄌' => 'zhui',
+ '垳' => 'hang', '夯' => 'hang', '妔' => 'hang', '斻' => 'hang', '杭' => 'hang', '沆' => 'hang', '笐' => 'hang', '筕' => 'hang', '絎' => 'hang', '绗' => 'hang', '航' => 'hang', '苀' => 'hang', '蚢' => 'hang', '貥' => 'hang', '迒' => 'hang', '頏' => 'hang', '颃' => 'hang', '魧' => 'hang', '㤚' => 'hang', '䀪' => 'hang', '䘕' => 'hang', '䟘' => 'hang', '䣈' => 'hang', '䦳' => 'hang', '䲳' => 'hang', '䴂' => 'hang',
+ '埽' => 'sao', '嫂' => 'sao', '慅' => 'sao', '扫' => 'sao', '掃' => 'sao', '掻' => 'sao', '搔' => 'sao', '氉' => 'sao', '溞' => 'sao', '瘙' => 'sao', '矂' => 'sao', '繅' => 'sao', '缫' => 'sao', '臊' => 'sao', '颾' => 'sao', '騒' => 'sao', '騷' => 'sao', '骚' => 'sao', '髞' => 'sao', '鰠' => 'sao', '鱢' => 'sao', '鳋' => 'sao', '㛮' => 'sao', '㿋' => 'sao', '䐹' => 'sao', '䕅' => 'sao', '䖣' => 'sao',
+ '塟' => 'zang', '奘' => 'zang', '弉' => 'zang', '牂' => 'zang', '羘' => 'zang', '脏' => 'zang', '臓' => 'zang', '臟' => 'zang', '臧' => 'zang', '葬' => 'zang', '賍' => 'zang', '賘' => 'zang', '贓' => 'zang', '贜' => 'zang', '赃' => 'zang', '銺' => 'zang', '駔' => 'zang', '驵' => 'zang', '髒' => 'zang', '㘸' => 'zang',
+ '増' => 'zeng', '增' => 'zeng', '憎' => 'zeng', '曽' => 'zeng', '曾' => 'zeng', '橧' => 'zeng', '熷' => 'zeng', '璔' => 'zeng', '甑' => 'zeng', '矰' => 'zeng', '磳' => 'zeng', '繒' => 'zeng', '缯' => 'zeng', '罾' => 'zeng', '譄' => 'zeng', '贈' => 'zeng', '赠' => 'zeng', '鄫' => 'zeng', '鋥' => 'zeng', '锃' => 'zeng', '鱛' => 'zeng', '㽪' => 'zeng', '䙢' => 'zeng', '䰝' => 'zeng',
+ '奀' => 'en', '峎' => 'en', '恩' => 'en', '摁' => 'en', '煾' => 'en', '蒽' => 'en', '䅰' => 'en', '䊐' => 'en', '䬶' => 'en', '䭓' => 'en', '䭡' => 'en',
+ '奏' => 'zou', '媰' => 'zou', '掫' => 'zou', '揍' => 'zou', '棷' => 'zou', '棸' => 'zou', '箃' => 'zou', '緅' => 'zou', '菆' => 'zou', '諏' => 'zou', '诹' => 'zou', '走' => 'zou', '赱' => 'zou', '邹' => 'zou', '郰' => 'zou', '鄒' => 'zou', '鄹' => 'zou', '陬' => 'zou', '騶' => 'zou', '驺' => 'zou', '鯐' => 'zou', '鯫' => 'zou', '鲰' => 'zou', '黀' => 'zou', '齺' => 'zou', '㔿' => 'zou', '㵵' => 'zou', '䠫' => 'zou',
+ '女' => 'nv', '恧' => 'nv', '朒' => 'nv', '籹' => 'nv', '衂' => 'nv', '衄' => 'nv', '釹' => 'nv', '钕' => 'nv', '㵖' => 'nv', '䖡' => 'nv', '䘐' => 'nv', '䚼' => 'nv', '䶊' => 'nv',
+ '奻' => 'nuan', '暖' => 'nuan', '渜' => 'nuan', '煖' => 'nuan', '煗' => 'nuan', '餪' => 'nuan', '㬉' => 'nuan', '䎡' => 'nuan', '䙇' => 'nuan',
+ '妞' => 'niu', '忸' => 'niu', '扭' => 'niu', '杻' => 'niu', '汼' => 'niu', '沑' => 'niu', '炄' => 'niu', '牛' => 'niu', '牜' => 'niu', '狃' => 'niu', '紐' => 'niu', '纽' => 'niu', '莥' => 'niu', '鈕' => 'niu', '钮' => 'niu', '靵' => 'niu', '㺲' => 'niu', '䀔' => 'niu', '䋴' => 'niu', '䏔' => 'niu', '䒜' => 'niu',
+ '娆' => 'rao', '嬈' => 'rao', '扰' => 'rao', '擾' => 'rao', '桡' => 'rao', '橈' => 'rao', '犪' => 'rao', '繞' => 'rao', '绕' => 'rao', '荛' => 'rao', '蕘' => 'rao', '襓' => 'rao', '遶' => 'rao', '隢' => 'rao', '饒' => 'rao', '饶' => 'rao', '㑱' => 'rao', '㹛' => 'rao', '䫞' => 'rao',
+ '娘' => 'niang', '嬢' => 'niang', '孃' => 'niang', '酿' => 'niang', '醸' => 'niang', '釀' => 'niang', '䖆' => 'niang',
+ '嫋' => 'niao', '嬝' => 'niao', '嬲' => 'niao', '尿' => 'niao', '脲' => 'niao', '茑' => 'niao', '茒' => 'niao', '蔦' => 'niao', '袅' => 'niao', '裊' => 'niao', '褭' => 'niao', '鳥' => 'niao', '鸟' => 'niao', '㒟' => 'niao', '㜵' => 'niao', '㞙' => 'niao', '㠡' => 'niao', '㭤' => 'niao', '㳮' => 'niao', '䃵' => 'niao', '䐁' => 'niao', '䙚' => 'niao', '䦊' => 'niao', '䮍' => 'niao',
+ '嫩' => 'nen', '㜛' => 'nen', '㯎' => 'nen', '㶧' => 'nen',
+ '孙' => 'sun', '孫' => 'sun', '巺' => 'sun', '损' => 'sun', '損' => 'sun', '搎' => 'sun', '榫' => 'sun', '槂' => 'sun', '潠' => 'sun', '狲' => 'sun', '猻' => 'sun', '畃' => 'sun', '笋' => 'sun', '筍' => 'sun', '箰' => 'sun', '簨' => 'sun', '荪' => 'sun', '蓀' => 'sun', '蕵' => 'sun', '薞' => 'sun', '鎨' => 'sun', '隼' => 'sun', '飧' => 'sun', '飱' => 'sun', '鶽' => 'sun', '㔼' => 'sun', '㡄' => 'sun', '㦏' => 'sun', '䁚' => 'sun',
+ '宽' => 'kuan', '寛' => 'kuan', '寬' => 'kuan', '梡' => 'kuan', '欵' => 'kuan', '款' => 'kuan', '歀' => 'kuan', '窽' => 'kuan', '窾' => 'kuan', '鑧' => 'kuan', '髋' => 'kuan', '髖' => 'kuan', '㯘' => 'kuan', '䕀' => 'kuan', '䤭' => 'kuan', '䥗' => 'kuan', '䲌' => 'kuan',
+ '岃' => 'yen', '膶' => 'yen',
+ '岇' => 'ang', '昂' => 'ang', '昻' => 'ang', '枊' => 'ang', '盎' => 'ang', '肮' => 'ang', '醠' => 'ang', '骯' => 'ang', '㦹' => 'ang', '㭿' => 'ang', '㼜' => 'ang', '䀚' => 'ang', '䍩' => 'ang', '䒢' => 'ang', '䩕' => 'ang', '䭹' => 'ang', '䭺' => 'ang',
+ '岑' => 'cen', '嵾' => 'cen', '梣' => 'cen', '涔' => 'cen', '笒' => 'cen', '膥' => 'cen', '㞥' => 'cen', '㻸' => 'cen', '䃡' => 'cen', '䅾' => 'cen', '䤁' => 'cen', '䨙' => 'cen', '䯔' => 'cen', '䲋' => 'cen',
+ '巑' => 'cuan', '撺' => 'cuan', '攅' => 'cuan', '攛' => 'cuan', '櫕' => 'cuan', '欑' => 'cuan', '殩' => 'cuan', '汆' => 'cuan', '熶' => 'cuan', '爨' => 'cuan', '穳' => 'cuan', '窜' => 'cuan', '竄' => 'cuan', '篡' => 'cuan', '篹' => 'cuan', '簒' => 'cuan', '蹿' => 'cuan', '躥' => 'cuan', '鑹' => 'cuan', '㠝' => 'cuan', '㭫' => 'cuan', '㵀' => 'cuan', '㸑' => 'cuan', '䆘' => 'cuan', '䰖' => 'cuan',
+ '忑' => 'te', '忒' => 'te', '慝' => 'te', '特' => 'te', '犆' => 'te', '脦' => 'te', '蟘' => 'te', '貣' => 'te', '鋱' => 'te', '铽' => 'te', '㥂' => 'te', '㧹' => 'te',
+ '惹' => 're', '热' => 're', '熱' => 're',
+ '扥' => 'den', '扽' => 'den', '揼' => 'den',
+ '抓' => 'zhua', '檛' => 'zhua', '爪' => 'zhua', '簻' => 'zhua', '膼' => 'zhua', '髽' => 'zhua',
+ '拴' => 'shuan', '栓' => 'shuan', '涮' => 'shuan', '腨' => 'shuan', '閂' => 'shuan', '闩' => 'shuan', '䧠' => 'shuan',
+ '拽' => 'zhuai', '跩' => 'zhuai',
+ '掠' => 'lue', '略' => 'lue',
+ '晒' => 'shai', '曬' => 'shai', '筛' => 'shai', '篩' => 'shai', '簁' => 'shai', '簛' => 'shai', '㩄' => 'shai', '㬠' => 'shai',
+ '森' => 'sen',
+ '橍' => 'run', '润' => 'run', '潤' => 'run', '閏' => 'run', '閠' => 'run', '闰' => 'run', '㠈' => 'run', '䦞' => 'run',
+ '疟' => 'nue', '虐' => 'nue',
+ '瘧' => 'nve', '䖈' => 'nve', '䖋' => 'nve', '䨋' => 'nve',
+ '給' => 'gei', '给' => 'gei',
+ '繆' => 'miu', '缪' => 'miu', '謬' => 'miu', '谬' => 'miu',
+ '能' => 'neng', '㲌' => 'neng', '㴰' => 'neng', '䏻' => 'neng',
+ '蠈' => 'zei', '賊' => 'zei', '贼' => 'zei', '鰂' => 'zei', '鱡' => 'zei', '鲗' => 'zei',
+ '覅' => 'fiao',
+ '鞥' => 'eng',
+ '㕶' => 'ng',
+ '䫄' => 'chua',
+ ];
+
+ /**
+ * 中文转拼音
+ *
+ * @param string $str utf8字符串
+ * @param string $type 返回格式 [all:全拼音|first:首字母|one:仅第一字符首字母]
+ * @param string $placeholder 无法识别的字符占位符
+ * @param string $allow_chars 允许的非中文字符
+ * @return string 拼音字符串
+ */
+ public function format($str, $type = 'all', $placeholder = '_', $allow_chars = '/[a-zA-Z\d .]/')
+ {
+ $str = trim($str);
+ $len = mb_strlen($str, 'UTF-8');
+ $rs = '';
+ for ($i = 0; $i < $len; $i++) {
+ $chr = mb_substr($str, $i, 1, 'UTF-8');
+ $asc = ord($chr);
+ // 0-127
+ if ($asc < 0x80) {
+ // 用参数控制正则
+ if (preg_match($allow_chars, $chr)) {
+ // 0-9 a-z A-Z 空格
+ $rs .= $chr;
+ } else {
+ // 其他字符用填充符代替
+ $rs .= $placeholder;
+ }
+ } else {
+ // 128-255
+ if (isset($this->pinyins[$chr])) {
+ $rs .= 'first' === $type ? $this->pinyins[$chr][0] . ' ' : ($this->pinyins[$chr] . ' ');
+ } else {
+ $rs .= $placeholder;
+ }
+ }
+
+ if ('one' === $type && '' !== $rs) {
+ return $rs[0];
+ }
+ }
+
+ return rtrim($rs, ' ');
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Qrcode.php b/vendor/mongdch/mon-util/src/Qrcode.php
new file mode 100644
index 0000000..8e181eb
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Qrcode.php
@@ -0,0 +1,3076 @@
+
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Version: 1.1.4
+ * Build: 2010100721
+ */
+
+
+// Encoding modes
+define('QR_MODE_NUL', -1);
+define('QR_MODE_NUM', 0);
+define('QR_MODE_AN', 1);
+define('QR_MODE_8', 2);
+define('QR_MODE_KANJI', 3);
+define('QR_MODE_STRUCTURE', 4);
+
+// Levels of error correction.
+define('QR_ECLEVEL_L', 0);
+define('QR_ECLEVEL_M', 1);
+define('QR_ECLEVEL_Q', 2);
+define('QR_ECLEVEL_H', 3);
+
+// Supported output formats
+define('QR_FORMAT_TEXT', 0);
+define('QR_FORMAT_PNG', 1);
+
+// merged_config.php
+define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there
+define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true
+define('QR_LOG_DIR', false); // default error logs dir
+define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
+define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
+
+
+define('QRSPEC_VERSION_MAX', 40);
+define('QRSPEC_WIDTH_MAX', 177);
+
+define('QRCAP_WIDTH', 0);
+define('QRCAP_WORDS', 1);
+define('QRCAP_REMINDER', 2);
+define('QRCAP_EC', 3);
+
+
+define('STRUCTURE_HEADER_BITS', 20);
+define('MAX_STRUCTURED_SYMBOLS', 16);
+
+
+define('QR_IMAGE', true);
+
+
+define('N1', 3);
+define('N2', 3);
+define('N3', 40);
+define('N4', 10);
+
+
+
+/**
+ * 二维码实体类
+ */
+class QRcode
+{
+ public $version;
+ public $width;
+ public $data;
+
+ //----------------------------------------------------------------------
+ public function encodeMask(QRinput $input, $mask)
+ {
+ if ($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {
+ throw new Exception('wrong version');
+ }
+ if ($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
+ throw new Exception('wrong level');
+ }
+
+ $raw = new QRrawcode($input);
+
+ QRtools::markTime('after_raw');
+
+ $version = $raw->version;
+ $width = QRspec::getWidth($version);
+ $frame = QRspec::newFrame($version);
+
+ $filler = new FrameFiller($width, $frame);
+ if (is_null($filler)) {
+ return NULL;
+ }
+
+ // inteleaved data and ecc codes
+ for ($i = 0; $i < $raw->dataLength + $raw->eccLength; $i++) {
+ $code = $raw->getCode();
+ $bit = 0x80;
+ for ($j = 0; $j < 8; $j++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+
+ QRtools::markTime('after_filler');
+
+ unset($raw);
+
+ // remainder bits
+ $j = QRspec::getRemainder($version);
+ for ($i = 0; $i < $j; $i++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02);
+ }
+
+ $frame = $filler->frame;
+ unset($filler);
+
+
+ // masking
+ $maskObj = new QRmask();
+ if ($mask < 0) {
+
+ if (QR_FIND_BEST_MASK) {
+ $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
+ }
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
+ }
+
+ if ($masked == NULL) {
+ return NULL;
+ }
+
+ QRtools::markTime('after_mask');
+
+ $this->version = $version;
+ $this->width = $width;
+ $this->data = $masked;
+
+ return $this;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeInput(QRinput $input)
+ {
+ return $this->encodeMask($input, -1);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString8bit($string, $version, $level)
+ {
+ if ($string == NULL) {
+ throw new Exception('empty string!');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if ($input == NULL) return NULL;
+
+ $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));
+ if ($ret < 0) {
+ unset($input);
+ return NULL;
+ }
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString($string, $version, $level, $hint, $casesensitive)
+ {
+
+ if ($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
+ throw new Exception('bad hint');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if ($input == NULL) return NULL;
+
+ $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
+ if ($ret < 0) {
+ return NULL;
+ }
+
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 6, $margin = 2, $saveandprint = false)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodePNG($text, $outfile, $saveandprint);
+ }
+
+ //----------------------------------------------------------------------
+ public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 6, $margin = 2)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encode($text, $outfile);
+ }
+
+ //----------------------------------------------------------------------
+ public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 6, $margin = 2)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodeRAW($text, $outfile);
+ }
+}
+
+//##########################################################################
+
+class qrstr
+{
+ public static function set(&$srctab, $x, $y, $repl, $replLen = false)
+ {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false) ? substr($repl, 0, $replLen) : $repl, $x, ($replLen !== false) ? $replLen : strlen($repl));
+ }
+}
+
+
+class QRtools
+{
+ // Frame ---------------------------------------------------------------
+ // Cache of initial frames.
+
+ public static $frames = array();
+
+ //----------------------------------------------------------------------
+ public static function binarize($frame)
+ {
+ $len = count($frame);
+ foreach ($frame as &$frameLine) {
+
+ for ($i = 0; $i < $len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i]) & 1) ? '1' : '0';
+ }
+ }
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
+ {
+ $barcode_array = array();
+
+ if (!is_array($mode))
+ $mode = explode(',', $mode);
+
+ $eccLevel = 'L';
+
+ if (count($mode) > 1) {
+ $eccLevel = $mode[1];
+ }
+
+ $qrTab = QRcode::text($code, false, $eccLevel);
+ $size = count($qrTab);
+
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach (str_split($line) as $char)
+ $arrAdd[] = ($char == '1') ? 1 : 0;
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+
+ return $barcode_array;
+ }
+
+ //----------------------------------------------------------------------
+ public static function clearCache()
+ {
+ self::$frames = array();
+ }
+
+ //----------------------------------------------------------------------
+ public static function buildCache()
+ {
+ QRtools::markTime('before_build_cache');
+
+ $mask = new QRmask();
+ for ($a = 1; $a <= QRSPEC_VERSION_MAX; $a++) {
+ $frame = QRspec::newFrame($a);
+ if (QR_IMAGE) {
+ $fileName = QR_CACHE_DIR . 'frame_' . $a . '.png';
+ QRimage::png(self::binarize($frame), $fileName, 1, 0);
+ }
+
+ $width = count($frame);
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($maskNo = 0; $maskNo < 8; $maskNo++)
+ $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
+ }
+
+ QRtools::markTime('after_build_cache');
+ }
+
+ //----------------------------------------------------------------------
+ public static function log($outfile, $err)
+ {
+ if (QR_LOG_DIR !== false) {
+ if ($err != '') {
+ if ($outfile !== false) {
+ file_put_contents(QR_LOG_DIR . basename($outfile) . '-errors.txt', date('Y-m-d H:i:s') . ': ' . $err, FILE_APPEND);
+ } else {
+ file_put_contents(QR_LOG_DIR . 'errors.txt', date('Y-m-d H:i:s') . ': ' . $err, FILE_APPEND);
+ }
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function dumpMask($frame)
+ {
+ $width = count($frame);
+ for ($y = 0; $y < $width; $y++) {
+ for ($x = 0; $x < $width; $x++) {
+ echo ord($frame[$y][$x]) . ',';
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function markTime($markerId)
+ {
+ list($usec, $sec) = explode(" ", microtime());
+ $time = ((float)$usec + (float)$sec);
+
+ if (!isset($GLOBALS['qr_time_bench']))
+ $GLOBALS['qr_time_bench'] = array();
+
+ $GLOBALS['qr_time_bench'][$markerId] = $time;
+ }
+
+ //----------------------------------------------------------------------
+ public static function timeBenchmark()
+ {
+ self::markTime('finish');
+
+ $lastTime = 0;
+ $startTime = 0;
+ $p = 0;
+
+ echo '
+ BENCHMARK |
+ ';
+
+ foreach ($GLOBALS['qr_time_bench'] as $markerId => $thisTime) {
+ if ($p > 0) {
+ echo 'till ' . $markerId . ': | ' . number_format($thisTime - $lastTime, 6) . 's |
';
+ } else {
+ $startTime = $thisTime;
+ }
+
+ $p++;
+ $lastTime = $thisTime;
+ }
+
+ echo '
+ TOTAL: | ' . number_format($lastTime - $startTime, 6) . 's |
+
+
';
+ }
+}
+
+//##########################################################################
+
+QRtools::markTime('start');
+
+
+class QRspec
+{
+ public static $capacity = array(
+ array(0, 0, 0, array(0, 0, 0, 0)),
+ array(21, 26, 0, array(7, 10, 13, 17)), // 1
+ array(25, 44, 7, array(10, 16, 22, 28)),
+ array(29, 70, 7, array(15, 26, 36, 44)),
+ array(33, 100, 7, array(20, 36, 52, 64)),
+ array(37, 134, 7, array(26, 48, 72, 88)), // 5
+ array(41, 172, 7, array(36, 64, 96, 112)),
+ array(45, 196, 0, array(40, 72, 108, 130)),
+ array(49, 242, 0, array(48, 88, 132, 156)),
+ array(53, 292, 0, array(60, 110, 160, 192)),
+ array(57, 346, 0, array(72, 130, 192, 224)), //10
+ array(61, 404, 0, array(80, 150, 224, 264)),
+ array(65, 466, 0, array(96, 176, 260, 308)),
+ array(69, 532, 0, array(104, 198, 288, 352)),
+ array(73, 581, 3, array(120, 216, 320, 384)),
+ array(77, 655, 3, array(132, 240, 360, 432)), //15
+ array(81, 733, 3, array(144, 280, 408, 480)),
+ array(85, 815, 3, array(168, 308, 448, 532)),
+ array(89, 901, 3, array(180, 338, 504, 588)),
+ array(93, 991, 3, array(196, 364, 546, 650)),
+ array(97, 1085, 3, array(224, 416, 600, 700)), //20
+ array(101, 1156, 4, array(224, 442, 644, 750)),
+ array(105, 1258, 4, array(252, 476, 690, 816)),
+ array(109, 1364, 4, array(270, 504, 750, 900)),
+ array(113, 1474, 4, array(300, 560, 810, 960)),
+ array(117, 1588, 4, array(312, 588, 870, 1050)), //25
+ array(121, 1706, 4, array(336, 644, 952, 1110)),
+ array(125, 1828, 4, array(360, 700, 1020, 1200)),
+ array(129, 1921, 3, array(390, 728, 1050, 1260)),
+ array(133, 2051, 3, array(420, 784, 1140, 1350)),
+ array(137, 2185, 3, array(450, 812, 1200, 1440)), //30
+ array(141, 2323, 3, array(480, 868, 1290, 1530)),
+ array(145, 2465, 3, array(510, 924, 1350, 1620)),
+ array(149, 2611, 3, array(540, 980, 1440, 1710)),
+ array(153, 2761, 3, array(570, 1036, 1530, 1800)),
+ array(157, 2876, 0, array(570, 1064, 1590, 1890)), //35
+ array(161, 3034, 0, array(600, 1120, 1680, 1980)),
+ array(165, 3196, 0, array(630, 1204, 1770, 2100)),
+ array(169, 3362, 0, array(660, 1260, 1860, 2220)),
+ array(173, 3532, 0, array(720, 1316, 1950, 2310)),
+ array(177, 3706, 0, array(750, 1372, 2040, 2430)) //40
+ );
+
+ //----------------------------------------------------------------------
+ public static function getDataLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getECCLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getWidth($version)
+ {
+ return self::$capacity[$version][QRCAP_WIDTH];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getRemainder($version)
+ {
+ return self::$capacity[$version][QRCAP_REMINDER];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getMinimumVersion($size, $level)
+ {
+
+ for ($i = 1; $i <= QRSPEC_VERSION_MAX; $i++) {
+ $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
+ if ($words >= $size)
+ return $i;
+ }
+
+ return -1;
+ }
+
+ //######################################################################
+
+ public static $lengthTableBits = array(
+ array(10, 12, 14),
+ array(9, 11, 13),
+ array(8, 16, 16),
+ array(8, 10, 12)
+ );
+
+ //----------------------------------------------------------------------
+ public static function lengthIndicator($mode, $version)
+ {
+ if ($mode == QR_MODE_STRUCTURE)
+ return 0;
+
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ return self::$lengthTableBits[$mode][$l];
+ }
+
+ //----------------------------------------------------------------------
+ public static function maximumWords($mode, $version)
+ {
+ if ($mode == QR_MODE_STRUCTURE)
+ return 3;
+
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ $bits = self::$lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+
+ if ($mode == QR_MODE_KANJI) {
+ $words *= 2; // the number of bytes is required
+ }
+
+ return $words;
+ }
+
+ // Error correction code -----------------------------------------------
+ // Table of the error correction code (Reed-Solomon block)
+ // See Table 12-16 (pp.30-36), JIS X0510:2004.
+
+ public static $eccTable = array(
+ array(array(0, 0), array(0, 0), array(0, 0), array(0, 0)),
+ array(array(1, 0), array(1, 0), array(1, 0), array(1, 0)), // 1
+ array(array(1, 0), array(1, 0), array(1, 0), array(1, 0)),
+ array(array(1, 0), array(1, 0), array(2, 0), array(2, 0)),
+ array(array(1, 0), array(2, 0), array(2, 0), array(4, 0)),
+ array(array(1, 0), array(2, 0), array(2, 2), array(2, 2)), // 5
+ array(array(2, 0), array(4, 0), array(4, 0), array(4, 0)),
+ array(array(2, 0), array(4, 0), array(2, 4), array(4, 1)),
+ array(array(2, 0), array(2, 2), array(4, 2), array(4, 2)),
+ array(array(2, 0), array(3, 2), array(4, 4), array(4, 4)),
+ array(array(2, 2), array(4, 1), array(6, 2), array(6, 2)), //10
+ array(array(4, 0), array(1, 4), array(4, 4), array(3, 8)),
+ array(array(2, 2), array(6, 2), array(4, 6), array(7, 4)),
+ array(array(4, 0), array(8, 1), array(8, 4), array(12, 4)),
+ array(array(3, 1), array(4, 5), array(11, 5), array(11, 5)),
+ array(array(5, 1), array(5, 5), array(5, 7), array(11, 7)), //15
+ array(array(5, 1), array(7, 3), array(15, 2), array(3, 13)),
+ array(array(1, 5), array(10, 1), array(1, 15), array(2, 17)),
+ array(array(5, 1), array(9, 4), array(17, 1), array(2, 19)),
+ array(array(3, 4), array(3, 11), array(17, 4), array(9, 16)),
+ array(array(3, 5), array(3, 13), array(15, 5), array(15, 10)), //20
+ array(array(4, 4), array(17, 0), array(17, 6), array(19, 6)),
+ array(array(2, 7), array(17, 0), array(7, 16), array(34, 0)),
+ array(array(4, 5), array(4, 14), array(11, 14), array(16, 14)),
+ array(array(6, 4), array(6, 14), array(11, 16), array(30, 2)),
+ array(array(8, 4), array(8, 13), array(7, 22), array(22, 13)), //25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),
+ array(array(8, 4), array(22, 3), array(8, 26), array(12, 28)),
+ array(array(3, 10), array(3, 23), array(4, 31), array(11, 31)),
+ array(array(7, 7), array(21, 7), array(1, 37), array(19, 26)),
+ array(array(5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
+ array(array(13, 3), array(2, 29), array(42, 1), array(23, 28)),
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35
+ array(array(6, 14), array(6, 34), array(46, 10), array(2, 64)),
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),
+ array(array(4, 18), array(13, 32), array(48, 14), array(42, 32)),
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)), //40
+ );
+
+ //----------------------------------------------------------------------
+ // CACHEABLE!!!
+
+ public static function getEccSpec($version, $level, array &$spec)
+ {
+ if (count($spec) < 5) {
+ $spec = array(0, 0, 0, 0, 0);
+ }
+
+ $b1 = self::$eccTable[$version][$level][0];
+ $b2 = self::$eccTable[$version][$level][1];
+ $data = self::getDataLength($version, $level);
+ $ecc = self::getECCLength($version, $level);
+
+ if ($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ }
+
+ // Alignment pattern ---------------------------------------------------
+
+ // Positions of alignment patterns.
+ // This array includes only the second and the third position of the
+ // alignment patterns. Rest of them can be calculated from the distance
+ // between them.
+
+ // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+
+ public static $alignmentPattern = array(
+ array(0, 0),
+ array(0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
+ );
+
+
+ /** --------------------------------------------------------------------
+ * Put an alignment marker.
+ * @param frame
+ * @param width
+ * @param ox,oy center coordinate of the pattern
+ */
+ public static function putAlignmentMarker(array &$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+
+ $yStart = $oy - 2;
+ $xStart = $ox - 2;
+
+ for ($y = 0; $y < 5; $y++) {
+ QRstr::set($frame, $xStart, $yStart + $y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function putAlignmentPattern($version, &$frame, $width)
+ {
+ if ($version < 2)
+ return;
+
+ $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
+ if ($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);
+ }
+
+ if ($w * $w - 3 == 1) {
+ $x = self::$alignmentPattern[$version][0];
+ $y = self::$alignmentPattern[$version][0];
+ self::putAlignmentMarker($frame, $x, $y);
+ return;
+ }
+
+ $cx = self::$alignmentPattern[$version][0];
+ for ($x = 1; $x < $w - 1; $x++) {
+ self::putAlignmentMarker($frame, 6, $cx);
+ self::putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+
+ $cy = self::$alignmentPattern[$version][0];
+ for ($y = 0; $y < $w - 1; $y++) {
+ $cx = self::$alignmentPattern[$version][0];
+ for ($x = 0; $x < $w - 1; $x++) {
+ self::putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ }
+
+ // Version information pattern -----------------------------------------
+
+ // Version information pattern (BCH coded).
+ // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+
+ // size: [QRSPEC_VERSION_MAX - 6]
+
+ public static $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
+ 0x27541, 0x28c69
+ );
+
+ //----------------------------------------------------------------------
+ public static function getVersionPattern($version)
+ {
+ if ($version < 7 || $version > QRSPEC_VERSION_MAX)
+ return 0;
+
+ return self::$versionPattern[$version - 7];
+ }
+
+ // Format information --------------------------------------------------
+ // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)
+
+ public static $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
+ );
+
+ public static function getFormatInfo($mask, $level)
+ {
+ if ($mask < 0 || $mask > 7)
+ return 0;
+
+ if ($level < 0 || $level > 3)
+ return 0;
+
+ return self::$formatInfo[$level][$mask];
+ }
+
+ // Frame ---------------------------------------------------------------
+ // Cache of initial frames.
+
+ public static $frames = array();
+
+ /** --------------------------------------------------------------------
+ * Put a finder pattern.
+ * @param frame
+ * @param width
+ * @param ox,oy upper-left coordinate of the pattern
+ */
+ public static function putFinderPattern(&$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+
+ for ($y = 0; $y < 7; $y++) {
+ QRstr::set($frame, $ox, $oy + $y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function createFrame($version)
+ {
+ $width = self::$capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+
+ // Finder pattern
+ self::putFinderPattern($frame, 0, 0);
+ self::putFinderPattern($frame, $width - 7, 0);
+ self::putFinderPattern($frame, 0, $width - 7);
+
+ // Separator
+ $yOffset = $width - 7;
+
+ for ($y = 0; $y < 7; $y++) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ $yOffset++;
+ }
+
+ $setPattern = str_repeat("\xc0", 8);
+
+ QRstr::set($frame, 0, 7, $setPattern);
+ QRstr::set($frame, $width - 8, 7, $setPattern);
+ QRstr::set($frame, 0, $width - 8, $setPattern);
+
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ QRstr::set($frame, 0, 8, $setPattern);
+ QRstr::set($frame, $width - 8, 8, $setPattern, 8);
+
+ $yOffset = $width - 8;
+
+ for ($y = 0; $y < 8; $y++, $yOffset++) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+
+ // Timing pattern
+
+ for ($i = 1; $i < $width - 15; $i++) {
+ $frame[6][7 + $i] = chr(0x90 | ($i & 1));
+ $frame[7 + $i][6] = chr(0x90 | ($i & 1));
+ }
+
+ // Alignment pattern
+ self::putAlignmentPattern($version, $frame, $width);
+
+ // Version information
+ if ($version >= 7) {
+ $vinf = self::getVersionPattern($version);
+
+ $v = $vinf;
+
+ for ($x = 0; $x < 6; $x++) {
+ for ($y = 0; $y < 3; $y++) {
+ $frame[($width - 11) + $y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+
+ $v = $vinf;
+ for ($y = 0; $y < 6; $y++) {
+ for ($x = 0; $x < 3; $x++) {
+ $frame[$y][$x + ($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function debug($frame, $binary_mode = false)
+ {
+ if ($binary_mode) {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join(' ', explode('0', $frameLine));
+ $frameLine = join('██', explode('1', $frameLine));
+ }
+
+?>
+
+
';
+ echo join("
", $frame);
+ echo '
';
+ } else {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join(' ', explode("\xc0", $frameLine));
+ $frameLine = join('▒', explode("\xc1", $frameLine));
+ $frameLine = join(' ', explode("\xa0", $frameLine));
+ $frameLine = join('▒', explode("\xa1", $frameLine));
+ $frameLine = join('◇', explode("\x84", $frameLine)); //format 0
+ $frameLine = join('◆', explode("\x85", $frameLine)); //format 1
+ $frameLine = join('☢', explode("\x81", $frameLine)); //special bit
+ $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0
+ $frameLine = join('◷', explode("\x91", $frameLine)); //clock 1
+ $frameLine = join(' ', explode("\x88", $frameLine)); //version
+ $frameLine = join('▒', explode("\x89", $frameLine)); //version
+ $frameLine = join('♦', explode("\x01", $frameLine));
+ $frameLine = join('⋅', explode("\0", $frameLine));
+ }
+
+ ?>
+
+";
+ echo join("
", $frame);
+ echo "";
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($frame)
+ {
+ return gzcompress(join("\n", $frame), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ return explode("\n", gzuncompress($code));
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFrame($version)
+ {
+ if ($version < 1 || $version > QRSPEC_VERSION_MAX)
+ return null;
+
+ if (!isset(self::$frames[$version])) {
+
+ $fileName = QR_CACHE_DIR . 'frame_' . $version . '.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ self::$frames[$version] = self::unserial(file_get_contents($fileName));
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ file_put_contents($fileName, self::serial(self::$frames[$version]));
+ }
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ }
+ }
+
+ if (is_null(self::$frames[$version]))
+ return null;
+
+ return self::$frames[$version];
+ }
+
+ //----------------------------------------------------------------------
+ public static function rsBlockNum($spec)
+ {
+ return $spec[0] + $spec[3];
+ }
+ public static function rsBlockNum1($spec)
+ {
+ return $spec[0];
+ }
+ public static function rsDataCodes1($spec)
+ {
+ return $spec[1];
+ }
+ public static function rsEccCodes1($spec)
+ {
+ return $spec[2];
+ }
+ public static function rsBlockNum2($spec)
+ {
+ return $spec[3];
+ }
+ public static function rsDataCodes2($spec)
+ {
+ return $spec[4];
+ }
+ public static function rsEccCodes2($spec)
+ {
+ return $spec[2];
+ }
+ public static function rsDataLength($spec)
+ {
+ return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
+ }
+ public static function rsEccLength($spec)
+ {
+ return ($spec[0] + $spec[3]) * $spec[2];
+ }
+}
+
+// ##########################################################################
+
+class QRimage
+{
+
+ //----------------------------------------------------------------------
+ public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4, $saveandprint = false)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/png");
+ ImagePng($image);
+ } else {
+ if ($saveandprint === true) {
+ ImagePng($image, $filename);
+ header("Content-type: image/png");
+ ImagePng($image);
+ } else {
+ ImagePng($image, $filename);
+ }
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/jpeg");
+ ImageJpeg($image, null, $q);
+ } else {
+ ImageJpeg($image, $filename, $q);
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
+ {
+ $h = count($frame);
+ $w = strlen($frame[0]);
+
+ $imgW = $w + 2 * $outerFrame;
+ $imgH = $h + 2 * $outerFrame;
+
+ $base_image = ImageCreate($imgW, $imgH);
+
+ $col[0] = ImageColorAllocate($base_image, 255, 255, 255);
+ $col[1] = ImageColorAllocate($base_image, 0, 0, 0);
+
+ imagefill($base_image, 0, 0, $col[0]);
+
+ for ($y = 0; $y < $h; $y++) {
+ for ($x = 0; $x < $w; $x++) {
+ if ($frame[$y][$x] == '1') {
+ ImageSetPixel($base_image, $x + $outerFrame, $y + $outerFrame, $col[1]);
+ }
+ }
+ }
+
+ $target_image = ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
+ ImageDestroy($base_image);
+
+ return $target_image;
+ }
+}
+
+//##########################################################################
+
+class QRinputItem
+{
+
+ public $mode;
+ public $size;
+ public $data;
+ public $bstream;
+
+ public function __construct($mode, $size, $data, $bstream = null)
+ {
+ $setData = array_slice($data, 0, $size);
+
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0, $size - count($setData), 0));
+ }
+
+ if (!QRinput::check($mode, $size, $setData)) {
+ throw new Exception('Error m:' . $mode . ',s:' . $size . ',d:' . join(',', $setData));
+ return null;
+ }
+
+ $this->mode = $mode;
+ $this->size = $size;
+ $this->data = $setData;
+ $this->bstream = $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeNum($version)
+ {
+ try {
+
+ $words = (int)($this->size / 3);
+ $bs = new QRbitstream();
+
+ $val = 0x1;
+ $bs->appendNum(4, $val);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);
+
+ for ($i = 0; $i < $words; $i++) {
+ $val = (ord($this->data[$i * 3]) - ord('0')) * 100;
+ $val += (ord($this->data[$i * 3 + 1]) - ord('0')) * 10;
+ $val += (ord($this->data[$i * 3 + 2]) - ord('0'));
+ $bs->appendNum(10, $val);
+ }
+
+ if ($this->size - $words * 3 == 1) {
+ $val = ord($this->data[$words * 3]) - ord('0');
+ $bs->appendNum(4, $val);
+ } else if ($this->size - $words * 3 == 2) {
+ $val = (ord($this->data[$words * 3]) - ord('0')) * 10;
+ $val += (ord($this->data[$words * 3 + 1]) - ord('0'));
+ $bs->appendNum(7, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeAn($version)
+ {
+ try {
+ $words = (int)($this->size / 2);
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x02);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);
+
+ for ($i = 0; $i < $words; $i++) {
+ $val = (int)QRinput::lookAnTable(ord($this->data[$i * 2])) * 45;
+ $val += (int)QRinput::lookAnTable(ord($this->data[$i * 2 + 1]));
+
+ $bs->appendNum(11, $val);
+ }
+
+ if ($this->size & 1) {
+ $val = QRinput::lookAnTable(ord($this->data[$words * 2]));
+ $bs->appendNum(6, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeMode8($version)
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x4);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);
+
+ for ($i = 0; $i < $this->size; $i++) {
+ $bs->appendNum(8, ord($this->data[$i]));
+ }
+
+ $this->bstream = $bs;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeKanji($version)
+ {
+ try {
+
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x8);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));
+
+ for ($i = 0; $i < $this->size; $i += 2) {
+ $val = (ord($this->data[$i]) << 8) | ord($this->data[$i + 1]);
+ if ($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+
+ $bs->appendNum(13, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeStructure()
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x03);
+ $bs->appendNum(4, ord($this->data[1]) - 1);
+ $bs->appendNum(4, ord($this->data[0]) - 1);
+ $bs->appendNum(8, ord($this->data[2]));
+
+ $this->bstream = $bs;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSizeOfEntry($version)
+ {
+ $bits = 0;
+
+ if ($version == 0)
+ $version = 1;
+
+ switch ($this->mode) {
+ case QR_MODE_NUM:
+ $bits = QRinput::estimateBitsModeNum($this->size);
+ break;
+ case QR_MODE_AN:
+ $bits = QRinput::estimateBitsModeAn($this->size);
+ break;
+ case QR_MODE_8:
+ $bits = QRinput::estimateBitsMode8($this->size);
+ break;
+ case QR_MODE_KANJI:
+ $bits = QRinput::estimateBitsModeKanji($this->size);
+ break;
+ case QR_MODE_STRUCTURE:
+ return STRUCTURE_HEADER_BITS;
+ default:
+ return 0;
+ }
+
+ $l = QRspec::lengthIndicator($this->mode, $version);
+ $m = 1 << $l;
+ $num = (int)(($this->size + $m - 1) / $m);
+
+ $bits += $num * (4 + $l);
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeBitStream($version)
+ {
+ try {
+
+ unset($this->bstream);
+ $words = QRspec::maximumWords($this->mode, $version);
+
+ if ($this->size > $words) {
+
+ $st1 = new QRinputItem($this->mode, $words, $this->data);
+ $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));
+
+ $st1->encodeBitStream($version);
+ $st2->encodeBitStream($version);
+
+ $this->bstream = new QRbitstream();
+ $this->bstream->append($st1->bstream);
+ $this->bstream->append($st2->bstream);
+
+ unset($st1);
+ unset($st2);
+ } else {
+
+ $ret = 0;
+
+ switch ($this->mode) {
+ case QR_MODE_NUM:
+ $ret = $this->encodeModeNum($version);
+ break;
+ case QR_MODE_AN:
+ $ret = $this->encodeModeAn($version);
+ break;
+ case QR_MODE_8:
+ $ret = $this->encodeMode8($version);
+ break;
+ case QR_MODE_KANJI:
+ $ret = $this->encodeModeKanji($version);
+ break;
+ case QR_MODE_STRUCTURE:
+ $ret = $this->encodeModeStructure();
+ break;
+
+ default:
+ break;
+ }
+
+ if ($ret < 0)
+ return -1;
+ }
+
+ return $this->bstream->size();
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+};
+
+//##########################################################################
+
+class QRinput
+{
+
+ public $items;
+
+ private $version;
+ private $level;
+
+ //----------------------------------------------------------------------
+ public function __construct($version = 0, $level = QR_ECLEVEL_L)
+ {
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid version no');
+ return NULL;
+ }
+
+ $this->version = $version;
+ $this->level = $level;
+ }
+
+ //----------------------------------------------------------------------
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ //----------------------------------------------------------------------
+ public function setVersion($version)
+ {
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX) {
+ throw new Exception('Invalid version no');
+ return -1;
+ }
+
+ $this->version = $version;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getErrorCorrectionLevel()
+ {
+ return $this->level;
+ }
+
+ //----------------------------------------------------------------------
+ public function setErrorCorrectionLevel($level)
+ {
+ if ($level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid ECLEVEL');
+ return -1;
+ }
+
+ $this->level = $level;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendEntry(QRinputItem $entry)
+ {
+ $this->items[] = $entry;
+ }
+
+ //----------------------------------------------------------------------
+ public function append($mode, $size, $data)
+ {
+ try {
+ $entry = new QRinputItem($mode, $size, $data);
+ $this->items[] = $entry;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+
+ public function insertStructuredAppendHeader($size, $index, $parity)
+ {
+ if ($size > MAX_STRUCTURED_SYMBOLS) {
+ throw new Exception('insertStructuredAppendHeader wrong size');
+ }
+
+ if ($index <= 0 || $index > MAX_STRUCTURED_SYMBOLS) {
+ throw new Exception('insertStructuredAppendHeader wrong index');
+ }
+
+ $buf = array($size, $index, $parity);
+
+ try {
+ $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, $buf);
+ array_unshift($this->items, $entry);
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function calcParity()
+ {
+ $parity = 0;
+
+ foreach ($this->items as $item) {
+ if ($item->mode != QR_MODE_STRUCTURE) {
+ for ($i = $item->size - 1; $i >= 0; $i--) {
+ $parity ^= $item->data[$i];
+ }
+ }
+ }
+
+ return $parity;
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeNum($size, $data)
+ {
+ for ($i = 0; $i < $size; $i++) {
+ if ((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeNum($size)
+ {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+
+ switch ($size - $w * 3) {
+ case 1:
+ $bits += 4;
+ break;
+ case 2:
+ $bits += 7;
+ break;
+ default:
+ break;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ );
+
+ //----------------------------------------------------------------------
+ public static function lookAnTable($c)
+ {
+ return (($c > 127) ? -1 : self::$anTable[$c]);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeAn($size, $data)
+ {
+ for ($i = 0; $i < $size; $i++) {
+ if (self::lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeAn($size)
+ {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+
+ if ($size & 1) {
+ $bits += 6;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsMode8($size)
+ {
+ return $size * 8;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeKanji($size)
+ {
+ return (int)(($size / 2) * 13);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeKanji($size, $data)
+ {
+ if ($size & 1)
+ return false;
+
+ for ($i = 0; $i < $size; $i += 2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i + 1]);
+ if (
+ $val < 0x8140
+ || ($val > 0x9ffc && $val < 0xe040)
+ || $val > 0xebbf
+ ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /***********************************************************************
+ * Validation
+ **********************************************************************/
+
+ public static function check($mode, $size, $data)
+ {
+ if ($size <= 0)
+ return false;
+
+ switch ($mode) {
+ case QR_MODE_NUM:
+ return self::checkModeNum($size, $data);
+ break;
+ case QR_MODE_AN:
+ return self::checkModeAn($size, $data);
+ break;
+ case QR_MODE_KANJI:
+ return self::checkModeKanji($size, $data);
+ break;
+ case QR_MODE_8:
+ return true;
+ break;
+ case QR_MODE_STRUCTURE:
+ return true;
+ break;
+
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSize($version)
+ {
+ $bits = 0;
+
+ foreach ($this->items as $item) {
+ $bits += $item->estimateBitStreamSizeOfEntry($version);
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateVersion()
+ {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($prev);
+ $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+
+ return $version;
+ }
+
+ //----------------------------------------------------------------------
+ public static function lengthOfCode($mode, $version, $bits)
+ {
+ $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
+ switch ($mode) {
+ case QR_MODE_NUM:
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if ($remain >= 7) {
+ $size += 2;
+ } else if ($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ case QR_MODE_AN:
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if ($remain >= 6)
+ $size++;
+ break;
+ case QR_MODE_8:
+ $size = (int)($payload / 8);
+ break;
+ case QR_MODE_KANJI:
+ $size = (int)(($payload / 13) * 2);
+ break;
+ case QR_MODE_STRUCTURE:
+ $size = (int)($payload / 8);
+ break;
+ default:
+ $size = 0;
+ break;
+ }
+
+ $maxsize = QRspec::maximumWords($mode, $version);
+ if ($size < 0) $size = 0;
+ if ($size > $maxsize) $size = $maxsize;
+
+ return $size;
+ }
+
+ //----------------------------------------------------------------------
+ public function createBitStream()
+ {
+ $total = 0;
+
+ foreach ($this->items as $item) {
+ $bits = $item->encodeBitStream($this->version);
+
+ if ($bits < 0)
+ return -1;
+
+ $total += $bits;
+ }
+
+ return $total;
+ }
+
+ //----------------------------------------------------------------------
+ public function convertData()
+ {
+ $ver = $this->estimateVersion();
+ if ($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ }
+
+ for (;;) {
+ $bits = $this->createBitStream();
+
+ if ($bits < 0)
+ return -1;
+
+ $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($ver < 0) {
+ throw new Exception('WRONG VERSION');
+ return -1;
+ } else if ($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ } else {
+ break;
+ }
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendPaddingBit(&$bstream)
+ {
+ $bits = $bstream->size();
+ $maxwords = QRspec::getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+
+ if ($maxbits == $bits) {
+ return 0;
+ }
+
+ if ($maxbits - $bits < 5) {
+ return $bstream->appendNum($maxbits - $bits, 0);
+ }
+
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+
+ $padding = new QRbitstream();
+ $ret = $padding->appendNum($words * 8 - $bits + 4, 0);
+
+ if ($ret < 0)
+ return $ret;
+
+ $padlen = $maxwords - $words;
+
+ if ($padlen > 0) {
+
+ $padbuf = array();
+ for ($i = 0; $i < $padlen; $i++) {
+ $padbuf[$i] = ($i & 1) ? 0x11 : 0xec;
+ }
+
+ $ret = $padding->appendBytes($padlen, $padbuf);
+
+ if ($ret < 0)
+ return $ret;
+ }
+
+ $ret = $bstream->append($padding);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function mergeBitStream()
+ {
+ if ($this->convertData() < 0) {
+ return null;
+ }
+
+ $bstream = new QRbitstream();
+
+ foreach ($this->items as $item) {
+ $ret = $bstream->append($item->bstream);
+ if ($ret < 0) {
+ return null;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getBitStream()
+ {
+
+ $bstream = $this->mergeBitStream();
+
+ if ($bstream == null) {
+ return null;
+ }
+
+ $ret = $this->appendPaddingBit($bstream);
+ if ($ret < 0) {
+ return null;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getByteStream()
+ {
+ $bstream = $this->getBitStream();
+ if ($bstream == null) {
+ return null;
+ }
+
+ return $bstream->toByte();
+ }
+}
+
+//##########################################################################
+
+class QRbitstream
+{
+
+ public $data = array();
+
+ //----------------------------------------------------------------------
+ public function size()
+ {
+ return count($this->data);
+ }
+
+ //----------------------------------------------------------------------
+ public function allocate($setLength)
+ {
+ $this->data = array_fill(0, $setLength, 0);
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromNum($bits, $num)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($bits);
+
+ $mask = 1 << ($bits - 1);
+ for ($i = 0; $i < $bits; $i++) {
+ if ($num & $mask) {
+ $bstream->data[$i] = 1;
+ } else {
+ $bstream->data[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromBytes($size, $data)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($size * 8);
+ $p = 0;
+
+ for ($i = 0; $i < $size; $i++) {
+ $mask = 0x80;
+ for ($j = 0; $j < 8; $j++) {
+ if ($data[$i] & $mask) {
+ $bstream->data[$p] = 1;
+ } else {
+ $bstream->data[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function append(QRbitstream $arg)
+ {
+ if (is_null($arg)) {
+ return -1;
+ }
+
+ if ($arg->size() == 0) {
+ return 0;
+ }
+
+ if ($this->size() == 0) {
+ $this->data = $arg->data;
+ return 0;
+ }
+
+ $this->data = array_values(array_merge($this->data, $arg->data));
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendNum($bits, $num)
+ {
+ if ($bits == 0)
+ return 0;
+
+ $b = QRbitstream::newFromNum($bits, $num);
+
+ if (is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendBytes($size, $data)
+ {
+ if ($size == 0)
+ return 0;
+
+ $b = QRbitstream::newFromBytes($size, $data);
+
+ if (is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function toByte()
+ {
+
+ $size = $this->size();
+
+ if ($size == 0) {
+ return array();
+ }
+
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+
+ $p = 0;
+
+ for ($i = 0; $i < $bytes; $i++) {
+ $v = 0;
+ for ($j = 0; $j < 8; $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+
+ if ($size & 7) {
+ $v = 0;
+ for ($j = 0; $j < ($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+
+ return $data;
+ }
+}
+
+//##########################################################################
+
+class QRsplit
+{
+
+ public $dataStr = '';
+ public $input;
+ public $modeHint;
+
+ //----------------------------------------------------------------------
+ public function __construct($dataStr, $input, $modeHint)
+ {
+ $this->dataStr = $dataStr;
+ $this->input = $input;
+ $this->modeHint = $modeHint;
+ }
+
+ //----------------------------------------------------------------------
+ public static function isdigitat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return ((ord($str[$pos]) >= ord('0')) && (ord($str[$pos]) <= ord('9')));
+ }
+
+ //----------------------------------------------------------------------
+ public static function isalnumat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function identifyMode($pos)
+ {
+ if ($pos >= strlen($this->dataStr))
+ return QR_MODE_NUL;
+
+ $c = $this->dataStr[$pos];
+
+ if (self::isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NUM;
+ } else if (self::isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } else if ($this->modeHint == QR_MODE_KANJI) {
+
+ if ($pos + 1 < strlen($this->dataStr)) {
+ $d = $this->dataStr[$pos + 1];
+ $word = (ord($c) << 8) | ord($d);
+ if (($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KANJI;
+ }
+ }
+ }
+
+ return QR_MODE_8;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatNum()
+ {
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+ while (self::isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+
+ $run = $p;
+ $mode = $this->identifyMode($p);
+
+ if ($mode == QR_MODE_8) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if ($mode == QR_MODE_AN) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsModeAn(1) // + 4 + la
+ - QRinput::estimateBitsModeAn($run + 1); // - 4 - la
+ if ($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));
+ if ($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatAn()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+
+ while (self::isalnumat($this->dataStr, $p)) {
+ if (self::isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while (self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+
+ $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsModeAn($q); // - 4 - la
+
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+
+ if (!self::isalnumat($this->dataStr, $p)) {
+ $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));
+ if ($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatKanji()
+ {
+ $p = 0;
+ $run = null;
+ while ($this->identifyMode($p) == QR_MODE_KANJI) {
+ $p += 2;
+ }
+
+ $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));
+ if ($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eat8()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+
+ while ($p < $dataStrLen) {
+
+ $mode = $this->identifyMode($p);
+ if ($mode == QR_MODE_KANJI) {
+ break;
+ }
+ if ($mode == QR_MODE_NUM) {
+ $q = $p;
+ while (self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else if ($mode == QR_MODE_AN) {
+ $q = $p;
+ while (self::isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+ $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));
+
+ if ($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function splitString()
+ {
+ while (strlen($this->dataStr) > 0) {
+ if ($this->dataStr == '')
+ return 0;
+ $hint = null;
+ $mode = $this->identifyMode(0);
+
+ switch ($mode) {
+ case QR_MODE_NUM:
+ $length = $this->eatNum();
+ break;
+ case QR_MODE_AN:
+ $length = $this->eatAn();
+ break;
+ case QR_MODE_KANJI:
+ if ($hint == QR_MODE_KANJI)
+ $length = $this->eatKanji();
+ else $length = $this->eat8();
+ break;
+ default:
+ $length = $this->eat8();
+ break;
+ }
+
+ if ($length == 0) return 0;
+ if ($length < 0) return -1;
+
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function toUpper()
+ {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+
+ while ($p < $stringLen) {
+ $mode = $this->identifyMode(substr($this->dataStr, $p), $this->modeHint);
+ if ($mode == QR_MODE_KANJI) {
+ $p += 2;
+ } else {
+ if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+
+ return $this->dataStr;
+ }
+
+ //----------------------------------------------------------------------
+ public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)
+ {
+ if (is_null($string) || $string == '\0' || $string == '') {
+ throw new Exception('empty string!!!');
+ }
+
+ $split = new QRsplit($string, $input, $modeHint);
+
+ if (!$casesensitive)
+ $split->toUpper();
+
+ return $split->splitString();
+ }
+}
+
+//##########################################################################
+
+class QRrsItem
+{
+
+ public $mm; // Bits per symbol
+ public $nn; // Symbols per block (= (1<= $this->nn) {
+ $x -= $this->nn;
+ $x = ($x >> $this->mm) + ($x & $this->nn);
+ }
+
+ return $x;
+ }
+
+ //----------------------------------------------------------------------
+ public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ // Common code for intializing a Reed-Solomon control block (char or int symbols)
+ // Copyright 2004 Phil Karn, KA9Q
+ // May be used under the terms of the GNU Lesser General Public License (LGPL)
+
+ $rs = null;
+
+ // Check parameter ranges
+ if ($symsize < 0 || $symsize > 8) return $rs;
+ if ($fcr < 0 || $fcr >= (1 << $symsize)) return $rs;
+ if ($prim <= 0 || $prim >= (1 << $symsize)) return $rs;
+ if ($nroots < 0 || $nroots >= (1 << $symsize)) return $rs; // Can't have more roots than symbol values!
+ if ($pad < 0 || $pad >= ((1 << $symsize) - 1 - $nroots)) return $rs; // Too much padding
+
+ $rs = new QRrsItem();
+ $rs->mm = $symsize;
+ $rs->nn = (1 << $symsize) - 1;
+ $rs->pad = $pad;
+
+ $rs->alpha_to = array_fill(0, $rs->nn + 1, 0);
+ $rs->index_of = array_fill(0, $rs->nn + 1, 0);
+
+ // PHP style macro replacement ;)
+ $NN = &$rs->nn;
+ $A0 = &$NN;
+
+ // Generate Galois field lookup tables
+ $rs->index_of[0] = $A0; // log(zero) = -inf
+ $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+
+ for ($i = 0; $i < $rs->nn; $i++) {
+ $rs->index_of[$sr] = $i;
+ $rs->alpha_to[$i] = $sr;
+ $sr <<= 1;
+ if ($sr & (1 << $symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs->nn;
+ }
+
+ if ($sr != 1) {
+ // field generator polynomial is not primitive!
+ $rs = NULL;
+ return $rs;
+ }
+
+ /* Form RS code generator polynomial from its roots */
+ $rs->genpoly = array_fill(0, $nroots + 1, 0);
+
+ $rs->fcr = $fcr;
+ $rs->prim = $prim;
+ $rs->nroots = $nroots;
+ $rs->gfpoly = $gfpoly;
+
+ /* Find prim-th root of 1, used in decoding */
+ for ($iprim = 1; ($iprim % $prim) != 0; $iprim += $rs->nn); // intentional empty-body loop!
+
+ $rs->iprim = (int)($iprim / $prim);
+ $rs->genpoly[0] = 1;
+
+ for ($i = 0, $root = $fcr * $prim; $i < $nroots; $i++, $root += $prim) {
+ $rs->genpoly[$i + 1] = 1;
+
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; $j--) {
+ if ($rs->genpoly[$j] != 0) {
+ $rs->genpoly[$j] = $rs->genpoly[$j - 1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];
+ } else {
+ $rs->genpoly[$j] = $rs->genpoly[$j - 1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];
+ }
+
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; $i++)
+ $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];
+
+ return $rs;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode_rs_char($data, &$parity)
+ {
+ $MM = &$this->mm;
+ $NN = &$this->nn;
+ $ALPHA_TO = &$this->alpha_to;
+ $INDEX_OF = &$this->index_of;
+ $GENPOLY = &$this->genpoly;
+ $NROOTS = &$this->nroots;
+ $FCR = &$this->fcr;
+ $PRIM = &$this->prim;
+ $IPRIM = &$this->iprim;
+ $PAD = &$this->pad;
+ $A0 = &$NN;
+
+ $parity = array_fill(0, $NROOTS, 0);
+
+ for ($i = 0; $i < ($NN - $NROOTS - $PAD); $i++) {
+
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if ($feedback != $A0) {
+ // feedback term is non-zero
+
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);
+
+ for ($j = 1; $j < $NROOTS; $j++) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS - $j])];
+ }
+ }
+
+ // Shift
+ array_shift($parity);
+ if ($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ }
+}
+
+//##########################################################################
+
+class QRrs
+{
+
+ public static $items = array();
+
+ //----------------------------------------------------------------------
+ public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ foreach (self::$items as $rs) {
+ if ($rs->pad != $pad) continue;
+ if ($rs->nroots != $nroots) continue;
+ if ($rs->mm != $symsize) continue;
+ if ($rs->gfpoly != $gfpoly) continue;
+ if ($rs->fcr != $fcr) continue;
+ if ($rs->prim != $prim) continue;
+
+ return $rs;
+ }
+
+ $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift(self::$items, $rs);
+
+ return $rs;
+ }
+}
+
+// ################################################################################
+
+class QRmask
+{
+
+ public $runLength = array();
+
+ //----------------------------------------------------------------------
+ public function __construct()
+ {
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function writeFormatInformation($width, &$frame, $mask, $level)
+ {
+ $blacks = 0;
+ $format = QRspec::getFormatInfo($mask, $level);
+
+ for ($i = 0; $i < 8; $i++) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[8][$width - 1 - $i] = chr($v);
+ if ($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+
+ for ($i = 0; $i < 7; $i++) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[$width - 7 + $i][8] = chr($v);
+ if ($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+
+ $format = $format >> 1;
+ }
+
+ return $blacks;
+ }
+
+ //----------------------------------------------------------------------
+ public function mask0($x, $y)
+ {
+ return ($x + $y) & 1;
+ }
+ public function mask1($x, $y)
+ {
+ return ($y & 1);
+ }
+ public function mask2($x, $y)
+ {
+ return ($x % 3);
+ }
+ public function mask3($x, $y)
+ {
+ return ($x + $y) % 3;
+ }
+ public function mask4($x, $y)
+ {
+ return (((int)($y / 2)) + ((int)($x / 3))) & 1;
+ }
+ public function mask5($x, $y)
+ {
+ return (($x * $y) & 1) + ($x * $y) % 3;
+ }
+ public function mask6($x, $y)
+ {
+ return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
+ }
+ public function mask7($x, $y)
+ {
+ return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
+ }
+
+ //----------------------------------------------------------------------
+ private function generateMaskNo($maskNo, $width, $frame)
+ {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+
+ for ($y = 0; $y < $width; $y++) {
+ for ($x = 0; $x < $width; $x++) {
+ if (ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask' . $maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0) ? 1 : 0;
+ }
+ }
+ }
+
+ return $bitMask;
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($bitFrame)
+ {
+ $codeArr = array();
+
+ foreach ($bitFrame as $line)
+ $codeArr[] = join('', $line);
+
+ return gzcompress(join("\n", $codeArr), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ $codeArr = array();
+
+ $codeLines = explode("\n", gzuncompress($code));
+ foreach ($codeLines as $line)
+ $codeArr[] = str_split($line);
+
+ return $codeArr;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)
+ {
+ $b = 0;
+ $bitMask = array();
+
+ $fileName = QR_CACHE_DIR . 'mask_' . $maskNo . DIRECTORY_SEPARATOR . 'mask_' . $width . '_' . $maskNo . '.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ $bitMask = self::unserial(file_get_contents($fileName));
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if (!file_exists(QR_CACHE_DIR . 'mask_' . $maskNo))
+ mkdir(QR_CACHE_DIR . 'mask_' . $maskNo);
+ file_put_contents($fileName, self::serial($bitMask));
+ }
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ }
+
+ if ($maskGenOnly)
+ return;
+
+ $d = $s;
+
+ for ($y = 0; $y < $width; $y++) {
+ for ($x = 0; $x < $width; $x++) {
+ if ($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+
+ return $b;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMask($width, $frame, $maskNo, $level)
+ {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+
+ return $masked;
+ }
+
+ //----------------------------------------------------------------------
+ public function calcN1N3($length)
+ {
+ $demerit = 0;
+
+ for ($i = 0; $i < $length; $i++) {
+
+ if ($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if ($i & 1) {
+ if (($i >= 3) && ($i < ($length - 2)) && ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if (($this->runLength[$i - 2] == $fact) &&
+ ($this->runLength[$i - 1] == $fact) &&
+ ($this->runLength[$i + 1] == $fact) &&
+ ($this->runLength[$i + 2] == $fact)
+ ) {
+ if (($this->runLength[$i - 3] < 0) || ($this->runLength[$i - 3] >= (4 * $fact))) {
+ $demerit += N3;
+ } else if ((($i + 3) >= $length) || ($this->runLength[$i + 3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ //----------------------------------------------------------------------
+ public function evaluateSymbol($width, $frame)
+ {
+ $head = 0;
+ $demerit = 0;
+
+ for ($y = 0; $y < $width; $y++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ $frameY = $frame[$y];
+
+ if ($y > 0)
+ $frameYM = $frame[$y - 1];
+
+ for ($x = 0; $x < $width; $x++) {
+ if (($x > 0) && ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x - 1]) & ord($frameYM[$x]) & ord($frameYM[$x - 1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x - 1]) | ord($frameYM[$x]) | ord($frameYM[$x - 1]);
+
+ if (($b22 | ($w22 ^ 1)) & 1) {
+ $demerit += N2;
+ }
+ }
+ if (($x == 0) && (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if ($x > 0) {
+ if ((ord($frameY[$x]) ^ ord($frameY[$x - 1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head + 1);
+ }
+
+ for ($x = 0; $x < $width; $x++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ for ($y = 0; $y < $width; $y++) {
+ if ($y == 0 && (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if ($y > 0) {
+ if ((ord($frame[$y][$x]) ^ ord($frame[$y - 1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head + 1);
+ }
+
+ return $demerit;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function mask($width, $frame, $level)
+ {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+
+ $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
+
+ if (QR_FIND_FROM_RANDOM !== false) {
+
+ $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; $i++) {
+ $remPos = rand(0, count($checked_masks) - 1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+ }
+
+ $bestMask = $frame;
+
+ foreach ($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+
+ if ($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+
+ return $bestMask;
+ }
+
+ //----------------------------------------------------------------------
+}
+
+//##########################################################################
+
+class QRrsblock
+{
+ public $dataLength;
+ public $data = array();
+ public $eccLength;
+ public $ecc = array();
+
+ public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)
+ {
+ $rs->encode_rs_char($data, $ecc);
+
+ $this->dataLength = $dl;
+ $this->data = $data;
+ $this->eccLength = $el;
+ $this->ecc = $ecc;
+ }
+};
+
+//##########################################################################
+
+class QRrawcode
+{
+ public $version;
+ public $datacode = array();
+ public $ecccode = array();
+ public $blocks;
+ public $rsblocks = array(); //of RSblock
+ public $count;
+ public $dataLength;
+ public $eccLength;
+ public $b1;
+
+ //----------------------------------------------------------------------
+ public function __construct(QRinput $input)
+ {
+ $spec = array(0, 0, 0, 0, 0);
+
+ $this->datacode = $input->getByteStream();
+ if (is_null($this->datacode)) {
+ throw new Exception('null imput string');
+ }
+
+ QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);
+
+ $this->version = $input->getVersion();
+ $this->b1 = QRspec::rsBlockNum1($spec);
+ $this->dataLength = QRspec::rsDataLength($spec);
+ $this->eccLength = QRspec::rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = QRspec::rsBlockNum($spec);
+
+ $ret = $this->init($spec);
+ if ($ret < 0) {
+ throw new Exception('block alloc error');
+ return null;
+ }
+
+ $this->count = 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function init(array $spec)
+ {
+ $dl = QRspec::rsDataCodes1($spec);
+ $el = QRspec::rsEccCodes1($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ for ($i = 0; $i < QRspec::rsBlockNum1($spec); $i++) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ if (QRspec::rsBlockNum2($spec) == 0)
+ return 0;
+
+ $dl = QRspec::rsDataCodes2($spec);
+ $el = QRspec::rsEccCodes2($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+ if ($rs == NULL) return -1;
+
+ for ($i = 0; $i < QRspec::rsBlockNum2($spec); $i++) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getCode()
+ {
+ $ret = null;
+
+ if ($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if ($col >= $this->rsblocks[0]->dataLength) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]->data[$col];
+ } else if ($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]->ecc[$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+
+ return $ret;
+ }
+}
+
+//##########################################################################
+
+class FrameFiller
+{
+
+ public $width;
+ public $frame;
+ public $x;
+ public $y;
+ public $dir;
+ public $bit;
+
+ //----------------------------------------------------------------------
+ public function __construct($width, &$frame)
+ {
+ $this->width = $width;
+ $this->frame = $frame;
+ $this->x = $width - 1;
+ $this->y = $width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ }
+
+ //----------------------------------------------------------------------
+ public function setFrameAt($at, $val)
+ {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ //----------------------------------------------------------------------
+ public function getFrameAt($at)
+ {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ //----------------------------------------------------------------------
+ public function next()
+ {
+ do {
+
+ if ($this->bit == -1) {
+ $this->bit = 0;
+ return array('x' => $this->x, 'y' => $this->y);
+ }
+
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+
+ if ($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+
+ if ($this->dir < 0) {
+ if ($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if ($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if ($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if ($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if ($x < 0 || $y < 0) return null;
+
+ $this->x = $x;
+ $this->y = $y;
+ } while (ord($this->frame[$y][$x]) & 0x80);
+
+ return array('x' => $x, 'y' => $y);
+ }
+};
+
+//##########################################################################
+
+class QRencode
+{
+
+ public $casesensitive = true;
+ public $eightbit = false;
+
+ public $version = 0;
+ public $size = 3;
+ public $margin = 4;
+
+ public $structured = 0; // not supported yet
+
+ public $level = QR_ECLEVEL_L;
+ public $hint = QR_MODE_8;
+
+ //----------------------------------------------------------------------
+ public static function factory($level = QR_ECLEVEL_L, $size = 12, $margin = 1)
+ {
+ $enc = new QRencode();
+ $enc->size = $size;
+ $enc->margin = $margin;
+
+ switch ($level . '') {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ $enc->level = $level;
+ break;
+ case 'l':
+ case 'L':
+ $enc->level = QR_ECLEVEL_L;
+ break;
+ case 'm':
+ case 'M':
+ $enc->level = QR_ECLEVEL_M;
+ break;
+ case 'q':
+ case 'Q':
+ $enc->level = QR_ECLEVEL_Q;
+ break;
+ case 'h':
+ case 'H':
+ $enc->level = QR_ECLEVEL_H;
+ break;
+ }
+
+ return $enc;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeRAW($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if ($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ return $code->data;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if ($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ QRtools::markTime('after_encode');
+
+ if ($outfile !== false) {
+ file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));
+ } else {
+ return QRtools::binarize($code->data);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodePNG($intext, $outfile = false, $saveandprint = false)
+ {
+ try {
+ ob_start();
+ $tab = $this->encode($intext);
+ $err = ob_get_contents();
+ ob_end_clean();
+
+ if ($err != '') {
+ QRtools::log($outfile, $err);
+ }
+
+ $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab) + 2 * $this->margin));
+
+ QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin, $saveandprint);
+ } catch (Exception $e) {
+ QRtools::log($outfile, $e->getMessage());
+ }
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Sql.php b/vendor/mongdch/mon-util/src/Sql.php
new file mode 100644
index 0000000..60dd24d
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Sql.php
@@ -0,0 +1,82 @@
+
+ * @version 1.0.1 采用File对象读取sql文件
+ */
+class Sql
+{
+ use Instance;
+
+ /**
+ * 解析SQL文件
+ *
+ * @param string $file sql文件路径
+ * @return array
+ */
+ public function parseFile($file)
+ {
+ $content = File::instance()->read($file);
+ return $this->parseSql($content);
+ }
+
+ /**
+ * 解析sql内容,分析生成sql语句
+ *
+ * @param string $content sql内容
+ * @return array
+ */
+ public function parseSql($content)
+ {
+ if (empty($content)) {
+ return [];
+ }
+ // 纯sql内容
+ $sql = [];
+ // 多行注释标记
+ $comment = false;
+ // 按行分割,兼容多个平台
+ $content = str_replace(["\r\n", "\r"], "\n", $content);
+ $content = explode("\n", trim($content));
+ // 遍历处理每一行
+ foreach ($content as $key => $line) {
+ // 跳过空行
+ if ($line == '') {
+ continue;
+ }
+ // 跳过以#或者--开头的单行注释
+ if (preg_match("/^(#|--)/", $line)) {
+ continue;
+ }
+ // 跳过以/**/包裹起来的单行注释
+ if (preg_match("/^\/\*(.*?)\*\//", $line)) {
+ continue;
+ }
+ // 多行注释开始
+ if (mb_substr($line, 0, 2) == '/*') {
+ $comment = true;
+ continue;
+ }
+ // 多行注释结束
+ if (mb_substr($line, -2) == '*/') {
+ $comment = false;
+ continue;
+ }
+ // 多行注释没有结束,继续跳过
+ if ($comment) {
+ continue;
+ }
+ // 记录sql语句
+ array_push($sql, $line);
+ }
+
+ // 以数组形式返回sql语句
+ $sql = implode("\n", $sql);
+ $sql = explode(";\n", $sql);
+ return $sql;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Tool.php b/vendor/mongdch/mon-util/src/Tool.php
new file mode 100644
index 0000000..d8c909e
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Tool.php
@@ -0,0 +1,699 @@
+
+ * @version v1.0.0
+ */
+class Tool
+{
+ use Instance;
+
+ /**
+ * 调试方法(浏览器友好处理)
+ *
+ * @param mixed $var 变量
+ * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
+ * @param string $label 标签 默认为空
+ * @param boolean $strict 是否严谨 默认为true
+ * @return void|string
+ */
+ public function debug($var, $echo = true, $label = null, $flags = ENT_SUBSTITUTE)
+ {
+ $label = (null === $label) ? '' : rtrim($label) . ':';
+ ob_start();
+ var_dump($var);
+ $output = ob_get_clean();
+ $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
+ if (PHP_SAPI == 'cli' || PHP_SAPI == 'cli-server') {
+ // CLI模式
+ $output = PHP_EOL . $label . $output . PHP_EOL;
+ } else {
+ if (!extension_loaded('xdebug')) {
+ $output = htmlspecialchars($output, $flags);
+ }
+ $output = '' . $label . $output . '
';
+ }
+ if ($echo) {
+ echo ($output);
+ return;
+ } else {
+ return $output;
+ }
+ }
+
+ /**
+ * 判断是否为微信浏览器发起的请求
+ *
+ * @return boolean
+ */
+ public function is_wx()
+ {
+ if (mb_strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * 判断是否为安卓发起的请求
+ *
+ * @return boolean
+ */
+ public function is_android()
+ {
+ if (mb_strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * 判断是否为苹果发起的请求
+ *
+ * @return boolean
+ */
+ public function is_ios()
+ {
+ if (mb_strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone') !== false || mb_strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * 创建基于cookies的Token
+ *
+ * @param string $ticket 验证秘钥
+ * @param string $salt 加密盐
+ * @param integer $expire Cookie生存时间
+ * @param string $tokenName Cookie创建token的名称
+ * @param string $tokenTimeName cookie创建token创建时间的名称
+ * @return array
+ */
+ public function createTicket($ticket, $salt = "MonUtil", $expire = 3600, $tokenName = '_token_', $tokenTimeName = '_tokenTime_')
+ {
+ $now = time();
+ $token = md5($salt . $now . $ticket);
+
+ $_COOKIE[$tokenName] = $token;
+ $_COOKIE[$tokenTimeName] = $now;
+ setcookie($tokenName, $token, $now + $expire, "/");
+ setcookie($tokenTimeName, $now, $now + $expire, "/");
+
+ return ['token' => $token, 'tokenTime' => $now];
+ }
+
+ /**
+ * 校验基于cookies的Token
+ *
+ * @param string $ticket 验证秘钥
+ * @param string $token Token值
+ * @param string $tokenTime Token创建时间
+ * @param string $salt 加密盐
+ * @param boolean $destroy 是否清除Cookie
+ * @param integer $expire Cookie生存时间
+ * @param string $tokenName Cookie创建token的名称
+ * @param string $tokenTimeName Cookie创建token创建时间的名称
+ * @return boolean
+ */
+ public function checkTicket($ticket, $token = null, $tokenTime = null, $salt = "MonUtil", $destroy = true, $expire = 3600, $tokenName = '_token_', $tokenTimeName = '_tokenTime_')
+ {
+ $token = empty($token) ? (isset($_COOKIE[$tokenName]) ? $_COOKIE[$tokenName] : '') : $token;
+ $tokenTime = empty($tokenTime) ? (isset($_COOKIE[$tokenTimeName]) ? $_COOKIE[$tokenTimeName] : 0) : $tokenTime;
+ $now = time();
+ $result = false;
+
+ if (empty($token) || empty($tokenTime)) {
+ return $result;
+ }
+
+ // 校验
+ $check = md5($salt . $tokenTime . $ticket);
+ $timeGap = $now - $tokenTime;
+ if ($check == $token && $timeGap <= $expire) {
+ $result = true;
+ }
+
+ // 判断是否需要清空Cookie
+ if ($destroy) {
+ setcookie($tokenName, "", $now - $expire, "/");
+ setcookie($tokenTimeName, "", $now - $expire, "/");
+ }
+
+ return $result;
+ }
+
+ /**
+ * 导出CSV格式文件
+ *
+ * @param string $filename 导出文件名
+ * @param array $title 表格标题列表(生成:"序号,姓名,性别,年龄\n")
+ * @param array $titleKey 表格标题列表对应键名(注意:对应title排序)
+ * @param array $data 导出数据
+ * @return void
+ */
+ public function exportCsv($filename, $title, $titleKey = [], $data = [])
+ {
+ // 清空之前的输出
+ ob_get_contents() && ob_end_clean();
+
+ // 获取标题
+ $title = implode(",", $title) . "\n";
+ $str = @iconv('utf-8', 'gbk', $title); // 中文转码GBK
+ $len = count($titleKey);
+
+ // 遍历二维数组获取需要生成的数据
+ foreach ($data as $key => $value) {
+ // 遍历键列表获取对应数据中的键值
+ for ($i = 0; $i < $len; $i++) {
+ $val = @iconv('utf-8', 'gbk', $value[$titleKey[$i]]);
+ // 判断是否为最后一列数据
+ if ($i == ($len - 1)) {
+ $str .= $val . "\n";
+ } else {
+ $str .= $val . ",";
+ }
+ }
+ }
+
+ // 输出头信息
+ header("Content-type:text/csv");
+ header("Content-Disposition:attachment;filename=" . $filename . ".csv");
+ header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
+ header('Expires:0');
+ header('Pragma:public');
+ header("Content-Length: " . mb_strlen($str));
+ header("Content-Transfer-Encoding: binary");
+ // 输出文件
+ echo $str;
+ }
+
+ /**
+ * 导出XML
+ *
+ * @param array $data 输出的数据
+ * @param string $root 根节点
+ * @param string $encoding 编码
+ * @return void
+ */
+ public function exportXML(array $data, $root = "Mon", $encoding = 'UTF-8')
+ {
+ // 清空之前的输出
+ ob_get_contents() && ob_end_clean();
+ $xml = "";
+ $xml .= "<{$root}>";
+ $xml .= Common::instance()->arrToXML($data);
+ $xml .= "{$root}>";
+
+ header("Content-type:text/xml");
+ echo $xml;
+ }
+
+ /**
+ * 隐藏银行卡号
+ *
+ * @param string $id 银行卡号
+ * @return string
+ */
+ public function hideBankcard($id)
+ {
+ if (empty($id)) {
+ return '';
+ }
+ //截取银行卡号前4位
+ $prefix = mb_substr($id, 0, 4);
+ //截取银行卡号后4位
+ $suffix = mb_substr($id, -4, 4);
+ return $prefix . " **** **** **** " . $suffix;
+ }
+
+ /**
+ * 隐藏手机号
+ *
+ * @param string $id 手机号
+ * @return string
+ */
+ public function hideMoble($id)
+ {
+ if (empty($id)) {
+ return '';
+ }
+ return substr_replace($id, '****', 3, 4);
+ }
+
+ /**
+ * 获取客户端的IP地址
+ *
+ * @return string
+ */
+ public function ip()
+ {
+ foreach (['X_FORWARDED_FOR', 'HTTP_X_FORWARDED_FOR', 'CLIENT_IP', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'] as $key) {
+ if (isset($_SERVER[$key])) {
+ return $_SERVER[$key];
+ }
+ }
+
+ return '';
+ }
+
+ /**
+ * 安全IP检测,支持IP段检测
+ *
+ * @param string $ip 要检测的IP,','分割,例如白名单IP:192.168.1.13,123.23.23.44,193.134.*.*
+ * @param string|array $ips 白名单IP或者黑名单IP
+ * @return boolean true 在白名单或者黑名单中,否则不在
+ */
+ public function safe_ip($ip, $ips)
+ {
+ if (is_string($ips)) {
+ $ips = explode(",", $ips);
+ }
+ if (in_array($ip, $ips)) {
+ return true;
+ }
+ // IP段验证
+ $ipregexp = implode('|', str_replace(['*', '.'], ['\d+', '\.'], $ips));
+ $rs = preg_match("/^(" . $ipregexp . ")$/", $ip);
+ if ($rs) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * 获取两坐标距离
+ *
+ * @param float $lng1 经度1
+ * @param float $lat1 纬度1
+ * @param float $lng2 经度2
+ * @param float $lat2 纬度2
+ * @return float
+ */
+ public function getDistance($lng1, $lat1, $lng2, $lat2)
+ {
+ $radLat1 = deg2rad($lat1);
+ $radLat2 = deg2rad($lat2);
+ $radLng1 = deg2rad($lng1);
+ $radLng2 = deg2rad($lng2);
+ $a = $radLat1 - $radLat2;
+ $b = $radLng1 - $radLng2;
+
+ return 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
+ }
+
+ /**
+ * 计算某个经纬度的周围某段距离的正方形的四个点
+ * $lng = '116.655540';
+ * $lat = '39.910980';
+ * $squares = GetSquarePoint($lng, $lat);
+ *
+ * print_r($squares);
+ * $info_sql = "select id,locateinfo,lat,lng from `lbs_info` where lat<>0 and lat>{$squares['right-bottom']['lat']} and lat<{$squares['left-top']['lat']} and lng>{$squares['left-top']['lng']} and lng<{$squares['right-bottom']['lng']} ";
+ *
+ * @param float $lng 经度
+ * @param float $lat 纬度
+ * @param float $distance 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
+ * @return array 正方形的四个点的经纬度坐标
+ */
+ public function getSquarePoint($lng, $lat, $distance = 0.5)
+ {
+ if (empty($lng) || empty($lat)) {
+ return '';
+ };
+
+ // 地球半径,平均半径为6371km
+ $radius = 6371;
+ $d_lng = 2 * asin(sin($distance / (2 * $radius)) / cos(deg2rad($lat)));
+ $d_lng = rad2deg($d_lng);
+ $d_lat = $distance / $radius;
+ $d_lat = rad2deg($d_lat);
+
+ return [
+ 'left-top' => ['lat' => $lat + $d_lat, 'lng' => $lng - $d_lng],
+ 'right-top' => ['lat' => $lat + $d_lat, 'lng' => $lng + $d_lng],
+ 'left-bottom' => ['lat' => $lat - $d_lat, 'lng' => $lng - $d_lng],
+ 'right-bottom' => ['lat' => $lat - $d_lat, 'lng' => $lng + $d_lng]
+ ];
+ }
+
+ /**
+ * 文件打包下载
+ *
+ * @param string $downloadZip 打包后保存的文件名
+ * @param array $list 打包文件列表
+ * @param string $fileName 下载文件名,默认为打包后的文件名
+ * @throws RuntimeException
+ * @return void
+ */
+ public function exportZip($downloadZip, array $list, $fileName = null)
+ {
+ // 初始化Zip并打开
+ $zip = new \ZipArchive();
+ // 初始化
+ $bool = $zip->open($downloadZip, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
+ // 打开文件
+ if ($bool !== true) {
+ throw new RuntimeException('PHP-ZipArchive扩展打开文件失败, Code:' . $bool);
+ }
+ foreach ($list as $key => $val) {
+ // 把文件追加到Zip包
+ $zip->addFile($val, basename($val));
+ }
+ // 关闭Zip对象
+ $zip->close();
+
+ // 下载Zip包
+ $fileName = $fileName ? $fileName : basename($downloadZip);
+ header('Cache-Control: max-age=0');
+ header('Content-Description: File Transfer');
+ header('Content-disposition: attachment; filename=' . $fileName);
+ header('Content-Type: application/zip'); // zip格式的
+ header('Content-Transfer-Encoding: binary'); // 二进制文件
+ header('Content-Length: ' . filesize($downloadZip)); // 文件大小
+ // 清空文件的头部信息,解决文件下载无法打开问题
+ ob_clean();
+ flush();
+ readfile($downloadZip);
+ }
+
+ /**
+ * 目录打包下载
+ *
+ * @param string $downloadZip 打包后保存的文件名
+ * @param string $dirPath 打包的目录
+ * @param string $fileName 下载文件名,默认为打包后的文件名
+ * @throws InvalidArgumentException
+ * @return void
+ */
+ public function exportZipForDir($downloadZip, $dirPath, $fileName = null)
+ {
+ if (!is_dir($dirPath)) {
+ throw new InvalidArgumentException('打包目录不存在!');
+ }
+ // 初始化Zip并打开
+ $zip = new \ZipArchive();
+ // 初始化
+ $bool = $zip->open($downloadZip, \ZIPARCHIVE::CREATE | \ZipArchive::OVERWRITE);
+ if ($bool !== true) {
+ throw new RuntimeException('PHP-ZipArchive扩展打开文件失败, Code:' . $bool);
+ }
+ // 打开目录,压缩文件
+ $this->compressZip($zip, opendir($dirPath), $dirPath);
+ // 关闭Zip对象
+ $zip->close();
+
+ // 下载Zip包
+ $fileName = $fileName ? $fileName : basename($downloadZip);
+ header('Cache-Control: max-age=0');
+ header('Content-Description: File Transfer');
+ header('Content-disposition: attachment; filename=' . $fileName);
+ header('Content-Type: application/zip');
+ header('Content-Transfer-Encoding: binary');
+ header('Content-Length: ' . filesize($downloadZip));
+ // 清空文件的头部信息,解决文件下载无法打开问题
+ ob_clean();
+ flush();
+ readfile($downloadZip);
+ }
+
+ /**
+ * 压缩添加目录文件到zip压缩包中
+ *
+ * @param \ZipArchive $zip zip句柄
+ * @param mixed $fileResource 文件列表句柄
+ * @param string $sourcePath 资源路径
+ * @param string $compressPath 添加zip句柄中的文件路径
+ * @return void
+ */
+ protected function compressZip($zip, $fileResource, $sourcePath, $compressPath = '')
+ {
+ while (($file = readdir($fileResource)) != false) {
+ if ($file == "." || $file == "..") {
+ continue;
+ }
+
+ $sourceTemp = $sourcePath . '/' . $file;
+ $newTemp = $compressPath == '' ? $file : $compressPath . '/' . $file;
+ if (is_dir($sourceTemp)) {
+ $zip->addEmptyDir($newTemp);
+ $this->compressZip($zip, opendir($sourceTemp), $sourceTemp, $newTemp);
+ }
+ if (is_file($sourceTemp)) {
+ $zip->addFile($sourceTemp, $newTemp);
+ }
+ }
+ }
+
+ /**
+ * 解压压缩包
+ *
+ * @param string $zipName 要解压的压缩包
+ * @param string $dest 解压到指定目录
+ * @return boolean
+ */
+ public function unZip($zipName, $dest)
+ {
+ // 检测要解压压缩包是否存在
+ if (!is_file($zipName)) {
+ return false;
+ }
+ // 检测目标路径是否存在
+ if (!is_dir($dest)) {
+ mkdir($dest, 0777, true);
+ }
+ // 初始化Zip并打开
+ $zip = new \ZipArchive();
+ // 打开并解压
+ if ($zip->open($zipName)) {
+ $zip->extractTo($dest);
+ $zip->close();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 输出下载文件
+ * 可以指定下载显示的文件名,并自动发送相应的Header信息
+ * 如果指定了content参数,则下载该参数的内容
+ *
+ * @param string $filename 下载文件名
+ * @param string $showname 下载显示的文件名
+ * @param integer $expire 下载内容浏览器缓存时间
+ * @throws InvalidArgumentException
+ * @return void
+ */
+ public function exportFile($filename, $showname = '', $expire = 180)
+ {
+ if (!file_exists($filename)) {
+ throw new InvalidArgumentException($filename . '下载文件不存在!');
+ }
+
+ $length = filesize($filename);
+ if (empty($showname)) {
+ $showname = $filename;
+ }
+ $showname = $this->getBaseName($showname);;
+ if (!empty($filename)) {
+ $finfo = new \finfo(FILEINFO_MIME);
+ $type = $finfo->file($filename);
+ } else {
+ $type = "application/octet-stream";
+ }
+ // 发送Http Header信息 开始下载
+ header("Pragma: public");
+ header("Cache-Control: max-age=" . $expire);
+ // header('Cache-Control: no-store, no-cache, must-revalidate');
+ header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expire) . "GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . "GMT");
+ header("Content-Disposition: attachment; filename=" . $showname);
+ header("Content-Length: " . $length);
+ header("Content-type: " . $type);
+ header('Content-Encoding: none');
+ header("Content-Transfer-Encoding: binary");
+ // 清空文件的头部信息,解决文件下载无法打开问题
+ ob_clean();
+ flush();
+ readfile($filename);
+ }
+
+ /**
+ * 获取文件的名称,兼容中文名
+ *
+ * @return string
+ */
+ public function getBaseName($filename)
+ {
+ return preg_replace('/^.+[\\\\\\/]/', '', $filename);
+ }
+
+ /**
+ * 二维码图片
+ *
+ * @param string $text 生成二维码的内容
+ * @param boolean|string $outfile 保存文件, false则不保存,字符串路径则表示保存路径
+ * @param integer $level 压缩错误级别
+ * @param integer $size 图片尺寸 0-3
+ * @param integer $margin 图片边距
+ * @param boolean $saveandprint 是否输出图片及保存文件
+ * @return void
+ */
+ public function qrcode($text, $outfile = false, $level = 0, $size = 8, $margin = 1, $saveandprint = false)
+ {
+ return QRcode::png($text, $outfile, $level, $size, $margin, $saveandprint);
+ }
+
+ /**
+ * 下载保存文件
+ *
+ * @param string $url 下载的文件路径
+ * @param string $savePath 保存的文件路径
+ * @param string $filename 保存的文件名称
+ * @param boolean $createDir 是否自动创建二级目录进行保存
+ * @throws RuntimeException|InvalidArgumentException
+ * @return string
+ */
+ public function download($url, $savePath, $filename = '', $createDir = true)
+ {
+ $path = $createDir ? ($savePath . '/' . date('Ym') . '/') : ($savePath . '/');
+ if (!is_dir($path)) {
+ $create = mkdir($path, 0777, true);
+ if (!$create) {
+ throw new RuntimeException('创建下载文件保存目录失败!');
+ }
+ } else if (!is_writable($path)) {
+ throw new InvalidArgumentException('下载文件保存路径不可写入!');
+ }
+
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
+ // 判断是否为https请求
+ $ssl = strtolower(mb_substr($url, 0, 8)) == "https://" ? true : false;
+ if ($ssl) {
+ curl_setopt($ch, CURLOPT_SSLVERSION, false);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+ }
+
+ $file = curl_exec($ch);
+ curl_close($ch);
+ $filename = empty($filename) ? pathinfo($url, PATHINFO_BASENAME) : $filename;
+ $resource = fopen($path . $filename, 'a');
+
+ fwrite($resource, $file);
+ fclose($resource);
+ return $path . $filename;
+ }
+
+ /**
+ * RGB颜色值转十六进制
+ *
+ * @param string|array $reg reg颜色值
+ * @return string
+ */
+ public function rgb2hex($rgb)
+ {
+ if (is_array($rgb)) {
+ $match = $rgb;
+ } else if (mb_strpos($rgb, 'rgb(') === 0) {
+ // 判断是否为rgb开头
+ $regexp = "/^rgb\(([0-9]{0,3})\,\s*([0-9]{0,3})\,\s*([0-9]{0,3})\)/";
+ preg_match($regexp, $rgb, $match);
+ $re = array_shift($match);
+ } else {
+ // 直接传入rgb的值
+ $match = explode(',', $rgb);
+ }
+
+ $hex_color = "#";
+ $hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
+ for ($i = 0; $i < 3; $i++) {
+ $r = null;
+ $c = $match[$i];
+ $hex_array = [];
+ while ($c > 16) {
+ $r = $c % 16;
+ $c = ($c / 16) >> 0;
+ array_push($hex_array, $hex[$r]);
+ }
+ array_push($hex_array, $hex[$c]);
+ $ret = array_reverse($hex_array);
+ $item = implode('', $ret);
+ $item = str_pad($item, 2, '0', STR_PAD_LEFT);
+ $hex_color .= $item;
+ }
+ return $hex_color;
+ }
+
+ /**
+ * 十六进制转RGB颜色
+ *
+ * @param string $hex_color 十六进制颜色值
+ * @return string
+ */
+ public function hex2rgb($hex_color)
+ {
+ $color = str_replace('#', '', $hex_color);
+ if (mb_strlen($color) > 3) {
+ $rgb = [
+ 'r' => hexdec(mb_substr($color, 0, 2)),
+ 'g' => hexdec(mb_substr($color, 2, 2)),
+ 'b' => hexdec(mb_substr($color, 4, 2))
+ ];
+ } else {
+ $color = $hex_color;
+ $r = mb_substr($color, 0, 1) . mb_substr($color, 0, 1);
+ $g = mb_substr($color, 1, 1) . mb_substr($color, 1, 1);
+ $b = mb_substr($color, 2, 1) . mb_substr($color, 2, 1);
+ $rgb = [
+ 'r' => hexdec($r),
+ 'g' => hexdec($g),
+ 'b' => hexdec($b)
+ ];
+ }
+ return $rgb;
+ }
+
+ /**
+ * base64转图片
+ *
+ * @param string $base64 图片base64
+ * @param string $path 保存路径
+ * @return boolean|integer
+ */
+ public function base64_img($base64, $path)
+ {
+ $base64Info = explode(',', $base64);
+ $content = base64_decode($base64Info[1]);
+ return File::instance()->createFile($content, $path, false);
+ }
+
+ /**
+ * 图片转base64
+ *
+ * @param string $path 图片路径
+ * @return string
+ */
+ public function img_base64($path)
+ {
+ $img = getimagesize($path);
+ $content = chunk_split(base64_encode(file_get_contents($path)));
+ $base64 = 'data:' . $img['mime'] . ';base64,' . $content;
+ return $base64;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Tree.php b/vendor/mongdch/mon-util/src/Tree.php
new file mode 100644
index 0000000..af009a4
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Tree.php
@@ -0,0 +1,456 @@
+
+ * @version 1.1 优化代码
+ */
+class Tree
+{
+ use Instance;
+
+ /**
+ * 生成树型结构所需要的2维数组
+ *
+ * @var array
+ */
+ public $data = [];
+
+ /**
+ * 配置信息
+ *
+ * @var array
+ */
+ protected $config = [
+ // 空格替换
+ 'nbsp' => " ",
+ // 主键
+ 'id' => 'id',
+ // 子ID键
+ 'pid' => 'pid',
+ // 顶级子ID
+ 'root' => 0,
+ // 分级前缀
+ 'icon' => ['│', '├', '└'],
+ // html生成模板
+ 'tpl' => [
+ 'ul' => '@name @childlist',
+ 'option' => '',
+ ],
+ ];
+
+ /**
+ * 构造方法
+ *
+ * @param array $config 配置信息
+ */
+ public function __construct($config = [])
+ {
+ $this->config = array_merge($this->config, $config);
+ }
+
+ /**
+ * 树初始化配置,支持链式操作
+ *
+ * @param array $config 配置信息
+ * @return Tree
+ */
+ public function init($config = [])
+ {
+ if ($config) {
+ $this->config = array_merge($this->config, $config);
+ }
+ return $this;
+ }
+
+ /**
+ * 设置操作的data数组, 支持链式操作
+ *
+ * @param array $arr 操作的数据
+ * @return Tree
+ */
+ public function data($arr)
+ {
+ $this->data = (array) $arr;
+ return $this;
+ }
+
+ /**
+ * 获取对应子级数据
+ *
+ * @param integer $pid 子级对应父级的PID
+ * @return array
+ */
+ public function getChild($pid)
+ {
+ $result = [];
+ foreach ($this->data as $value) {
+ if (!isset($value[$this->config['pid']])) {
+ // 不存在对应子键,跳过
+ continue;
+ }
+ if ($value[$this->config['pid']] == $pid) {
+ $result[] = $value;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * 递归获取对应所有子级后代的数据
+ *
+ * @param integer $pid 子级对应父级的PID
+ * @param boolean $self 是否包含自身
+ * @return array
+ */
+ public function getChildren($pid, $self = false)
+ {
+ $result = [];
+ foreach ($this->data as $value) {
+ if (!isset($value[$this->config['pid']])) {
+ // 不存在对应子键,跳过
+ continue;
+ }
+
+ if ($value[$this->config['pid']] == $pid) {
+ $result[] = $value;
+ // 递归获取
+ $result = array_merge($result, (array) $this->getChildren($value['id']));
+ } elseif ($self && $value[$this->config['id']] == $pid) {
+ $result[] = $value;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * 获取对应所有后代ID
+ *
+ * @param integer $pid 子级对应父级的PID
+ * @param boolean $self 是否包含自身
+ * @return array
+ */
+ public function getChildrenIds($pid, $self = false)
+ {
+ $result = [];
+ $list = $this->getChildren($pid, $self);
+ foreach ($list as $item) {
+ $result[] = $item[$this->config['id']];
+ }
+
+ return $result;
+ }
+
+ /**
+ * 获取当前节点对应父级数据
+ *
+ * @param integer $id 节点ID
+ * @return array
+ */
+ public function getParent($id)
+ {
+ $result = [];
+ $pid = 0;
+ foreach ($this->data as $value) {
+ if (!isset($value[$this->config['id']]) || !isset($value[$this->config['pid']])) {
+ // 不存在对应节点,跳过
+ continue;
+ }
+ if ($value[$this->config['id']] == $id) {
+ // 获取当前节点父节点ID
+ $pid = $value[$this->config['pid']];
+ break;
+ }
+ }
+ // 存在父级节点
+ if ($pid) {
+ foreach ($this->data as $item) {
+ if (!isset($item[$this->config['id']])) {
+ // 不存在对应节点,跳过
+ continue;
+ }
+ if ($item[$this->config['id']] == $pid) {
+ // 获取当前节点父节点ID
+ $result = $item;
+ break;
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * 递归获取当前节点所有父级数据
+ *
+ * @param integer $id 节点ID
+ * @param boolean $self 是否包含自身
+ * @return array
+ */
+ public function getParents($id, $self = false)
+ {
+ $result = [];
+ $pid = 0;
+ foreach ($this->data as $value) {
+ if (!isset($value[$this->config['id']]) || !isset($value[$this->config['pid']])) {
+ // 不存在对应节点,跳过
+ continue;
+ }
+ if ($value[$this->config['id']] == $id) {
+ if ($self) {
+ // 包含自身
+ $result[] = $value;
+ }
+ // 获取父级ID
+ $pid = $value[$this->config['pid']];
+ break;
+ }
+ }
+
+ // 存在父级节点
+ if ($pid) {
+ $result = array_merge((array) $this->getParents($pid, true), $result);
+ }
+
+ return $result;
+ }
+
+ /**
+ * 递归获取当前节点所有父级ID
+ *
+ * @param integer $id 节点ID
+ * @param boolean $self 是否包含自身
+ * @return array
+ */
+ public function getParentsIds($id, $self)
+ {
+ $result = [];
+ $list = $this->getParents($id, $self);
+ foreach ($list as $item) {
+ $result[] = $item[$this->config['id']];
+ }
+
+ return $result;
+ }
+
+ /**
+ * 组成树结构
+ *
+ * @param string $mark 子级标志位
+ * @return array
+ */
+ public function getTree($mark = 'child')
+ {
+ // 创建Tree
+ $tree = [];
+ // 创建基于主键的数组引用
+ $refer = [];
+ foreach ($this->data as $key => $data) {
+ $refer[$data[$this->config['id']]] = &$this->data[$key];
+ }
+ foreach ($this->data as $key => $data) {
+ // 判断是否存在parent
+ $parentId = $data[$this->config['pid']];
+ if ($this->config['root'] == $parentId) {
+ $this->data[$key]['haschild'] = 1;
+ $tree[] = &$this->data[$key];
+ } elseif (isset($refer[$parentId])) {
+ $parent = &$refer[$parentId];
+ $this->data[$key]['_mark_'] = $this->config['icon'][2];
+ $parent[$mark][] = &$this->data[$key];
+ }
+ }
+ return $tree;
+ }
+
+ /**
+ * 回滚由getTree方法生成的树结果为二维数组
+ *
+ * @param array $data 树结构数据
+ * @param string $mark 子级标志位
+ * @return array
+ */
+ public function rollbackTree($data, $mark = 'child')
+ {
+ $result = [];
+ foreach ($data as $k => $v) {
+ // 判断是否存在子集
+ $child = isset($v[$mark]) ? $v[$mark] : [];
+ unset($v[$mark]);
+ $result[] = $v;
+ if ($child) {
+ // 递归合并
+ $result = array_merge($result, (array) $this->rollbackTree($child, $mark));
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * 生成Option树型结构
+ *
+ * @param integer $pid 表示获得这个ID下的所有子级
+ * @param string $itemtpl 条目模板 如:""
+ * @param mixed $selectedids 被选中的ID,比如在做树型下拉框的时候需要用到
+ * @param mixed $disabledids 被禁用的ID,比如在做树型下拉框的时候需要用到
+ * @param string $itemprefix 每一项前缀
+ * @param string $toptpl 顶级栏目的模板
+ * @return string
+ */
+ public function getTreeOption($pid, $itemtpl = null, $selectedids = '', $disabledids = '', $itemprefix = '', $toptpl = '')
+ {
+ $itemtpl = is_null($itemtpl) ? $this->config['tpl']['option'] : $itemtpl;
+ $ret = '';
+ $number = 1;
+ $childs = $this->getChild($pid);
+ if ($childs) {
+ $total = count($childs);
+ foreach ($childs as $value) {
+ $id = $value[$this->config['id']];
+ $j = $k = '';
+ if ($number == $total) {
+ $j .= $this->config['icon'][2];
+ $k = $itemprefix ? $this->config['nbsp'] : '';
+ } else {
+ $j .= $this->config['icon'][1];
+ $k = $itemprefix ? $this->config['icon'][0] : '';
+ }
+ $spacer = $itemprefix ? $itemprefix . $j : '';
+ // 判断是否需要选中
+ $selected = '';
+ if ($selectedids) {
+ $in = (is_array($selectedids)) ? $selectedids : explode(",", $selectedids);
+ $selected = in_array($id, $in) ? "selected" : '';
+ }
+ // 判断是否需要禁用
+ $disabled = '';
+ if ($disabledids) {
+ $in = (is_array($disabledids)) ? $disabledids : explode(",", $disabledids);
+ $disabled = in_array($id, $in) ? "disabled" : '';
+ }
+ $value = array_merge($value, array('selected' => $selected, 'disabled' => $disabled, 'spacer' => $spacer));
+ $value = array_combine(array_map(function ($k) {
+ return '@' . $k;
+ }, array_keys($value)), $value);
+ $nstr = strtr((($value["@{$this->config['pid']}"] == 0 || $this->getChild($id)) && $toptpl ? $toptpl : $itemtpl), $value);
+ $ret .= $nstr;
+ $ret .= $this->getTreeOption($id, $itemtpl, $selectedids, $disabledids, $itemprefix . $k . $this->config['nbsp'], $toptpl);
+ $number++;
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * 树型结构UL
+ *
+ * @param integer $pid 表示获得这个ID下的所有子级
+ * @param string $itemtpl 条目模板 如:"@name @childlist"
+ * @param string $selectedids 选中的ID
+ * @param string $disabledids 禁用的ID
+ * @param string $wraptag 子列表包裹标签
+ * @return string
+ */
+ public function getTreeUl($pid, $itemtpl = null, $selectedids = '', $disabledids = '', $wraptag = 'ul', $wrapattr = '')
+ {
+ $itemtpl = is_null($itemtpl) ? $this->config['tpl']['ul'] : $itemtpl;
+ $str = '';
+ $childs = $this->getChild($pid);
+ if ($childs) {
+ foreach ($childs as $value) {
+ $id = $value[$this->config['id']];
+ unset($value['child']);
+ // 判断是否需要选中
+ $selected = '';
+ if ($selectedids) {
+ $in = (is_array($selectedids)) ? $selectedids : explode(",", $selectedids);
+ $selected = in_array($id, $in) ? "selected" : '';
+ }
+ // 判断是否需要禁用
+ $disabled = '';
+ if ($disabledids) {
+ $in = (is_array($disabledids)) ? $disabledids : explode(",", $disabledids);
+ $disabled = in_array($id, $in) ? "disabled" : '';
+ }
+ $value = array_merge($value, array('selected' => $selected, 'disabled' => $disabled));
+ $value = array_combine(array_map(function ($k) {
+ return '@' . $k;
+ }, array_keys($value)), $value);
+ $nstr = strtr($itemtpl, $value);
+ $childdata = $this->getTreeUl($id, $itemtpl, $selectedids, $disabledids, $wraptag, $wrapattr);
+ $childlist = $childdata ? "<{$wraptag} {$wrapattr}>" . $childdata . "{$wraptag}>" : "";
+ $str .= strtr($nstr, array('@childlist' => $childlist));
+ }
+ }
+ return $str;
+ }
+
+ /**
+ * 获取树状数组
+ *
+ * @param string $myid 要查询的ID
+ * @param string $nametpl 名称条目模板
+ * @param string $itemprefix 前缀
+ * @return string
+ */
+ public function getTreeArray($myid, $itemprefix = '')
+ {
+ $childs = $this->getChild($myid);
+ $n = 0;
+ $data = [];
+ $number = 1;
+ if ($childs) {
+ $total = count($childs);
+ foreach ($childs as $id => $value) {
+ $j = $k = '';
+ if ($number == $total) {
+ $j .= $this->config['icon'][2];
+ $k = $itemprefix ? $this->config['nbsp'] : '';
+ } else {
+ $j .= $this->config['icon'][1];
+ $k = $itemprefix ? $this->config['icon'][0] : '';
+ }
+ $spacer = $itemprefix ? $itemprefix . $j : '';
+ $value['spacer'] = $spacer;
+ $data[$n] = $value;
+ $data[$n]['childlist'] = $this->getTreeArray($value['id'], $itemprefix . $k . $this->config['nbsp']);
+ $n++;
+ $number++;
+ }
+ }
+ return $data;
+ }
+
+ /**
+ * 将getTreeArray的结果返回为二维数组
+ *
+ * @param array $data 树结构数据
+ * @param string $field 字段名称
+ * @return array
+ */
+ public function getTreeList($data = [], $field = 'name')
+ {
+ $arr = [];
+ foreach ($data as $k => $v) {
+ $childlist = isset($v['childlist']) ? $v['childlist'] : [];
+ unset($v['childlist']);
+ $v[$field] = $v['spacer'] . ' ' . $v[$field];
+ $v['haschild'] = ($childlist || $v['pid'] == 0) ? 1 : 0;
+ if ($v['id']) {
+ $arr[] = $v;
+ }
+ if ($childlist) {
+ $arr = array_merge($arr, $this->getTreeList($childlist, $field));
+ }
+ }
+ return $arr;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/UploadFile.php b/vendor/mongdch/mon-util/src/UploadFile.php
new file mode 100644
index 0000000..7d19722
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/UploadFile.php
@@ -0,0 +1,294 @@
+
+ * @version 1.0.0
+ */
+class UploadFile
+{
+ /**
+ * 配置信息
+ *
+ * @var array
+ */
+ protected $config = [
+ // 允许上传的文件MiMe类型
+ 'mimes' => [],
+ // 上传的文件大小限制,0不做限制
+ 'maxSize' => 0,
+ // 允许上传的文件后缀
+ 'exts' => [],
+ // 保存根路径
+ 'rootPath' => '',
+ ];
+
+ /**
+ * 上传文件的信息
+ *
+ * @var array
+ */
+ protected $file = [];
+
+ /**
+ * 构造方法
+ *
+ * @param array $config 自定义配置信息
+ */
+ public function __construct(array $config = [])
+ {
+ $this->config = array_merge($this->config, $config);
+ }
+
+ /**
+ * 获取配置信息
+ *
+ * @param string $name 配置名称
+ * @return mixed 配置值
+ */
+ public function __get($name)
+ {
+ return $this->config[$name];
+ }
+
+ /**
+ * 设置配置信息
+ *
+ * @param string $name 配置名称
+ * @param mixed $value 配置值
+ * @return void
+ */
+ public function __set($name, $value)
+ {
+ if (isset($this->config[$name])) {
+ $this->config[$name] = $value;
+ }
+ }
+
+ /**
+ * 获取所有配置信息
+ *
+ * @return array
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * 获取上传文件信息
+ *
+ * @return mixed
+ */
+ public function getFile()
+ {
+ return $this->file;
+ }
+
+ /**
+ * 文件上传
+ *
+ * @param string $name 文件流索引
+ * @param string $files 文件流,默认 $_FILES
+ * @throws UploadException
+ * @return UploadFile
+ */
+ public function upload($name = 'file', $files = null)
+ {
+ if (is_null($files)) {
+ $files = $_FILES;
+ }
+ if (empty($files) || !isset($files[$name])) {
+ throw new UploadException('未上传文件', UploadException::ERROR_UPLOAD_FAILD);
+ }
+ // 检测上传保存路径
+ if (!$this->checkRootPath()) {
+ return false;
+ }
+ $file = $files[$name];
+ // 安全过滤文件名
+ $file['name'] = strip_tags($file['name']);
+ // 获取上传文件后缀,允许上传无后缀文件
+ $file['ext'] = pathinfo($file['name'], PATHINFO_EXTENSION);
+ // 检测文件
+ if (!$this->checkFile($file) || !$this->checkImg($file)) {
+ return false;
+ }
+ // 文件md5
+ $file['md5'] = md5_file($file['tmp_name']);
+ // 文件sha1
+ $file['sha1'] = sha1_file($file['tmp_name']);
+
+ $this->file = $file;
+ return $this;
+ }
+
+ /**
+ * 保存上传的文件
+ *
+ * @param string $fileName 保存文件名
+ * @param string $saveDir 基于 rootPath 路径下的多级目录存储路径
+ * @param boolean $replace 是否替换旧文件
+ * @throws UploadException
+ * @return UploadFile
+ */
+ public function save($fileName = '', $saveDir = '', $replace = true)
+ {
+ if (empty($this->file)) {
+ throw new UploadException('未获取上传的文件', UploadException::ERROR_UPLOAD_NOT_FOUND);
+ }
+ // 多级目录存储
+ $savePath = $this->config['rootPath'] . DIRECTORY_SEPARATOR . $saveDir;
+ if (!empty($saveDir) && !is_dir($savePath)) {
+ if (!File::instance()->createDir($savePath)) {
+ throw new UploadException('创建文件存储目录失败', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ }
+ $fileName = empty($fileName) ? uniqid(mt_rand()) . '.' . $this->file['ext'] : $fileName;
+ $saveName = $savePath . $fileName;
+ if (!$replace && is_file($saveName)) {
+ throw new UploadException('文件已存在', UploadException::ERROR_UPLOAD_EXISTS);
+ }
+ if (!move_uploaded_file($this->file['tmp_name'], $saveName)) {
+ throw new UploadException('文件上传保存错误', UploadException::ERROR_UPLOAD_SAVE_FAILD);
+ }
+ $this->file['savePath'] = $saveName;
+ $this->file['saveName'] = $fileName;
+
+ return $this;
+ }
+
+ /**
+ * 检测上传根目录
+ *
+ * @throws UploadException
+ * @return boolean
+ */
+ protected function checkRootPath()
+ {
+ if (!(is_dir($this->config['rootPath']) && is_writable($this->config['rootPath']))) {
+ throw new UploadException('上传目录不存在或不可写入!请尝试手动创建:' . $this->config['rootPath'], UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ return true;
+ }
+
+ /**
+ * 检测文件
+ *
+ * @param string $file 文件路径
+ * @throws UploadException
+ * @return boolean
+ */
+ protected function checkFile($file)
+ {
+ if ($file['error']) {
+ throw new UploadException($this->uploadErrorMsg($file['error']), UploadException::ERROR_UPLOAD_CHECK_FAILD);
+ }
+ // 无效上传
+ if (empty($file['name'])) {
+ throw new UploadException('未知上传错误', UploadException::ERROR_UPLOAD_NOT_MESSAGE);
+ }
+ // 检查是否合法上传
+ if (!is_uploaded_file($file['tmp_name'])) {
+ throw new UploadException('非法上传文件', UploadException::ERROR_UPLOAD_ILLEGAL);
+ }
+ // 检查文件大小
+ if (!$this->checkSize($file['size'])) {
+ throw new UploadException('上传文件大小不符', UploadException::ERROR_UPLOAD_SIZE_FAILD);
+ }
+ // 检查文件Mime类型
+ if (!$this->checkMime($file['type'])) {
+ throw new UploadException('上传文件MIME类型不允许', UploadException::ERROR_UPLOAD_MINI_FAILD);
+ }
+ // 检查文件后缀
+ if (!$this->checkExt($file['ext'])) {
+ throw new UploadException('上传文件后缀不允许', UploadException::ERROR_UPLOAD_EXT_FAILD);
+ }
+
+ return true;
+ }
+
+ /**
+ * 检测图片
+ *
+ * @param string $file 文件路径
+ * @throws UploadException
+ * @return boolean
+ */
+ protected function checkImg($file)
+ {
+ $ext = strtolower($file['ext']);
+ if (in_array($ext, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf'])) {
+ $imginfo = getimagesize($file['tmp_name']);
+ if (empty($imginfo) || ('gif' == $ext && empty($imginfo['bits']))) {
+ throw new UploadException('非法图像文件', UploadException::ERROR_UPLOAD_NOT_IMG);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * 检查文件大小是否合法
+ *
+ * @param integer $size 文件大小
+ * @return boolean
+ */
+ protected function checkSize($size)
+ {
+ return !($size > $this->config['maxSize']) || (0 == $this->config['maxSize']);
+ }
+
+ /**
+ * 检查上传的文件MIME类型是否合法
+ *
+ * @param string $mime 文件类型
+ * @return boolean
+ */
+ protected function checkMime($mime)
+ {
+ return empty($this->config['mimes']) ? true : in_array(strtolower($mime), $this->config['mimes']);
+ }
+
+ /**
+ * 检查上传的文件后缀是否合法
+ *
+ * @param string $ext 文件后缀
+ * @return boolean
+ */
+ private function checkExt($ext)
+ {
+ return empty($this->config['exts']) ? true : in_array(strtolower($ext), $this->config['exts']);
+ }
+
+ /**
+ * 获取错误代码信息
+ *
+ * @param integer $errorNo 错误号
+ * @return string
+ */
+ protected function uploadErrorMsg($errorNo)
+ {
+ switch ($errorNo) {
+ case 1:
+ return '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值!';
+ case 2:
+ return '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值!';
+ case 3:
+ return '文件只有部分被上传!';
+ case 4:
+ return '没有文件被上传!';
+ case 6:
+ return '找不到临时文件夹!';
+ case 7:
+ return '文件写入失败!';
+ default:
+ return '未知上传错误!';
+ }
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/UploadImg.php b/vendor/mongdch/mon-util/src/UploadImg.php
new file mode 100644
index 0000000..6bcee68
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/UploadImg.php
@@ -0,0 +1,153 @@
+
+ * @version v1.1 增加图片大小限制
+ */
+class UploadImg
+{
+ /**
+ * 文件保存路径
+ *
+ * @var string
+ */
+ protected $path = '';
+
+ /**
+ * 文件保存名称
+ *
+ * @var string
+ */
+ protected $name = '';
+
+ /**
+ * 设置默认文件保存路径
+ *
+ * @param string $path 保存的文件路径
+ * @return UploadImg
+ */
+ public function setPath($path)
+ {
+ $this->path = $path;
+ return $this;
+ }
+
+ /**
+ * 获取默认文件保存路径
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->path;
+ }
+
+ /**
+ * 设置默认文件保存名称
+ *
+ * @param string $name 保存的文件名称
+ * @return UploadImg
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+ return $this;
+ }
+
+ /**
+ * 获取默认文件保存名称
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * 保存上传图片
+ *
+ * @param string $data 图片base64
+ * @param string $path 保存路径
+ * @param string $name 保存名称
+ * @param string $maxSize 图片最大尺寸, 0或空则不验证
+ * @throws UploadException
+ * @return string
+ */
+ public function upload($data, $path = '', $name = '', $maxSize = '2048000')
+ {
+ $img_base64 = explode('base64,', $data);
+ if (!$img_base64) {
+ throw new UploadException('未获取到图片数据', UploadException::ERROR_UPLOAD_FAILD);
+ }
+
+ $img = base64_decode(trim($img_base64[1]));
+ $img_type = explode('/', trim($img_base64[0], ';'));
+ switch (strtolower($img_type[1])) {
+ case 'jpeg':
+ case 'jpg':
+ $img_suffix = "jpg";
+ break;
+ case 'png':
+ $img_suffix = "png";
+ break;
+ case 'gif':
+ $img_suffix = "gif";
+ break;
+ default:
+ throw new UploadException('图片类型错误', UploadException::ERROR_UPLOAD_NOT_IMG);
+ }
+
+ if (!empty($maxSize) && mb_strlen($data) > $maxSize) {
+ throw new UploadException('文件大小超出', UploadException::ERROR_UPLOAD_SIZE_FAILD);
+ }
+
+ return $this->saveImg($img, $img_suffix, $path, $name);
+ }
+
+ /**
+ * 保存图片
+ *
+ * @param string $img 内容
+ * @param string $suffix 文件名称后缀
+ * @param string $path 保存路径
+ * @param string $name 保存文件名
+ * @throws UploadException
+ * @return string
+ */
+ protected function saveImg($img, $suffix, $path, $name)
+ {
+ $path = empty($path) ? $this->path : $path;
+ $name = empty($name) ? $this->name : $name;
+ // 检测目录是否存在, 不存在则创建
+ if (!is_dir($path) && !mkdir($path, 0755, true)) {
+ throw new UploadException('保存图片失败,文件目录不存在', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+
+ $file_name = $this->buildName($name) . '.' . $suffix;
+ $path = $path . DIRECTORY_SEPARATOR . $file_name;
+ $save = File::instance()->createFile($img, $path, false);
+ if ($save === false) {
+ throw new UploadException('保存图片失败', UploadException::ERROR_UPLOAD_SAVE_FAILD);
+ }
+
+ return $file_name;
+ }
+
+ /**
+ * 获取文章保存名称
+ *
+ * @param string $name 文件名
+ * @return string
+ */
+ protected function buildName($name)
+ {
+ return empty($name) ? uniqid(mt_rand()) : $name;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/UploadSlice.php b/vendor/mongdch/mon-util/src/UploadSlice.php
new file mode 100644
index 0000000..2e0286a
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/UploadSlice.php
@@ -0,0 +1,263 @@
+
+ * @version 1.0.1 优化代码 2022-07-08
+ */
+class UploadSlice
+{
+ /**
+ * 配置信息
+ *
+ * @var array
+ */
+ protected $config = [
+ // 允许上传的文件后缀
+ 'exts' => [],
+ // 分片文件大小限制
+ 'sliceSize' => 0,
+ // 保存根路径
+ 'rootPath' => '',
+ // 临时文件存储路径,基于rootPath
+ 'tmpPath' => 'tmp'
+ ];
+
+ /**
+ * 错误的分片序号
+ *
+ * @var array
+ */
+ protected $error_chunk = [];
+
+ /**
+ * 构造方法
+ *
+ * @param array $config 自定义配置信息
+ */
+ public function __construct(array $config = [])
+ {
+ $this->config = array_merge($this->config, $config);
+ }
+
+ /**
+ * 获取配置信息
+ *
+ * @return array
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * 设置配置信息
+ *
+ * @param array|string $config 配置信息或配置节点
+ * @param mixed $value 值
+ * @return UploadSlice
+ */
+ public function setConifg($config, $value = null)
+ {
+ if (is_array($config)) {
+ $this->config = array_merge($this->config, $config);
+ } else {
+ $this->config[$config] = $value;
+ }
+
+ return $this;
+ }
+
+ /**
+ * 获取错误的分片序号
+ *
+ * @return array
+ */
+ public function getErrorChunk()
+ {
+ return $this->error_chunk;
+ }
+
+ /**
+ * 保存上传的文件分片到临时文件目录
+ *
+ * @param string $fileID 文件唯一ID
+ * @param integer $chunk 文件分片序号,从0递增到N
+ * @param array $files 文件流,默认 $_FILES
+ * @param string $name 文件流索引,默认 file
+ * @throws UploadException
+ * @return false|array 文件保存路径
+ */
+ public function upload($fileID, $chunk = 0, $name = 'file', $files = null)
+ {
+ if (is_null($files)) {
+ $files = $_FILES;
+ }
+ if (empty($files) || !isset($files[$name])) {
+ throw new UploadException('未上传文件', UploadException::ERROR_UPLOAD_FAILD);
+ }
+ // 检测上传保存路径
+ if (!$this->checkPath()) {
+ return false;
+ }
+ // 文件信息
+ $file = $files[$name];
+ // 校验文件
+ if (!$this->checkFile($file)) {
+ return false;
+ }
+ // 保存临时文件
+ $fileName = md5($fileID) . '_' . $chunk;
+ $tmpPath = $this->config['rootPath'] . DIRECTORY_SEPARATOR . $this->config['tmpPath'] . DIRECTORY_SEPARATOR . $fileID;
+ if (!File::instance()->createDir($tmpPath)) {
+ throw new UploadException('创建临时文件存储目录失败', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ $savePath = $tmpPath . DIRECTORY_SEPARATOR . $fileName;
+ if (!move_uploaded_file($file['tmp_name'], $savePath)) {
+ throw new UploadException('临时文件保存失败', UploadException::ERROR_UPLOAD_SAVE_FAILD);
+ }
+
+ return ['savePath' => $savePath, 'saveDir' => $tmpPath, 'fileName' => $fileName];
+ }
+
+ /**
+ * 合并分片临时文件,生成上传文件
+ *
+ * @param string $fileID 文件唯一ID
+ * @param integer $chunkLength 文件分片长度
+ * @param string $fileName 保存文件名
+ * @param string $saveDir 基于 rootPath 路径下的多级目录存储路径
+ * @throws UploadException
+ * @return array 文件保存路径
+ */
+ public function merge($fileID, $chunkLength, $fileName, $saveDir = '')
+ {
+ // 分片临时文件存储目录
+ $tmpPath = $this->config['rootPath'] . DIRECTORY_SEPARATOR . $this->config['tmpPath'] . DIRECTORY_SEPARATOR . $fileID;
+ if (!is_dir($tmpPath)) {
+ throw new UploadException('临时文件不存在', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ // 验证文件名
+ $ext = File::instance()->getExt($fileName);
+ if (!empty($this->config['exts']) && !in_array($ext, $this->config['exts'])) {
+ throw new UploadException('不支持文件保存类型', UploadException::ERROR_UPLOAD_EXT_FAILD);
+ }
+ // 多级目录存储
+ $savePath = $this->config['rootPath'] . DIRECTORY_SEPARATOR . $saveDir;
+ if (!empty($saveDir) && !is_dir($savePath)) {
+ if (!File::instance()->createDir($savePath)) {
+ throw new UploadException('创建文件存储目录失败', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ }
+ // 验证分片文件完整性
+ $this->error_chunk = [];
+ $chunkName = md5($fileID);
+ for ($i = 0; $i < $chunkLength; $i++) {
+ $checkName = $chunkName . '_' . $i;
+ $chunkPath = $tmpPath . DIRECTORY_SEPARATOR . $checkName;
+ if (!file_exists($chunkPath)) {
+ $this->error_chunk[] = $i;
+ throw new UploadException('分片文件不完整', UploadException::ERROR_CHUNK_FAILD);
+ }
+ }
+ // 合并文件
+ $saveFile = $savePath . DIRECTORY_SEPARATOR . $fileName;
+ // 打开保存文件句柄
+ $writerFp = fopen($saveFile, "ab");
+ for ($k = 0; $k < $chunkLength; $k++) {
+ $checkName = $chunkName . '_' . $k;
+ $chunkPath = $tmpPath . DIRECTORY_SEPARATOR . $checkName;
+ // 读取临时文件
+ $readerFp = fopen($chunkPath, "rb");
+ // 写入
+ fwrite($writerFp, fread($readerFp, filesize($chunkPath)));
+ // 关闭句柄
+ fclose($readerFp);
+ unset($readerFp);
+ // 删除临时文件
+ File::instance()->removeFile($chunkPath);
+ }
+ // 关闭保存文件句柄
+ fclose($writerFp);
+ // 删除临时目录
+ File::instance()->removeDir($tmpPath);
+
+ return ['savePath' => $saveFile, 'saveDir' => $savePath, 'fileName' => $fileName];
+ }
+
+ /**
+ * 校验文件
+ *
+ * @param array $file 文件信息
+ * @return boolean
+ */
+ protected function checkFile($file)
+ {
+ if ($file['error']) {
+ throw new UploadException($this->uploadErrorMsg($file['error']), UploadException::ERROR_UPLOAD_CHECK_FAILD);
+ }
+ // 无效上传
+ if (empty($file['name'])) {
+ throw new UploadException('未知上传错误', UploadException::ERROR_UPLOAD_NOT_MESSAGE);
+ }
+ // 检查是否合法上传
+ if (!is_uploaded_file($file['tmp_name'])) {
+ throw new UploadException('非法上传文件', UploadException::ERROR_UPLOAD_ILLEGAL);
+ }
+ if ($file['size'] > $this->config['sliceSize'] && $this->config['sliceSize'] > 0) {
+ throw new UploadException('分片文件大小不符', UploadException::ERROR_UPLOAD_SIZE_FAILD);
+ }
+
+ return true;
+ }
+
+ /**
+ * 检测上传根目录
+ *
+ * @throws UploadException
+ * @return boolean
+ */
+ protected function checkPath()
+ {
+ $rootPath = $this->config['rootPath'];
+ if ((!is_dir($rootPath) && !File::instance()->createDir($rootPath)) || (is_dir($rootPath) && !is_writable($rootPath))) {
+ throw new UploadException('上传文件保存目录不可写入:' . $rootPath, UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ $tmpPath = $rootPath . DIRECTORY_SEPARATOR . $this->config['tmpPath'];
+ if ((!is_dir($tmpPath) && !File::instance()->createDir($tmpPath)) || (is_dir($tmpPath) && !is_writable($tmpPath))) {
+ throw new UploadException('上传文件临时保存目录不可写入:' . $tmpPath, UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ return true;
+ }
+
+ /**
+ * 获取错误代码信息
+ *
+ * @param integer $errorNo 错误号
+ * @return string
+ */
+ protected function uploadErrorMsg($errorNo)
+ {
+ switch ($errorNo) {
+ case 1:
+ return '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值!';
+ case 2:
+ return '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值!';
+ case 3:
+ return '文件只有部分被上传!';
+ case 4:
+ return '没有文件被上传!';
+ case 6:
+ return '找不到临时文件夹!';
+ case 7:
+ return '文件写入失败!';
+ default:
+ return '未知上传错误!';
+ }
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/Validate.php b/vendor/mongdch/mon-util/src/Validate.php
new file mode 100644
index 0000000..8560b87
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/Validate.php
@@ -0,0 +1,769 @@
+
+ * @version 1.3.3 2021-04-26 优化代码,增加getError获取错误信息,check方法返回固定boolean值
+ */
+class Validate
+{
+ /**
+ * 对应待验证数据使用的验证规则
+ * [
+ * 'name' => 'required|length:3'
+ * ]
+ *
+ * @var array
+ */
+ public $rule = [];
+
+ /**
+ * 当前验证规则
+ *
+ * @var array
+ */
+ public $checkRule = [];
+
+ /**
+ * 待验证的数据
+ * [
+ * 'name' => 'abc',
+ * 'age' => '18'
+ * ]
+ *
+ * @var array
+ */
+ public $data = [];
+
+ /**
+ * 错误提示
+ * [
+ * 'name' => [
+ * 'required' => '名称未设置',
+ * 'length' => '长度错误'
+ * ]
+ * ]
+ *
+ * @var array
+ */
+ public $message = [];
+
+ /**
+ * 验证的场景
+ *
+ * @var array
+ */
+ public $scope = [];
+
+ /**
+ * 当前校验的场景
+ *
+ * @var mixed
+ */
+ public $checkScope = null;
+
+ /**
+ * 错误信息
+ *
+ * @var mixed
+ */
+ public $error = null;
+
+ /**
+ * 正则匹配规则
+ *
+ * @var array
+ */
+ protected $regex = [
+ 'moble' => '/^[1][3456789][0-9]{9}$/',
+ 'tel' => '/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/',
+ 'china' => '/^[\x{4e00}-\x{9fa5}]+$/u', // 中文
+ 'language' => '/^\w*$/', // 英文数字
+ 'alpha' => '/^[A-Za-z]+$/', // 只允许英文
+ 'account' => '/^[A-Za-z0-9\-\_]+$/', // 只允许字母、数字和下划线 破折号
+ 'lower' => '/^[a-z]+$/', // 小写字母
+ 'upper' => '/^[A-Z]+$/', // 大写字母
+ ];
+
+ /**
+ * 执行数据验证
+ *
+ * @param array $data 验证的数据
+ * @return boolean
+ */
+ public function check(array $data = [])
+ {
+ if (!empty($data) && is_array($data)) {
+ $this->data = array_merge($this->data, $data);
+ }
+ // 解析验证规则
+ $errorItme = null;
+ $checkRule = empty($this->checkRule) ? $this->rule : $this->checkRule;
+ // 判断是否存在验证场景,获取验证字段
+ if (!empty($this->checkScope) && is_array($this->checkScope)) {
+ foreach ($this->checkScope as $v) {
+ if (isset($checkRule[$v])) {
+ $scopeRule[$v] = $checkRule[$v];
+ }
+ }
+ $this->checkScope = null;
+ } else {
+ $scopeRule = $checkRule;
+ }
+
+ foreach ($scopeRule as $dataItem => $rules) {
+ // 分割获取验证规则
+ $rule = is_array($rules) ? $rules : explode("|", $rules);
+ // 存在节点,验证节点
+ if (isset($this->data[$dataItem])) {
+ $value = $this->data[$dataItem];
+ // 解析规则
+ $status = $this->analysis($value, $rule, $dataItem);
+ if ($status !== true) {
+ // 验证错误,返回[错误节点,错误规则]
+ $errorItme = [$dataItem, $status];
+ break;
+ }
+ } elseif (in_array('required', $rule)) {
+ // 不存在节点,返回节点不存在
+ $errorItme = [$dataItem, 'required'];
+ break;
+ }
+ }
+
+ // 不存在错误节点,验证通过
+ if (empty($errorItme)) {
+ return true;
+ }
+ // 存在错误提示信息, 返回错误提示信息
+ if (isset($this->message[$errorItme[0]])) {
+ if (is_string($this->message[$errorItme[0]])) {
+ // 字符串,直接返回提示
+ $this->error = $this->message[$errorItme[0]];
+ return false;
+ } elseif (isset($this->message[$errorItme[0]][$errorItme[1]])) {
+ // 数组,返回对应节点提示
+ $this->error = $this->message[$errorItme[0]][$errorItme[1]];
+ return false;
+ } else {
+ // 返回默认提示
+ $this->error = $errorItme[0] . ' check error';
+ return false;
+ }
+ }
+ // 返回默认提示
+ $this->error = $errorItme[0] . ' check faild';
+ return false;
+ }
+
+ /**
+ * check方法的异常处理封装,当验证不通过是抛出异常
+ *
+ * @param array $data
+ * @throws ValidateException
+ * @return true
+ */
+ public function checked(array $data = [])
+ {
+ $check = $this->check($data);
+ if ($check !== true) {
+ throw new ValidateException($this->getError(), 500);
+ }
+
+ return true;
+ }
+
+ /**
+ * 设置本次数据的验证规则
+ *
+ * @param array $rule 验证规则
+ * @return Validate
+ */
+ public function rule(array $rule = [])
+ {
+ $this->checkRule = $rule;
+
+ return $this;
+ }
+
+ /**
+ * 设置需要验证的数据
+ *
+ * @param array $data 验证的数据
+ * @return Validate
+ */
+ public function data(array $data = [])
+ {
+ $this->data = $data;
+
+ return $this;
+ }
+
+ /**
+ * 设置错误提示信息
+ *
+ * @param array $message 错误信息
+ * @return Validate
+ */
+ public function message($message = [])
+ {
+ $this->message = $message;
+
+ return $this;
+ }
+
+ /**
+ * 设置校验场景
+ *
+ * @param string|array $item 查询场景名称
+ * @return Validate
+ */
+ public function scope($item)
+ {
+ if (is_array($item)) {
+ $this->checkScope = $item;
+ }
+ if (is_string($item) && isset($this->scope[$item])) {
+ $this->checkScope = $this->scope[$item];
+ }
+
+ return $this;
+ }
+
+ /**
+ * 获取错误信息
+ *
+ * @return mixed
+ */
+ public function getError()
+ {
+ return $this->error;
+ }
+
+ ############################### 辅助方法 ###################################
+
+ /**
+ * 解析规则
+ *
+ * @param mixed $value 验证的值
+ * @param mixed $rule 对应的验证规则
+ * @param string $dataItem 验证的字段名
+ * @return true|string 成功返回true,失败返回验证失败的规则名称
+ */
+ protected function analysis($value, $rule, $dataItem)
+ {
+ $resule = true;
+ foreach ($rule as $key => $type) {
+ // 分割获取规则参数,支持二维。例子:max:9
+ $item = explode(":", $type, 2);
+ if (count($item) > 1) {
+ $status = $this->checkItem($dataItem, $value, $item[0], $item[1]);
+ } else {
+ $status = $this->checkItem($dataItem, $value, $item[0]);
+ }
+
+ // 判断验证是否通过,失败返回当前校验失败的规则名称
+ if (!$status) {
+ $resule = $item[0];
+ break;
+ }
+ }
+
+ return $resule;
+ }
+
+ /**
+ * 验证数据
+ *
+ * @param string $field 验证字段名称
+ * @param mixed $value 验证值
+ * @param string $rule 验证规则
+ * @param mixed $rule_data 规则参数
+ * @return boolean
+ */
+ protected function checkItem($field, $value, $rule, $rule_data = null)
+ {
+ if (!is_null($rule_data)) {
+ $resule = call_user_func_array([$this, $rule], [$value, $rule_data, $field]);
+ } else {
+ $resule = call_user_func_array([$this, $rule], [$value, $field]);
+ }
+
+ return $resule;
+ }
+
+ /**
+ * 获取数组或字符串长度
+ *
+ * @param mixed $value 操作的数据
+ * @return integer
+ */
+ protected function getLength($value)
+ {
+ if (is_array($value)) {
+ $length = count($value);
+ } else {
+ $length = mb_strlen((string) $value, 'UTF-8');
+ }
+
+ return $length;
+ }
+
+ ############################### 验证规则 ###################################
+
+ /**
+ * 不能为空
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function required($value)
+ {
+ return !empty($value) || '0' == $value;
+ }
+
+ /**
+ * 最大值
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $max 验证的数据
+ * @return boolean
+ */
+ public function max($value, $max)
+ {
+ return $this->num($value) && $value <= $max;
+ }
+
+ /**
+ * 最小值
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $min 验证的数据
+ * @return boolean
+ */
+ public function min($value, $min)
+ {
+ return $this->num($value) && $value >= $min;
+ }
+
+ /**
+ * 指定长度(数组或字符串)
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $length 验证的数据
+ * @return boolean
+ */
+ public function length($value, $length)
+ {
+ return $this->getLength($value) == $length;
+ }
+
+ /**
+ * 最大长度(数组或字符串)
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $maxLength 验证的数据
+ * @return boolean
+ */
+ public function maxLength($value, $maxLength)
+ {
+ return $this->getLength($value) <= $maxLength;
+ }
+
+ /**
+ * 最小长度(数组或字符串)
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $minLength 验证的数据
+ * @return boolean
+ */
+ public function minLength($value, $minLength)
+ {
+ return $this->getLength($value) >= $minLength;
+ }
+
+ /**
+ * 验证是否为一个有效的日期
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function date($value)
+ {
+ return strtotime($value) !== false;
+ }
+
+ /**
+ * 验证是否为一个有效的时间戳
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function timestamp($value)
+ {
+ return $this->int($value) && (strtotime(date('Y-m-d H:i:s', $value)) === $value);
+ }
+
+ /**
+ * 最后日期
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $date 验证的数据
+ * @return boolean
+ */
+ public function afterDate($value, $date)
+ {
+ return ($this->date($value) && strtotime($value) >= strtotime($date));
+ }
+
+ /**
+ * 最早日期
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $date 验证的数据
+ * @return boolean
+ */
+ public function beforeDate($value, $date)
+ {
+ return ($this->date($value) && strtotime($value) <= strtotime($date));
+ }
+
+ /**
+ * 正则验证
+ *
+ * @param mixed $value 操作的数据
+ * @param mixed $regexp 验证的数据
+ * @return boolean
+ */
+ public function regexp($value, $regexp)
+ {
+ // 判断是否存在'/',不存在则补上
+ if (mb_strpos($regexp, '/') !== 0) {
+ // 不是正则表达式则两端补上/
+ $regexp = '/^' . $regexp . '$/';
+ }
+
+ return preg_match($regexp, $value) === 1;
+ }
+
+ /**
+ * IP地址
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function ip($value)
+ {
+ return filter_var($value, FILTER_VALIDATE_IP) !== false;
+ }
+
+ /**
+ * 手机号码
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function moble($value)
+ {
+ return preg_match($this->regex['moble'], $value) === 1;
+ }
+
+ /**
+ * 固定电话
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function tel($value)
+ {
+ return preg_match($this->regex['tel'], $value) === 1;
+ }
+
+ /**
+ * 邮箱地址
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function email($value)
+ {
+ return filter_var($value, FILTER_VALIDATE_EMAIL) !== false;
+ }
+
+ /**
+ * 中文,只支持UTF-8格式编码
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function china($value)
+ {
+ return preg_match($this->regex['china'], $value) === 1;
+ }
+
+ /**
+ * 字母和数字
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function language($value)
+ {
+ return preg_match($this->regex['language'], $value) === 1;
+ }
+
+ /**
+ * 字母
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function alpha($value)
+ {
+ return preg_match($this->regex['alpha'], $value) === 1;
+ }
+
+ /**
+ * 小写字母
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function lower($value)
+ {
+ return preg_match($this->regex['lower'], $value) === 1;
+ }
+
+ /**
+ * 大写字母
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function upper($value)
+ {
+ return preg_match($this->regex['upper'], $value) === 1;
+ }
+
+ /**
+ * 只允许字母、数字和下划线 破折号
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function account($value)
+ {
+ return preg_match($this->regex['account'], $value) === 1;
+ }
+
+ /**
+ * 大于0的正整数
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function id($value)
+ {
+ return $this->int($value) && ($value > 0);
+ }
+
+ /**
+ * 有效URL
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function url($value)
+ {
+ return filter_var($value, FILTER_VALIDATE_URL) !== false;
+ }
+
+ /**
+ * 浮点数
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function float($value)
+ {
+ return filter_var($value, FILTER_VALIDATE_FLOAT) !== false;
+ }
+
+ /**
+ * 整数
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function int($value)
+ {
+ return (is_numeric($value) && is_int($value + 0));
+ }
+
+ /**
+ * 数字
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function num($value)
+ {
+ return is_numeric($value);
+ }
+
+ /**
+ * 字符串
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function str($value)
+ {
+ return is_string($value);
+ }
+
+ /**
+ * 数组
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function arr($value)
+ {
+ return is_array($value);
+ }
+
+ /**
+ * JSON
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function json($value)
+ {
+ return $this->str($value) && !is_null(json_decode($value));
+ }
+
+ /**
+ * XML
+ *
+ * @param mixed $value 操作的数据
+ * @return boolean
+ */
+ public function xml($value)
+ {
+ $xmlParser = xml_parser_create();
+ if (!$this->str($value) || !xml_parse($xmlParser, $value, true)) {
+ xml_parser_free($xmlParser);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * 只允许某些值
+ *
+ * @param mixed $value 操作的数据
+ * @param string|array $in 验证的数据
+ * @return boolean
+ */
+ public function in($value, $in)
+ {
+ $in = is_string($in) ? explode(',', $in) : $in;
+ return in_array($value, $in);
+ }
+
+ /**
+ * 不允许某些值
+ *
+ * @param mixed $value 操作的数据
+ * @param string|array $notin 验证的数据
+ * @return boolean
+ */
+ public function notIn($value, $notin)
+ {
+ $notin = is_string($notin) ? explode(',', $notin) : $notin;
+ return !in_array($value, $notin);
+ }
+
+ /**
+ * 身份证号码(支持15位和18位)
+ *
+ * @param string $idcard 身份证号
+ * @return boolean
+ */
+ public function idCard($idcard)
+ {
+ return IdCard::instance()->check($idcard);
+ }
+
+ /**
+ * 比较字段值是否一致
+ *
+ * @param mixed $value 比较的值
+ * @param string $rule 比较的字段名
+ * @param string $field 当前的字段名
+ * @param array $data 用于比较的数据集,默认为$this->data
+ * @return boolean
+ */
+ public function confirm($value, $rule, $field = null, $data = [])
+ {
+ $data = empty($data) ? $this->data : $data;
+
+ return !(!isset($data[$rule]) || $value != $data[$rule]);
+ }
+
+ /**
+ * 比较两值是否相等
+ *
+ * @param mixed $value 比较的值1
+ * @param mixed $rule 比较的值2
+ * @return boolean
+ */
+ public function eq($value, $rule)
+ {
+ return $value == $rule;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/data/idcard.php b/vendor/mongdch/mon-util/src/data/idcard.php
new file mode 100644
index 0000000..c3623f1
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/data/idcard.php
@@ -0,0 +1,3477 @@
+
+ * @version 1.0.0 2021-03-17
+ */
+return [
+ 110000 => '北京市',
+ 110100 => '北京市市辖区',
+ 110101 => '北京市东城区',
+ 110102 => '北京市西城区',
+ 110103 => '北京市崇文区',
+ 110104 => '北京市宣武区',
+ 110105 => '北京市朝阳区',
+ 110106 => '北京市丰台区',
+ 110107 => '北京市石景山区',
+ 110108 => '北京市海淀区',
+ 110109 => '北京市门头沟区',
+ 110111 => '北京市房山区',
+ 110112 => '北京市通州区',
+ 110113 => '北京市顺义区',
+ 110200 => '北京市县',
+ 110221 => '北京市昌平县',
+ 110224 => '北京市大兴县',
+ 110226 => '北京市平谷县',
+ 110227 => '北京市怀柔县',
+ 110228 => '北京市密云县',
+ 110229 => '北京市延庆县',
+ 120000 => '天津市',
+ 120100 => '天津市市辖区',
+ 120101 => '天津市和平区',
+ 120102 => '天津市河东区',
+ 120103 => '天津市河西区',
+ 120104 => '天津市南开区',
+ 120105 => '天津市河北区',
+ 120106 => '天津市红桥区',
+ 120107 => '天津市塘沽区',
+ 120108 => '天津市汉沽区',
+ 120109 => '天津市大港区',
+ 120110 => '天津市东丽区',
+ 120111 => '天津市西青区',
+ 120112 => '天津市津南区',
+ 120113 => '天津市北辰区',
+ 120200 => '天津市县',
+ 120221 => '天津市宁河县',
+ 120222 => '天津市武清县',
+ 120223 => '天津市静海县',
+ 120224 => '天津市宝坻县',
+ 120225 => '天津市蓟县',
+ 130000 => '河北省',
+ 130100 => '河北省石家庄市',
+ 130101 => '河北省石家庄市市辖区',
+ 130102 => '河北省石家庄市长安区',
+ 130103 => '河北省石家庄市桥东区',
+ 130104 => '河北省石家庄市桥西区',
+ 130105 => '河北省石家庄市新华区',
+ 130106 => '河北省石家庄市郊区',
+ 130107 => '河北省石家庄市井陉矿区',
+ 130121 => '河北省石家庄市井陉县',
+ 130123 => '河北省石家庄市正定县',
+ 130124 => '河北省石家庄市栾城县',
+ 130125 => '河北省石家庄市行唐县',
+ 130126 => '河北省石家庄市灵寿县',
+ 130127 => '河北省石家庄市高邑县',
+ 130128 => '河北省石家庄市深泽县',
+ 130129 => '河北省石家庄市赞皇县',
+ 130130 => '河北省石家庄市无极县',
+ 130131 => '河北省石家庄市平山县',
+ 130132 => '河北省石家庄市元氏县',
+ 130133 => '河北省石家庄市赵县',
+ 130181 => '河北省石家庄市辛集市',
+ 130182 => '河北省石家庄市藁城市',
+ 130183 => '河北省石家庄市晋州市',
+ 130184 => '河北省石家庄市新乐市',
+ 130185 => '河北省石家庄市鹿泉市',
+ 130200 => '河北省唐山市',
+ 130201 => '河北省唐山市市辖区',
+ 130202 => '河北省唐山市路南区',
+ 130203 => '河北省唐山市路北区',
+ 130204 => '河北省唐山市古冶区',
+ 130205 => '河北省唐山市开平区',
+ 130206 => '河北省唐山市新区',
+ 130221 => '河北省唐山市丰润县',
+ 130223 => '河北省唐山市滦县',
+ 130224 => '河北省唐山市滦南县',
+ 130225 => '河北省唐山市乐亭县',
+ 130227 => '河北省唐山市迁西县',
+ 130229 => '河北省唐山市玉田县',
+ 130230 => '河北省唐山市唐海县',
+ 130281 => '河北省唐山市遵化市',
+ 130282 => '河北省唐山市丰南市',
+ 130283 => '河北省唐山市迁安市',
+ 130300 => '河北省秦皇岛市秦皇岛市',
+ 130301 => '河北省秦皇岛市市辖区',
+ 130302 => '河北省秦皇岛市海港区',
+ 130303 => '河北省秦皇岛市山海关区',
+ 130304 => '河北省秦皇岛市北戴河区',
+ 130321 => '河北省秦皇岛市青龙满族自治县',
+ 130322 => '河北省秦皇岛市昌黎县',
+ 130323 => '河北省秦皇岛市抚宁县',
+ 130324 => '河北省秦皇岛市卢龙县',
+ 130400 => '河北省邯郸市邯郸市',
+ 130401 => '河北省邯郸市市辖区',
+ 130402 => '河北省邯郸市邯山区',
+ 130403 => '河北省邯郸市丛台区',
+ 130404 => '河北省邯郸市复兴区',
+ 130406 => '河北省邯郸市峰峰矿区',
+ 130421 => '河北省邯郸市邯郸县',
+ 130423 => '河北省邯郸市临漳县',
+ 130424 => '河北省邯郸市成安县',
+ 130425 => '河北省邯郸市大名县',
+ 130426 => '河北省邯郸市涉县',
+ 130427 => '河北省邯郸市磁县',
+ 130428 => '河北省邯郸市肥乡县',
+ 130429 => '河北省邯郸市永年县',
+ 130430 => '河北省邯郸市邱县',
+ 130431 => '河北省邯郸市鸡泽县',
+ 130432 => '河北省邯郸市广平县',
+ 130433 => '河北省邯郸市馆陶县',
+ 130434 => '河北省邯郸市魏县',
+ 130435 => '河北省邯郸市曲周县',
+ 130481 => '河北省邯郸市武安市',
+ 130500 => '河北省邢台市',
+ 130501 => '河北省邢台市市辖区',
+ 130502 => '河北省邢台市桥东区',
+ 130503 => '河北省邢台市桥西区',
+ 130521 => '河北省邢台市邢台县',
+ 130522 => '河北省邢台市临城县',
+ 130523 => '河北省邢台市内丘县',
+ 130524 => '河北省邢台市柏乡县',
+ 130525 => '河北省邢台市隆尧县',
+ 130526 => '河北省邢台市任县',
+ 130527 => '河北省邢台市南和县',
+ 130528 => '河北省邢台市宁晋县',
+ 130529 => '河北省邢台市巨鹿县',
+ 130530 => '河北省邢台市新河县',
+ 130531 => '河北省邢台市广宗县',
+ 130532 => '河北省邢台市平乡县',
+ 130533 => '河北省邢台市威县',
+ 130534 => '河北省邢台市清河县',
+ 130535 => '河北省邢台市临西县',
+ 130581 => '河北省邢台市南宫市',
+ 130582 => '河北省邢台市沙河市',
+ 130600 => '河北省保定市',
+ 130601 => '河北省保定市市辖区',
+ 130602 => '河北省保定市新市区',
+ 130603 => '河北省保定市北市区',
+ 130604 => '河北省保定市南市区',
+ 130621 => '河北省保定市满城县',
+ 130622 => '河北省保定市清苑县',
+ 130623 => '河北省保定市涞水县',
+ 130624 => '河北省保定市阜平县',
+ 130625 => '河北省保定市徐水县',
+ 130626 => '河北省保定市定兴县',
+ 130627 => '河北省保定市唐县',
+ 130628 => '河北省保定市高阳县',
+ 130629 => '河北省保定市容城县',
+ 130630 => '河北省保定市涞源县',
+ 130631 => '河北省保定市望都县',
+ 130632 => '河北省保定市安新县',
+ 130633 => '河北省保定市易县',
+ 130634 => '河北省保定市曲阳县',
+ 130635 => '河北省保定市蠡县',
+ 130636 => '河北省保定市顺平县',
+ 130637 => '河北省保定市博野县',
+ 130638 => '河北省保定市雄县',
+ 130681 => '河北省保定市涿州市',
+ 130682 => '河北省保定市定州市',
+ 130683 => '河北省保定市安国市',
+ 130684 => '河北省保定市高碑店市',
+ 130700 => '河北省张家口市',
+ 130701 => '河北省张家口市市辖区',
+ 130702 => '河北省张家口市桥东区',
+ 130703 => '河北省张家口市桥西区',
+ 130705 => '河北省张家口市宣化区',
+ 130706 => '河北省张家口市下花园区',
+ 130721 => '河北省张家口市宣化县',
+ 130722 => '河北省张家口市张北县',
+ 130723 => '河北省张家口市康保县',
+ 130724 => '河北省张家口市沽源县',
+ 130725 => '河北省张家口市尚义县',
+ 130726 => '河北省张家口市蔚县',
+ 130727 => '河北省张家口市阳原县',
+ 130728 => '河北省张家口市怀安县',
+ 130729 => '河北省张家口市万全县',
+ 130730 => '河北省张家口市怀来县',
+ 130731 => '河北省张家口市涿鹿县',
+ 130732 => '河北省张家口市赤城县',
+ 130733 => '河北省张家口市崇礼县',
+ 130800 => '河北省承德市',
+ 130801 => '河北省承德市市辖区',
+ 130802 => '河北省承德市双桥区',
+ 130803 => '河北省承德市双滦区',
+ 130804 => '河北省承德市鹰手营子矿区',
+ 130821 => '河北省承德市承德县',
+ 130822 => '河北省承德市兴隆县',
+ 130823 => '河北省承德市平泉县',
+ 130824 => '河北省承德市滦平县',
+ 130825 => '河北省承德市隆化县',
+ 130826 => '河北省承德市丰宁满族自治县',
+ 130827 => '河北省承德市宽城满族自治县',
+ 130828 => '河北省承德市围场满族蒙古族自治县',
+ 130900 => '河北省沧州市',
+ 130901 => '河北省沧州市市辖区',
+ 130902 => '河北省沧州市新华区',
+ 130903 => '河北省沧州市运河区',
+ 130921 => '河北省沧州市沧县',
+ 130922 => '河北省沧州市青县',
+ 130923 => '河北省沧州市东光县',
+ 130924 => '河北省沧州市海兴县',
+ 130925 => '河北省沧州市盐山县',
+ 130926 => '河北省沧州市肃宁县',
+ 130927 => '河北省沧州市南皮县',
+ 130928 => '河北省沧州市吴桥县',
+ 130929 => '河北省沧州市献县',
+ 130930 => '河北省沧州市孟村回族自治县',
+ 130981 => '河北省沧州市泊头市',
+ 130982 => '河北省沧州市任丘市',
+ 130983 => '河北省沧州市黄骅市',
+ 130984 => '河北省沧州市河间市',
+ 131000 => '河北省廊坊市',
+ 131001 => '河北省廊坊市市辖区',
+ 131002 => '河北省廊坊市安次区',
+ 131022 => '河北省廊坊市固安县',
+ 131023 => '河北省廊坊市永清县',
+ 131024 => '河北省廊坊市香河县',
+ 131025 => '河北省廊坊市大城县',
+ 131026 => '河北省廊坊市文安县',
+ 131028 => '河北省廊坊市大厂回族自治县',
+ 131081 => '河北省廊坊市霸州市',
+ 131082 => '河北省廊坊市三河市',
+ 131100 => '河北省衡水市',
+ 131101 => '河北省衡水市市辖区',
+ 131102 => '河北省衡水市桃城区',
+ 131121 => '河北省衡水市枣强县',
+ 131122 => '河北省衡水市武邑县',
+ 131123 => '河北省衡水市武强县',
+ 131124 => '河北省衡水市饶阳县',
+ 131125 => '河北省衡水市安平县',
+ 131126 => '河北省衡水市故城县',
+ 131127 => '河北省衡水市景县',
+ 131128 => '河北省衡水市阜城县',
+ 131181 => '河北省衡水市冀州市',
+ 131182 => '河北省衡水市深州市',
+ 140000 => '山西省',
+ 140100 => '山西省太原市',
+ 140101 => '山西省太原市市辖区',
+ 140105 => '山西省太原市小店区',
+ 140106 => '山西省太原市迎泽区',
+ 140107 => '山西省太原市杏花岭区',
+ 140108 => '山西省太原市尖草坪区',
+ 140109 => '山西省太原市万柏林区',
+ 140110 => '山西省太原市晋源区',
+ 140121 => '山西省太原市清徐县',
+ 140122 => '山西省太原市阳曲县',
+ 140123 => '山西省太原市娄烦县',
+ 140181 => '山西省太原市古交市',
+ 140200 => '山西省大同市',
+ 140201 => '山西省大同市市辖区',
+ 140202 => '山西省大同市城区',
+ 140203 => '山西省大同市矿区',
+ 140211 => '山西省大同市南郊区',
+ 140212 => '山西省大同市新荣区',
+ 140221 => '山西省大同市阳高县',
+ 140222 => '山西省大同市天镇县',
+ 140223 => '山西省大同市广灵县',
+ 140224 => '山西省大同市灵丘县',
+ 140225 => '山西省大同市浑源县',
+ 140226 => '山西省大同市左云县',
+ 140227 => '山西省大同市大同县',
+ 140300 => '山西省阳泉市',
+ 140301 => '山西省阳泉市市辖区',
+ 140302 => '山西省阳泉市城区',
+ 140303 => '山西省阳泉市矿区',
+ 140311 => '山西省阳泉市郊区',
+ 140321 => '山西省阳泉市平定县',
+ 140322 => '山西省阳泉市盂县',
+ 140400 => '山西省长治市',
+ 140401 => '山西省长治市市辖区',
+ 140402 => '山西省长治市城区',
+ 140411 => '山西省长治市郊区',
+ 140421 => '山西省长治市长治县',
+ 140423 => '山西省长治市襄垣县',
+ 140424 => '山西省长治市屯留县',
+ 140425 => '山西省长治市平顺县',
+ 140426 => '山西省长治市黎城县',
+ 140427 => '山西省长治市壶关县',
+ 140428 => '山西省长治市长子县',
+ 140429 => '山西省长治市武乡县',
+ 140430 => '山西省长治市沁县',
+ 140431 => '山西省长治市沁源县',
+ 140481 => '山西省长治市潞城市',
+ 140500 => '山西省晋城市',
+ 140501 => '山西省晋城市市辖区',
+ 140502 => '山西省晋城市城区',
+ 140521 => '山西省晋城市沁水县',
+ 140522 => '山西省晋城市阳城县',
+ 140524 => '山西省晋城市陵川县',
+ 140525 => '山西省晋城市泽州县',
+ 140581 => '山西省晋城市高平市',
+ 140600 => '山西省晋城市朔州市',
+ 140601 => '山西省晋城市市辖区',
+ 140602 => '山西省晋城市朔城区',
+ 140603 => '山西省晋城市平鲁区',
+ 140621 => '山西省晋城市山阴县',
+ 140622 => '山西省晋城市应县',
+ 140623 => '山西省晋城市右玉县',
+ 140624 => '山西省晋城市怀仁县',
+ 142200 => '山西省忻州地区',
+ 142201 => '山西省忻州地区忻州市',
+ 142202 => '山西省忻州地区原平市',
+ 142222 => '山西省忻州地区定襄县',
+ 142223 => '山西省忻州地区五台县',
+ 142225 => '山西省忻州地区代县',
+ 142226 => '山西省忻州地区繁峙县',
+ 142227 => '山西省忻州地区宁武县',
+ 142228 => '山西省忻州地区静乐县',
+ 142229 => '山西省忻州地区神池县',
+ 142230 => '山西省忻州地区五寨县',
+ 142231 => '山西省忻州地区岢岚县',
+ 142232 => '山西省忻州地区河曲县',
+ 142233 => '山西省忻州地区保德县',
+ 142234 => '山西省忻州地区偏关县',
+ 142300 => '山西省忻州地区吕梁地区',
+ 142301 => '山西省忻州地区孝义市',
+ 142302 => '山西省忻州地区离石市',
+ 142303 => '山西省忻州地区汾阳市',
+ 142322 => '山西省忻州地区文水县',
+ 142323 => '山西省忻州地区交城县',
+ 142325 => '山西省忻州地区兴县',
+ 142326 => '山西省忻州地区临县',
+ 142327 => '山西省忻州地区柳林县',
+ 142328 => '山西省忻州地区石楼县',
+ 142329 => '山西省忻州地区岚县',
+ 142330 => '山西省忻州地区方山县',
+ 142332 => '山西省忻州地区中阳县',
+ 142333 => '山西省忻州地区交口县',
+ 142400 => '山西省晋中地区',
+ 142401 => '山西省晋中地区榆次市',
+ 142402 => '山西省晋中地区介休市',
+ 142421 => '山西省晋中地区榆社县',
+ 142422 => '山西省晋中地区左权县',
+ 142423 => '山西省晋中地区和顺县',
+ 142424 => '山西省晋中地区昔阳县',
+ 142427 => '山西省晋中地区寿阳县',
+ 142429 => '山西省晋中地区太谷县',
+ 142430 => '山西省晋中地区祁县',
+ 142431 => '山西省晋中地区平遥县',
+ 142433 => '山西省晋中地区灵石县',
+ 142600 => '山西省临汾地区',
+ 142601 => '山西省临汾地区临汾市',
+ 142602 => '山西省临汾地区侯马市',
+ 142603 => '山西省临汾地区霍州市',
+ 142621 => '山西省临汾地区曲沃县',
+ 142622 => '山西省临汾地区翼城县',
+ 142623 => '山西省临汾地区襄汾县',
+ 142625 => '山西省临汾地区洪洞县',
+ 142627 => '山西省临汾地区古县',
+ 142628 => '山西省临汾地区安泽县',
+ 142629 => '山西省临汾地区浮山县',
+ 142630 => '山西省临汾地区吉县',
+ 142631 => '山西省临汾地区乡宁县',
+ 142632 => '山西省临汾地区蒲县',
+ 142633 => '山西省临汾地区大宁县',
+ 142634 => '山西省临汾地区永和县',
+ 142635 => '山西省临汾地区隰县',
+ 142636 => '山西省临汾地区汾西县',
+ 142700 => '山西省运城地区',
+ 142701 => '山西省运城地区运城市',
+ 142702 => '山西省运城地区永济市',
+ 142703 => '山西省运城地区河津市',
+ 142723 => '山西省运城地区芮城县',
+ 142724 => '山西省运城地区临猗县',
+ 142725 => '山西省运城地区万荣县',
+ 142726 => '山西省运城地区新绛县',
+ 142727 => '山西省运城地区稷山县',
+ 142729 => '山西省运城地区闻喜县',
+ 142730 => '山西省运城地区夏县',
+ 142731 => '山西省运城地区绛县',
+ 142732 => '山西省运城地区平陆县',
+ 142733 => '山西省运城地区垣曲县',
+ 150000 => '内蒙古自治区',
+ 150100 => '内蒙古自治区呼和浩特市',
+ 150101 => '内蒙古自治区呼和浩特市市辖区',
+ 150102 => '内蒙古自治区呼和浩特市新城区',
+ 150103 => '内蒙古自治区呼和浩特市回民区',
+ 150104 => '内蒙古自治区呼和浩特市玉泉区',
+ 150105 => '内蒙古自治区呼和浩特市郊区',
+ 150121 => '内蒙古自治区呼和浩特市土默特左旗',
+ 150122 => '内蒙古自治区呼和浩特市托克托县',
+ 150123 => '内蒙古自治区呼和浩特市和林格尔县',
+ 150124 => '内蒙古自治区呼和浩特市清水河县',
+ 150125 => '内蒙古自治区呼和浩特市武川县',
+ 150200 => '内蒙古自治区包头市',
+ 150201 => '内蒙古自治区包头市市辖区',
+ 150202 => '内蒙古自治区包头市东河区',
+ 150203 => '内蒙古自治区包头市昆都伦区',
+ 150204 => '内蒙古自治区包头市青山区',
+ 150205 => '内蒙古自治区包头市石拐矿区',
+ 150206 => '内蒙古自治区包头市白云矿区',
+ 150207 => '内蒙古自治区包头市郊区',
+ 150221 => '内蒙古自治区包头市土默特右旗',
+ 150222 => '内蒙古自治区包头市固阳县',
+ 150223 => '内蒙古自治区包头市达尔罕茂明安联合旗',
+ 150300 => '内蒙古自治区乌海市',
+ 150301 => '内蒙古自治区乌海市市辖区',
+ 150302 => '内蒙古自治区乌海市海勃湾区',
+ 150303 => '内蒙古自治区乌海市海南区',
+ 150304 => '内蒙古自治区乌海市乌达区',
+ 150400 => '内蒙古自治区赤峰市',
+ 150401 => '内蒙古自治区赤峰市市辖区',
+ 150402 => '内蒙古自治区赤峰市红山区',
+ 150403 => '内蒙古自治区赤峰市元宝山区',
+ 150404 => '内蒙古自治区赤峰市松山区',
+ 150421 => '内蒙古自治区赤峰市阿鲁科尔沁旗',
+ 150422 => '内蒙古自治区赤峰市巴林左旗',
+ 150423 => '内蒙古自治区赤峰市巴林右旗',
+ 150424 => '内蒙古自治区赤峰市林西县',
+ 150425 => '内蒙古自治区赤峰市克什克腾旗',
+ 150426 => '内蒙古自治区赤峰市翁牛特旗',
+ 150428 => '内蒙古自治区赤峰市喀喇沁旗',
+ 150429 => '内蒙古自治区赤峰市宁城县',
+ 150430 => '内蒙古自治区赤峰市敖汉旗',
+ 152100 => '内蒙古自治区呼伦贝尔盟',
+ 152101 => '内蒙古自治区呼伦贝尔盟海拉尔市',
+ 152102 => '内蒙古自治区呼伦贝尔盟满洲里市',
+ 152103 => '内蒙古自治区呼伦贝尔盟扎兰屯市',
+ 152104 => '内蒙古自治区呼伦贝尔盟牙克石市',
+ 152105 => '内蒙古自治区呼伦贝尔盟根河市',
+ 152106 => '内蒙古自治区呼伦贝尔盟额尔古纳市',
+ 152122 => '内蒙古自治区呼伦贝尔盟阿荣旗',
+ 152123 => '内蒙古自治区呼伦贝尔盟莫力达瓦达斡尔族自治旗',
+ 152127 => '内蒙古自治区呼伦贝尔盟鄂伦春自治旗',
+ 152128 => '内蒙古自治区呼伦贝尔盟鄂温克族自治旗',
+ 152129 => '内蒙古自治区呼伦贝尔盟新巴尔虎右旗',
+ 152130 => '内蒙古自治区呼伦贝尔盟新巴尔虎左旗',
+ 152131 => '内蒙古自治区呼伦贝尔盟陈巴尔虎旗',
+ 152200 => '内蒙古自治区兴安盟',
+ 152201 => '内蒙古自治区兴安盟乌兰浩特市',
+ 152202 => '内蒙古自治区兴安盟阿尔山市',
+ 152221 => '内蒙古自治区兴安盟科尔沁右翼前旗',
+ 152222 => '内蒙古自治区兴安盟科尔沁右翼中旗',
+ 152223 => '内蒙古自治区兴安盟扎赉特旗',
+ 152224 => '内蒙古自治区兴安盟突泉县',
+ 152300 => '内蒙古自治区哲里木盟',
+ 152301 => '内蒙古自治区哲里木盟通辽市',
+ 152302 => '内蒙古自治区哲里木盟霍林郭勒市',
+ 152322 => '内蒙古自治区哲里木盟科尔沁左翼中旗',
+ 152323 => '内蒙古自治区哲里木盟科尔沁左翼后旗',
+ 152324 => '内蒙古自治区哲里木盟开鲁县',
+ 152325 => '内蒙古自治区哲里木盟库伦旗',
+ 152326 => '内蒙古自治区哲里木盟奈曼旗',
+ 152327 => '内蒙古自治区哲里木盟扎鲁特旗',
+ 152500 => '内蒙古自治区锡林郭勒盟',
+ 152501 => '内蒙古自治区锡林郭勒盟二连浩特市',
+ 152502 => '内蒙古自治区锡林郭勒盟锡林浩特市',
+ 152522 => '内蒙古自治区锡林郭勒盟阿巴嘎旗',
+ 152523 => '内蒙古自治区锡林郭勒盟苏尼特左旗',
+ 152524 => '内蒙古自治区锡林郭勒盟苏尼特右旗',
+ 152525 => '内蒙古自治区锡林郭勒盟东乌珠穆沁旗',
+ 152526 => '内蒙古自治区锡林郭勒盟西乌珠穆沁旗',
+ 152527 => '内蒙古自治区锡林郭勒盟太仆寺旗',
+ 152528 => '内蒙古自治区锡林郭勒盟镶黄旗',
+ 152529 => '内蒙古自治区锡林郭勒盟正镶白旗',
+ 152530 => '内蒙古自治区锡林郭勒盟正蓝旗',
+ 152531 => '内蒙古自治区锡林郭勒盟多伦县',
+ 152600 => '内蒙古自治区乌兰察布盟',
+ 152601 => '内蒙古自治区乌兰察布盟集宁市',
+ 152602 => '内蒙古自治区乌兰察布盟丰镇市',
+ 152624 => '内蒙古自治区乌兰察布盟卓资县',
+ 152625 => '内蒙古自治区乌兰察布盟化德县',
+ 152626 => '内蒙古自治区乌兰察布盟商都县',
+ 152627 => '内蒙古自治区乌兰察布盟兴和县',
+ 152629 => '内蒙古自治区乌兰察布盟凉城县',
+ 152630 => '内蒙古自治区乌兰察布盟察哈尔右翼前旗',
+ 152631 => '内蒙古自治区乌兰察布盟察哈尔右翼中旗',
+ 152632 => '内蒙古自治区乌兰察布盟察哈尔右翼后旗',
+ 152634 => '内蒙古自治区乌兰察布盟四子王旗',
+ 152700 => '内蒙古自治区伊克昭盟',
+ 152701 => '内蒙古自治区伊克昭盟东胜市',
+ 152722 => '内蒙古自治区伊克昭盟达拉特旗',
+ 152723 => '内蒙古自治区伊克昭盟准格尔旗',
+ 152724 => '内蒙古自治区伊克昭盟鄂托克前旗',
+ 152725 => '内蒙古自治区伊克昭盟鄂托克旗',
+ 152726 => '内蒙古自治区伊克昭盟杭锦旗',
+ 152727 => '内蒙古自治区伊克昭盟乌审旗',
+ 152728 => '内蒙古自治区伊克昭盟伊金霍洛旗',
+ 152800 => '内蒙古自治区巴彦淖尔盟',
+ 152801 => '内蒙古自治区巴彦淖尔盟临河市',
+ 152822 => '内蒙古自治区巴彦淖尔盟五原县',
+ 152823 => '内蒙古自治区巴彦淖尔盟磴口县',
+ 152824 => '内蒙古自治区巴彦淖尔盟乌拉特前旗',
+ 152825 => '内蒙古自治区巴彦淖尔盟乌拉特中旗',
+ 152826 => '内蒙古自治区巴彦淖尔盟乌拉特后旗',
+ 152827 => '内蒙古自治区巴彦淖尔盟杭锦后旗',
+ 152900 => '内蒙古自治区阿拉善盟',
+ 152921 => '内蒙古自治区阿拉善盟阿拉善左旗',
+ 152922 => '内蒙古自治区阿拉善盟阿拉善右旗',
+ 152923 => '内蒙古自治区阿拉善盟额济纳旗',
+ 210000 => '辽宁省',
+ 210100 => '辽宁省沈阳市',
+ 210101 => '辽宁省沈阳市市辖区',
+ 210102 => '辽宁省沈阳市和平区',
+ 210103 => '辽宁省沈阳市沈河区',
+ 210104 => '辽宁省沈阳市大东区',
+ 210105 => '辽宁省沈阳市皇姑区',
+ 210106 => '辽宁省沈阳市铁西区',
+ 210111 => '辽宁省沈阳市苏家屯区',
+ 210112 => '辽宁省沈阳市东陵区',
+ 210113 => '辽宁省沈阳市新城子区',
+ 210114 => '辽宁省沈阳市于洪区',
+ 210122 => '辽宁省沈阳市辽中县',
+ 210123 => '辽宁省沈阳市康平县',
+ 210124 => '辽宁省沈阳市法库县',
+ 210181 => '辽宁省沈阳市新民市',
+ 210200 => '辽宁省大连市',
+ 210201 => '辽宁省大连市市辖区',
+ 210202 => '辽宁省大连市中山区',
+ 210203 => '辽宁省大连市西岗区',
+ 210204 => '辽宁省大连市沙河口区',
+ 210211 => '辽宁省大连市甘井子区',
+ 210212 => '辽宁省大连市旅顺口区',
+ 210213 => '辽宁省大连市金州区',
+ 210224 => '辽宁省大连市长海县',
+ 210281 => '辽宁省大连市瓦房店市',
+ 210282 => '辽宁省大连市普兰店市',
+ 210283 => '辽宁省大连市庄河市',
+ 210300 => '辽宁省鞍山市',
+ 210301 => '辽宁省鞍山市市辖区',
+ 210302 => '辽宁省鞍山市铁东区',
+ 210303 => '辽宁省鞍山市铁西区',
+ 210304 => '辽宁省鞍山市立山区',
+ 210311 => '辽宁省鞍山市千山区',
+ 210321 => '辽宁省鞍山市台安县',
+ 210323 => '辽宁省鞍山市岫岩满族自治县',
+ 210381 => '辽宁省鞍山市海城市',
+ 210400 => '辽宁省抚顺市',
+ 210401 => '辽宁省抚顺市市辖区',
+ 210402 => '辽宁省抚顺市新抚区',
+ 210403 => '辽宁省抚顺市露天区',
+ 210404 => '辽宁省抚顺市望花区',
+ 210411 => '辽宁省抚顺市顺城区',
+ 210421 => '辽宁省抚顺市抚顺县',
+ 210422 => '辽宁省抚顺市新宾满族自治县',
+ 210423 => '辽宁省抚顺市清原满族自治县',
+ 210500 => '辽宁省本溪市',
+ 210501 => '辽宁省本溪市市辖区',
+ 210502 => '辽宁省本溪市平山区',
+ 210503 => '辽宁省本溪市溪湖区',
+ 210504 => '辽宁省本溪市明山区',
+ 210505 => '辽宁省本溪市南芬区',
+ 210521 => '辽宁省本溪市本溪满族自治县',
+ 210522 => '辽宁省本溪市桓仁满族自治县',
+ 210600 => '辽宁省丹东市',
+ 210601 => '辽宁省丹东市市辖区',
+ 210602 => '辽宁省丹东市元宝区',
+ 210603 => '辽宁省丹东市振兴区',
+ 210604 => '辽宁省丹东市振安区',
+ 210624 => '辽宁省丹东市宽甸满族自治县',
+ 210681 => '辽宁省丹东市东港市',
+ 210682 => '辽宁省丹东市凤城市',
+ 210700 => '辽宁省锦州市',
+ 210701 => '辽宁省锦州市市辖区',
+ 210702 => '辽宁省锦州市古塔区',
+ 210703 => '辽宁省锦州市凌河区',
+ 210711 => '辽宁省锦州市太和区',
+ 210726 => '辽宁省锦州市黑山县',
+ 210727 => '辽宁省锦州市义县',
+ 210781 => '辽宁省锦州市凌海市',
+ 210782 => '辽宁省锦州市北宁市',
+ 210800 => '辽宁省营口市',
+ 210801 => '辽宁省营口市市辖区',
+ 210802 => '辽宁省营口市站前区',
+ 210803 => '辽宁省营口市西市区',
+ 210804 => '辽宁省营口市鲅鱼圈区',
+ 210811 => '辽宁省营口市老边区',
+ 210881 => '辽宁省营口市盖州市',
+ 210882 => '辽宁省营口市大石桥市',
+ 210900 => '辽宁省阜新市',
+ 210901 => '辽宁省阜新市市辖区',
+ 210902 => '辽宁省阜新市海州区',
+ 210903 => '辽宁省阜新市新邱区',
+ 210904 => '辽宁省阜新市太平区',
+ 210905 => '辽宁省阜新市清河门区',
+ 210911 => '辽宁省阜新市细河区',
+ 210921 => '辽宁省阜新市阜新蒙古族自治县',
+ 210922 => '辽宁省阜新市彰武县',
+ 211000 => '辽宁省辽阳市',
+ 211001 => '辽宁省辽阳市市辖区',
+ 211002 => '辽宁省辽阳市白塔区',
+ 211003 => '辽宁省辽阳市文圣区',
+ 211004 => '辽宁省辽阳市宏伟区',
+ 211005 => '辽宁省辽阳市弓长岭区',
+ 211011 => '辽宁省辽阳市太子河区',
+ 211021 => '辽宁省辽阳市辽阳县',
+ 211081 => '辽宁省辽阳市灯塔市',
+ 211100 => '辽宁省盘锦市',
+ 211101 => '辽宁省盘锦市市辖区',
+ 211102 => '辽宁省盘锦市双台子区',
+ 211103 => '辽宁省盘锦市兴隆台区',
+ 211121 => '辽宁省盘锦市大洼县',
+ 211122 => '辽宁省盘锦市盘山县',
+ 211200 => '辽宁省铁岭市',
+ 211201 => '辽宁省铁岭市市辖区',
+ 211202 => '辽宁省铁岭市银州区',
+ 211204 => '辽宁省铁岭市清河区',
+ 211221 => '辽宁省铁岭市铁岭县',
+ 211223 => '辽宁省铁岭市西丰县',
+ 211224 => '辽宁省铁岭市昌图县',
+ 211281 => '辽宁省铁岭市铁法市',
+ 211282 => '辽宁省铁岭市开原市',
+ 211300 => '辽宁省朝阳市',
+ 211301 => '辽宁省朝阳市市辖区',
+ 211302 => '辽宁省朝阳市双塔区',
+ 211303 => '辽宁省朝阳市龙城区',
+ 211321 => '辽宁省朝阳市朝阳县',
+ 211322 => '辽宁省朝阳市建平县',
+ 211324 => '辽宁省朝阳市喀喇沁左翼蒙古族自治县',
+ 211381 => '辽宁省朝阳市北票市',
+ 211382 => '辽宁省朝阳市凌源市',
+ 211400 => '辽宁省葫芦岛市',
+ 211401 => '辽宁省葫芦岛市市辖区',
+ 211402 => '辽宁省葫芦岛市连山区',
+ 211403 => '辽宁省葫芦岛市龙港区',
+ 211404 => '辽宁省葫芦岛市南票区',
+ 211421 => '辽宁省葫芦岛市绥中县',
+ 211422 => '辽宁省葫芦岛市建昌县',
+ 211481 => '辽宁省葫芦岛市兴城市',
+ 220000 => '吉林省',
+ 220100 => '吉林省长春市',
+ 220101 => '吉林省长春市市辖区',
+ 220102 => '吉林省长春市南关区',
+ 220103 => '吉林省长春市宽城区',
+ 220104 => '吉林省长春市朝阳区',
+ 220105 => '吉林省长春市二道区',
+ 220106 => '吉林省长春市绿园区',
+ 220112 => '吉林省长春市双阳区',
+ 220122 => '吉林省长春市农安县',
+ 220181 => '吉林省长春市九台市',
+ 220182 => '吉林省长春市榆树市',
+ 220183 => '吉林省长春市德惠市',
+ 220200 => '吉林省吉林市',
+ 220201 => '吉林省吉林市市辖区',
+ 220202 => '吉林省吉林市昌邑区',
+ 220203 => '吉林省吉林市龙潭区',
+ 220204 => '吉林省吉林市船营区',
+ 220211 => '吉林省吉林市丰满区',
+ 220221 => '吉林省吉林市永吉县',
+ 220281 => '吉林省吉林市蛟河市',
+ 220282 => '吉林省吉林市桦甸市',
+ 220283 => '吉林省吉林市舒兰市',
+ 220284 => '吉林省吉林市磐石市',
+ 220300 => '吉林省四平市',
+ 220301 => '吉林省四平市市辖区',
+ 220302 => '吉林省四平市铁西区',
+ 220303 => '吉林省四平市铁东区',
+ 220322 => '吉林省四平市梨树县',
+ 220323 => '吉林省四平市伊通满族自治县',
+ 220381 => '吉林省四平市公主岭市',
+ 220382 => '吉林省四平市双辽市',
+ 220400 => '吉林省辽源市',
+ 220401 => '吉林省辽源市市辖区',
+ 220402 => '吉林省辽源市龙山区',
+ 220403 => '吉林省辽源市西安区',
+ 220421 => '吉林省辽源市东丰县',
+ 220422 => '吉林省辽源市东辽县',
+ 220500 => '吉林省通化市',
+ 220501 => '吉林省通化市市辖区',
+ 220502 => '吉林省通化市东昌区',
+ 220503 => '吉林省通化市二道江区',
+ 220521 => '吉林省通化市通化县',
+ 220523 => '吉林省通化市辉南县',
+ 220524 => '吉林省通化市柳河县',
+ 220581 => '吉林省通化市梅河口市',
+ 220582 => '吉林省通化市集安市',
+ 220600 => '吉林省白山市',
+ 220601 => '吉林省白山市市辖区',
+ 220602 => '吉林省白山市八道江区',
+ 220621 => '吉林省白山市抚松县',
+ 220622 => '吉林省白山市靖宇县',
+ 220623 => '吉林省白山市长白朝鲜族自治县',
+ 220625 => '吉林省白山市江源县',
+ 220681 => '吉林省白山市临江市',
+ 220700 => '吉林省松原市',
+ 220701 => '吉林省松原市市辖区',
+ 220702 => '吉林省松原市宁江区',
+ 220721 => '吉林省松原市前郭尔罗斯蒙古族自治县',
+ 220722 => '吉林省松原市长岭县',
+ 220723 => '吉林省松原市乾安县',
+ 220724 => '吉林省松原市扶余县',
+ 220800 => '吉林省白城市',
+ 220801 => '吉林省白城市市辖区',
+ 220802 => '吉林省白城市洮北区',
+ 220821 => '吉林省白城市镇赉县',
+ 220822 => '吉林省白城市通榆县',
+ 220881 => '吉林省白城市洮南市',
+ 220882 => '吉林省白城市大安市',
+ 222400 => '吉林省延边朝鲜族自治州',
+ 222401 => '吉林省延边朝鲜族自治州延吉市',
+ 222402 => '吉林省延边朝鲜族自治州图们市',
+ 222403 => '吉林省延边朝鲜族自治州敦化市',
+ 222404 => '吉林省延边朝鲜族自治州珲春市',
+ 222405 => '吉林省延边朝鲜族自治州龙井市',
+ 222406 => '吉林省延边朝鲜族自治州和龙市',
+ 222424 => '吉林省延边朝鲜族自治州汪清县',
+ 222426 => '吉林省延边朝鲜族自治州安图县',
+ 230000 => '黑龙江省',
+ 230100 => '黑龙江省哈尔滨市',
+ 230101 => '黑龙江省哈尔滨市市辖区',
+ 230102 => '黑龙江省哈尔滨市道里区',
+ 230103 => '黑龙江省哈尔滨市南岗区',
+ 230104 => '黑龙江省哈尔滨市道外区',
+ 230105 => '黑龙江省哈尔滨市太平区',
+ 230106 => '黑龙江省哈尔滨市香坊区',
+ 230107 => '黑龙江省哈尔滨市动力区',
+ 230108 => '黑龙江省哈尔滨市平房区',
+ 230121 => '黑龙江省哈尔滨市呼兰县',
+ 230123 => '黑龙江省哈尔滨市依兰县',
+ 230124 => '黑龙江省哈尔滨市方正县',
+ 230125 => '黑龙江省哈尔滨市宾县',
+ 230126 => '黑龙江省哈尔滨市巴彦县',
+ 230127 => '黑龙江省哈尔滨市木兰县',
+ 230128 => '黑龙江省哈尔滨市通河县',
+ 230129 => '黑龙江省哈尔滨市延寿县',
+ 230181 => '黑龙江省哈尔滨市阿城市',
+ 230182 => '黑龙江省哈尔滨市双城市',
+ 230183 => '黑龙江省哈尔滨市尚志市',
+ 230184 => '黑龙江省哈尔滨市五常市',
+ 230200 => '黑龙江省齐齐哈尔市',
+ 230201 => '黑龙江省齐齐哈尔市市辖区',
+ 230202 => '黑龙江省齐齐哈尔市龙沙区',
+ 230203 => '黑龙江省齐齐哈尔市建华区',
+ 230204 => '黑龙江省齐齐哈尔市铁锋区',
+ 230205 => '黑龙江省齐齐哈尔市昂昂溪区',
+ 230206 => '黑龙江省齐齐哈尔市富拉尔基区',
+ 230207 => '黑龙江省齐齐哈尔市碾子山区',
+ 230208 => '黑龙江省齐齐哈尔市梅里斯达斡尔族区',
+ 230221 => '黑龙江省齐齐哈尔市龙江县',
+ 230223 => '黑龙江省齐齐哈尔市依安县',
+ 230224 => '黑龙江省齐齐哈尔市泰来县',
+ 230225 => '黑龙江省齐齐哈尔市甘南县',
+ 230227 => '黑龙江省齐齐哈尔市富裕县',
+ 230229 => '黑龙江省齐齐哈尔市克山县',
+ 230230 => '黑龙江省齐齐哈尔市克东县',
+ 230231 => '黑龙江省齐齐哈尔市拜泉县',
+ 230281 => '黑龙江省齐齐哈尔市讷河市',
+ 230300 => '黑龙江省鸡西市',
+ 230301 => '黑龙江省鸡西市市辖区',
+ 230302 => '黑龙江省鸡西市鸡冠区',
+ 230303 => '黑龙江省鸡西市恒山区',
+ 230304 => '黑龙江省鸡西市滴道区',
+ 230305 => '黑龙江省鸡西市梨树区',
+ 230306 => '黑龙江省鸡西市城子河区',
+ 230307 => '黑龙江省鸡西市麻山区',
+ 230321 => '黑龙江省鸡西市鸡东县',
+ 230381 => '黑龙江省鸡西市虎林市',
+ 230382 => '黑龙江省鸡西市密山市',
+ 230400 => '黑龙江省鹤岗市',
+ 230401 => '黑龙江省鹤岗市市辖区',
+ 230402 => '黑龙江省鹤岗市向阳区',
+ 230403 => '黑龙江省鹤岗市工农区',
+ 230404 => '黑龙江省鹤岗市南山区',
+ 230405 => '黑龙江省鹤岗市兴安区',
+ 230406 => '黑龙江省鹤岗市东山区',
+ 230407 => '黑龙江省鹤岗市兴山区',
+ 230421 => '黑龙江省鹤岗市萝北县',
+ 230422 => '黑龙江省鹤岗市绥滨县',
+ 230500 => '黑龙江省双鸭山市',
+ 230501 => '黑龙江省双鸭山市市辖区',
+ 230502 => '黑龙江省双鸭山市尖山区',
+ 230503 => '黑龙江省双鸭山市岭东区',
+ 230505 => '黑龙江省双鸭山市四方台区',
+ 230506 => '黑龙江省双鸭山市宝山区',
+ 230521 => '黑龙江省双鸭山市集贤县',
+ 230522 => '黑龙江省双鸭山市友谊县',
+ 230523 => '黑龙江省双鸭山市宝清县',
+ 230524 => '黑龙江省双鸭山市饶河县',
+ 230600 => '黑龙江省大庆市',
+ 230601 => '黑龙江省大庆市市辖区',
+ 230602 => '黑龙江省大庆市萨尔图区',
+ 230603 => '黑龙江省大庆市龙凤区',
+ 230604 => '黑龙江省大庆市让胡路区',
+ 230605 => '黑龙江省大庆市红岗区',
+ 230606 => '黑龙江省大庆市大同区',
+ 230621 => '黑龙江省大庆市肇州县',
+ 230622 => '黑龙江省大庆市肇源县',
+ 230623 => '黑龙江省大庆市林甸县',
+ 230624 => '黑龙江省大庆市杜尔伯特蒙古族自治县',
+ 230700 => '黑龙江省伊春市',
+ 230701 => '黑龙江省伊春市市辖区',
+ 230702 => '黑龙江省伊春市伊春区',
+ 230703 => '黑龙江省伊春市南岔区',
+ 230704 => '黑龙江省伊春市友好区',
+ 230705 => '黑龙江省伊春市西林区',
+ 230706 => '黑龙江省伊春市翠峦区',
+ 230707 => '黑龙江省伊春市新青区',
+ 230708 => '黑龙江省伊春市美溪区',
+ 230709 => '黑龙江省伊春市金山屯区',
+ 230710 => '黑龙江省伊春市五营区',
+ 230711 => '黑龙江省伊春市乌马河区',
+ 230712 => '黑龙江省伊春市汤旺河区',
+ 230713 => '黑龙江省伊春市带岭区',
+ 230714 => '黑龙江省伊春市乌伊岭区',
+ 230715 => '黑龙江省伊春市红星区',
+ 230716 => '黑龙江省伊春市上甘岭区',
+ 230722 => '黑龙江省伊春市嘉荫县',
+ 230781 => '黑龙江省伊春市铁力市',
+ 230800 => '黑龙江省佳木斯市',
+ 230801 => '黑龙江省佳木斯市市辖区',
+ 230802 => '黑龙江省佳木斯市永红区',
+ 230803 => '黑龙江省佳木斯市向阳区',
+ 230804 => '黑龙江省佳木斯市前进区',
+ 230805 => '黑龙江省佳木斯市东风区',
+ 230811 => '黑龙江省佳木斯市郊区',
+ 230822 => '黑龙江省佳木斯市桦南县',
+ 230826 => '黑龙江省佳木斯市桦川县',
+ 230828 => '黑龙江省佳木斯市汤原县',
+ 230833 => '黑龙江省佳木斯市抚远县',
+ 230881 => '黑龙江省佳木斯市同江市',
+ 230882 => '黑龙江省佳木斯市富锦市',
+ 230900 => '黑龙江省七台河市',
+ 230901 => '黑龙江省七台河市市辖区',
+ 230902 => '黑龙江省七台河市新兴区',
+ 230903 => '黑龙江省七台河市桃山区',
+ 230904 => '黑龙江省七台河市茄子河区',
+ 230921 => '黑龙江省七台河市勃利县',
+ 231000 => '黑龙江省牡丹江市',
+ 231001 => '黑龙江省牡丹江市市辖区',
+ 231002 => '黑龙江省牡丹江市东安区',
+ 231003 => '黑龙江省牡丹江市阳明区',
+ 231004 => '黑龙江省牡丹江市爱民区',
+ 231005 => '黑龙江省牡丹江市西安区',
+ 231024 => '黑龙江省牡丹江市东宁县',
+ 231025 => '黑龙江省牡丹江市林口县',
+ 231081 => '黑龙江省牡丹江市绥芬河市',
+ 231083 => '黑龙江省牡丹江市海林市',
+ 231084 => '黑龙江省牡丹江市宁安市',
+ 231085 => '黑龙江省牡丹江市穆棱市',
+ 231100 => '黑龙江省黑河市',
+ 231101 => '黑龙江省黑河市市辖区',
+ 231102 => '黑龙江省黑河市爱辉区',
+ 231121 => '黑龙江省黑河市嫩江县',
+ 231123 => '黑龙江省黑河市逊克县',
+ 231124 => '黑龙江省黑河市孙吴县',
+ 231181 => '黑龙江省黑河市北安市',
+ 231182 => '黑龙江省黑河市五大连池市',
+ 232300 => '黑龙江省绥化地区',
+ 232301 => '黑龙江省绥化地区绥化市',
+ 232302 => '黑龙江省绥化地区安达市',
+ 232303 => '黑龙江省绥化地区肇东市',
+ 232304 => '黑龙江省绥化地区海伦市',
+ 232324 => '黑龙江省绥化地区望奎县',
+ 232325 => '黑龙江省绥化地区兰西县',
+ 232326 => '黑龙江省绥化地区青冈县',
+ 232330 => '黑龙江省绥化地区庆安县',
+ 232331 => '黑龙江省绥化地区明水县',
+ 232332 => '黑龙江省绥化地区绥棱县',
+ 232700 => '黑龙江省大兴安岭地区',
+ 232721 => '黑龙江省大兴安岭地区呼玛县',
+ 232722 => '黑龙江省大兴安岭地区塔河县',
+ 232723 => '黑龙江省大兴安岭地区漠河县',
+ 310000 => '上海市',
+ 310100 => '上海市市辖区',
+ 310101 => '上海市黄浦区',
+ 310102 => '上海市南市区',
+ 310103 => '上海市卢湾区',
+ 310104 => '上海市徐汇区',
+ 310105 => '上海市长宁区',
+ 310106 => '上海市静安区',
+ 310107 => '上海市普陀区',
+ 310108 => '上海市闸北区',
+ 310109 => '上海市虹口区',
+ 310110 => '上海市杨浦区',
+ 310112 => '上海市闵行区',
+ 310113 => '上海市宝山区',
+ 310114 => '上海市嘉定区',
+ 310115 => '上海市浦东新区',
+ 310116 => '上海市金山区',
+ 310117 => '上海市松江区',
+ 310200 => '上海市县',
+ 310225 => '上海市南汇县',
+ 310226 => '上海市奉贤县',
+ 310229 => '上海市青浦县',
+ 310230 => '上海市崇明县',
+ 320000 => '江苏省',
+ 320100 => '江苏省南京市',
+ 320101 => '江苏省南京市市辖区',
+ 320102 => '江苏省南京市玄武区',
+ 320103 => '江苏省南京市白下区',
+ 320104 => '江苏省南京市秦淮区',
+ 320105 => '江苏省南京市建邺区',
+ 320106 => '江苏省南京市鼓楼区',
+ 320107 => '江苏省南京市下关区',
+ 320111 => '江苏省南京市浦口区',
+ 320112 => '江苏省南京市大厂区',
+ 320113 => '江苏省南京市栖霞区',
+ 320114 => '江苏省南京市雨花台区',
+ 320121 => '江苏省南京市江宁县',
+ 320122 => '江苏省南京市江浦县',
+ 320123 => '江苏省南京市六合县',
+ 320124 => '江苏省南京市溧水县',
+ 320125 => '江苏省南京市高淳县',
+ 320200 => '江苏省无锡市',
+ 320201 => '江苏省无锡市市辖区',
+ 320202 => '江苏省无锡市崇安区',
+ 320203 => '江苏省无锡市南长区',
+ 320204 => '江苏省无锡市北塘区',
+ 320211 => '江苏省无锡市郊区',
+ 320281 => '江苏省无锡市江阴市',
+ 320282 => '江苏省无锡市宜兴市',
+ 320283 => '江苏省无锡市锡山市',
+ 320300 => '江苏省徐州市',
+ 320301 => '江苏省徐州市市辖区',
+ 320302 => '江苏省徐州市鼓楼区',
+ 320303 => '江苏省徐州市云龙区',
+ 320304 => '江苏省徐州市九里区',
+ 320305 => '江苏省徐州市贾汪区',
+ 320311 => '江苏省徐州市泉山区',
+ 320321 => '江苏省徐州市丰县',
+ 320322 => '江苏省徐州市沛县',
+ 320323 => '江苏省徐州市铜山县',
+ 320324 => '江苏省徐州市睢宁县',
+ 320381 => '江苏省徐州市新沂市',
+ 320382 => '江苏省徐州市邳州市',
+ 320400 => '江苏省常州市',
+ 320401 => '江苏省常州市市辖区',
+ 320402 => '江苏省常州市天宁区',
+ 320404 => '江苏省常州市钟楼区',
+ 320405 => '江苏省常州市戚墅堰区',
+ 320411 => '江苏省常州市郊区',
+ 320481 => '江苏省常州市溧阳市',
+ 320482 => '江苏省常州市金坛市',
+ 320483 => '江苏省常州市武进市',
+ 320500 => '江苏省苏州市',
+ 320501 => '江苏省苏州市市辖区',
+ 320502 => '江苏省苏州市沧浪区',
+ 320503 => '江苏省苏州市平江区',
+ 320504 => '江苏省苏州市金阊区',
+ 320511 => '江苏省苏州市郊区',
+ 320581 => '江苏省苏州市常熟市',
+ 320582 => '江苏省苏州市张家港市',
+ 320583 => '江苏省苏州市昆山市',
+ 320584 => '江苏省苏州市吴江市',
+ 320585 => '江苏省苏州市太仓市',
+ 320586 => '江苏省苏州市吴县市',
+ 320600 => '江苏省南通市',
+ 320601 => '江苏省南通市市辖区',
+ 320602 => '江苏省南通市崇川区',
+ 320611 => '江苏省南通市港闸区',
+ 320621 => '江苏省南通市海安县',
+ 320623 => '江苏省南通市如东县',
+ 320681 => '江苏省南通市启东市',
+ 320682 => '江苏省南通市如皋市',
+ 320683 => '江苏省南通市通州市',
+ 320684 => '江苏省南通市海门市',
+ 320700 => '江苏省连云港市',
+ 320701 => '江苏省连云港市市辖区',
+ 320703 => '江苏省连云港市连云区',
+ 320704 => '江苏省连云港市云台区',
+ 320705 => '江苏省连云港市新浦区',
+ 320706 => '江苏省连云港市海州区',
+ 320721 => '江苏省连云港市赣榆县',
+ 320722 => '江苏省连云港市东海县',
+ 320723 => '江苏省连云港市灌云县',
+ 320724 => '江苏省连云港市灌南县',
+ 320800 => '江苏省淮阴市',
+ 320801 => '江苏省淮阴市市辖区',
+ 320802 => '江苏省淮阴市清河区',
+ 320811 => '江苏省淮阴市清浦区',
+ 320821 => '江苏省淮阴市淮阴县',
+ 320826 => '江苏省淮阴市涟水县',
+ 320829 => '江苏省淮阴市洪泽县',
+ 320830 => '江苏省淮阴市盱眙县',
+ 320831 => '江苏省淮阴市金湖县',
+ 320882 => '江苏省淮阴市淮安市',
+ 320900 => '江苏省盐城市',
+ 320901 => '江苏省盐城市市辖区',
+ 320902 => '江苏省盐城市城区',
+ 320921 => '江苏省盐城市响水县',
+ 320922 => '江苏省盐城市滨海县',
+ 320923 => '江苏省盐城市阜宁县',
+ 320924 => '江苏省盐城市射阳县',
+ 320925 => '江苏省盐城市建湖县',
+ 320928 => '江苏省盐城市盐都县',
+ 320981 => '江苏省盐城市东台市',
+ 320982 => '江苏省盐城市大丰市',
+ 321000 => '江苏省扬州市',
+ 321001 => '江苏省扬州市市辖区',
+ 321002 => '江苏省扬州市广陵区',
+ 321011 => '江苏省扬州市郊区',
+ 321023 => '江苏省扬州市宝应县',
+ 321027 => '江苏省扬州市邗江县',
+ 321081 => '江苏省扬州市仪征市',
+ 321084 => '江苏省扬州市高邮市',
+ 321088 => '江苏省扬州市江都市',
+ 321100 => '江苏省镇江市',
+ 321101 => '江苏省镇江市市辖区',
+ 321102 => '江苏省镇江市京口区',
+ 321111 => '江苏省镇江市润州区',
+ 321121 => '江苏省镇江市丹徒县',
+ 321181 => '江苏省镇江市丹阳市',
+ 321182 => '江苏省镇江市扬中市',
+ 321183 => '江苏省镇江市句容市',
+ 321200 => '江苏省泰州市',
+ 321201 => '江苏省泰州市市辖区',
+ 321202 => '江苏省泰州市海陵区',
+ 321203 => '江苏省泰州市高港区',
+ 321281 => '江苏省泰州市兴化市',
+ 321282 => '江苏省泰州市靖江市',
+ 321283 => '江苏省泰州市泰兴市',
+ 321284 => '江苏省泰州市姜堰市',
+ 321300 => '江苏省宿迁市',
+ 321301 => '江苏省宿迁市市辖区',
+ 321302 => '江苏省宿迁市宿城区',
+ 321321 => '江苏省宿迁市宿豫县',
+ 321322 => '江苏省宿迁市沭阳县',
+ 321323 => '江苏省宿迁市泗阳县',
+ 321324 => '江苏省宿迁市泗洪县',
+ 330000 => '浙江省',
+ 330100 => '浙江省杭州市',
+ 330101 => '浙江省杭州市市辖区',
+ 330102 => '浙江省杭州市上城区',
+ 330103 => '浙江省杭州市下城区',
+ 330104 => '浙江省杭州市江干区',
+ 330105 => '浙江省杭州市拱墅区',
+ 330106 => '浙江省杭州市西湖区',
+ 330108 => '浙江省杭州市滨江区',
+ 330122 => '浙江省杭州市桐庐县',
+ 330127 => '浙江省杭州市淳安县',
+ 330181 => '浙江省杭州市萧山市',
+ 330182 => '浙江省杭州市建德市',
+ 330183 => '浙江省杭州市富阳市',
+ 330184 => '浙江省杭州市余杭市',
+ 330185 => '浙江省杭州市临安市',
+ 330200 => '浙江省宁波市',
+ 330201 => '浙江省宁波市市辖区',
+ 330203 => '浙江省宁波市海曙区',
+ 330204 => '浙江省宁波市江东区',
+ 330205 => '浙江省宁波市江北区',
+ 330206 => '浙江省宁波市北仑区',
+ 330211 => '浙江省宁波市镇海区',
+ 330225 => '浙江省宁波市象山县',
+ 330226 => '浙江省宁波市宁海县',
+ 330227 => '浙江省宁波市鄞县',
+ 330281 => '浙江省宁波市余姚市',
+ 330282 => '浙江省宁波市慈溪市',
+ 330283 => '浙江省宁波市奉化市',
+ 330300 => '浙江省温州市',
+ 330301 => '浙江省温州市市辖区',
+ 330302 => '浙江省温州市鹿城区',
+ 330303 => '浙江省温州市龙湾区',
+ 330304 => '浙江省温州市瓯海区',
+ 330322 => '浙江省温州市洞头县',
+ 330324 => '浙江省温州市永嘉县',
+ 330326 => '浙江省温州市平阳县',
+ 330327 => '浙江省温州市苍南县',
+ 330328 => '浙江省温州市文成县',
+ 330329 => '浙江省温州市泰顺县',
+ 330381 => '浙江省温州市瑞安市',
+ 330382 => '浙江省温州市乐清市',
+ 330400 => '浙江省嘉兴市',
+ 330401 => '浙江省嘉兴市市辖区',
+ 330402 => '浙江省嘉兴市秀城区',
+ 330411 => '浙江省嘉兴市郊区',
+ 330421 => '浙江省嘉兴市嘉善县',
+ 330424 => '浙江省嘉兴市海盐县',
+ 330481 => '浙江省嘉兴市海宁市',
+ 330482 => '浙江省嘉兴市平湖市',
+ 330483 => '浙江省嘉兴市桐乡市',
+ 330500 => '浙江省湖州市',
+ 330501 => '浙江省湖州市市辖区',
+ 330521 => '浙江省湖州市德清县',
+ 330522 => '浙江省湖州市长兴县',
+ 330523 => '浙江省湖州市安吉县',
+ 330600 => '浙江省绍兴市',
+ 330601 => '浙江省绍兴市市辖区',
+ 330602 => '浙江省绍兴市越城区',
+ 330621 => '浙江省绍兴市绍兴县',
+ 330624 => '浙江省绍兴市新昌县',
+ 330681 => '浙江省绍兴市诸暨市',
+ 330682 => '浙江省绍兴市上虞市',
+ 330683 => '浙江省绍兴市嵊州市',
+ 330700 => '浙江省金华市',
+ 330701 => '浙江省金华市市辖区',
+ 330702 => '浙江省金华市婺城区',
+ 330721 => '浙江省金华市金华县',
+ 330723 => '浙江省金华市武义县',
+ 330726 => '浙江省金华市浦江县',
+ 330727 => '浙江省金华市磐安县',
+ 330781 => '浙江省金华市兰溪市',
+ 330782 => '浙江省金华市义乌市',
+ 330783 => '浙江省金华市东阳市',
+ 330784 => '浙江省金华市永康市',
+ 330800 => '浙江省衢州市',
+ 330801 => '浙江省衢州市市辖区',
+ 330802 => '浙江省衢州市柯城区',
+ 330821 => '浙江省衢州市衢县',
+ 330822 => '浙江省衢州市常山县',
+ 330824 => '浙江省衢州市开化县',
+ 330825 => '浙江省衢州市龙游县',
+ 330881 => '浙江省衢州市江山市',
+ 330900 => '浙江省舟山市',
+ 330901 => '浙江省舟山市市辖区',
+ 330902 => '浙江省舟山市定海区',
+ 330903 => '浙江省舟山市普陀区',
+ 330921 => '浙江省舟山市岱山县',
+ 330922 => '浙江省舟山市嵊泗县',
+ 331000 => '浙江省台州市',
+ 331001 => '浙江省台州市市辖区',
+ 331002 => '浙江省台州市椒江区',
+ 331003 => '浙江省台州市黄岩区',
+ 331004 => '浙江省台州市路桥区',
+ 331021 => '浙江省台州市玉环县',
+ 331022 => '浙江省台州市三门县',
+ 331023 => '浙江省台州市天台县',
+ 331024 => '浙江省台州市仙居县',
+ 331081 => '浙江省台州市温岭市',
+ 331082 => '浙江省台州市临海市',
+ 332500 => '浙江省丽水地区',
+ 332501 => '浙江省丽水地区丽水市',
+ 332502 => '浙江省丽水地区龙泉市',
+ 332522 => '浙江省丽水地区青田县',
+ 332523 => '浙江省丽水地区云和县',
+ 332525 => '浙江省丽水地区庆元县',
+ 332526 => '浙江省丽水地区缙云县',
+ 332527 => '浙江省丽水地区遂昌县',
+ 332528 => '浙江省丽水地区松阳县',
+ 332529 => '浙江省丽水地区景宁畲族自治县',
+ 340000 => '安徽省',
+ 340100 => '安徽省合肥市',
+ 340101 => '安徽省合肥市市辖区',
+ 340102 => '安徽省合肥市东市区',
+ 340103 => '安徽省合肥市中市区',
+ 340104 => '安徽省合肥市西市区',
+ 340111 => '安徽省合肥市郊区',
+ 340121 => '安徽省合肥市长丰县',
+ 340122 => '安徽省合肥市肥东县',
+ 340123 => '安徽省合肥市肥西县',
+ 340200 => '安徽省芜湖市',
+ 340201 => '安徽省芜湖市市辖区',
+ 340202 => '安徽省芜湖市镜湖区',
+ 340203 => '安徽省芜湖市马塘区',
+ 340204 => '安徽省芜湖市新芜区',
+ 340207 => '安徽省芜湖市鸠江区',
+ 340221 => '安徽省芜湖市芜湖县',
+ 340222 => '安徽省芜湖市繁昌县',
+ 340223 => '安徽省芜湖市南陵县',
+ 340300 => '安徽省蚌埠市',
+ 340301 => '安徽省蚌埠市市辖区',
+ 340302 => '安徽省蚌埠市东市区',
+ 340303 => '安徽省蚌埠市中市区',
+ 340304 => '安徽省蚌埠市西市区',
+ 340311 => '安徽省蚌埠市郊区',
+ 340321 => '安徽省蚌埠市怀远县',
+ 340322 => '安徽省蚌埠市五河县',
+ 340323 => '安徽省蚌埠市固镇县',
+ 340400 => '安徽省淮南市',
+ 340401 => '安徽省淮南市市辖区',
+ 340402 => '安徽省淮南市大通区',
+ 340403 => '安徽省淮南市田家庵区',
+ 340404 => '安徽省淮南市谢家集区',
+ 340405 => '安徽省淮南市八公山区',
+ 340406 => '安徽省淮南市潘集区',
+ 340421 => '安徽省淮南市凤台县',
+ 340500 => '安徽省马鞍山市',
+ 340501 => '安徽省马鞍山市市辖区',
+ 340502 => '安徽省马鞍山市金家庄区',
+ 340503 => '安徽省马鞍山市花山区',
+ 340504 => '安徽省马鞍山市雨山区',
+ 340505 => '安徽省马鞍山市向山区',
+ 340521 => '安徽省马鞍山市当涂县',
+ 340600 => '安徽省淮北市',
+ 340601 => '安徽省淮北市市辖区',
+ 340602 => '安徽省淮北市杜集区',
+ 340603 => '安徽省淮北市相山区',
+ 340604 => '安徽省淮北市烈山区',
+ 340621 => '安徽省淮北市濉溪县',
+ 340700 => '安徽省铜陵市',
+ 340701 => '安徽省铜陵市市辖区',
+ 340702 => '安徽省铜陵市铜官山区',
+ 340703 => '安徽省铜陵市狮子山区',
+ 340711 => '安徽省铜陵市郊区',
+ 340721 => '安徽省铜陵市铜陵县',
+ 340800 => '安徽省安庆市',
+ 340801 => '安徽省安庆市市辖区',
+ 340802 => '安徽省安庆市迎江区',
+ 340803 => '安徽省安庆市大观区',
+ 340811 => '安徽省安庆市郊区',
+ 340822 => '安徽省安庆市怀宁县',
+ 340823 => '安徽省安庆市枞阳县',
+ 340824 => '安徽省安庆市潜山县',
+ 340825 => '安徽省安庆市太湖县',
+ 340826 => '安徽省安庆市宿松县',
+ 340827 => '安徽省安庆市望江县',
+ 340828 => '安徽省安庆市岳西县',
+ 340881 => '安徽省安庆市桐城市',
+ 341000 => '安徽省黄山市',
+ 341001 => '安徽省黄山市市辖区',
+ 341002 => '安徽省黄山市屯溪区',
+ 341003 => '安徽省黄山市黄山区',
+ 341004 => '安徽省黄山市徽州区',
+ 341021 => '安徽省黄山市歙县',
+ 341022 => '安徽省黄山市休宁县',
+ 341023 => '安徽省黄山市黟县',
+ 341024 => '安徽省黄山市祁门县',
+ 341100 => '安徽省滁州市',
+ 341101 => '安徽省滁州市市辖区',
+ 341102 => '安徽省滁州市琅琊区',
+ 341103 => '安徽省滁州市南谯区',
+ 341122 => '安徽省滁州市来安县',
+ 341124 => '安徽省滁州市全椒县',
+ 341125 => '安徽省滁州市定远县',
+ 341126 => '安徽省滁州市凤阳县',
+ 341181 => '安徽省滁州市天长市',
+ 341182 => '安徽省滁州市明光市',
+ 341200 => '安徽省阜阳市',
+ 341201 => '安徽省阜阳市市辖区',
+ 341202 => '安徽省阜阳市颍州区',
+ 341203 => '安徽省阜阳市颍东区',
+ 341204 => '安徽省阜阳市颍泉区',
+ 341221 => '安徽省阜阳市临泉县',
+ 341222 => '安徽省阜阳市太和县',
+ 341223 => '安徽省阜阳市涡阳县',
+ 341224 => '安徽省阜阳市蒙城县',
+ 341225 => '安徽省阜阳市阜南县',
+ 341226 => '安徽省阜阳市颍上县',
+ 341227 => '安徽省阜阳市利辛县',
+ 341281 => '安徽省阜阳市亳州市',
+ 341282 => '安徽省阜阳市界首市',
+ 341300 => '安徽省宿州市',
+ 341301 => '安徽省宿州市市辖区',
+ 341302 => '安徽省宿州市甬桥区',
+ 341321 => '安徽省宿州市砀山县',
+ 341322 => '安徽省宿州市萧县',
+ 341323 => '安徽省宿州市灵璧县',
+ 341324 => '安徽省宿州市泗县',
+ 342400 => '安徽省六安地区',
+ 342401 => '安徽省六安地区六安市',
+ 342422 => '安徽省六安地区寿县',
+ 342423 => '安徽省六安地区霍邱县',
+ 342425 => '安徽省六安地区舒城县',
+ 342426 => '安徽省六安地区金寨县',
+ 342427 => '安徽省六安地区霍山县',
+ 342500 => '安徽省宣城地区',
+ 342501 => '安徽省宣城地区宣州市',
+ 342502 => '安徽省宣城地区宁国市',
+ 342522 => '安徽省宣城地区郎溪县',
+ 342523 => '安徽省宣城地区广德县',
+ 342529 => '安徽省宣城地区泾县',
+ 342530 => '安徽省宣城地区旌德县',
+ 342531 => '安徽省宣城地区绩溪县',
+ 342600 => '安徽省巢湖地区',
+ 342601 => '安徽省巢湖地区巢湖市',
+ 342622 => '安徽省巢湖地区庐江县',
+ 342623 => '安徽省巢湖地区无为县',
+ 342625 => '安徽省巢湖地区含山县',
+ 342626 => '安徽省巢湖地区和县',
+ 342900 => '安徽省池州地区',
+ 342901 => '安徽省池州地区贵池市',
+ 342921 => '安徽省池州地区东至县',
+ 342922 => '安徽省池州地区石台县',
+ 342923 => '安徽省池州地区青阳县',
+ 350000 => '福建省',
+ 350100 => '福建省福州市',
+ 350101 => '福建省福州市市辖区',
+ 350102 => '福建省福州市鼓楼区',
+ 350103 => '福建省福州市台江区',
+ 350104 => '福建省福州市仓山区',
+ 350105 => '福建省福州市马尾区',
+ 350111 => '福建省福州市晋安区',
+ 350121 => '福建省福州市闽侯县',
+ 350122 => '福建省福州市连江县',
+ 350123 => '福建省福州市罗源县',
+ 350124 => '福建省福州市闽清县',
+ 350125 => '福建省福州市永泰县',
+ 350128 => '福建省福州市平潭县',
+ 350181 => '福建省福州市福清市',
+ 350182 => '福建省福州市长乐市',
+ 350200 => '福建省厦门市',
+ 350201 => '福建省厦门市市辖区',
+ 350202 => '福建省厦门市鼓浪屿区',
+ 350203 => '福建省厦门市思明区',
+ 350204 => '福建省厦门市开元区',
+ 350205 => '福建省厦门市杏林区',
+ 350206 => '福建省厦门市湖里区',
+ 350211 => '福建省厦门市集美区',
+ 350212 => '福建省厦门市同安区',
+ 350300 => '福建省莆田市',
+ 350301 => '福建省莆田市市辖区',
+ 350302 => '福建省莆田市城厢区',
+ 350303 => '福建省莆田市涵江区',
+ 350321 => '福建省莆田市莆田县',
+ 350322 => '福建省莆田市仙游县',
+ 350400 => '福建省三明市',
+ 350401 => '福建省三明市市辖区',
+ 350402 => '福建省三明市梅列区',
+ 350403 => '福建省三明市三元区',
+ 350421 => '福建省三明市明溪县',
+ 350423 => '福建省三明市清流县',
+ 350424 => '福建省三明市宁化县',
+ 350425 => '福建省三明市大田县',
+ 350426 => '福建省三明市尤溪县',
+ 350427 => '福建省三明市沙县',
+ 350428 => '福建省三明市将乐县',
+ 350429 => '福建省三明市泰宁县',
+ 350430 => '福建省三明市建宁县',
+ 350481 => '福建省三明市永安市',
+ 350500 => '福建省泉州市',
+ 350501 => '福建省泉州市市辖区',
+ 350502 => '福建省泉州市鲤城区',
+ 350503 => '福建省泉州市丰泽区',
+ 350504 => '福建省泉州市洛江区',
+ 350521 => '福建省泉州市惠安县',
+ 350524 => '福建省泉州市安溪县',
+ 350525 => '福建省泉州市永春县',
+ 350526 => '福建省泉州市德化县',
+ 350527 => '福建省泉州市金门县',
+ 350581 => '福建省泉州市石狮市',
+ 350582 => '福建省泉州市晋江市',
+ 350583 => '福建省泉州市南安市',
+ 350600 => '福建省漳州市',
+ 350601 => '福建省漳州市市辖区',
+ 350602 => '福建省漳州市芗城区',
+ 350603 => '福建省漳州市龙文区',
+ 350622 => '福建省漳州市云霄县',
+ 350623 => '福建省漳州市漳浦县',
+ 350624 => '福建省漳州市诏安县',
+ 350625 => '福建省漳州市长泰县',
+ 350626 => '福建省漳州市东山县',
+ 350627 => '福建省漳州市南靖县',
+ 350628 => '福建省漳州市平和县',
+ 350629 => '福建省漳州市华安县',
+ 350681 => '福建省漳州市龙海市',
+ 350700 => '福建省南平市',
+ 350701 => '福建省南平市市辖区',
+ 350702 => '福建省南平市延平区',
+ 350721 => '福建省南平市顺昌县',
+ 350722 => '福建省南平市浦城县',
+ 350723 => '福建省南平市光泽县',
+ 350724 => '福建省南平市松溪县',
+ 350725 => '福建省南平市政和县',
+ 350781 => '福建省南平市邵武市',
+ 350782 => '福建省南平市武夷山市',
+ 350783 => '福建省南平市建瓯市',
+ 350784 => '福建省南平市建阳市',
+ 350800 => '福建省龙岩市',
+ 350801 => '福建省龙岩市市辖区',
+ 350802 => '福建省龙岩市新罗区',
+ 350821 => '福建省龙岩市长汀县',
+ 350822 => '福建省龙岩市永定县',
+ 350823 => '福建省龙岩市上杭县',
+ 350824 => '福建省龙岩市武平县',
+ 350825 => '福建省龙岩市连城县',
+ 350881 => '福建省龙岩市漳平市',
+ 352200 => '福建省宁德地区',
+ 352201 => '福建省宁德地区宁德市',
+ 352202 => '福建省宁德地区福安市',
+ 352203 => '福建省宁德地区福鼎市',
+ 352225 => '福建省宁德地区霞浦县',
+ 352227 => '福建省宁德地区古田县',
+ 352228 => '福建省宁德地区屏南县',
+ 352229 => '福建省宁德地区寿宁县',
+ 352230 => '福建省宁德地区周宁县',
+ 352231 => '福建省宁德地区柘荣县',
+ 360000 => '江西省',
+ 360100 => '江西省南昌市',
+ 360101 => '江西省南昌市市辖区',
+ 360102 => '江西省南昌市东湖区',
+ 360103 => '江西省南昌市西湖区',
+ 360104 => '江西省南昌市青云谱区',
+ 360105 => '江西省南昌市湾里区',
+ 360111 => '江西省南昌市郊区',
+ 360121 => '江西省南昌市南昌县',
+ 360122 => '江西省南昌市新建县',
+ 360123 => '江西省南昌市安义县',
+ 360124 => '江西省南昌市进贤县',
+ 360200 => '江西省景德镇市',
+ 360201 => '江西省景德镇市市辖区',
+ 360202 => '江西省景德镇市昌江区',
+ 360203 => '江西省景德镇市珠山区',
+ 360222 => '江西省景德镇市浮梁县',
+ 360281 => '江西省景德镇市乐平市',
+ 360300 => '江西省萍乡市',
+ 360301 => '江西省萍乡市市辖区',
+ 360302 => '江西省萍乡市安源区',
+ 360313 => '江西省萍乡市湘东区',
+ 360321 => '江西省萍乡市莲花县',
+ 360322 => '江西省萍乡市上栗县',
+ 360323 => '江西省萍乡市芦溪县',
+ 360400 => '江西省九江市',
+ 360401 => '江西省九江市市辖区',
+ 360402 => '江西省九江市庐山区',
+ 360403 => '江西省九江市浔阳区',
+ 360421 => '江西省九江市九江县',
+ 360423 => '江西省九江市武宁县',
+ 360424 => '江西省九江市修水县',
+ 360425 => '江西省九江市永修县',
+ 360426 => '江西省九江市德安县',
+ 360427 => '江西省九江市星子县',
+ 360428 => '江西省九江市都昌县',
+ 360429 => '江西省九江市湖口县',
+ 360430 => '江西省九江市彭泽县',
+ 360481 => '江西省九江市瑞昌市',
+ 360500 => '江西省新余市',
+ 360501 => '江西省新余市市辖区',
+ 360502 => '江西省新余市渝水区',
+ 360521 => '江西省新余市分宜县',
+ 360600 => '江西省鹰潭市',
+ 360601 => '江西省鹰潭市市辖区',
+ 360602 => '江西省鹰潭市月湖区',
+ 360622 => '江西省鹰潭市余江县',
+ 360681 => '江西省鹰潭市贵溪市',
+ 360700 => '江西省赣州市',
+ 360701 => '江西省赣州市市辖区',
+ 360702 => '江西省赣州市章贡区',
+ 360721 => '江西省赣州市赣县',
+ 360722 => '江西省赣州市信丰县',
+ 360723 => '江西省赣州市大余县',
+ 360724 => '江西省赣州市上犹县',
+ 360725 => '江西省赣州市崇义县',
+ 360726 => '江西省赣州市安远县',
+ 360727 => '江西省赣州市龙南县',
+ 360728 => '江西省赣州市定南县',
+ 360729 => '江西省赣州市全南县',
+ 360730 => '江西省赣州市宁都县',
+ 360731 => '江西省赣州市于都县',
+ 360732 => '江西省赣州市兴国县',
+ 360733 => '江西省赣州市会昌县',
+ 360734 => '江西省赣州市寻乌县',
+ 360735 => '江西省赣州市石城县',
+ 360781 => '江西省赣州市瑞金市',
+ 360782 => '江西省赣州市南康市',
+ 362200 => '江西省宜春地区',
+ 362201 => '江西省宜春地区宜春市',
+ 362202 => '江西省宜春地区丰城市',
+ 362203 => '江西省宜春地区樟树市',
+ 362204 => '江西省宜春地区高安市',
+ 362226 => '江西省宜春地区奉新县',
+ 362227 => '江西省宜春地区万载县',
+ 362228 => '江西省宜春地区上高县',
+ 362229 => '江西省宜春地区宜丰县',
+ 362232 => '江西省宜春地区靖安县',
+ 362233 => '江西省宜春地区铜鼓县',
+ 362300 => '江西省上饶地区',
+ 362301 => '江西省上饶地区上饶市',
+ 362302 => '江西省上饶地区德兴市',
+ 362321 => '江西省上饶地区上饶县',
+ 362322 => '江西省上饶地区广丰县',
+ 362323 => '江西省上饶地区玉山县',
+ 362324 => '江西省上饶地区铅山县',
+ 362325 => '江西省上饶地区横峰县',
+ 362326 => '江西省上饶地区弋阳县',
+ 362329 => '江西省上饶地区余干县',
+ 362330 => '江西省上饶地区波阳县',
+ 362331 => '江西省上饶地区万年县',
+ 362334 => '江西省上饶地区婺源县',
+ 362400 => '江西省吉安地区',
+ 362401 => '江西省吉安地区吉安市',
+ 362402 => '江西省吉安地区井冈山市',
+ 362421 => '江西省吉安地区吉安县',
+ 362422 => '江西省吉安地区吉水县',
+ 362423 => '江西省吉安地区峡江县',
+ 362424 => '江西省吉安地区新干县',
+ 362425 => '江西省吉安地区永丰县',
+ 362426 => '江西省吉安地区泰和县',
+ 362427 => '江西省吉安地区遂川县',
+ 362428 => '江西省吉安地区万安县',
+ 362429 => '江西省吉安地区安福县',
+ 362430 => '江西省吉安地区永新县',
+ 362432 => '江西省吉安地区宁冈县',
+ 362500 => '江西省抚州地区',
+ 362502 => '江西省抚州地区临川市',
+ 362522 => '江西省抚州地区南城县',
+ 362523 => '江西省抚州地区黎川县',
+ 362524 => '江西省抚州地区南丰县',
+ 362525 => '江西省抚州地区崇仁县',
+ 362526 => '江西省抚州地区乐安县',
+ 362527 => '江西省抚州地区宜黄县',
+ 362528 => '江西省抚州地区金溪县',
+ 362529 => '江西省抚州地区资溪县',
+ 362531 => '江西省抚州地区东乡县',
+ 362532 => '江西省抚州地区广昌县',
+ 370000 => '山东省',
+ 370100 => '山东省济南市',
+ 370101 => '山东省济南市市辖区',
+ 370102 => '山东省济南市历下区',
+ 370103 => '山东省济南市市中区',
+ 370104 => '山东省济南市槐荫区',
+ 370105 => '山东省济南市天桥区',
+ 370112 => '山东省济南市历城区',
+ 370123 => '山东省济南市长清县',
+ 370124 => '山东省济南市平阴县',
+ 370125 => '山东省济南市济阳县',
+ 370126 => '山东省济南市商河县',
+ 370181 => '山东省济南市章丘市',
+ 370200 => '山东省青岛市',
+ 370201 => '山东省青岛市市辖区',
+ 370202 => '山东省青岛市市南区',
+ 370203 => '山东省青岛市市北区',
+ 370205 => '山东省青岛市四方区',
+ 370211 => '山东省青岛市黄岛区',
+ 370212 => '山东省青岛市崂山区',
+ 370213 => '山东省青岛市李沧区',
+ 370214 => '山东省青岛市城阳区',
+ 370281 => '山东省青岛市胶州市',
+ 370282 => '山东省青岛市即墨市',
+ 370283 => '山东省青岛市平度市',
+ 370284 => '山东省青岛市胶南市',
+ 370285 => '山东省青岛市莱西市',
+ 370300 => '山东省淄博市',
+ 370301 => '山东省淄博市市辖区',
+ 370302 => '山东省淄博市淄川区',
+ 370303 => '山东省淄博市张店区',
+ 370304 => '山东省淄博市博山区',
+ 370305 => '山东省淄博市临淄区',
+ 370306 => '山东省淄博市周村区',
+ 370321 => '山东省淄博市桓台县',
+ 370322 => '山东省淄博市高青县',
+ 370323 => '山东省淄博市沂源县',
+ 370400 => '山东省枣庄市',
+ 370401 => '山东省枣庄市市辖区',
+ 370402 => '山东省枣庄市市中区',
+ 370403 => '山东省枣庄市薛城区',
+ 370404 => '山东省枣庄市峄城区',
+ 370405 => '山东省枣庄市台儿庄区',
+ 370406 => '山东省枣庄市山亭区',
+ 370481 => '山东省枣庄市滕州市',
+ 370500 => '山东省东营市',
+ 370501 => '山东省东营市市辖区',
+ 370502 => '山东省东营市东营区',
+ 370503 => '山东省东营市河口区',
+ 370521 => '山东省东营市垦利县',
+ 370522 => '山东省东营市利津县',
+ 370523 => '山东省东营市广饶县',
+ 370600 => '山东省烟台市',
+ 370601 => '山东省烟台市市辖区',
+ 370602 => '山东省烟台市芝罘区',
+ 370611 => '山东省烟台市福山区',
+ 370612 => '山东省烟台市牟平区',
+ 370613 => '山东省烟台市莱山区',
+ 370634 => '山东省烟台市长岛县',
+ 370681 => '山东省烟台市龙口市',
+ 370682 => '山东省烟台市莱阳市',
+ 370683 => '山东省烟台市莱州市',
+ 370684 => '山东省烟台市蓬莱市',
+ 370685 => '山东省烟台市招远市',
+ 370686 => '山东省烟台市栖霞市',
+ 370687 => '山东省烟台市海阳市',
+ 370700 => '山东省潍坊市',
+ 370701 => '山东省潍坊市市辖区',
+ 370702 => '山东省潍坊市潍城区',
+ 370703 => '山东省潍坊市寒亭区',
+ 370704 => '山东省潍坊市坊子区',
+ 370705 => '山东省潍坊市奎文区',
+ 370724 => '山东省潍坊市临朐县',
+ 370725 => '山东省潍坊市昌乐县',
+ 370781 => '山东省潍坊市青州市',
+ 370782 => '山东省潍坊市诸城市',
+ 370783 => '山东省潍坊市寿光市',
+ 370784 => '山东省潍坊市安丘市',
+ 370785 => '山东省潍坊市高密市',
+ 370786 => '山东省潍坊市昌邑市',
+ 370800 => '山东省济宁市',
+ 370801 => '山东省济宁市市辖区',
+ 370802 => '山东省济宁市市中区',
+ 370811 => '山东省济宁市任城区',
+ 370826 => '山东省济宁市微山县',
+ 370827 => '山东省济宁市鱼台县',
+ 370828 => '山东省济宁市金乡县',
+ 370829 => '山东省济宁市嘉祥县',
+ 370830 => '山东省济宁市汶上县',
+ 370831 => '山东省济宁市泗水县',
+ 370832 => '山东省济宁市梁山县',
+ 370881 => '山东省济宁市曲阜市',
+ 370882 => '山东省济宁市兖州市',
+ 370883 => '山东省济宁市邹城市',
+ 370900 => '山东省泰安市',
+ 370901 => '山东省泰安市市辖区',
+ 370902 => '山东省泰安市泰山区',
+ 370911 => '山东省泰安市郊区',
+ 370921 => '山东省泰安市宁阳县',
+ 370923 => '山东省泰安市东平县',
+ 370982 => '山东省泰安市新泰市',
+ 370983 => '山东省泰安市肥城市',
+ 371000 => '山东省威海市',
+ 371001 => '山东省威海市市辖区',
+ 371002 => '山东省威海市环翠区',
+ 371081 => '山东省威海市文登市',
+ 371082 => '山东省威海市荣成市',
+ 371083 => '山东省威海市乳山市',
+ 371100 => '山东省日照市',
+ 371101 => '山东省日照市市辖区',
+ 371102 => '山东省日照市东港区',
+ 371121 => '山东省日照市五莲县',
+ 371122 => '山东省日照市莒县',
+ 371200 => '山东省莱芜市',
+ 371201 => '山东省莱芜市市辖区',
+ 371202 => '山东省莱芜市莱城区',
+ 371203 => '山东省莱芜市钢城区',
+ 371300 => '山东省临沂市',
+ 371301 => '山东省临沂市市辖区',
+ 371302 => '山东省临沂市兰山区',
+ 371311 => '山东省临沂市罗庄区',
+ 371312 => '山东省临沂市河东区',
+ 371321 => '山东省临沂市沂南县',
+ 371322 => '山东省临沂市郯城县',
+ 371323 => '山东省临沂市沂水县',
+ 371324 => '山东省临沂市苍山县',
+ 371325 => '山东省临沂市费县',
+ 371326 => '山东省临沂市平邑县',
+ 371327 => '山东省临沂市莒南县',
+ 371328 => '山东省临沂市蒙阴县',
+ 371329 => '山东省临沂市临沭县',
+ 371400 => '山东省德州市',
+ 371401 => '山东省德州市市辖区',
+ 371402 => '山东省德州市德城区',
+ 371421 => '山东省德州市陵县',
+ 371422 => '山东省德州市宁津县',
+ 371423 => '山东省德州市庆云县',
+ 371424 => '山东省德州市临邑县',
+ 371425 => '山东省德州市齐河县',
+ 371426 => '山东省德州市平原县',
+ 371427 => '山东省德州市夏津县',
+ 371428 => '山东省德州市武城县',
+ 371481 => '山东省德州市乐陵市',
+ 371482 => '山东省德州市禹城市',
+ 371500 => '山东省聊城市',
+ 371501 => '山东省聊城市市辖区',
+ 371502 => '山东省聊城市东昌府区',
+ 371521 => '山东省聊城市阳谷县',
+ 371522 => '山东省聊城市莘县',
+ 371523 => '山东省聊城市茌平县',
+ 371524 => '山东省聊城市东阿县',
+ 371525 => '山东省聊城市冠县',
+ 371526 => '山东省聊城市高唐县',
+ 371581 => '山东省聊城市临清市',
+ 372300 => '山东省滨州地区',
+ 372301 => '山东省滨州地区滨州市',
+ 372321 => '山东省滨州地区惠民县',
+ 372323 => '山东省滨州地区阳信县',
+ 372324 => '山东省滨州地区无棣县',
+ 372325 => '山东省滨州地区沾化县',
+ 372328 => '山东省滨州地区博兴县',
+ 372330 => '山东省滨州地区邹平县',
+ 372900 => '山东省菏泽地区',
+ 372901 => '山东省菏泽地区菏泽市',
+ 372922 => '山东省菏泽地区曹县',
+ 372923 => '山东省菏泽地区定陶县',
+ 372924 => '山东省菏泽地区成武县',
+ 372925 => '山东省菏泽地区单县',
+ 372926 => '山东省菏泽地区巨野县',
+ 372928 => '山东省菏泽地区郓城县',
+ 372929 => '山东省菏泽地区鄄城县',
+ 372930 => '山东省菏泽地区东明县',
+ 410000 => '河南省',
+ 410100 => '河南省郑州市',
+ 410101 => '河南省郑州市市辖区',
+ 410102 => '河南省郑州市中原区',
+ 410103 => '河南省郑州市二七区',
+ 410104 => '河南省郑州市管城回族区',
+ 410105 => '河南省郑州市金水区',
+ 410106 => '河南省郑州市上街区',
+ 410108 => '河南省郑州市邙山区',
+ 410122 => '河南省郑州市中牟县',
+ 410181 => '河南省郑州市巩义市',
+ 410182 => '河南省郑州市荥阳市',
+ 410183 => '河南省郑州市新密市',
+ 410184 => '河南省郑州市新郑市',
+ 410185 => '河南省郑州市登封市',
+ 410200 => '河南省开封市',
+ 410201 => '河南省开封市市辖区',
+ 410202 => '河南省开封市龙亭区',
+ 410203 => '河南省开封市顺河回族区',
+ 410204 => '河南省开封市鼓楼区',
+ 410205 => '河南省开封市南关区',
+ 410211 => '河南省开封市郊区',
+ 410221 => '河南省开封市杞县',
+ 410222 => '河南省开封市通许县',
+ 410223 => '河南省开封市尉氏县',
+ 410224 => '河南省开封市开封县',
+ 410225 => '河南省开封市兰考县',
+ 410300 => '河南省洛阳市',
+ 410301 => '河南省洛阳市市辖区',
+ 410302 => '河南省洛阳市老城区',
+ 410303 => '河南省洛阳市西工区',
+ 410304 => '河南省洛阳市廛河回族区',
+ 410305 => '河南省洛阳市涧西区',
+ 410306 => '河南省洛阳市吉利区',
+ 410311 => '河南省洛阳市郊区',
+ 410322 => '河南省洛阳市孟津县',
+ 410323 => '河南省洛阳市新安县',
+ 410324 => '河南省洛阳市栾川县',
+ 410325 => '河南省洛阳市嵩县',
+ 410326 => '河南省洛阳市汝阳县',
+ 410327 => '河南省洛阳市宜阳县',
+ 410328 => '河南省洛阳市洛宁县',
+ 410329 => '河南省洛阳市伊川县',
+ 410381 => '河南省洛阳市偃师市',
+ 410400 => '河南省平顶山市',
+ 410401 => '河南省平顶山市市辖区',
+ 410402 => '河南省平顶山市新华区',
+ 410403 => '河南省平顶山市卫东区',
+ 410404 => '河南省平顶山市石龙区',
+ 410411 => '河南省平顶山市湛河区',
+ 410421 => '河南省平顶山市宝丰县',
+ 410422 => '河南省平顶山市叶县',
+ 410423 => '河南省平顶山市鲁山县',
+ 410425 => '河南省平顶山市郏县',
+ 410481 => '河南省平顶山市舞钢市',
+ 410482 => '河南省平顶山市汝州市',
+ 410500 => '河南省安阳市',
+ 410501 => '河南省安阳市市辖区',
+ 410502 => '河南省安阳市文峰区',
+ 410503 => '河南省安阳市北关区',
+ 410504 => '河南省安阳市铁西区',
+ 410511 => '河南省安阳市郊区',
+ 410522 => '河南省安阳市安阳县',
+ 410523 => '河南省安阳市汤阴县',
+ 410526 => '河南省安阳市滑县',
+ 410527 => '河南省安阳市内黄县',
+ 410581 => '河南省安阳市林州市',
+ 410600 => '河南省鹤壁市',
+ 410601 => '河南省鹤壁市市辖区',
+ 410602 => '河南省鹤壁市鹤山区',
+ 410603 => '河南省鹤壁市山城区',
+ 410611 => '河南省鹤壁市郊区',
+ 410621 => '河南省鹤壁市浚县',
+ 410622 => '河南省鹤壁市淇县',
+ 410700 => '河南省新乡市',
+ 410701 => '河南省新乡市市辖区',
+ 410702 => '河南省新乡市红旗区',
+ 410703 => '河南省新乡市新华区',
+ 410704 => '河南省新乡市北站区',
+ 410711 => '河南省新乡市郊区',
+ 410721 => '河南省新乡市新乡县',
+ 410724 => '河南省新乡市获嘉县',
+ 410725 => '河南省新乡市原阳县',
+ 410726 => '河南省新乡市延津县',
+ 410727 => '河南省新乡市封丘县',
+ 410728 => '河南省新乡市长垣县',
+ 410781 => '河南省新乡市卫辉市',
+ 410782 => '河南省新乡市辉县市',
+ 410800 => '河南省焦作市',
+ 410801 => '河南省焦作市市辖区',
+ 410802 => '河南省焦作市解放区',
+ 410803 => '河南省焦作市中站区',
+ 410804 => '河南省焦作市马村区',
+ 410811 => '河南省焦作市山阳区',
+ 410821 => '河南省焦作市修武县',
+ 410822 => '河南省焦作市博爱县',
+ 410823 => '河南省焦作市武陟县',
+ 410825 => '河南省焦作市温县',
+ 410881 => '河南省焦作市济源市',
+ 410882 => '河南省焦作市沁阳市',
+ 410883 => '河南省焦作市孟州市',
+ 410900 => '河南省濮阳市',
+ 410901 => '河南省濮阳市市辖区',
+ 410902 => '河南省濮阳市市区',
+ 410922 => '河南省濮阳市清丰县',
+ 410923 => '河南省濮阳市南乐县',
+ 410926 => '河南省濮阳市范县',
+ 410927 => '河南省濮阳市台前县',
+ 410928 => '河南省濮阳市濮阳县',
+ 411000 => '河南省许昌市',
+ 411001 => '河南省许昌市市辖区',
+ 411002 => '河南省许昌市魏都区',
+ 411023 => '河南省许昌市许昌县',
+ 411024 => '河南省许昌市鄢陵县',
+ 411025 => '河南省许昌市襄城县',
+ 411081 => '河南省许昌市禹州市',
+ 411082 => '河南省许昌市长葛市',
+ 411100 => '河南省漯河市',
+ 411101 => '河南省漯河市市辖区',
+ 411102 => '河南省漯河市源汇区',
+ 411121 => '河南省漯河市舞阳县',
+ 411122 => '河南省漯河市临颍县',
+ 411123 => '河南省漯河市郾城县',
+ 411200 => '河南省三门峡市',
+ 411201 => '河南省三门峡市市辖区',
+ 411202 => '河南省三门峡市湖滨区',
+ 411221 => '河南省三门峡市渑池县',
+ 411222 => '河南省三门峡市陕县',
+ 411224 => '河南省三门峡市卢氏县',
+ 411281 => '河南省三门峡市义马市',
+ 411282 => '河南省三门峡市灵宝市',
+ 411300 => '河南省南阳市',
+ 411301 => '河南省南阳市市辖区',
+ 411302 => '河南省南阳市宛城区',
+ 411303 => '河南省南阳市卧龙区',
+ 411321 => '河南省南阳市南召县',
+ 411322 => '河南省南阳市方城县',
+ 411323 => '河南省南阳市西峡县',
+ 411324 => '河南省南阳市镇平县',
+ 411325 => '河南省南阳市内乡县',
+ 411326 => '河南省南阳市淅川县',
+ 411327 => '河南省南阳市社旗县',
+ 411328 => '河南省南阳市唐河县',
+ 411329 => '河南省南阳市新野县',
+ 411330 => '河南省南阳市桐柏县',
+ 411381 => '河南省南阳市邓州市',
+ 411400 => '河南省商丘市',
+ 411401 => '河南省商丘市市辖区',
+ 411402 => '河南省商丘市梁园区',
+ 411403 => '河南省商丘市睢阳区',
+ 411421 => '河南省商丘市民权县',
+ 411422 => '河南省商丘市睢县',
+ 411423 => '河南省商丘市宁陵县',
+ 411424 => '河南省商丘市柘城县',
+ 411425 => '河南省商丘市虞城县',
+ 411426 => '河南省商丘市夏邑县',
+ 411481 => '河南省商丘市永城市',
+ 411500 => '河南省信阳市',
+ 411501 => '河南省信阳市市辖区',
+ 411502 => '河南省信阳市师河区',
+ 411503 => '河南省信阳市平桥区',
+ 411521 => '河南省信阳市罗山县',
+ 411522 => '河南省信阳市光山县',
+ 411523 => '河南省信阳市新县',
+ 411524 => '河南省信阳市商城县',
+ 411525 => '河南省信阳市固始县',
+ 411526 => '河南省信阳市潢川县',
+ 411527 => '河南省信阳市淮滨县',
+ 411528 => '河南省信阳市息县',
+ 412700 => '河南省周口地区',
+ 412701 => '河南省周口地区周口市',
+ 412702 => '河南省周口地区项城市',
+ 412721 => '河南省周口地区扶沟县',
+ 412722 => '河南省周口地区西华县',
+ 412723 => '河南省周口地区商水县',
+ 412724 => '河南省周口地区太康县',
+ 412725 => '河南省周口地区鹿邑县',
+ 412726 => '河南省周口地区郸城县',
+ 412727 => '河南省周口地区淮阳县',
+ 412728 => '河南省周口地区沈丘县',
+ 412800 => '河南省驻马店地区',
+ 412801 => '河南省驻马店地区驻马店市',
+ 412821 => '河南省驻马店地区确山县',
+ 412822 => '河南省驻马店地区泌阳县',
+ 412823 => '河南省驻马店地区遂平县',
+ 412824 => '河南省驻马店地区西平县',
+ 412825 => '河南省驻马店地区上蔡县',
+ 412826 => '河南省驻马店地区汝南县',
+ 412827 => '河南省驻马店地区平舆县',
+ 412828 => '河南省驻马店地区新蔡县',
+ 412829 => '河南省驻马店地区正阳县',
+ 420000 => '湖北省',
+ 420100 => '湖北省武汉市',
+ 420101 => '湖北省武汉市市辖区',
+ 420102 => '湖北省武汉市江岸区',
+ 420103 => '湖北省武汉市江汉区',
+ 420104 => '湖北省武汉市乔口区',
+ 420105 => '湖北省武汉市汉阳区',
+ 420106 => '湖北省武汉市武昌区',
+ 420107 => '湖北省武汉市青山区',
+ 420111 => '湖北省武汉市洪山区',
+ 420112 => '湖北省武汉市东西湖区',
+ 420113 => '湖北省武汉市汉南区',
+ 420114 => '湖北省武汉市蔡甸区',
+ 420115 => '湖北省武汉市江夏区',
+ 420116 => '湖北省武汉市黄陂区',
+ 420117 => '湖北省武汉市新洲区',
+ 420200 => '湖北省黄石市',
+ 420201 => '湖北省黄石市市辖区',
+ 420202 => '湖北省黄石市黄石港区',
+ 420203 => '湖北省黄石市石灰窑区',
+ 420204 => '湖北省黄石市下陆区',
+ 420205 => '湖北省黄石市铁山区',
+ 420222 => '湖北省黄石市阳新县',
+ 420281 => '湖北省黄石市大冶市',
+ 420300 => '湖北省十堰市',
+ 420301 => '湖北省十堰市市辖区',
+ 420302 => '湖北省十堰市茅箭区',
+ 420303 => '湖北省十堰市张湾区',
+ 420321 => '湖北省十堰市郧县',
+ 420322 => '湖北省十堰市郧西县',
+ 420323 => '湖北省十堰市竹山县',
+ 420324 => '湖北省十堰市竹溪县',
+ 420325 => '湖北省十堰市房县',
+ 420381 => '湖北省十堰市丹江口市',
+ 420500 => '湖北省宜昌市',
+ 420501 => '湖北省宜昌市市辖区',
+ 420502 => '湖北省宜昌市西陵区',
+ 420503 => '湖北省宜昌市伍家岗区',
+ 420504 => '湖北省宜昌市点军区',
+ 420505 => '湖北省宜昌市虎亭区',
+ 420521 => '湖北省宜昌市宜昌县',
+ 420525 => '湖北省宜昌市远安县',
+ 420526 => '湖北省宜昌市兴山县',
+ 420527 => '湖北省宜昌市秭归县',
+ 420528 => '湖北省宜昌市长阳土家族自治县',
+ 420529 => '湖北省宜昌市五峰土家族自治县',
+ 420581 => '湖北省宜昌市宜都市',
+ 420582 => '湖北省宜昌市当阳市',
+ 420583 => '湖北省宜昌市枝江市',
+ 420600 => '湖北省襄樊市',
+ 420601 => '湖北省襄樊市市辖区',
+ 420602 => '湖北省襄樊市襄城区',
+ 420606 => '湖北省襄樊市樊城区',
+ 420621 => '湖北省襄樊市襄阳县',
+ 420624 => '湖北省襄樊市南漳县',
+ 420625 => '湖北省襄樊市谷城县',
+ 420626 => '湖北省襄樊市保康县',
+ 420682 => '湖北省襄樊市老河口市',
+ 420683 => '湖北省襄樊市枣阳市',
+ 420684 => '湖北省襄樊市宜城市',
+ 420700 => '湖北省鄂州市',
+ 420701 => '湖北省鄂州市市辖区',
+ 420702 => '湖北省鄂州市梁子湖区',
+ 420703 => '湖北省鄂州市华容区',
+ 420704 => '湖北省鄂州市鄂城区',
+ 420800 => '湖北省荆门市',
+ 420801 => '湖北省荆门市市辖区',
+ 420802 => '湖北省荆门市东宝区',
+ 420821 => '湖北省荆门市京山县',
+ 420822 => '湖北省荆门市沙洋县',
+ 420881 => '湖北省荆门市钟祥市',
+ 420900 => '湖北省孝感市',
+ 420901 => '湖北省孝感市市辖区',
+ 420902 => '湖北省孝感市孝南区',
+ 420921 => '湖北省孝感市孝昌县',
+ 420922 => '湖北省孝感市大悟县',
+ 420923 => '湖北省孝感市云梦县',
+ 420981 => '湖北省孝感市应城市',
+ 420982 => '湖北省孝感市安陆市',
+ 420983 => '湖北省孝感市广水市',
+ 420984 => '湖北省孝感市汉川市',
+ 421000 => '湖北省荆州市',
+ 421001 => '湖北省荆州市市辖区',
+ 421002 => '湖北省荆州市沙市区',
+ 421003 => '湖北省荆州市荆州区',
+ 421022 => '湖北省荆州市公安县',
+ 421023 => '湖北省荆州市监利县',
+ 421024 => '湖北省荆州市江陵县',
+ 421081 => '湖北省荆州市石首市',
+ 421083 => '湖北省荆州市洪湖市',
+ 421087 => '湖北省荆州市松滋市',
+ 421100 => '湖北省黄冈市',
+ 421101 => '湖北省黄冈市市辖区',
+ 421102 => '湖北省黄冈市黄州区',
+ 421121 => '湖北省黄冈市团风县',
+ 421122 => '湖北省黄冈市红安县',
+ 421123 => '湖北省黄冈市罗田县',
+ 421124 => '湖北省黄冈市英山县',
+ 421125 => '湖北省黄冈市浠水县',
+ 421126 => '湖北省黄冈市蕲春县',
+ 421127 => '湖北省黄冈市黄梅县',
+ 421181 => '湖北省黄冈市麻城市',
+ 421182 => '湖北省黄冈市武穴市',
+ 421200 => '湖北省咸宁市',
+ 421201 => '湖北省咸宁市市辖区',
+ 421202 => '湖北省咸宁市咸安区',
+ 421221 => '湖北省咸宁市嘉鱼县',
+ 421222 => '湖北省咸宁市通城县',
+ 421223 => '湖北省咸宁市崇阳县',
+ 421224 => '湖北省咸宁市通山县',
+ 422800 => '湖北省施土家族苗族自治州',
+ 422801 => '湖北省恩施土家族苗族自治州恩施县',
+ 422802 => '湖北省恩施土家族苗族自治州利川市',
+ 422822 => '湖北省恩施土家族苗族自治州建始县',
+ 422823 => '湖北省恩施土家族苗族自治州巴东县',
+ 422825 => '湖北省恩施土家族苗族自治州宣恩县',
+ 422826 => '湖北省恩施土家族苗族自治州咸丰县',
+ 422827 => '湖北省恩施土家族苗族自治州来凤县',
+ 422828 => '湖北省恩施土家族苗族自治州鹤峰县',
+ 429000 => '湖北省省直辖县级行政单位',
+ 429001 => '湖北省随州市',
+ 429004 => '湖北省仙桃市',
+ 429005 => '湖北省潜江市',
+ 429006 => '湖北省天门市',
+ 429021 => '湖北省神农架林区',
+ 430000 => '湖南省',
+ 430100 => '湖南省长沙市',
+ 430101 => '湖南省长沙市市辖区',
+ 430102 => '湖南省长沙市芙蓉区',
+ 430103 => '湖南省长沙市天心区',
+ 430104 => '湖南省长沙市岳麓区',
+ 430105 => '湖南省长沙市开福区',
+ 430111 => '湖南省长沙市雨花区',
+ 430121 => '湖南省长沙市长沙县',
+ 430122 => '湖南省长沙市望城县',
+ 430124 => '湖南省长沙市宁乡县',
+ 430181 => '湖南省长沙市浏阳市',
+ 430200 => '湖南省株洲市',
+ 430201 => '湖南省株洲市市辖区',
+ 430202 => '湖南省株洲市荷塘区',
+ 430203 => '湖南省株洲市芦淞区',
+ 430204 => '湖南省株洲市石峰区',
+ 430211 => '湖南省株洲市天元区',
+ 430221 => '湖南省株洲市株洲县',
+ 430223 => '湖南省株洲市攸县',
+ 430224 => '湖南省株洲市茶陵县',
+ 430225 => '湖南省株洲市炎陵县',
+ 430281 => '湖南省株洲市醴陵市',
+ 430300 => '湖南省湘潭市',
+ 430301 => '湖南省湘潭市市辖区',
+ 430302 => '湖南省湘潭市雨湖区',
+ 430304 => '湖南省湘潭市岳塘区',
+ 430321 => '湖南省湘潭市湘潭县',
+ 430381 => '湖南省湘潭市湘乡市',
+ 430382 => '湖南省湘潭市韶山市',
+ 430400 => '湖南省衡阳市',
+ 430401 => '湖南省衡阳市市辖区',
+ 430402 => '湖南省衡阳市江东区',
+ 430403 => '湖南省衡阳市城南区',
+ 430404 => '湖南省衡阳市城北区',
+ 430411 => '湖南省衡阳市郊区',
+ 430412 => '湖南省衡阳市南岳区',
+ 430421 => '湖南省衡阳市衡阳县',
+ 430422 => '湖南省衡阳市衡南县',
+ 430423 => '湖南省衡阳市衡山县',
+ 430424 => '湖南省衡阳市衡东县',
+ 430426 => '湖南省衡阳市祁东县',
+ 430481 => '湖南省衡阳市耒阳市',
+ 430482 => '湖南省衡阳市常宁市',
+ 430500 => '湖南省邵阳市',
+ 430501 => '湖南省邵阳市市辖区',
+ 430502 => '湖南省邵阳市双清区',
+ 430503 => '湖南省邵阳市大祥区',
+ 430511 => '湖南省邵阳市北塔区',
+ 430521 => '湖南省邵阳市邵东县',
+ 430522 => '湖南省邵阳市新邵县',
+ 430523 => '湖南省邵阳市邵阳县',
+ 430524 => '湖南省邵阳市隆回县',
+ 430525 => '湖南省邵阳市洞口县',
+ 430527 => '湖南省邵阳市绥宁县',
+ 430528 => '湖南省邵阳市新宁县',
+ 430529 => '湖南省邵阳市城步苗族自治县',
+ 430581 => '湖南省邵阳市武冈市',
+ 430600 => '湖南省岳阳市',
+ 430601 => '湖南省岳阳市市辖区',
+ 430602 => '湖南省岳阳市岳阳楼区',
+ 430603 => '湖南省岳阳市云溪区',
+ 430611 => '湖南省岳阳市君山区',
+ 430621 => '湖南省岳阳市岳阳县',
+ 430623 => '湖南省岳阳市华容县',
+ 430624 => '湖南省岳阳市湘阴县',
+ 430626 => '湖南省岳阳市平江县',
+ 430681 => '湖南省岳阳市汨罗市',
+ 430682 => '湖南省岳阳市临湘市',
+ 430700 => '湖南省常德市',
+ 430701 => '湖南省常德市市辖区',
+ 430702 => '湖南省常德市武陵区',
+ 430703 => '湖南省常德市鼎城区',
+ 430721 => '湖南省常德市安乡县',
+ 430722 => '湖南省常德市汉寿县',
+ 430723 => '湖南省常德市澧县',
+ 430724 => '湖南省常德市临澧县',
+ 430725 => '湖南省常德市桃源县',
+ 430726 => '湖南省常德市石门县',
+ 430781 => '湖南省常德市津市市',
+ 430800 => '湖南省张家界市',
+ 430801 => '湖南省张家界市市辖区',
+ 430802 => '湖南省张家界市永定区',
+ 430811 => '湖南省张家界市武陵源区',
+ 430821 => '湖南省张家界市慈利县',
+ 430822 => '湖南省张家界市桑植县',
+ 430900 => '湖南省益阳市',
+ 430901 => '湖南省益阳市市辖区',
+ 430902 => '湖南省益阳市资阳区',
+ 430903 => '湖南省益阳市赫山区',
+ 430921 => '湖南省益阳市南县',
+ 430922 => '湖南省益阳市桃江县',
+ 430923 => '湖南省益阳市安化县',
+ 430981 => '湖南省益阳市沅江市',
+ 431000 => '湖南省郴州市',
+ 431001 => '湖南省郴州市市辖区',
+ 431002 => '湖南省郴州市北湖区',
+ 431003 => '湖南省郴州市苏仙区',
+ 431021 => '湖南省郴州市桂阳县',
+ 431022 => '湖南省郴州市宜章县',
+ 431023 => '湖南省郴州市永兴县',
+ 431024 => '湖南省郴州市嘉禾县',
+ 431025 => '湖南省郴州市临武县',
+ 431026 => '湖南省郴州市汝城县',
+ 431027 => '湖南省郴州市桂东县',
+ 431028 => '湖南省郴州市安仁县',
+ 431081 => '湖南省郴州市资兴市',
+ 431100 => '湖南省永州市',
+ 431101 => '湖南省永州市市辖区',
+ 431102 => '湖南省永州市芝山区',
+ 431103 => '湖南省永州市冷水滩区',
+ 431121 => '湖南省永州市祁阳县',
+ 431122 => '湖南省永州市东安县',
+ 431123 => '湖南省永州市双牌县',
+ 431124 => '湖南省永州市道县',
+ 431125 => '湖南省永州市江永县',
+ 431126 => '湖南省永州市宁远县',
+ 431127 => '湖南省永州市蓝山县',
+ 431128 => '湖南省永州市新田县',
+ 431129 => '湖南省永州市江华瑶族自治县',
+ 431200 => '湖南省怀化市',
+ 431201 => '湖南省怀化市市辖区',
+ 431202 => '湖南省怀化市鹤城区',
+ 431221 => '湖南省怀化市中方县',
+ 431222 => '湖南省怀化市沅陵县',
+ 431223 => '湖南省怀化市辰溪县',
+ 431224 => '湖南省怀化市溆浦县',
+ 431225 => '湖南省怀化市会同县',
+ 431226 => '湖南省怀化市麻阳苗族自治县',
+ 431227 => '湖南省怀化市新晃侗族自治县',
+ 431228 => '湖南省怀化市芷江侗族自治县',
+ 431229 => '湖南省怀化市靖州苗族侗族自治县',
+ 431230 => '湖南省怀化市通道侗族自治县',
+ 431281 => '湖南省怀化市洪江市',
+ 432500 => '湖南省娄底地区',
+ 432501 => '湖南省娄底地区娄底市',
+ 432502 => '湖南省娄底地区冷水江市',
+ 432503 => '湖南省娄底地区涟源市',
+ 432522 => '湖南省娄底地区双峰县',
+ 432524 => '湖南省娄底地区新化县',
+ 433000 => '湖南省怀化市',
+ 433001 => '湖南省怀化市',
+ 433100 => '湖南省湘西土家族苗族自治州',
+ 433101 => '湖南省湘西土家族苗族自治州吉首市',
+ 433122 => '湖南省湘西土家族苗族自治州泸溪县',
+ 433123 => '湖南省湘西土家族苗族自治州凤凰县',
+ 433124 => '湖南省湘西土家族苗族自治州花垣县',
+ 433125 => '湖南省湘西土家族苗族自治州保靖县',
+ 433126 => '湖南省湘西土家族苗族自治州古丈县',
+ 433127 => '湖南省湘西土家族苗族自治州永顺县',
+ 433130 => '湖南省湘西土家族苗族自治州龙山县',
+ 440000 => '广东省',
+ 440100 => '广东省广州市',
+ 440101 => '广东省广州市市辖区',
+ 440102 => '广东省广州市东山区',
+ 440103 => '广东省广州市荔湾区',
+ 440104 => '广东省广州市越秀区',
+ 440105 => '广东省广州市海珠区',
+ 440106 => '广东省广州市天河区',
+ 440107 => '广东省广州市芳村区',
+ 440111 => '广东省广州市白云区',
+ 440112 => '广东省广州市黄埔区',
+ 440181 => '广东省广州市番禺市',
+ 440182 => '广东省广州市花都市',
+ 440183 => '广东省广州市增城市',
+ 440184 => '广东省广州市从化市',
+ 440200 => '广东省韶关市',
+ 440201 => '广东省韶关市市辖区',
+ 440202 => '广东省韶关市北江区',
+ 440203 => '广东省韶关市武江区',
+ 440204 => '广东省韶关市浈江区',
+ 440221 => '广东省韶关市曲江县',
+ 440222 => '广东省韶关市始兴县',
+ 440224 => '广东省韶关市仁化县',
+ 440229 => '广东省韶关市翁源县',
+ 440232 => '广东省韶关市乳源瑶族自治县',
+ 440233 => '广东省韶关市新丰县',
+ 440281 => '广东省韶关市乐昌市',
+ 440282 => '广东省韶关市南雄市',
+ 440300 => '广东省深圳市',
+ 440301 => '广东省深圳市市辖区',
+ 440303 => '广东省深圳市罗湖区',
+ 440304 => '广东省深圳市福田区',
+ 440305 => '广东省深圳市南山区',
+ 440306 => '广东省深圳市宝安区',
+ 440307 => '广东省深圳市龙岗区',
+ 440308 => '广东省深圳市盐田区',
+ 440400 => '广东省珠海市',
+ 440401 => '广东省珠海市市辖区',
+ 440402 => '广东省珠海市香洲区',
+ 440421 => '广东省珠海市斗门县',
+ 440500 => '广东省汕头市',
+ 440501 => '广东省汕头市市辖区',
+ 440506 => '广东省汕头市达濠区',
+ 440507 => '广东省汕头市龙湖区',
+ 440508 => '广东省汕头市金园区',
+ 440509 => '广东省汕头市升平区',
+ 440510 => '广东省汕头市河浦区',
+ 440523 => '广东省汕头市南澳县',
+ 440582 => '广东省汕头市潮阳市',
+ 440583 => '广东省汕头市澄海市',
+ 440600 => '广东省佛山市',
+ 440601 => '广东省佛山市市辖区',
+ 440602 => '广东省佛山市城区',
+ 440603 => '广东省佛山市石湾区',
+ 440681 => '广东省佛山市顺德市',
+ 440682 => '广东省佛山市南海市',
+ 440683 => '广东省佛山市三水市',
+ 440684 => '广东省佛山市高明市',
+ 440700 => '广东省江门市',
+ 440701 => '广东省江门市市辖区',
+ 440703 => '广东省江门市蓬江区',
+ 440704 => '广东省江门市江海区',
+ 440781 => '广东省江门市台山市',
+ 440782 => '广东省江门市新会市',
+ 440783 => '广东省江门市开平市',
+ 440784 => '广东省江门市鹤山市',
+ 440785 => '广东省江门市恩平市',
+ 440800 => '广东省湛江市',
+ 440801 => '广东省湛江市市辖区',
+ 440802 => '广东省湛江市赤坎区',
+ 440803 => '广东省湛江市霞山区',
+ 440804 => '广东省湛江市坡头区',
+ 440811 => '广东省湛江市麻章区',
+ 440823 => '广东省湛江市遂溪县',
+ 440825 => '广东省湛江市徐闻县',
+ 440881 => '广东省湛江市廉江市',
+ 440882 => '广东省湛江市雷州市',
+ 440883 => '广东省湛江市吴川市',
+ 440900 => '广东省茂名市',
+ 440901 => '广东省茂名市市辖区',
+ 440902 => '广东省茂名市茂南区',
+ 440923 => '广东省茂名市电白县',
+ 440981 => '广东省茂名市高州市',
+ 440982 => '广东省茂名市化州市',
+ 440983 => '广东省茂名市信宜市',
+ 441200 => '广东省肇庆市',
+ 441201 => '广东省肇庆市市辖区',
+ 441202 => '广东省肇庆市端州区',
+ 441203 => '广东省肇庆市鼎湖区',
+ 441223 => '广东省肇庆市广宁县',
+ 441224 => '广东省肇庆市怀集县',
+ 441225 => '广东省肇庆市封开县',
+ 441226 => '广东省肇庆市德庆县',
+ 441283 => '广东省肇庆市高要市',
+ 441284 => '广东省肇庆市四会市',
+ 441300 => '广东省惠州市',
+ 441301 => '广东省惠州市市辖区',
+ 441302 => '广东省惠州市惠城区',
+ 441322 => '广东省惠州市博罗县',
+ 441323 => '广东省惠州市惠东县',
+ 441324 => '广东省惠州市龙门县',
+ 441381 => '广东省惠州市惠阳市',
+ 441400 => '广东省梅州市',
+ 441401 => '广东省梅州市市辖区',
+ 441402 => '广东省梅州市梅江区',
+ 441421 => '广东省梅州市梅县',
+ 441422 => '广东省梅州市大埔县',
+ 441423 => '广东省梅州市丰顺县',
+ 441424 => '广东省梅州市五华县',
+ 441426 => '广东省梅州市平远县',
+ 441427 => '广东省梅州市蕉岭县',
+ 441481 => '广东省梅州市兴宁市',
+ 441500 => '广东省汕尾市',
+ 441501 => '广东省汕尾市市辖区',
+ 441502 => '广东省汕尾市城区',
+ 441521 => '广东省汕尾市海丰县',
+ 441523 => '广东省汕尾市陆河县',
+ 441581 => '广东省汕尾市陆丰市',
+ 441600 => '广东省河源市',
+ 441601 => '广东省河源市市辖区',
+ 441602 => '广东省河源市源城区',
+ 441621 => '广东省河源市紫金县',
+ 441622 => '广东省河源市龙川县',
+ 441623 => '广东省河源市连平县',
+ 441624 => '广东省河源市和平县',
+ 441625 => '广东省河源市东源县',
+ 441700 => '广东省阳江市',
+ 441701 => '广东省阳江市市辖区',
+ 441702 => '广东省阳江市江城区',
+ 441721 => '广东省阳江市阳西县',
+ 441723 => '广东省阳江市阳东县',
+ 441781 => '广东省阳江市阳春市',
+ 441800 => '广东省清远市',
+ 441801 => '广东省清远市市辖区',
+ 441802 => '广东省清远市清城区',
+ 441821 => '广东省清远市佛冈县',
+ 441823 => '广东省清远市阳山县',
+ 441825 => '广东省清远市连山壮族瑶族自治县',
+ 441826 => '广东省清远市连南瑶族自治县',
+ 441827 => '广东省清远市清新县',
+ 441881 => '广东省清远市英德市',
+ 441882 => '广东省清远市连州市',
+ 441900 => '广东省东莞市',
+ 441901 => '广东省东莞市市辖区',
+ 442000 => '广东省中山市',
+ 442001 => '广东省中山市市辖区',
+ 445100 => '广东省潮州市',
+ 445101 => '广东省潮州市市辖区',
+ 445102 => '广东省潮州市湘桥区',
+ 445121 => '广东省潮州市潮安县',
+ 445122 => '广东省潮州市饶平县',
+ 445200 => '广东省揭阳市',
+ 445201 => '广东省揭阳市市辖区',
+ 445202 => '广东省揭阳市榕城区',
+ 445221 => '广东省揭阳市揭东县',
+ 445222 => '广东省揭阳市揭西县',
+ 445224 => '广东省揭阳市惠来县',
+ 445281 => '广东省揭阳市普宁市',
+ 445300 => '广东省云浮市',
+ 445301 => '广东省云浮市市辖区',
+ 445302 => '广东省云浮市云城区',
+ 445321 => '广东省云浮市新兴县',
+ 445322 => '广东省云浮市郁南县',
+ 445323 => '广东省云浮市云安县',
+ 445381 => '广东省云浮市罗定市',
+ 450000 => '广西壮族自治区',
+ 450100 => '广西壮族自治区南宁市',
+ 450101 => '广西壮族自治区南宁市市辖区',
+ 450102 => '广西壮族自治区南宁市兴宁区',
+ 450103 => '广西壮族自治区南宁市新城区',
+ 450104 => '广西壮族自治区南宁市城北区',
+ 450105 => '广西壮族自治区南宁市江南区',
+ 450106 => '广西壮族自治区南宁市永新区',
+ 450111 => '广西壮族自治区南宁市市郊区',
+ 450121 => '广西壮族自治区南宁市邕宁县',
+ 450122 => '广西壮族自治区南宁市武鸣县',
+ 450200 => '广西壮族自治区柳州市',
+ 450201 => '广西壮族自治区柳州市市辖区',
+ 450202 => '广西壮族自治区柳州市城中区',
+ 450203 => '广西壮族自治区柳州市鱼峰区',
+ 450204 => '广西壮族自治区柳州市柳南区',
+ 450205 => '广西壮族自治区柳州市柳北区',
+ 450211 => '广西壮族自治区柳州市市郊区',
+ 450221 => '广西壮族自治区柳州市柳江县',
+ 450222 => '广西壮族自治区柳州市柳城县',
+ 450300 => '广西壮族自治区桂林市',
+ 450301 => '广西壮族自治区桂林市市辖区',
+ 450302 => '广西壮族自治区桂林市秀峰区',
+ 450303 => '广西壮族自治区桂林市叠彩区',
+ 450304 => '广西壮族自治区桂林市象山区',
+ 450305 => '广西壮族自治区桂林市七星区',
+ 450311 => '广西壮族自治区桂林市雁山区',
+ 450321 => '广西壮族自治区桂林市阳朔县',
+ 450322 => '广西壮族自治区桂林市临桂县',
+ 450323 => '广西壮族自治区桂林市灵川县',
+ 450324 => '广西壮族自治区桂林市全州县',
+ 450325 => '广西壮族自治区桂林市兴安县',
+ 450326 => '广西壮族自治区桂林市永福县',
+ 450327 => '广西壮族自治区桂林市灌阳县',
+ 450328 => '广西壮族自治区桂林市龙胜各族自治县',
+ 450329 => '广西壮族自治区桂林市资源县',
+ 450330 => '广西壮族自治区桂林市平乐县',
+ 450331 => '广西壮族自治区桂林市荔浦县',
+ 450332 => '广西壮族自治区桂林市恭城瑶族自治县',
+ 450400 => '广西壮族自治区梧州市',
+ 450401 => '广西壮族自治区梧州市市辖区',
+ 450403 => '广西壮族自治区梧州市万秀区',
+ 450404 => '广西壮族自治区梧州市蝶山区',
+ 450411 => '广西壮族自治区梧州市市郊区',
+ 450421 => '广西壮族自治区梧州市苍梧县',
+ 450422 => '广西壮族自治区梧州市藤县',
+ 450423 => '广西壮族自治区梧州市蒙山县',
+ 450481 => '广西壮族自治区梧州市岑溪市',
+ 450500 => '广西壮族自治区北海市',
+ 450501 => '广西壮族自治区北海市市辖区',
+ 450502 => '广西壮族自治区北海市海城区',
+ 450503 => '广西壮族自治区北海市银海区',
+ 450512 => '广西壮族自治区北海市铁山港区',
+ 450521 => '广西壮族自治区北海市合浦县',
+ 450600 => '广西壮族自治区防城港市',
+ 450601 => '广西壮族自治区防城港市市辖区',
+ 450602 => '广西壮族自治区防城港市港口区',
+ 450603 => '广西壮族自治区防城港市防城区',
+ 450621 => '广西壮族自治区防城港市上思县',
+ 450681 => '广西壮族自治区防城港市东兴市',
+ 450700 => '广西壮族自治区钦州市',
+ 450701 => '广西壮族自治区钦州市市辖区',
+ 450702 => '广西壮族自治区钦州市钦南区',
+ 450703 => '广西壮族自治区钦州市钦北区',
+ 450721 => '广西壮族自治区钦州市灵山县',
+ 450722 => '广西壮族自治区钦州市浦北县',
+ 450800 => '广西壮族自治区贵港市',
+ 450801 => '广西壮族自治区贵港市市辖区',
+ 450802 => '广西壮族自治区贵港市港北区',
+ 450803 => '广西壮族自治区贵港市港南区',
+ 450821 => '广西壮族自治区贵港市平南县',
+ 450881 => '广西壮族自治区贵港市桂平市',
+ 450900 => '广西壮族自治区玉林市',
+ 450901 => '广西壮族自治区玉林市市辖区',
+ 450902 => '广西壮族自治区玉林市玉州区',
+ 450921 => '广西壮族自治区玉林市容县',
+ 450922 => '广西壮族自治区玉林市陆川县',
+ 450923 => '广西壮族自治区玉林市博白县',
+ 450924 => '广西壮族自治区玉林市兴业县',
+ 450981 => '广西壮族自治区玉林市北流市',
+ 452100 => '广西壮族自治区南宁地区',
+ 452101 => '广西壮族自治区南宁地区凭祥市',
+ 452122 => '广西壮族自治区南宁地区横县',
+ 452123 => '广西壮族自治区南宁地区宾阳县',
+ 452124 => '广西壮族自治区南宁地区上林县',
+ 452126 => '广西壮族自治区南宁地区隆安县',
+ 452127 => '广西壮族自治区南宁地区马山县',
+ 452128 => '广西壮族自治区南宁地区扶绥县',
+ 452129 => '广西壮族自治区南宁地区崇左县',
+ 452130 => '广西壮族自治区南宁地区大新县',
+ 452131 => '广西壮族自治区南宁地区天等县',
+ 452132 => '广西壮族自治区南宁地区宁明县',
+ 452133 => '广西壮族自治区南宁地区龙州县',
+ 452200 => '广西壮族自治区柳州地区',
+ 452201 => '广西壮族自治区柳州地区合山市',
+ 452223 => '广西壮族自治区柳州地区鹿寨县',
+ 452224 => '广西壮族自治区柳州地区象州县',
+ 452225 => '广西壮族自治区柳州地区武宣县',
+ 452226 => '广西壮族自治区柳州地区来宾县',
+ 452227 => '广西壮族自治区柳州地区融安县',
+ 452228 => '广西壮族自治区柳州地区三江侗族自治县',
+ 452229 => '广西壮族自治区柳州地区融水苗族自治县',
+ 452230 => '广西壮族自治区柳州地区金秀瑶族自治县',
+ 452231 => '广西壮族自治区柳州地区忻城县',
+ 452400 => '广西壮族自治区贺州地区',
+ 452402 => '广西壮族自治区贺州地区贺州市',
+ 452424 => '广西壮族自治区贺州地区昭平县',
+ 452427 => '广西壮族自治区贺州地区钟山县',
+ 452428 => '广西壮族自治区贺州地区富川瑶族自治县',
+ 452600 => '广西壮族自治区百色地区',
+ 452601 => '广西壮族自治区百色地区百色市',
+ 452622 => '广西壮族自治区百色地区田阳县',
+ 452623 => '广西壮族自治区百色地区田东县',
+ 452624 => '广西壮族自治区百色地区平果县',
+ 452625 => '广西壮族自治区百色地区德保县',
+ 452626 => '广西壮族自治区百色地区靖西县',
+ 452627 => '广西壮族自治区百色地区那坡县',
+ 452628 => '广西壮族自治区百色地区凌云县',
+ 452629 => '广西壮族自治区百色地区乐业县',
+ 452630 => '广西壮族自治区百色地区田林县',
+ 452631 => '广西壮族自治区百色地区隆林各族自治县',
+ 452632 => '广西壮族自治区百色地区西林县',
+ 452700 => '广西壮族自治区河池地区',
+ 452701 => '广西壮族自治区河池地区河池市',
+ 452702 => '广西壮族自治区河池地区宜州市',
+ 452723 => '广西壮族自治区河池地区罗城仫佬族自治县',
+ 452724 => '广西壮族自治区河池地区环江毛南族自治县',
+ 452725 => '广西壮族自治区河池地区南丹县',
+ 452726 => '广西壮族自治区河池地区天峨县',
+ 452727 => '广西壮族自治区河池地区凤山县',
+ 452728 => '广西壮族自治区河池地区东兰县',
+ 452729 => '广西壮族自治区河池地区巴马瑶族自治县',
+ 452730 => '广西壮族自治区河池地区都安瑶族自治县',
+ 452731 => '广西壮族自治区河池地区大化瑶族自治县',
+ 460000 => '海南省',
+ 460001 => '海南省三亚市通什市',
+ 460002 => '海南省三亚市琼海市',
+ 460003 => '海南省三亚市儋州市',
+ 460004 => '海南省三亚市琼山市',
+ 460005 => '海南省三亚市文昌市',
+ 460006 => '海南省三亚市万宁市',
+ 460007 => '海南省三亚市东方市',
+ 460025 => '海南省三亚市定安县',
+ 460026 => '海南省三亚市屯昌县',
+ 460027 => '海南省三亚市澄迈县',
+ 460028 => '海南省三亚市临高县',
+ 460030 => '海南省三亚市白沙黎族自治县',
+ 460031 => '海南省三亚市昌江黎族自治县',
+ 460033 => '海南省三亚市乐东黎族自治县',
+ 460034 => '海南省三亚市陵水黎族自治县',
+ 460035 => '海南省三亚市保亭黎族苗族自治县',
+ 460036 => '海南省三亚市琼中黎族苗族自治县',
+ 460037 => '海南省西沙群岛',
+ 460038 => '海南省南沙群岛',
+ 460039 => '海南省中沙群岛的岛礁及其海域',
+ 460100 => '海南省海口市',
+ 460101 => '海南省海口市市辖区',
+ 460102 => '海南省海口市振东区',
+ 460103 => '海南省海口市新华区',
+ 460104 => '海南省海口市秀英区',
+ 460200 => '海南省三亚市',
+ 460201 => '海南省三亚市市辖区',
+ 500000 => '重庆市',
+ 500100 => '重庆市市辖区',
+ 500101 => '重庆市万州区',
+ 500102 => '重庆市涪陵区',
+ 500103 => '重庆市渝中区',
+ 500104 => '重庆市大渡口区',
+ 500105 => '重庆市江北区',
+ 500106 => '重庆市沙坪坝区',
+ 500107 => '重庆市九龙坡区',
+ 500108 => '重庆市南岸区',
+ 500109 => '重庆市北碚区',
+ 500110 => '重庆市万盛区',
+ 500111 => '重庆市双桥区',
+ 500112 => '重庆市渝北区',
+ 500113 => '重庆市巴南区',
+ 500200 => '重庆市县',
+ 500221 => '重庆市长寿县',
+ 500222 => '重庆市綦江县',
+ 500223 => '重庆市潼南县',
+ 500224 => '重庆市铜梁县',
+ 500225 => '重庆市大足县',
+ 500226 => '重庆市荣昌县',
+ 500227 => '重庆市璧山县',
+ 500228 => '重庆市梁平县',
+ 500229 => '重庆市城口县',
+ 500230 => '重庆市丰都县',
+ 500231 => '重庆市垫江县',
+ 500232 => '重庆市武隆县',
+ 500233 => '重庆市忠县',
+ 500234 => '重庆市开县',
+ 500235 => '重庆市云阳县',
+ 500236 => '重庆市奉节县',
+ 500237 => '重庆市巫山县',
+ 500238 => '重庆市巫溪县',
+ 500239 => '重庆市黔江土家族苗族自治县',
+ 500240 => '重庆市石柱土家族自治县',
+ 500241 => '重庆市秀山土家族苗族自治县',
+ 500242 => '重庆市酉阳土家族苗族自治县',
+ 500243 => '重庆市彭水苗族土家族自治县',
+ 500300 => '重庆市',
+ 500381 => '重庆市江津市',
+ 500382 => '重庆市合川市',
+ 500383 => '重庆市永川市',
+ 500384 => '重庆市南川市',
+ 510000 => '四川省',
+ 510100 => '四川省成都市',
+ 510101 => '四川省成都市市辖区',
+ 510104 => '四川省成都市锦江区',
+ 510105 => '四川省成都市青羊区',
+ 510106 => '四川省成都市金牛区',
+ 510107 => '四川省成都市武侯区',
+ 510108 => '四川省成都市成华区',
+ 510112 => '四川省成都市龙泉驿区',
+ 510113 => '四川省成都市青白江区',
+ 510121 => '四川省成都市金堂县',
+ 510122 => '四川省成都市双流县',
+ 510123 => '四川省成都市温江县',
+ 510124 => '四川省成都市郫县',
+ 510125 => '四川省成都市新都县',
+ 510129 => '四川省成都市大邑县',
+ 510131 => '四川省成都市蒲江县',
+ 510132 => '四川省成都市新津县',
+ 510181 => '四川省成都市都江堰市',
+ 510182 => '四川省成都市彭州市',
+ 510183 => '四川省成都市邛崃市',
+ 510184 => '四川省成都市崇州市',
+ 510300 => '四川省自贡市',
+ 510301 => '四川省自贡市市辖区',
+ 510302 => '四川省自贡市自流井区',
+ 510303 => '四川省自贡市贡井区',
+ 510304 => '四川省自贡市大安区',
+ 510311 => '四川省自贡市沿滩区',
+ 510321 => '四川省自贡市荣县',
+ 510322 => '四川省自贡市富顺县',
+ 510400 => '四川省攀枝花市',
+ 510401 => '四川省攀枝花市市辖区',
+ 510402 => '四川省攀枝花市东区',
+ 510403 => '四川省攀枝花市西区',
+ 510411 => '四川省攀枝花市仁和区',
+ 510421 => '四川省攀枝花市米易县',
+ 510422 => '四川省攀枝花市盐边县',
+ 510500 => '四川省泸州市',
+ 510501 => '四川省泸州市市辖区',
+ 510502 => '四川省泸州市江阳区',
+ 510503 => '四川省泸州市纳溪区',
+ 510504 => '四川省泸州市龙马潭区',
+ 510521 => '四川省泸州市泸县',
+ 510522 => '四川省泸州市合江县',
+ 510524 => '四川省泸州市叙永县',
+ 510525 => '四川省泸州市古蔺县',
+ 510600 => '四川省德阳市',
+ 510601 => '四川省德阳市市辖区',
+ 510603 => '四川省德阳市旌阳区',
+ 510623 => '四川省德阳市中江县',
+ 510626 => '四川省德阳市罗江县',
+ 510681 => '四川省德阳市广汉市',
+ 510682 => '四川省德阳市什邡市',
+ 510683 => '四川省德阳市绵竹市',
+ 510700 => '四川省绵阳市',
+ 510701 => '四川省绵阳市市辖区',
+ 510703 => '四川省绵阳市涪城区',
+ 510704 => '四川省绵阳市游仙区',
+ 510722 => '四川省绵阳市三台县',
+ 510723 => '四川省绵阳市盐亭县',
+ 510724 => '四川省绵阳市安县',
+ 510725 => '四川省绵阳市梓潼县',
+ 510726 => '四川省绵阳市北川县',
+ 510727 => '四川省绵阳市平武县',
+ 510781 => '四川省绵阳市江油市',
+ 510800 => '四川省广元市',
+ 510801 => '四川省广元市市辖区',
+ 510802 => '四川省广元市市中区',
+ 510811 => '四川省广元市元坝区',
+ 510812 => '四川省广元市朝天区',
+ 510821 => '四川省广元市旺苍县',
+ 510822 => '四川省广元市青川县',
+ 510823 => '四川省广元市剑阁县',
+ 510824 => '四川省广元市苍溪县',
+ 510900 => '四川省遂宁市',
+ 510901 => '四川省遂宁市市辖区',
+ 510902 => '四川省遂宁市市中区',
+ 510921 => '四川省遂宁市蓬溪县',
+ 510922 => '四川省遂宁市射洪县',
+ 510923 => '四川省遂宁市大英县',
+ 511000 => '四川省内江市',
+ 511001 => '四川省内江市市辖区',
+ 511002 => '四川省内江市市中区',
+ 511011 => '四川省内江市东兴区',
+ 511024 => '四川省内江市威远县',
+ 511025 => '四川省内江市资中县',
+ 511028 => '四川省内江市隆昌县',
+ 511100 => '四川省乐山市',
+ 511101 => '四川省乐山市市辖区',
+ 511102 => '四川省乐山市市中区',
+ 511111 => '四川省乐山市沙湾区',
+ 511112 => '四川省乐山市五通桥区',
+ 511113 => '四川省乐山市金口河区',
+ 511123 => '四川省乐山市犍为县',
+ 511124 => '四川省乐山市井研县',
+ 511126 => '四川省乐山市夹江县',
+ 511129 => '四川省乐山市沐川县',
+ 511132 => '四川省乐山市峨边彝族自治县',
+ 511133 => '四川省乐山市马边彝族自治县',
+ 511181 => '四川省乐山市峨眉山市',
+ 511300 => '四川省南充市',
+ 511301 => '四川省南充市市辖区',
+ 511302 => '四川省南充市顺庆区',
+ 511303 => '四川省南充市高坪区',
+ 511304 => '四川省南充市嘉陵区',
+ 511321 => '四川省南充市南部县',
+ 511322 => '四川省南充市营山县',
+ 511323 => '四川省南充市蓬安县',
+ 511324 => '四川省南充市仪陇县',
+ 511325 => '四川省南充市西充县',
+ 511381 => '四川省南充市阆中市',
+ 511500 => '四川省宜宾市',
+ 511501 => '四川省宜宾市市辖区',
+ 511502 => '四川省宜宾市翠屏区',
+ 511521 => '四川省宜宾市宜宾县',
+ 511522 => '四川省宜宾市南溪县',
+ 511523 => '四川省宜宾市江安县',
+ 511524 => '四川省宜宾市长宁县',
+ 511525 => '四川省宜宾市高县',
+ 511526 => '四川省宜宾市珙县',
+ 511527 => '四川省宜宾市筠连县',
+ 511528 => '四川省宜宾市兴文县',
+ 511529 => '四川省宜宾市屏山县',
+ 511600 => '四川省广安市',
+ 511601 => '四川省广安市市辖区',
+ 511602 => '四川省广安市广安区',
+ 511621 => '四川省广安市岳池县',
+ 511622 => '四川省广安市武胜县',
+ 511623 => '四川省广安市邻水县',
+ 511681 => '四川省广安市华蓥市',
+ 513000 => '四川省达川地区',
+ 513001 => '四川省达川地区达川市',
+ 513002 => '四川省达川地区万源市',
+ 513021 => '四川省达川地区达县',
+ 513022 => '四川省达川地区宣汉县',
+ 513023 => '四川省达川地区开江县',
+ 513029 => '四川省达川地区大竹县',
+ 513030 => '四川省达川地区渠县',
+ 513100 => '四川省雅安地区',
+ 513101 => '四川省雅安地区雅安市',
+ 513122 => '四川省雅安地区名山县',
+ 513123 => '四川省雅安地区荥经县',
+ 513124 => '四川省雅安地区汉源县',
+ 513125 => '四川省雅安地区石棉县',
+ 513126 => '四川省雅安地区天全县',
+ 513127 => '四川省雅安地区芦山县',
+ 513128 => '四川省雅安地区宝兴县',
+ 513200 => '四川省阿坝藏族羌族自治州',
+ 513221 => '四川省阿坝藏族羌族自治州汶川县',
+ 513222 => '四川省阿坝藏族羌族自治州理县',
+ 513223 => '四川省阿坝藏族羌族自治州茂县',
+ 513224 => '四川省阿坝藏族羌族自治州松潘县',
+ 513225 => '四川省阿坝藏族羌族自治州九寨沟县',
+ 513226 => '四川省阿坝藏族羌族自治州金川县',
+ 513227 => '四川省阿坝藏族羌族自治州小金县',
+ 513228 => '四川省阿坝藏族羌族自治州黑水县',
+ 513229 => '四川省阿坝藏族羌族自治州马尔康县',
+ 513230 => '四川省阿坝藏族羌族自治州壤塘县',
+ 513231 => '四川省阿坝藏族羌族自治州阿坝县',
+ 513232 => '四川省阿坝藏族羌族自治州若尔盖县',
+ 513233 => '四川省阿坝藏族羌族自治州红原县',
+ 513300 => '四川省甘孜藏族自治州',
+ 513321 => '四川省甘孜藏族自治州康定县',
+ 513322 => '四川省甘孜藏族自治州泸定县',
+ 513323 => '四川省甘孜藏族自治州丹巴县',
+ 513324 => '四川省甘孜藏族自治州九龙县',
+ 513325 => '四川省甘孜藏族自治州雅江县',
+ 513326 => '四川省甘孜藏族自治州道孚县',
+ 513327 => '四川省甘孜藏族自治州炉霍县',
+ 513328 => '四川省甘孜藏族自治州甘孜县',
+ 513329 => '四川省甘孜藏族自治州新龙县',
+ 513330 => '四川省甘孜藏族自治州德格县',
+ 513331 => '四川省甘孜藏族自治州白玉县',
+ 513332 => '四川省甘孜藏族自治州石渠县',
+ 513333 => '四川省甘孜藏族自治州色达县',
+ 513334 => '四川省甘孜藏族自治州理塘县',
+ 513335 => '四川省甘孜藏族自治州巴塘县',
+ 513336 => '四川省甘孜藏族自治州乡城县',
+ 513337 => '四川省甘孜藏族自治州稻城县',
+ 513338 => '四川省甘孜藏族自治州得荣县',
+ 513400 => '四川省凉山彝族自治州',
+ 513401 => '四川省凉山彝族自治州西昌市',
+ 513422 => '四川省凉山彝族自治州木里藏族自治县',
+ 513423 => '四川省凉山彝族自治州盐源县',
+ 513424 => '四川省凉山彝族自治州德昌县',
+ 513425 => '四川省凉山彝族自治州会理县',
+ 513426 => '四川省凉山彝族自治州会东县',
+ 513427 => '四川省凉山彝族自治州宁南县',
+ 513428 => '四川省凉山彝族自治州普格县',
+ 513429 => '四川省凉山彝族自治州布拖县',
+ 513430 => '四川省凉山彝族自治州金阳县',
+ 513431 => '四川省凉山彝族自治州昭觉县',
+ 513432 => '四川省凉山彝族自治州喜德县',
+ 513433 => '四川省凉山彝族自治州冕宁县',
+ 513434 => '四川省凉山彝族自治州越西县',
+ 513435 => '四川省凉山彝族自治州甘洛县',
+ 513436 => '四川省凉山彝族自治州美姑县',
+ 513437 => '四川省凉山彝族自治州雷波县',
+ 513700 => '四川省巴中地区',
+ 513701 => '四川省巴中地区巴中市',
+ 513721 => '四川省巴中地区通江县',
+ 513722 => '四川省巴中地区南江县',
+ 513723 => '四川省巴中地区平昌县',
+ 513800 => '四川省眉山地区',
+ 513821 => '四川省眉山地区眉山县',
+ 513822 => '四川省眉山地区仁寿县',
+ 513823 => '四川省眉山地区彭山县',
+ 513824 => '四川省眉山地区洪雅县',
+ 513825 => '四川省眉山地区丹棱县',
+ 513826 => '四川省眉山地区青神县',
+ 513900 => '四川省眉山地区资阳地区',
+ 513901 => '四川省眉山地区资阳市',
+ 513902 => '四川省眉山地区简阳市',
+ 513921 => '四川省眉山地区安岳县',
+ 513922 => '四川省眉山地区乐至县',
+ 520000 => '贵州省',
+ 520100 => '贵州省贵阳市',
+ 520101 => '贵州省贵阳市市辖区',
+ 520102 => '贵州省贵阳市南明区',
+ 520103 => '贵州省贵阳市云岩区',
+ 520111 => '贵州省贵阳市花溪区',
+ 520112 => '贵州省贵阳市乌当区',
+ 520113 => '贵州省贵阳市白云区',
+ 520121 => '贵州省贵阳市开阳县',
+ 520122 => '贵州省贵阳市息烽县',
+ 520123 => '贵州省贵阳市修文县',
+ 520181 => '贵州省贵阳市清镇市',
+ 520200 => '贵州省六盘水市',
+ 520201 => '贵州省六盘水市钟山区',
+ 520202 => '贵州省六盘水市盘县特区',
+ 520203 => '贵州省六盘水市六枝特区',
+ 520221 => '贵州省六盘水市水城县',
+ 520300 => '贵州省遵义市',
+ 520301 => '贵州省遵义市市辖区',
+ 520302 => '贵州省遵义市红花岗区',
+ 520321 => '贵州省遵义市遵义县',
+ 520322 => '贵州省遵义市桐梓县',
+ 520323 => '贵州省遵义市绥阳县',
+ 520324 => '贵州省遵义市正安县',
+ 520325 => '贵州省遵义市道真仡佬族苗族自治县',
+ 520326 => '贵州省遵义市务川仡佬族苗族自治县',
+ 520327 => '贵州省遵义市凤冈县',
+ 520328 => '贵州省遵义市湄潭县',
+ 520329 => '贵州省遵义市余庆县',
+ 520330 => '贵州省遵义市习水县',
+ 520381 => '贵州省遵义市赤水市',
+ 520382 => '贵州省遵义市仁怀市',
+ 522200 => '贵州省铜仁地区',
+ 522201 => '贵州省铜仁地区铜仁市',
+ 522222 => '贵州省铜仁地区江口县',
+ 522223 => '贵州省铜仁地区玉屏侗族自治县',
+ 522224 => '贵州省铜仁地区石阡县',
+ 522225 => '贵州省铜仁地区思南县',
+ 522226 => '贵州省铜仁地区印江土家族苗族自治县',
+ 522227 => '贵州省铜仁地区德江县',
+ 522228 => '贵州省铜仁地区沿河土家族自治县',
+ 522229 => '贵州省铜仁地区松桃苗族自治县',
+ 522230 => '贵州省铜仁地区万山特区',
+ 522300 => '贵州省黔西南布依族苗族自治州',
+ 522301 => '贵州省黔西南布依族苗族自治州兴义市',
+ 522322 => '贵州省黔西南布依族苗族自治州兴仁县',
+ 522323 => '贵州省黔西南布依族苗族自治州普安县',
+ 522324 => '贵州省黔西南布依族苗族自治州晴隆县',
+ 522325 => '贵州省黔西南布依族苗族自治州贞丰县',
+ 522326 => '贵州省黔西南布依族苗族自治州望谟县',
+ 522327 => '贵州省黔西南布依族苗族自治州册亨县',
+ 522328 => '贵州省黔西南布依族苗族自治州安龙县',
+ 522400 => '贵州省毕节地区',
+ 522401 => '贵州省毕节地区毕节市',
+ 522422 => '贵州省毕节地区大方县',
+ 522423 => '贵州省毕节地区黔西县',
+ 522424 => '贵州省毕节地区金沙县',
+ 522425 => '贵州省毕节地区织金县',
+ 522426 => '贵州省毕节地区纳雍县',
+ 522427 => '贵州省毕节地区威宁彝族回族苗族自治县',
+ 522428 => '贵州省毕节地区赫章县',
+ 522500 => '贵州省安顺地区',
+ 522501 => '贵州省安顺地区安顺市',
+ 522526 => '贵州省安顺地区平坝县',
+ 522527 => '贵州省安顺地区普定县',
+ 522528 => '贵州省安顺地区关岭布依族苗族自治县',
+ 522529 => '贵州省安顺地区镇宁布依族苗族自治县',
+ 522530 => '贵州省安顺地区紫云苗族布依族自治县',
+ 522600 => '贵州省黔东南苗族侗族自治州',
+ 522601 => '贵州省黔东南苗族侗族自治州凯里市',
+ 522622 => '贵州省黔东南苗族侗族自治州黄平县',
+ 522623 => '贵州省黔东南苗族侗族自治州施秉县',
+ 522624 => '贵州省黔东南苗族侗族自治州三穗县',
+ 522625 => '贵州省黔东南苗族侗族自治州镇远县',
+ 522626 => '贵州省黔东南苗族侗族自治州岑巩县',
+ 522627 => '贵州省黔东南苗族侗族自治州天柱县',
+ 522628 => '贵州省黔东南苗族侗族自治州锦屏县',
+ 522629 => '贵州省黔东南苗族侗族自治州剑河县',
+ 522630 => '贵州省黔东南苗族侗族自治州台江县',
+ 522631 => '贵州省黔东南苗族侗族自治州黎平县',
+ 522632 => '贵州省黔东南苗族侗族自治州榕江县',
+ 522633 => '贵州省黔东南苗族侗族自治州从江县',
+ 522634 => '贵州省黔东南苗族侗族自治州雷山县',
+ 522635 => '贵州省黔东南苗族侗族自治州麻江县',
+ 522636 => '贵州省黔东南苗族侗族自治州丹寨县',
+ 522700 => '贵州省黔南布依族苗族自治州',
+ 522701 => '贵州省黔南布依族苗族自治州都匀市',
+ 522702 => '贵州省黔南布依族苗族自治州福泉市',
+ 522722 => '贵州省黔南布依族苗族自治州荔波县',
+ 522723 => '贵州省黔南布依族苗族自治州贵定县',
+ 522725 => '贵州省黔南布依族苗族自治州瓮安县',
+ 522726 => '贵州省黔南布依族苗族自治州独山县',
+ 522727 => '贵州省黔南布依族苗族自治州平塘县',
+ 522728 => '贵州省黔南布依族苗族自治州罗甸县',
+ 522729 => '贵州省黔南布依族苗族自治州长顺县',
+ 522730 => '贵州省黔南布依族苗族自治州龙里县',
+ 522731 => '贵州省黔南布依族苗族自治州惠水县',
+ 522732 => '贵州省黔南布依族苗族自治州三都水族自治县',
+ 530000 => '云南省',
+ 530100 => '云南省昆明市',
+ 530101 => '云南省昆明市市辖区',
+ 530102 => '云南省昆明市五华区',
+ 530103 => '云南省昆明市盘龙区',
+ 530111 => '云南省昆明市官渡区',
+ 530112 => '云南省昆明市西山区',
+ 530113 => '云南省昆明市东川区',
+ 530121 => '云南省昆明市呈贡县',
+ 530122 => '云南省昆明市晋宁县',
+ 530124 => '云南省昆明市富民县',
+ 530125 => '云南省昆明市宜良县',
+ 530126 => '云南省昆明市石林彝族自治县',
+ 530127 => '云南省昆明市嵩明县',
+ 530128 => '云南省昆明市禄劝彝族苗族自治县',
+ 530129 => '云南省昆明市寻甸回族彝族自治县',
+ 530181 => '云南省昆明市安宁市',
+ 530300 => '云南省曲靖市',
+ 530301 => '云南省曲靖市市辖区',
+ 530302 => '云南省曲靖市麒麟区',
+ 530321 => '云南省曲靖市马龙县',
+ 530322 => '云南省曲靖市陆良县',
+ 530323 => '云南省曲靖市师宗县',
+ 530324 => '云南省曲靖市罗平县',
+ 530325 => '云南省曲靖市富源县',
+ 530326 => '云南省曲靖市会泽县',
+ 530328 => '云南省曲靖市沾益县',
+ 530381 => '云南省曲靖市宣威市',
+ 530400 => '云南省玉溪市',
+ 530401 => '云南省玉溪市市辖区',
+ 530402 => '云南省玉溪市红塔区',
+ 530421 => '云南省玉溪市江川县',
+ 530422 => '云南省玉溪市澄江县',
+ 530423 => '云南省玉溪市通海县',
+ 530424 => '云南省玉溪市华宁县',
+ 530425 => '云南省玉溪市易门县',
+ 530426 => '云南省玉溪市峨山彝族自治县',
+ 530427 => '云南省玉溪市新平彝族傣族自治县',
+ 530428 => '云南省玉溪市元江哈尼族彝族傣族自治县',
+ 532100 => '云南省昭通地区',
+ 532101 => '云南省昭通地区昭通市',
+ 532122 => '云南省昭通地区鲁甸县',
+ 532123 => '云南省昭通地区巧家县',
+ 532124 => '云南省昭通地区盐津县',
+ 532125 => '云南省昭通地区大关县',
+ 532126 => '云南省昭通地区永善县',
+ 532127 => '云南省昭通地区绥江县',
+ 532128 => '云南省昭通地区镇雄县',
+ 532129 => '云南省昭通地区彝良县',
+ 532130 => '云南省昭通地区威信县',
+ 532131 => '云南省昭通地区水富县',
+ 532300 => '云南省楚雄彝族自治州',
+ 532301 => '云南省楚雄彝族自治州楚雄市',
+ 532322 => '云南省楚雄彝族自治州双柏县',
+ 532323 => '云南省楚雄彝族自治州牟定县',
+ 532324 => '云南省楚雄彝族自治州南华县',
+ 532325 => '云南省楚雄彝族自治州姚安县',
+ 532326 => '云南省楚雄彝族自治州大姚县',
+ 532327 => '云南省楚雄彝族自治州永仁县',
+ 532328 => '云南省楚雄彝族自治州元谋县',
+ 532329 => '云南省楚雄彝族自治州武定县',
+ 532331 => '云南省楚雄彝族自治州禄丰县',
+ 532500 => '云南省红河哈尼族彝族自治州',
+ 532501 => '云南省红河哈尼族彝族自治州个旧市',
+ 532502 => '云南省红河哈尼族彝族自治州开远市',
+ 532522 => '云南省红河哈尼族彝族自治州蒙自县',
+ 532523 => '云南省红河哈尼族彝族自治州屏边苗族自治县',
+ 532524 => '云南省红河哈尼族彝族自治州建水县',
+ 532525 => '云南省红河哈尼族彝族自治州石屏县',
+ 532526 => '云南省红河哈尼族彝族自治州弥勒县',
+ 532527 => '云南省红河哈尼族彝族自治州泸西县',
+ 532528 => '云南省红河哈尼族彝族自治州元阳县',
+ 532529 => '云南省红河哈尼族彝族自治州红河县',
+ 532530 => '云南省红河哈尼族彝族自治州金平苗族瑶族傣族自治县',
+ 532531 => '云南省红河哈尼族彝族自治州绿春县',
+ 532532 => '云南省红河哈尼族彝族自治州河口瑶族自治县',
+ 532600 => '云南省文山壮族苗族自治州',
+ 532621 => '云南省文山壮族苗族自治州文山县',
+ 532622 => '云南省文山壮族苗族自治州砚山县',
+ 532623 => '云南省文山壮族苗族自治州西畴县',
+ 532624 => '云南省文山壮族苗族自治州麻栗坡县',
+ 532625 => '云南省文山壮族苗族自治州马关县',
+ 532626 => '云南省文山壮族苗族自治州丘北县',
+ 532627 => '云南省文山壮族苗族自治州广南县',
+ 532628 => '云南省文山壮族苗族自治州富宁县',
+ 532700 => '云南省思茅地区',
+ 532701 => '云南省思茅地区思茅市',
+ 532722 => '云南省思茅地区普洱哈尼族彝族自治县',
+ 532723 => '云南省思茅地区墨江哈尼族自治县',
+ 532724 => '云南省思茅地区景东彝族自治县',
+ 532725 => '云南省思茅地区景谷傣族彝族自治县',
+ 532726 => '云南省思茅地区镇沅彝族哈尼族拉祜族自治县',
+ 532727 => '云南省思茅地区江城哈尼族彝族自治县',
+ 532728 => '云南省思茅地区孟连傣族拉祜族佤族自治县',
+ 532729 => '云南省思茅地区澜沧拉祜族自治县',
+ 532730 => '云南省思茅地区西盟佤族自治县',
+ 532800 => '云南省西双版纳傣族自治州',
+ 532801 => '云南省西双版纳傣族自治州景洪市',
+ 532822 => '云南省西双版纳傣族自治州勐海县',
+ 532823 => '云南省西双版纳傣族自治州勐腊县',
+ 532900 => '云南省大理白族自治州',
+ 532901 => '云南省大理白族自治州大理市',
+ 532922 => '云南省大理白族自治州漾濞彝族自治县',
+ 532923 => '云南省大理白族自治州祥云县',
+ 532924 => '云南省大理白族自治州宾川县',
+ 532925 => '云南省大理白族自治州弥渡县',
+ 532926 => '云南省大理白族自治州南涧彝族自治县',
+ 532927 => '云南省大理白族自治州巍山彝族回族自治县',
+ 532928 => '云南省大理白族自治州永平县',
+ 532929 => '云南省大理白族自治州云龙县',
+ 532930 => '云南省大理白族自治州洱源县',
+ 532931 => '云南省大理白族自治州剑川县',
+ 532932 => '云南省大理白族自治州鹤庆县',
+ 533000 => '云南省保山地区',
+ 533001 => '云南省保山地区保山市',
+ 533022 => '云南省保山地区施甸县',
+ 533023 => '云南省保山地区腾冲县',
+ 533024 => '云南省保山地区龙陵县',
+ 533025 => '云南省保山地区昌宁县',
+ 533100 => '云南省德宏傣族景颇族自治州',
+ 533101 => '云南省德宏傣族景颇族自治州畹町市',
+ 533102 => '云南省德宏傣族景颇族自治州瑞丽市',
+ 533103 => '云南省德宏傣族景颇族自治州潞西市',
+ 533122 => '云南省德宏傣族景颇族自治州梁河县',
+ 533123 => '云南省德宏傣族景颇族自治州盈江县',
+ 533124 => '云南省德宏傣族景颇族自治州陇川县',
+ 533200 => '云南省丽江地区',
+ 533221 => '云南省丽江地区丽江纳西族自治县',
+ 533222 => '云南省丽江地区永胜县',
+ 533223 => '云南省丽江地区华坪县',
+ 533224 => '云南省丽江地区宁蒗彝族自治县',
+ 533300 => '云南省怒江傈僳族自治州',
+ 533321 => '云南省怒江傈僳族自治州泸水县',
+ 533323 => '云南省怒江傈僳族自治州福贡县',
+ 533324 => '云南省怒江傈僳族自治州贡山独龙族怒族自治县',
+ 533325 => '云南省怒江傈僳族自治州兰坪白族普米族自治县',
+ 533400 => '云南省迪庆藏族自治州',
+ 533421 => '云南省迪庆藏族自治州中甸县',
+ 533422 => '云南省迪庆藏族自治州德钦县',
+ 533423 => '云南省迪庆藏族自治州维西傈僳族自治县',
+ 533500 => '云南省临沧地区',
+ 533521 => '云南省临沧地区临沧县',
+ 533522 => '云南省临沧地区凤庆县',
+ 533523 => '云南省临沧地区云县',
+ 533524 => '云南省临沧地区永德县',
+ 533525 => '云南省临沧地区镇康县',
+ 533526 => '云南省临沧地区双江拉祜族佤族布朗族傣族自治县',
+ 533527 => '云南省临沧地区耿马傣族佤族自治县',
+ 533528 => '云南省临沧地区沧源佤族自治县',
+ 540000 => '西藏自治区',
+ 540100 => '西藏自治区拉萨市',
+ 540101 => '西藏自治区拉萨市市辖区',
+ 540102 => '西藏自治区拉萨市城关区',
+ 540121 => '西藏自治区拉萨市林周县',
+ 540122 => '西藏自治区拉萨市当雄县',
+ 540123 => '西藏自治区拉萨市尼木县',
+ 540124 => '西藏自治区拉萨市曲水县',
+ 540125 => '西藏自治区拉萨市堆龙德庆县',
+ 540126 => '西藏自治区拉萨市达孜县',
+ 540127 => '西藏自治区拉萨市墨竹工卡县',
+ 542100 => '西藏自治区昌都地区',
+ 542121 => '西藏自治区昌都地区昌都县',
+ 542122 => '西藏自治区昌都地区江达县',
+ 542123 => '西藏自治区昌都地区贡觉县',
+ 542124 => '西藏自治区昌都地区类乌齐县',
+ 542125 => '西藏自治区昌都地区丁青县',
+ 542126 => '西藏自治区昌都地区察雅县',
+ 542127 => '西藏自治区昌都地区八宿县',
+ 542128 => '西藏自治区昌都地区左贡县',
+ 542129 => '西藏自治区昌都地区芒康县',
+ 542132 => '西藏自治区昌都地区洛隆县',
+ 542133 => '西藏自治区昌都地区边坝县',
+ 542134 => '西藏自治区昌都地区盐井县',
+ 542135 => '西藏自治区昌都地区碧土县',
+ 542136 => '西藏自治区昌都地区妥坝县',
+ 542137 => '西藏自治区昌都地区生达县',
+ 542200 => '西藏自治区山南地区',
+ 542221 => '西藏自治区山南地区乃东县',
+ 542222 => '西藏自治区山南地区扎囊县',
+ 542223 => '西藏自治区山南地区贡嘎县',
+ 542224 => '西藏自治区山南地区桑日县',
+ 542225 => '西藏自治区山南地区琼结县',
+ 542226 => '西藏自治区山南地区曲松县',
+ 542227 => '西藏自治区山南地区措美县',
+ 542228 => '西藏自治区山南地区洛扎县',
+ 542229 => '西藏自治区山南地区加查县',
+ 542231 => '西藏自治区山南地区隆子县',
+ 542232 => '西藏自治区山南地区错那县',
+ 542233 => '西藏自治区山南地区浪卡子县',
+ 542300 => '西藏自治区日喀则地区',
+ 542301 => '西藏自治区日喀则地区日喀则市',
+ 542322 => '西藏自治区日喀则地区南木林县',
+ 542323 => '西藏自治区日喀则地区江孜县',
+ 542324 => '西藏自治区日喀则地区定日县',
+ 542325 => '西藏自治区日喀则地区萨迦县',
+ 542326 => '西藏自治区日喀则地区拉孜县',
+ 542327 => '西藏自治区日喀则地区昂仁县',
+ 542328 => '西藏自治区日喀则地区谢通门县',
+ 542329 => '西藏自治区日喀则地区白朗县',
+ 542330 => '西藏自治区日喀则地区仁布县',
+ 542331 => '西藏自治区日喀则地区康马县',
+ 542332 => '西藏自治区日喀则地区定结县',
+ 542333 => '西藏自治区日喀则地区仲巴县',
+ 542334 => '西藏自治区日喀则地区亚东县',
+ 542335 => '西藏自治区日喀则地区吉隆县',
+ 542336 => '西藏自治区日喀则地区聂拉木县',
+ 542337 => '西藏自治区日喀则地区萨嘎县',
+ 542338 => '西藏自治区日喀则地区岗巴县',
+ 542400 => '西藏自治区那曲地区',
+ 542421 => '西藏自治区那曲地区那曲县',
+ 542422 => '西藏自治区那曲地区嘉黎县',
+ 542423 => '西藏自治区那曲地区比如县',
+ 542424 => '西藏自治区那曲地区聂荣县',
+ 542425 => '西藏自治区那曲地区安多县',
+ 542426 => '西藏自治区那曲地区申扎县',
+ 542427 => '西藏自治区那曲地区索县',
+ 542428 => '西藏自治区那曲地区班戈县',
+ 542429 => '西藏自治区那曲地区巴青县',
+ 542430 => '西藏自治区那曲地区尼玛县',
+ 542500 => '西藏自治区阿里地区',
+ 542521 => '西藏自治区阿里地区普兰县',
+ 542522 => '西藏自治区阿里地区札达县',
+ 542523 => '西藏自治区阿里地区噶尔县',
+ 542524 => '西藏自治区阿里地区日土县',
+ 542525 => '西藏自治区阿里地区革吉县',
+ 542526 => '西藏自治区阿里地区改则县',
+ 542527 => '西藏自治区阿里地区措勤县',
+ 542528 => '西藏自治区阿里地区隆格尔县',
+ 542600 => '西藏自治区林芝地区',
+ 542621 => '西藏自治区林芝地区林芝县',
+ 542622 => '西藏自治区林芝地区工布江达县',
+ 542623 => '西藏自治区林芝地区米林县',
+ 542624 => '西藏自治区林芝地区墨脱县',
+ 542625 => '西藏自治区林芝地区波密县',
+ 542626 => '西藏自治区林芝地区察隅县',
+ 542627 => '西藏自治区林芝地区朗县',
+ 610000 => '陕西省',
+ 610100 => '陕西省西安市',
+ 610101 => '陕西省西安市市辖区',
+ 610102 => '陕西省西安市新城区',
+ 610103 => '陕西省西安市碑林区',
+ 610104 => '陕西省西安市莲湖区',
+ 610111 => '陕西省西安市灞桥区',
+ 610112 => '陕西省西安市未央区',
+ 610113 => '陕西省西安市雁塔区',
+ 610114 => '陕西省西安市阎良区',
+ 610115 => '陕西省西安市临潼区',
+ 610121 => '陕西省西安市长安县',
+ 610122 => '陕西省西安市蓝田县',
+ 610124 => '陕西省西安市周至县',
+ 610125 => '陕西省西安市户县',
+ 610126 => '陕西省西安市高陵县',
+ 610200 => '陕西省铜川市',
+ 610201 => '陕西省铜川市市辖区',
+ 610202 => '陕西省铜川市城区',
+ 610203 => '陕西省铜川市郊区',
+ 610221 => '陕西省铜川市耀县',
+ 610222 => '陕西省铜川市宜君县',
+ 610300 => '陕西省宝鸡市',
+ 610301 => '陕西省宝鸡市市辖区',
+ 610302 => '陕西省宝鸡市渭滨区',
+ 610303 => '陕西省宝鸡市金台区',
+ 610321 => '陕西省宝鸡市宝鸡县',
+ 610322 => '陕西省宝鸡市凤翔县',
+ 610323 => '陕西省宝鸡市岐山县',
+ 610324 => '陕西省宝鸡市扶风县',
+ 610326 => '陕西省宝鸡市眉县',
+ 610327 => '陕西省宝鸡市陇县',
+ 610328 => '陕西省宝鸡市千阳县',
+ 610329 => '陕西省宝鸡市麟游县',
+ 610330 => '陕西省宝鸡市凤县',
+ 610331 => '陕西省宝鸡市太白县',
+ 610400 => '陕西省咸阳市',
+ 610401 => '陕西省咸阳市市辖区',
+ 610402 => '陕西省咸阳市秦都区',
+ 610403 => '陕西省咸阳市杨陵区',
+ 610404 => '陕西省咸阳市渭城区',
+ 610422 => '陕西省咸阳市三原县',
+ 610423 => '陕西省咸阳市泾阳县',
+ 610424 => '陕西省咸阳市乾县',
+ 610425 => '陕西省咸阳市礼泉县',
+ 610426 => '陕西省咸阳市永寿县',
+ 610427 => '陕西省咸阳市彬县',
+ 610428 => '陕西省咸阳市长武县',
+ 610429 => '陕西省咸阳市旬邑县',
+ 610430 => '陕西省咸阳市淳化县',
+ 610431 => '陕西省咸阳市武功县',
+ 610481 => '陕西省咸阳市兴平市',
+ 610500 => '陕西省渭南市',
+ 610501 => '陕西省渭南市市辖区',
+ 610502 => '陕西省渭南市临渭区',
+ 610521 => '陕西省渭南市华县',
+ 610522 => '陕西省渭南市潼关县',
+ 610523 => '陕西省渭南市大荔县',
+ 610524 => '陕西省渭南市合阳县',
+ 610525 => '陕西省渭南市澄城县',
+ 610526 => '陕西省渭南市蒲城县',
+ 610527 => '陕西省渭南市白水县',
+ 610528 => '陕西省渭南市富平县',
+ 610581 => '陕西省渭南市韩城市',
+ 610582 => '陕西省渭南市华阴市',
+ 610600 => '陕西省延安市',
+ 610601 => '陕西省延安市市辖区',
+ 610602 => '陕西省延安市宝塔区',
+ 610621 => '陕西省延安市延长县',
+ 610622 => '陕西省延安市延川县',
+ 610623 => '陕西省延安市子长县',
+ 610624 => '陕西省延安市安塞县',
+ 610625 => '陕西省延安市志丹县',
+ 610626 => '陕西省延安市吴旗县',
+ 610627 => '陕西省延安市甘泉县',
+ 610628 => '陕西省延安市富县',
+ 610629 => '陕西省延安市洛川县',
+ 610630 => '陕西省延安市宜川县',
+ 610631 => '陕西省延安市黄龙县',
+ 610632 => '陕西省延安市黄陵县',
+ 610700 => '陕西省汉中市',
+ 610701 => '陕西省汉中市市辖区',
+ 610702 => '陕西省汉中市汉台区',
+ 610721 => '陕西省汉中市南郑县',
+ 610722 => '陕西省汉中市城固县',
+ 610723 => '陕西省汉中市洋县',
+ 610724 => '陕西省汉中市西乡县',
+ 610725 => '陕西省汉中市勉县',
+ 610726 => '陕西省汉中市宁强县',
+ 610727 => '陕西省汉中市略阳县',
+ 610728 => '陕西省汉中市镇巴县',
+ 610729 => '陕西省汉中市留坝县',
+ 610730 => '陕西省汉中市佛坪县',
+ 612400 => '陕西省安康地区',
+ 612401 => '陕西省安康地区安康市',
+ 612422 => '陕西省安康地区汉阴县',
+ 612423 => '陕西省安康地区石泉县',
+ 612424 => '陕西省安康地区宁陕县',
+ 612425 => '陕西省安康地区紫阳县',
+ 612426 => '陕西省安康地区岚皋县',
+ 612427 => '陕西省安康地区平利县',
+ 612428 => '陕西省安康地区镇坪县',
+ 612429 => '陕西省安康地区旬阳县',
+ 612430 => '陕西省安康地区白河县',
+ 612500 => '陕西省商洛地区',
+ 612501 => '陕西省商洛地区商州市',
+ 612522 => '陕西省商洛地区洛南县',
+ 612523 => '陕西省商洛地区丹凤县',
+ 612524 => '陕西省商洛地区商南县',
+ 612525 => '陕西省商洛地区山阳县',
+ 612526 => '陕西省商洛地区镇安县',
+ 612527 => '陕西省商洛地区柞水县',
+ 612700 => '陕西省榆林地区',
+ 612701 => '陕西省榆林地区榆林市',
+ 612722 => '陕西省榆林地区神木县',
+ 612723 => '陕西省榆林地区府谷县',
+ 612724 => '陕西省榆林地区横山县',
+ 612725 => '陕西省榆林地区靖边县',
+ 612726 => '陕西省榆林地区定边县',
+ 612727 => '陕西省榆林地区绥德县',
+ 612728 => '陕西省榆林地区米脂县',
+ 612729 => '陕西省榆林地区佳县',
+ 612730 => '陕西省榆林地区吴堡县',
+ 612731 => '陕西省榆林地区清涧县',
+ 612732 => '陕西省榆林地区子洲县',
+ 620000 => '甘肃省',
+ 620100 => '甘肃省兰州市',
+ 620101 => '甘肃省兰州市市辖区',
+ 620102 => '甘肃省兰州市城关区',
+ 620103 => '甘肃省兰州市七里河区',
+ 620104 => '甘肃省兰州市西固区',
+ 620105 => '甘肃省兰州市安宁区',
+ 620111 => '甘肃省兰州市红古区',
+ 620121 => '甘肃省兰州市永登县',
+ 620122 => '甘肃省兰州市皋兰县',
+ 620123 => '甘肃省兰州市榆中县',
+ 620200 => '甘肃省嘉峪关市',
+ 620201 => '甘肃省嘉峪关市市辖区',
+ 620300 => '甘肃省嘉峪关市金昌市',
+ 620301 => '甘肃省嘉峪关市市辖区',
+ 620302 => '甘肃省嘉峪关市金川区',
+ 620321 => '甘肃省嘉峪关市永昌县',
+ 620400 => '甘肃省白银市',
+ 620401 => '甘肃省白银市市辖区',
+ 620402 => '甘肃省白银市白银区',
+ 620403 => '甘肃省白银市平川区',
+ 620421 => '甘肃省白银市靖远县',
+ 620422 => '甘肃省白银市会宁县',
+ 620423 => '甘肃省白银市景泰县',
+ 620500 => '甘肃省天水市',
+ 620501 => '甘肃省天水市市辖区',
+ 620502 => '甘肃省天水市秦城区',
+ 620503 => '甘肃省天水市北道区',
+ 620521 => '甘肃省天水市清水县',
+ 620522 => '甘肃省天水市秦安县',
+ 620523 => '甘肃省天水市甘谷县',
+ 620524 => '甘肃省天水市武山县',
+ 620525 => '甘肃省天水市张家川回族自治县',
+ 622100 => '甘肃省酒泉地区',
+ 622101 => '甘肃省酒泉地区玉门市',
+ 622102 => '甘肃省酒泉地区酒泉市',
+ 622103 => '甘肃省酒泉地区敦煌市',
+ 622123 => '甘肃省酒泉地区金塔县',
+ 622124 => '甘肃省酒泉地区肃北蒙古族自治县',
+ 622125 => '甘肃省酒泉地区阿克塞哈萨克族自治县',
+ 622126 => '甘肃省酒泉地区安西县',
+ 622200 => '甘肃省张掖地区',
+ 622201 => '甘肃省张掖地区张掖市',
+ 622222 => '甘肃省张掖地区肃南裕固族自治县',
+ 622223 => '甘肃省张掖地区民乐县',
+ 622224 => '甘肃省张掖地区临泽县',
+ 622225 => '甘肃省张掖地区高台县',
+ 622226 => '甘肃省张掖地区山丹县',
+ 622300 => '甘肃省武威地区',
+ 622301 => '甘肃省武威地区武威市',
+ 622322 => '甘肃省武威地区民勤县',
+ 622323 => '甘肃省武威地区古浪县',
+ 622326 => '甘肃省武威地区天祝藏族自治县',
+ 622400 => '甘肃省定西地区',
+ 622421 => '甘肃省定西地区定西县',
+ 622424 => '甘肃省定西地区通渭县',
+ 622425 => '甘肃省定西地区陇西县',
+ 622426 => '甘肃省定西地区渭源县',
+ 622427 => '甘肃省定西地区临洮县',
+ 622428 => '甘肃省定西地区漳县',
+ 622429 => '甘肃省定西地区岷县',
+ 622600 => '甘肃省陇南地区',
+ 622621 => '甘肃省陇南地区武都县',
+ 622623 => '甘肃省陇南地区宕昌县',
+ 622624 => '甘肃省陇南地区成县',
+ 622625 => '甘肃省陇南地区康县',
+ 622626 => '甘肃省陇南地区文县',
+ 622627 => '甘肃省陇南地区西和县',
+ 622628 => '甘肃省陇南地区礼县',
+ 622629 => '甘肃省陇南地区两当县',
+ 622630 => '甘肃省陇南地区徽县',
+ 622700 => '甘肃省平凉地区',
+ 622701 => '甘肃省平凉地区平凉市',
+ 622722 => '甘肃省平凉地区泾川县',
+ 622723 => '甘肃省平凉地区灵台县',
+ 622724 => '甘肃省平凉地区崇信县',
+ 622725 => '甘肃省平凉地区华亭县',
+ 622726 => '甘肃省平凉地区庄浪县',
+ 622727 => '甘肃省平凉地区静宁县',
+ 622800 => '甘肃省庆阳地区',
+ 622801 => '甘肃省庆阳地区西峰市',
+ 622821 => '甘肃省庆阳地区庆阳县',
+ 622822 => '甘肃省庆阳地区环县',
+ 622823 => '甘肃省庆阳地区华池县',
+ 622824 => '甘肃省庆阳地区合水县',
+ 622825 => '甘肃省庆阳地区正宁县',
+ 622826 => '甘肃省庆阳地区宁县',
+ 622827 => '甘肃省庆阳地区镇原县',
+ 622900 => '甘肃省临夏回族自治州',
+ 622901 => '甘肃省临夏回族自治州临夏市',
+ 622921 => '甘肃省临夏回族自治州临夏县',
+ 622922 => '甘肃省临夏回族自治州康乐县',
+ 622923 => '甘肃省临夏回族自治州永靖县',
+ 622924 => '甘肃省临夏回族自治州广河县',
+ 622925 => '甘肃省临夏回族自治州和政县',
+ 622926 => '甘肃省临夏回族自治州东乡族自治县',
+ 622927 => '甘肃省临夏回族自治州积石山保安族东乡族撒拉族自治县',
+ 623000 => '甘肃省甘南藏族自治州',
+ 623001 => '甘肃省甘南藏族自治州合作市',
+ 623021 => '甘肃省甘南藏族自治州临潭县',
+ 623022 => '甘肃省甘南藏族自治州卓尼县',
+ 623023 => '甘肃省甘南藏族自治州舟曲县',
+ 623024 => '甘肃省甘南藏族自治州迭部县',
+ 623025 => '甘肃省甘南藏族自治州玛曲县',
+ 623026 => '甘肃省甘南藏族自治州碌曲县',
+ 623027 => '甘肃省甘南藏族自治州夏河县',
+ 630000 => '青海省',
+ 630100 => '青海省西宁市',
+ 630101 => '青海省西宁市市辖区',
+ 630102 => '青海省西宁市城东区',
+ 630103 => '青海省西宁市城中区',
+ 630104 => '青海省西宁市城西区',
+ 630105 => '青海省西宁市城北区',
+ 630121 => '青海省西宁市大通回族土族自治县',
+ 632100 => '青海省海东地区',
+ 632121 => '青海省海东地区平安县',
+ 632122 => '青海省海东地区民和回族土族自治县',
+ 632123 => '青海省海东地区乐都县',
+ 632124 => '青海省海东地区湟中县',
+ 632125 => '青海省海东地区湟源县',
+ 632126 => '青海省海东地区互助土族自治县',
+ 632127 => '青海省海东地区化隆回族自治县',
+ 632128 => '青海省海东地区循化撒拉族自治县',
+ 632200 => '青海省海北藏族自治州',
+ 632221 => '青海省海北藏族自治州门源回族自治县',
+ 632222 => '青海省海北藏族自治州祁连县',
+ 632223 => '青海省海北藏族自治州海晏县',
+ 632224 => '青海省海北藏族自治州刚察县',
+ 632300 => '青海省黄南藏族自治州',
+ 632321 => '青海省黄南藏族自治州同仁县',
+ 632322 => '青海省黄南藏族自治州尖扎县',
+ 632323 => '青海省黄南藏族自治州泽库县',
+ 632324 => '青海省黄南藏族自治州河南蒙古族自治县',
+ 632500 => '青海省海南藏族自治州',
+ 632521 => '青海省海南藏族自治州共和县',
+ 632522 => '青海省海南藏族自治州同德县',
+ 632523 => '青海省海南藏族自治州贵德县',
+ 632524 => '青海省海南藏族自治州兴海县',
+ 632525 => '青海省海南藏族自治州贵南县',
+ 632600 => '青海省果洛藏族自治州',
+ 632621 => '青海省果洛藏族自治州玛沁县',
+ 632622 => '青海省果洛藏族自治州班玛县',
+ 632623 => '青海省果洛藏族自治州甘德县',
+ 632624 => '青海省果洛藏族自治州达日县',
+ 632625 => '青海省果洛藏族自治州久治县',
+ 632626 => '青海省果洛藏族自治州玛多县',
+ 632700 => '青海省玉树藏族自治州',
+ 632721 => '青海省玉树藏族自治州玉树县',
+ 632722 => '青海省玉树藏族自治州杂多县',
+ 632723 => '青海省玉树藏族自治州称多县',
+ 632724 => '青海省玉树藏族自治州治多县',
+ 632725 => '青海省玉树藏族自治州囊谦县',
+ 632726 => '青海省玉树藏族自治州曲麻莱县',
+ 632800 => '青海省海西蒙古族藏族自治州',
+ 632801 => '青海省海西蒙古族藏族自治州格尔木市',
+ 632802 => '青海省海西蒙古族藏族自治州德令哈市',
+ 632821 => '青海省海西蒙古族藏族自治州乌兰县',
+ 632822 => '青海省海西蒙古族藏族自治州都兰县',
+ 632823 => '青海省海西蒙古族藏族自治州天峻县',
+ 640000 => '宁夏回族自治区',
+ 640100 => '宁夏回族自治区银川市',
+ 640101 => '宁夏回族自治区银川市市辖区',
+ 640102 => '宁夏回族自治区银川市城区',
+ 640103 => '宁夏回族自治区银川市新城区',
+ 640111 => '宁夏回族自治区银川市郊区',
+ 640121 => '宁夏回族自治区银川市永宁县',
+ 640122 => '宁夏回族自治区银川市贺兰县',
+ 640200 => '宁夏回族自治区石嘴山市',
+ 640201 => '宁夏回族自治区石嘴山市市辖区',
+ 640202 => '宁夏回族自治区石嘴山市大武口区',
+ 640203 => '宁夏回族自治区石嘴山市石嘴山区',
+ 640204 => '宁夏回族自治区石嘴山市石炭井区',
+ 640221 => '宁夏回族自治区石嘴山市平罗县',
+ 640222 => '宁夏回族自治区石嘴山市陶乐县',
+ 640223 => '宁夏回族自治区石嘴山市惠农县',
+ 640300 => '宁夏回族自治区吴忠市',
+ 640301 => '宁夏回族自治区吴忠市市辖区',
+ 640302 => '宁夏回族自治区吴忠市利通区',
+ 640321 => '宁夏回族自治区吴忠市中卫县',
+ 640322 => '宁夏回族自治区吴忠市中宁县',
+ 640323 => '宁夏回族自治区吴忠市盐池县',
+ 640324 => '宁夏回族自治区吴忠市同心县',
+ 640381 => '宁夏回族自治区吴忠市青铜峡市',
+ 640382 => '宁夏回族自治区吴忠市灵武市',
+ 642200 => '宁夏回族自治区固原地区',
+ 642221 => '宁夏回族自治区固原地区固原县',
+ 642222 => '宁夏回族自治区固原地区海原县',
+ 642223 => '宁夏回族自治区固原地区西吉县',
+ 642224 => '宁夏回族自治区固原地区隆德县',
+ 642225 => '宁夏回族自治区固原地区泾源县',
+ 642226 => '宁夏回族自治区固原地区彭阳县',
+ 650000 => '新疆维吾尔族自治区',
+ 650100 => '新疆维吾尔族自治区乌鲁木齐市',
+ 650101 => '新疆维吾尔族自治区乌鲁木齐市市辖区',
+ 650102 => '新疆维吾尔族自治区乌鲁木齐市天山区',
+ 650103 => '新疆维吾尔族自治区乌鲁木齐市沙依巴克区',
+ 650104 => '新疆维吾尔族自治区乌鲁木齐市新市区',
+ 650105 => '新疆维吾尔族自治区乌鲁木齐市水磨沟区',
+ 650106 => '新疆维吾尔族自治区乌鲁木齐市头屯河区',
+ 650107 => '新疆维吾尔族自治区乌鲁木齐市南山矿区',
+ 650108 => '新疆维吾尔族自治区乌鲁木齐市东山区',
+ 650121 => '新疆维吾尔族自治区乌鲁木齐市乌鲁木齐县',
+ 650200 => '新疆维吾尔族自治区克拉玛依市',
+ 650201 => '新疆维吾尔族自治区克拉玛依市市辖区',
+ 650202 => '新疆维吾尔族自治区克拉玛依市独山子区',
+ 650203 => '新疆维吾尔族自治区克拉玛依市克拉玛依区',
+ 650204 => '新疆维吾尔族自治区克拉玛依市白碱滩区',
+ 650205 => '新疆维吾尔族自治区克拉玛依市乌尔禾区',
+ 652100 => '新疆维吾尔族自治区吐鲁番地区',
+ 652101 => '新疆维吾尔族自治区吐鲁番地区吐鲁番市',
+ 652122 => '新疆维吾尔族自治区吐鲁番地区鄯善县',
+ 652123 => '新疆维吾尔族自治区吐鲁番地区托克逊县',
+ 652200 => '新疆维吾尔族自治区哈密地区',
+ 652201 => '新疆维吾尔族自治区哈密地区哈密市',
+ 652222 => '新疆维吾尔族自治区哈密地区巴里坤哈萨克自治县',
+ 652223 => '新疆维吾尔族自治区哈密地区伊吾县',
+ 652300 => '新疆维吾尔族自治区昌吉回族自治州',
+ 652301 => '新疆维吾尔族自治区昌吉回族自治州昌吉市',
+ 652302 => '新疆维吾尔族自治区昌吉回族自治州阜康市',
+ 652303 => '新疆维吾尔族自治区昌吉回族自治州米泉市',
+ 652323 => '新疆维吾尔族自治区昌吉回族自治州呼图壁县',
+ 652324 => '新疆维吾尔族自治区昌吉回族自治州玛纳斯县',
+ 652325 => '新疆维吾尔族自治区昌吉回族自治州奇台县',
+ 652327 => '新疆维吾尔族自治区昌吉回族自治州吉木萨尔县',
+ 652328 => '新疆维吾尔族自治区昌吉回族自治州木垒哈萨克自治县',
+ 652700 => '新疆维吾尔族自治区博尔塔拉蒙古自治州',
+ 652701 => '新疆维吾尔族自治区博尔塔拉蒙古自治州博乐市',
+ 652722 => '新疆维吾尔族自治区博尔塔拉蒙古自治州精河县',
+ 652723 => '新疆维吾尔族自治区博尔塔拉蒙古自治州温泉县',
+ 652800 => '新疆维吾尔族自治区巴音郭楞蒙古自治州',
+ 652801 => '新疆维吾尔族自治区巴音郭楞蒙古自治州库尔勒市',
+ 652822 => '新疆维吾尔族自治区巴音郭楞蒙古自治州轮台县',
+ 652823 => '新疆维吾尔族自治区巴音郭楞蒙古自治州尉犁县',
+ 652824 => '新疆维吾尔族自治区巴音郭楞蒙古自治州若羌县',
+ 652825 => '新疆维吾尔族自治区巴音郭楞蒙古自治州且末县',
+ 652826 => '新疆维吾尔族自治区巴音郭楞蒙古自治州焉耆回族自治县',
+ 652827 => '新疆维吾尔族自治区巴音郭楞蒙古自治州和静县',
+ 652828 => '新疆维吾尔族自治区巴音郭楞蒙古自治州和硕县',
+ 652829 => '新疆维吾尔族自治区巴音郭楞蒙古自治州博湖县',
+ 652900 => '新疆维吾尔族自治区阿克苏地区',
+ 652901 => '新疆维吾尔族自治区阿克苏地区阿克苏市',
+ 652922 => '新疆维吾尔族自治区阿克苏地区温宿县',
+ 652923 => '新疆维吾尔族自治区阿克苏地区库车县',
+ 652924 => '新疆维吾尔族自治区阿克苏地区沙雅县',
+ 652925 => '新疆维吾尔族自治区阿克苏地区新和县',
+ 652926 => '新疆维吾尔族自治区阿克苏地区拜城县',
+ 652927 => '新疆维吾尔族自治区阿克苏地区乌什县',
+ 652928 => '新疆维吾尔族自治区阿克苏地区阿瓦提县',
+ 652929 => '新疆维吾尔族自治区阿克苏地区柯坪县',
+ 653000 => '新疆维吾尔族自治区克孜勒苏柯尔克孜自治州',
+ 653001 => '新疆维吾尔族自治区克孜勒苏柯尔克孜自治州阿图什市',
+ 653022 => '新疆维吾尔族自治区克孜勒苏柯尔克孜自治州阿克陶县',
+ 653023 => '新疆维吾尔族自治区克孜勒苏柯尔克孜自治州阿合奇县',
+ 653024 => '新疆维吾尔族自治区克孜勒苏柯尔克孜自治州乌恰县',
+ 653100 => '新疆维吾尔族自治区喀什地区',
+ 653101 => '新疆维吾尔族自治区喀什地区喀什市',
+ 653121 => '新疆维吾尔族自治区喀什地区疏附县',
+ 653122 => '新疆维吾尔族自治区喀什地区疏勒县',
+ 653123 => '新疆维吾尔族自治区喀什地区英吉沙县',
+ 653124 => '新疆维吾尔族自治区喀什地区泽普县',
+ 653125 => '新疆维吾尔族自治区喀什地区莎车县',
+ 653126 => '新疆维吾尔族自治区喀什地区叶城县',
+ 653127 => '新疆维吾尔族自治区喀什地区麦盖提县',
+ 653128 => '新疆维吾尔族自治区喀什地区岳普湖县',
+ 653129 => '新疆维吾尔族自治区喀什地区伽师县',
+ 653130 => '新疆维吾尔族自治区喀什地区巴楚县',
+ 653131 => '新疆维吾尔族自治区喀什地区塔什库尔干塔吉克自治县',
+ 653200 => '新疆维吾尔族自治区和田地区',
+ 653201 => '新疆维吾尔族自治区和田地区和田市',
+ 653221 => '新疆维吾尔族自治区和田地区和田县',
+ 653222 => '新疆维吾尔族自治区和田地区墨玉县',
+ 653223 => '新疆维吾尔族自治区和田地区皮山县',
+ 653224 => '新疆维吾尔族自治区和田地区洛浦县',
+ 653225 => '新疆维吾尔族自治区和田地区策勒县',
+ 653226 => '新疆维吾尔族自治区和田地区于田县',
+ 653227 => '新疆维吾尔族自治区和田地区民丰县',
+ 654000 => '新疆维吾尔族自治区伊犁哈萨克自治州',
+ 654001 => '新疆维吾尔族自治区伊犁哈萨克自治州奎屯市',
+ 654100 => '新疆维吾尔族自治区伊犁哈萨克自治州伊犁地区',
+ 654101 => '新疆维吾尔族自治区伊犁哈萨克自治州伊宁市',
+ 654121 => '新疆维吾尔族自治区伊犁哈萨克自治州伊宁县',
+ 654122 => '新疆维吾尔族自治区伊犁哈萨克自治州察布查尔锡伯自治县',
+ 654123 => '新疆维吾尔族自治区伊犁哈萨克自治州霍城县',
+ 654124 => '新疆维吾尔族自治区伊犁哈萨克自治州巩留县',
+ 654125 => '新疆维吾尔族自治区伊犁哈萨克自治州新源县',
+ 654126 => '新疆维吾尔族自治区伊犁哈萨克自治州昭苏县',
+ 654127 => '新疆维吾尔族自治区伊犁哈萨克自治州特克斯县',
+ 654128 => '新疆维吾尔族自治区伊犁哈萨克自治州尼勒克县',
+ 654200 => '新疆维吾尔族自治区塔城地区',
+ 654201 => '新疆维吾尔族自治区塔城地区塔城市',
+ 654202 => '新疆维吾尔族自治区塔城地区乌苏市',
+ 654221 => '新疆维吾尔族自治区塔城地区额敏县',
+ 654223 => '新疆维吾尔族自治区塔城地区沙湾县',
+ 654224 => '新疆维吾尔族自治区塔城地区托里县',
+ 654225 => '新疆维吾尔族自治区塔城地区裕民县',
+ 654226 => '新疆维吾尔族自治区塔城地区和布克赛尔蒙古自治县',
+ 654300 => '新疆维吾尔族自治区阿勒泰地区',
+ 654301 => '新疆维吾尔族自治区阿勒泰地区阿勒泰市',
+ 654321 => '新疆维吾尔族自治区阿勒泰地区布尔津县',
+ 654322 => '新疆维吾尔族自治区阿勒泰地区富蕴县',
+ 654323 => '新疆维吾尔族自治区阿勒泰地区福海县',
+ 654324 => '新疆维吾尔族自治区阿勒泰地区哈巴河县',
+ 654325 => '新疆维吾尔族自治区阿勒泰地区青河县',
+ 654326 => '新疆维吾尔族自治区阿勒泰地区吉木乃县',
+ 659000 => '新疆维吾尔族自治区直辖县级行政单位',
+ 659001 => '新疆维吾尔族自治区石河子市',
+];
diff --git a/vendor/mongdch/mon-util/src/exception/IPLocationException.php b/vendor/mongdch/mon-util/src/exception/IPLocationException.php
new file mode 100644
index 0000000..a806e9f
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/exception/IPLocationException.php
@@ -0,0 +1,31 @@
+ch = $ch;
+ }
+
+ /**
+ * 获取异常的curl句柄
+ *
+ * @return mixed
+ */
+ public function getCh()
+ {
+ return $this->ch;
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/exception/UploadException.php b/vendor/mongdch/mon-util/src/exception/UploadException.php
new file mode 100644
index 0000000..f9f2890
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/exception/UploadException.php
@@ -0,0 +1,76 @@
+ $this->getCode(),
+ 'msg' => $this->getMessage()
+ ];
+ }
+}
diff --git a/vendor/mongdch/mon-util/src/functions.php b/vendor/mongdch/mon-util/src/functions.php
new file mode 100644
index 0000000..07a4c11
--- /dev/null
+++ b/vendor/mongdch/mon-util/src/functions.php
@@ -0,0 +1,432 @@
+debug($var, $echo, $label, $flags);
+ }
+}
+
+if (!function_exists('is_wx')) {
+ /**
+ * 判断是否为微信浏览器发起的请求
+ *
+ * @return boolean
+ */
+ function is_wx()
+ {
+ return Tool::instance()->is_wx();
+ }
+}
+
+if (!function_exists('is_android')) {
+ /**
+ * 判断是否为安卓发起的请求
+ *
+ * @return boolean
+ */
+ function is_android()
+ {
+ return Tool::instance()->is_android();
+ }
+}
+
+if (!function_exists('is_ios')) {
+ /**
+ * 判断是否为苹果发起的请求
+ *
+ * @return boolean
+ */
+ function is_ios()
+ {
+ return Tool::instance()->is_ios();
+ }
+}
+
+if (!function_exists('hideBankcard')) {
+ /**
+ * 隐藏银行卡号
+ *
+ * @param string $id 银行卡号
+ * @return string
+ */
+ function hideBankcard($id)
+ {
+ return Tool::instance()->hideBankcard($id);
+ }
+}
+
+if (!function_exists('hideMoble')) {
+ /**
+ * 隐藏手机号
+ *
+ * @param string $id 手机号
+ * @return string
+ */
+ function hideMoble($id)
+ {
+ return Tool::instance()->hideMoble($id);
+ }
+}
+
+if (!function_exists('trimAll')) {
+ /**
+ * 删除字符串中的空格
+ *
+ * @param $str 要删除空格的字符串
+ * @return $str 返回删除空格后的字符串
+ */
+ function trimAll($str)
+ {
+ return Common::instance()->trimAll($str);
+ }
+}
+
+if (!function_exists('hidestr')) {
+ /**
+ * 将一个字符串部分字符用$re替代隐藏
+ *
+ * @param string $string 待处理的字符串
+ * @param integer $start 规定在字符串的何处开始,
+ * 正数 - 在字符串的指定位置开始
+ * 负数 - 在从字符串结尾的指定位置开始
+ * 0 - 在字符串中的第一个字符处开始
+ * @param integer $length 可选。规定要隐藏的字符串长度。默认是直到字符串的结尾。
+ * 正数 - 从 start 参数所在的位置隐藏
+ * 负数 - 从字符串末端隐藏
+ * @param string $re 替代符
+ * @return string 处理后的字符串
+ */
+ function hidestr($string, $start = 0, $length = 0, $re = '*')
+ {
+ return Common::instance()->hidestr($string, $start, $length, $re);
+ }
+}
+
+if (!function_exists('ip')) {
+ /**
+ * 获取客户端的IP地址
+ *
+ * @return string
+ */
+ function ip()
+ {
+ return Tool::instance()->ip();
+ }
+}
+
+if (!function_exists('safe_ip')) {
+ /**
+ * 安全IP检测,支持IP段检测
+ *
+ * @param string $ip 要检测的IP,','分割
+ * @param string|array $ips 白名单IP或者黑名单IP
+ * @return boolean true 在白名单或者黑名单中,否则不在
+ */
+ function safe_ip($ip, $ips)
+ {
+ return Tool::instance()->safe_ip($ip, $ips);
+ }
+}
+
+if (!function_exists('encodeEX')) {
+ /**
+ * 字符串编码过滤(中文、英文、数字不过滤,只过滤特殊字符)
+ *
+ * @param string $src 安全转码的字符串
+ * @return string
+ */
+ function encodeEX($src)
+ {
+ return Common::instance()->encodeEX($src);
+ }
+}
+
+if (!function_exists('decodeEX')) {
+ /**
+ * 字符串编码过滤(中文、英文、数字不过滤,只过滤特殊字符)
+ *
+ * @param string $src 安全转码的字符串
+ * @return string
+ */
+ function decodeEX($src)
+ {
+ return Common::instance()->decodeEX($src);
+ }
+}
+
+if (!function_exists('encryption')) {
+ /**
+ * 字符串加密方法
+ *
+ * @param string $str 加密的字符串
+ * @param string $salt 加密盐
+ * @return string
+ */
+ function encryption($str, $salt)
+ {
+ return Common::instance()->encryption($str, $salt);
+ }
+}
+
+if (!function_exists('decryption')) {
+ /**
+ * 字符串解密方法
+ *
+ * @param string $str 解密的字符串
+ * @param string $salt 解密的盐
+ * @return string
+ */
+ function decryption($str, $salt)
+ {
+ return Common::instance()->decryption($str, $salt);
+ }
+}
+
+if (!function_exists('mod')) {
+ /**
+ * 获取余数
+ *
+ * @param integer $bn 被除数
+ * @param integer $sn 除数
+ * @return integer 余
+ */
+ function mod($bn, $sn)
+ {
+ return Common::instance()->mod($bn, $sn);
+ }
+}
+
+if (!function_exists('ip2long_positive')) {
+ /**
+ * 返回正数的ip2long值
+ *
+ * @param string $ip ip
+ * @return integer
+ */
+ function ip2long_positive($ip)
+ {
+ return Common::instance()->ip2long_positive($ip);
+ }
+}
+
+if (!function_exists('strToMap')) {
+ /**
+ * URI字符串转数组
+ *
+ * @param string $str 入参,待转换的字符串
+ * @return array 字符数组
+ */
+ function strToMap($str)
+ {
+ return Common::instance()->strToMap($str);
+ }
+}
+
+if (!function_exists('mapToStr')) {
+ /**
+ * 数组转字符串
+ *
+ * @param array $map 入参,待转换的数组
+ * @return string
+ */
+ function mapToStr($map)
+ {
+ return Common::instance()->mapToStr($map);
+ }
+}
+
+if (!function_exists('array_2D_unique')) {
+ /**
+ * 二维数组去重(键&值不能完全相同)
+ *
+ * @param array $arr 需要去重的数组
+ * @return array
+ */
+ function array_2D_unique($arr)
+ {
+ return Common::instance()->array_2D_unique($arr);
+ }
+}
+
+if (!function_exists('array_2D_value_unique')) {
+ /**
+ * 二维数组去重(值不能相同)
+ *
+ * @param array $arr 需要去重的数组
+ * @return array
+ */
+ function array_2D_value_unique($arr)
+ {
+ return Common::instance()->array_2D_value_unique($arr);
+ }
+}
+
+if (!function_exists('isAssoc')) {
+ /**
+ * 是否为关联数组
+ *
+ * @param array $array 验证码的数组
+ * @return boolean
+ */
+ function isAssoc($arr)
+ {
+ return Common::instance()->isAssoc($arr);
+ }
+}
+
+if (!function_exists('array2DSort')) {
+ /**
+ * 二维数组排序
+ *
+ * @param array $array 排序的数组
+ * @param string $keys 排序的键名
+ * @param integer $sort 排序方式,默认值:SORT_DESC
+ * @return array
+ */
+ function array2DSort($array, $keys, $sort = SORT_DESC)
+ {
+ return Common::instance()->array2DSort($array, $keys, $sort);
+ }
+}
+
+
+if (!function_exists('uuid')) {
+ /**
+ * 生成UUID 单机使用
+ *
+ * @return string
+ */
+ function uuid()
+ {
+ return Common::instance()->uuid();
+ }
+}
+
+if (!function_exists('keyGen')) {
+ /**
+ * 生成Guid主键
+ *
+ * @return string
+ */
+ function keyGen()
+ {
+ return Common::instance()->keyGen();
+ }
+}
+
+if (!function_exists('mSubstr')) {
+ /**
+ * 字符串截取,支持中文和其他编码
+ *
+ * @param string $str 需要转换的字符串
+ * @param string $start 开始位置
+ * @param string $length 截取长度
+ * @param string $charset 编码格式
+ * @param string $suffix 截断显示字符
+ * @return string
+ */
+ function mSubstr($str, $length, $start = 0, $charset = "utf-8", $suffix = true)
+ {
+ return Common::instance()->mSubstr($str, $start, $length, $charset, $suffix);
+ }
+}
+
+if (!function_exists('randString')) {
+ /**
+ * 产生随机字串,可用来自动生成密码
+ * 默认长度6位 字母和数字混合 支持中文
+ *
+ * @param string $len 长度
+ * @param string $type 字串类型,0:字母;1:数字;2:大写字母;3:小写字母;4:中文;5:字母数字混合;othor:过滤掉混淆字符的字母数字组合
+ * @param string $addChars 额外字符
+ * @return string
+ */
+ function randString($len = 6, $type = '', $addChars = '')
+ {
+ return Common::instance()->randString($len, $type, $addChars);
+ }
+}
+
+if (function_exists('getBaseName')) {
+ /**
+ * 获取文件的名称,兼容中文名
+ *
+ * @return string
+ */
+ function getBaseName($filename)
+ {
+ return Tool::instance()->getBaseName($filename);
+ }
+}
+
+if (!function_exists('id2code')) {
+ /**
+ * id转code字符串
+ *
+ * @param integer $id 要加密的id值
+ * @return string
+ */
+ function id2code($id)
+ {
+ return IdCode::instance()->id2code($id);
+ }
+}
+
+if (!function_exists('code2id')) {
+ /**
+ * code转ID
+ *
+ * @param string $code 加密生成的code
+ * @return integer
+ */
+ function code2id($code)
+ {
+ return IdCode::instance()->code2id($code);
+ }
+}
diff --git a/vendor/mongdch/webman-uploadslice/.gitignore b/vendor/mongdch/webman-uploadslice/.gitignore
new file mode 100644
index 0000000..a67d42b
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/.gitignore
@@ -0,0 +1,6 @@
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
diff --git a/vendor/mongdch/webman-uploadslice/LICENSE b/vendor/mongdch/webman-uploadslice/LICENSE
new file mode 100644
index 0000000..72ac552
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Mon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/mongdch/webman-uploadslice/README.md b/vendor/mongdch/webman-uploadslice/README.md
new file mode 100644
index 0000000..a3bb2b3
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/README.md
@@ -0,0 +1,3 @@
+# webman-uploadslice
+
+webman大文件分片上传插件
diff --git a/vendor/mongdch/webman-uploadslice/composer.json b/vendor/mongdch/webman-uploadslice/composer.json
new file mode 100644
index 0000000..b38cc90
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/composer.json
@@ -0,0 +1,20 @@
+{
+ "name": "mongdch/webman-uploadslice",
+ "type": "library",
+ "license": "MIT",
+ "description": "Webman plugin mongdch/webman-uploadslice",
+ "authors": [
+ {
+ "name": "MonGDCH",
+ "email": "985558837@qq.com"
+ }
+ ],
+ "require": {
+ "mongdch/mon-util": "^1.3"
+ },
+ "autoload": {
+ "psr-4": {
+ "Mongdch\\WebmanUploadslice\\": "src"
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/mongdch/webman-uploadslice/composer.lock b/vendor/mongdch/webman-uploadslice/composer.lock
new file mode 100644
index 0000000..446397d
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/composer.lock
@@ -0,0 +1,144 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "25ca72cf2240efdef6486158858be113",
+ "packages": [
+ {
+ "name": "mongdch/mon-util",
+ "version": "1.3.13",
+ "dist": {
+ "type": "zip",
+ "url": "https://mirrors.cloud.tencent.com/repository/composer/mongdch/mon-util/1.3.13/mongdch-mon-util-1.3.13.zip",
+ "reference": "9f3d445a7c0f3bace9a3f623164d7d3914cc84c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0",
+ "psr/container": "1.0.0",
+ "psr/log": "^1.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "mon\\util\\": "src/"
+ }
+ },
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "MonGDCH",
+ "email": "985558837@qq.com"
+ }
+ ],
+ "description": "常用的PHP工具类库,包含了各种各式各样的工具,如:容器、时间、验证器、多语言、图片、二维码、IP地址、文件上传、文件操作、加解密、数据字典、各种算法等等等等。。。",
+ "homepage": "http://www.gdmon.com",
+ "keywords": [
+ "mon",
+ "tool",
+ "util"
+ ],
+ "time": "2022-07-26T07:59:23+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "dist": {
+ "type": "zip",
+ "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/container/1.0.0/psr-container-1.0.0.zip",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.4",
+ "dist": {
+ "type": "zip",
+ "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/log/1.1.4/psr-log-1.1.4.zip",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2021-05-03T11:20:27+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "plugin-api-version": "2.2.0"
+}
diff --git a/vendor/mongdch/webman-uploadslice/example/route.php b/vendor/mongdch/webman-uploadslice/example/route.php
new file mode 100644
index 0000000..a08f686
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/example/route.php
@@ -0,0 +1,75 @@
+
+ * @version 1.0.0
+ */
+
+use Webman\Route;
+use support\Request;
+use mon\util\Validate;
+use mon\util\exception\UploadException;
+use Mongdch\WebmanUploadslice\UploadSlice;
+
+// 上传页面
+Route::any('/', function (Request $request) {
+ return view('upload');
+});
+
+// 上传接口
+Route::post('/upload', function (Request $request) {
+ $data = $request->post();
+ // 验证数据
+ $validate = new Validate();
+ $check = $validate->data($data)->rule([
+ 'action' => ['in:slice,merge'],
+ 'filename' => ['required', 'str'],
+ 'chunk' => ['int', 'min:0'],
+ 'chunkLength' => ['required', 'int', 'min:0'],
+ 'uuid' => ['required', 'str']
+ ])->message([
+ 'action' => 'action faild',
+ 'filename' => 'filename faild',
+ 'chunk' => 'chunk faild',
+ 'chunkLength' => 'chunkLength faild',
+ 'uuid' => 'uuid faild'
+ ])->check();
+ if (!$check) {
+ return json(['code' => 0, 'msg' => $validate->getError()]);
+ }
+ // 验证上传分片必须的参数
+ if ($request->post('action') == 'slice' && is_null($request->post('chunk'))) {
+ return json(['code' => 0, 'msg' => 'chunk required']);
+ }
+ if ($request->post('action') == 'slice' && empty($request->file())) {
+ return json(['code' => 0, 'msg' => 'upload faild']);
+ }
+
+ // 上传
+ $sdk = new UploadSlice();
+ $file = $request->file('file');
+ try {
+ if ($data['action'] == 'slice') {
+ // 保存分片
+ $saveInfo = $sdk->upload($data['uuid'], $file, $data['chunk']);
+ return json(['code' => 1, 'msg' => 'ok', 'data' => $saveInfo]);
+ }
+ // 合并
+ $mergeInfo = $sdk->merge($data['uuid'], $data['chunkLength'], $data['filename']);
+ // $mergeInfo = $sdk->merge($data['uuid'], $data['chunkLength'], $data['filename'], 'dirname');
+ return json(['code' => 1, 'msg' => 'ok', 'data' => $mergeInfo]);
+ } catch (UploadException $e) {
+ return json(['code' => 0, 'msg' => $e->getMessage()]);
+ }
+
+
+ return json($sdk->getConfig());
+});
+
+Route::fallback(function () {
+ return json(['code' => 404, 'msg' => '404 not found']);
+});
+
+Route::disableDefaultRoute();
diff --git a/vendor/mongdch/webman-uploadslice/example/upload.html b/vendor/mongdch/webman-uploadslice/example/upload.html
new file mode 100644
index 0000000..c72f3f8
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/example/upload.html
@@ -0,0 +1,407 @@
+
+
+
+
+
+
+
+ 多线程异步大文件分片上传
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vendor/mongdch/webman-uploadslice/src/Install.php b/vendor/mongdch/webman-uploadslice/src/Install.php
new file mode 100644
index 0000000..fc6a33a
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/src/Install.php
@@ -0,0 +1,74 @@
+ 'config/plugin/mongdch/webman-uploadslice',
+);
+
+ /**
+ * Install
+ * @return void
+ */
+ public static function install()
+ {
+ static::installByRelation();
+ }
+
+ /**
+ * Uninstall
+ * @return void
+ */
+ public static function uninstall()
+ {
+ self::uninstallByRelation();
+ }
+
+ /**
+ * installByRelation
+ * @return void
+ */
+ public static function installByRelation()
+ {
+ foreach (static::$pathRelation as $source => $dest) {
+ if ($pos = strrpos($dest, '/')) {
+ $parent_dir = base_path().'/'.substr($dest, 0, $pos);
+ if (!is_dir($parent_dir)) {
+ mkdir($parent_dir, 0777, true);
+ }
+ }
+ //symlink(__DIR__ . "/$source", base_path()."/$dest");
+ copy_dir(__DIR__ . "/$source", base_path()."/$dest");
+ echo "Create $dest
+";
+ }
+ }
+
+ /**
+ * uninstallByRelation
+ * @return void
+ */
+ public static function uninstallByRelation()
+ {
+ foreach (static::$pathRelation as $source => $dest) {
+ $path = base_path()."/$dest";
+ if (!is_dir($path) && !is_file($path)) {
+ continue;
+ }
+ echo "Remove $dest
+";
+ if (is_file($path) || is_link($path)) {
+ unlink($path);
+ continue;
+ }
+ remove_dir($path);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/vendor/mongdch/webman-uploadslice/src/UploadSlice.php b/vendor/mongdch/webman-uploadslice/src/UploadSlice.php
new file mode 100644
index 0000000..ebd1368
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/src/UploadSlice.php
@@ -0,0 +1,206 @@
+
+ * @version 1.0.0
+ */
+class UploadSlice
+{
+ /**
+ * 配置信息
+ *
+ * @var array
+ */
+ protected $config = [
+ // 允许上传的文件后缀
+ 'exts' => [],
+ // 分片文件大小限制
+ 'sliceSize' => 0,
+ // 保存根路径
+ 'rootPath' => '',
+ // 临时文件存储路径,基于rootPath
+ 'tmpPath' => 'tmp'
+ ];
+
+ /**
+ * 错误的分片序号
+ *
+ * @var array
+ */
+ protected $error_chunk = [];
+
+ /**
+ * 构造方法
+ *
+ * @param array $config 自定义配置信息
+ */
+ public function __construct(array $config = [])
+ {
+ if (empty($config)) {
+ $config = config('plugin.mongdch.webman-uploadslice.app');
+ }
+ $this->config = array_merge($this->config, $config);
+ }
+
+ /**
+ * 获取配置信息
+ *
+ * @return array
+ */
+ public function getConfig(): array
+ {
+ return $this->config;
+ }
+
+ /**
+ * 设置配置信息
+ *
+ * @param array|string $config 配置信息或配置节点
+ * @param mixed $value 值
+ * @return UploadSlice
+ */
+ public function setConifg($config, $value = null): UploadSlice
+ {
+ if (is_array($config)) {
+ $this->config = array_merge($this->config, $config);
+ } else {
+ $this->config[$config] = $value;
+ }
+
+ return $this;
+ }
+
+ /**
+ * 获取错误的分片序号
+ *
+ * @return array
+ */
+ public function getErrorChunk(): array
+ {
+ return $this->error_chunk;
+ }
+
+ /**
+ * 保存上传的文件分片到临时文件目录
+ *
+ * @param string $fileID 文件唯一ID
+ * @param WebmanFile $file 文件流对象
+ * @param integer $chunk 文件分片序号,从0递增到N
+ * @throws UploadException
+ * @return false|array 文件保存路径
+ */
+ public function upload(string $fileID, WebmanFile $file, int $chunk = 0)
+ {
+ // 检测上传保存路径
+ if (!$this->checkPath()) {
+ return false;
+ }
+
+ // 校验分片文件大小
+ if ($this->config['sliceSize'] > 0 && $file->getSize() > $this->config['sliceSize']) {
+ throw new UploadException('分片文件大小不符', UploadException::ERROR_UPLOAD_SIZE_FAILD);
+ }
+ // 保存临时文件
+ $fileName = md5($fileID) . '_' . $chunk;
+ $tmpPath = $this->config['rootPath'] . DIRECTORY_SEPARATOR . $this->config['tmpPath'] . DIRECTORY_SEPARATOR . $fileID;
+ if (!File::instance()->createDir($tmpPath)) {
+ throw new UploadException('创建临时文件存储目录失败', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ $savePath = $tmpPath . DIRECTORY_SEPARATOR . $fileName;
+ $file->move($savePath);
+
+ return ['savePath' => $savePath, 'saveDir' => $tmpPath, 'fileName' => $fileName];
+ }
+
+ /**
+ * 合并分片临时文件,生成上传文件
+ *
+ * @param string $fileID 文件唯一ID
+ * @param integer $chunkLength 文件分片长度
+ * @param string $fileName 保存文件名
+ * @param string $saveDir 基于 rootPath 路径下的多级目录存储路径
+ * @throws UploadException
+ * @return array 文件保存路径
+ */
+ public function merge(string $fileID, int $chunkLength, string $fileName, string $saveDir = ''): array
+ {
+ // 分片临时文件存储目录
+ $tmpPath = $this->config['rootPath'] . DIRECTORY_SEPARATOR . $this->config['tmpPath'] . DIRECTORY_SEPARATOR . $fileID;
+ if (!is_dir($tmpPath)) {
+ throw new UploadException('临时文件不存在', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ // 验证文件名
+ $ext = File::instance()->getExt($fileName);
+ if (!empty($this->config['exts']) && !in_array($ext, $this->config['exts'])) {
+ throw new UploadException('不支持文件保存类型', UploadException::ERROR_UPLOAD_EXT_FAILD);
+ }
+ // 多级目录存储
+ $savePath = $this->config['rootPath'] . DIRECTORY_SEPARATOR . $saveDir;
+ if (!empty($saveDir) && !is_dir($savePath)) {
+ if (!File::instance()->createDir($savePath)) {
+ throw new UploadException('创建文件存储目录失败', UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ }
+ // 验证分片文件完整性
+ $this->error_chunk = [];
+ $chunkName = md5($fileID);
+ for ($i = 0; $i < $chunkLength; $i++) {
+ $checkName = $chunkName . '_' . $i;
+ $chunkPath = $tmpPath . DIRECTORY_SEPARATOR . $checkName;
+ if (!file_exists($chunkPath)) {
+ $this->error_chunk[] = $i;
+ throw new UploadException('分片文件不完整', UploadException::ERROR_CHUNK_FAILD);
+ }
+ }
+ // 合并文件
+ $saveFile = $savePath . DIRECTORY_SEPARATOR . $fileName;
+ // 打开保存文件句柄
+ $writerFp = fopen($saveFile, "ab");
+ for ($k = 0; $k < $chunkLength; $k++) {
+ $checkName = $chunkName . '_' . $k;
+ $chunkPath = $tmpPath . DIRECTORY_SEPARATOR . $checkName;
+ // 读取临时文件
+ $readerFp = fopen($chunkPath, "rb");
+ // 写入
+ fwrite($writerFp, fread($readerFp, filesize($chunkPath)));
+ // 关闭句柄
+ fclose($readerFp);
+ unset($readerFp);
+ // 删除临时文件
+ File::instance()->removeFile($chunkPath);
+ }
+ // 关闭保存文件句柄
+ fclose($writerFp);
+ // 删除临时目录
+ File::instance()->removeDir($tmpPath);
+
+ return ['savePath' => $saveFile, 'saveDir' => $savePath, 'fileName' => $fileName];
+ }
+
+ /**
+ * 检测上传根目录
+ *
+ * @throws UploadException
+ * @return boolean
+ */
+ protected function checkPath()
+ {
+ $rootPath = $this->config['rootPath'];
+ if ((!is_dir($rootPath) && !File::instance()->createDir($rootPath)) || (is_dir($rootPath) && !is_writable($rootPath))) {
+ throw new UploadException('上传文件保存目录不可写入:' . $rootPath, UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ $tmpPath = $rootPath . DIRECTORY_SEPARATOR . $this->config['tmpPath'];
+ if ((!is_dir($tmpPath) && !File::instance()->createDir($tmpPath)) || (is_dir($tmpPath) && !is_writable($tmpPath))) {
+ throw new UploadException('上传文件临时保存目录不可写入:' . $tmpPath, UploadException::ERROR_UPLOAD_DIR_NOT_FOUND);
+ }
+ return true;
+ }
+}
diff --git a/vendor/mongdch/webman-uploadslice/src/config/plugin/mongdch/webman-uploadslice/app.php b/vendor/mongdch/webman-uploadslice/src/config/plugin/mongdch/webman-uploadslice/app.php
new file mode 100644
index 0000000..5efbf83
--- /dev/null
+++ b/vendor/mongdch/webman-uploadslice/src/config/plugin/mongdch/webman-uploadslice/app.php
@@ -0,0 +1,14 @@
+ true,
+ // 允许上传的文件后缀
+ 'exts' => [],
+ // 分片文件大小限制
+ 'sliceSize' => 0,
+ // 保存根路径
+ 'rootPath' => public_path() . DIRECTORY_SEPARATOR . 'upload',
+ // 临时文件存储路径,基于rootPath
+ 'tmpPath' => 'tmp'
+];
diff --git a/vendor/workerman/mqtt/.gitignore b/vendor/workerman/mqtt/.gitignore
deleted file mode 100644
index 6c385fa..0000000
--- a/vendor/workerman/mqtt/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-logs
-.buildpath
-.project
-.settings
-.idea
-.DS_Store
-composer.lock
-vendor
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/README.md b/vendor/workerman/mqtt/README.md
deleted file mode 100644
index c1235b0..0000000
--- a/vendor/workerman/mqtt/README.md
+++ /dev/null
@@ -1,200 +0,0 @@
-# MQTT
-Asynchronous MQTT client for PHP based on workerman.
-
-# Installation
-composer require workerman/mqtt
-
-# 文档
-[中文文档](https://www.workerman.net/doc/workerman/components/workerman-mqtt.html)
-
-# Example
-**subscribe.php**
-```php
-onWorkerStart = function(){
- $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
- $mqtt->onConnect = function($mqtt) {
- $mqtt->subscribe('test');
- };
- $mqtt->onMessage = function($topic, $content){
- var_dump($topic, $content);
- };
- $mqtt->connect();
-};
-Worker::runAll();
-```
-Run with command ```php subscribe.php start```
-
-**publish.php**
-```php
-onWorkerStart = function(){
- $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
- $mqtt->onConnect = function($mqtt) {
- $mqtt->publish('test', 'hello workerman mqtt');
- };
- $mqtt->connect();
-};
-Worker::runAll();
-```
-
-Run with command ```php publish.php start```
-
-## API
-
- * Client::__construct()
- * Client::connect()
- * Client::publish()
- * Client::subscribe()
- * Client::unsubscribe()
- * Client::disconnect()
- * Client::close()
- * callback onConnect
- * callback onMessage
- * callback onError
- * callback onClose
-
--------------------------------------------------------
-
-
-### __construct (string $address, [array $options])
-
-Create an instance by $address and $options.
-
- * `$address` can be on the following protocols: 'mqtt', 'mqtts', 'mqtt://test.mosquitto.org:1883'.
-
- * `$options` is the client connection options. Defaults:
- * `keepalive`: `50` seconds, set to `0` to disable
- * `client_id`: client id, default `workerman-mqtt-client-{$mt_rand}`
- * `protocol_name`: `'MQTT'` or '`MQIsdp`'
- * `protocol_level`: `'MQTT'` is `4` and '`MQIsdp`' is `3`
- * `clean_session`: `true`, set to false to receive QoS 1 and 2 messages while
- offline
- * `reconnect_period`: `1` second, interval between two reconnections
- * `connect_timeout`: `30` senconds, time to wait before a CONNACK is received
- * `username`: the username required by your broker, if any
- * `password`: the password required by your broker, if any
- * `will`: a message that will sent by the broker automatically when
- the client disconnect badly. The format is:
- * `topic`: the topic to publish
- * `content`: the message to publish
- * `qos`: the QoS
- * `retain`: the retain flag
- * `resubscribe` : if connection is broken and reconnects,
- subscribed topics are automatically subscribed again (default `true`)
- * `bindto` default '', used to specify the IP address that PHP will use to access the network
- * `ssl` default `false`, it can be set `true` or `ssl context` see http://php.net/manual/en/context.ssl.php
- * `debug` default `false`, set `true` to show debug info
-
--------------------------------------------------------
-
-
-### connect()
-
-Connect to broker specified by the given $address and $options in `__construct($address, $options)`.
-
--------------------------------------------------------
-
-
-### publish(String $topic, String $content, [array $options], [callable $callback])
-
-Publish a message to a topic
-
-* `$topic` is the topic to publish to, `String`
-* `$message` is the message to publish, `String`
-* `$options` is the options to publish with, including:
- * `qos` QoS level, `Number`, default `0`
- * `retain` retain flag, `Boolean`, default `false`
- * `dup` mark as duplicate flag, `Boolean`, default `false`
-* `$callback` - `function (\Exception $exception)`, fired when the QoS handling completes,
- or at the next tick if QoS 0. No error occurs then `$exception` will be null.
-
--------------------------------------------------------
-
-
-### subscribe(mixed $topic, [array $options], [callable $callback])
-
-Subscribe to a topic or topics
-
-* `$topic` is a `String` topic or an `Array` which has as keys the topic name and as value
-the QoS like `array('test1'=> 0, 'test2'=> 1)` to subscribe.
-* `$options` is the options to subscribe with, including:
- * `qos` qos subscription level, default 0
-* `$callback` - `function (\Exception $exception, array $granted)`
- callback fired on suback where:
- * `exception` a subscription error or an error that occurs when client is disconnecting
- * `granted` is an array of `array('topic' => 'qos', 'topic' => 'qos')` where:
- * `topic` is a subscribed to topic
- * `qos` is the granted qos level on it
-
--------------------------------------------------------
-
-
-### unsubscribe(mixed $topic, [callable $callback])
-
-Unsubscribe from a topic or topics
-
-* `$topic` is a `String` topic or an array of topics to unsubscribe from
-* `$callback` - `function (\Exception $e)`, fired on unsuback. No error occurs then `$exception` will be null..
-
--------------------------------------------------------
-
-
-### disconnect()
-
-Send DISCONNECT package to broker and close the client.
-
--------------------------------------------------------
-
-
-### close()
-
-Close the client without DISCONNECT package.
-
--------------------------------------------------------
-
-
-### callback onConnect(Client $mqtt)
-Emitted on successful connection (`CONNACK` package received).
-
--------------------------------------------------------
-
-
-### callback onMessage(String $topic, String $content, Client $mqtt)
-`function (topic, message, packet) {}`
-
-Emitted when the client receives a publish packet
-* `$topic` topic of the received packet
-* `$content` payload of the received packet
-* `$mqtt` Client instance.
-
--------------------------------------------------------
-
-
-### callback onError(\Exception $exception)
-Emitted when something wrong for example the client cannot connect broker.
-
--------------------------------------------------------
-
-
-### callback onClose()
-Emitted when connection closed.
-
--------------------------------------------------------
-
-
-# License
-
-MIT
-
-
-
-
-
-
diff --git a/vendor/workerman/mqtt/composer.json b/vendor/workerman/mqtt/composer.json
deleted file mode 100644
index 53669f8..0000000
--- a/vendor/workerman/mqtt/composer.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name" : "workerman/mqtt",
- "type" : "library",
- "keywords": [
- "event-loop",
- "php",
- "mqtt",
- "workerman",
- "mqtt_client",
- "mqtt3",
- "mqtt5.0"
- ],
- "homepage": "https://www.workerman.net",
- "license" : "MIT",
- "authors": [
- {
- "name": "walkor",
- "email": "walkor@workerman.net",
- "homepage": "https://www.workerman.net",
- "role": "Developer"
- }
- ],
- "support": {
- "email": "walkor@workerman.net"
- },
- "require": {
- "workerman/workerman" : ">=3.3.0"
- },
- "suggest": {
- "ext-event": "For better performance. "
- },
- "autoload": {
- "psr-4": {"Workerman\\Mqtt\\": "./src"}
- }
-}
diff --git a/vendor/workerman/mqtt/examples/changelog.md b/vendor/workerman/mqtt/examples/changelog.md
deleted file mode 100644
index 444121c..0000000
--- a/vendor/workerman/mqtt/examples/changelog.md
+++ /dev/null
@@ -1 +0,0 @@
-1. Exception instead of RuntimeException
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/examples/chatroom.php b/vendor/workerman/mqtt/examples/chatroom.php
deleted file mode 100644
index e9c614a..0000000
--- a/vendor/workerman/mqtt/examples/chatroom.php
+++ /dev/null
@@ -1,32 +0,0 @@
-onWorkerStart = function(){
-// $mqtt = new Workerman\Mqtt\Client('mqtt://127.0.0.1:1883');
-// $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1884', ["username"=>"rw", "password"=>"readwrite"]);
- $mqtt = new Workerman\Mqtt\Client('mqtt://broker.emqx.io:1883', ["username"=>"rw", "password"=>"readwrite"]);
- $mqtt->onConnect = function($mqtt) {
-
- $room = 'workerman';
- echo "connect mqtt success!\r\n";
-
- $mqtt->subscribe($room, null, function(){
- echo "join room success! type something to talk!\r\n";
- });
-
- $mqtt->onMessage = function($room, $message){
- echo "room[$room]:", $message, "\r\n";
- };
-
- // Read message from console and publish it to all.
- $console = new TcpConnection(STDIN);
- $console->onMessage = function($console, $message) use ($mqtt){
- $mqtt->publish('workerman', trim($message));
- };
- };
- $mqtt->connect();
-};
-Worker::runAll();
diff --git a/vendor/workerman/mqtt/examples/publish-no-ssl.php b/vendor/workerman/mqtt/examples/publish-no-ssl.php
deleted file mode 100644
index 2ecb9b1..0000000
--- a/vendor/workerman/mqtt/examples/publish-no-ssl.php
+++ /dev/null
@@ -1,21 +0,0 @@
-onWorkerStart = function(){
- $mqtt = new Workerman\Mqtt\Client('mqtt://broker.emqx.io:1883', array(
- 'debug' => true,
- "username"=>"rw",
- "password"=>"readwrite"
- ));
- $mqtt->onConnect = function($mqtt) {
- // publish message every 2 seconds.
- Timer::add(2, function() use ($mqtt) {
- $mqtt->publish('workerman', 'hello workerman mqtt');
- });
- };
- $mqtt->connect();
-};
-Worker::runAll();
diff --git a/vendor/workerman/mqtt/examples/publish-over-ssl.php b/vendor/workerman/mqtt/examples/publish-over-ssl.php
deleted file mode 100644
index ad99d79..0000000
--- a/vendor/workerman/mqtt/examples/publish-over-ssl.php
+++ /dev/null
@@ -1,24 +0,0 @@
-onWorkerStart = function(){
- $mqtt = new Workerman\Mqtt\Client('mqtts://test.mosquitto.org:8883', array(
- 'ssl' => array(
- 'local_cert' => __DIR__ . '/ssl/mosquitto.org.crt',
- 'local_pk' => __DIR__ . '/ssl/mosquitto.org.key',
- 'verify_peer' => false,
- ),
- 'debug' => true
- ));
- $mqtt->onConnect = function($mqtt) {
- // publish message every 2 seconds.
- Timer::add(2, function() use ($mqtt) {
- $mqtt->publish('workerman', 'hello workerman mqtt');
- });
- };
- $mqtt->connect();
-};
-Worker::runAll();
diff --git a/vendor/workerman/mqtt/examples/ssl/mosquitto.org.crt b/vendor/workerman/mqtt/examples/ssl/mosquitto.org.crt
deleted file mode 100644
index a5860d8..0000000
--- a/vendor/workerman/mqtt/examples/ssl/mosquitto.org.crt
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDPDCCAqWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMCR0Ix
-FzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTESMBAGA1UE
-CgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVpdHRvLm9y
-ZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzAeFw0xODA3MDYwMzMx
-NDhaFw0xODEwMDQwMzMxNDhaMIGWMQswCQYDVQQGEwJ6aDEQMA4GA1UECAwHc2lj
-aHVhbjEQMA4GA1UEBwwHY2hlbmdkdTESMBAGA1UECgwJd29ya2VybWFuMRIwEAYD
-VQQLDAl3b3JrZXJtYW4xFjAUBgNVBAMMDXdvcmtlcm1hbi5uZXQxIzAhBgkqhkiG
-9w0BCQEWFHdhbGtvckB3b3JrZXJtYW4ubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAsq86D1x0iQ7eI0zQFsBxX0hXy9BDnzc8V+e6X3Ox7yEDV/YM
-XoHYtjoAEMFA0BcMyE59LlyJq+CFi2h9Js4hrPuAy7rAaMqURD/qJB622O/QVAVU
-tFcTHG5mOqwogWAG+8zkCS0agnuhQ0goCSzlreATSv359FJrwFQyDXifmjkfTwK7
-0CMaAg3iwBGMGfpXEcdFkyRb5/vWPVThUpAuPCTbceZkguXoAnboGIXEC7nSPCC+
-ItthWicI1oSiHSiybcps2kzNpTTBvDeEZbnZGAHhGPXILGj7Q/wjTFRBrjhdxDy9
-b/oekoJNYRjG08Jx6WED4hcHjDxqRkyCzZ2VjQIDAQABoxowGDAJBgNVHRMEAjAA
-MAsGA1UdDwQEAwIF4DANBgkqhkiG9w0BAQsFAAOBgQCQkJLTRDYxR7IatKeA/n8p
-YB6CwTJWWmQFvV5GSipDiELCdbwC2f0ues1Jcp6Nms4W1/fMea93wTALi0f4L6y9
-/B+PwBKR5XFSvARlKKzNy3rHV4+FqdScK4VHiLQ9i04xkmDa0qWfJ32QIiue/i9G
-M6QPAC1AYUOzyQ4OBlFb9w==
------END CERTIFICATE-----
diff --git a/vendor/workerman/mqtt/examples/ssl/mosquitto.org.key b/vendor/workerman/mqtt/examples/ssl/mosquitto.org.key
deleted file mode 100644
index f37d700..0000000
--- a/vendor/workerman/mqtt/examples/ssl/mosquitto.org.key
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAsq86D1x0iQ7eI0zQFsBxX0hXy9BDnzc8V+e6X3Ox7yEDV/YM
-XoHYtjoAEMFA0BcMyE59LlyJq+CFi2h9Js4hrPuAy7rAaMqURD/qJB622O/QVAVU
-tFcTHG5mOqwogWAG+8zkCS0agnuhQ0goCSzlreATSv359FJrwFQyDXifmjkfTwK7
-0CMaAg3iwBGMGfpXEcdFkyRb5/vWPVThUpAuPCTbceZkguXoAnboGIXEC7nSPCC+
-ItthWicI1oSiHSiybcps2kzNpTTBvDeEZbnZGAHhGPXILGj7Q/wjTFRBrjhdxDy9
-b/oekoJNYRjG08Jx6WED4hcHjDxqRkyCzZ2VjQIDAQABAoIBADtq+3KaOwJMmF/C
-rjuymMCnjNJwmdv7ASz2GMqe7V9oafU5E5nlscu+88Ceks/fqld9ijD9gqZODfpy
-r5NU3mvoYkbc/hiarL0ZR+Hk+Mag0HTwJN+nSOqeZ45BK2MCLLBUzMukXPlg5Ro7
-h1ytul6cca3xUMoHEl+tX8uM/f3JTLpd/PL9XXWgLYHQkrPRPykZD3dRv52Mf0l8
-jVEuBZ6F2jjpYLGLlFgIBxOngtUVrTqJ0dk+8Wd5WGI0iQsNTwU1zXJDFaNhSFsf
-tSfA5EYgeK/T9QhjDYeRrIhMgbyl8qpV3BK7Y3mZSiR7JQqW1LfkmAK+Zg//x8wF
-RHa+Tt0CgYEA1utBOj4zSecCuu7gTj74+F1Q8hQ9D8x5sYV3JvjHsf1xaTPN5sm2
-ejl+/CwpGHGL1jX7GgzHXsddKWdOk9F59G0XUAuQz8Ivexwui8+OdriPEEwbFXT9
-8LqJnvWKV0Vdgjzepx+9HGNe7ip/vNK02Ka5BGnLR9boFno9fx/bVe8CgYEA1Nbj
-98F8B8Ayh5DvmAslC6Z+GJGgIqkys315Zmkb3fwCIUMjyNV69nDx0tvx1p/G49uu
-c9RJSUvpKAwXgtFhroamy0iLGjP+LA+GJ4WSEEMJJ48p7rowe+AXCu9qZrmhV1Bu
-0lnIehi3U7o96YzyxuN3ryEC/asii+EMsc2DaEMCgYB10uminaEOnfgwNW+BViK2
-Pqp23MORGr+IpCvrkK4iFVkMnNr/8Iv6u/SzGR66iN1p5ZQw9tqCSnf3j+xTO59J
-clk6h+yvCb1wF8Yo3fQzgADmpWKfw9DIHev+2owqRhv6n5ZNNyg9HPlZRrFa+oUs
-1VJPahSI4PfCAugd/oAHvwKBgQC1b1Y4LqUHimzIqeHEz8NNsikN0p4azfddkNm7
-VmCeFCTQrAZGPs2qZU+P+1SmK+AE/5EwRkgPBnoEXIJyTwEhIMHwyq9hr+69KqKm
-8DM6T5rvMRiC3A9WmgmqlbszRIzn/LXr9QN0Kbul0T7T6AZRSzkMfmypR4iUi00i
-CNo7NwKBgHvEOfErCA0tEkUHIwxkmYEDxSvxh1mqYOewrs27QgvnVtueftq48RrK
-C/Sk+SEAvYFrMztCCK0kkbNHBo0Qq6KaOca0ryslXzJZan6hFQXdbjDhcbTTBooR
-+2H/xap/A4xciDpDG4NuHOow6CQ+4z6Ckj8tM1ipXggH774THi/t
------END RSA PRIVATE KEY-----
diff --git a/vendor/workerman/mqtt/examples/subscribe-no-ssl.php b/vendor/workerman/mqtt/examples/subscribe-no-ssl.php
deleted file mode 100644
index 9470c5a..0000000
--- a/vendor/workerman/mqtt/examples/subscribe-no-ssl.php
+++ /dev/null
@@ -1,19 +0,0 @@
-onWorkerStart = function(){
- $mqtt = new Workerman\Mqtt\Client('mqtt://broker.emqx.io:1883', array(
- 'debug' => true,
- "username"=>"rw", "password"=>"readwrite"
- ));
- $mqtt->onConnect = function($mqtt) {
- $mqtt->subscribe('workerman');
- };
- $mqtt->onMessage = function($topic, $content){
- echo "topic:$topic content:$content\n";
- };
- $mqtt->connect();
-};
-Worker::runAll();
diff --git a/vendor/workerman/mqtt/examples/subscribe-over-ssl.php b/vendor/workerman/mqtt/examples/subscribe-over-ssl.php
deleted file mode 100644
index da87637..0000000
--- a/vendor/workerman/mqtt/examples/subscribe-over-ssl.php
+++ /dev/null
@@ -1,24 +0,0 @@
-onWorkerStart = function(){
- $mqtt = new Workerman\Mqtt\Client('mqtts://test.mosquitto.org:8883', array(
- 'ssl' => array(
- 'local_cert' => __DIR__ . '/ssl/mosquitto.org.crt',
- 'local_pk' => __DIR__ . '/ssl/mosquitto.org.key',
- 'verify_peer' => false,
- ),
- 'debug' => true,
-// "username"=>"rw", "password"=>"readwrite"
- ));
- $mqtt->onConnect = function($mqtt) {
- $mqtt->subscribe('workerman');
- };
- $mqtt->onMessage = function($topic, $content){
- echo "topic:$topic content:$content\n";
- };
- $mqtt->connect();
-};
-Worker::runAll();
diff --git a/vendor/workerman/mqtt/examples/v5/publish-no-ssl.php b/vendor/workerman/mqtt/examples/v5/publish-no-ssl.php
deleted file mode 100644
index c48eddd..0000000
--- a/vendor/workerman/mqtt/examples/v5/publish-no-ssl.php
+++ /dev/null
@@ -1,41 +0,0 @@
-onWorkerStart = function(){
- $mqtt = new Workerman\Mqtt\Client('mqtt://broker.emqx.io:1883', array(
- 'debug' => true,
- "username"=>"rw", "password"=>"readwrite",
- 'properties' =>[
- 'session_expiry_interval' => 60,
- 'receive_maximum' => 65535,
- 'topic_alias_maximum' => 65535,
- ],
- 'protocol_level' => 5,
-
- ));
- $mqtt->onConnect = function(Workerman\Mqtt\Client $mqtt) {
- // publish message every 2 seconds.
- Timer::add(2, function() use ($mqtt) {
- $mqtt->publish('workerman',
- '{"time":' . 1223 . '}',
- [
- 'qos' =>0,
- 'retain' =>0,
- 'dup' => 0
- ],
- null,
- [
- 'topic_alias' => 1,
- 'message_expiry_interval' => 12,
- 'correlation_data' => 'your_correlation_data',
- 'response_topic' => 'your_response_topic',
- ]
- );
- });
- };
- $mqtt->connect();
-};
-Worker::runAll();
diff --git a/vendor/workerman/mqtt/examples/v5/subscribe-no-ssl.php b/vendor/workerman/mqtt/examples/v5/subscribe-no-ssl.php
deleted file mode 100644
index 162ad36..0000000
--- a/vendor/workerman/mqtt/examples/v5/subscribe-no-ssl.php
+++ /dev/null
@@ -1,62 +0,0 @@
-onWorkerStart = function(){
- $will = [
- 'topic' => 'workerman-mqtt/user/delete',
- 'qos' => 1,
- 'retain' => 0,
- 'content' => 'byebye',
- 'properties' => [
- 'will_delay_interval' => 60,
- 'message_expiry_interval' => 60,
- 'content_type' => 'test',
- 'payload_format_indicator' => true, // false 0 1
- ],
- ];
- $mqtt = new Workerman\Mqtt\Client('mqtt://broker.emqx.io:1883', array(
- 'debug' => true,
- "username"=>"rw", "password"=>"readwrite",
- 'properties' =>[
- 'session_expiry_interval' => 60,
- 'receive_maximum' => 65535,
- 'topic_alias_maximum' => 65535,
- ],
- 'protocol_level' => 5,
- 'will' => $will
- ));
- $mqtt->onConnect = function(\Workerman\Mqtt\Client $mqtt) {
- // MQTT 5.0
- $topics = [
- // 主题 => 选项
- 'workerman-mqtt/user/get' => [
- 'qos' => 1,
- 'no_local' => true,
- 'retain_as_published' => true,
- 'retain_handling' => 2,
- ],
- 'workerman-mqtt/user/update' => [
- 'qos' => 0,
- 'no_local' => false,
- 'retain_as_published' => true,
- 'retain_handling' => 2,
- ],
- ];
-
- $mqtt->subscribe($topics);
-
- $mqtt->subscribe('workerman', [
- 'qos' => 0,
- 'no_local' => false,
- 'retain_as_published' => true,
- 'retain_handling' => 2,
- ]);
- };
- $mqtt->onMessage = function($topic, $content){
- echo "topic:$topic content:$content\n";
- };
- $mqtt->connect();
-};
-Worker::runAll();
diff --git a/vendor/workerman/mqtt/src/Client.php b/vendor/workerman/mqtt/src/Client.php
deleted file mode 100644
index 09e0287..0000000
--- a/vendor/workerman/mqtt/src/Client.php
+++ /dev/null
@@ -1,1111 +0,0 @@
-
- * @copyright walkor
- * @link http://www.workerman.net/
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
- */
-namespace Workerman\Mqtt;
-
-use \Workerman\Connection\AsyncTcpConnection;
-use Workerman\Mqtt\Consts\MQTTConst;
-use Workerman\Mqtt\Consts\ReasonCodeConst;
-use \Workerman\Protocols\Mqtt;
-use \Workerman\Timer;
-
-/**
- * Class Client
- * @package Workerman\Mqtt
- */
-class Client
-{
- /**
- * STATE_INITIAL.
- */
- const STATE_INITIAL = 1;
-
- /**
- * STATE_CONNECTING
- */
- const STATE_CONNECTING = 2;
-
- /**
- * STATE_WAITCONACK
- */
- const STATE_WAITCONACK = 3;
-
- /**
- * STATE_ESTABLISHED
- */
- const STATE_ESTABLISHED = 4;
-
- /**
- * STATE_DISCONNECT
- */
- const STATE_DISCONNECT = 5;
-
- /**
- * DEFAULT_CLIENT_ID_PREFIX
- */
- const DEFAULT_CLIENT_ID_PREFIX = 'workerman-mqtt-client';
-
- /**
- * MAX_TOPIC_LENGTH
- */
- const MAX_TOPIC_LENGTH = 65535;
-
- /**
- * @var callable
- */
- public $onConnect = null;
-
- /**
- * @var callable
- */
- public $onReconnect = null;
-
- /**
- * @var callable
- */
- public $onMessage = null;
-
- /**
- * @var callable
- */
- public $onClose = null;
-
- /**
- * @var callable
- */
- public $onError = null;
-
- /**
- * @var int
- */
- protected $_state = 1;
-
- /**
- * @var int
- */
- protected $_messageId = 1;
-
- /**
- * @var string
- */
- protected $_remoteAddress = '';
-
- /**
- * @var AsyncTcpConnection
- */
- protected $_connection = null;
-
- /**
- * @var boolean
- */
- protected $_firstConnect = true;
-
- /**
- * ['topic'=>qos, ...]
- * @var array
- */
- protected $_resubscribeTopics = array();
-
- /**
- * @var array
- */
- protected $_resubscribeProperties = array();
-
- /**
- * @var int
- */
- protected $_checkConnectionTimeoutTimer = 0;
-
- /**
- * @var int
- */
- protected $_pingTimer = 0;
-
- /**
- * @var bool
- */
- protected $_recvPingResponse = true;
-
- /**
- * @var bool
- */
- protected $_doNotReconnect = false;
-
- /**
- * @var array
- */
- protected $_outgoing = array();
-
- /**
- * @var array
- */
- protected static $_errorCodeStringMap = array(
- 1 => 'Connection Refused, unacceptable protocol version',
- 2 => 'Connection Refused, identifier rejected',
- 3 => 'Connection Refused, Server unavailable',
- 4 => 'Connection Refused, bad user name or password',
- 5 => 'Connection Refused, not authorized',
- 100 => 'Connection closed',
- 101 => 'Connection timeout',
- 102 => 'Connection fail',
- 103 => 'Connection buffer full and close connection',
- 140 => 'No connection to broker',
- 240 => 'Invalid topic',
- 241 => 'Invalid qos',
- );
-
- /**
- * @var array
- */
- protected $_options = array(
- 'clean_session' => 1, // set to 0 to receive QoS 1 and 2 messages while offline
- 'username' => '', // the username required by your broker
- 'password' => '', // the password required by your broker
- 'keepalive' => 50, // default 50 seconds, set to 0 to disable
- 'protocol_name' => 'MQTT', // protocol name MQTT or MQIsdp
- 'protocol_level' => 4, // protocol level, MQTT is 4 and MQIsdp is 3
- 'reconnect_period' => 1, // reconnect period default 1 second, set to 0 to disable
- 'connect_timeout' => 30, // 30 seconds, time to wait before a CONNACK is received
- 'resubscribe' => true, // default true, if connection is broken and reconnects, subscribed topics are automatically subscribed again.
- 'bindto' => '', // bindto option, used to specify the IP address that PHP will use to access the network
- 'ssl' => false, // ssl context, see http://php.net/manual/en/context.ssl.php
- 'debug' => false, // debug
- 'properties' => [], // properties, MQTT5 need
- );
-
- /**
- * Client constructor.
- * @param $address
- * @param array $options
- * @throws \Exception
- */
- public function __construct($address, array $options = array())
- {
- $this->setOptions($options);
-
- $class_name = '\Workerman\Protocols\Mqtt';
- if ((int)$this->_options['protocol_level'] === 5) {
- if (!class_exists($class_name)) {
- class_alias('\Workerman\Mqtt\Protocols\Mqtt5', $class_name);
- }
- } else{
- if (!class_exists($class_name)) {
- class_alias('\Workerman\Mqtt\Protocols\Mqtt', $class_name);
- }
- }
-
-
- $context = array();
- if ($this->_options['bindto']) {
- $context['socket'] = array('bindto' => $this->_options['bindto']);
- }
- if ($this->_options['ssl'] && is_array($this->_options['ssl'])) {
- $context['ssl'] = $this->_options['ssl'];
- }
-
- if (strpos($address, 'mqtts') === 0) {
- if (empty($this->_options['ssl'])) {
- $this->_options['ssl'] = true;
- }
- $address = str_replace('mqtts', 'mqtt', $address);
- }
-
-// if ((int)$this->_options['protocol_level'] === 5) {
-// if (strpos($address, 'mqtt') === 0) {
-// $address = str_replace('mqtt', 'mqtt5', $address);
-// }
-// }
-
- $this->_remoteAddress = $address;
- $this->_connection = new AsyncTcpConnection($address, $context);
- // support tcp address
- $this->_connection->protocol = $class_name;
- $this->onReconnect = array($this, 'onMqttReconnect');
- $this->onMessage = function(){};
- if ($this->_options['ssl']) {
- $this->_connection->transport = 'ssl';
- }
- }
-
- /**
- * connect
- */
- public function connect()
- {
- $this->_doNotReconnect = false;
- $this->_connection->onConnect = array($this, 'onConnectionConnect');
- $this->_connection->onMessage = array($this, 'onConnectionMessage');
- $this->_connection->onError = array($this, 'onConnectionError');
- $this->_connection->onClose = array($this, 'onConnectionClose');
- $this->_connection->onBufferFull = array($this, 'onConnectionBufferFull');
- $this->_state = static::STATE_CONNECTING;
- $this->_connection->connect();
- $this->setConnectionTimeout($this->_options['connect_timeout']);
- if ($this->_options['debug']) {
- echo "-> Try to connect to {$this->_remoteAddress}", PHP_EOL;
- }
- }
-
- /**
- * subscribe
- *
- * @param $topic
- * @param array $options
- * @param callable $callback
- * @param array $callback
- */
- public function subscribe($topic, array $options = array(), $callback = null, $properties=[])
- {
- if ($this->checkDisconnecting($callback)) {
- return;
- }
-
- if (is_array($topic)) {
- $topics = $topic;
- } else {
- if ((int)$this->_options['protocol_level'] === 5) {
- $qos = !is_callable($options) && isset($options['qos']) ? $options['qos'] : 0;
- $no_local = !is_callable($options) && isset($options['no_local']) ? $options['no_local'] : null;
- $retain_as_published = !is_callable($options) && isset($options['retain_as_published']) ? $options['retain_as_published'] : null;
- $retain_handling = !is_callable($options) && isset($options['retain_handling']) ? $options['retain_handling'] : null;
- $topics = array($topic => [
- 'qos' => $qos,
- 'no_local' => $no_local,
- 'retain_as_published' => $retain_as_published,
- 'retain_handling' => $retain_handling,
- ]);
- } else {
- $qos = !is_callable($options) && isset($options['qos']) ? $options['qos'] : 0;
- $topics = array($topic => $qos);
- }
- }
-
-
- $args = func_get_args();
-
- $callback = end($args);
-
- if (!is_callable($callback)) {
- $callback = null;
- }
-
- if ($invalid_topic = static::validateTopics($topics)) {
- $this->triggerError(240, $callback);
- return;
- }
-
- if ($this->_options['resubscribe']) {
- $this->_resubscribeTopics += $topics;
- $this->_resubscribeProperties += $properties;
-
- }
-
- $package = array(
- 'cmd' => MQTTConst::CMD_SUBSCRIBE,
- 'topics' => $topics,
- 'message_id' => $this->incrMessageId(),
- 'properties' => $properties,
- );
-
- if ($this->_options['debug']) {
- echo "-> Send SUBSCRIBE package, topic:".implode(',', array_keys($topics))." message_id:{$package['message_id']}"." properties:".json_encode($properties), PHP_EOL;
- }
- $this->sendPackage($package);
-
- if ($callback) {
- $this->_outgoing[$package['message_id']] = function($exception, $codes = array())use($callback, $topics) {
- if ($exception) {
- call_user_func($callback, $exception, array());
- return;
- }
- $granted = array();
- $topics = array_keys($topics);
- foreach ($topics as $key => $topic) {
- $granted[$topic] = $codes[$key];
- }
- if ($callback) {
- call_user_func($callback, null, $granted);
- }
- };
- }
- }
-
- /**
- * unsubscribe
- *
- * @param $topic
- */
- public function unsubscribe($topic, $callback = null, array $properties = [])
- {
- if ($this->checkDisconnecting($callback)) {
- return;
- }
- $topics = is_array($topic) ? $topic : array($topic);
- if ($invalid_topic = static::validateTopics($topics)) {
- $this->triggerError(240);
- return;
- }
- foreach ($topics as $_topic) {
- if (isset($this->_resubscribeTopics[$_topic])) {
- unset($this->_resubscribeTopics[$_topic]);
- }
- }
- $this->_resubscribeProperties = [];
-
- $package = array(
- 'cmd' => MQTTConst::CMD_UNSUBSCRIBE,
- 'topics' => $topics,
- 'message_id' => $this->incrMessageId(),
- 'properties' => $properties,
- );
- if ($callback) {
- $this->_outgoing[$package['message_id']] = $callback;
- }
- if ($this->_options['debug']) {
- echo "-> Send UNSUBSCRIBE package, topic:".implode(',', $topics)." message_id:{$package['message_id']}"." properties:".json_encode($properties), PHP_EOL;
- }
- $this->sendPackage($package);
- }
-
- /**
- * publish
- *
- * @param $topic
- * @param $content
- * @param array $options
- * @param callable $callback
- * @param array $properties
- */
- public function publish($topic, $content, $options = array(), $callback = null, $properties=[])
- {
- if ($this->checkDisconnecting($callback)) {
- return;
- }
- if ((int)$this->_options['protocol_level'] === 5) {
- if (empty($topic)) {
- if (!isset($properties['topic_alias']) || empty($properties['topic_alias'])) {
- throw new \RuntimeException('Topic cannot be empty or need to set topic_alias');
- }
- }
- } else {
- static::isValidTopic($topic);
- }
- $qos = 0;
- $retain = 0;
- $dup = 0;
- if (isset($options['qos'])) {
- $qos = $options['qos'];
- if($this->checkInvalidQos($qos, $callback)) {
- return;
- }
- }
- if (!empty($options['retain'])) {
- $retain = 1;
- }
- if (!empty($options['dup'])) {
- $dup = 1;
- }
-
- $package = array(
- 'cmd' => MQTTConst::CMD_PUBLISH,
- 'topic' => $topic,
- 'content' => $content,
- 'retain' => $retain,
- 'qos' => $qos,
- 'dup' => $dup,
- 'properties' => $properties,
- );
-
- if ($qos) {
- $package['message_id'] = $this->incrMessageId();
- if ($callback) {
- $this->_outgoing[$package['message_id']] = $callback;
- }
- }
-
- if ($this->_options['debug']) {
- $message_id = isset($package['message_id']) ? $package['message_id'] : '';
- echo "-> Send PUBLISH package, topic:$topic content:$content retain:$retain qos:$qos dup:$dup message_id:$message_id"." properties:".json_encode($properties), PHP_EOL;
- }
-
- $this->sendPackage($package);
- }
-
- /**
- * disconnect
- */
- public function disconnect(int $code = ReasonCodeConst::NORMAL_DISCONNECTION, array $properties = [])
- {
- $this->sendPackage(array('cmd' => MQTTConst::CMD_DISCONNECT,'code' => $code, 'properties' => $properties));
- if ($this->_options['debug']) {
- echo "-> Send DISCONNECT package", PHP_EOL;
- }
- $this->close();
- }
-
- /**
- * auth
- */
- public function auth(int $code = ReasonCodeConst::SUCCESS, array $properties = [])
- {
- $this->sendPackage(['cmd' => MQTTConst::CMD_AUTH, 'code' => $code, 'properties' => $properties]);
- }
-
- /**
- * close
- */
- public function close()
- {
- $this->_doNotReconnect = true;
- if ($this->_options['debug']) {
- echo "-> Connection->close() called", PHP_EOL;
- }
- $this->_connection->destroy();
- }
-
- /**
- * reconnect
- *
- * @param int $after
- */
- public function reconnect($after = 0)
- {
- $this->_doNotReconnect = false;
- $this->_connection->onConnect = array($this, 'onConnectionConnect');
- $this->_connection->onMessage = array($this, 'onConnectionMessage');
- $this->_connection->onError = array($this, 'onConnectionError');
- $this->_connection->onClose = array($this, 'onConnectionClose');
- $this->_connection->reConnect($after);
- $this->setConnectionTimeout($this->_options['connect_timeout'] + $after);
- if ($this->_options['debug']) {
- echo "-- Reconnect after $after seconds", PHP_EOL;
- }
- }
-
- /**
- * onConnectionConnect
- */
- public function onConnectionConnect()
- {
- if ($this->_doNotReconnect) {
- $this->close();
- return;
- }
- //['cmd'=>1, 'clean_session'=>x, 'will'=>['qos'=>x, 'retain'=>x, 'topic'=>x, 'content'=>x],'username'=>x, 'password'=>x, 'keepalive'=>x, 'protocol_name'=>x, 'protocol_level'=>x, 'client_id' => x]
- $package = array(
- 'cmd' => MQTTConst::CMD_CONNECT,
- 'clean_session' => $this->_options['clean_session'],
- 'username' => $this->_options['username'],
- 'password' => $this->_options['password'],
- 'keepalive' => $this->_options['keepalive'],
- 'protocol_name' => $this->_options['protocol_name'],
- 'protocol_level' => $this->_options['protocol_level'],
- 'client_id' => $this->_options['client_id'],
- 'properties' => $this->_options['properties'] // MQTT5 中所需要的属性
- );
- if (isset($this->_options['will'])) {
- $package['will'] = $this->_options['will'];
- }
- $this->_state = static::STATE_WAITCONACK;
- $this->_connection->send($package);
- if ($this->_options['debug']) {
- echo "-- Tcp connection established", PHP_EOL;
- echo "-> Send CONNECT package client_id:{$this->_options['client_id']} username:{$this->_options['username']} password:{$this->_options['password']} clean_session:{$this->_options['clean_session']} protocol_name:{$this->_options['protocol_name']} protocol_level:{$this->_options['protocol_level']}", PHP_EOL;
- }
- }
-
- /**
- * onMqttReconnect
- */
- public function onMqttReconnect()
- {
- if ($this->_options['clean_session'] && $this->_options['resubscribe'] && $this->_resubscribeTopics) {
- $package = array(
- 'cmd' => MQTTConst::CMD_SUBSCRIBE,
- 'topics' => $this->_resubscribeTopics,
- 'message_id' => $this->incrMessageId(),
- 'properties' => $this->_resubscribeProperties ?? []
- );
- $this->sendPackage($package);
- if ($this->_options['debug']) {
- echo "-> Send SUBSCRIBE(Resubscribe) package topics:" .
- implode(',', array_keys($this->_resubscribeTopics))." message_id:{$package['message_id']}", PHP_EOL;
- }
- }
- }
-
- /**
- * onConnectionMessage
- *
- * @param $connection
- * @param $data
- */
- public function onConnectionMessage($connection, $data)
- {
- $cmd = $data['cmd'];
- switch ($cmd) {
- case MQTTConst::CMD_CONNACK:
- $code = (int)$data['code'];
- if ($code !== 0) {
- $message = $this->getErrorCodeString($code);
- if ($this->_options['debug']) {
- echo "<- Recv CONNACK package but get error " . $message . PHP_EOL;
- }
- $this->triggerError($code);
- $this->_connection->destroy();
- return;
- }
-
- if ($this->_options['debug']) {
- echo "<- Recv CONNACK package, MQTT connect success", PHP_EOL;
- }
-
- $this->_state = static::STATE_ESTABLISHED;
- if ($this->_firstConnect) {
- if ($this->onConnect) {
- call_user_func($this->onConnect, $this);
- }
- $this->_firstConnect = false;
- } else {
- if ($this->onReconnect) {
- call_user_func($this->onReconnect, $this);
- }
- }
- if ($this->_options['keepalive']) {
- $this->setPingTimer($this->_options['keepalive']);
- }
- $this->cancelConnectionTimeout();
- return;
- //['cmd' => $cmd, 'topic' => $topic, 'content' => $content]
- case MQTTConst::CMD_PUBLISH:
- $topic = $data['topic'];
- $content = $data['content'];
- $qos = $data['qos'];
- $message_id = $data['message_id'] ?? '';
- $properties = $data['properties'] ?? [];
- if ($this->_options['debug']) {
- echo "<- Recv PUBLISH package, message_id:$message_id qos:$qos topic:$topic content:$content properties:".json_encode($properties), PHP_EOL;
- }
- call_user_func($this->onMessage, $topic, $content, $this);
- // Connection may be closed in onMessage callback.
- if ($this->_state !== static::STATE_ESTABLISHED) {
- return;
- }
- $extra_package = [];
- if ((int)$this->_options['protocol_level'] === 5) {
- $extra_package = ['properties' => $properties];
- }
- switch ($qos) {
- case 0:
- break;
- case 1:
- if ($this->_options['debug']) {
- echo "-> Send PUBACK package, message_id:$message_id", PHP_EOL;
- }
- $this->sendPackage(array(
- 'cmd' => MQTTConst::CMD_PUBACK,
- 'message_id' => $message_id,
- ) + $extra_package);
- break;
- case 2:
- if ($this->_options['debug']) {
- echo "-> Send PUBREC package, message_id:$message_id", PHP_EOL;
- }
- $this->sendPackage(array(
- 'cmd' => MQTTConst::CMD_PUBREC,
- 'message_id' => $message_id,
- ) + $extra_package);
- }
- return;
- case MQTTConst::CMD_PUBREC:
- $message_id = $data['message_id'];
- $properties = $data['properties'] ?? [];
- if ($this->_options['debug']) {
- echo "<- Recv PUBREC package, message_id:$message_id", PHP_EOL;
- echo "-> Send PUBREL package, message_id:$message_id", PHP_EOL;
- }
- $extra_package = [];
- if ((int)$this->_options['protocol_level'] === 5) {
- $extra_package = ['properties' => $properties];
- }
- $this->sendPackage(array(
- 'cmd' => MQTTConst::CMD_PUBREL,
- 'message_id' => $data['message_id']
- ) + $extra_package);
- break;
- case MQTTConst::CMD_PUBREL:
- $message_id = $data['message_id'];
- $properties = $data['properties'] ?? [];
- if ($this->_options['debug']) {
- echo "<- Recv PUBREL package, message_id:$message_id", PHP_EOL;
- echo "-> Send PUBCOMP package, message_id:$message_id", PHP_EOL;
- }
- $extra_package = [];
- if ((int)$this->_options['protocol_level'] === 5) {
- $extra_package = ['properties' => $properties];
- }
- $this->sendPackage(array(
- 'cmd' => MQTTConst::CMD_PUBCOMP,
- 'message_id' => $message_id
- ) + $extra_package);
- break;
- case MQTTConst::CMD_PUBACK:
- case MQTTConst::CMD_PUBCOMP:
- $message_id = $data['message_id'];
- if ($this->_options['debug']) {
- echo "<- Recv ".($cmd === MQTTConst::CMD_PUBACK ? 'PUBACK' : 'PUBCOMP') . " package, message_id:$message_id", PHP_EOL;
- }
- if (!empty($this->_outgoing[$message_id])) {
- if ($this->_options['debug']) {
- echo "-- Trigger PUB callback for message_id:$message_id", PHP_EOL;
- }
- $callback = $this->_outgoing[$message_id];
- unset($this->_outgoing[$message_id]);
- call_user_func($callback, null);
- }
- break;
- case MQTTConst::CMD_SUBACK:
- case MQTTConst::CMD_UNSUBACK:
- $message_id = $data['message_id'];
- if ($this->_options['debug']) {
- echo "<- Recv ".($cmd === MQTTConst::CMD_SUBACK ? 'SUBACK' : 'UNSUBACK') . " package, message_id:$message_id", PHP_EOL;
- }
- $callback = $this->_outgoing[$message_id] ?? null;
- unset($this->_outgoing[$message_id]);
- if ($callback) {
- if ($this->_options['debug']) {
- echo "-- Trigger ".($cmd === MQTTConst::CMD_SUBACK ? 'SUB' : 'UNSUB') . " callback for message_id:$message_id", PHP_EOL;
- }
- if ($cmd === MQTTConst::CMD_SUBACK) {
- call_user_func($callback, null, $data['codes']);
- } else {
- call_user_func($callback, null);
- }
- }
- break;
- case MQTTConst::CMD_PINGRESP:
- $this->_recvPingResponse = true;
- if ($this->_options['debug']) {
- echo "<- Recv PINGRESP package", PHP_EOL;
- }
- break;
- default :
- echo "unknow cmd";
- }
- }
-
- /**
- * onConnectionClose
- */
- public function onConnectionClose()
- {
- if ($this->_options['debug']) {
- echo "-- Connection closed", PHP_EOL;
- }
- $this->cancelPingTimer();
- $this->cancelConnectionTimeout();
- $this->_recvPingResponse = true;
- $this->_state = static::STATE_DISCONNECT;
- if (!$this->_doNotReconnect && $this->_options['reconnect_period'] > 0) {
- $this->reConnect($this->_options['reconnect_period']);
- }
-
- $this->flushOutgoing();
-
- if ($this->onClose) {
- call_user_func($this->onClose, $this);
- }
- }
-
- /**
- * onConnectionError
- *
- * @param $connection
- * @param $code
- */
- public function onConnectionError($connection, $code)
- {
- // Connection error
- if ($code === 1) {
- $this->triggerError(102);
- // Send fail, connection closed
- } else {
- $this->triggerError(100);
- }
-
- }
-
- /**
- * onConnectionBufferFull
- */
- public function onConnectionBufferFull()
- {
- if ($this->_options['debug']) {
- echo "-- Connection buffer full and close connection", PHP_EOL;
- }
- $this->triggerError(103);
- $this->_connection->destroy();
- }
-
- /**
- * incrMessageId
- *
- * @return int
- */
- protected function incrMessageId()
- {
- $message_id = $this->_messageId++;
- if ($message_id >= 65535) {
- $this->_messageId = 1;
- }
- return $message_id;
- }
-
- /**
- * checkInvalidQos
- *
- * @param $qos
- * @return boolean
- */
- protected function checkInvalidQos($qos, $callback = null)
- {
- if ($qos !== 0 && $qos !== 1 && $qos !== 2) {
- $this->triggerError(241, $callback);
- return true;
- }
- return false;
- }
-
- /**
- * isValidTopic
- *
- * @param $topic
- * @return boolean
- */
- protected static function isValidTopic($topic)
- {
- if (!static::isString($topic)) {
- return false;
- }
- $topic_length = strlen($topic);
- if ($topic_length > static::MAX_TOPIC_LENGTH) {
- return false;
- }
- return true;
- }
-
- /**
- * validateTopics
- *
- * @param $topics
- * @return null|string
- */
- protected static function validateTopics($topics)
- {
- if (empty($topics)) {
- return 'array()';
- }
- foreach ($topics as $topic => $qos) {
- if(!static::isValidTopic($topic)) {
- return $topic;
- }
- }
- return null;
- }
-
- /**
- * is string.
- * @param $string
- * @return bool
- */
- protected static function isString($string) {
- return (is_string($string) || is_integer($string)) && strlen($string) > 0;
- }
-
- /**
- * triggerError
- *
- * @param $exception
- * @param $callback
- */
- protected function triggerError($code, $callback = null)
- {
- $exception = new \Exception($this->getErrorCodeString($code), $code);
- if ($this->_options['debug']) {
- echo "-- Error: ".$exception->getMessage() . PHP_EOL;
- }
- if (!$callback) {
- $callback = $this->onError ? $this->onError : function($exception){
- echo "Mqtt client: ", $exception->getMessage(), PHP_EOL;
- };
- }
- call_user_func($callback, $exception);
- }
-
- protected function getErrorCodeString(int $code)
- {
- return static::$_errorCodeStringMap[$code] ?? ReasonCodeConst::getReason($code);
- }
-
- /**
- * createRandomClientId
- *
- * @return string
- */
- protected function createRandomClientId()
- {
- mt_srand();
- return static::DEFAULT_CLIENT_ID_PREFIX . '-' . mt_rand();
- }
-
- /**
- * addCheckTimeoutTimer
- */
- protected function setConnectionTimeout($timeout)
- {
- $this->cancelConnectionTimeout();
- $this->_checkConnectionTimeoutTimer = Timer::add($timeout, array($this, 'checkConnectTimeout'), null, false);
- }
-
- /**
- * cancelConnectionTimeout
- */
- protected function cancelConnectionTimeout()
- {
- if ($this->_checkConnectionTimeoutTimer) {
- Timer::del($this->_checkConnectionTimeoutTimer);
- $this->_checkConnectionTimeoutTimer = 0;
- }
- }
-
- /**
- * setPingTimer
- */
- protected function setPingTimer($ping_interval)
- {
- $this->cancelPingTimer();
- $connection = $this->_connection;
- $this->_pingTimer = Timer::add($ping_interval, function()use($connection){
- if (!$this->_recvPingResponse) {
- if ($this->_options['debug']) {
- echo "<- Recv PINGRESP timeout", PHP_EOL;
- echo "-> Close connection", PHP_EOL;
- }
- $this->_connection->destroy();
- return;
- }
- if ($this->_options['debug']) {
- echo "-> Send PINGREQ package", PHP_EOL;
- }
- $this->_recvPingResponse = false;
- $connection->send(array('cmd' => MQTTConst::CMD_PINGREQ));
- });
- }
-
- /**
- * cancelPingTimer
- */
- protected function cancelPingTimer()
- {
- if ($this->_pingTimer) {
- Timer::del($this->_pingTimer);
- $this->_pingTimer = 0;
- }
- }
-
- /**
- * checkConnectTimeout
- */
- public function checkConnectTimeout()
- {
- if ($this->_state === static::STATE_CONNECTING || $this->_state === static::STATE_WAITCONACK) {
- $this->triggerError(101);
- $this->_connection->destroy();
- }
- }
-
- /**
- * checkDisconnecting
- *
- * @param null $callback
- * @return bool
- */
- protected function checkDisconnecting($callback = null)
- {
- if ($this->_state !== static::STATE_ESTABLISHED) {
- $this->triggerError(140, $callback);
- return true;
- }
- return false;
- }
-
- /**
- * flushOutgoing
- */
- protected function flushOutgoing()
- {
- foreach ($this->_outgoing as $message_id => $callback) {
- $this->triggerError(100, $callback);
- }
- $this->_outgoing = array();
- }
-
- /**
- * sendPackage
- *
- * @param $package
- */
- protected function sendPackage($package)
- {
- if ($this->checkDisconnecting()) {
- return;
- }
- $this->_connection->send($package);
- }
-
- /**
- * set options.
- *
- * @param $options
- * @throws \Exception
- */
- protected function setOptions($options)
- {
- if (isset($options['clean_session']) && !$options['clean_session']) {
- $this->_options['clean_session'] = 0;
- }
-
- if (isset($options['username'])) {
- if (!static::isString($options['username'])) {
- throw new \Exception('Bad username, expected string or integer but ' . gettype($options['username']) . ' provided.');
- }
- $this->_options['username'] = $options['username'];
- }
-
- if (isset($options['password'])) {
- if (!static::isString($options['password'])) {
- throw new \Exception('Bad password, expected string or integer but ' . gettype($options['password']) . ' provided.');
- }
- $this->_options['password'] = $options['password'];
- }
-
- if (isset($options['keepalive'])) {
- $keepalive = (int)$options['keepalive'];
- if (!static::isString($keepalive)) {
- throw new \Exception('Bad keepalive, expected integer but ' . gettype($keepalive) . ' provided.');
- }
- if ($keepalive < 0) {
- throw new \Exception('Bad keepalive, expected integer which not less than 0 but ' . $keepalive . ' provided.');
- }
- $this->_options['keepalive'] = $keepalive;
- }
-
- if (isset($options['protocol_name'])) {
- $protocol_name = $options['protocol_name'];
- if ($protocol_name !== 'MQTT' && $protocol_name !== 'MQIsdp') {
- throw new \Exception('Bad protocol_name of options, expected MQTT or MQIsdp but ' . $protocol_name . ' provided.');
- }
- $this->_options['protocol_name'] = $protocol_name;
- }
-
- if (isset($options['protocol_level'])) {
- $protocol_level = (int)$options['protocol_level'];
- if ($this->_options['protocol_name'] === 'MQTT' && !in_array($protocol_level, [4, 5]) ) {
- throw new \Exception('Bad protocol_level of options, expected (4 or 5) for protocol_name MQTT but ' . $options['protocol_level'] . ' provided.');
- }
- if ($this->_options['protocol_name'] === 'MQIsdp' && $protocol_level !== 3) {
- throw new \Exception('Bad protocol_level of options, expected 3 for protocol_name MQTT but ' . $options['protocol_level'] . ' provided.');
- }
- $this->_options['protocol_level'] = $protocol_level;
- }
-
- if (isset($options['client_id'])) {
- if (!static::isString($options['client_id'])) {
- throw new \Exception('Bad client_id of options, expected string or integer but ' . gettype($options['client_id']) . ' provided.');
- }
- $this->_options['client_id'] = $options['client_id'];
- } else {
- $this->_options['client_id'] = $this->createRandomClientId();
- }
-
- // 遗嘱消息,当客户端断线后Broker会自动发送遗嘱消息给其它客户端
- if (isset($options['will'])) {
- $will = $options['will'];
- $required = array('qos', 'topic', 'content');
- foreach ($required as $key) {
- if (!isset($will[$key])) {
- throw new \Exception('Bad will options, $will['.$key.'] missing.');
- }
- }
- if (!static::isString($will['topic'])) {
- throw new \Exception('Bad $will[\'topic\'] of options, expected string or integer but ' . gettype($will['topic']) . ' provided.');
- }
- if (!static::isString($will['content'])) {
- throw new \Exception('Bad $will[\'content\'] of options, expected string or integer but ' . gettype($will['content']) . ' provided.');
- }
- if ($this->checkInvalidQos($will['qos'])) {
- throw new \Exception('Bad will qos:' . var_export($will['qos'], true));
- }
- $this->_options['will'] = $options['will'];
- }
-
- // 重连时间间隔,默认 1 秒,0代表不重连
- if (isset($options['reconnect_period'])) {
- $reconnect_period = (int)$options['reconnect_period'];
- if (!static::isString($reconnect_period)) {
- throw new \Exception('Bad reconnect_period of options, expected integer but ' . gettype($options['reconnect_period']) . ' provided.');
- }
- if ($reconnect_period < 0) {
- throw new \Exception('Bad reconnect_period, expected integer which not less than 0 but ' . $options['reconnect_period'] . ' provided.');
- }
- $this->_options['reconnect_period'] = $reconnect_period;
- }
-
- if (isset($options['connect_timeout'])) {
- $connect_timeout = (int)$options['connect_timeout'];
- if (!static::isString($connect_timeout)) {
- throw new \Exception('Bad connect_timeout of options, expected integer but ' . gettype($options['connect_timeout']) . ' provided.');
- }
- if ($connect_timeout <= 0) {
- throw new \Exception('Bad connect_timeout, expected integer which greater than 0 but ' . $options['connect_timeout'] . ' provided.');
- }
- $this->_options['connect_timeout'] = $connect_timeout;
- }
-
- if (isset($options['resubscribe']) && !$options['resubscribe']) {
- $this->_options['resubscribe'] = false;
- }
-
- if (!empty($options['bindto'])) {
- $this->_options['bindto'] = $options['bindto'];
- }
-
- if (isset($options['ssl'])) {
- $this->_options['ssl'] = $options['ssl'];
- }
-
- if (isset($options['debug'])) {
- $this->_options['debug'] = !empty($options['debug']);
- }
-
- // MQTT5 中所需要的属性
- if (!empty($options['properties'])) {
- $this->_options['properties'] = $options['properties'];
- if (empty($this->_options['protocol_level'])) {
- $this->_options['protocol_level'] = 5;
- }
- } else {
- $this->_options['properties'] = [];
- }
- }
-}
diff --git a/vendor/workerman/mqtt/src/Consts/MQTTConst.php b/vendor/workerman/mqtt/src/Consts/MQTTConst.php
deleted file mode 100644
index aac8e0b..0000000
--- a/vendor/workerman/mqtt/src/Consts/MQTTConst.php
+++ /dev/null
@@ -1,116 +0,0 @@
- 'Success',
- self::UNSPECIFIED_ERROR => 'Unspecified error',
- self::MALFORMED_PACKET => 'Malformed Packet',
- self::PROTOCOL_ERROR => 'Protocol Error',
- self::IMPLEMENTATION_SPECIFIC_ERROR => 'Implementation specific error',
- self::UNSUPPORTED_PROTOCOL_VERSION => 'Unsupported Protocol Version',
- self::CLIENT_IDENTIFIER_NOT_VALID => 'Client Identifier not valid',
- self::BAD_USER_NAME_OR_PASSWORD => 'Bad User Name or Password',
- self::NOT_AUTHORIZED => 'Not authorized',
- self::SERVER_UNAVAILABLE => 'Server unavailable',
- self::SERVER_BUSY => 'Server busy',
- self::BANNED => 'Banned',
- self::BAD_AUTHENTICATION_METHOD => 'Bad authentication method',
- self::TOPIC_NAME_INVALID => 'Topic Name invalid',
- self::PACKET_TOO_LARGE => 'Packet too large',
- self::QUOTA_EXCEEDED => 'Quota exceeded',
- self::PAYLOAD_FORMAT_INVALID => 'Payload format invalid',
- self::RETAIN_NOT_SUPPORTED => 'Retain not supported',
- self::QOS_NOT_SUPPORTED => 'QoS not supported',
- self::USE_ANOTHER_SERVER => 'Use another server',
- self::SERVER_MOVED => 'Server moved',
- self::CONNECTION_RATE_EXCEEDED => 'Connection rate exceeded',
- self::DISCONNECT_WITH_WILL_MESSAGE => 'Disconnect with Will Message',
- self::SERVER_SHUTTING_DOWN => 'Server shutting down',
- self::KEEP_ALIVE_TIMEOUT => 'Keep Alive timeout',
- self::SESSION_TAKEN_OVER => 'Session taken over',
- self::TOPIC_FILTER_INVALID => 'Topic Filter invalid',
- self::RECEIVE_MAXIMUM_EXCEEDED => 'Receive Maximum exceeded',
- self::TOPIC_ALIAS_INVALID => 'Topic Alias invalid',
- self::MESSAGE_RATE_TOO_HIGH => 'Message rate too high',
- self::ADMINISTRATIVE_ACTION => 'Administrative action',
- self::SHARED_SUBSCRIPTIONS_NOT_SUPPORTED => 'Shared Subscriptions not supported',
- self::MAXIMUM_CONNECT_TIME => 'Maximum connect time',
- self::SUBSCRIPTION_IDENTIFIERS_NOT_SUPPORTED => 'Subscription Identifiers not supported',
- self::WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED => 'Wildcard Subscriptions not supported',
- self::NO_MATCHING_SUBSCRIBERS => 'No matching subscribers',
- self::NO_SUBSCRIPTION_EXISTED => 'No subscription existed',
- self::CONTINUE_AUTHENTICATION => 'Continue authentication',
- self::RE_AUTHENTICATE => 'Re-authenticate',
- self::PACKET_IDENTIFIER_IN_USE => 'Packet Identifier in use',
- self::PACKET_IDENTIFIER_NOT_FOUND => 'Packet Identifier not found',
- ];
-
- /** @var array */
- protected static $qosReasonPhrases = [
- self::GRANTED_QOS_0 => 'Granted QoS 0',
- self::GRANTED_QOS_1 => 'Granted QoS 1',
- self::GRANTED_QOS_2 => 'Granted QoS 2',
- ];
-
- public static function getReasonPhrases(bool $isQos = false): array
- {
- if ($isQos) {
- return static::$qosReasonPhrases;
- }
-
- return static::$reasonPhrases;
- }
-
- public static function getReasonPhrase(int $value, bool $isQos = false): string
- {
- if ($isQos) {
- return static::$qosReasonPhrases[$value] ?? 'QoS not supported';
- }
-
- return static::$reasonPhrases[$value] ?? 'Unknown';
- }
-
- public static function getReason(int $value): string
- {
- return static::$reasonPhrases[$value] ?? (static::$qosReasonPhrases[$value] ?? 'QoS not supported');
- }
-}
diff --git a/vendor/workerman/mqtt/src/Handle/DecodeV5.php b/vendor/workerman/mqtt/src/Handle/DecodeV5.php
deleted file mode 100644
index ec0278c..0000000
--- a/vendor/workerman/mqtt/src/Handle/DecodeV5.php
+++ /dev/null
@@ -1,304 +0,0 @@
-> 1 & 0x1;
- $will_flag = ord($body[1]) >> 2 & 0x1;
- $will_qos = ord($body[1]) >> 3 & 0x3;
- $will_retain = ord($body[1]) >> 5 & 0x1;
- $password_flag = ord($body[1]) >> 6 & 0x1;
- $userName_flag = ord($body[1]) >> 7 & 0x1;
- $body = substr($body, 2);
- $keepAlive = Decoder::shortInt($body);
- $properties_total_length = Decoder::byte($body);
- if ($properties_total_length) {
- $properties = UnPackProperty::connect($properties_total_length, $body);
- }
- $clientId = Decoder::readString($body);
- $will_properties = [];
- if ($will_flag) {
- $will_properties_total_length = Decoder::byte($body);
- if ($will_properties_total_length) {
- $will_properties = UnPackProperty::willProperties($will_properties_total_length, $body);
- }
- $will_topic = Decoder::readString($body);
- $will_content = Decoder::readString($body);
- }
- $userName = $password = '';
- if ($userName_flag) {
- $userName = Decoder::readString($body);
- }
- if ($password_flag) {
- $password = Decoder::readString($body);
- }
-
- $package = [
- 'cmd' => MQTTConst::CMD_CONNECT,
- 'protocol_name' => $protocol_name,
- 'protocol_level' => $protocol_level,
- 'clean_session' => $clean_session,
- 'properties' => [],
- 'will' => [],
- 'username' => $userName,
- 'password' => $password,
- 'keepalive' => $keepAlive,
- 'client_id' => $clientId,
- ];
-
- if ($properties_total_length) {
- $package['properties'] = $properties;
- } else {
- unset($package['properties']);
- }
-
-// $package['client_id'] = $clientId;
-
- if ($will_flag) {
- if ($will_properties_total_length) {
- $package['will']['properties'] = $will_properties;
- }
- $package['will'] += [
- 'qos' => $will_qos,
- 'retain' => $will_retain,
- 'topic' => $will_topic,
- 'message' => $will_content,
- ];
- } else {
- unset($package['will']);
- }
-
- return $package;
- }
-
- public static function connAck(string $body): array
- {
- $session_present = ord($body[0]) & 0x01;
- $code = ord($body[1]);
- $body = substr($body, 2);
-
- $package = [
- 'cmd' => MQTTConst::CMD_CONNACK,
- 'session_present' => $session_present,
- 'code' => $code,
- ];
-
- $properties_total_length = Decoder::byte($body);
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::connAck($properties_total_length, $body);
- }
-
- return $package;
- }
-
- public static function publish(int $dup, int $qos, int $retain, string $body): array
- {
- $topic = Decoder::readString($body);
-
- $package = [
- 'cmd' => MQTTConst::CMD_PUBLISH,
- 'dup' => $dup,
- 'qos' => $qos,
- 'retain' => $retain,
- 'topic' => $topic,
- ];
-
- if ($qos) {
- $package['message_id'] = Decoder::shortInt($body);
- }
-
- $properties_total_length = Decoder::byte($body);
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::publish($properties_total_length, $body);
- }
-
- $package['content'] = $body;
-
- return $package;
- }
-
- public static function subscribe(string $body): array
- {
- $message_id = Decoder::shortInt($body);
- $package = [
- 'cmd' => MQTTConst::CMD_SUBSCRIBE,
- 'message_id' => $message_id,
- ];
-
- $properties_total_length = Decoder::byte($body);
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::subscribe($properties_total_length, $body);
- }
-
- $topics = [];
- while ($body) {
- $topic = Decoder::readString($body);
- $topics[$topic] = [
- 'qos' => ord($body[0]) & 0x3,
- 'no_local' => (bool) (ord($body[0]) >> 2 & 0x1),
- 'retain_as_published' => (bool) (ord($body[0]) >> 3 & 0x1),
- 'retain_handling' => ord($body[0]) >> 4,
- ];
- $body = substr($body, 1);
- }
-
- $package['topics'] = $topics;
-
- return $package;
- }
-
- public static function subAck(string $body): array
- {
- $message_id = Decoder::shortInt($body);
-
- $package = [
- 'cmd' => MQTTConst::CMD_SUBACK,
- 'message_id' => $message_id,
- ];
-
- $properties_total_length = Decoder::byte($body);
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::pubAndSub($properties_total_length, $body);
- }
-
- $codes = unpack('C*', $body);
- $package['codes'] = array_values($codes);
-
- return $package;
- }
-
- public static function unSubscribe(string $body): array
- {
- $message_id = Decoder::shortInt($body);
-
- $package = [
- 'cmd' => MQTTConst::CMD_UNSUBSCRIBE,
- 'message_id' => $message_id,
- ];
-
- $properties_total_length = Decoder::byte($body);
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::unSubscribe($properties_total_length, $body);
- }
-
- $topics = [];
- while ($body) {
- $topic = Decoder::readString($body);
- $topics[] = $topic;
- }
-
- $package['topics'] = $topics;
-
- return $package;
- }
-
- public static function unSubAck(string $body): array
- {
- $message_id = Decoder::shortInt($body);
-
- $package = [
- 'cmd' => MQTTConst::CMD_UNSUBACK,
- 'message_id' => $message_id,
- ];
-
- $properties_total_length = Decoder::byte($body);
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::pubAndSub($properties_total_length, $body);
- }
-
- $codes = unpack('C*', $body);
- $package['codes'] = array_values($codes);
-
- return $package;
- }
-
- public static function disconnect(string $body): array
- {
- if (isset($body[0])) {
- $code = Decoder::byte($body);
- } else {
- $code = ReasonCodeConst::NORMAL_DISCONNECTION;
- }
- $package = [
- 'cmd' => MQTTConst::CMD_DISCONNECT,
- 'code' => $code,
- ];
-
- $properties_total_length = 0;
- if (isset($body[0])) {
- $properties_total_length = Decoder::byte($body);
- }
-
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::disconnect($properties_total_length, $body);
- }
-
- return $package;
- }
-
- public static function getReasonCode(int $cmd, string $body): array
- {
- $message_id = Decoder::shortInt($body);
-
- if (isset($body[0])) {
- $code = Decoder::byte($body);
- } else {
- $code = ReasonCodeConst::SUCCESS;
- }
-
- $package = [
- 'cmd' => $cmd,
- 'message_id' => $message_id,
- 'code' => $code,
- ];
-
- $properties_total_length = 0;
- if (isset($body[0])) {
- $properties_total_length = Decoder::byte($body);
- }
-
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::pubAndSub($properties_total_length, $body);
- }
-
- return $package;
- }
-
- public static function auth(string $data): array
- {
- if (isset($data[0])) {
- $code = Decoder::byte($data);
- } else {
- $code = ReasonCodeConst::SUCCESS;
- }
- $package = [
- 'cmd' => MQTTConst::CMD_AUTH,
- 'code' => $code,
- ];
-
- $properties_total_length = 0;
- if (isset($data[0])) {
- $properties_total_length = Decoder::byte($data);
- }
-
- if ($properties_total_length) {
- $package['properties'] = UnPackProperty::auth($properties_total_length, $data);
- }
-
- return $package;
- }
-}
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/src/Handle/Decoder.php b/vendor/workerman/mqtt/src/Handle/Decoder.php
deleted file mode 100644
index eea33d7..0000000
--- a/vendor/workerman/mqtt/src/Handle/Decoder.php
+++ /dev/null
@@ -1,141 +0,0 @@
-> 4;
- }
-
- /**
- * Read string from buffer.
- * @param string $buffer
- * @return string
- */
- public static function readString(string &$buffer)
- {
- $length = unpack('n', $buffer)[1];
- if ($length + 2 > strlen($buffer)) {
- echo "buffer:" . bin2hex($buffer) . " length:$length not enough for unpackString\n";
- }
-
- $string = substr($buffer, 2, $length);
- $buffer = substr($buffer, $length + 2);
- return $string;
- }
-
- /**
- * Read unsigned short int from buffer.
- * @param string $buffer
- * @return mixed
- */
- public static function shortInt(string &$buffer)
- {
- $tmp = unpack('n', $buffer);
- $buffer = substr($buffer, 2);
-
- return $tmp[1];
- }
-
- public static function longInt(string &$buffer)
- {
- $tmp = unpack('N', $buffer);
- $buffer = substr($buffer, 4);
-
- return $tmp[1];
- }
-
- public static function byte(string &$buffer)
- {
- $tmp = ord($buffer[0]);
- $buffer = substr($buffer, 1);
-
- return $tmp;
- }
-
- public static function varInt(string&$remaining, &$len)
- {
- $body_length = static::getBodyLength($remaining, $head_bytes);
- $len = $head_bytes;
-
- $result = $shift = 0;
- for ($i = 0; $i < $len; $i++) {
- $byte = ord($remaining[$i]);
- $result |= ($byte & 0x7F) << $shift++ * 7;
- }
-
- $remaining = substr($remaining, $head_bytes, $body_length);
-
- return $result;
- }
-
- /**
- * Get body length.
- *
- * @param string $buffer
- * @param null|int $head_bytes
- * @return int
- */
- public static function getBodyLength(string $buffer, &$head_bytes)
- {
- $head_bytes = $multiplier = 1;
- $value = 0;
- do {
- if (!isset($buffer[$head_bytes])) {
- throw new \Exception('Malformed Remaining Length');
-// $head_bytes = 0;
-// return 0;
- }
- $digit = ord($buffer[$head_bytes]);
- $value += ($digit & 127) * $multiplier;
- $multiplier *= 128;
- ++$head_bytes;
- } while (($digit & 128) != 0);
-
- return $value;
- }
-
- /**
- * Get body.
- *
- * @param string $buffer
- * @return string
- */
- public static function getBody(string $buffer)
- {
- $body_length = static::getBodyLength($buffer, $head_bytes);
- return substr($buffer, $head_bytes, $body_length);
- }
-
- /**
- * Get the MQTT protocol level.
- *
- * @param string $data
- * @return int
- */
- public static function getLevel(string $data)
- {
- $cmd = static::getCmd($data);
-
- if ($cmd !== MQTTConst::CMD_CONNECT) {
- throw new \InvalidArgumentException(
- sprintf('packet must be of type connect, cmd value equal %s given', $cmd)
- );
- }
-
- $remaining = static::getBody($data);
- $length = unpack('n', $remaining)[1];
-
- return ord($remaining[$length + 2]);
- }
-}
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/src/Handle/EncodeV5.php b/vendor/workerman/mqtt/src/Handle/EncodeV5.php
deleted file mode 100644
index 58c33ab..0000000
--- a/vendor/workerman/mqtt/src/Handle/EncodeV5.php
+++ /dev/null
@@ -1,217 +0,0 @@
- 2 是否 support
- $connect_flags |= $data['will']['qos'] << 3;
- if (!empty($data['will']['retain'])) {
- $connect_flags |= 1 << 5;
- }
- }
- if (!empty($data['password'])) {
- $connect_flags |= 1 << 6;
- }
- if (!empty($data['username'])) {
- $connect_flags |= 1 << 7;
- }
- $body .= chr($connect_flags);
-
- $keepalive = !empty($data['keepalive']) && (int)$data['keepalive'] >= 0 ? (int)$data['keepalive'] : 0;
- $body .= Encoder::shortInt($keepalive);
-
- // CONNECT Properties for MQTT5
- $body .= PackProperty::connect($data['properties'] ?? []);
-
- $body .= Encoder::packString($data['client_id']);
- if (!empty($data['will'])) {
- // Will Properties for MQTT5
- $body .= PackProperty::willProperties($data['will']['properties'] ?? []);
-
- $body .= Encoder::packString($data['will']['topic']);
- $body .= Encoder::packString($data['will']['content']);
- }
- if (!empty($data['username']) || $data['username'] === '0') {
- $body .= Encoder::packString($data['username']);
- }
- if (!empty($data['password']) || $data['password'] === '0') {
- $body .= Encoder::packString($data['password']);
- }
- $head = Encoder::packHead(MQTTConst::CMD_CONNECT, strlen($body));
-
- return $head . $body;
- }
-
- public static function connAck(array $data): string
- {
- $body = !empty($data['session_present']) ? chr(1) : chr(0);
- $code = !empty($data['code']) ? $data['code'] : 0;
- $body .= chr($code);
-
- // CONNACK Properties for MQTT5
- $body .= PackProperty::connAck($data['properties'] ?? []);
-
- $head = Encoder::packHead(MQTTConst::CMD_CONNACK, strlen($body));
- return $head . $body;
- }
-
- public static function publish(array $data): string
- {
- $body = Encoder::packString($data['topic']);
- $qos = $data['qos'] ?? 0;
- if ($qos) {
- $body .= Encoder::shortInt($data['message_id']);
- }
- $dup = $data['dup'] ?? 0;
- $retain = $data['retain'] ?? 0;
-
- // PUBLISH Properties for MQTT5
- $body .= PackProperty::publish($data['properties'] ?? []);
-
- $body .= $data['content'];
- $head = Encoder::packHead(MQTTConst::CMD_PUBLISH, strlen($body), $dup, $qos, $retain);
-
- return $head . $body;
- }
-
- public static function genReasonPhrase(array $data): string
- {
- $body = Encoder::shortInt($data['message_id']);
- $code = !empty($data['code']) ? $data['code'] : ReasonCodeConst::SUCCESS;
- $body .= chr($code);
-
- // pubAck, pubRec, pubRel, pubComp Properties
- $body .= PackProperty::pubAndSub($data['properties'] ?? []);
-
- if ($data['cmd'] === MQTTConst::CMD_PUBREL) {
- $head = Encoder::packHead($data['cmd'], strlen($body), 0, 1);
- } else {
- $head = Encoder::packHead($data['cmd'], strlen($body));
- }
-
- return $head . $body;
- }
-
- public static function subscribe(array $data): string
- {
- $body = Encoder::shortInt($data['message_id']);
-
- // SUBSCRIBE Properties
- $body .= PackProperty::subscribe($data['properties'] ?? []);
-
- foreach ($data['topics'] as $topic => $options) {
- $body .= Encoder::packString($topic);
-
- $subscribeOptions = 0;
- if (isset($options['qos'])) {
- $subscribeOptions |= (int)$options['qos'];
- }
- if (isset($options['no_local'])) {
- $subscribeOptions |= (int)$options['no_local'] << 2;
- }
- if (isset($options['retain_as_published'])) {
- $subscribeOptions |= (int)$options['retain_as_published'] << 3;
- }
- if (isset($options['retain_handling'])) {
- $subscribeOptions |= (int)$options['retain_handling'] << 4;
- }
- $body .= chr($subscribeOptions);
- }
-
- $head = Encoder::packHead(MQTTConst::CMD_SUBSCRIBE, strlen($body), 0, 1);
- return $head . $body;
- }
-
- public static function subAck(array $data): string
- {
- $codes = $data['codes'];
- $body = Encoder::shortInt($data['message_id']);
-
- // SUBACK Properties
- $body .= PackProperty::pubAndSub($data['properties'] ?? []);
-
- $body .= call_user_func_array(
- 'pack',
- array_merge(['C*'], $codes)
- );
- $head = Encoder::packHead(MQTTConst::CMD_SUBACK, strlen($body));
-
- return $head . $body;
- }
-
- public static function unSubscribe(array $data): string
- {
- $body = Encoder::shortInt($data['message_id']);
-
- // UNSUBSCRIBE Properties
- $body .= PackProperty::unSubscribe($data['properties'] ?? []);
-
- foreach ($data['topics'] as $topic) {
- $body .= Encoder::packString($topic);
- }
- $head = Encoder::packHead(MQTTConst::CMD_UNSUBSCRIBE, strlen($body), 0, 1);
-
- return $head . $body;
- }
-
- public static function unSubAck(array $data): string
- {
- $body = Encoder::shortInt($data['message_id']);
-
- // UNSUBACK Properties
- $body .= PackProperty::pubAndSub($data['properties'] ?? []);
-
- $body .= call_user_func_array(
- 'pack',
- array_merge(['C*'], $data['codes'])
- );
- $head = Encoder::packHead(MQTTConst::CMD_UNSUBACK, strlen($body));
-
- return $head . $body;
- }
-
- public static function disconnect(array $data): string
- {
- $code = !empty($data['code']) ? $data['code'] : ReasonCodeConst::NORMAL_DISCONNECTION;
- $body = chr($code);
-
- // DISCONNECT Properties
- $body .= PackProperty::disConnect($data['properties'] ?? []);
-
- $head = Encoder::packHead(MQTTConst::CMD_DISCONNECT, strlen($body));
-
- return $head . $body;
- }
-
- public static function auth(array $data): string
- {
- $code = !empty($data['code']) ? $data['code'] : ReasonCodeConst::SUCCESS;
- $body = chr($code);
-
- // AUTH Properties
- $body .= PackProperty::auth($data['properties'] ?? []);
-
- $head = Encoder::packHead(MQTTConst::CMD_AUTH, strlen($body));
-
- return $head . $body;
- }
-}
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/src/Handle/Encoder.php b/vendor/workerman/mqtt/src/Handle/Encoder.php
deleted file mode 100644
index 1cbe6ef..0000000
--- a/vendor/workerman/mqtt/src/Handle/Encoder.php
+++ /dev/null
@@ -1,87 +0,0 @@
-> 7;
- // if there are more digits to encode, set the top bit of this digit
- if ($len > 0) {
- $digit = ($digit | 0x80);
- }
- $string .= chr($digit);
- } while ($len > 0);
-
- return $string;
- }
-}
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/src/Handle/Property/PackProperty.php b/vendor/workerman/mqtt/src/Handle/Property/PackProperty.php
deleted file mode 100644
index 76c4b2e..0000000
--- a/vendor/workerman/mqtt/src/Handle/Property/PackProperty.php
+++ /dev/null
@@ -1,337 +0,0 @@
- $item) {
- if (isset($connect[$key])) {
- $property = $connect[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::SESSION_EXPIRY_INTERVAL:
- $length += 5;
- $tmpBody .= Encoder::longInt($item);
- break;
- case PropertyConst::AUTHENTICATION_METHOD:
- case PropertyConst::AUTHENTICATION_DATA:
- $length += 3;
- $length += strlen($item);
- $tmpBody .= Encoder::packString($item);
- break;
- case PropertyConst::REQUEST_PROBLEM_INFORMATION:
- case PropertyConst::REQUEST_RESPONSE_INFORMATION:
- $length += 2;
- $tmpBody .= chr((int) $item);
- break;
- case PropertyConst::RECEIVE_MAXIMUM:
- case PropertyConst::TOPIC_ALIAS_MAXIMUM:
- case PropertyConst::MAXIMUM_PACKET_SIZE:
- $length += 3;
- $tmpBody .= Encoder::shortInt($item);
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($connect['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function willProperties(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $willProperties = array_flip(PacketMap::$willProperties);
- foreach ($data as $key => $item) {
- if (isset($willProperties[$key])) {
- $property = $willProperties[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::MESSAGE_EXPIRY_INTERVAL:
- case PropertyConst::WILL_DELAY_INTERVAL:
- $length += 5;
- $tmpBody .= Encoder::longInt($item);
- break;
- case PropertyConst::CONTENT_TYPE:
- case PropertyConst::RESPONSE_TOPIC:
- case PropertyConst::CORRELATION_DATA:
- $length += 3;
- $length += strlen($item);
- $tmpBody .= Encoder::packString($item);
- break;
- case PropertyConst::PAYLOAD_FORMAT_INDICATOR:
- $length += 2;
- $tmpBody .= chr((int) $item);
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($willProperties['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function connAck(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $connAck = array_flip(PacketMap::$connAck);
- foreach ($data as $key => $item) {
- if (isset($connAck[$key])) {
- $property = $connAck[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::SESSION_EXPIRY_INTERVAL:
- case PropertyConst::MAXIMUM_PACKET_SIZE:
- $length += 5;
- $tmpBody .= Encoder::longInt($item);
- break;
- case PropertyConst::SERVER_KEEP_ALIVE:
- case PropertyConst::RECEIVE_MAXIMUM:
- case PropertyConst::TOPIC_ALIAS_MAXIMUM:
- $length += 3;
- $tmpBody .= Encoder::shortInt($item);
- break;
- case PropertyConst::ASSIGNED_CLIENT_IDENTIFIER:
- case PropertyConst::AUTHENTICATION_METHOD:
- case PropertyConst::AUTHENTICATION_DATA:
- case PropertyConst::RESPONSE_INFORMATION:
- case PropertyConst::SERVER_REFERENCE:
- case PropertyConst::REASON_STRING:
- $length += 3;
- $length += strlen($item);
- $tmpBody .= Encoder::packString($item);
- break;
- case PropertyConst::MAXIMUM_QOS:
- case PropertyConst::RETAIN_AVAILABLE:
- case PropertyConst::WILDCARD_SUBSCRIPTION_AVAILABLE:
- case PropertyConst::SUBSCRIPTION_IDENTIFIER_AVAILABLE:
- case PropertyConst::SHARED_SUBSCRIPTION_AVAILABLE:
- $length += 2;
- $tmpBody .= chr((int) $item);
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($connAck['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function publish(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $publish = array_flip(PacketMap::$publish);
- foreach ($data as $key => $item) {
- if (isset($publish[$key])) {
- $property = $publish[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::MESSAGE_EXPIRY_INTERVAL:
- $length += 5;
- $tmpBody .= Encoder::longInt($item);
- break;
- case PropertyConst::TOPIC_ALIAS:
- $length += 3;
- $tmpBody .= Encoder::shortInt($item);
- break;
- case PropertyConst::CONTENT_TYPE:
- case PropertyConst::RESPONSE_TOPIC:
- case PropertyConst::CORRELATION_DATA:
- $length += 3;
- $length += strlen($item);
- $tmpBody .= Encoder::packString($item);
- break;
- case PropertyConst::PAYLOAD_FORMAT_INDICATOR:
- $length += 2;
- $tmpBody .= chr((int) $item);
- break;
- case PropertyConst::SUBSCRIPTION_IDENTIFIER:
- $length += 1;
- $value = Encoder::varInt((int) $item);
- $length += strlen($value);
- $tmpBody .= $value;
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($publish['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function pubAndSub(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $pubAndSub = array_flip(PacketMap::$pubAndSub);
- foreach ($data as $key => $item) {
- if (isset($pubAndSub[$key])) {
- $property = $pubAndSub[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::REASON_STRING:
- $length += 3;
- $length += strlen($item);
- $tmpBody .= Encoder::packString($item);
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($pubAndSub['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function subscribe(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $subscribe = array_flip(PacketMap::$subscribe);
- foreach ($data as $key => $item) {
- if (isset($subscribe[$key])) {
- $property = $subscribe[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::SUBSCRIPTION_IDENTIFIER:
- $length += 1;
- $value = Encoder::varInt((int) $item);
- $length += strlen($value);
- $tmpBody .= $value;
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($subscribe['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function unSubscribe(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $unSubscribe = array_flip(PacketMap::$unSubscribe);
- foreach ($data as $key => $item) {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($unSubscribe['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function disConnect(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $disConnect = array_flip(PacketMap::$disConnect);
- foreach ($data as $key => $item) {
- if (isset($disConnect[$key])) {
- $property = $disConnect[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::SESSION_EXPIRY_INTERVAL:
- $length += 5;
- $tmpBody .= Encoder::longInt($item);
- break;
- case PropertyConst::SERVER_REFERENCE:
- case PropertyConst::REASON_STRING:
- $length += 3;
- $length += strlen($item);
- $tmpBody .= Encoder::packString($item);
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($disConnect['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-
- public static function auth(array $data): string
- {
- $length = 0;
- $tmpBody = '';
- $auth = array_flip(PacketMap::$auth);
- foreach ($data as $key => $item) {
- if (isset($auth[$key])) {
- $property = $auth[$key];
- $tmpBody .= chr($property);
- switch ($property) {
- case PropertyConst::AUTHENTICATION_METHOD:
- case PropertyConst::AUTHENTICATION_DATA:
- case PropertyConst::REASON_STRING:
- $length += 3;
- $length += strlen($item);
- $tmpBody .= Encoder::packString($item);
- break;
- }
- } else {
- // Property::USER_PROPERTY
- $length += 5;
- $length += strlen((string) $key);
- $length += strlen((string) $item);
- $tmpBody .= chr($auth['user_property']);
- $tmpBody .= Encoder::stringPair((string) $key, (string) $item);
- }
- }
-
- return chr($length) . $tmpBody;
- }
-}
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/src/Handle/Property/PacketMap.php b/vendor/workerman/mqtt/src/Handle/Property/PacketMap.php
deleted file mode 100644
index 377896c..0000000
--- a/vendor/workerman/mqtt/src/Handle/Property/PacketMap.php
+++ /dev/null
@@ -1,124 +0,0 @@
- 'session_expiry_interval',
- PropertyConst::AUTHENTICATION_METHOD => 'authentication_method',
- PropertyConst::AUTHENTICATION_DATA => 'authentication_data',
- PropertyConst::REQUEST_PROBLEM_INFORMATION => 'request_problem_information',
- PropertyConst::REQUEST_RESPONSE_INFORMATION => 'request_response_information',
- PropertyConst::RECEIVE_MAXIMUM => 'receive_maximum',
- PropertyConst::TOPIC_ALIAS_MAXIMUM => 'topic_alias_maximum',
- PropertyConst::USER_PROPERTY => 'user_property',
- PropertyConst::MAXIMUM_PACKET_SIZE => 'maximum_packet_size',
- ];
-
- /**
- * CONNACK 在可变头部中包含的属性有
- * @var string[]
- */
- public static $connAck = [
- PropertyConst::SESSION_EXPIRY_INTERVAL => 'session_expiry_interval',
- PropertyConst::ASSIGNED_CLIENT_IDENTIFIER => 'assigned_client_identifier',
- PropertyConst::SERVER_KEEP_ALIVE => 'server_keep_alive',
- PropertyConst::AUTHENTICATION_METHOD => 'authentication_method',
- PropertyConst::AUTHENTICATION_DATA => 'authentication_data',
- PropertyConst::RESPONSE_INFORMATION => 'response_information',
- PropertyConst::SERVER_REFERENCE => 'server_reference',
- PropertyConst::REASON_STRING => 'reason_string',
- PropertyConst::RECEIVE_MAXIMUM => 'receive_maximum',
- PropertyConst::TOPIC_ALIAS_MAXIMUM => 'topic_alias_maximum',
- PropertyConst::MAXIMUM_QOS => 'maximum_qos',
- PropertyConst::RETAIN_AVAILABLE => 'retain_available',
- PropertyConst::USER_PROPERTY => 'user_property',
- PropertyConst::MAXIMUM_PACKET_SIZE => 'maximum_packet_size',
- PropertyConst::WILDCARD_SUBSCRIPTION_AVAILABLE => 'wildcard_subscription_available',
- PropertyConst::SUBSCRIPTION_IDENTIFIER_AVAILABLE => 'subscription_identifier_available',
- PropertyConst::SHARED_SUBSCRIPTION_AVAILABLE => 'shared_subscription_available',
- ];
-
- /**
- * PUBLISH 报文携带 Payload,在可变头部的属性有
- * @var string[]
- */
- public static $publish = [
- PropertyConst::PAYLOAD_FORMAT_INDICATOR => 'payload_format_indicator',
- PropertyConst::MESSAGE_EXPIRY_INTERVAL => 'message_expiry_interval',
- PropertyConst::CONTENT_TYPE => 'content_type',
- PropertyConst::RESPONSE_TOPIC => 'response_topic',
- PropertyConst::CORRELATION_DATA => 'correlation_data',
- PropertyConst::SUBSCRIPTION_IDENTIFIER => 'subscription_identifier',
- PropertyConst::TOPIC_ALIAS => 'topic_alias',
- PropertyConst::USER_PROPERTY => 'user_property',
- ];
-
- /**
- * pubAck, pubRec, pubRel, pubComp, subAck, unSubAck 都具备以下属性
- */
- public static $pubAndSub = [
- PropertyConst::REASON_STRING => 'reason_string',
- PropertyConst::USER_PROPERTY => 'user_property',
- ];
-
- /**
- * SUBSCRIBE 报文携带 Payload,属性同样存在可变头部中
- * @var string[]
- */
- public static $subscribe = [
- PropertyConst::SUBSCRIPTION_IDENTIFIER => 'subscription_identifier',
- PropertyConst::USER_PROPERTY => 'user_property',
- ];
-
- /**
- * UNSUBSCRIBE 报文携带 Payload,仅有两个属性:属性长度和用户属性
- * @var string[]
- */
- public static $unSubscribe = [
- PropertyConst::USER_PROPERTY => 'user_property',
- ];
-
- /**
- * DISCONNECT 报文是 MQTT 5.0 新增的报文,它的引入意味着 mqtt broker 拥有了主动断开连接的能力。
- * DISCONNECT 报文所具备的属性有
- * @var string[]
- */
- public static $disConnect = [
- PropertyConst::SESSION_EXPIRY_INTERVAL => 'session_expiry_interval',
- PropertyConst::SERVER_REFERENCE => 'server_reference',
- PropertyConst::REASON_STRING => 'reason_string',
- PropertyConst::USER_PROPERTY => 'user_property',
- ];
-
- public static $auth = [
- PropertyConst::AUTHENTICATION_METHOD => 'authentication_method',
- PropertyConst::AUTHENTICATION_DATA => 'authentication_data',
- PropertyConst::REASON_STRING => 'reason_string',
- PropertyConst::USER_PROPERTY => 'user_property',
- ];
-
- public static $willProperties = [
- PropertyConst::PAYLOAD_FORMAT_INDICATOR => 'payload_format_indicator',
- PropertyConst::MESSAGE_EXPIRY_INTERVAL => 'message_expiry_interval',
- PropertyConst::CONTENT_TYPE => 'content_type',
- PropertyConst::RESPONSE_TOPIC => 'response_topic',
- PropertyConst::CORRELATION_DATA => 'correlation_data',
- PropertyConst::WILL_DELAY_INTERVAL => 'will_delay_interval',
- PropertyConst::USER_PROPERTY => 'user_property',
- ];
-}
diff --git a/vendor/workerman/mqtt/src/Handle/Property/UnPackProperty.php b/vendor/workerman/mqtt/src/Handle/Property/UnPackProperty.php
deleted file mode 100644
index d6e3834..0000000
--- a/vendor/workerman/mqtt/src/Handle/Property/UnPackProperty.php
+++ /dev/null
@@ -1,368 +0,0 @@
- 0);
-
- return $properties;
- }
-
- public static function willProperties(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$willProperties[$property])) {
- $key = PacketMap::$willProperties[$property];
- $body = substr($body, 1);
- switch ($property) {
- case Property::MESSAGE_EXPIRY_INTERVAL:
- case Property::WILL_DELAY_INTERVAL:
- $properties[$key] = Decoder::longInt($body);
- $length -= 5;
- break;
- case Property::CONTENT_TYPE:
- case Property::RESPONSE_TOPIC:
- case Property::CORRELATION_DATA:
- $properties[$key] = Decoder::readString($body);
- $length -= 3;
- $length -= strlen($properties[$key]);
- break;
- case Property::PAYLOAD_FORMAT_INDICATOR:
- $properties[$key] = Decoder::byte($body);
- $length -= 2;
- break;
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-
- public static function connAck(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$connAck[$property])) {
- $key = PacketMap::$connAck[$property];
- $body = substr($body, 1);
- switch ($property) {
- case Property::SESSION_EXPIRY_INTERVAL:
- case Property::MAXIMUM_PACKET_SIZE:
- $properties[$key] = Decoder::longInt($body);
- $length -= 5;
- break;
- case Property::SERVER_KEEP_ALIVE:
- case Property::RECEIVE_MAXIMUM:
- case Property::TOPIC_ALIAS_MAXIMUM:
- $properties[$key] = Decoder::shortInt($body);
- $length -= 3;
- break;
- case Property::ASSIGNED_CLIENT_IDENTIFIER:
- case Property::AUTHENTICATION_METHOD:
- case Property::AUTHENTICATION_DATA:
- case Property::RESPONSE_INFORMATION:
- case Property::SERVER_REFERENCE:
- case Property::REASON_STRING:
- $properties[$key] = Decoder::readString($body);
- $length -= 3;
- $length -= strlen($properties[$key]);
- break;
- case Property::MAXIMUM_QOS:
- case Property::RETAIN_AVAILABLE:
- case Property::WILDCARD_SUBSCRIPTION_AVAILABLE:
- case Property::SUBSCRIPTION_IDENTIFIER_AVAILABLE:
- case Property::SHARED_SUBSCRIPTION_AVAILABLE:
- $properties[$key] = Decoder::byte($body);
- $length -= 2;
- break;
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-
- public static function publish(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$publish[$property])) {
- $key = PacketMap::$publish[$property];
- $body = substr($body, 1);
- switch ($property) {
- case Property::MESSAGE_EXPIRY_INTERVAL:
- $properties[$key] = Decoder::longInt($body);
- $length -= 5;
- break;
- case Property::TOPIC_ALIAS:
- $properties[$key] = Decoder::shortInt($body);
- $length -= 3;
- break;
- case Property::CONTENT_TYPE:
- case Property::RESPONSE_TOPIC:
- case Property::CORRELATION_DATA:
- $properties[$key] = Decoder::readString($body);
- $length -= 3;
- $length -= strlen($properties[$key]);
- break;
- case Property::PAYLOAD_FORMAT_INDICATOR:
- $properties[$key] = Decoder::byte($body);
- $length -= 2;
- break;
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- case Property::SUBSCRIPTION_IDENTIFIER:
- $length -= 1;
- $properties[$key] = Decoder::varInt($body, $len);
- $length -= $len;
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-
- public static function pubAndSub(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$pubAndSub[$property])) {
- $key = PacketMap::$pubAndSub[$property];
- $body = substr($body, 1);
- switch ($property) {
- case Property::REASON_STRING:
- $properties[$key] = Decoder::readString($body);
- $length -= 3;
- $length -= strlen($properties[$key]);
- break;
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-
- public static function subscribe(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$subscribe[$property])) {
- $key = PacketMap::$subscribe[$property];
- $body = substr($body, 1);
- switch ($property) {
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- case Property::SUBSCRIPTION_IDENTIFIER:
- $length -= 1;
- $properties[$key] = Decoder::varInt($body, $len);
- $length -= $len;
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-
- public static function unSubscribe(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$unSubscribe[$property])) {
- $body = substr($body, 1);
- switch ($property) {
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-
- public static function disConnect(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$disConnect[$property])) {
- $key = PacketMap::$disConnect[$property];
- $body = substr($body, 1);
- switch ($property) {
- case Property::SESSION_EXPIRY_INTERVAL:
- $properties[$key] = Decoder::longInt($body);
- $length -= 5;
- break;
- case Property::SERVER_REFERENCE:
- case Property::REASON_STRING:
- $properties[$key] = Decoder::readString($body);
- $length -= 3;
- $length -= strlen($properties[$key]);
- break;
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-
- public static function auth(int $length, string &$body): array
- {
- $properties = [];
- do {
- $property = ord($body[0]);
- if (isset(PacketMap::$auth[$property])) {
- $key = PacketMap::$auth[$property];
- $body = substr($body, 1);
- switch ($property) {
- case Property::AUTHENTICATION_METHOD:
- case Property::AUTHENTICATION_DATA:
- case Property::REASON_STRING:
- $properties[$key] = Decoder::readString($body);
- $length -= 3;
- $length -= strlen($properties[$key]);
- break;
- case Property::USER_PROPERTY:
- $userKey = Decoder::readString($body);
- $userValue = Decoder::readString($body);
- $properties[$userKey] = $userValue;
- $length -= 5;
- $length -= strlen($userKey);
- $length -= strlen($userValue);
- break;
- }
- } else {
- $errType = dechex($property);
- throw new \InvalidArgumentException("Property [0x{$errType}] not exist");
- }
- } while ($length > 0);
-
- return $properties;
- }
-}
\ No newline at end of file
diff --git a/vendor/workerman/mqtt/src/Protocols/Mqtt.php b/vendor/workerman/mqtt/src/Protocols/Mqtt.php
deleted file mode 100644
index 90a9a89..0000000
--- a/vendor/workerman/mqtt/src/Protocols/Mqtt.php
+++ /dev/null
@@ -1,479 +0,0 @@
-
- * @copyright walkor
- * @link http://www.workerman.net/
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
- */
-namespace Workerman\Mqtt\Protocols;
-
-/**
- * Mqtt Protocol.
- *
- * @author walkor
- */
-class Mqtt
-{
-
- /**
- * CONNECT Packet.
- */
- const CMD_CONNECT = 1;
-
- /**
- * CONNACK
- */
- const CMD_CONNACK = 2;
-
- /**
- * PUBLISH
- */
- const CMD_PUBLISH = 3;
-
- /**
- * PUBACK
- */
- const CMD_PUBACK = 4;
-
- /**
- * PUBREC
- */
- const CMD_PUBREC = 5;
-
- /**
- * PUBREL
- */
- const CMD_PUBREL = 6;
-
- /**
- * PUBCOMP
- */
- const CMD_PUBCOMP = 7;
-
- /**
- * SUBSCRIBE
- */
- const CMD_SUBSCRIBE = 8;
-
- /**
- * SUBACK
- */
- const CMD_SUBACK = 9;
-
- /**
- * UNSUBSCRIBE
- */
- const CMD_UNSUBSCRIBE = 10;
-
- /**
- * UNSUBACK
- */
- const CMD_UNSUBACK = 11;
-
- /**
- * PINGREQ
- */
- const CMD_PINGREQ = 12;
-
- /**
- * PINGRESP
- */
- const CMD_PINGRESP = 13;
-
- /**
- * DISCONNECT
- */
- const CMD_DISCONNECT = 14;
-
- /**
- * Check the integrity of the package.
- *
- * @param string $buffer
- * @return int
- */
- public static function input($buffer)
- {
- $length = strlen($buffer);
- $body_length = static::getBodyLength($buffer, $head_bytes);
- $total_length = $body_length + $head_bytes;
- if ($length < $total_length) {
- return 0;
- }
-
- return $total_length;
- }
-
- /**
- * Encode.
- *
- * @param string $buffer
- * @return string
- */
- public static function encode($data)
- {
- $cmd = $data['cmd'];
- switch ($data['cmd']) {
- // ['cmd'=>1, 'clean_session'=>x, 'will'=>['qos'=>x, 'retain'=>x, 'topic'=>x, 'content'=>x],'username'=>x, 'password'=>x, 'keepalive'=>x, 'protocol_name'=>x, 'protocol_level'=>x, 'client_id' => x]
- case static::CMD_CONNECT;
- $body = self::packString($data['protocol_name']).chr($data['protocol_level']);
- $connect_flags = 0;
- if (!empty($data['clean_session'])) {
- $connect_flags |= 1 << 1;
- }
- if (!empty($data['will'])) {
- $connect_flags |= 1 << 2;
- $connect_flags |= $data['will']['qos'] << 3;
- if ($data['will']['retain']) {
- $connect_flags |= 1 << 5;
- }
- }
- if (!empty($data['password'])) {
- $connect_flags |= 1 << 6;
- }
- if (!empty($data['username'])) {
- $connect_flags |= 1 << 7;
- }
- $body .= chr($connect_flags);
-
- $keepalive = !empty($data['keepalive']) && (int)$data['keepalive'] >= 0 ? (int)$data['keepalive'] : 0;
- $body .= pack('n', $keepalive);
-
- $body .= static::packString($data['client_id']);
- if (!empty($data['will'])) {
- $body .= static::packString($data['will']['topic']);
- $body .= static::packString($data['will']['content']);
- }
- if(!empty($data['username']) || $data['username'] === '0') {
- $body .= static::packString($data['username']);
- }
- if(!empty($data['password']) || $data['password'] === '0') {
- $body .= static::packString($data['password']);
- }
- $head = self::packHead($cmd, strlen($body));
- return $head.$body;
- //['cmd'=>2, 'session_present'=>0/1, 'code'=>x]
- case static::CMD_CONNACK:
- $body = !empty($data['session_present']) ? chr(1) : chr(0);
- $code = !empty($data['code']) ? $data['code'] : 0;
- $body .= chr($code);
- $head = static::packHead($cmd, strlen($body));
- return $head.$body;
- // ['cmd'=>3, 'message_id'=>x, 'topic'=>x, 'content'=>x, 'qos'=>0/1/2, 'dup'=>0/1, 'retain'=>0/1]
- case static::CMD_PUBLISH:
- $body = static::packString($data['topic']);
- $qos = isset($data['qos']) ? $data['qos'] : 0;
- if ($qos) {
- $body .= pack('n', $data['message_id']);
- }
- $body .= $data['content'];
- $dup = isset($data['dup']) ? $data['dup'] : 0;
- $retain = isset($data['retain']) ? $data['retain'] : 0;
- $head = static::packHead($cmd, strlen($body), $dup, $qos, $retain);
- return $head.$body;
- // ['cmd'=>x, 'message_id'=>x]
- case static::CMD_PUBACK:
- case static::CMD_PUBREC:
- case static::CMD_PUBREL:
- case static::CMD_PUBCOMP:
- $body = pack('n', $data['message_id']);
- if ($cmd === static::CMD_PUBREL) {
- $head = static::packHead($cmd, strlen($body), 0, 1);
- } else {
- $head = static::packHead($cmd, strlen($body));
- }
- return $head.$body;
-
- // ['cmd'=>8, 'message_id'=>x, 'topics'=>[topic=>qos, ..]]]
- case static::CMD_SUBSCRIBE:
- $id = $data['message_id'];
- $body = pack('n', $id);
- foreach($data['topics'] as $topic => $qos){
- $body .= self::packString($topic);
- $body .= chr($qos);
- }
- $head = static::packHead($cmd, strlen($body), 0, 1);
- return $head.$body;
- // ['cmd'=>9, 'message_id'=>x, 'codes'=>[x,x,..]]
- case static::CMD_SUBACK:
- $codes = $data['codes'];
- $body = pack('n', $data['message_id']).call_user_func_array('pack', array_merge(array('C*'), $codes));
- $head = static::packHead($cmd, strlen($body));
- return $head.$body;
-
- // ['cmd' => 10, 'message_id' => $message_id, 'topics' => $topics];
- case static::CMD_UNSUBSCRIBE:
- $body = pack('n', $data['message_id']);
- foreach ($data['topics'] as $topic) {
- $body .= static::packString($topic);
- }
- $head = static::packHead($cmd, strlen($body), 0, 1);
- return $head . $body;
- // ['cmd'=>11, 'message_id'=>x]
- case static::CMD_UNSUBACK:
- $body = pack('n', $data['message_id']);
- $head = static::packHead($cmd, strlen($body));
- return $head.$body;
-
- // ['cmd'=>x]
- case static::CMD_PINGREQ;
- case static::CMD_PINGRESP:
- case static::CMD_DISCONNECT:
- return static::packHead($cmd, 0);
- }
-
- }
-
- /**
- * Decode.
- *
- * @param string $buffer
- * @return string
- */
- public static function decode($buffer)
- {
- $cmd = static::getCmd($buffer);
- $body = static::getBody($buffer);
- switch ($cmd) {
- case static::CMD_CONNECT:
- $protocol_name = static::readString($body);
- $protocol_level = ord($body[0]);
- $clean_session = ord($body[1]) >> 1 & 0x1;
- $will_flag = ord($body[1]) >> 2 & 0x1;
- $will_qos = ord($body[1]) >> 3 & 0x3;
- $will_retain = ord($body[1]) >> 5 & 0x1;
- $password_flag = ord($body[1]) >> 6 & 0x1;
- $username_flag = ord($body[1]) >> 7 & 0x1;
- $body = substr($body, 2);
- $tmp = unpack('n', $body, $body);
- $keepalive = $tmp[1];
- $body = substr($body, 2);
- $client_id = static::readString($body);
- if ($will_flag) {
- $will_topic = static::readString($body);
- $will_content = static::readString($body);
- }
- $username = $password = '';
- if ($username_flag) {
- $username = static::readString($body);
- }
- if ($password_flag) {
- $password = static::readString($body);
- }
- // ['cmd'=>1, 'clean_session'=>x, 'will'=>['qos'=>x, 'retain'=>x, 'topic'=>x, 'content'=>x],'username'=>x, 'password'=>x, 'keepalive'=>x, 'protocol_name'=>x, 'protocol_level'=>x, 'client_id' => x]
- $package = array(
- 'cmd' => $cmd,
- 'protocol_name' => $protocol_name,
- 'protocol_level' => $protocol_level,
- 'clean_session' => $clean_session,
- 'will' => array(),
- 'username' => $username,
- 'password' => $password,
- 'keepalive' => $keepalive,
- 'client_id' => $client_id,
- );
- if ($will_flag) {
- $package['will'] = array(
- 'qos' => $will_qos,
- 'retain' => $will_retain,
- 'topic' => $will_topic,
- 'content' => $will_content
- );
- } else {
- unset($package['will']);
- }
- return $package;
- case static::CMD_CONNACK:
- $session_present = ord($body[0]) & 0x01;
- $code = ord($body[1]);
- return array('cmd' => $cmd, 'session_present' => $session_present, 'code' => $code);
- case static::CMD_PUBLISH:
- $dup = ord($buffer[0]) >> 3 & 0x1;
- $qos = ord($buffer[0]) >> 1 & 0x3;
- $retain = ord($buffer[0]) & 0x1;
- $topic = static::readString($body);
- if ($qos) {
- $message_id = static::readShortInt($body);
- }
- $package = array('cmd' => $cmd, 'topic' => $topic, 'content' => $body, 'dup' => $dup, 'qos' => $qos, 'retain' => $retain);
- if ($qos) {
- $package['message_id'] = $message_id;
- }
- return $package;
- case static::CMD_PUBACK:
- case static::CMD_PUBREC:
- case static::CMD_PUBREL:
- case static::CMD_PUBCOMP:
- $message_id = static::readShortInt($body);
- return array('cmd' => $cmd, 'message_id' => $message_id);
- case static::CMD_SUBSCRIBE:
- $message_id = static::readShortInt($body);
- $topics = array();
- while ($body) {
- $topic = static::readString($body);
- $qos = ord($body[0]);
- $topics[$topic] = $qos;
- $body = substr($body, 1);
- }
- return array('cmd' => $cmd, 'message_id' => $message_id, 'topics' => $topics);
- case static::CMD_SUBACK:
- $message_id = static::readShortInt($body);
- $tmp = unpack('C*', $body);
- $codes = array_values($tmp);
- return array('cmd' => $cmd, 'message_id'=> $message_id, 'codes' => $codes);
- case static::CMD_UNSUBSCRIBE:
- $message_id = static::readShortInt($body);
- $topics = array();
- while ($body) {
- $topic = static::readString($body);
- $topics[] = $topic;
- }
- return array('cmd' => $cmd, 'message_id' => $message_id, 'topics' => $topics);
- case static::CMD_UNSUBACK:
- $message_id = static::readShortInt($body);
- return array('cmd' => $cmd, 'message_id' => $message_id);
- case static::CMD_PINGREQ:
- case static::CMD_PINGRESP:
- case static::CMD_DISCONNECT:
- return array('cmd' => $cmd);
- }
- return $buffer;
- }
-
-
- /**
- * Pack string.
- *
- * @param $str
- * @return string
- */
- public static function packString($str){
- $len = strlen($str);
- return pack('n', $len).$str;
- }
-
- /**
- * Write body length.
- *
- * @param $len
- * @return string
- */
- protected static function writeBodyLength($len)
- {
- $string = "";
- do{
- $digit = $len % 128;
- $len = $len >> 7;
- // if there are more digits to encode, set the top bit of this digit
- if ( $len > 0 )
- $digit = ($digit | 0x80);
- $string .= chr($digit);
- }while ( $len > 0 );
- return $string;
- }
-
- /**
- * Get cmd.
- *
- * @param $buffer
- * @return int
- */
- public static function getCmd($buffer)
- {
- return ord($buffer[0]) >> 4;
- }
-
- /**
- * Get body length.
- *
- * @param $buffer
- * @param $head_bytes
- * @return int
- */
- public static function getBodyLength($buffer, &$head_bytes){
- $head_bytes = $multiplier = 1;
- $value = 0;
- do{
- if (!isset($buffer[$head_bytes])) {
- $head_bytes = 0;
- return 0;
- }
- $digit = ord($buffer[$head_bytes]);
- $value += ($digit & 127) * $multiplier;
- $multiplier *= 128;
- $head_bytes++;
- }while (($digit & 128) != 0);
- return $value;
- }
-
- /**
- * Get body.
- *
- * @param $buffer
- * @return string
- */
- public static function getBody($buffer)
- {
- $body_length = static::getBodyLength($buffer, $head_bytes);
- $buffer = substr($buffer, $head_bytes, $body_length);
- return $buffer;
- }
-
- /**
- * Read string from buffer.
- * @param $buffer
- * @return string
- */
- public static function readString(&$buffer) {
- $tmp = unpack('n', $buffer);
- $length = $tmp[1];
- if ($length + 2 > strlen($buffer)) {
- echo "buffer:".bin2hex($buffer)." lenth:$length not enough for unpackString\n";
- }
-
- $string = substr($buffer, 2, $length);
- $buffer = substr($buffer, $length + 2);
- return $string;
- }
-
- /**
- * Read unsigned short int from buffer.
- * @param $buffer
- * @return mixed
- */
- public static function readShortInt(&$buffer) {
- $tmp = unpack('n', $buffer);
- $buffer = substr($buffer, 2);
- return $tmp[1];
- }
-
- /**
- * packHead.
- * @param $cmd
- * @param $body_length
- * @param int $dup
- * @param int $qos
- * @param int $retain
- * @return string
- */
- public static function packHead($cmd, $body_length, $dup = 0, $qos = 0, $retain = 0)
- {
- $cmd = $cmd << 4;
- if ($dup) {
- $cmd |= 1 << 3;
- }
- if ($qos) {
- $cmd |= $qos << 1;
- }
- if ($retain) {
- $cmd |= 1;
- }
- return chr($cmd).static::writeBodyLength($body_length);
- }
-
-}
diff --git a/vendor/workerman/mqtt/src/Protocols/Mqtt5.php b/vendor/workerman/mqtt/src/Protocols/Mqtt5.php
deleted file mode 100644
index 2645973..0000000
--- a/vendor/workerman/mqtt/src/Protocols/Mqtt5.php
+++ /dev/null
@@ -1,179 +0,0 @@
-
- * @copyright walkor
- * @link http://www.workerman.net/
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
- */
-
-namespace Workerman\Mqtt\Protocols;
-
-use Workerman\Mqtt\Consts\MQTTConst;
-use Workerman\Mqtt\Handle\Decoder;
-use Workerman\Mqtt\Handle\DecodeV5;
-use Workerman\Mqtt\Handle\Encoder;
-use Workerman\Mqtt\Handle\EncodeV5;
-
-/**
- * Mqtt5 Protocol.
- *
- * @author maoxps
- */
-class Mqtt5
-{
- /**
- * Check the integrity of the package.
- *
- * 如果可以在$buffer中得到请求包的长度则返回整个包的长度
- * 否则返回0,表示需要更多的数据才能得到当前请求包的长度
- * 如果返回false或者负数,则代表错误的请求,则连接会断开
- * @param string $buffer
- * @return int
- */
- public static function input(string $buffer)
- {
- $length = strlen($buffer);
- $body_length = Decoder::getBodyLength($buffer, $head_bytes);
- $total_length = $body_length + $head_bytes;
- if ($length < $total_length) {
- return 0;
- }
-
- return $total_length;
- }
-
- /**
- * 用于请求打包
- *
- * 当需要向客户端发送数据即调用$connection->send($data);时
- * 会自动把$data用encode打包一次,变成符合协议的数据格式,然后再发送给客户端
- * 也就是说发送给客户端的数据会自动encode打包,无需业务代码中手动调用
- * @param array $data
- * @return string
- */
- public static function encode(array $data)
- {
- $cmd = $data['cmd'];
- switch ($cmd) {
- // ['cmd'=>1, 'clean_session'=>x, 'will'=>['qos'=>x, 'retain'=>x, 'topic'=>x, 'content'=>x],'username'=>x, 'password'=>x, 'keepalive'=>x, 'protocol_name'=>x, 'protocol_level'=>x, 'client_id' => x]
- case MQTTConst::CMD_CONNECT:
- $package = EncodeV5::connect($data);
- break;
- //['cmd'=>2, 'session_present'=>0/1, 'code'=>x]
- case MQTTConst::CMD_CONNACK:
- $package = EncodeV5::connAck($data);
- break;
- // ['cmd'=>3, 'message_id'=>x, 'topic'=>x, 'content'=>x, 'qos'=>0/1/2, 'dup'=>0/1, 'retain'=>0/1]
- case MQTTConst::CMD_PUBLISH:
- $package = EncodeV5::publish($data);
-// var_dump((new Debug($package))->hexDumpAscii());
- break;
- // ['cmd'=>x, 'message_id'=>x]
- case MQTTConst::CMD_PUBACK:
- case MQTTConst::CMD_PUBREC:
- case MQTTConst::CMD_PUBREL:
- case MQTTConst::CMD_PUBCOMP:
- $package = EncodeV5::genReasonPhrase($data);
- break;
- // ['cmd'=>8, 'message_id'=>x, 'topics'=>[topic=>qos, ..]]]
- case MQTTConst::CMD_SUBSCRIBE:
- $package = EncodeV5::subscribe($data);
- break;
- // ['cmd'=>9, 'message_id'=>x, 'codes'=>[x,x,..]]
- case MQTTConst::CMD_SUBACK:
- $package = EncodeV5::subAck($data);
- break;
- // ['cmd' => 10, 'message_id' => $message_id, 'topics' => $topics, 'properties'=>[]];
- case MQTTConst::CMD_UNSUBSCRIBE:
- $package = EncodeV5::unSubscribe($data);
- break;
- // ['cmd'=>11, 'message_id'=>x, 'properties'= []]
- case MQTTConst::CMD_UNSUBACK:
- $package = EncodeV5::unSubAck($data);
- break;
- // ['cmd'=>x]
- case MQTTConst::CMD_PINGREQ;
- case MQTTConst::CMD_PINGRESP:
- $package = Encoder::packHead($cmd, 0);
- break;
- case MQTTConst::CMD_DISCONNECT:
- $package = EncodeV5::disconnect($data);
- break;
- case MQTTConst::CMD_AUTH:
- $package = EncodeV5::auth($data);
- break;
- default:
- throw new \InvalidArgumentException('MQTT Type not exist');
- }
-
- return $package;
- }
-
- /**
- * 用于请求解包
- *
- * input返回值大于0,并且WorkerMan收到了足够的数据,则自动调用decode
- * 然后触发onMessage回调,并将decode解码后的数据传递给onMessage回调的第二个参数
- * 也就是说当收到完整的客户端请求时,会自动调用decode解码,无需业务代码中手动调用
- * @param string $buffer
- * @return array
- */
- public static function decode(string $buffer)
- {
-// var_dump((new Debug($buffer))->hexDumpAscii());
- $cmd = Decoder::getCmd($buffer);
- $body = Decoder::getBody($buffer);
- switch ($cmd) {
- // ['cmd'=>1, 'clean_session'=>x, 'will'=>['qos'=>x, 'retain'=>x, 'topic'=>x, 'content'=>x],'username'=>x, 'password'=>x, 'keepalive'=>x, 'protocol_name'=>x, 'protocol_level'=>x, 'client_id' => x]
- case MQTTConst::CMD_CONNECT:
- $package = DecodeV5::connect($body);
- break;
- case MQTTConst::CMD_CONNACK:
- $package = DecodeV5::connAck($body);
- break;
- case MQTTConst::CMD_PUBLISH:
- $dup = ord($buffer[0]) >> 3 & 0x1;
- $qos = ord($buffer[0]) >> 1 & 0x3;
- $retain = ord($buffer[0]) & 0x1;
- $package = DecodeV5::publish($dup, $qos, $retain, $body);
- break;
- case MQTTConst::CMD_PUBACK:
- case MQTTConst::CMD_PUBREC:
- case MQTTConst::CMD_PUBREL:
- case MQTTConst::CMD_PUBCOMP:
- $package = DecodeV5::getReasonCode($cmd, $body);
- break;
- case MQTTConst::CMD_PINGREQ:
- case MQTTConst::CMD_PINGRESP:
- $package = ['cmd' => $cmd];
- break;
- case MQTTConst::CMD_DISCONNECT:
- $package = DecodeV5::disconnect($body);
- break;
- case MQTTConst::CMD_SUBSCRIBE:
- $package = DecodeV5::subscribe($body);
- break;
- case MQTTConst::CMD_SUBACK:
- $package = DecodeV5::subAck($body);
- break;
- case MQTTConst::CMD_UNSUBSCRIBE:
- $package = DecodeV5::unSubscribe($body);
- break;
- case MQTTConst::CMD_UNSUBACK:
- $package = DecodeV5::unSubAck($body);
- break;
- case MQTTConst::CMD_AUTH:
- $package = DecodeV5::auth($body);
- break;
- default:
- $package = [];
- }
- return $package;
- }
-}
diff --git a/vendor/workerman/mqtt/src/Tools/Common.php b/vendor/workerman/mqtt/src/Tools/Common.php
deleted file mode 100644
index cfd071a..0000000
--- a/vendor/workerman/mqtt/src/Tools/Common.php
+++ /dev/null
@@ -1,33 +0,0 @@
- 31) {
- $chr = $data[$i];
- } else {
- $chr = ' ';
- }
- printf("%4d: %08b : 0x%02x : %d : %s\n", $i, $ascii, $ascii, $ascii, $chr);
- }
- echo "\033[0m";
- }
-
- public static function __callStatic($method, $arguments)
- {
- return (new Debug())->setEncode(...$arguments)->{$method}();
- }
-}
diff --git a/vendor/workerman/mqtt/src/Tools/Debug.php b/vendor/workerman/mqtt/src/Tools/Debug.php
deleted file mode 100644
index 6d805d5..0000000
--- a/vendor/workerman/mqtt/src/Tools/Debug.php
+++ /dev/null
@@ -1,123 +0,0 @@
-encode = $encode;
- }
-
- public function setEncode(string $encode): self
- {
- $this->encode = $encode;
-
- return $this;
- }
-
- public function getEncode(): string
- {
- return $this->encode;
- }
-
- public function hexDump(): string
- {
- return $this->toHexDump($this->getEncode());
- }
-
- public function hexDumpAscii(): string
- {
- return $this->toHexDump($this->getEncode(), true);
- }
-
- public function ascii(): string
- {
- return $this->toAscii($this->getEncode());
- }
-
- public function printableText(): string
- {
- return $this->getEncode();
- }
-
- public function hexStream(): string
- {
- return bin2hex($this->getEncode());
- }
-
- private function toHexDump(string $contents, bool $hasAscii = false): string
- {
- $address = $column = 0;
- $result = $hexDump = $asciiDump = '';
-
- $sprintf = '%08x %-48s';
-
- if ($hasAscii) {
- $sprintf = '%08x %-48s %s';
- }
-
- foreach (str_split($contents) as $c) {
- $hexDump = $hexDump . sprintf('%02x ', ord($c));
- if ($hasAscii) {
- if (ord($c) > 31 && ord($c) < 128) {
- $asciiDump .= $c;
- } else {
- $asciiDump .= '.';
- }
- }
- $column++;
- if (($column % 16) == 0) {
- $line = sprintf($sprintf, $address, $hexDump, $asciiDump);
- $result .= $line . PHP_EOL;
-
- $asciiDump = '';
- $hexDump = '';
- $column = 0;
- $address += 16;
- }
- }
-
- if ($column > 0) {
- $line = sprintf($sprintf, $address, $hexDump, $asciiDump);
- $result .= $line;
- }
-
- return $result;
- }
-
- private function toAscii(string $contents): string
- {
- $address = $column = 0;
- $result = $asciiDump = '';
-
- $sprintf = '%08x %s';
-
- foreach (str_split($contents) as $c) {
- if (ord($c) > 31 && ord($c) < 128) {
- $asciiDump .= $c;
- } else {
- $asciiDump .= '.';
- }
-
- $column++;
- if (($column % 16) == 0) {
- $line = sprintf($sprintf, $address, $asciiDump);
- $result .= $line . PHP_EOL;
-
- $asciiDump = '';
- $column = 0;
- $address += 16;
- }
- }
-
- if ($column > 0) {
- $line = sprintf($sprintf, $address, $asciiDump);
- $result .= $line;
- }
-
- return $result;
- }
-}