From 01493f4ea73a6a8d5a92fb0d9d1324e3685f823d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E8=82=B2=E6=94=BF?= Date: Sat, 5 Nov 2022 14:22:32 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=8F=92=E4=BB=B6=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/client/cmd/plugin.go | 2 +- src/modules/client/cmd/pluginPull.go | 2 +- src/modules/client/cmd/pluginUpdate.go | 2 +- src/modules/client/cmd/pluginVersion.go | 2 +- src/modules/general/http/controllers/host.go | 19 + .../controllers/{plugin.go => plugin/job.go} | 35 +- .../general/http/controllers/plugin/list.go | 21 + .../general/http/controllers/plugin/pull.go | 29 + .../general/http/controllers/tasking.go | 1 - src/modules/general/http/routers.go | 8 +- src/modules/general/rpc/scout.go | 12 +- .../DeanThompson/ginpprof/.gitignore | 24 - .../DeanThompson/ginpprof/.travis.yml | 12 - .../github.com/DeanThompson/ginpprof/LICENSE | 22 - .../DeanThompson/ginpprof/README.md | 68 - .../github.com/DeanThompson/ginpprof/pprof.go | 131 - vendor/github.com/axgle/mahonia/8bit.go | 842 - vendor/github.com/axgle/mahonia/ASCII.go | 76 - vendor/github.com/axgle/mahonia/LICENSE | 2 - vendor/github.com/axgle/mahonia/README.md | 30 - vendor/github.com/axgle/mahonia/big5-data.go | 13707 ----- vendor/github.com/axgle/mahonia/big5.go | 89 - vendor/github.com/axgle/mahonia/charset.go | 112 - .../axgle/mahonia/convert_string.go | 56 - vendor/github.com/axgle/mahonia/entity.go | 196 - .../github.com/axgle/mahonia/entity_data.go | 2253 - vendor/github.com/axgle/mahonia/euc-jp.go | 75 - vendor/github.com/axgle/mahonia/fallback.go | 19 - .../github.com/axgle/mahonia/gb18030-data.go | 6839 --- vendor/github.com/axgle/mahonia/gb18030.go | 156 - vendor/github.com/axgle/mahonia/gbk-data.go | 47922 ---------------- vendor/github.com/axgle/mahonia/gbk.go | 77 - .../github.com/axgle/mahonia/jis0201-data.go | 162 - .../github.com/axgle/mahonia/jis0208-data.go | 6883 --- .../github.com/axgle/mahonia/jis0212-data.go | 6071 -- vendor/github.com/axgle/mahonia/mbcs.go | 92 - vendor/github.com/axgle/mahonia/reader.go | 151 - vendor/github.com/axgle/mahonia/shiftjis.go | 70 - vendor/github.com/axgle/mahonia/translate.go | 50 - vendor/github.com/axgle/mahonia/utf16.go | 170 - vendor/github.com/axgle/mahonia/utf8.go | 45 - vendor/github.com/axgle/mahonia/writer.go | 108 - .../github.com/chenhg5/collection/.gitignore | 1 - .../github.com/chenhg5/collection/.travis.yml | 7 - vendor/github.com/chenhg5/collection/LICENSE | 21 - .../github.com/chenhg5/collection/README.md | 46 - .../chenhg5/collection/base_collection.go | 446 - .../chenhg5/collection/collection.go | 669 - vendor/github.com/chenhg5/collection/go.mod | 9 - vendor/github.com/chenhg5/collection/go.sum | 6 - .../collection/map_array_collection.go | 845 - .../chenhg5/collection/map_collection.go | 301 - .../muti_dimensional_array_collection.go | 65 - .../collection/number_array_collection.go | 721 - .../collection/string_array_collection.go | 672 - vendor/github.com/fatih/color/LICENSE.md | 20 - vendor/github.com/fatih/color/README.md | 182 - vendor/github.com/fatih/color/color.go | 603 - vendor/github.com/fatih/color/doc.go | 133 - vendor/github.com/fatih/color/go.mod | 8 - vendor/github.com/fatih/color/go.sum | 8 - vendor/github.com/gin-contrib/sse/.travis.yml | 26 - vendor/github.com/gin-contrib/sse/LICENSE | 21 - vendor/github.com/gin-contrib/sse/README.md | 58 - vendor/github.com/gin-contrib/sse/go.mod | 5 - vendor/github.com/gin-contrib/sse/go.sum | 7 - .../github.com/gin-contrib/sse/sse-decoder.go | 116 - .../github.com/gin-contrib/sse/sse-encoder.go | 110 - vendor/github.com/gin-contrib/sse/writer.go | 24 - vendor/github.com/gin-gonic/gin/.gitignore | 7 - vendor/github.com/gin-gonic/gin/.travis.yml | 50 - vendor/github.com/gin-gonic/gin/AUTHORS.md | 233 - vendor/github.com/gin-gonic/gin/BENCHMARKS.md | 666 - vendor/github.com/gin-gonic/gin/CHANGELOG.md | 406 - .../gin-gonic/gin/CODE_OF_CONDUCT.md | 46 - .../github.com/gin-gonic/gin/CONTRIBUTING.md | 13 - vendor/github.com/gin-gonic/gin/LICENSE | 21 - vendor/github.com/gin-gonic/gin/Makefile | 71 - vendor/github.com/gin-gonic/gin/README.md | 2217 - vendor/github.com/gin-gonic/gin/auth.go | 91 - .../gin-gonic/gin/binding/binding.go | 118 - .../gin/binding/binding_nomsgpack.go | 112 - .../gin/binding/default_validator.go | 85 - .../github.com/gin-gonic/gin/binding/form.go | 63 - .../gin-gonic/gin/binding/form_mapping.go | 392 - .../gin-gonic/gin/binding/header.go | 34 - .../github.com/gin-gonic/gin/binding/json.go | 56 - .../gin-gonic/gin/binding/msgpack.go | 38 - .../gin/binding/multipart_form_mapping.go | 66 - .../gin-gonic/gin/binding/protobuf.go | 36 - .../github.com/gin-gonic/gin/binding/query.go | 21 - .../github.com/gin-gonic/gin/binding/uri.go | 18 - .../github.com/gin-gonic/gin/binding/xml.go | 33 - .../github.com/gin-gonic/gin/binding/yaml.go | 35 - vendor/github.com/gin-gonic/gin/codecov.yml | 5 - vendor/github.com/gin-gonic/gin/context.go | 1180 - .../gin-gonic/gin/context_appengine.go | 12 - vendor/github.com/gin-gonic/gin/debug.go | 103 - vendor/github.com/gin-gonic/gin/deprecated.go | 21 - vendor/github.com/gin-gonic/gin/doc.go | 6 - vendor/github.com/gin-gonic/gin/errors.go | 174 - vendor/github.com/gin-gonic/gin/fs.go | 45 - vendor/github.com/gin-gonic/gin/gin.go | 577 - vendor/github.com/gin-gonic/gin/go.mod | 14 - vendor/github.com/gin-gonic/gin/go.sum | 52 - .../gin/internal/bytesconv/bytesconv.go | 24 - .../gin-gonic/gin/internal/json/json.go | 23 - .../gin-gonic/gin/internal/json/jsoniter.go | 24 - vendor/github.com/gin-gonic/gin/logger.go | 271 - vendor/github.com/gin-gonic/gin/mode.go | 92 - vendor/github.com/gin-gonic/gin/path.go | 150 - vendor/github.com/gin-gonic/gin/recovery.go | 171 - .../github.com/gin-gonic/gin/render/data.go | 25 - .../github.com/gin-gonic/gin/render/html.go | 92 - .../github.com/gin-gonic/gin/render/json.go | 193 - .../gin-gonic/gin/render/msgpack.go | 42 - .../gin-gonic/gin/render/protobuf.go | 36 - .../github.com/gin-gonic/gin/render/reader.go | 48 - .../gin-gonic/gin/render/redirect.go | 29 - .../github.com/gin-gonic/gin/render/render.go | 40 - .../github.com/gin-gonic/gin/render/text.go | 41 - vendor/github.com/gin-gonic/gin/render/xml.go | 28 - .../github.com/gin-gonic/gin/render/yaml.go | 36 - .../gin-gonic/gin/response_writer.go | 126 - .../github.com/gin-gonic/gin/routergroup.go | 230 - .../github.com/gin-gonic/gin/test_helpers.go | 16 - vendor/github.com/gin-gonic/gin/tree.go | 777 - vendor/github.com/gin-gonic/gin/utils.go | 153 - vendor/github.com/gin-gonic/gin/version.go | 8 - .../go-playground/locales/.gitignore | 24 - .../go-playground/locales/.travis.yml | 26 - .../github.com/go-playground/locales/LICENSE | 21 - .../go-playground/locales/README.md | 172 - .../locales/currency/currency.go | 308 - .../github.com/go-playground/locales/go.mod | 5 - .../github.com/go-playground/locales/go.sum | 3 - .../github.com/go-playground/locales/logo.png | Bin 37360 -> 0 bytes .../github.com/go-playground/locales/rules.go | 293 - .../universal-translator/.gitignore | 25 - .../universal-translator/.travis.yml | 27 - .../universal-translator/LICENSE | 21 - .../universal-translator/README.md | 89 - .../universal-translator/errors.go | 148 - .../go-playground/universal-translator/go.mod | 5 - .../go-playground/universal-translator/go.sum | 4 - .../universal-translator/import_export.go | 274 - .../universal-translator/logo.png | Bin 16598 -> 0 bytes .../universal-translator/translator.go | 420 - .../universal_translator.go | 113 - .../go-playground/validator/v10/.gitignore | 30 - .../go-playground/validator/v10/.travis.yml | 29 - .../go-playground/validator/v10/LICENSE | 22 - .../go-playground/validator/v10/Makefile | 18 - .../go-playground/validator/v10/README.md | 299 - .../go-playground/validator/v10/baked_in.go | 2285 - .../go-playground/validator/v10/cache.go | 322 - .../validator/v10/country_codes.go | 162 - .../go-playground/validator/v10/doc.go | 1308 - .../go-playground/validator/v10/errors.go | 275 - .../validator/v10/field_level.go | 119 - .../go-playground/validator/v10/go.mod | 11 - .../go-playground/validator/v10/go.sum | 28 - .../go-playground/validator/v10/logo.png | Bin 13443 -> 0 bytes .../go-playground/validator/v10/regexes.go | 101 - .../validator/v10/struct_level.go | 175 - .../validator/v10/translations.go | 11 - .../go-playground/validator/v10/util.go | 288 - .../go-playground/validator/v10/validator.go | 477 - .../validator/v10/validator_instance.go | 619 - .../github.com/go-sql-driver/mysql/.gitignore | 9 - .../go-sql-driver/mysql/.travis.yml | 129 - vendor/github.com/go-sql-driver/mysql/AUTHORS | 105 - .../go-sql-driver/mysql/CHANGELOG.md | 206 - vendor/github.com/go-sql-driver/mysql/LICENSE | 373 - .../github.com/go-sql-driver/mysql/README.md | 501 - vendor/github.com/go-sql-driver/mysql/auth.go | 422 - .../github.com/go-sql-driver/mysql/buffer.go | 182 - .../go-sql-driver/mysql/collations.go | 265 - .../go-sql-driver/mysql/conncheck.go | 54 - .../go-sql-driver/mysql/conncheck_dummy.go | 17 - .../go-sql-driver/mysql/connection.go | 651 - .../go-sql-driver/mysql/connector.go | 146 - .../github.com/go-sql-driver/mysql/const.go | 174 - .../github.com/go-sql-driver/mysql/driver.go | 107 - vendor/github.com/go-sql-driver/mysql/dsn.go | 560 - .../github.com/go-sql-driver/mysql/errors.go | 65 - .../github.com/go-sql-driver/mysql/fields.go | 194 - vendor/github.com/go-sql-driver/mysql/go.mod | 3 - .../github.com/go-sql-driver/mysql/infile.go | 182 - .../go-sql-driver/mysql/nulltime.go | 50 - .../go-sql-driver/mysql/nulltime_go113.go | 31 - .../go-sql-driver/mysql/nulltime_legacy.go | 34 - .../github.com/go-sql-driver/mysql/packets.go | 1342 - .../github.com/go-sql-driver/mysql/result.go | 22 - vendor/github.com/go-sql-driver/mysql/rows.go | 223 - .../go-sql-driver/mysql/statement.go | 204 - .../go-sql-driver/mysql/transaction.go | 31 - .../github.com/go-sql-driver/mysql/utils.go | 701 - vendor/github.com/golang/protobuf/AUTHORS | 3 - .../github.com/golang/protobuf/CONTRIBUTORS | 3 - vendor/github.com/golang/protobuf/LICENSE | 28 - .../github.com/golang/protobuf/proto/clone.go | 253 - .../golang/protobuf/proto/decode.go | 427 - .../golang/protobuf/proto/deprecated.go | 63 - .../golang/protobuf/proto/discard.go | 350 - .../golang/protobuf/proto/encode.go | 203 - .../github.com/golang/protobuf/proto/equal.go | 301 - .../golang/protobuf/proto/extensions.go | 607 - .../github.com/golang/protobuf/proto/lib.go | 965 - .../golang/protobuf/proto/message_set.go | 181 - .../golang/protobuf/proto/pointer_reflect.go | 360 - .../golang/protobuf/proto/pointer_unsafe.go | 313 - .../golang/protobuf/proto/properties.go | 544 - .../golang/protobuf/proto/table_marshal.go | 2776 - .../golang/protobuf/proto/table_merge.go | 654 - .../golang/protobuf/proto/table_unmarshal.go | 2053 - .../github.com/golang/protobuf/proto/text.go | 845 - .../golang/protobuf/proto/text_parser.go | 880 - .../inconshreveable/mousetrap/LICENSE | 13 - .../inconshreveable/mousetrap/README.md | 23 - .../inconshreveable/mousetrap/trap_others.go | 15 - .../inconshreveable/mousetrap/trap_windows.go | 98 - .../mousetrap/trap_windows_1.4.go | 46 - vendor/github.com/jinzhu/gorm/.gitignore | 3 - vendor/github.com/jinzhu/gorm/License | 21 - vendor/github.com/jinzhu/gorm/README.md | 3 - vendor/github.com/jinzhu/gorm/association.go | 377 - vendor/github.com/jinzhu/gorm/callback.go | 250 - .../github.com/jinzhu/gorm/callback_create.go | 197 - .../github.com/jinzhu/gorm/callback_delete.go | 63 - .../github.com/jinzhu/gorm/callback_query.go | 109 - .../jinzhu/gorm/callback_query_preload.go | 410 - .../jinzhu/gorm/callback_row_query.go | 41 - .../github.com/jinzhu/gorm/callback_save.go | 170 - .../github.com/jinzhu/gorm/callback_update.go | 121 - vendor/github.com/jinzhu/gorm/dialect.go | 147 - .../github.com/jinzhu/gorm/dialect_common.go | 196 - .../github.com/jinzhu/gorm/dialect_mysql.go | 246 - .../jinzhu/gorm/dialect_postgres.go | 147 - .../github.com/jinzhu/gorm/dialect_sqlite3.go | 107 - .../github.com/jinzhu/gorm/docker-compose.yml | 30 - vendor/github.com/jinzhu/gorm/errors.go | 72 - vendor/github.com/jinzhu/gorm/field.go | 66 - vendor/github.com/jinzhu/gorm/go.mod | 14 - vendor/github.com/jinzhu/gorm/go.sum | 33 - vendor/github.com/jinzhu/gorm/interface.go | 24 - .../jinzhu/gorm/join_table_handler.go | 211 - vendor/github.com/jinzhu/gorm/logger.go | 141 - vendor/github.com/jinzhu/gorm/main.go | 881 - vendor/github.com/jinzhu/gorm/model.go | 14 - vendor/github.com/jinzhu/gorm/model_struct.go | 671 - vendor/github.com/jinzhu/gorm/naming.go | 124 - vendor/github.com/jinzhu/gorm/scope.go | 1425 - vendor/github.com/jinzhu/gorm/search.go | 153 - vendor/github.com/jinzhu/gorm/test_all.sh | 5 - vendor/github.com/jinzhu/gorm/utils.go | 226 - vendor/github.com/jinzhu/gorm/wercker.yml | 154 - vendor/github.com/jinzhu/inflection/LICENSE | 21 - vendor/github.com/jinzhu/inflection/README.md | 55 - vendor/github.com/jinzhu/inflection/go.mod | 1 - .../jinzhu/inflection/inflections.go | 273 - .../github.com/jinzhu/inflection/wercker.yml | 23 - .../github.com/json-iterator/go/.codecov.yml | 3 - vendor/github.com/json-iterator/go/.gitignore | 4 - .../github.com/json-iterator/go/.travis.yml | 14 - vendor/github.com/json-iterator/go/Gopkg.lock | 21 - vendor/github.com/json-iterator/go/Gopkg.toml | 26 - vendor/github.com/json-iterator/go/LICENSE | 21 - vendor/github.com/json-iterator/go/README.md | 87 - vendor/github.com/json-iterator/go/adapter.go | 150 - vendor/github.com/json-iterator/go/any.go | 325 - .../github.com/json-iterator/go/any_array.go | 278 - .../github.com/json-iterator/go/any_bool.go | 137 - .../github.com/json-iterator/go/any_float.go | 83 - .../github.com/json-iterator/go/any_int32.go | 74 - .../github.com/json-iterator/go/any_int64.go | 74 - .../json-iterator/go/any_invalid.go | 82 - vendor/github.com/json-iterator/go/any_nil.go | 69 - .../github.com/json-iterator/go/any_number.go | 123 - .../github.com/json-iterator/go/any_object.go | 374 - vendor/github.com/json-iterator/go/any_str.go | 166 - .../github.com/json-iterator/go/any_uint32.go | 74 - .../github.com/json-iterator/go/any_uint64.go | 74 - vendor/github.com/json-iterator/go/build.sh | 12 - vendor/github.com/json-iterator/go/config.go | 375 - .../go/fuzzy_mode_convert_table.md | 7 - vendor/github.com/json-iterator/go/go.mod | 11 - vendor/github.com/json-iterator/go/go.sum | 14 - vendor/github.com/json-iterator/go/iter.go | 349 - .../github.com/json-iterator/go/iter_array.go | 64 - .../github.com/json-iterator/go/iter_float.go | 339 - .../github.com/json-iterator/go/iter_int.go | 345 - .../json-iterator/go/iter_object.go | 267 - .../github.com/json-iterator/go/iter_skip.go | 130 - .../json-iterator/go/iter_skip_sloppy.go | 163 - .../json-iterator/go/iter_skip_strict.go | 99 - .../github.com/json-iterator/go/iter_str.go | 215 - .../github.com/json-iterator/go/jsoniter.go | 18 - vendor/github.com/json-iterator/go/pool.go | 42 - vendor/github.com/json-iterator/go/reflect.go | 337 - .../json-iterator/go/reflect_array.go | 104 - .../json-iterator/go/reflect_dynamic.go | 70 - .../json-iterator/go/reflect_extension.go | 483 - .../json-iterator/go/reflect_json_number.go | 112 - .../go/reflect_json_raw_message.go | 60 - .../json-iterator/go/reflect_map.go | 346 - .../json-iterator/go/reflect_marshaler.go | 225 - .../json-iterator/go/reflect_native.go | 453 - .../json-iterator/go/reflect_optional.go | 133 - .../json-iterator/go/reflect_slice.go | 99 - .../go/reflect_struct_decoder.go | 1092 - .../go/reflect_struct_encoder.go | 211 - vendor/github.com/json-iterator/go/stream.go | 211 - .../json-iterator/go/stream_float.go | 111 - .../github.com/json-iterator/go/stream_int.go | 190 - .../github.com/json-iterator/go/stream_str.go | 372 - vendor/github.com/json-iterator/go/test.sh | 12 - vendor/github.com/leodido/go-urn/.gitignore | 11 - vendor/github.com/leodido/go-urn/.travis.yml | 18 - vendor/github.com/leodido/go-urn/LICENSE | 21 - vendor/github.com/leodido/go-urn/README.md | 55 - vendor/github.com/leodido/go-urn/go.mod | 5 - vendor/github.com/leodido/go-urn/go.sum | 11 - vendor/github.com/leodido/go-urn/machine.go | 1691 - .../github.com/leodido/go-urn/machine.go.rl | 159 - vendor/github.com/leodido/go-urn/makefile | 39 - vendor/github.com/leodido/go-urn/urn.go | 63 - .../github.com/mattn/go-colorable/.travis.yml | 9 - vendor/github.com/mattn/go-colorable/LICENSE | 21 - .../github.com/mattn/go-colorable/README.md | 48 - .../mattn/go-colorable/colorable_appengine.go | 29 - .../mattn/go-colorable/colorable_others.go | 30 - .../mattn/go-colorable/colorable_windows.go | 1005 - vendor/github.com/mattn/go-colorable/go.mod | 3 - vendor/github.com/mattn/go-colorable/go.sum | 4 - .../mattn/go-colorable/noncolorable.go | 55 - vendor/github.com/mattn/go-isatty/.travis.yml | 14 - vendor/github.com/mattn/go-isatty/LICENSE | 9 - vendor/github.com/mattn/go-isatty/README.md | 50 - vendor/github.com/mattn/go-isatty/doc.go | 2 - vendor/github.com/mattn/go-isatty/go.mod | 5 - vendor/github.com/mattn/go-isatty/go.sum | 2 - vendor/github.com/mattn/go-isatty/go.test.sh | 12 - .../github.com/mattn/go-isatty/isatty_bsd.go | 18 - .../mattn/go-isatty/isatty_others.go | 15 - .../mattn/go-isatty/isatty_plan9.go | 22 - .../mattn/go-isatty/isatty_solaris.go | 22 - .../mattn/go-isatty/isatty_tcgets.go | 18 - .../mattn/go-isatty/isatty_windows.go | 125 - .../github.com/mattn/go-isatty/renovate.json | 8 - .../mitchellh/mapstructure/.travis.yml | 9 - .../mitchellh/mapstructure/CHANGELOG.md | 57 - .../github.com/mitchellh/mapstructure/LICENSE | 21 - .../mitchellh/mapstructure/README.md | 46 - .../mitchellh/mapstructure/decode_hooks.go | 217 - .../mitchellh/mapstructure/error.go | 50 - .../github.com/mitchellh/mapstructure/go.mod | 3 - .../mitchellh/mapstructure/mapstructure.go | 1396 - .../github.com/modern-go/concurrent/LICENSE | 201 - .../github.com/modern-go/concurrent/README.md | 2 - .../modern-go/concurrent/executor.go | 7 - .../modern-go/concurrent/go_above_19.go | 13 - .../modern-go/concurrent/go_below_19.go | 30 - .../concurrent/unbounded_executor.go | 99 - .../github.com/modern-go/reflect2/.gitignore | 2 - .../github.com/modern-go/reflect2/.travis.yml | 15 - .../github.com/modern-go/reflect2/Gopkg.lock | 15 - .../github.com/modern-go/reflect2/Gopkg.toml | 35 - vendor/github.com/modern-go/reflect2/LICENSE | 201 - .../github.com/modern-go/reflect2/README.md | 71 - .../modern-go/reflect2/go_above_17.go | 8 - .../modern-go/reflect2/go_above_19.go | 14 - .../modern-go/reflect2/go_below_17.go | 9 - .../modern-go/reflect2/go_below_19.go | 14 - .../github.com/modern-go/reflect2/reflect2.go | 298 - .../modern-go/reflect2/reflect2_amd64.s | 0 .../modern-go/reflect2/reflect2_kind.go | 30 - .../modern-go/reflect2/relfect2_386.s | 0 .../modern-go/reflect2/relfect2_amd64p32.s | 0 .../modern-go/reflect2/relfect2_arm.s | 0 .../modern-go/reflect2/relfect2_arm64.s | 0 .../modern-go/reflect2/relfect2_mips64x.s | 0 .../modern-go/reflect2/relfect2_mipsx.s | 0 .../modern-go/reflect2/relfect2_ppc64x.s | 0 .../modern-go/reflect2/relfect2_s390x.s | 0 .../modern-go/reflect2/safe_field.go | 58 - .../github.com/modern-go/reflect2/safe_map.go | 101 - .../modern-go/reflect2/safe_slice.go | 92 - .../modern-go/reflect2/safe_struct.go | 29 - .../modern-go/reflect2/safe_type.go | 78 - vendor/github.com/modern-go/reflect2/test.sh | 12 - .../github.com/modern-go/reflect2/type_map.go | 103 - .../modern-go/reflect2/unsafe_array.go | 65 - .../modern-go/reflect2/unsafe_eface.go | 59 - .../modern-go/reflect2/unsafe_field.go | 74 - .../modern-go/reflect2/unsafe_iface.go | 64 - .../modern-go/reflect2/unsafe_link.go | 70 - .../modern-go/reflect2/unsafe_map.go | 138 - .../modern-go/reflect2/unsafe_ptr.go | 46 - .../modern-go/reflect2/unsafe_slice.go | 177 - .../modern-go/reflect2/unsafe_struct.go | 59 - .../modern-go/reflect2/unsafe_type.go | 85 - .../github.com/shopspring/decimal/.gitignore | 2 - .../github.com/shopspring/decimal/.travis.yml | 13 - vendor/github.com/shopspring/decimal/LICENSE | 45 - .../github.com/shopspring/decimal/README.md | 126 - .../shopspring/decimal/decimal-go.go | 414 - .../github.com/shopspring/decimal/decimal.go | 1434 - .../github.com/shopspring/decimal/rounding.go | 118 - vendor/github.com/spf13/cobra/.gitignore | 39 - vendor/github.com/spf13/cobra/.mailmap | 3 - vendor/github.com/spf13/cobra/.travis.yml | 29 - vendor/github.com/spf13/cobra/LICENSE.txt | 174 - vendor/github.com/spf13/cobra/Makefile | 36 - vendor/github.com/spf13/cobra/README.md | 770 - vendor/github.com/spf13/cobra/args.go | 109 - .../spf13/cobra/bash_completions.go | 641 - .../spf13/cobra/bash_completions.md | 383 - vendor/github.com/spf13/cobra/cobra.go | 207 - vendor/github.com/spf13/cobra/command.go | 1634 - .../github.com/spf13/cobra/command_notwin.go | 5 - vendor/github.com/spf13/cobra/command_win.go | 26 - .../spf13/cobra/custom_completions.go | 384 - .../spf13/cobra/fish_completions.go | 172 - .../spf13/cobra/fish_completions.md | 7 - vendor/github.com/spf13/cobra/go.mod | 12 - vendor/github.com/spf13/cobra/go.sum | 149 - .../spf13/cobra/powershell_completions.go | 100 - .../spf13/cobra/powershell_completions.md | 14 - .../spf13/cobra/shell_completions.go | 85 - .../github.com/spf13/cobra/zsh_completions.go | 336 - .../github.com/spf13/cobra/zsh_completions.md | 39 - vendor/github.com/spf13/pflag/.gitignore | 2 - vendor/github.com/spf13/pflag/.travis.yml | 21 - vendor/github.com/spf13/pflag/LICENSE | 28 - vendor/github.com/spf13/pflag/README.md | 296 - vendor/github.com/spf13/pflag/bool.go | 94 - vendor/github.com/spf13/pflag/bool_slice.go | 147 - vendor/github.com/spf13/pflag/bytes.go | 209 - vendor/github.com/spf13/pflag/count.go | 96 - vendor/github.com/spf13/pflag/duration.go | 86 - .../github.com/spf13/pflag/duration_slice.go | 128 - vendor/github.com/spf13/pflag/flag.go | 1227 - vendor/github.com/spf13/pflag/float32.go | 88 - vendor/github.com/spf13/pflag/float64.go | 84 - vendor/github.com/spf13/pflag/golangflag.go | 105 - vendor/github.com/spf13/pflag/int.go | 84 - vendor/github.com/spf13/pflag/int16.go | 88 - vendor/github.com/spf13/pflag/int32.go | 88 - vendor/github.com/spf13/pflag/int64.go | 84 - vendor/github.com/spf13/pflag/int8.go | 88 - vendor/github.com/spf13/pflag/int_slice.go | 128 - vendor/github.com/spf13/pflag/ip.go | 94 - vendor/github.com/spf13/pflag/ip_slice.go | 148 - vendor/github.com/spf13/pflag/ipmask.go | 122 - vendor/github.com/spf13/pflag/ipnet.go | 98 - vendor/github.com/spf13/pflag/string.go | 80 - vendor/github.com/spf13/pflag/string_array.go | 103 - vendor/github.com/spf13/pflag/string_slice.go | 149 - .../github.com/spf13/pflag/string_to_int.go | 149 - .../spf13/pflag/string_to_string.go | 160 - vendor/github.com/spf13/pflag/uint.go | 88 - vendor/github.com/spf13/pflag/uint16.go | 88 - vendor/github.com/spf13/pflag/uint32.go | 88 - vendor/github.com/spf13/pflag/uint64.go | 88 - vendor/github.com/spf13/pflag/uint8.go | 88 - vendor/github.com/spf13/pflag/uint_slice.go | 126 - vendor/github.com/streadway/amqp/.gitignore | 12 - vendor/github.com/streadway/amqp/.travis.yml | 25 - .../github.com/streadway/amqp/CONTRIBUTING.md | 35 - vendor/github.com/streadway/amqp/LICENSE | 23 - vendor/github.com/streadway/amqp/README.md | 93 - vendor/github.com/streadway/amqp/allocator.go | 106 - vendor/github.com/streadway/amqp/auth.go | 62 - vendor/github.com/streadway/amqp/certs.sh | 159 - vendor/github.com/streadway/amqp/channel.go | 1593 - vendor/github.com/streadway/amqp/confirms.go | 94 - .../github.com/streadway/amqp/connection.go | 847 - vendor/github.com/streadway/amqp/consumers.go | 142 - vendor/github.com/streadway/amqp/delivery.go | 173 - vendor/github.com/streadway/amqp/doc.go | 108 - vendor/github.com/streadway/amqp/fuzz.go | 17 - vendor/github.com/streadway/amqp/gen.sh | 2 - vendor/github.com/streadway/amqp/go.mod | 3 - vendor/github.com/streadway/amqp/pre-commit | 67 - vendor/github.com/streadway/amqp/read.go | 456 - vendor/github.com/streadway/amqp/return.go | 64 - vendor/github.com/streadway/amqp/spec091.go | 3306 -- vendor/github.com/streadway/amqp/types.go | 428 - vendor/github.com/streadway/amqp/uri.go | 176 - vendor/github.com/streadway/amqp/write.go | 416 - vendor/github.com/toolkits/file/downloader.go | 26 - vendor/github.com/toolkits/file/file.go | 223 - vendor/github.com/toolkits/file/reader.go | 66 - vendor/github.com/toolkits/file/writer.go | 20 - vendor/github.com/toolkits/net/ip.go | 87 - vendor/github.com/toolkits/net/net.go | 28 - vendor/github.com/toolkits/net/rpc.go | 24 - vendor/github.com/toolkits/net/url.go | 15 - vendor/github.com/troopstack/troop/LICENSE | 201 - .../troopstack/troop/src/model/client.go | 21 - .../troopstack/troop/src/model/file.go | 22 - .../troopstack/troop/src/model/fileManage.go | 45 - .../troopstack/troop/src/model/host.go | 27 - .../troopstack/troop/src/model/page.go | 6 - .../troopstack/troop/src/model/ping.go | 5 - .../troopstack/troop/src/model/plugin.go | 36 - .../troopstack/troop/src/model/rmq.go | 7 - .../troopstack/troop/src/model/rpc.go | 16 - .../troopstack/troop/src/model/scout.go | 61 - .../troopstack/troop/src/model/task.go | 60 - .../troop/src/modules/client/cmd/cmd.go | 149 - .../troop/src/modules/client/cmd/command.go | 130 - .../troop/src/modules/client/cmd/file.go | 104 - .../troop/src/modules/client/cmd/ping.go | 85 - .../troop/src/modules/client/cmd/plugin.go | 119 - .../src/modules/client/cmd/pluginPull.go | 52 - .../src/modules/client/cmd/pluginUpdate.go | 99 - .../src/modules/client/cmd/pluginVersion.go | 92 - .../troop/src/modules/client/cmd/result.go | 74 - .../troop/src/modules/client/cmd/scout.go | 209 - .../src/modules/client/cmd/scoutUpdate.go | 83 - .../troop/src/modules/client/cmd/start.go | 59 - .../troop/src/modules/client/cmd/stop.go | 43 - .../troop/src/modules/client/utils/config.go | 68 - .../troop/src/modules/client/utils/err.go | 9 - .../troop/src/modules/client/utils/http.go | 10 - .../src/modules/client/utils/ini_parser.go | 152 - .../src/modules/client/utils/target_ini.go | 89 - .../troop/src/modules/client/utils/tool.go | 23 - .../troop/src/modules/client/utils/utils.go | 21 - .../troop/src/modules/client/utils/var.go | 44 - .../modules/file/http/controllers/plugin.go | 65 - .../modules/file/http/controllers/remove.go | 34 - .../src/modules/file/http/controllers/save.go | 56 - .../troop/src/modules/file/http/http.go | 33 - .../troop/src/modules/file/http/routers.go | 49 - .../troop/src/modules/file/utils/config.go | 78 - .../troop/src/modules/file/utils/err.go | 9 - .../src/modules/file/utils/ini_parser.go | 152 - .../troop/src/modules/file/utils/system.go | 88 - .../troop/src/modules/file/utils/utils.go | 11 - .../troop/src/modules/file/utils/var.go | 46 - .../troop/src/modules/general/cache/scout.go | 106 - .../src/modules/general/cache/task/task.go | 271 - .../src/modules/general/database/mysql.go | 86 - .../src/modules/general/database/scout.go | 157 - .../general/http/controllers/balaTask.go | 149 - .../modules/general/http/controllers/file.go | 130 - .../general/http/controllers/fileManage.go | 77 - .../modules/general/http/controllers/host.go | 300 - .../modules/general/http/controllers/page.go | 20 - .../modules/general/http/controllers/ping.go | 76 - .../general/http/controllers/plugin.go | 198 - .../modules/general/http/controllers/task.go | 123 - .../general/http/controllers/tasking.go | 195 - .../troop/src/modules/general/http/http.go | 38 - .../troop/src/modules/general/http/routers.go | 65 - .../troop/src/modules/general/rmq/rmqPool.go | 514 - .../troop/src/modules/general/rpc/plugin.go | 30 - .../troop/src/modules/general/rpc/pong.go | 44 - .../troop/src/modules/general/rpc/rpc.go | 45 - .../troop/src/modules/general/rpc/scout.go | 103 - .../troop/src/modules/general/rpc/task.go | 133 - .../troop/src/modules/general/scout/accept.go | 51 - .../troop/src/modules/general/scout/plugin.go | 28 - .../troop/src/modules/general/scout/reset.go | 19 - .../troop/src/modules/general/utils/aes.go | 105 - .../troop/src/modules/general/utils/config.go | 214 - .../troop/src/modules/general/utils/err.go | 9 - .../src/modules/general/utils/general.go | 5 - .../src/modules/general/utils/ini_parser.go | 164 - .../troop/src/modules/general/utils/pki.go | 63 - .../src/modules/general/utils/plugins.go | 216 - .../troop/src/modules/general/utils/rsa.go | 88 - .../troop/src/modules/general/utils/signal.go | 23 - .../troop/src/modules/general/utils/system.go | 193 - .../troop/src/modules/general/utils/task.go | 66 - .../troop/src/modules/general/utils/utils.go | 11 - .../troop/src/modules/general/utils/var.go | 60 - .../troop/src/modules/scout/rmq/message.go | 372 - .../troop/src/modules/scout/rmq/rmq.go | 299 - .../troop/src/modules/scout/rpc/task.go | 83 - .../troop/src/modules/scout/run/file.go | 76 - .../troop/src/modules/scout/run/fileManage.go | 60 - .../troop/src/modules/scout/run/order.go | 121 - .../troop/src/modules/scout/run/plugin.go | 346 - .../troop/src/modules/scout/utils/aes.go | 102 - .../troop/src/modules/scout/utils/config.go | 205 - .../troop/src/modules/scout/utils/err.go | 27 - .../troop/src/modules/scout/utils/general.go | 88 - .../src/modules/scout/utils/handshake.go | 64 - .../src/modules/scout/utils/ini_parser.go | 169 - .../troop/src/modules/scout/utils/pki.go | 104 - .../troop/src/modules/scout/utils/rpc.go | 90 - .../troop/src/modules/scout/utils/rsa.go | 87 - .../troop/src/modules/scout/utils/scout.go | 5 - .../troop/src/modules/scout/utils/system.go | 44 - .../troop/src/modules/scout/utils/task.go | 20 - .../troop/src/modules/scout/utils/tools.go | 110 - .../troop/src/modules/scout/utils/utils.go | 11 - .../troop/src/modules/scout/utils/var.go | 105 - .../ugorji/go/codec/0_importpath.go | 7 - vendor/github.com/ugorji/go/codec/LICENSE | 22 - vendor/github.com/ugorji/go/codec/binc.go | 1219 - vendor/github.com/ugorji/go/codec/build.sh | 272 - vendor/github.com/ugorji/go/codec/cbor.go | 846 - vendor/github.com/ugorji/go/codec/codecgen.go | 13 - vendor/github.com/ugorji/go/codec/decode.go | 2034 - vendor/github.com/ugorji/go/codec/doc.go | 226 - vendor/github.com/ugorji/go/codec/encode.go | 1373 - .../ugorji/go/codec/fast-path.generated.go | 8950 --- .../ugorji/go/codec/fast-path.go.tmpl | 503 - .../ugorji/go/codec/fast-path.not.go | 41 - vendor/github.com/ugorji/go/codec/float.go | 313 - .../ugorji/go/codec/gen-dec-array.go.tmpl | 90 - .../ugorji/go/codec/gen-dec-map.go.tmpl | 53 - .../ugorji/go/codec/gen-enc-chan.go.tmpl | 27 - .../ugorji/go/codec/gen-helper.generated.go | 273 - .../ugorji/go/codec/gen-helper.go.tmpl | 241 - .../ugorji/go/codec/gen.generated.go | 187 - vendor/github.com/ugorji/go/codec/gen.go | 2339 - vendor/github.com/ugorji/go/codec/go.mod | 5 - .../go/codec/goversion_arrayof_gte_go15.go | 14 - .../go/codec/goversion_arrayof_lt_go15.go | 14 - .../go/codec/goversion_fmt_time_gte_go15.go | 12 - .../go/codec/goversion_fmt_time_lt_go15.go | 15 - .../go/codec/goversion_makemap_gte_go19.go | 15 - .../go/codec/goversion_makemap_lt_go19.go | 12 - .../go/codec/goversion_maprange_gte_go112.go | 44 - .../go/codec/goversion_maprange_lt_go112.go | 47 - ...version_unexportedembeddedptr_gte_go110.go | 8 - ...oversion_unexportedembeddedptr_lt_go110.go | 8 - .../go/codec/goversion_unsupported_lt_go14.go | 17 - .../go/codec/goversion_vendor_eq_go15.go | 10 - .../go/codec/goversion_vendor_eq_go16.go | 10 - .../go/codec/goversion_vendor_gte_go17.go | 8 - .../go/codec/goversion_vendor_lt_go15.go | 8 - vendor/github.com/ugorji/go/codec/helper.go | 2682 - vendor/github.com/ugorji/go/codec/helper.s | 0 .../ugorji/go/codec/helper_internal.go | 124 - .../ugorji/go/codec/helper_not_unsafe.go | 409 - .../ugorji/go/codec/helper_unsafe.go | 867 - vendor/github.com/ugorji/go/codec/json.go | 1493 - .../ugorji/go/codec/mammoth-test.go.tmpl | 162 - .../ugorji/go/codec/mammoth2-test.go.tmpl | 94 - vendor/github.com/ugorji/go/codec/msgpack.go | 1108 - vendor/github.com/ugorji/go/codec/prebuild.go | 136 - vendor/github.com/ugorji/go/codec/reader.go | 1017 - .../ugorji/go/codec/register_ext.go | 38 - vendor/github.com/ugorji/go/codec/rpc.go | 222 - vendor/github.com/ugorji/go/codec/simple.go | 647 - .../ugorji/go/codec/sort-slice.generated.go | 266 - .../ugorji/go/codec/sort-slice.go.tmpl | 64 - .../ugorji/go/codec/test-cbor-goldens.json | 639 - vendor/github.com/ugorji/go/codec/test.py | 126 - vendor/github.com/ugorji/go/codec/writer.go | 267 - vendor/golang.org/x/crypto/AUTHORS | 3 - vendor/golang.org/x/crypto/CONTRIBUTORS | 3 - vendor/golang.org/x/crypto/LICENSE | 27 - vendor/golang.org/x/crypto/PATENTS | 22 - vendor/golang.org/x/crypto/sha3/doc.go | 66 - vendor/golang.org/x/crypto/sha3/hashes.go | 97 - .../x/crypto/sha3/hashes_generic.go | 27 - vendor/golang.org/x/crypto/sha3/keccakf.go | 412 - .../golang.org/x/crypto/sha3/keccakf_amd64.go | 13 - .../golang.org/x/crypto/sha3/keccakf_amd64.s | 390 - vendor/golang.org/x/crypto/sha3/register.go | 18 - vendor/golang.org/x/crypto/sha3/sha3.go | 193 - vendor/golang.org/x/crypto/sha3/sha3_s390x.go | 284 - vendor/golang.org/x/crypto/sha3/sha3_s390x.s | 33 - vendor/golang.org/x/crypto/sha3/shake.go | 173 - .../golang.org/x/crypto/sha3/shake_generic.go | 19 - vendor/golang.org/x/crypto/sha3/xor.go | 23 - .../golang.org/x/crypto/sha3/xor_generic.go | 28 - .../golang.org/x/crypto/sha3/xor_unaligned.go | 76 - vendor/golang.org/x/sys/AUTHORS | 3 - vendor/golang.org/x/sys/CONTRIBUTORS | 3 - vendor/golang.org/x/sys/LICENSE | 27 - vendor/golang.org/x/sys/PATENTS | 22 - vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 17 - vendor/golang.org/x/sys/cpu/byteorder.go | 60 - vendor/golang.org/x/sys/cpu/cpu.go | 171 - vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go | 34 - vendor/golang.org/x/sys/cpu/cpu_arm.go | 40 - vendor/golang.org/x/sys/cpu/cpu_arm64.go | 138 - vendor/golang.org/x/sys/cpu/cpu_arm64.s | 31 - vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 11 - vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 21 - vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 16 - .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 11 - .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 22 - vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 43 - vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 26 - vendor/golang.org/x/sys/cpu/cpu_linux.go | 15 - vendor/golang.org/x/sys/cpu/cpu_linux_arm.go | 39 - .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 71 - .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 22 - .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 9 - .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 33 - .../golang.org/x/sys/cpu/cpu_linux_s390x.go | 161 - vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 9 - vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 9 - .../golang.org/x/sys/cpu/cpu_other_arm64.go | 9 - vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 9 - vendor/golang.org/x/sys/cpu/cpu_s390x.s | 57 - vendor/golang.org/x/sys/cpu/cpu_wasm.go | 13 - vendor/golang.org/x/sys/cpu/cpu_x86.go | 59 - vendor/golang.org/x/sys/cpu/cpu_x86.s | 27 - vendor/golang.org/x/sys/cpu/hwcap_linux.go | 56 - .../x/sys/cpu/syscall_aix_ppc64_gc.go | 36 - vendor/golang.org/x/sys/unix/.gitignore | 2 - vendor/golang.org/x/sys/unix/README.md | 184 - .../golang.org/x/sys/unix/affinity_linux.go | 86 - vendor/golang.org/x/sys/unix/aliases.go | 14 - vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 17 - vendor/golang.org/x/sys/unix/asm_darwin_386.s | 29 - .../golang.org/x/sys/unix/asm_darwin_amd64.s | 29 - vendor/golang.org/x/sys/unix/asm_darwin_arm.s | 30 - .../golang.org/x/sys/unix/asm_darwin_arm64.s | 30 - .../x/sys/unix/asm_dragonfly_amd64.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_386.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm64.s | 29 - vendor/golang.org/x/sys/unix/asm_linux_386.s | 65 - .../golang.org/x/sys/unix/asm_linux_amd64.s | 57 - vendor/golang.org/x/sys/unix/asm_linux_arm.s | 56 - .../golang.org/x/sys/unix/asm_linux_arm64.s | 52 - .../golang.org/x/sys/unix/asm_linux_mips64x.s | 56 - .../golang.org/x/sys/unix/asm_linux_mipsx.s | 54 - .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 44 - .../golang.org/x/sys/unix/asm_linux_riscv64.s | 47 - .../golang.org/x/sys/unix/asm_linux_s390x.s | 56 - vendor/golang.org/x/sys/unix/asm_netbsd_386.s | 29 - .../golang.org/x/sys/unix/asm_netbsd_amd64.s | 29 - vendor/golang.org/x/sys/unix/asm_netbsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_netbsd_arm64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_386.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_arm64.s | 29 - .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 - .../golang.org/x/sys/unix/bluetooth_linux.go | 36 - vendor/golang.org/x/sys/unix/cap_freebsd.go | 195 - vendor/golang.org/x/sys/unix/constants.go | 13 - vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 27 - vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 29 - vendor/golang.org/x/sys/unix/dev_darwin.go | 24 - vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 - vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 - vendor/golang.org/x/sys/unix/dev_linux.go | 42 - vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 - vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 - vendor/golang.org/x/sys/unix/dirent.go | 102 - vendor/golang.org/x/sys/unix/endian_big.go | 9 - vendor/golang.org/x/sys/unix/endian_little.go | 9 - vendor/golang.org/x/sys/unix/env_unix.go | 31 - .../x/sys/unix/errors_freebsd_386.go | 233 - .../x/sys/unix/errors_freebsd_amd64.go | 233 - .../x/sys/unix/errors_freebsd_arm.go | 226 - .../x/sys/unix/errors_freebsd_arm64.go | 17 - vendor/golang.org/x/sys/unix/fcntl.go | 36 - vendor/golang.org/x/sys/unix/fcntl_darwin.go | 18 - .../x/sys/unix/fcntl_linux_32bit.go | 13 - vendor/golang.org/x/sys/unix/fdset.go | 29 - vendor/golang.org/x/sys/unix/gccgo.go | 62 - vendor/golang.org/x/sys/unix/gccgo_c.c | 39 - .../x/sys/unix/gccgo_linux_amd64.go | 20 - vendor/golang.org/x/sys/unix/ioctl.go | 65 - vendor/golang.org/x/sys/unix/mkall.sh | 240 - vendor/golang.org/x/sys/unix/mkerrors.sh | 699 - vendor/golang.org/x/sys/unix/pagesize_unix.go | 15 - .../golang.org/x/sys/unix/pledge_openbsd.go | 163 - vendor/golang.org/x/sys/unix/race.go | 30 - vendor/golang.org/x/sys/unix/race0.go | 25 - .../x/sys/unix/readdirent_getdents.go | 12 - .../x/sys/unix/readdirent_getdirentries.go | 19 - .../x/sys/unix/sockcmsg_dragonfly.go | 16 - .../golang.org/x/sys/unix/sockcmsg_linux.go | 36 - vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 92 - .../x/sys/unix/sockcmsg_unix_other.go | 38 - vendor/golang.org/x/sys/unix/str.go | 26 - vendor/golang.org/x/sys/unix/syscall.go | 53 - vendor/golang.org/x/sys/unix/syscall_aix.go | 536 - .../golang.org/x/sys/unix/syscall_aix_ppc.go | 54 - .../x/sys/unix/syscall_aix_ppc64.go | 85 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 631 - .../x/sys/unix/syscall_darwin.1_12.go | 29 - .../x/sys/unix/syscall_darwin.1_13.go | 101 - .../golang.org/x/sys/unix/syscall_darwin.go | 667 - .../x/sys/unix/syscall_darwin_386.1_11.go | 9 - .../x/sys/unix/syscall_darwin_386.go | 68 - .../x/sys/unix/syscall_darwin_amd64.1_11.go | 9 - .../x/sys/unix/syscall_darwin_amd64.go | 68 - .../x/sys/unix/syscall_darwin_arm.1_11.go | 11 - .../x/sys/unix/syscall_darwin_arm.go | 68 - .../x/sys/unix/syscall_darwin_arm64.1_11.go | 11 - .../x/sys/unix/syscall_darwin_arm64.go | 70 - .../x/sys/unix/syscall_darwin_libSystem.go | 33 - .../x/sys/unix/syscall_dragonfly.go | 539 - .../x/sys/unix/syscall_dragonfly_amd64.go | 56 - .../golang.org/x/sys/unix/syscall_freebsd.go | 874 - .../x/sys/unix/syscall_freebsd_386.go | 66 - .../x/sys/unix/syscall_freebsd_amd64.go | 66 - .../x/sys/unix/syscall_freebsd_arm.go | 62 - .../x/sys/unix/syscall_freebsd_arm64.go | 62 - .../golang.org/x/sys/unix/syscall_illumos.go | 57 - vendor/golang.org/x/sys/unix/syscall_linux.go | 2191 - .../x/sys/unix/syscall_linux_386.go | 390 - .../x/sys/unix/syscall_linux_amd64.go | 194 - .../x/sys/unix/syscall_linux_amd64_gc.go | 13 - .../x/sys/unix/syscall_linux_arm.go | 291 - .../x/sys/unix/syscall_linux_arm64.go | 227 - .../golang.org/x/sys/unix/syscall_linux_gc.go | 14 - .../x/sys/unix/syscall_linux_gc_386.go | 16 - .../x/sys/unix/syscall_linux_gccgo_386.go | 30 - .../x/sys/unix/syscall_linux_gccgo_arm.go | 20 - .../x/sys/unix/syscall_linux_mips64x.go | 230 - .../x/sys/unix/syscall_linux_mipsx.go | 238 - .../x/sys/unix/syscall_linux_ppc64x.go | 156 - .../x/sys/unix/syscall_linux_riscv64.go | 230 - .../x/sys/unix/syscall_linux_s390x.go | 342 - .../x/sys/unix/syscall_linux_sparc64.go | 151 - .../golang.org/x/sys/unix/syscall_netbsd.go | 614 - .../x/sys/unix/syscall_netbsd_386.go | 37 - .../x/sys/unix/syscall_netbsd_amd64.go | 37 - .../x/sys/unix/syscall_netbsd_arm.go | 37 - .../x/sys/unix/syscall_netbsd_arm64.go | 37 - .../golang.org/x/sys/unix/syscall_openbsd.go | 401 - .../x/sys/unix/syscall_openbsd_386.go | 41 - .../x/sys/unix/syscall_openbsd_amd64.go | 41 - .../x/sys/unix/syscall_openbsd_arm.go | 41 - .../x/sys/unix/syscall_openbsd_arm64.go | 41 - .../golang.org/x/sys/unix/syscall_solaris.go | 724 - .../x/sys/unix/syscall_solaris_amd64.go | 27 - vendor/golang.org/x/sys/unix/syscall_unix.go | 431 - .../golang.org/x/sys/unix/syscall_unix_gc.go | 15 - .../x/sys/unix/syscall_unix_gc_ppc64x.go | 24 - vendor/golang.org/x/sys/unix/timestruct.go | 82 - .../golang.org/x/sys/unix/unveil_openbsd.go | 42 - vendor/golang.org/x/sys/unix/xattr_bsd.go | 240 - .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1384 - .../x/sys/unix/zerrors_aix_ppc64.go | 1385 - .../x/sys/unix/zerrors_darwin_386.go | 1784 - .../x/sys/unix/zerrors_darwin_amd64.go | 1784 - .../x/sys/unix/zerrors_darwin_arm.go | 1784 - .../x/sys/unix/zerrors_darwin_arm64.go | 1784 - .../x/sys/unix/zerrors_dragonfly_amd64.go | 1651 - .../x/sys/unix/zerrors_freebsd_386.go | 1930 - .../x/sys/unix/zerrors_freebsd_amd64.go | 1929 - .../x/sys/unix/zerrors_freebsd_arm.go | 1819 - .../x/sys/unix/zerrors_freebsd_arm64.go | 1930 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 2454 - .../x/sys/unix/zerrors_linux_386.go | 782 - .../x/sys/unix/zerrors_linux_amd64.go | 782 - .../x/sys/unix/zerrors_linux_arm.go | 788 - .../x/sys/unix/zerrors_linux_arm64.go | 775 - .../x/sys/unix/zerrors_linux_mips.go | 789 - .../x/sys/unix/zerrors_linux_mips64.go | 789 - .../x/sys/unix/zerrors_linux_mips64le.go | 789 - .../x/sys/unix/zerrors_linux_mipsle.go | 789 - .../x/sys/unix/zerrors_linux_ppc64.go | 845 - .../x/sys/unix/zerrors_linux_ppc64le.go | 845 - .../x/sys/unix/zerrors_linux_riscv64.go | 769 - .../x/sys/unix/zerrors_linux_s390x.go | 842 - .../x/sys/unix/zerrors_linux_sparc64.go | 839 - .../x/sys/unix/zerrors_netbsd_386.go | 1773 - .../x/sys/unix/zerrors_netbsd_amd64.go | 1763 - .../x/sys/unix/zerrors_netbsd_arm.go | 1752 - .../x/sys/unix/zerrors_netbsd_arm64.go | 1763 - .../x/sys/unix/zerrors_openbsd_386.go | 1657 - .../x/sys/unix/zerrors_openbsd_amd64.go | 1767 - .../x/sys/unix/zerrors_openbsd_arm.go | 1659 - .../x/sys/unix/zerrors_openbsd_arm64.go | 1790 - .../x/sys/unix/zerrors_solaris_amd64.go | 1533 - .../x/sys/unix/zptrace_armnn_linux.go | 41 - .../x/sys/unix/zptrace_linux_arm64.go | 17 - .../x/sys/unix/zptrace_mipsnn_linux.go | 50 - .../x/sys/unix/zptrace_mipsnnle_linux.go | 50 - .../x/sys/unix/zptrace_x86_linux.go | 80 - .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1484 - .../x/sys/unix/zsyscall_aix_ppc64.go | 1442 - .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1192 - .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1070 - .../x/sys/unix/zsyscall_darwin_386.1_11.go | 1811 - .../x/sys/unix/zsyscall_darwin_386.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_386.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_386.go | 2499 - .../x/sys/unix/zsyscall_darwin_386.s | 284 - .../x/sys/unix/zsyscall_darwin_amd64.1_11.go | 1811 - .../x/sys/unix/zsyscall_darwin_amd64.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_amd64.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_amd64.go | 2499 - .../x/sys/unix/zsyscall_darwin_amd64.s | 284 - .../x/sys/unix/zsyscall_darwin_arm.1_11.go | 1784 - .../x/sys/unix/zsyscall_darwin_arm.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_arm.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_arm.go | 2484 - .../x/sys/unix/zsyscall_darwin_arm.s | 282 - .../x/sys/unix/zsyscall_darwin_arm64.1_11.go | 1784 - .../x/sys/unix/zsyscall_darwin_arm64.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_arm64.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_arm64.go | 2484 - .../x/sys/unix/zsyscall_darwin_arm64.s | 282 - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1666 - .../x/sys/unix/zsyscall_freebsd_386.go | 2015 - .../x/sys/unix/zsyscall_freebsd_amd64.go | 2015 - .../x/sys/unix/zsyscall_freebsd_arm.go | 2015 - .../x/sys/unix/zsyscall_freebsd_arm64.go | 2015 - .../x/sys/unix/zsyscall_illumos_amd64.go | 87 - .../golang.org/x/sys/unix/zsyscall_linux.go | 1825 - .../x/sys/unix/zsyscall_linux_386.go | 578 - .../x/sys/unix/zsyscall_linux_amd64.go | 745 - .../x/sys/unix/zsyscall_linux_arm.go | 715 - .../x/sys/unix/zsyscall_linux_arm64.go | 602 - .../x/sys/unix/zsyscall_linux_mips.go | 758 - .../x/sys/unix/zsyscall_linux_mips64.go | 729 - .../x/sys/unix/zsyscall_linux_mips64le.go | 729 - .../x/sys/unix/zsyscall_linux_mipsle.go | 758 - .../x/sys/unix/zsyscall_linux_ppc64.go | 807 - .../x/sys/unix/zsyscall_linux_ppc64le.go | 807 - .../x/sys/unix/zsyscall_linux_riscv64.go | 582 - .../x/sys/unix/zsyscall_linux_s390x.go | 577 - .../x/sys/unix/zsyscall_linux_sparc64.go | 740 - .../x/sys/unix/zsyscall_netbsd_386.go | 1851 - .../x/sys/unix/zsyscall_netbsd_amd64.go | 1851 - .../x/sys/unix/zsyscall_netbsd_arm.go | 1851 - .../x/sys/unix/zsyscall_netbsd_arm64.go | 1851 - .../x/sys/unix/zsyscall_openbsd_386.go | 1692 - .../x/sys/unix/zsyscall_openbsd_amd64.go | 1692 - .../x/sys/unix/zsyscall_openbsd_arm.go | 1692 - .../x/sys/unix/zsyscall_openbsd_arm64.go | 1692 - .../x/sys/unix/zsyscall_solaris_amd64.go | 1954 - .../x/sys/unix/zsysctl_openbsd_386.go | 272 - .../x/sys/unix/zsysctl_openbsd_amd64.go | 270 - .../x/sys/unix/zsysctl_openbsd_arm.go | 272 - .../x/sys/unix/zsysctl_openbsd_arm64.go | 275 - .../x/sys/unix/zsysnum_darwin_386.go | 436 - .../x/sys/unix/zsysnum_darwin_amd64.go | 438 - .../x/sys/unix/zsysnum_darwin_arm.go | 436 - .../x/sys/unix/zsysnum_darwin_arm64.go | 436 - .../x/sys/unix/zsysnum_dragonfly_amd64.go | 315 - .../x/sys/unix/zsysnum_freebsd_386.go | 396 - .../x/sys/unix/zsysnum_freebsd_amd64.go | 396 - .../x/sys/unix/zsysnum_freebsd_arm.go | 396 - .../x/sys/unix/zsysnum_freebsd_arm64.go | 396 - .../x/sys/unix/zsysnum_linux_386.go | 434 - .../x/sys/unix/zsysnum_linux_amd64.go | 356 - .../x/sys/unix/zsysnum_linux_arm.go | 398 - .../x/sys/unix/zsysnum_linux_arm64.go | 301 - .../x/sys/unix/zsysnum_linux_mips.go | 419 - .../x/sys/unix/zsysnum_linux_mips64.go | 349 - .../x/sys/unix/zsysnum_linux_mips64le.go | 349 - .../x/sys/unix/zsysnum_linux_mipsle.go | 419 - .../x/sys/unix/zsysnum_linux_ppc64.go | 398 - .../x/sys/unix/zsysnum_linux_ppc64le.go | 398 - .../x/sys/unix/zsysnum_linux_riscv64.go | 300 - .../x/sys/unix/zsysnum_linux_s390x.go | 363 - .../x/sys/unix/zsysnum_linux_sparc64.go | 377 - .../x/sys/unix/zsysnum_netbsd_386.go | 274 - .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 - .../x/sys/unix/zsysnum_netbsd_arm.go | 274 - .../x/sys/unix/zsysnum_netbsd_arm64.go | 274 - .../x/sys/unix/zsysnum_openbsd_386.go | 218 - .../x/sys/unix/zsysnum_openbsd_amd64.go | 218 - .../x/sys/unix/zsysnum_openbsd_arm.go | 218 - .../x/sys/unix/zsysnum_openbsd_arm64.go | 217 - .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 352 - .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 356 - .../x/sys/unix/ztypes_darwin_386.go | 499 - .../x/sys/unix/ztypes_darwin_amd64.go | 509 - .../x/sys/unix/ztypes_darwin_arm.go | 500 - .../x/sys/unix/ztypes_darwin_arm64.go | 509 - .../x/sys/unix/ztypes_dragonfly_amd64.go | 479 - .../x/sys/unix/ztypes_freebsd_386.go | 709 - .../x/sys/unix/ztypes_freebsd_amd64.go | 712 - .../x/sys/unix/ztypes_freebsd_arm.go | 693 - .../x/sys/unix/ztypes_freebsd_arm64.go | 690 - vendor/golang.org/x/sys/unix/ztypes_linux.go | 2293 - .../golang.org/x/sys/unix/ztypes_linux_386.go | 598 - .../x/sys/unix/ztypes_linux_amd64.go | 613 - .../golang.org/x/sys/unix/ztypes_linux_arm.go | 590 - .../x/sys/unix/ztypes_linux_arm64.go | 592 - .../x/sys/unix/ztypes_linux_mips.go | 596 - .../x/sys/unix/ztypes_linux_mips64.go | 595 - .../x/sys/unix/ztypes_linux_mips64le.go | 595 - .../x/sys/unix/ztypes_linux_mipsle.go | 596 - .../x/sys/unix/ztypes_linux_ppc64.go | 602 - .../x/sys/unix/ztypes_linux_ppc64le.go | 602 - .../x/sys/unix/ztypes_linux_riscv64.go | 620 - .../x/sys/unix/ztypes_linux_s390x.go | 616 - .../x/sys/unix/ztypes_linux_sparc64.go | 597 - .../x/sys/unix/ztypes_netbsd_386.go | 498 - .../x/sys/unix/ztypes_netbsd_amd64.go | 506 - .../x/sys/unix/ztypes_netbsd_arm.go | 503 - .../x/sys/unix/ztypes_netbsd_arm64.go | 506 - .../x/sys/unix/ztypes_openbsd_386.go | 571 - .../x/sys/unix/ztypes_openbsd_amd64.go | 571 - .../x/sys/unix/ztypes_openbsd_arm.go | 572 - .../x/sys/unix/ztypes_openbsd_arm64.go | 565 - .../x/sys/unix/ztypes_solaris_amd64.go | 449 - vendor/gopkg.in/ini.v1/.gitignore | 6 - vendor/gopkg.in/ini.v1/LICENSE | 191 - vendor/gopkg.in/ini.v1/Makefile | 15 - vendor/gopkg.in/ini.v1/README.md | 43 - vendor/gopkg.in/ini.v1/codecov.yml | 9 - vendor/gopkg.in/ini.v1/data_source.go | 76 - vendor/gopkg.in/ini.v1/deprecated.go | 25 - vendor/gopkg.in/ini.v1/error.go | 34 - vendor/gopkg.in/ini.v1/file.go | 509 - vendor/gopkg.in/ini.v1/helper.go | 24 - vendor/gopkg.in/ini.v1/ini.go | 168 - vendor/gopkg.in/ini.v1/key.go | 829 - vendor/gopkg.in/ini.v1/parser.go | 535 - vendor/gopkg.in/ini.v1/section.go | 256 - vendor/gopkg.in/ini.v1/struct.go | 729 - vendor/gopkg.in/yaml.v2/.travis.yml | 16 - vendor/gopkg.in/yaml.v2/LICENSE | 201 - vendor/gopkg.in/yaml.v2/LICENSE.libyaml | 31 - vendor/gopkg.in/yaml.v2/NOTICE | 13 - vendor/gopkg.in/yaml.v2/README.md | 133 - vendor/gopkg.in/yaml.v2/apic.go | 739 - vendor/gopkg.in/yaml.v2/decode.go | 815 - vendor/gopkg.in/yaml.v2/emitterc.go | 1685 - vendor/gopkg.in/yaml.v2/encode.go | 390 - vendor/gopkg.in/yaml.v2/go.mod | 5 - vendor/gopkg.in/yaml.v2/parserc.go | 1095 - vendor/gopkg.in/yaml.v2/readerc.go | 412 - vendor/gopkg.in/yaml.v2/resolve.go | 258 - vendor/gopkg.in/yaml.v2/scannerc.go | 2711 - vendor/gopkg.in/yaml.v2/sorter.go | 113 - vendor/gopkg.in/yaml.v2/writerc.go | 26 - vendor/gopkg.in/yaml.v2/yaml.go | 466 - vendor/gopkg.in/yaml.v2/yamlh.go | 739 - vendor/gopkg.in/yaml.v2/yamlprivateh.go | 173 - vendor/modules.txt | 90 - 1037 files changed, 95 insertions(+), 387622 deletions(-) rename src/modules/general/http/controllers/{plugin.go => plugin/job.go} (83%) create mode 100644 src/modules/general/http/controllers/plugin/list.go create mode 100644 src/modules/general/http/controllers/plugin/pull.go delete mode 100644 vendor/github.com/DeanThompson/ginpprof/.gitignore delete mode 100644 vendor/github.com/DeanThompson/ginpprof/.travis.yml delete mode 100644 vendor/github.com/DeanThompson/ginpprof/LICENSE delete mode 100644 vendor/github.com/DeanThompson/ginpprof/README.md delete mode 100644 vendor/github.com/DeanThompson/ginpprof/pprof.go delete mode 100644 vendor/github.com/axgle/mahonia/8bit.go delete mode 100644 vendor/github.com/axgle/mahonia/ASCII.go delete mode 100644 vendor/github.com/axgle/mahonia/LICENSE delete mode 100644 vendor/github.com/axgle/mahonia/README.md delete mode 100644 vendor/github.com/axgle/mahonia/big5-data.go delete mode 100644 vendor/github.com/axgle/mahonia/big5.go delete mode 100644 vendor/github.com/axgle/mahonia/charset.go delete mode 100644 vendor/github.com/axgle/mahonia/convert_string.go delete mode 100644 vendor/github.com/axgle/mahonia/entity.go delete mode 100644 vendor/github.com/axgle/mahonia/entity_data.go delete mode 100644 vendor/github.com/axgle/mahonia/euc-jp.go delete mode 100644 vendor/github.com/axgle/mahonia/fallback.go delete mode 100644 vendor/github.com/axgle/mahonia/gb18030-data.go delete mode 100644 vendor/github.com/axgle/mahonia/gb18030.go delete mode 100644 vendor/github.com/axgle/mahonia/gbk-data.go delete mode 100644 vendor/github.com/axgle/mahonia/gbk.go delete mode 100644 vendor/github.com/axgle/mahonia/jis0201-data.go delete mode 100644 vendor/github.com/axgle/mahonia/jis0208-data.go delete mode 100644 vendor/github.com/axgle/mahonia/jis0212-data.go delete mode 100644 vendor/github.com/axgle/mahonia/mbcs.go delete mode 100644 vendor/github.com/axgle/mahonia/reader.go delete mode 100644 vendor/github.com/axgle/mahonia/shiftjis.go delete mode 100644 vendor/github.com/axgle/mahonia/translate.go delete mode 100644 vendor/github.com/axgle/mahonia/utf16.go delete mode 100644 vendor/github.com/axgle/mahonia/utf8.go delete mode 100644 vendor/github.com/axgle/mahonia/writer.go delete mode 100644 vendor/github.com/chenhg5/collection/.gitignore delete mode 100644 vendor/github.com/chenhg5/collection/.travis.yml delete mode 100644 vendor/github.com/chenhg5/collection/LICENSE delete mode 100644 vendor/github.com/chenhg5/collection/README.md delete mode 100644 vendor/github.com/chenhg5/collection/base_collection.go delete mode 100644 vendor/github.com/chenhg5/collection/collection.go delete mode 100644 vendor/github.com/chenhg5/collection/go.mod delete mode 100644 vendor/github.com/chenhg5/collection/go.sum delete mode 100644 vendor/github.com/chenhg5/collection/map_array_collection.go delete mode 100644 vendor/github.com/chenhg5/collection/map_collection.go delete mode 100644 vendor/github.com/chenhg5/collection/muti_dimensional_array_collection.go delete mode 100644 vendor/github.com/chenhg5/collection/number_array_collection.go delete mode 100644 vendor/github.com/chenhg5/collection/string_array_collection.go delete mode 100644 vendor/github.com/fatih/color/LICENSE.md delete mode 100644 vendor/github.com/fatih/color/README.md delete mode 100644 vendor/github.com/fatih/color/color.go delete mode 100644 vendor/github.com/fatih/color/doc.go delete mode 100644 vendor/github.com/fatih/color/go.mod delete mode 100644 vendor/github.com/fatih/color/go.sum delete mode 100644 vendor/github.com/gin-contrib/sse/.travis.yml delete mode 100644 vendor/github.com/gin-contrib/sse/LICENSE delete mode 100644 vendor/github.com/gin-contrib/sse/README.md delete mode 100644 vendor/github.com/gin-contrib/sse/go.mod delete mode 100644 vendor/github.com/gin-contrib/sse/go.sum delete mode 100644 vendor/github.com/gin-contrib/sse/sse-decoder.go delete mode 100644 vendor/github.com/gin-contrib/sse/sse-encoder.go delete mode 100644 vendor/github.com/gin-contrib/sse/writer.go delete mode 100644 vendor/github.com/gin-gonic/gin/.gitignore delete mode 100644 vendor/github.com/gin-gonic/gin/.travis.yml delete mode 100644 vendor/github.com/gin-gonic/gin/AUTHORS.md delete mode 100644 vendor/github.com/gin-gonic/gin/BENCHMARKS.md delete mode 100644 vendor/github.com/gin-gonic/gin/CHANGELOG.md delete mode 100644 vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/gin-gonic/gin/CONTRIBUTING.md delete mode 100644 vendor/github.com/gin-gonic/gin/LICENSE delete mode 100644 vendor/github.com/gin-gonic/gin/Makefile delete mode 100644 vendor/github.com/gin-gonic/gin/README.md delete mode 100644 vendor/github.com/gin-gonic/gin/auth.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/binding.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/default_validator.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/form.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/form_mapping.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/header.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/msgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/protobuf.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/query.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/uri.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/xml.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/yaml.go delete mode 100644 vendor/github.com/gin-gonic/gin/codecov.yml delete mode 100644 vendor/github.com/gin-gonic/gin/context.go delete mode 100644 vendor/github.com/gin-gonic/gin/context_appengine.go delete mode 100644 vendor/github.com/gin-gonic/gin/debug.go delete mode 100644 vendor/github.com/gin-gonic/gin/deprecated.go delete mode 100644 vendor/github.com/gin-gonic/gin/doc.go delete mode 100644 vendor/github.com/gin-gonic/gin/errors.go delete mode 100644 vendor/github.com/gin-gonic/gin/fs.go delete mode 100644 vendor/github.com/gin-gonic/gin/gin.go delete mode 100644 vendor/github.com/gin-gonic/gin/go.mod delete mode 100644 vendor/github.com/gin-gonic/gin/go.sum delete mode 100644 vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go delete mode 100644 vendor/github.com/gin-gonic/gin/internal/json/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go delete mode 100644 vendor/github.com/gin-gonic/gin/logger.go delete mode 100644 vendor/github.com/gin-gonic/gin/mode.go delete mode 100644 vendor/github.com/gin-gonic/gin/path.go delete mode 100644 vendor/github.com/gin-gonic/gin/recovery.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/data.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/html.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/msgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/protobuf.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/reader.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/redirect.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/render.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/text.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/xml.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/yaml.go delete mode 100644 vendor/github.com/gin-gonic/gin/response_writer.go delete mode 100644 vendor/github.com/gin-gonic/gin/routergroup.go delete mode 100644 vendor/github.com/gin-gonic/gin/test_helpers.go delete mode 100644 vendor/github.com/gin-gonic/gin/tree.go delete mode 100644 vendor/github.com/gin-gonic/gin/utils.go delete mode 100644 vendor/github.com/gin-gonic/gin/version.go delete mode 100644 vendor/github.com/go-playground/locales/.gitignore delete mode 100644 vendor/github.com/go-playground/locales/.travis.yml delete mode 100644 vendor/github.com/go-playground/locales/LICENSE delete mode 100644 vendor/github.com/go-playground/locales/README.md delete mode 100644 vendor/github.com/go-playground/locales/currency/currency.go delete mode 100644 vendor/github.com/go-playground/locales/go.mod delete mode 100644 vendor/github.com/go-playground/locales/go.sum delete mode 100644 vendor/github.com/go-playground/locales/logo.png delete mode 100644 vendor/github.com/go-playground/locales/rules.go delete mode 100644 vendor/github.com/go-playground/universal-translator/.gitignore delete mode 100644 vendor/github.com/go-playground/universal-translator/.travis.yml delete mode 100644 vendor/github.com/go-playground/universal-translator/LICENSE delete mode 100644 vendor/github.com/go-playground/universal-translator/README.md delete mode 100644 vendor/github.com/go-playground/universal-translator/errors.go delete mode 100644 vendor/github.com/go-playground/universal-translator/go.mod delete mode 100644 vendor/github.com/go-playground/universal-translator/go.sum delete mode 100644 vendor/github.com/go-playground/universal-translator/import_export.go delete mode 100644 vendor/github.com/go-playground/universal-translator/logo.png delete mode 100644 vendor/github.com/go-playground/universal-translator/translator.go delete mode 100644 vendor/github.com/go-playground/universal-translator/universal_translator.go delete mode 100644 vendor/github.com/go-playground/validator/v10/.gitignore delete mode 100644 vendor/github.com/go-playground/validator/v10/.travis.yml delete mode 100644 vendor/github.com/go-playground/validator/v10/LICENSE delete mode 100644 vendor/github.com/go-playground/validator/v10/Makefile delete mode 100644 vendor/github.com/go-playground/validator/v10/README.md delete mode 100644 vendor/github.com/go-playground/validator/v10/baked_in.go delete mode 100644 vendor/github.com/go-playground/validator/v10/cache.go delete mode 100644 vendor/github.com/go-playground/validator/v10/country_codes.go delete mode 100644 vendor/github.com/go-playground/validator/v10/doc.go delete mode 100644 vendor/github.com/go-playground/validator/v10/errors.go delete mode 100644 vendor/github.com/go-playground/validator/v10/field_level.go delete mode 100644 vendor/github.com/go-playground/validator/v10/go.mod delete mode 100644 vendor/github.com/go-playground/validator/v10/go.sum delete mode 100644 vendor/github.com/go-playground/validator/v10/logo.png delete mode 100644 vendor/github.com/go-playground/validator/v10/regexes.go delete mode 100644 vendor/github.com/go-playground/validator/v10/struct_level.go delete mode 100644 vendor/github.com/go-playground/validator/v10/translations.go delete mode 100644 vendor/github.com/go-playground/validator/v10/util.go delete mode 100644 vendor/github.com/go-playground/validator/v10/validator.go delete mode 100644 vendor/github.com/go-playground/validator/v10/validator_instance.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/.gitignore delete mode 100644 vendor/github.com/go-sql-driver/mysql/.travis.yml delete mode 100644 vendor/github.com/go-sql-driver/mysql/AUTHORS delete mode 100644 vendor/github.com/go-sql-driver/mysql/CHANGELOG.md delete mode 100644 vendor/github.com/go-sql-driver/mysql/LICENSE delete mode 100644 vendor/github.com/go-sql-driver/mysql/README.md delete mode 100644 vendor/github.com/go-sql-driver/mysql/auth.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/buffer.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/collations.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/conncheck.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/conncheck_dummy.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/connection.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/connector.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/const.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/driver.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/dsn.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/errors.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/fields.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/go.mod delete mode 100644 vendor/github.com/go-sql-driver/mysql/infile.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/nulltime.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/nulltime_go113.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/nulltime_legacy.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/packets.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/result.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/rows.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/statement.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/transaction.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/utils.go delete mode 100644 vendor/github.com/golang/protobuf/AUTHORS delete mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/protobuf/LICENSE delete mode 100644 vendor/github.com/golang/protobuf/proto/clone.go delete mode 100644 vendor/github.com/golang/protobuf/proto/decode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go delete mode 100644 vendor/github.com/golang/protobuf/proto/discard.go delete mode 100644 vendor/github.com/golang/protobuf/proto/encode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/equal.go delete mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/golang/protobuf/proto/lib.go delete mode 100644 vendor/github.com/golang/protobuf/proto/message_set.go delete mode 100644 vendor/github.com/golang/protobuf/proto/pointer_reflect.go delete mode 100644 vendor/github.com/golang/protobuf/proto/pointer_unsafe.go delete mode 100644 vendor/github.com/golang/protobuf/proto/properties.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_marshal.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_merge.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_unmarshal.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_parser.go delete mode 100644 vendor/github.com/inconshreveable/mousetrap/LICENSE delete mode 100644 vendor/github.com/inconshreveable/mousetrap/README.md delete mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_others.go delete mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows.go delete mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go delete mode 100644 vendor/github.com/jinzhu/gorm/.gitignore delete mode 100644 vendor/github.com/jinzhu/gorm/License delete mode 100644 vendor/github.com/jinzhu/gorm/README.md delete mode 100644 vendor/github.com/jinzhu/gorm/association.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback_create.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback_delete.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback_query.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback_query_preload.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback_row_query.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback_save.go delete mode 100644 vendor/github.com/jinzhu/gorm/callback_update.go delete mode 100644 vendor/github.com/jinzhu/gorm/dialect.go delete mode 100644 vendor/github.com/jinzhu/gorm/dialect_common.go delete mode 100644 vendor/github.com/jinzhu/gorm/dialect_mysql.go delete mode 100644 vendor/github.com/jinzhu/gorm/dialect_postgres.go delete mode 100644 vendor/github.com/jinzhu/gorm/dialect_sqlite3.go delete mode 100644 vendor/github.com/jinzhu/gorm/docker-compose.yml delete mode 100644 vendor/github.com/jinzhu/gorm/errors.go delete mode 100644 vendor/github.com/jinzhu/gorm/field.go delete mode 100644 vendor/github.com/jinzhu/gorm/go.mod delete mode 100644 vendor/github.com/jinzhu/gorm/go.sum delete mode 100644 vendor/github.com/jinzhu/gorm/interface.go delete mode 100644 vendor/github.com/jinzhu/gorm/join_table_handler.go delete mode 100644 vendor/github.com/jinzhu/gorm/logger.go delete mode 100644 vendor/github.com/jinzhu/gorm/main.go delete mode 100644 vendor/github.com/jinzhu/gorm/model.go delete mode 100644 vendor/github.com/jinzhu/gorm/model_struct.go delete mode 100644 vendor/github.com/jinzhu/gorm/naming.go delete mode 100644 vendor/github.com/jinzhu/gorm/scope.go delete mode 100644 vendor/github.com/jinzhu/gorm/search.go delete mode 100644 vendor/github.com/jinzhu/gorm/test_all.sh delete mode 100644 vendor/github.com/jinzhu/gorm/utils.go delete mode 100644 vendor/github.com/jinzhu/gorm/wercker.yml delete mode 100644 vendor/github.com/jinzhu/inflection/LICENSE delete mode 100644 vendor/github.com/jinzhu/inflection/README.md delete mode 100644 vendor/github.com/jinzhu/inflection/go.mod delete mode 100644 vendor/github.com/jinzhu/inflection/inflections.go delete mode 100644 vendor/github.com/jinzhu/inflection/wercker.yml delete mode 100644 vendor/github.com/json-iterator/go/.codecov.yml delete mode 100644 vendor/github.com/json-iterator/go/.gitignore delete mode 100644 vendor/github.com/json-iterator/go/.travis.yml delete mode 100644 vendor/github.com/json-iterator/go/Gopkg.lock delete mode 100644 vendor/github.com/json-iterator/go/Gopkg.toml delete mode 100644 vendor/github.com/json-iterator/go/LICENSE delete mode 100644 vendor/github.com/json-iterator/go/README.md delete mode 100644 vendor/github.com/json-iterator/go/adapter.go delete mode 100644 vendor/github.com/json-iterator/go/any.go delete mode 100644 vendor/github.com/json-iterator/go/any_array.go delete mode 100644 vendor/github.com/json-iterator/go/any_bool.go delete mode 100644 vendor/github.com/json-iterator/go/any_float.go delete mode 100644 vendor/github.com/json-iterator/go/any_int32.go delete mode 100644 vendor/github.com/json-iterator/go/any_int64.go delete mode 100644 vendor/github.com/json-iterator/go/any_invalid.go delete mode 100644 vendor/github.com/json-iterator/go/any_nil.go delete mode 100644 vendor/github.com/json-iterator/go/any_number.go delete mode 100644 vendor/github.com/json-iterator/go/any_object.go delete mode 100644 vendor/github.com/json-iterator/go/any_str.go delete mode 100644 vendor/github.com/json-iterator/go/any_uint32.go delete mode 100644 vendor/github.com/json-iterator/go/any_uint64.go delete mode 100644 vendor/github.com/json-iterator/go/build.sh delete mode 100644 vendor/github.com/json-iterator/go/config.go delete mode 100644 vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md delete mode 100644 vendor/github.com/json-iterator/go/go.mod delete mode 100644 vendor/github.com/json-iterator/go/go.sum delete mode 100644 vendor/github.com/json-iterator/go/iter.go delete mode 100644 vendor/github.com/json-iterator/go/iter_array.go delete mode 100644 vendor/github.com/json-iterator/go/iter_float.go delete mode 100644 vendor/github.com/json-iterator/go/iter_int.go delete mode 100644 vendor/github.com/json-iterator/go/iter_object.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip_sloppy.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip_strict.go delete mode 100644 vendor/github.com/json-iterator/go/iter_str.go delete mode 100644 vendor/github.com/json-iterator/go/jsoniter.go delete mode 100644 vendor/github.com/json-iterator/go/pool.go delete mode 100644 vendor/github.com/json-iterator/go/reflect.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_array.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_dynamic.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_extension.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_number.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_raw_message.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_map.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_marshaler.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_native.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_optional.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_slice.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_struct_decoder.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_struct_encoder.go delete mode 100644 vendor/github.com/json-iterator/go/stream.go delete mode 100644 vendor/github.com/json-iterator/go/stream_float.go delete mode 100644 vendor/github.com/json-iterator/go/stream_int.go delete mode 100644 vendor/github.com/json-iterator/go/stream_str.go delete mode 100644 vendor/github.com/json-iterator/go/test.sh delete mode 100644 vendor/github.com/leodido/go-urn/.gitignore delete mode 100644 vendor/github.com/leodido/go-urn/.travis.yml delete mode 100644 vendor/github.com/leodido/go-urn/LICENSE delete mode 100644 vendor/github.com/leodido/go-urn/README.md delete mode 100644 vendor/github.com/leodido/go-urn/go.mod delete mode 100644 vendor/github.com/leodido/go-urn/go.sum delete mode 100644 vendor/github.com/leodido/go-urn/machine.go delete mode 100644 vendor/github.com/leodido/go-urn/machine.go.rl delete mode 100644 vendor/github.com/leodido/go-urn/makefile delete mode 100644 vendor/github.com/leodido/go-urn/urn.go delete mode 100644 vendor/github.com/mattn/go-colorable/.travis.yml delete mode 100644 vendor/github.com/mattn/go-colorable/LICENSE delete mode 100644 vendor/github.com/mattn/go-colorable/README.md delete mode 100644 vendor/github.com/mattn/go-colorable/colorable_appengine.go delete mode 100644 vendor/github.com/mattn/go-colorable/colorable_others.go delete mode 100644 vendor/github.com/mattn/go-colorable/colorable_windows.go delete mode 100644 vendor/github.com/mattn/go-colorable/go.mod delete mode 100644 vendor/github.com/mattn/go-colorable/go.sum delete mode 100644 vendor/github.com/mattn/go-colorable/noncolorable.go delete mode 100644 vendor/github.com/mattn/go-isatty/.travis.yml delete mode 100644 vendor/github.com/mattn/go-isatty/LICENSE delete mode 100644 vendor/github.com/mattn/go-isatty/README.md delete mode 100644 vendor/github.com/mattn/go-isatty/doc.go delete mode 100644 vendor/github.com/mattn/go-isatty/go.mod delete mode 100644 vendor/github.com/mattn/go-isatty/go.sum delete mode 100644 vendor/github.com/mattn/go-isatty/go.test.sh delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_plan9.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_tcgets.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go delete mode 100644 vendor/github.com/mattn/go-isatty/renovate.json delete mode 100644 vendor/github.com/mitchellh/mapstructure/.travis.yml delete mode 100644 vendor/github.com/mitchellh/mapstructure/CHANGELOG.md delete mode 100644 vendor/github.com/mitchellh/mapstructure/LICENSE delete mode 100644 vendor/github.com/mitchellh/mapstructure/README.md delete mode 100644 vendor/github.com/mitchellh/mapstructure/decode_hooks.go delete mode 100644 vendor/github.com/mitchellh/mapstructure/error.go delete mode 100644 vendor/github.com/mitchellh/mapstructure/go.mod delete mode 100644 vendor/github.com/mitchellh/mapstructure/mapstructure.go delete mode 100644 vendor/github.com/modern-go/concurrent/LICENSE delete mode 100644 vendor/github.com/modern-go/concurrent/README.md delete mode 100644 vendor/github.com/modern-go/concurrent/executor.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_above_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_below_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/unbounded_executor.go delete mode 100644 vendor/github.com/modern-go/reflect2/.gitignore delete mode 100644 vendor/github.com/modern-go/reflect2/.travis.yml delete mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.lock delete mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.toml delete mode 100644 vendor/github.com/modern-go/reflect2/LICENSE delete mode 100644 vendor/github.com/modern-go/reflect2/README.md delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_amd64.s delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_kind.go delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_386.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm64.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mips64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mipsx.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_s390x.s delete mode 100644 vendor/github.com/modern-go/reflect2/safe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_type.go delete mode 100644 vendor/github.com/modern-go/reflect2/test.sh delete mode 100644 vendor/github.com/modern-go/reflect2/type_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_array.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_eface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_iface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_link.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_ptr.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_type.go delete mode 100644 vendor/github.com/shopspring/decimal/.gitignore delete mode 100644 vendor/github.com/shopspring/decimal/.travis.yml delete mode 100644 vendor/github.com/shopspring/decimal/LICENSE delete mode 100644 vendor/github.com/shopspring/decimal/README.md delete mode 100644 vendor/github.com/shopspring/decimal/decimal-go.go delete mode 100644 vendor/github.com/shopspring/decimal/decimal.go delete mode 100644 vendor/github.com/shopspring/decimal/rounding.go delete mode 100644 vendor/github.com/spf13/cobra/.gitignore delete mode 100644 vendor/github.com/spf13/cobra/.mailmap delete mode 100644 vendor/github.com/spf13/cobra/.travis.yml delete mode 100644 vendor/github.com/spf13/cobra/LICENSE.txt delete mode 100644 vendor/github.com/spf13/cobra/Makefile delete mode 100644 vendor/github.com/spf13/cobra/README.md delete mode 100644 vendor/github.com/spf13/cobra/args.go delete mode 100644 vendor/github.com/spf13/cobra/bash_completions.go delete mode 100644 vendor/github.com/spf13/cobra/bash_completions.md delete mode 100644 vendor/github.com/spf13/cobra/cobra.go delete mode 100644 vendor/github.com/spf13/cobra/command.go delete mode 100644 vendor/github.com/spf13/cobra/command_notwin.go delete mode 100644 vendor/github.com/spf13/cobra/command_win.go delete mode 100644 vendor/github.com/spf13/cobra/custom_completions.go delete mode 100644 vendor/github.com/spf13/cobra/fish_completions.go delete mode 100644 vendor/github.com/spf13/cobra/fish_completions.md delete mode 100644 vendor/github.com/spf13/cobra/go.mod delete mode 100644 vendor/github.com/spf13/cobra/go.sum delete mode 100644 vendor/github.com/spf13/cobra/powershell_completions.go delete mode 100644 vendor/github.com/spf13/cobra/powershell_completions.md delete mode 100644 vendor/github.com/spf13/cobra/shell_completions.go delete mode 100644 vendor/github.com/spf13/cobra/zsh_completions.go delete mode 100644 vendor/github.com/spf13/cobra/zsh_completions.md delete mode 100644 vendor/github.com/spf13/pflag/.gitignore delete mode 100644 vendor/github.com/spf13/pflag/.travis.yml delete mode 100644 vendor/github.com/spf13/pflag/LICENSE delete mode 100644 vendor/github.com/spf13/pflag/README.md delete mode 100644 vendor/github.com/spf13/pflag/bool.go delete mode 100644 vendor/github.com/spf13/pflag/bool_slice.go delete mode 100644 vendor/github.com/spf13/pflag/bytes.go delete mode 100644 vendor/github.com/spf13/pflag/count.go delete mode 100644 vendor/github.com/spf13/pflag/duration.go delete mode 100644 vendor/github.com/spf13/pflag/duration_slice.go delete mode 100644 vendor/github.com/spf13/pflag/flag.go delete mode 100644 vendor/github.com/spf13/pflag/float32.go delete mode 100644 vendor/github.com/spf13/pflag/float64.go delete mode 100644 vendor/github.com/spf13/pflag/golangflag.go delete mode 100644 vendor/github.com/spf13/pflag/int.go delete mode 100644 vendor/github.com/spf13/pflag/int16.go delete mode 100644 vendor/github.com/spf13/pflag/int32.go delete mode 100644 vendor/github.com/spf13/pflag/int64.go delete mode 100644 vendor/github.com/spf13/pflag/int8.go delete mode 100644 vendor/github.com/spf13/pflag/int_slice.go delete mode 100644 vendor/github.com/spf13/pflag/ip.go delete mode 100644 vendor/github.com/spf13/pflag/ip_slice.go delete mode 100644 vendor/github.com/spf13/pflag/ipmask.go delete mode 100644 vendor/github.com/spf13/pflag/ipnet.go delete mode 100644 vendor/github.com/spf13/pflag/string.go delete mode 100644 vendor/github.com/spf13/pflag/string_array.go delete mode 100644 vendor/github.com/spf13/pflag/string_slice.go delete mode 100644 vendor/github.com/spf13/pflag/string_to_int.go delete mode 100644 vendor/github.com/spf13/pflag/string_to_string.go delete mode 100644 vendor/github.com/spf13/pflag/uint.go delete mode 100644 vendor/github.com/spf13/pflag/uint16.go delete mode 100644 vendor/github.com/spf13/pflag/uint32.go delete mode 100644 vendor/github.com/spf13/pflag/uint64.go delete mode 100644 vendor/github.com/spf13/pflag/uint8.go delete mode 100644 vendor/github.com/spf13/pflag/uint_slice.go delete mode 100644 vendor/github.com/streadway/amqp/.gitignore delete mode 100644 vendor/github.com/streadway/amqp/.travis.yml delete mode 100644 vendor/github.com/streadway/amqp/CONTRIBUTING.md delete mode 100644 vendor/github.com/streadway/amqp/LICENSE delete mode 100644 vendor/github.com/streadway/amqp/README.md delete mode 100644 vendor/github.com/streadway/amqp/allocator.go delete mode 100644 vendor/github.com/streadway/amqp/auth.go delete mode 100644 vendor/github.com/streadway/amqp/certs.sh delete mode 100644 vendor/github.com/streadway/amqp/channel.go delete mode 100644 vendor/github.com/streadway/amqp/confirms.go delete mode 100644 vendor/github.com/streadway/amqp/connection.go delete mode 100644 vendor/github.com/streadway/amqp/consumers.go delete mode 100644 vendor/github.com/streadway/amqp/delivery.go delete mode 100644 vendor/github.com/streadway/amqp/doc.go delete mode 100644 vendor/github.com/streadway/amqp/fuzz.go delete mode 100644 vendor/github.com/streadway/amqp/gen.sh delete mode 100644 vendor/github.com/streadway/amqp/go.mod delete mode 100644 vendor/github.com/streadway/amqp/pre-commit delete mode 100644 vendor/github.com/streadway/amqp/read.go delete mode 100644 vendor/github.com/streadway/amqp/return.go delete mode 100644 vendor/github.com/streadway/amqp/spec091.go delete mode 100644 vendor/github.com/streadway/amqp/types.go delete mode 100644 vendor/github.com/streadway/amqp/uri.go delete mode 100644 vendor/github.com/streadway/amqp/write.go delete mode 100644 vendor/github.com/toolkits/file/downloader.go delete mode 100644 vendor/github.com/toolkits/file/file.go delete mode 100644 vendor/github.com/toolkits/file/reader.go delete mode 100644 vendor/github.com/toolkits/file/writer.go delete mode 100644 vendor/github.com/toolkits/net/ip.go delete mode 100644 vendor/github.com/toolkits/net/net.go delete mode 100644 vendor/github.com/toolkits/net/rpc.go delete mode 100644 vendor/github.com/toolkits/net/url.go delete mode 100644 vendor/github.com/troopstack/troop/LICENSE delete mode 100644 vendor/github.com/troopstack/troop/src/model/client.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/file.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/fileManage.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/host.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/page.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/ping.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/plugin.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/rmq.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/rpc.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/scout.go delete mode 100644 vendor/github.com/troopstack/troop/src/model/task.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/cmd.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/command.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/file.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/ping.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/plugin.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/pluginPull.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/pluginUpdate.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/pluginVersion.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/result.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/scout.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/scoutUpdate.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/start.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/cmd/stop.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/config.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/err.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/http.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/ini_parser.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/target_ini.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/tool.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/utils.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/client/utils/var.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/http/controllers/plugin.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/http/controllers/remove.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/http/controllers/save.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/http/http.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/http/routers.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/utils/config.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/utils/err.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/utils/ini_parser.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/utils/system.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/utils/utils.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/file/utils/var.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/cache/scout.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/cache/task/task.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/database/mysql.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/database/scout.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/balaTask.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/file.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/fileManage.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/host.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/page.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/ping.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/plugin.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/task.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/controllers/tasking.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/http.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/http/routers.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/rmq/rmqPool.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/rpc/plugin.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/rpc/pong.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/rpc/rpc.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/rpc/scout.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/rpc/task.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/scout/accept.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/scout/plugin.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/scout/reset.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/aes.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/config.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/err.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/general.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/ini_parser.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/pki.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/plugins.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/rsa.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/signal.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/system.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/task.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/utils.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/general/utils/var.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/rmq/message.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/rmq/rmq.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/rpc/task.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/run/file.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/run/fileManage.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/run/order.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/run/plugin.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/aes.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/config.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/err.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/general.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/handshake.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/ini_parser.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/pki.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/rpc.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/rsa.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/scout.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/system.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/task.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/tools.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/utils.go delete mode 100644 vendor/github.com/troopstack/troop/src/modules/scout/utils/var.go delete mode 100644 vendor/github.com/ugorji/go/codec/0_importpath.go delete mode 100644 vendor/github.com/ugorji/go/codec/LICENSE delete mode 100644 vendor/github.com/ugorji/go/codec/binc.go delete mode 100644 vendor/github.com/ugorji/go/codec/build.sh delete mode 100644 vendor/github.com/ugorji/go/codec/cbor.go delete mode 100644 vendor/github.com/ugorji/go/codec/codecgen.go delete mode 100644 vendor/github.com/ugorji/go/codec/decode.go delete mode 100644 vendor/github.com/ugorji/go/codec/doc.go delete mode 100644 vendor/github.com/ugorji/go/codec/encode.go delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.not.go delete mode 100644 vendor/github.com/ugorji/go/codec/float.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-enc-chan.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen.go delete mode 100644 vendor/github.com/ugorji/go/codec/go.mod delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_gte_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_lt_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_gte_go19.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go19.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_gte_go112.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_lt_go112.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_gte_go17.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper.s delete mode 100644 vendor/github.com/ugorji/go/codec/helper_internal.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper_not_unsafe.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper_unsafe.go delete mode 100644 vendor/github.com/ugorji/go/codec/json.go delete mode 100644 vendor/github.com/ugorji/go/codec/mammoth-test.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/mammoth2-test.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/msgpack.go delete mode 100644 vendor/github.com/ugorji/go/codec/prebuild.go delete mode 100644 vendor/github.com/ugorji/go/codec/reader.go delete mode 100644 vendor/github.com/ugorji/go/codec/register_ext.go delete mode 100644 vendor/github.com/ugorji/go/codec/rpc.go delete mode 100644 vendor/github.com/ugorji/go/codec/simple.go delete mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/test-cbor-goldens.json delete mode 100644 vendor/github.com/ugorji/go/codec/test.py delete mode 100644 vendor/github.com/ugorji/go/codec/writer.go delete mode 100644 vendor/golang.org/x/crypto/AUTHORS delete mode 100644 vendor/golang.org/x/crypto/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/crypto/LICENSE delete mode 100644 vendor/golang.org/x/crypto/PATENTS delete mode 100644 vendor/golang.org/x/crypto/sha3/doc.go delete mode 100644 vendor/golang.org/x/crypto/sha3/hashes.go delete mode 100644 vendor/golang.org/x/crypto/sha3/hashes_generic.go delete mode 100644 vendor/golang.org/x/crypto/sha3/keccakf.go delete mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.go delete mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.s delete mode 100644 vendor/golang.org/x/crypto/sha3/register.go delete mode 100644 vendor/golang.org/x/crypto/sha3/sha3.go delete mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.go delete mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.s delete mode 100644 vendor/golang.org/x/crypto/sha3/shake.go delete mode 100644 vendor/golang.org/x/crypto/sha3/shake_generic.go delete mode 100644 vendor/golang.org/x/crypto/sha3/xor.go delete mode 100644 vendor/golang.org/x/crypto/sha3/xor_generic.go delete mode 100644 vendor/golang.org/x/crypto/sha3/xor_unaligned.go delete mode 100644 vendor/golang.org/x/sys/AUTHORS delete mode 100644 vendor/golang.org/x/sys/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/sys/LICENSE delete mode 100644 vendor/golang.org/x/sys/PATENTS delete mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s delete mode 100644 vendor/golang.org/x/sys/cpu/byteorder.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.s delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_x86.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_mips64x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_mipsx.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_riscv64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.s delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_wasm.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.s delete mode 100644 vendor/golang.org/x/sys/cpu/hwcap_linux.go delete mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/.gitignore delete mode 100644 vendor/golang.org/x/sys/unix/README.md delete mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/aliases.go delete mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/constants.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dirent.go delete mode 100644 vendor/golang.org/x/sys/unix/endian_big.go delete mode 100644 vendor/golang.org/x/sys/unix/endian_little.go delete mode 100644 vendor/golang.org/x/sys/unix/env_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go delete mode 100644 vendor/golang.org/x/sys/unix/fdset.go delete mode 100644 vendor/golang.org/x/sys/unix/gccgo.go delete mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c delete mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ioctl.go delete mode 100644 vendor/golang.org/x/sys/unix/mkall.sh delete mode 100644 vendor/golang.org/x/sys/unix/mkerrors.sh delete mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/pledge_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/race.go delete mode 100644 vendor/golang.org/x/sys/unix/race0.go delete mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go delete mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go delete mode 100644 vendor/golang.org/x/sys/unix/str.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_illumos.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/unix/timestruct.go delete mode 100644 vendor/golang.org/x/sys/unix/unveil_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_x86_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go delete mode 100644 vendor/gopkg.in/ini.v1/.gitignore delete mode 100644 vendor/gopkg.in/ini.v1/LICENSE delete mode 100644 vendor/gopkg.in/ini.v1/Makefile delete mode 100644 vendor/gopkg.in/ini.v1/README.md delete mode 100644 vendor/gopkg.in/ini.v1/codecov.yml delete mode 100644 vendor/gopkg.in/ini.v1/data_source.go delete mode 100644 vendor/gopkg.in/ini.v1/deprecated.go delete mode 100644 vendor/gopkg.in/ini.v1/error.go delete mode 100644 vendor/gopkg.in/ini.v1/file.go delete mode 100644 vendor/gopkg.in/ini.v1/helper.go delete mode 100644 vendor/gopkg.in/ini.v1/ini.go delete mode 100644 vendor/gopkg.in/ini.v1/key.go delete mode 100644 vendor/gopkg.in/ini.v1/parser.go delete mode 100644 vendor/gopkg.in/ini.v1/section.go delete mode 100644 vendor/gopkg.in/ini.v1/struct.go delete mode 100644 vendor/gopkg.in/yaml.v2/.travis.yml delete mode 100644 vendor/gopkg.in/yaml.v2/LICENSE delete mode 100644 vendor/gopkg.in/yaml.v2/LICENSE.libyaml delete mode 100644 vendor/gopkg.in/yaml.v2/NOTICE delete mode 100644 vendor/gopkg.in/yaml.v2/README.md delete mode 100644 vendor/gopkg.in/yaml.v2/apic.go delete mode 100644 vendor/gopkg.in/yaml.v2/decode.go delete mode 100644 vendor/gopkg.in/yaml.v2/emitterc.go delete mode 100644 vendor/gopkg.in/yaml.v2/encode.go delete mode 100644 vendor/gopkg.in/yaml.v2/go.mod delete mode 100644 vendor/gopkg.in/yaml.v2/parserc.go delete mode 100644 vendor/gopkg.in/yaml.v2/readerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/resolve.go delete mode 100644 vendor/gopkg.in/yaml.v2/scannerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/sorter.go delete mode 100644 vendor/gopkg.in/yaml.v2/writerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/yaml.go delete mode 100644 vendor/gopkg.in/yaml.v2/yamlh.go delete mode 100644 vendor/gopkg.in/yaml.v2/yamlprivateh.go delete mode 100644 vendor/modules.txt diff --git a/src/modules/client/cmd/plugin.go b/src/modules/client/cmd/plugin.go index a0bb55a..43ac79f 100644 --- a/src/modules/client/cmd/plugin.go +++ b/src/modules/client/cmd/plugin.go @@ -48,7 +48,7 @@ func init() { func plugin(c *cobra.Command, args []string) error { - pingUrl := utils.Config().General.Addresses + "/plugin" + pingUrl := utils.Config().General.Addresses + "/plugin/job" target, err := TargetParse(args[0]) if err != nil { diff --git a/src/modules/client/cmd/pluginPull.go b/src/modules/client/cmd/pluginPull.go index 61c2b15..56fcf58 100644 --- a/src/modules/client/cmd/pluginPull.go +++ b/src/modules/client/cmd/pluginPull.go @@ -23,7 +23,7 @@ troop plugin.pull } func pluginPull(c *cobra.Command, args []string) error { - url := utils.Config().General.Addresses + "/plugin_pull" + url := utils.Config().General.Addresses + "/plugin/pull" data := make(map[string]interface{}) diff --git a/src/modules/client/cmd/pluginUpdate.go b/src/modules/client/cmd/pluginUpdate.go index ed40e6f..d59329e 100644 --- a/src/modules/client/cmd/pluginUpdate.go +++ b/src/modules/client/cmd/pluginUpdate.go @@ -51,7 +51,7 @@ func pluginUpdate(c *cobra.Command, args []string) error { return errors.New("error: missing target parameters") } - pingUrl := utils.Config().General.Addresses + "/plugin" + pingUrl := utils.Config().General.Addresses + "/plugin/job" target, err := TargetParse(args[0]) if err != nil { diff --git a/src/modules/client/cmd/pluginVersion.go b/src/modules/client/cmd/pluginVersion.go index fbca673..1a52423 100644 --- a/src/modules/client/cmd/pluginVersion.go +++ b/src/modules/client/cmd/pluginVersion.go @@ -46,7 +46,7 @@ func pluginVersion(c *cobra.Command, args []string) error { return errors.New("error: missing target parameters") } - pingUrl := utils.Config().General.Addresses + "/plugin" + pingUrl := utils.Config().General.Addresses + "/plugin/job" target, err := TargetParse(args[0]) if err != nil { diff --git a/src/modules/general/http/controllers/host.go b/src/modules/general/http/controllers/host.go index cb4a839..e4bcc1f 100644 --- a/src/modules/general/http/controllers/host.go +++ b/src/modules/general/http/controllers/host.go @@ -44,6 +44,25 @@ func HostList(c *gin.Context) { return } +func HostDetail(c *gin.Context) { + h := gin.H{ + "result": nil, + "error": "", + "code": 0, + } + + host, have := database.IsExistScout(c.Param("hostname")) + if have { + h["result"] = host + } else { + h["error"] = "主机不存在" + h["code"] = 1 + } + + c.JSON(http.StatusOK, h) + return +} + type AllHosts struct { Accepted []*model.Host Unaccepted []string diff --git a/src/modules/general/http/controllers/plugin.go b/src/modules/general/http/controllers/plugin/job.go similarity index 83% rename from src/modules/general/http/controllers/plugin.go rename to src/modules/general/http/controllers/plugin/job.go index dad0622..0a4759a 100644 --- a/src/modules/general/http/controllers/plugin.go +++ b/src/modules/general/http/controllers/plugin/job.go @@ -1,4 +1,4 @@ -package controllers +package plugin import ( "bytes" @@ -10,33 +10,18 @@ import ( "strings" "github.com/troopstack/troop/src/model" + "github.com/troopstack/troop/src/modules/general/http/controllers" "github.com/troopstack/troop/src/modules/general/utils" "github.com/gin-gonic/gin" ) -func PluginPull(c *gin.Context) { - h := gin.H{ - "result": "", - "error": "", - "code": 0, - } - - utils.PluginCh = make(chan int, 1) - go utils.InitPlugins() - initPluginsResult := <-utils.PluginCh - if initPluginsResult == 0 { - h["error"] = "error pulling plugin from git, please check general log" - h["code"] = 1 - c.JSON(http.StatusInternalServerError, h) - } else { - h["result"] = "successfully" - c.JSON(http.StatusOK, h) - } - return +type fileUploadResponse struct { + Url string } func PluginJob(c *gin.Context) { + // 执行插件任务 t := model.PluginRequest{} h := gin.H{ @@ -62,7 +47,7 @@ func PluginJob(c *gin.Context) { } // 目标校验 - scouts, err := TaskTargetVerify(t.Target, t.TargetType, t.OS, t.Tag) + scouts, err := controllers.TaskTargetVerify(t.Target, t.TargetType, t.OS, t.Tag) if err != nil { h["error"] = err.Error() h["code"] = 1 @@ -71,7 +56,7 @@ func PluginJob(c *gin.Context) { } // 生成TaskId - taskId := TaskGeneration() + taskId := controllers.TaskGeneration() Task := &model.ScoutPluginRequest{ TaskId: taskId, @@ -182,17 +167,17 @@ func PluginJob(c *gin.Context) { } // 任务存储 - TaskScouts := TaskSave(taskId, t.Detach, scouts) + TaskScouts := controllers.TaskSave(taskId, t.Detach, scouts) if t.Action == "config.update" { // 协程等待文件下发完毕之后让FM清理缓存文件 go utils.RemoveFMFile(TaskScouts, taskId) } // 任务推送 - TaskPush(taskId, scouts, TaskScouts, ScoutMessage) + controllers.TaskPush(taskId, scouts, TaskScouts, ScoutMessage) // 获取结果 - h = TaskResult(taskId, t.Detach, t.Timeout, h) + h = controllers.TaskResult(taskId, t.Detach, t.Timeout, h) c.JSON(http.StatusOK, h) return } diff --git a/src/modules/general/http/controllers/plugin/list.go b/src/modules/general/http/controllers/plugin/list.go new file mode 100644 index 0000000..6a28bd9 --- /dev/null +++ b/src/modules/general/http/controllers/plugin/list.go @@ -0,0 +1,21 @@ +package plugin + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/troopstack/troop/src/modules/general/utils" +) + +func PluginList(c *gin.Context) { + // 获取插件列表 + h := gin.H{ + "result": utils.Plugins, + "error": "", + "code": 0, + } + + c.JSON(http.StatusOK, h) + return +} diff --git a/src/modules/general/http/controllers/plugin/pull.go b/src/modules/general/http/controllers/plugin/pull.go new file mode 100644 index 0000000..a751c8b --- /dev/null +++ b/src/modules/general/http/controllers/plugin/pull.go @@ -0,0 +1,29 @@ +package plugin + +import ( + "github.com/gin-gonic/gin" + "github.com/troopstack/troop/src/modules/general/utils" + "net/http" +) + +func PluginPull(c *gin.Context) { + // 触发从git拉取插件 + h := gin.H{ + "result": "", + "error": "", + "code": 0, + } + + utils.PluginCh = make(chan int, 1) + go utils.InitPlugins() + initPluginsResult := <-utils.PluginCh + if initPluginsResult == 0 { + h["error"] = "error pulling plugin from git, please check general log" + h["code"] = 1 + c.JSON(http.StatusInternalServerError, h) + } else { + h["result"] = "successfully" + c.JSON(http.StatusOK, h) + } + return +} diff --git a/src/modules/general/http/controllers/tasking.go b/src/modules/general/http/controllers/tasking.go index dfccb77..39acb22 100644 --- a/src/modules/general/http/controllers/tasking.go +++ b/src/modules/general/http/controllers/tasking.go @@ -162,7 +162,6 @@ func TaskResult(taskId string, detach bool, timeout int, h gin.H) gin.H { } } } else { - loop: for { select { diff --git a/src/modules/general/http/routers.go b/src/modules/general/http/routers.go index dc578a3..5059054 100644 --- a/src/modules/general/http/routers.go +++ b/src/modules/general/http/routers.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/troopstack/troop/src/modules/general/http/controllers" + "github.com/troopstack/troop/src/modules/general/http/controllers/plugin" "github.com/troopstack/troop/src/modules/general/utils" "github.com/DeanThompson/ginpprof" @@ -27,12 +28,15 @@ func InitRouter() http.Handler { router.POST("/ping", controllers.Ping) router.POST("/file", controllers.FileSend) router.POST("/tasks", controllers.Tasks) - router.POST("/plugin", controllers.PluginJob) - router.POST("/plugin_pull", controllers.PluginPull) + + router.GET("/plugin", plugin.PluginList) + router.POST("/plugin/job", plugin.PluginJob) + router.POST("/plugin/pull", plugin.PluginPull) router.GET("/task", controllers.TaskInfo) router.GET("/hosts", controllers.HostList) router.GET("/hosts/all", controllers.AllHostList) + router.GET("/host/detail/:hostname", controllers.HostDetail) router.GET("/host/keys", controllers.HostKeyList) router.POST("/host/accept", controllers.AcceptHost) diff --git a/src/modules/general/rpc/scout.go b/src/modules/general/rpc/scout.go index 4213419..5f66c0d 100644 --- a/src/modules/general/rpc/scout.go +++ b/src/modules/general/rpc/scout.go @@ -43,7 +43,7 @@ func (t *Scout) Handshake(args *model.ScoutHandRequest, reply *model.ScoutHandRe Type: args.Type, PubKey: args.PubKey, Status: status, - AES: string(aesCi), + AES: aesCi, OS: args.OS, Tags: args.Tags, Plugins: args.Plugins, @@ -57,10 +57,10 @@ func (t *Scout) Handshake(args *model.ScoutHandRequest, reply *model.ScoutHandRe return err } if utils.Config().Scout.AutoAccept { - data, err := scout.AcceptScout(ScoutInfo) - if err != nil { - log.Print(err) - return err + data, aptErr := scout.AcceptScout(ScoutInfo) + if aptErr != nil { + log.Print(aptErr) + return aptErr } reply.Data = data reply.Plugins = utils.Plugins @@ -72,7 +72,7 @@ func (t *Scout) Handshake(args *model.ScoutHandRequest, reply *model.ScoutHandRe ScoutPubKey, is_have := utils.ReadScoutPubKey(args.Hostname) if is_have { // 存在该Scout的公钥 - if string(ScoutPubKey) == args.PubKey { + if ScoutPubKey == args.PubKey { // 公钥未改变 data, err := scout.AcceptScout(ScoutInfo) if err != nil { diff --git a/vendor/github.com/DeanThompson/ginpprof/.gitignore b/vendor/github.com/DeanThompson/ginpprof/.gitignore deleted file mode 100644 index daf913b..0000000 --- a/vendor/github.com/DeanThompson/ginpprof/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof diff --git a/vendor/github.com/DeanThompson/ginpprof/.travis.yml b/vendor/github.com/DeanThompson/ginpprof/.travis.yml deleted file mode 100644 index 8d798d3..0000000 --- a/vendor/github.com/DeanThompson/ginpprof/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -go: - - 1.7 - - 1.8 - - 1.9 - - 1.10 - - 1.11 - - 1.12 - -script: - - go test diff --git a/vendor/github.com/DeanThompson/ginpprof/LICENSE b/vendor/github.com/DeanThompson/ginpprof/LICENSE deleted file mode 100644 index a25bc61..0000000 --- a/vendor/github.com/DeanThompson/ginpprof/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Yangliang Li - -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. - diff --git a/vendor/github.com/DeanThompson/ginpprof/README.md b/vendor/github.com/DeanThompson/ginpprof/README.md deleted file mode 100644 index f5d658b..0000000 --- a/vendor/github.com/DeanThompson/ginpprof/README.md +++ /dev/null @@ -1,68 +0,0 @@ -ginpprof -======== - -[![GoDoc](https://godoc.org/github.com/DeanThompson/ginpprof?status.svg)](https://godoc.org/github.com/DeanThompson/ginpprof) -[![Build -Status](https://travis-ci.org/DeanThompson/ginpprof.svg?branch=master)](https://travis-ci.org/DeanThompson/ginpprof) - -A wrapper for [golang web framework gin](https://github.com/gin-gonic/gin) to use `net/http/pprof` easily. - -## Install - -First install ginpprof to your GOPATH using `go get`: - -```sh -go get github.com/DeanThompson/ginpprof -``` - -## Usage - -```go -package main - -import ( - "github.com/gin-gonic/gin" - - "github.com/DeanThompson/ginpprof" -) - -func main() { - router := gin.Default() - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - // automatically add routers for net/http/pprof - // e.g. /debug/pprof, /debug/pprof/heap, etc. - ginpprof.Wrap(router) - - // ginpprof also plays well with *gin.RouterGroup - // group := router.Group("/debug/pprof") - // ginpprof.WrapGroup(group) - - router.Run(":8080") -} -``` - -Start this server, and you will see such outputs: - -```text -[GIN-debug] GET /ping --> main.main.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/ --> github.com/DeanThompson/ginpprof.IndexHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/heap --> github.com/DeanThompson/ginpprof.HeapHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/goroutine --> github.com/DeanThompson/ginpprof.GoroutineHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/block --> github.com/DeanThompson/ginpprof.BlockHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/threadcreate --> github.com/DeanThompson/ginpprof.ThreadCreateHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/cmdline --> github.com/DeanThompson/ginpprof.CmdlineHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/profile --> github.com/DeanThompson/ginpprof.ProfileHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/symbol --> github.com/DeanThompson/ginpprof.SymbolHandler.func1 (3 handlers) -[GIN-debug] POST /debug/pprof/symbol --> github.com/DeanThompson/ginpprof.SymbolHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/trace --> github.com/DeanThompson/ginpprof.TraceHandler.func1 (3 handlers) -[GIN-debug] GET /debug/pprof/mutex --> github.com/DeanThompson/ginpprof.MutexHandler.func1 (3 handlers) -[GIN-debug] Listening and serving HTTP on :8080 -``` - -Now visit [http://127.0.0.1:8080/debug/pprof/](http://127.0.0.1:8080/debug/pprof/) and you'll see what you want. - -Have Fun. diff --git a/vendor/github.com/DeanThompson/ginpprof/pprof.go b/vendor/github.com/DeanThompson/ginpprof/pprof.go deleted file mode 100644 index 3fdaffd..0000000 --- a/vendor/github.com/DeanThompson/ginpprof/pprof.go +++ /dev/null @@ -1,131 +0,0 @@ -package ginpprof - -import ( - "net/http/pprof" - "strings" - - "github.com/gin-gonic/gin" -) - -// Wrap adds several routes from package `net/http/pprof` to *gin.Engine object -func Wrap(router *gin.Engine) { - WrapGroup(&router.RouterGroup) -} - -// Wrapper make sure we are backward compatible -var Wrapper = Wrap - -// WrapGroup adds several routes from package `net/http/pprof` to *gin.RouterGroup object -func WrapGroup(router *gin.RouterGroup) { - routers := []struct { - Method string - Path string - Handler gin.HandlerFunc - }{ - {"GET", "/debug/pprof/", IndexHandler()}, - {"GET", "/debug/pprof/heap", HeapHandler()}, - {"GET", "/debug/pprof/goroutine", GoroutineHandler()}, - {"GET", "/debug/pprof/allocs", AllocsHandler()}, - {"GET", "/debug/pprof/block", BlockHandler()}, - {"GET", "/debug/pprof/threadcreate", ThreadCreateHandler()}, - {"GET", "/debug/pprof/cmdline", CmdlineHandler()}, - {"GET", "/debug/pprof/profile", ProfileHandler()}, - {"GET", "/debug/pprof/symbol", SymbolHandler()}, - {"POST", "/debug/pprof/symbol", SymbolHandler()}, - {"GET", "/debug/pprof/trace", TraceHandler()}, - {"GET", "/debug/pprof/mutex", MutexHandler()}, - } - - basePath := strings.TrimSuffix(router.BasePath(), "/") - var prefix string - - switch { - case basePath == "": - prefix = "" - case strings.HasSuffix(basePath, "/debug"): - prefix = "/debug" - case strings.HasSuffix(basePath, "/debug/pprof"): - prefix = "/debug/pprof" - } - - for _, r := range routers { - router.Handle(r.Method, strings.TrimPrefix(r.Path, prefix), r.Handler) - } -} - -// IndexHandler will pass the call from /debug/pprof to pprof -func IndexHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Index(ctx.Writer, ctx.Request) - } -} - -// HeapHandler will pass the call from /debug/pprof/heap to pprof -func HeapHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Handler("heap").ServeHTTP(ctx.Writer, ctx.Request) - } -} - -// GoroutineHandler will pass the call from /debug/pprof/goroutine to pprof -func GoroutineHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Handler("goroutine").ServeHTTP(ctx.Writer, ctx.Request) - } -} - -// AllocsHandler will pass the call from /debug/pprof/allocs to pprof -func AllocsHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Handler("allocs").ServeHTTP(ctx.Writer, ctx.Request) - } -} - -// BlockHandler will pass the call from /debug/pprof/block to pprof -func BlockHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Handler("block").ServeHTTP(ctx.Writer, ctx.Request) - } -} - -// ThreadCreateHandler will pass the call from /debug/pprof/threadcreate to pprof -func ThreadCreateHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Handler("threadcreate").ServeHTTP(ctx.Writer, ctx.Request) - } -} - -// CmdlineHandler will pass the call from /debug/pprof/cmdline to pprof -func CmdlineHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Cmdline(ctx.Writer, ctx.Request) - } -} - -// ProfileHandler will pass the call from /debug/pprof/profile to pprof -func ProfileHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Profile(ctx.Writer, ctx.Request) - } -} - -// SymbolHandler will pass the call from /debug/pprof/symbol to pprof -func SymbolHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Symbol(ctx.Writer, ctx.Request) - } -} - -// TraceHandler will pass the call from /debug/pprof/trace to pprof -func TraceHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Trace(ctx.Writer, ctx.Request) - } -} - -// MutexHandler will pass the call from /debug/pprof/mutex to pprof -func MutexHandler() gin.HandlerFunc { - return func(ctx *gin.Context) { - pprof.Handler("mutex").ServeHTTP(ctx.Writer, ctx.Request) - } -} diff --git a/vendor/github.com/axgle/mahonia/8bit.go b/vendor/github.com/axgle/mahonia/8bit.go deleted file mode 100644 index f1f72b8..0000000 --- a/vendor/github.com/axgle/mahonia/8bit.go +++ /dev/null @@ -1,842 +0,0 @@ -package mahonia - -import ( - "fmt" - "sync" -) - -// Converters for simple 8-bit character sets. - -type eightBitInfo struct { - Name string - Aliases []string - - // the character used for characters that can't be converted - SubstitutionChar byte - - // a string containing all 256 characters, in order. - Repertoire string - - // used to synchronize unpacking Repertoire into the conversion tables - once *sync.Once - - // true if the first 128 characters are the same as US-ASCII - asciiCompatible bool - - byte2char [256]rune - char2byte map[rune]byte -} - -const asciiRepertoire = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f" - -func (info *eightBitInfo) register() { - var cs Charset - cs.Name = info.Name - cs.Aliases = info.Aliases - - info.once = new(sync.Once) - - cs.NewDecoder = func() Decoder { - info.once.Do(func() { info.unpack() }) - - return func(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - c = info.byte2char[p[0]] - - if c == 0xfffd { - status = INVALID_CHAR - } else { - status = SUCCESS - } - - size = 1 - return - } - } - - cs.NewEncoder = func() Encoder { - info.once.Do(func() { info.unpack() }) - - return func(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if c < 128 && info.asciiCompatible { - p[0] = byte(c) - return 1, SUCCESS - } - - b, ok := info.char2byte[c] - if !ok { - b = info.SubstitutionChar - status = INVALID_CHAR - } else { - status = SUCCESS - } - p[0] = b - size = 1 - return - } - } - - RegisterCharset(&cs) -} - -func (info *eightBitInfo) unpack() { - info.asciiCompatible = info.Repertoire[:128] == asciiRepertoire - - info.char2byte = make(map[rune]byte, 256) - i := 0 - for _, c := range info.Repertoire { - info.byte2char[i] = c - if c != 0xfffd { - info.char2byte[c] = byte(i) - } - i++ - } - if i != 256 { - panic(fmt.Errorf("%s has only %d characters", info.Name, i)) - } -} - -func init() { - for i := 0; i < len(eightBitCharsets); i++ { - eightBitCharsets[i].register() - } -} - -var eightBitCharsets = []eightBitInfo{ - { - Name: "ISO-8859-2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u02d8\u0141\u00a4\u013d\u015a\u00a7\u00a8\u0160\u015e\u0164\u0179\u00ad\u017d\u017b\u00b0\u0105\u02db\u0142\u00b4\u013e\u015b\u02c7\u00b8\u0161\u015f\u0165\u017a\u02dd\u017e\u017c\u0154\u00c1\u00c2\u0102\u00c4\u0139\u0106\u00c7\u010c\u00c9\u0118\u00cb\u011a\u00cd\u00ce\u010e\u0110\u0143\u0147\u00d3\u00d4\u0150\u00d6\u00d7\u0158\u016e\u00da\u0170\u00dc\u00dd\u0162\u00df\u0155\u00e1\u00e2\u0103\u00e4\u013a\u0107\u00e7\u010d\u00e9\u0119\u00eb\u011b\u00ed\u00ee\u010f\u0111\u0144\u0148\u00f3\u00f4\u0151\u00f6\u00f7\u0159\u016f\u00fa\u0171\u00fc\u00fd\u0163\u02d9", - Aliases: []string{"ISO_8859-2:1987", "iso-ir-101", "latin2", "l2", "csISOLatin2"}, - }, - { - Name: "ISO-8859-3", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0126\u02d8\u00a3\u00a4\ufffd\u0124\u00a7\u00a8\u0130\u015e\u011e\u0134\u00ad\ufffd\u017b\u00b0\u0127\u00b2\u00b3\u00b4\u00b5\u0125\u00b7\u00b8\u0131\u015f\u011f\u0135\u00bd\ufffd\u017c\u00c0\u00c1\u00c2\ufffd\u00c4\u010a\u0108\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\ufffd\u00d1\u00d2\u00d3\u00d4\u0120\u00d6\u00d7\u011c\u00d9\u00da\u00db\u00dc\u016c\u015c\u00df\u00e0\u00e1\u00e2\ufffd\u00e4\u010b\u0109\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\ufffd\u00f1\u00f2\u00f3\u00f4\u0121\u00f6\u00f7\u011d\u00f9\u00fa\u00fb\u00fc\u016d\u015d\u02d9", - Aliases: []string{"ISO_8859-3:1988", "iso-ir-109", "latin3", "l3", "csISOLatin3"}, - }, - { - Name: "ISO-8859-4", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0138\u0156\u00a4\u0128\u013b\u00a7\u00a8\u0160\u0112\u0122\u0166\u00ad\u017d\u00af\u00b0\u0105\u02db\u0157\u00b4\u0129\u013c\u02c7\u00b8\u0161\u0113\u0123\u0167\u014a\u017e\u014b\u0100\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u012e\u010c\u00c9\u0118\u00cb\u0116\u00cd\u00ce\u012a\u0110\u0145\u014c\u0136\u00d4\u00d5\u00d6\u00d7\u00d8\u0172\u00da\u00db\u00dc\u0168\u016a\u00df\u0101\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u012f\u010d\u00e9\u0119\u00eb\u0117\u00ed\u00ee\u012b\u0111\u0146\u014d\u0137\u00f4\u00f5\u00f6\u00f7\u00f8\u0173\u00fa\u00fb\u00fc\u0169\u016b\u02d9", - Aliases: []string{"ISO_8859-4:1988", "iso-ir-110", "latin4", "l4", "csISOLatin4"}, - }, - { - Name: "ISO-8859-5", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u00ad\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u2116\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u00a7\u045e\u045f", - Aliases: []string{"ISO_8859-5:1988", "iso-ir-144", "cyrillic", "csISOLatinCyrillic"}, - }, - { - Name: "ISO-8859-6", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\ufffd\ufffd\u00a4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u060c\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u061b\ufffd\ufffd\ufffd\u061f\ufffd\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\ufffd\ufffd\ufffd\ufffd\ufffd\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ISO_8859-6:1987", "iso-ir-127", "ECMA-114", "ASMO-708", "arabic", "csISOLatinArabic"}, - }, - { - Name: "ISO-8859-7", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u2018\u2019\u00a3\u20ac\u20af\u00a6\u00a7\u00a8\u00a9\u037a\u00ab\u00ac\u00ad\ufffd\u2015\u00b0\u00b1\u00b2\u00b3\u0384\u0385\u0386\u00b7\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", - Aliases: []string{"ISO_8859-7:2003", "iso-ir-126", "ELOT_928", "ECMA-118", "greek", "greek8", "csISOLatinGreek"}, - }, - { - Name: "ISO-8859-8", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2017\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\u200e\u200f\ufffd", - Aliases: []string{"ISO_8859-8:1999", "iso-ir-138", "hebrew", "csISOLatinHebrew"}, - }, - { - Name: "ISO-8859-9", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u011e\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u0130\u015e\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u011f\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u0131\u015f\u00ff", - Aliases: []string{"ISO_8859-9:1999", "iso-ir-148", "latin5", "l5", "csISOLatin5"}, - }, - { - Name: "ISO-8859-10", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0112\u0122\u012a\u0128\u0136\u00a7\u013b\u0110\u0160\u0166\u017d\u00ad\u016a\u014a\u00b0\u0105\u0113\u0123\u012b\u0129\u0137\u00b7\u013c\u0111\u0161\u0167\u017e\u2015\u016b\u014b\u0100\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u012e\u010c\u00c9\u0118\u00cb\u0116\u00cd\u00ce\u00cf\u00d0\u0145\u014c\u00d3\u00d4\u00d5\u00d6\u0168\u00d8\u0172\u00da\u00db\u00dc\u00dd\u00de\u00df\u0101\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u012f\u010d\u00e9\u0119\u00eb\u0117\u00ed\u00ee\u00ef\u00f0\u0146\u014d\u00f3\u00f4\u00f5\u00f6\u0169\u00f8\u0173\u00fa\u00fb\u00fc\u00fd\u00fe\u0138", - Aliases: []string{"iso_8859-10:1992", "l6", "iso-ir-157", "latin6", "csISOLatin6"}, - }, - { - Name: "ISO-8859-11", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"iso_8859-11:2001", "Latin/Thai", "TIS-620"}, - }, - { - Name: "ISO-8859-13", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u201d\u00a2\u00a3\u00a4\u201e\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u201c\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u2019", - Aliases: []string{"latin7", "Baltic Rim"}, - }, - { - Name: "ISO-8859-14", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u1e02\u1e03\u00a3\u010a\u010b\u1e0a\u00a7\u1e80\u00a9\u1e82\u1e0b\u1ef2\u00ad\u00ae\u0178\u1e1e\u1e1f\u0120\u0121\u1e40\u1e41\u00b6\u1e56\u1e81\u1e57\u1e83\u1e60\u1ef3\u1e84\u1e85\u1e61\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0174\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u1e6a\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u0176\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0175\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u1e6b\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u0177\u00ff", - Aliases: []string{"iso-ir-199", "ISO_8859-14:1998", "latin8", "iso-celtic", "l8"}, - }, - { - Name: "ISO-8859-15", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u20ac\u00a5\u0160\u00a7\u0161\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u017d\u00b5\u00b6\u00b7\u017e\u00b9\u00ba\u00bb\u0152\u0153\u0178\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff", - Aliases: []string{"Latin-9"}, - }, - { - Name: "ISO-8859-16", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0105\u0141\u20ac\u201e\u0160\u00a7\u0161\u00a9\u0218\u00ab\u0179\u00ad\u017a\u017b\u00b0\u00b1\u010c\u0142\u017d\u201d\u00b6\u00b7\u017e\u010d\u0219\u00bb\u0152\u0153\u0178\u017c\u00c0\u00c1\u00c2\u0102\u00c4\u0106\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0110\u0143\u00d2\u00d3\u00d4\u0150\u00d6\u015a\u0170\u00d9\u00da\u00db\u00dc\u0118\u021a\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u0107\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0111\u0144\u00f2\u00f3\u00f4\u0151\u00f6\u015b\u0171\u00f9\u00fa\u00fb\u00fc\u0119\u021b\u00ff", - Aliases: []string{"iso-ir-226", "ISO_8859-16:2001", "latin10", "l10"}, - }, - { - Name: "macos-0_2-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u00ff\u0178\u2044\u20ac\u2039\u203a\ufb01\ufb02\u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\u0131\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7", - Aliases: []string{"macos-0_2-10.2", "macintosh", "mac", "csMacintosh", "windows-10000", "macroman"}, - }, - { - Name: "macos-6_2-10.4", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00b9\u00b2\u00c9\u00b3\u00d6\u00dc\u0385\u00e0\u00e2\u00e4\u0384\u00a8\u00e7\u00e9\u00e8\u00ea\u00eb\u00a3\u2122\u00ee\u00ef\u2022\u00bd\u2030\u00f4\u00f6\u00a6\u20ac\u00f9\u00fb\u00fc\u2020\u0393\u0394\u0398\u039b\u039e\u03a0\u00df\u00ae\u00a9\u03a3\u03aa\u00a7\u2260\u00b0\u00b7\u0391\u00b1\u2264\u2265\u00a5\u0392\u0395\u0396\u0397\u0399\u039a\u039c\u03a6\u03ab\u03a8\u03a9\u03ac\u039d\u00ac\u039f\u03a1\u2248\u03a4\u00ab\u00bb\u2026\u00a0\u03a5\u03a7\u0386\u0388\u0153\u2013\u2015\u201c\u201d\u2018\u2019\u00f7\u0389\u038a\u038c\u038e\u03ad\u03ae\u03af\u03cc\u038f\u03cd\u03b1\u03b2\u03c8\u03b4\u03b5\u03c6\u03b3\u03b7\u03b9\u03be\u03ba\u03bb\u03bc\u03bd\u03bf\u03c0\u03ce\u03c1\u03c3\u03c4\u03b8\u03c9\u03c2\u03c7\u03c5\u03b6\u03ca\u03cb\u0390\u03b0\u00ad", - Aliases: []string{"macos-6_2-10.4", "x-mac-greek", "windows-10006", "macgr"}, - }, - { - Name: "macos-7_3-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u2020\u00b0\u0490\u00a3\u00a7\u2022\u00b6\u0406\u00ae\u00a9\u2122\u0402\u0452\u2260\u0403\u0453\u221e\u00b1\u2264\u2265\u0456\u00b5\u0491\u0408\u0404\u0454\u0407\u0457\u0409\u0459\u040a\u045a\u0458\u0405\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u040b\u045b\u040c\u045c\u0455\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u201e\u040e\u045e\u040f\u045f\u2116\u0401\u0451\u044f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u20ac", - Aliases: []string{"macos-7_3-10.2", "x-mac-cyrillic", "windows-10007", "mac-cyrillic", "maccy"}, - }, - { - Name: "macos-29-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u0100\u0101\u00c9\u0104\u00d6\u00dc\u00e1\u0105\u010c\u00e4\u010d\u0106\u0107\u00e9\u0179\u017a\u010e\u00ed\u010f\u0112\u0113\u0116\u00f3\u0117\u00f4\u00f6\u00f5\u00fa\u011a\u011b\u00fc\u2020\u00b0\u0118\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u0119\u00a8\u2260\u0123\u012e\u012f\u012a\u2264\u2265\u012b\u0136\u2202\u2211\u0142\u013b\u013c\u013d\u013e\u0139\u013a\u0145\u0146\u0143\u00ac\u221a\u0144\u0147\u2206\u00ab\u00bb\u2026\u00a0\u0148\u0150\u00d5\u0151\u014c\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u014d\u0154\u0155\u0158\u2039\u203a\u0159\u0156\u0157\u0160\u201a\u201e\u0161\u015a\u015b\u00c1\u0164\u0165\u00cd\u017d\u017e\u016a\u00d3\u00d4\u016b\u016e\u00da\u016f\u0170\u0171\u0172\u0173\u00dd\u00fd\u0137\u017b\u0141\u017c\u0122\u02c7", - Aliases: []string{"macos-29-10.2", "x-mac-centraleurroman", "windows-10029", "x-mac-ce", "macce", "maccentraleurope"}, - }, - { - Name: "macos-35-10.2", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u00ff\u0178\u011e\u011f\u0130\u0131\u015e\u015f\u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\uf8a0\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7", - Aliases: []string{"macos-35-10.2", "x-mac-turkish", "windows-10081", "mactr"}, - }, - { - Name: "windows-1250", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\ufffd\u201e\u2026\u2020\u2021\ufffd\u2030\u0160\u2039\u015a\u0164\u017d\u0179\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0161\u203a\u015b\u0165\u017e\u017a\u00a0\u02c7\u02d8\u0141\u00a4\u0104\u00a6\u00a7\u00a8\u00a9\u015e\u00ab\u00ac\u00ad\u00ae\u017b\u00b0\u00b1\u02db\u0142\u00b4\u00b5\u00b6\u00b7\u00b8\u0105\u015f\u00bb\u013d\u02dd\u013e\u017c\u0154\u00c1\u00c2\u0102\u00c4\u0139\u0106\u00c7\u010c\u00c9\u0118\u00cb\u011a\u00cd\u00ce\u010e\u0110\u0143\u0147\u00d3\u00d4\u0150\u00d6\u00d7\u0158\u016e\u00da\u0170\u00dc\u00dd\u0162\u00df\u0155\u00e1\u00e2\u0103\u00e4\u013a\u0107\u00e7\u010d\u00e9\u0119\u00eb\u011b\u00ed\u00ee\u010f\u0111\u0144\u0148\u00f3\u00f4\u0151\u00f6\u00f7\u0159\u016f\u00fa\u0171\u00fc\u00fd\u0163\u02d9", - }, - { - Name: "windows-1251", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0402\u0403\u201a\u0453\u201e\u2026\u2020\u2021\u20ac\u2030\u0409\u2039\u040a\u040c\u040b\u040f\u0452\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0459\u203a\u045a\u045c\u045b\u045f\u00a0\u040e\u045e\u0408\u00a4\u0490\u00a6\u00a7\u0401\u00a9\u0404\u00ab\u00ac\u00ad\u00ae\u0407\u00b0\u00b1\u0406\u0456\u0491\u00b5\u00b6\u00b7\u0451\u2116\u0454\u00bb\u0458\u0405\u0455\u0457\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f", - }, - { - Name: "windows-1252", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\ufffd\u017d\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\ufffd\u017e\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff", - }, - { - Name: "windows-1253", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\ufffd\u2030\ufffd\u2039\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\ufffd\u203a\ufffd\ufffd\ufffd\ufffd\u00a0\u0385\u0386\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\ufffd\u00ab\u00ac\u00ad\u00ae\u2015\u00b0\u00b1\u00b2\u00b3\u0384\u00b5\u00b6\u00b7\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", - }, - { - Name: "windows-1254", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\ufffd\ufffd\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u011e\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u0130\u015e\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u011f\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u0131\u015f\u00ff", - }, - { - Name: "windows-1255", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\ufffd\u2039\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\ufffd\u203a\ufffd\ufffd\ufffd\ufffd\u00a0\u00a1\u00a2\u00a3\u20aa\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\u00bf\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\ufffd\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2\u05c3\u05f0\u05f1\u05f2\u05f3\u05f4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\u200e\u200f\ufffd", - }, - { - Name: "windows-1256", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\u067e\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0679\u2039\u0152\u0686\u0698\u0688\u06af\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u06a9\u2122\u0691\u203a\u0153\u200c\u200d\u06ba\u00a0\u060c\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u06be\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u061b\u00bb\u00bc\u00bd\u00be\u061f\u06c1\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u00d7\u0637\u0638\u0639\u063a\u0640\u0641\u0642\u0643\u00e0\u0644\u00e2\u0645\u0646\u0647\u0648\u00e7\u00e8\u00e9\u00ea\u00eb\u0649\u064a\u00ee\u00ef\u064b\u064c\u064d\u064e\u00f4\u064f\u0650\u00f7\u0651\u00f9\u0652\u00fb\u00fc\u200e\u200f\u06d2", - }, - { - Name: "windows-1257", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\ufffd\u201e\u2026\u2020\u2021\ufffd\u2030\ufffd\u2039\ufffd\u00a8\u02c7\u00b8\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\ufffd\u203a\ufffd\u00af\u02db\ufffd\u00a0\ufffd\u00a2\u00a3\u00a4\ufffd\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u02d9", - }, - { - Name: "windows-1258", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\ufffd\u2039\u0152\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\ufffd\u203a\u0153\ufffd\ufffd\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u0102\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u0300\u00cd\u00ce\u00cf\u0110\u00d1\u0309\u00d3\u00d4\u01a0\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u01af\u0303\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u0301\u00ed\u00ee\u00ef\u0111\u00f1\u0323\u00f3\u00f4\u01a1\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u01b0\u20ab\u00ff", - }, - { - Name: "windows-874", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\ufffd\ufffd\ufffd\u2026\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", - }, - { - Name: "IBM037", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"cp037", "ebcdic-cp-us", "ebcdic-cp-ca", "ebcdic-cp-wt", "ebcdic-cp-nl", "csIBM037"}, - }, - { - Name: "ibm-273_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00c4.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec~\u00dc$*);^-/\u00c2[\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00dfstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00fcJKLMNOPQR\u00b9\u00fb}\u00f9\u00fa\u00ff\u00d6\u00f7STUVWXYZ\u00b2\u00d4\\\u00d2\u00d3\u00d50123456789\u00b3\u00db]\u00d9\u00da\u009f", - Aliases: []string{"ibm-273_P100-1995", "ibm-273", "IBM273", "CP273", "csIBM273", "ebcdic-de", "273"}, - }, - { - Name: "ibm-277_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3}\u00e7\u00f1#.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f8,%_>?\u00a6\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00c6\u00d8'=\"@abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba{\u00b8[]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e6ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-277_P100-1995", "ibm-277", "IBM277", "cp277", "EBCDIC-CP-DK", "EBCDIC-CP-NO", "csIBM277", "ebcdic-dk", "277"}, - }, - { - Name: "ibm-278_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-278_P100-1995", "ibm-278", "IBM278", "cp278", "ebcdic-cp-fi", "ebcdic-cp-se", "csIBM278", "ebcdic-sv", "278"}, - }, - { - Name: "ibm-280_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4{\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&]\u00ea\u00eb}\u00ed\u00ee\u00ef~\u00df\u00e9$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f2,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f9:\u00a3\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00ecstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e0ABCDEFGHI\u00ad\u00f4\u00f6\u00a6\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc`\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-280_P100-1995", "ibm-280", "IBM280", "CP280", "ebcdic-cp-it", "csIBM280", "280"}, - }, - { - Name: "ibm-284_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00a6[.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7#\u00f1,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00d1@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^!\u00af~\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-284_P100-1995", "ibm-284", "IBM284", "CP284", "ebcdic-cp-es", "csIBM284", "cpibm284", "284"}, - }, - { - Name: "ibm-285_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1$.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!\u00a3*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00afstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2[\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^]~\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-285_P100-1995", "ibm-285", "IBM285", "CP285", "ebcdic-cp-gb", "csIBM285", "cpibm285", "ebcdic-gb", "285"}, - }, - { - Name: "ibm-290_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\uff69\u00a3.<(+|&\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\ufffd\uff70\ufffd!\u00a5*);\u00ac-/abcdefgh\ufffd,%_>?[ijklmnop`:#@'=\"]\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7aq\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89r\ufffd\uff8a\uff8b\uff8c~\u203e\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95s\uff96\uff97\uff98\uff99^\u00a2\\tuvwxyz\uff9a\uff9b\uff9c\uff9d\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-290_P100-1995", "ibm-290", "IBM290", "cp290", "EBCDIC-JP-kana", "csIBM290"}, - }, - { - Name: "ibm-297_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4@\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&{\u00ea\u00eb}\u00ed\u00ee\u00ef\u00ec\u00df\u00a7$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f9,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00b5:\u00a3\u00e0'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4`\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9]\u00b6\u00bc\u00bd\u00be\u00ac|\u00af~\u00b4\u00d7\u00e9ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc\u00a6\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-297_P100-1995", "ibm-297", "IBM297", "cp297", "ebcdic-cp-fr", "csIBM297", "cpibm297", "297"}, - }, - { - Name: "ibm-420_X120-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0651\ufe7d\u0640\u200b\u0621\u0622\ufe82\u0623\u00a2.<(+|&\ufe84\u0624\ufffd\ufffd\u0626\u0627\ufe8e\u0628\ufe91!$*);\u00ac-/\u0629\u062a\ufe97\u062b\ufe9b\u062c\ufe9f\u062d\u00a6,%_>?\ufea3\u062e\ufea7\u062f\u0630\u0631\u0632\u0633\ufeb3\u060c:#@'=\"\u0634abcdefghi\ufeb7\u0635\ufebb\u0636\ufebf\u0637\u0638jklmnopqr\u0639\ufeca\ufecb\ufecc\u063a\ufece\ufecf\u00f7stuvwxyz\ufed0\u0641\ufed3\u0642\ufed7\u0643\ufedb\u0644\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\u0645\ufee3\u0646\ufee7\u0647\u061bABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\u0648\u061fJKLMNOPQR\u0649\ufef0\u064a\ufef2\ufef3\u0660\u00d7\ufffdSTUVWXYZ\u0661\u0662\ufffd\u0663\u0664\u06650123456789\ufffd\u0666\u0667\u0668\u0669\u009f", - Aliases: []string{"ibm-420_X120-1999", "ibm-420", "IBM420", "cp420", "ebcdic-cp-ar1", "csIBM420", "420"}, - }, - { - Name: "IBM424", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u00a2.<(+|&\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1!$*);\u00ac-/\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u00a6,%_>?\ufffd\u05ea\ufffd\ufffd\u00a0\ufffd\ufffd\ufffd\u2017`:#@'=\"\ufffdabcdefghi\u00ab\u00bb\ufffd\ufffd\ufffd\u00b1\u00b0jklmnopqr\ufffd\ufffd\ufffd\u00b8\ufffd\u00a4\u00b5~stuvwxyz\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\u00b9\ufffd\ufffd\ufffd\ufffd\ufffd\\\u00f7STUVWXYZ\u00b2\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\u00b3\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"cp424", "ebcdic-cp-he", "csIBM424"}, - }, - { - Name: "IBM437", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00a2\u00a3\u00a5\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u00b5\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"cp437", "437", "csPC8CodePage437"}, - }, - { - Name: "IBM500", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"CP500", "ebcdic-cp-be", "ebcdic-cp-ch", "csIBM500"}, - }, - { - Name: "ibm-720_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\u00e9\u00e2\ufffd\u00e0\ufffd\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\ufffd\ufffd\ufffd\ufffd\u0651\u0652\u00f4\u00a4\u0640\u00fb\u00f9\u0621\u0622\u0623\u0624\u00a3\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0636\u0637\u0638\u0639\u063a\u0641\u00b5\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u2261\u064b\u064c\u064d\u064e\u064f\u0650\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-720_P100-1997", "ibm-720", "windows-720", "DOS-720"}, - }, - { - Name: "IBM737", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03c9\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u00b1\u2265\u2264\u03aa\u03ab\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"cp737", "cp737_DOSGreek"}, - }, - { - Name: "IBM775", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0106\u00fc\u00e9\u0101\u00e4\u0123\u00e5\u0107\u0142\u0113\u0156\u0157\u012b\u0179\u00c4\u00c5\u00c9\u00e6\u00c6\u014d\u00f6\u0122\u00a2\u015a\u015b\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u00a4\u0100\u012a\u00f3\u017b\u017c\u017a\u201d\u00a6\u00a9\u00ae\u00ac\u00bd\u00bc\u0141\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u0104\u010c\u0118\u0116\u2563\u2551\u2557\u255d\u012e\u0160\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u0172\u016a\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u017d\u0105\u010d\u0119\u0117\u012f\u0161\u0173\u016b\u017e\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u00d3\u00df\u014c\u0143\u00f5\u00d5\u00b5\u0144\u0136\u0137\u013b\u013c\u0146\u0112\u0145\u2019\u00ad\u00b1\u201c\u00be\u00b6\u00a7\u00f7\u201e\u00b0\u2219\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"cp775", "csPC775Baltic"}, - }, - { - Name: "ibm-803_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$.<(+|\u05d0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\u00a2*);\u00ac-/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,%_>?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:#@'=\"\ufffd\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-803_P100-1999", "ibm-803", "cp803"}, - }, - { - Name: "ibm-838_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07[\u00a2.<(+|&\u0e48\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e]!$*);\u00ac-/\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15^\u00a6,%_>?\u0e3f\u0e4e\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c`:#@'=\"\u0e4fabcdefghi\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e5ajklmnopqr\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e5b~stuvwxyz\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34{ABCDEFGHI\u0e49\u0e35\u0e36\u0e37\u0e38\u0e39}JKLMNOPQR\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\\\u0e4aSTUVWXYZ\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a0123456789\u0e4b\u0e4c\u0e4d\u0e4b\u0e4c\u009f", - Aliases: []string{"ibm-838_P100-1995", "ibm-838", "IBM838", "IBM-Thai", "csIBMThai", "cp838", "838", "ibm-9030"}, - }, - { - Name: "IBM850", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00f0\u00d0\u00ca\u00cb\u00c8\u0131\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\u00fe\u00de\u00da\u00db\u00d9\u00fd\u00dd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"cp850", "850", "csPC850Multilingual"}, - }, - { - Name: "ibm-851_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u0386\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u0388\u00c4\u0389\u038a\ufffd\u038c\u00f4\u00f6\u038e\u00fb\u00f9\u038f\u00d6\u00dc\u03ac\u00a3\u03ad\u03ae\u03af\u03ca\u0390\u03cc\u03cd\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u00bd\u0398\u0399\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u039a\u039b\u039c\u039d\u2563\u2551\u2557\u255d\u039e\u039f\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u03a0\u03a1\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u2518\u250c\u2588\u2584\u03b4\u03b5\u2580\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u00b4\u00ad\u00b1\u03c5\u03c6\u03c7\u00a7\u03c8\u00b8\u00b0\u00a8\u03c9\u03cb\u03b0\u03ce\u25a0\u00a0", - Aliases: []string{"ibm-851_P100-1995", "ibm-851", "IBM851", "cp851", "851", "csPC851"}, - }, - { - Name: "IBM852", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u016f\u0107\u00e7\u0142\u00eb\u0150\u0151\u00ee\u0179\u00c4\u0106\u00c9\u0139\u013a\u00f4\u00f6\u013d\u013e\u015a\u015b\u00d6\u00dc\u0164\u0165\u0141\u00d7\u010d\u00e1\u00ed\u00f3\u00fa\u0104\u0105\u017d\u017e\u0118\u0119\u00ac\u017a\u010c\u015f\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u011a\u015e\u2563\u2551\u2557\u255d\u017b\u017c\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u0102\u0103\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u0111\u0110\u010e\u00cb\u010f\u0147\u00cd\u00ce\u011b\u2518\u250c\u2588\u2584\u0162\u016e\u2580\u00d3\u00df\u00d4\u0143\u0144\u0148\u0160\u0161\u0154\u00da\u0155\u0170\u00fd\u00dd\u0163\u00b4\u00ad\u02dd\u02db\u02c7\u02d8\u00a7\u00f7\u00b8\u00b0\u00a8\u02d9\u0171\u0158\u0159\u25a0\u00a0", - Aliases: []string{"cp852", "852", "csPCp852"}, - }, - { - Name: "IBM855", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0452\u0402\u0453\u0403\u0451\u0401\u0454\u0404\u0455\u0405\u0456\u0406\u0457\u0407\u0458\u0408\u0459\u0409\u045a\u040a\u045b\u040b\u045c\u040c\u045e\u040e\u045f\u040f\u044e\u042e\u044a\u042a\u0430\u0410\u0431\u0411\u0446\u0426\u0434\u0414\u0435\u0415\u0444\u0424\u0433\u0413\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u0445\u0425\u0438\u0418\u2563\u2551\u2557\u255d\u0439\u0419\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u043a\u041a\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u043b\u041b\u043c\u041c\u043d\u041d\u043e\u041e\u043f\u2518\u250c\u2588\u2584\u041f\u044f\u2580\u042f\u0440\u0420\u0441\u0421\u0442\u0422\u0443\u0423\u0436\u0416\u0432\u0412\u044c\u042c\u2116\u00ad\u044b\u042b\u0437\u0417\u0448\u0428\u044d\u042d\u0449\u0429\u0447\u0427\u00a7\u25a0\u00a0", - Aliases: []string{"cp855", "855", "csIBM855"}, - }, - { - Name: "IBM856", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\u00a3\ufffd\u00d7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae\u00ac\u00bd\u00bc\ufffd\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufffd\ufffd\ufffd\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufffd\ufffd\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2518\u250c\u2588\u2584\u00a6\ufffd\u2580\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00b5\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"cp856", "cp856_Hebrew_PC"}, - }, - { - Name: "ibm-857_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u0131\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u0130\u00d6\u00dc\u00f8\u00a3\u00d8\u015e\u015f\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u011e\u011f\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00ba\u00aa\u00ca\u00cb\u00c8\ufffd\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\ufffd\u00d7\u00da\u00db\u00d9\u00ec\u00ff\u00af\u00b4\u00ad\u00b1\ufffd\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-857_P100-1995", "ibm-857", "IBM857", "cp857", "857", "csIBM857", "windows-857"}, - }, - { - Name: "ibm-858_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00f0\u00d0\u00ca\u00cb\u00c8\u20ac\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\u00fe\u00de\u00da\u00db\u00d9\u00fd\u00dd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-858_P100-1997", "ibm-858", "IBM00858", "CCSID00858", "CP00858", "PC-Multilingual-850+euro", "cp858", "windows-858"}, - }, - { - Name: "ibm-860_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e3\u00e0\u00c1\u00e7\u00ea\u00ca\u00e8\u00cd\u00d4\u00ec\u00c3\u00c2\u00c9\u00c0\u00c8\u00f4\u00f5\u00f2\u00da\u00f9\u00cc\u00d5\u00dc\u00a2\u00a3\u00d9\u20a7\u00d3\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00d2\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-860_P100-1995", "ibm-860", "IBM860", "cp860", "860", "csIBM860"}, - }, - { - Name: "ibm-861_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00d0\u00f0\u00de\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00fe\u00fb\u00dd\u00fd\u00d6\u00dc\u00f8\u00a3\u00d8\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00c1\u00cd\u00d3\u00da\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-861_P100-1995", "ibm-861", "IBM861", "cp861", "861", "cp-is", "csIBM861", "windows-861"}, - }, - { - Name: "ibm-862_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u00a2\u00a3\u00a5\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-862_P100-1995", "ibm-862", "IBM862", "cp862", "862", "csPC862LatinHebrew", "DOS-862", "windows-862"}, - }, - { - Name: "ibm-863_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00c2\u00e0\u00b6\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u2017\u00c0\u00a7\u00c9\u00c8\u00ca\u00f4\u00cb\u00cf\u00fb\u00f9\u00a4\u00d4\u00dc\u00a2\u00a3\u00d9\u00db\u0192\u00a6\u00b4\u00f3\u00fa\u00a8\u00b8\u00b3\u00af\u00ce\u2310\u00ac\u00bd\u00bc\u00be\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-863_P100-1995", "ibm-863", "IBM863", "cp863", "863", "csIBM863"}, - }, - { - Name: "ibm-864_X110-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00b0\u00b7\u2219\u221a\u2592\u2500\u2502\u253c\u2524\u252c\u251c\u2534\u2510\u250c\u2514\u2518\u03b2\u221e\u03c6\u00b1\u00bd\u00bc\u2248\u00ab\u00bb\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\u200b\u00a0\u00ad\ufe82\u00a3\u00a4\ufe84\ufffd\ufffd\ufe8e\ufe8f\ufe95\ufe99\u060c\ufe9d\ufea1\ufea5\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\ufed1\u061b\ufeb1\ufeb5\ufeb9\u061f\u00a2\ufe80\ufe81\ufe83\ufe85\ufeca\ufe8b\ufe8d\ufe91\ufe93\ufe97\ufe9b\ufe9f\ufea3\ufea7\ufea9\ufeab\ufead\ufeaf\ufeb3\ufeb7\ufebb\ufebf\ufec3\ufec7\ufecb\ufecf\u00a6\u00ac\u00f7\u00d7\ufec9\u0640\ufed3\ufed7\ufedb\ufedf\ufee3\ufee7\ufeeb\ufeed\ufeef\ufef3\ufebd\ufecc\ufece\ufecd\ufee1\ufe7d\ufe7c\ufee5\ufee9\ufeec\ufef0\ufef2\ufed0\ufed5\ufef5\ufef6\ufedd\ufed9\ufef1\u25a0\ufffd", - Aliases: []string{"ibm-864_X110-1999", "ibm-864", "IBM864", "cp864", "csIBM864"}, - }, - { - Name: "ibm-865_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00a4\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-865_P100-1995", "ibm-865", "IBM865", "cp865", "865", "csIBM865"}, - }, - { - Name: "IBM866", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0404\u0454\u0407\u0457\u040e\u045e\u00b0\u2219\u00b7\u221a\u2116\u00a4\u25a0\u00a0", - Aliases: []string{"cp866", "866", "csIBM866"}, - }, - { - Name: "ibm-867_P100-1998", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u00a2\u00a3\u00a5\ufffd\u20aa\u200e\u200f\u202a\u202b\u202d\u202e\u202c\ufffd\ufffd\u2310\u00ac\u00bd\u00bc\u20ac\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", - Aliases: []string{"ibm-867_P100-1998", "ibm-867"}, - }, - { - Name: "ibm-868_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u060c\u061b\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufeb7\ufeb9\ufebb\ufebd\u2563\u2551\u2557\u255d\ufebf\ufec3\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufec7\ufec9\u255a\u2554\u2569\u2566\u2560\u2550\u256c\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\u2518\u250c\u2588\u2584\ufed7\ufb8e\u2580\ufedb\ufb92\ufb94\ufedd\ufedf\ufee0\ufee1\ufee3\ufb9e\ufee5\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\u00ad\ufbaa\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd\ufbfe\ufbb0\ufbae\ufe7c\ufe7d\ufffd\u25a0\u00a0", - Aliases: []string{"ibm-868_P100-1995", "ibm-868", "IBM868", "CP868", "868", "csIBM868", "cp-ar"}, - }, - { - Name: "ibm-869_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0386\ufffd\u0387\u00ac\u00a6\u2018\u2019\u0388\u2015\u0389\u038a\u03aa\u038c\ufffd\ufffd\u038e\u03ab\u00a9\u038f\u00b2\u00b3\u03ac\u00a3\u03ad\u03ae\u03af\u03ca\u0390\u03cc\u03cd\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u00bd\u0398\u0399\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u039a\u039b\u039c\u039d\u2563\u2551\u2557\u255d\u039e\u039f\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u03a0\u03a1\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u2518\u250c\u2588\u2584\u03b4\u03b5\u2580\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u00b4\u00ad\u00b1\u03c5\u03c6\u03c7\u00a7\u03c8\u0385\u00b0\u00a8\u03c9\u03cb\u03b0\u03ce\u25a0\u00a0", - Aliases: []string{"ibm-869_P100-1995", "ibm-869", "IBM869", "cp869", "869", "cp-gr", "csIBM869", "windows-869"}, - }, - { - Name: "ibm-870_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u0163\u00e1\u0103\u010d\u00e7\u0107[.<(+!&\u00e9\u0119\u00eb\u016f\u00ed\u00ee\u013e\u013a\u00df]$*);^-/\u00c2\u00c4\u02dd\u00c1\u0102\u010c\u00c7\u0106|,%_>?\u02c7\u00c9\u0118\u00cb\u016e\u00cd\u00ce\u013d\u0139`:#@'=\"\u02d8abcdefghi\u015b\u0148\u0111\u00fd\u0159\u015f\u00b0jklmnopqr\u0142\u0144\u0161\u00b8\u02db\u00a4\u0105~stuvwxyz\u015a\u0147\u0110\u00dd\u0158\u015e\u02d9\u0104\u017c\u0162\u017b\u00a7\u017e\u017a\u017d\u0179\u0141\u0143\u0160\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u0155\u00f3\u0151}JKLMNOPQR\u011a\u0171\u00fc\u0165\u00fa\u011b\\\u00f7STUVWXYZ\u010f\u00d4\u00d6\u0154\u00d3\u01500123456789\u010e\u0170\u00dc\u0164\u00da\u009f", - Aliases: []string{"ibm-870_P100-1995", "ibm-870", "IBM870", "CP870", "ebcdic-cp-roece", "ebcdic-cp-yu", "csIBM870"}, - }, - { - Name: "ibm-871_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00de.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00c6$*);\u00d6-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f0:#\u00d0'=\"\u00d8abcdefghi\u00ab\u00bb`\u00fd{\u00b1\u00b0jklmnopqr\u00aa\u00ba}\u00b8]\u00a4\u00b5\u00f6stuvwxyz\u00a1\u00bf@\u00dd[\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\\\u00d7\u00feABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u00e6JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\u00b4\u00f7STUVWXYZ\u00b2\u00d4^\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-871_P100-1995", "ibm-871", "IBM871", "ebcdic-cp-is", "csIBM871", "CP871", "ebcdic-is", "871"}, - }, - { - Name: "ibm-874_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0e48\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e49\u0e4a\u0e4b\u0e4c\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\u00a2\u00ac\u00a6\u00a0", - Aliases: []string{"ibm-874_P100-1995", "ibm-874", "ibm-9066", "cp874", "tis620.2533", "eucTH"}, - }, - { - Name: "ibm-875_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\ufffdSTUVWXYZ\u00b2\u00a7\ufffd\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\ufffd\ufffd\u00bb\u009f", - Aliases: []string{"ibm-875_P100-1995", "ibm-875", "IBM875", "cp875", "875"}, - }, - { - Name: "ibm-901_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u201d\u00a2\u00a3\u20ac\u201e\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u201c\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u2019", - Aliases: []string{"ibm-901_P100-1999", "ibm-901"}, - }, - { - Name: "ibm-902_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u20ac\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0160\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u017d\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0161\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u017e\u00ff", - Aliases: []string{"ibm-902_P100-1999", "ibm-902"}, - }, - { - Name: "ibm-916_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u203e\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u2022\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2017\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ibm-916_P100-1995", "ibm-916", "cp916", "916"}, - }, - { - Name: "ibm-918_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u060c\u061b\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f[.<(+!&\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99]$*);^-/\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5`,%_>?\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9:#@'=\"\ufea7abcdefghi\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8ajklmnopqr\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\ufebd~stuvwxyz\ufebf\ufec3\ufec7\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb|\ufb92\ufb94\ufedd\ufedf{ABCDEFGHI\u00ad\ufee0\ufee1\ufee3\ufb9e\ufee5}JKLMNOPQR\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\\\ufbaaSTUVWXYZ\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd0123456789\ufbfe\ufbb0\ufbae\ufe7c\ufe7d\u009f", - Aliases: []string{"ibm-918_P100-1995", "ibm-918", "IBM918", "CP918", "ebcdic-cp-ar2", "csIBM918"}, - }, - { - Name: "ibm-922_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0160\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u017d\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0161\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u017e\u00ff", - Aliases: []string{"ibm-922_P100-1999", "ibm-922", "IBM922", "cp922", "922"}, - }, - { - Name: "ibm-1006_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u060c\u061b\u00ad\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\ufebd\ufebf\ufec3\ufec7\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb\ufb92\ufb94\ufedd\ufedf\ufee0\ufee1\ufee3\ufb9e\ufee5\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\ufbaa\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd\ufbfe\ufbb0\ufbae\ufe7c\ufe7d", - Aliases: []string{"ibm-1006_P100-1995", "ibm-1006", "IBM1006", "cp1006", "1006"}, - }, - { - Name: "ibm-1025_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0453\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0403\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u00a7STUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1025_P100-1995", "ibm-1025", "cp1025", "1025"}, - }, - { - Name: "ibm-1026_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5{\u00f1\u00c7.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u011e\u0130*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5[\u00d1\u015f,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u0131:\u00d6\u015e'=\u00dc\u00d8abcdefghi\u00ab\u00bb}`\u00a6\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00f6stuvwxyz\u00a1\u00bf]$@\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e7ABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u011fJKLMNOPQR\u00b9\u00fb\\\u00f9\u00fa\u00ff\u00fc\u00f7STUVWXYZ\u00b2\u00d4#\u00d2\u00d3\u00d50123456789\u00b3\u00db\"\u00d9\u00da\u009f", - Aliases: []string{"ibm-1026_P100-1995", "ibm-1026", "IBM1026", "CP1026", "csIBM1026", "1026"}, - }, - { - Name: "ibm-1047_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0[\u00de\u00ae\u00ac\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00dd\u00a8\u00af]\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1047_P100-1995", "ibm-1047", "IBM1047", "cp1047", "1047"}, - }, - { - Name: "ibm-1097_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u060c\u064b\ufe81\ufe82\uf8fa\ufe8d\ufe8e\uf8fb\u00a4.<(+|&\ufe80\ufe83\ufe84\uf8f9\ufe85\ufe8b\ufe8f\ufe91\ufb56!$*);\u00ac-/\ufb58\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\u061b,%_>?\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf`:#@'=\"\ufb8aabcdefghi\u00ab\u00bb\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9jklmnopqr\ufebb\ufebd\ufebf\ufec1\ufec3\ufec5\ufec7~stuvwxyz\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb\ufb92\ufb94[]\ufedd\ufedf\ufee1\u00d7{ABCDEFGHI\u00ad\ufee3\ufee5\ufee7\ufeed\ufee9}JKLMNOPQR\ufeeb\ufeec\ufba4\ufbfc\ufbfd\ufbfe\\\u061fSTUVWXYZ\u0640\u06f0\u06f1\u06f2\u06f3\u06f40123456789\u06f5\u06f6\u06f7\u06f8\u06f9\u009f", - Aliases: []string{"ibm-1097_P100-1995", "ibm-1097", "cp1097", "1097"}, - }, - { - Name: "ibm-1098_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\u060c\u061b\u061f\u064b\ufe81\ufe82\uf8fa\ufe8d\ufe8e\uf8fb\ufe80\ufe83\ufe84\uf8f9\ufe85\ufe8b\ufe8f\ufe91\ufb56\ufb58\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\u00d7\ufea1\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufebd\ufebf\ufec1\ufec3\u2563\u2551\u2557\u255d\u00a4\ufec5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufec7\ufec9\u255a\u2554\u2569\u2566\u2560\u2550\u256c\ufffd\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\u2518\u250c\u2588\u2584\ufed5\ufed7\u2580\ufb8e\ufedb\ufb92\ufb94\ufedd\ufedf\ufee1\ufee3\ufee5\ufee7\ufeed\ufee9\ufeeb\ufeec\ufba4\ufbfc\u00ad\ufbfd\ufbfe\u0640\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u25a0\u00a0", - Aliases: []string{"ibm-1098_P100-1995", "ibm-1098", "IBM1098", "cp1098", "1098"}, - }, - { - Name: "ibm-1112_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0161\u00e4\u0105\u012f\u016b\u00e5\u0113\u017e\u00a2.<(+|&\u00e9\u0119\u0117\u010d\u0173\u201e\u201c\u0123\u00df!$*);\u00ac-/\u0160\u00c4\u0104\u012e\u016a\u00c5\u0112\u017d\u00a6,%_>?\u00f8\u00c9\u0118\u0116\u010c\u0172\u012a\u013b\u0122`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0101\u017c\u0144\u00b1\u00b0jklmnopqr\u0156\u0157\u00e6\u0137\u00c6\u00a4\u00b5~stuvwxyz\u201d\u017a\u0100\u017b\u0143\u00ae^\u00a3\u012b\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u0179\u0136\u013c\u00d7{ABCDEFGHI\u00ad\u014d\u00f6\u0146\u00f3\u00f5}JKLMNOPQR\u00b9\u0107\u00fc\u0142\u015b\u2019\\\u00f7STUVWXYZ\u00b2\u014c\u00d6\u0145\u00d3\u00d50123456789\u00b3\u0106\u00dc\u0141\u015a\u009f", - Aliases: []string{"ibm-1112_P100-1995", "ibm-1112", "cp1112", "1112"}, - }, - { - Name: "ibm-1122_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u0161\u00fd\u017e\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u0160\u00dd\u017d\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1122_P100-1999", "ibm-1122", "cp1122", "1122"}, - }, - { - Name: "ibm-1123_P100-1995", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0491\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0490\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u00a7STUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1123_P100-1995", "ibm-1123", "cp1123", "1123"}, - }, - { - Name: "ibm-1124_P100-1996", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0401\u0402\u0490\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u00ad\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u2116\u0451\u0452\u0491\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u00a7\u045e\u045f", - Aliases: []string{"ibm-1124_P100-1996", "ibm-1124", "cp1124", "1124"}, - }, - { - Name: "ibm-1125_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0490\u0491\u0404\u0454\u0406\u0456\u0407\u0457\u00f7\u00b1\u2116\u00a4\u25a0\u00a0", - Aliases: []string{"ibm-1125_P100-1997", "ibm-1125", "cp1125"}, - }, - { - Name: "ibm-1129_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u0153\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u0178\u00b5\u00b6\u00b7\u0152\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u0102\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u0300\u00cd\u00ce\u00cf\u0110\u00d1\u0309\u00d3\u00d4\u01a0\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u01af\u0303\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u0301\u00ed\u00ee\u00ef\u0111\u00f1\u0323\u00f3\u00f4\u01a1\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u01b0\u20ab\u00ff", - Aliases: []string{"ibm-1129_P100-1997", "ibm-1129"}, - }, - { - Name: "ibm-1130_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u0103\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u0303\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u0102\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u20ab`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0111\u0309\u0300\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u0152\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u0110\u0323\u0301\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u0153\u0178\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u01b0\u00f3\u01a1}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u01af\u00d3\u01a00123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1130_P100-1997", "ibm-1130"}, - }, - { - Name: "ibm-1131_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0404\u0454\u0407\u0457\u040e\u045e\u0406\u0456\u00b7\u00a4\u0490\u0491\u2219\u00a0", - Aliases: []string{"ibm-1131_P100-1997", "ibm-1131", "cp1131"}, - }, - { - Name: "ibm-1132_P100-1998", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e81\u0e82\u0e84\u0e87\u0e88\u0eaa\u0e8a[\u00a2.<(+|&\ufffd\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a]!$*);\u00ac-/\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2^\u00a6,%_>?\u20ad\ufffd\u0ea3\u0ea5\u0ea7\u0eab\u0ead\u0eae\ufffd`:#@'=\"\ufffdabcdefghi\ufffd\ufffd\u0eaf\u0eb0\u0eb2\u0eb3\ufffdjklmnopqr\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\ufffd~stuvwxyz\u0ebc\u0eb1\u0ebb\u0ebd\ufffd\ufffd\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\ufffd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4{ABCDEFGHI\ufffd\u0ec8\u0ec9\u0eca\u0ecb\u0ecc}JKLMNOPQR\u0ecd\u0ec6\ufffd\u0edc\u0edd\ufffd\\\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-1132_P100-1998", "ibm-1132"}, - }, - { - Name: "ibm-1133_P100-1997", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u0e81\u0e82\u0e84\u0e87\u0e88\u0eaa\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eab\u0ead\u0eae\ufffd\ufffd\ufffd\u0eaf\u0eb0\u0eb2\u0eb3\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebc\u0eb1\u0ebb\u0ebd\ufffd\ufffd\ufffd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ec6\ufffd\u0edc\u0eddk\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\ufffd\ufffd\u00a2\u00ac\u00a6\u00a0", - Aliases: []string{"ibm-1133_P100-1997", "ibm-1133"}, - }, - { - Name: "ibm-1137_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0901\u0902\u0903\u0905\u0906\u0907\u0908\u0909\u090a.<(+|&\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913!$*);^-/\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c,%_>?\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925`:#@'=\"\u0926abcdefghi\u0927\u0928\u092a\u092b\u092c\u092d\u092ejklmnopqr\u092f\u0930\u0932\u0933\u0935\u0936\u200c~stuvwxyz\u0937\u0938\u0939[\u093c\u093d\u093e\u093f\u0940\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u0949\u094a]\u094b\u094c{ABCDEFGHI\u094d\u0950\u0951\u0952\ufffd\ufffd}JKLMNOPQR\u0960\u0961\u0962\u0963\u0964\u0965\\\u200dSTUVWXYZ\u0966\u0967\u0968\u0969\u096a\u096b0123456789\u096c\u096d\u096e\u096f\u0970\u009f", - Aliases: []string{"ibm-1137_P100-1999", "ibm-1137"}, - }, - { - Name: "ibm-1140_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1140_P100-1997", "ibm-1140", "IBM01140", "CCSID01140", "CP01140", "cp1140", "ebcdic-us-37+euro"}, - }, - { - Name: "ibm-1141_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00c4.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec~\u00dc$*);^-/\u00c2[\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00dfstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00fcJKLMNOPQR\u00b9\u00fb}\u00f9\u00fa\u00ff\u00d6\u00f7STUVWXYZ\u00b2\u00d4\\\u00d2\u00d3\u00d50123456789\u00b3\u00db]\u00d9\u00da\u009f", - Aliases: []string{"ibm-1141_P100-1997", "ibm-1141", "IBM01141", "CCSID01141", "CP01141", "cp1141", "ebcdic-de-273+euro"}, - }, - { - Name: "ibm-1142_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3}\u00e7\u00f1#.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f8,%_>?\u00a6\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00c6\u00d8'=\"@abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba{\u00b8[]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e6ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1142_P100-1997", "ibm-1142", "IBM01142", "CCSID01142", "CP01142", "cp1142", "ebcdic-dk-277+euro", "ebcdic-no-277+euro"}, - }, - { - Name: "ibm-1143_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1143_P100-1997", "ibm-1143", "IBM01143", "CCSID01143", "CP01143", "cp1143", "ebcdic-fi-278+euro", "ebcdic-se-278+euro"}, - }, - { - Name: "ibm-1144_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4{\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&]\u00ea\u00eb}\u00ed\u00ee\u00ef~\u00df\u00e9$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f2,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f9:\u00a3\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00ecstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e0ABCDEFGHI\u00ad\u00f4\u00f6\u00a6\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc`\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1144_P100-1997", "ibm-1144", "IBM01144", "CCSID01144", "CP01144", "cp1144", "ebcdic-it-280+euro"}, - }, - { - Name: "ibm-1145_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00a6[.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7#\u00f1,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00d1@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^!\u00af~\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1145_P100-1997", "ibm-1145", "IBM01145", "CCSID01145", "CP01145", "cp1145", "ebcdic-es-284+euro"}, - }, - { - Name: "ibm-1146_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1$.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!\u00a3*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00afstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2[\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^]~\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1146_P100-1997", "ibm-1146", "IBM01146", "CCSID01146", "CP01146", "cp1146", "ebcdic-gb-285+euro"}, - }, - { - Name: "ibm-1147_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4@\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&{\u00ea\u00eb}\u00ed\u00ee\u00ef\u00ec\u00df\u00a7$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f9,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00b5:\u00a3\u00e0'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac`\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9]\u00b6\u00bc\u00bd\u00be\u00ac|\u00af~\u00b4\u00d7\u00e9ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc\u00a6\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1147_P100-1997", "ibm-1147", "IBM01147", "CCSID01147", "CP01147", "cp1147", "ebcdic-fr-297+euro"}, - }, - { - Name: "ibm-1148_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1148_P100-1997", "ibm-1148", "IBM01148", "CCSID01148", "CP01148", "cp1148", "ebcdic-international-500+euro"}, - }, - { - Name: "ibm-1149_P100-1997", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00de.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00c6$*);\u00d6-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f0:#\u00d0'=\"\u00d8abcdefghi\u00ab\u00bb`\u00fd{\u00b1\u00b0jklmnopqr\u00aa\u00ba}\u00b8]\u20ac\u00b5\u00f6stuvwxyz\u00a1\u00bf@\u00dd[\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\\\u00d7\u00feABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u00e6JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\u00b4\u00f7STUVWXYZ\u00b2\u00d4^\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1149_P100-1997", "ibm-1149", "IBM01149", "CCSID01149", "CP01149", "cp1149", "ebcdic-is-871+euro"}, - }, - { - Name: "ibm-1153_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u0163\u00e1\u0103\u010d\u00e7\u0107[.<(+!&\u00e9\u0119\u00eb\u016f\u00ed\u00ee\u013e\u013a\u00df]$*);^-/\u00c2\u00c4\u02dd\u00c1\u0102\u010c\u00c7\u0106|,%_>?\u02c7\u00c9\u0118\u00cb\u016e\u00cd\u00ce\u013d\u0139`:#@'=\"\u02d8abcdefghi\u015b\u0148\u0111\u00fd\u0159\u015f\u00b0jklmnopqr\u0142\u0144\u0161\u00b8\u02db\u20ac\u0105~stuvwxyz\u015a\u0147\u0110\u00dd\u0158\u015e\u02d9\u0104\u017c\u0162\u017b\u00a7\u017e\u017a\u017d\u0179\u0141\u0143\u0160\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u0155\u00f3\u0151}JKLMNOPQR\u011a\u0171\u00fc\u0165\u00fa\u011b\\\u00f7STUVWXYZ\u010f\u00d4\u00d6\u0154\u00d3\u01500123456789\u010e\u0170\u00dc\u0164\u00da\u009f", - Aliases: []string{"ibm-1153_P100-1999", "ibm-1153"}, - }, - { - Name: "ibm-1154_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0453\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0403\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u20acSTUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1154_P100-1999", "ibm-1154"}, - }, - { - Name: "ibm-1155_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5{\u00f1\u00c7.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u011e\u0130*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5[\u00d1\u015f,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u0131:\u00d6\u015e'=\u00dc\u00d8abcdefghi\u00ab\u00bb}`\u00a6\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00f6stuvwxyz\u00a1\u00bf]$@\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e7ABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u011fJKLMNOPQR\u00b9\u00fb\\\u00f9\u00fa\u00ff\u00fc\u00f7STUVWXYZ\u00b2\u00d4#\u00d2\u00d3\u00d50123456789\u00b3\u00db\"\u00d9\u00da\u009f", - Aliases: []string{"ibm-1155_P100-1999", "ibm-1155"}, - }, - { - Name: "ibm-1156_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0161\u00e4\u0105\u012f\u016b\u00e5\u0113\u017e\u00a2.<(+|&\u00e9\u0119\u0117\u010d\u0173\u201e\u201c\u0123\u00df!$*);\u00ac-/\u0160\u00c4\u0104\u012e\u016a\u00c5\u0112\u017d\u00a6,%_>?\u00f8\u00c9\u0118\u0116\u010c\u0172\u012a\u013b\u0122`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0101\u017c\u0144\u00b1\u00b0jklmnopqr\u0156\u0157\u00e6\u0137\u00c6\u20ac\u00b5~stuvwxyz\u201d\u017a\u0100\u017b\u0143\u00ae^\u00a3\u012b\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u0179\u0136\u013c\u00d7{ABCDEFGHI\u00ad\u014d\u00f6\u0146\u00f3\u00f5}JKLMNOPQR\u00b9\u0107\u00fc\u0142\u015b\u2019\\\u00f7STUVWXYZ\u00b2\u014c\u00d6\u0145\u00d3\u00d50123456789\u00b3\u0106\u00dc\u0141\u015a\u009f", - Aliases: []string{"ibm-1156_P100-1999", "ibm-1156"}, - }, - { - Name: "ibm-1157_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u0161\u00fd\u017e\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u0160\u00dd\u017d\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1157_P100-1999", "ibm-1157"}, - }, - { - Name: "ibm-1158_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0491\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0490\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u20acSTUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", - Aliases: []string{"ibm-1158_P100-1999", "ibm-1158"}, - }, - { - Name: "ibm-1160_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07[\u00a2.<(+|&\u0e48\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e]!$*);\u00ac-/\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15^\u00a6,%_>?\u0e3f\u0e4e\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c`:#@'=\"\u0e4fabcdefghi\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e5ajklmnopqr\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e5b~stuvwxyz\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34{ABCDEFGHI\u0e49\u0e35\u0e36\u0e37\u0e38\u0e39}JKLMNOPQR\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\\\u0e4aSTUVWXYZ\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a0123456789\u0e4b\u0e4c\u0e4d\u0e4b\u20ac\u009f", - Aliases: []string{"ibm-1160_P100-1999", "ibm-1160"}, - }, - { - Name: "ibm-1162_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\u0081\u0082\u0083\u0084\u2026\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ibm-1162_P100-1999", "ibm-1162"}, - }, - { - Name: "ibm-1164_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u0103\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u0303\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u0102\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u20ab`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0111\u0309\u0300\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u0152\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u0110\u0323\u0301\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u0153\u0178\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u01b0\u00f3\u01a1}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u01af\u00d3\u01a00123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ibm-1164_P100-1999", "ibm-1164"}, - }, - { - Name: "ibm-4517_P100-2005", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\ufe7c\ufe7d\u0640\u200b\ufe80\ufe81\ufe82\ufe83\u00b0.<(+!&\ufe84\ufe85\ufffd\ufffd\ufe8b\ufe8d\ufe8e\ufe8f\ufe91\u00a7$*);^-/\ufe93\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufea1\u00fa,%_>?\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf\ufeb1\ufeb3\u00a3:\u00b5\u00e1'=\"\ufeb5abcdefghi\ufeb7\ufeb9\ufebb\ufebd\ufebf\ufec3\ufec7jklmnopqr\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\u00a8stuvwxyz\ufed0\ufed1\ufed3\ufed5\ufed7\ufed9\ufedb\ufedd\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\ufee1\ufee3\ufee5\ufee7\ufee9\u00e9ABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\ufeed\u00e8JKLMNOPQR\ufeef\ufef0\ufef1\ufef2\ufef3\ufffd\u00e7\u2007STUVWXYZ\u00f7\u060c\ufffd\u00d7\u061f\u061b0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-4517_P100-2005", "ibm-4517"}, - }, - { - Name: "ibm-4899_P100-1998", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$.<(+|\u05d0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\u00a2*);\u00ac-/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,%_>?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:#@'=\"\ufffd\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\ufffd\ufffd\u20ac\ufffd\u20aa\ufffd\ufffd\ufffd\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJKLMNOPQR\ufffd\u202d\u202e\u202c\ufffd\ufffd\ufffd\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\u202a\u202b\u200e\u200f\u009f", - Aliases: []string{"ibm-4899_P100-1998", "ibm-4899"}, - }, - { - Name: "ibm-4909_P100-1999", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u2018\u2019\u00a3\u20ac\ufffd\u00a6\u00a7\u00a8\u00a9\ufffd\u00ab\u00ac\u00ad\ufffd\u2015\u00b0\u00b1\u00b2\u00b3\u00b4\u0385\u0386\u0387\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", - Aliases: []string{"ibm-4909_P100-1999", "ibm-4909"}, - }, - { - Name: "ibm-4971_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\ufffdSTUVWXYZ\u00b2\u00a7\ufffd\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\u20ac\ufffd\u00bb\u009f", - Aliases: []string{"ibm-4971_P100-1999", "ibm-4971"}, - }, - { - Name: "ibm-5123_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\u00a2.<(+|&\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff70\uff71!$*);\u00ac-/\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\ufffd,%_>?\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82`:#@'=\"\ufffdabcdefghi\uff83\uff84\uff85\uff86\uff87\uff88\ufffdjklmnopqr\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\u203e~stuvwxyz\uff8f\uff90\uff91[\uff92\uff93^\u00a3\u00a5\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d]\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\\\u20acSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-5123_P100-1999", "ibm-5123"}, - }, - { - Name: "ibm-8482_P100-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\uff69\u00a3.<(+|&\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\ufffd\uff70\ufffd!\u00a5*);\u00ac-/abcdefgh\ufffd,%_>?[ijklmnop`:#@'=\"]\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7aq\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89r\ufffd\uff8a\uff8b\uff8c~\u203e\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95s\uff96\uff97\uff98\uff99^\u00a2\\tuvwxyz\uff9a\uff9b\uff9c\uff9d\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\u20acSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", - Aliases: []string{"ibm-8482_P100-1999", "ibm-8482"}, - }, - { - Name: "ibm-9067_X100-2005", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\u20afSTUVWXYZ\u00b2\u00a7\u037a\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\u20ac\ufffd\u00bb\u009f", - Aliases: []string{"ibm-9067_X100-2005", "ibm-9067"}, - }, - { - Name: "ibm-12712_P100-1998", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u00a2.<(+|&\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1!$*);\u00ac-/\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u00a6,%_>?\ufffd\u05ea\ufffd\ufffd\u00a0\ufffd\ufffd\ufffd\u2017`:#@'=\"\ufffdabcdefghi\u00ab\u00bb\ufffd\ufffd\ufffd\u00b1\u00b0jklmnopqr\ufffd\ufffd\u20ac\u00b8\u20aa\u00a4\u00b5~stuvwxyz\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae^\u00a3\u00a5\u2022\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u203e\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\u00b9\u202d\u202e\u202c\ufffd\ufffd\\\u00f7STUVWXYZ\u00b2\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\u00b3\u202a\u202b\u200e\u200f\u009f", - Aliases: []string{"ibm-12712_P100-1998", "ibm-12712", "ebcdic-he"}, - }, - { - Name: "ibm-16804_X110-1999", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0651\ufe7d\u0640\u200b\u0621\u0622\ufe82\u0623\u00a2.<(+|&\ufe84\u0624\ufffd\ufffd\u0626\u0627\ufe8e\u0628\ufe91!$*);\u00ac-/\u0629\u062a\ufe97\u062b\ufe9b\u062c\ufe9f\u062d\u00a6,%_>?\ufea3\u062e\ufea7\u062f\u0630\u0631\u0632\u0633\ufeb3\u060c:#@'=\"\u0634abcdefghi\ufeb7\u0635\ufebb\u0636\ufebf\u0637\u0638jklmnopqr\u0639\ufeca\ufecb\ufecc\u063a\ufece\ufecf\u00f7stuvwxyz\ufed0\u0641\ufed3\u0642\ufed7\u0643\ufedb\u0644\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\u0645\ufee3\u0646\ufee7\u0647\u061bABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\u0648\u061fJKLMNOPQR\u0649\ufef0\u064a\ufef2\ufef3\u0660\u00d7\u2007STUVWXYZ\u0661\u0662\ufffd\u0663\u0664\u06650123456789\u20ac\u0666\u0667\u0668\u0669\u009f", - Aliases: []string{"ibm-16804_X110-1999", "ibm-16804", "ebcdic-ar"}, - }, - { - Name: "KOI8-R", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\u2580\u2584\u2588\u258c\u2590\u2591\u2592\u2593\u2320\u25a0\u2219\u221a\u2248\u2264\u2265\u00a0\u2321\u00b0\u00b2\u00b7\u00f7\u2550\u2551\u2552\u0451\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u0401\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u00a9\u044e\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u044f\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u042f\u0420\u0421\u0422\u0423\u0416\u0412\u042c\u042b\u0417\u0428\u042d\u0429\u0427\u042a", - Aliases: []string{"csKOI8R"}, - }, - { - Name: "KOI8-U", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\u2580\u2584\u2588\u258c\u2590\u2591\u2592\u2593\u2320\u25a0\u2219\u221a\u2248\u2264\u2265\u00a0\u2321\u00b0\u00b2\u00b7\u00f7\u2550\u2551\u2552\u0451\u0454\u2554\u0456\u0457\u2557\u2558\u2559\u255a\u255b\u0491\u255d\u255e\u255f\u2560\u2561\u0401\u0404\u2563\u0406\u0407\u2566\u2567\u2568\u2569\u256a\u0490\u256c\u00a9\u044e\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u044f\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u042f\u0420\u0421\u0422\u0423\u0416\u0412\u042c\u042b\u0417\u0428\u042d\u0429\u0427\u042a", - }, - { - Name: "ibm-1051_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u00c0\u00c2\u00c8\u00ca\u00cb\u00ce\u00cf\u00b4`\u02c6\u00a8\u02dc\u00d9\u00db\u00a3\u203e\u00dd\u00fd\u02da\u00c7\u00e7\u00d1\u00f1\u00a1\u00bf\u00a4\u00a3\u00a5\u00a7\u0192\u00a2\u00e2\u00ea\u00f4\u00fb\u00e1\u00e9\u00f3\u00fa\u00e0\u00e8\u00f2\u00f9\u00e4\u00eb\u00f6\u00fc\u00c5\u00ee\u00d8\u00c6\u00e5\u00ed\u00f8\u00e6\u00c4\u00ec\u00d6\u00dc\u00c9\u00ef\u00df\u00d4\u00c1\u00c3\u00e3\u00d0\u00f0\u00cd\u00cc\u00d3\u00d2\u00d5\u00f5\u0160\u0161\u00da\u0178\u00ff\u00de\u00fe\u00b7\u03bc\u00b6\u00be-\u00bc\u00bd\u00aa\u00ba\u00ab\u25a0\u00bb\u00b1\ufffd", - Aliases: []string{"ibm-1051_P100-1995", "ibm-1051", "hp-roman8", "roman8", "r8", "csHPRoman8"}, - }, - { - Name: "ibm-1276_P100-1995", - SubstitutionChar: '?', - Repertoire: "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&\u2019()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\u2018abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u00a1\u00a2\u00a3\u2044\u00a5\u0192\u00a7\u00a4'\u201c\u00ab\u2039\u203a\ufb01\ufb02\ufffd\u2013\u2020\u2021\u00b7\ufffd\u00b6\u2022\u201a\u201e\u201d\u00bb\u2026\u2030\ufffd\u00bf\ufffd`\u00b4\u02c6\u02dc\u00af\u02d8\u02d9\u00a8\ufffd\u02da\u00b8\ufffd\u02dd\u02db\u02c7\u2014\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00c6\ufffd\u00aa\ufffd\ufffd\ufffd\ufffd\u0141\u00d8\u0152\u00ba\ufffd\ufffd\ufffd\ufffd\ufffd\u00e6\ufffd\ufffd\ufffd\u0131\ufffd\ufffd\u0142\u00f8\u0153\u00df\ufffd\ufffd\ufffd\ufffd", - Aliases: []string{"ibm-1276_P100-1995", "ibm-1276", "Adobe-Standard-Encoding", "csAdobeStandardEncoding"}, - }, - { - Name: "ebcdic-xml-us", - SubstitutionChar: 0x6f, - Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\n\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", - Aliases: []string{"ebcdic-xml-us"}, - }, -} diff --git a/vendor/github.com/axgle/mahonia/ASCII.go b/vendor/github.com/axgle/mahonia/ASCII.go deleted file mode 100644 index 5e4eebf..0000000 --- a/vendor/github.com/axgle/mahonia/ASCII.go +++ /dev/null @@ -1,76 +0,0 @@ -package mahonia - -// Converters for ASCII and ISO-8859-1 - -func init() { - for i := 0; i < len(asciiCharsets); i++ { - RegisterCharset(&asciiCharsets[i]) - } -} - -var asciiCharsets = []Charset{ - { - Name: "US-ASCII", - NewDecoder: func() Decoder { return decodeASCIIRune }, - NewEncoder: func() Encoder { return encodeASCIIRune }, - Aliases: []string{"ASCII", "US", "ISO646-US", "IBM367", "cp367", "ANSI_X3.4-1968", "iso-ir-6", "ANSI_X3.4-1986", "ISO_646.irv:1991", "csASCII"}, - }, - { - Name: "ISO-8859-1", - NewDecoder: func() Decoder { return decodeLatin1Rune }, - NewEncoder: func() Encoder { return encodeLatin1Rune }, - Aliases: []string{"latin1", "ISO Latin 1", "IBM819", "cp819", "ISO_8859-1:1987", "iso-ir-100", "l1", "csISOLatin1"}, - }, -} - -func decodeASCIIRune(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b > 127 { - return 0xfffd, 1, INVALID_CHAR - } - return rune(b), 1, SUCCESS -} - -func encodeASCIIRune(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if c < 128 { - p[0] = byte(c) - return 1, SUCCESS - } - - p[0] = '?' - return 1, INVALID_CHAR -} - -func decodeLatin1Rune(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - return rune(p[0]), 1, SUCCESS -} - -func encodeLatin1Rune(p []byte, c rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if c < 256 { - p[0] = byte(c) - return 1, SUCCESS - } - - p[0] = '?' - return 1, INVALID_CHAR -} diff --git a/vendor/github.com/axgle/mahonia/LICENSE b/vendor/github.com/axgle/mahonia/LICENSE deleted file mode 100644 index eddd9dd..0000000 --- a/vendor/github.com/axgle/mahonia/LICENSE +++ /dev/null @@ -1,2 +0,0 @@ -BSD 3-Clause License -https://opensource.org/licenses/BSD-3-Clause diff --git a/vendor/github.com/axgle/mahonia/README.md b/vendor/github.com/axgle/mahonia/README.md deleted file mode 100644 index f92adba..0000000 --- a/vendor/github.com/axgle/mahonia/README.md +++ /dev/null @@ -1,30 +0,0 @@ -mahonia -======= - - character-set conversion library implemented in Go. - - Mahonia is a character-set conversion library implemented in Go. - All data is compiled into the executable; it doesn't need any external data files. - - based on http://code.google.com/p/mahonia/ - -install -------- - - go get github.com/axgle/mahonia - -example -------- - - package main - import "fmt" - import "github.com/axgle/mahonia" - func main(){ - enc:=mahonia.NewEncoder("gbk") - //converts a string from UTF-8 to gbk encoding. - fmt.Println(enc.ConvertString("hello,世界")) - } - -donate -------- -https://github.com/axgle/mahonia/wiki/Donate diff --git a/vendor/github.com/axgle/mahonia/big5-data.go b/vendor/github.com/axgle/mahonia/big5-data.go deleted file mode 100644 index a542fe1..0000000 --- a/vendor/github.com/axgle/mahonia/big5-data.go +++ /dev/null @@ -1,13707 +0,0 @@ -package mahonia - -var big5ToUnicode = [65536]uint16{ - 0xA140: 0x3000, // IDEOGRAPHIC SPACE - 0xA141: 0xFF0C, // FULLWIDTH COMMA - 0xA142: 0x3001, // IDEOGRAPHIC COMMA - 0xA143: 0x3002, // IDEOGRAPHIC FULL STOP - 0xA144: 0xFF0E, // FULLWIDTH FULL STOP - 0xA145: 0x2022, // BULLET - 0xA146: 0xFF1B, // FULLWIDTH SEMICOLON - 0xA147: 0xFF1A, // FULLWIDTH COLON - 0xA148: 0xFF1F, // FULLWIDTH QUESTION MARK - 0xA149: 0xFF01, // FULLWIDTH EXCLAMATION MARK - 0xA14A: 0xFE30, // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER - 0xA14B: 0x2026, // HORIZONTAL ELLIPSIS - 0xA14C: 0x2025, // TWO DOT LEADER - 0xA14D: 0xFE50, // SMALL COMMA - 0xA14E: 0xFF64, // HALFWIDTH IDEOGRAPHIC COMMA - 0xA14F: 0xFE52, // SMALL FULL STOP - 0xA150: 0x00B7, // MIDDLE DOT - 0xA151: 0xFE54, // SMALL SEMICOLON - 0xA152: 0xFE55, // SMALL COLON - 0xA153: 0xFE56, // SMALL QUESTION MARK - 0xA154: 0xFE57, // SMALL EXCLAMATION MARK - 0xA155: 0xFF5C, // FULLWIDTH VERTICAL BAR - 0xA156: 0x2013, // EN DASH - 0xA157: 0xFE31, // PRESENTATION FORM FOR VERTICAL EM DASH - 0xA158: 0x2014, // EM DASH - 0xA159: 0xFE33, // PRESENTATION FORM FOR VERTICAL LOW LINE - 0xA15B: 0xFE34, // PRESENTATION FORM FOR VERTICAL WAVY LOW LINE - 0xA15C: 0xFE4F, // WAVY LOW LINE - 0xA15D: 0xFF08, // FULLWIDTH LEFT PARENTHESIS - 0xA15E: 0xFF09, // FULLWIDTH RIGHT PARENTHESIS - 0xA15F: 0xFE35, // PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS - 0xA160: 0xFE36, // PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS - 0xA161: 0xFF5B, // FULLWIDTH LEFT CURLY BRACKET - 0xA162: 0xFF5D, // FULLWIDTH RIGHT CURLY BRACKET - 0xA163: 0xFE37, // PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET - 0xA164: 0xFE38, // PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET - 0xA165: 0x3014, // LEFT TORTOISE SHELL BRACKET - 0xA166: 0x3015, // RIGHT TORTOISE SHELL BRACKET - 0xA167: 0xFE39, // PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET - 0xA168: 0xFE3A, // PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET - 0xA169: 0x3010, // LEFT BLACK LENTICULAR BRACKET - 0xA16A: 0x3011, // RIGHT BLACK LENTICULAR BRACKET - 0xA16B: 0xFE3B, // PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET - 0xA16C: 0xFE3C, // PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET - 0xA16D: 0x300A, // LEFT DOUBLE ANGLE BRACKET - 0xA16E: 0x300B, // RIGHT DOUBLE ANGLE BRACKET - 0xA16F: 0xFE3D, // PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET - 0xA170: 0xFE3E, // PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET - 0xA171: 0x3008, // LEFT ANGLE BRACKET - 0xA172: 0x3009, // RIGHT ANGLE BRACKET - 0xA173: 0xFE3F, // PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET - 0xA174: 0xFE40, // PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET - 0xA175: 0x300C, // LEFT CORNER BRACKET - 0xA176: 0x300D, // RIGHT CORNER BRACKET - 0xA177: 0xFE41, // PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET - 0xA178: 0xFE42, // PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET - 0xA179: 0x300E, // LEFT WHITE CORNER BRACKET - 0xA17A: 0x300F, // RIGHT WHITE CORNER BRACKET - 0xA17B: 0xFE43, // PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET - 0xA17C: 0xFE44, // PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET - 0xA17D: 0xFE59, // SMALL LEFT PARENTHESIS - 0xA17E: 0xFE5A, // SMALL RIGHT PARENTHESIS - 0xA1A1: 0xFE5B, // SMALL LEFT CURLY BRACKET - 0xA1A2: 0xFE5C, // SMALL RIGHT CURLY BRACKET - 0xA1A3: 0xFE5D, // SMALL LEFT TORTOISE SHELL BRACKET - 0xA1A4: 0xFE5E, // SMALL RIGHT TORTOISE SHELL BRACKET - 0xA1A5: 0x2018, // LEFT SINGLE QUOTATION MARK - 0xA1A6: 0x2019, // RIGHT SINGLE QUOTATION MARK - 0xA1A7: 0x201C, // LEFT DOUBLE QUOTATION MARK - 0xA1A8: 0x201D, // RIGHT DOUBLE QUOTATION MARK - 0xA1A9: 0x301D, // REVERSED DOUBLE PRIME QUOTATION MARK - 0xA1AA: 0x301E, // DOUBLE PRIME QUOTATION MARK - 0xA1AB: 0x2035, // REVERSED PRIME - 0xA1AC: 0x2032, // PRIME - 0xA1AD: 0xFF03, // FULLWIDTH NUMBER SIGN - 0xA1AE: 0xFF06, // FULLWIDTH AMPERSAND - 0xA1AF: 0xFF0A, // FULLWIDTH ASTERISK - 0xA1B0: 0x203B, // REFERENCE MARK - 0xA1B1: 0x00A7, // SECTION SIGN - 0xA1B2: 0x3003, // DITTO MARK - 0xA1B3: 0x25CB, // WHITE CIRCLE - 0xA1B4: 0x25CF, // BLACK CIRCLE - 0xA1B5: 0x25B3, // WHITE UP-POINTING TRIANGLE - 0xA1B6: 0x25B2, // BLACK UP-POINTING TRIANGLE - 0xA1B7: 0x25CE, // BULLSEYE - 0xA1B8: 0x2606, // WHITE STAR - 0xA1B9: 0x2605, // BLACK STAR - 0xA1BA: 0x25C7, // WHITE DIAMOND - 0xA1BB: 0x25C6, // BLACK DIAMOND - 0xA1BC: 0x25A1, // WHITE SQUARE - 0xA1BD: 0x25A0, // BLACK SQUARE - 0xA1BE: 0x25BD, // WHITE DOWN-POINTING TRIANGLE - 0xA1BF: 0x25BC, // BLACK DOWN-POINTING TRIANGLE - 0xA1C0: 0x32A3, // CIRCLED IDEOGRAPH CORRECT - 0xA1C1: 0x2105, // CARE OF - 0xA1C2: 0x203E, // OVERLINE - 0xA1C4: 0xFF3F, // FULLWIDTH LOW LINE - 0xA1C6: 0xFE49, // DASHED OVERLINE - 0xA1C7: 0xFE4A, // CENTRELINE OVERLINE - 0xA1C8: 0xFE4D, // DASHED LOW LINE - 0xA1C9: 0xFE4E, // CENTRELINE LOW LINE - 0xA1CA: 0xFE4B, // WAVY OVERLINE - 0xA1CB: 0xFE4C, // DOUBLE WAVY OVERLINE - 0xA1CC: 0xFE5F, // SMALL NUMBER SIGN - 0xA1CD: 0xFE60, // SMALL AMPERSAND - 0xA1CE: 0xFE61, // SMALL ASTERISK - 0xA1CF: 0xFF0B, // FULLWIDTH PLUS SIGN - 0xA1D0: 0xFF0D, // FULLWIDTH HYPHEN-MINUS - 0xA1D1: 0x00D7, // MULTIPLICATION SIGN - 0xA1D2: 0x00F7, // DIVISION SIGN - 0xA1D3: 0x00B1, // PLUS-MINUS SIGN - 0xA1D4: 0x221A, // SQUARE ROOT - 0xA1D5: 0xFF1C, // FULLWIDTH LESS-THAN SIGN - 0xA1D6: 0xFF1E, // FULLWIDTH GREATER-THAN SIGN - 0xA1D7: 0xFF1D, // FULLWIDTH EQUALS SIGN - 0xA1D8: 0x2266, // LESS THAN OVER EQUAL TO - 0xA1D9: 0x2267, // GREATER THAN OVER EQUAL TO - 0xA1DA: 0x2260, // NOT EQUAL TO - 0xA1DB: 0x221E, // INFINITY - 0xA1DC: 0x2252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF - 0xA1DD: 0x2261, // IDENTICAL TO - 0xA1DE: 0xFE62, // SMALL PLUS SIGN - 0xA1DF: 0xFE63, // SMALL HYPHEN-MINUS - 0xA1E0: 0xFE64, // SMALL LESS-THAN SIGN - 0xA1E1: 0xFE65, // SMALL GREATER-THAN SIGN - 0xA1E2: 0xFE66, // SMALL EQUALS SIGN - 0xA1E3: 0x223C, // TILDE OPERATOR - 0xA1E4: 0x2229, // INTERSECTION - 0xA1E5: 0x222A, // UNION - 0xA1E6: 0x22A5, // UP TACK - 0xA1E7: 0x2220, // ANGLE - 0xA1E8: 0x221F, // RIGHT ANGLE - 0xA1E9: 0x22BF, // RIGHT TRIANGLE - 0xA1EA: 0x33D2, // SQUARE LOG - 0xA1EB: 0x33D1, // SQUARE LN - 0xA1EC: 0x222B, // INTEGRAL - 0xA1ED: 0x222E, // CONTOUR INTEGRAL - 0xA1EE: 0x2235, // BECAUSE - 0xA1EF: 0x2234, // THEREFORE - 0xA1F0: 0x2640, // FEMALE SIGN - 0xA1F1: 0x2642, // MALE SIGN - 0xA1F2: 0x2641, // EARTH - 0xA1F3: 0x2609, // SUN - 0xA1F4: 0x2191, // UPWARDS ARROW - 0xA1F5: 0x2193, // DOWNWARDS ARROW - 0xA1F6: 0x2190, // LEFTWARDS ARROW - 0xA1F7: 0x2192, // RIGHTWARDS ARROW - 0xA1F8: 0x2196, // NORTH WEST ARROW - 0xA1F9: 0x2197, // NORTH EAST ARROW - 0xA1FA: 0x2199, // SOUTH WEST ARROW - 0xA1FB: 0x2198, // SOUTH EAST ARROW - 0xA1FC: 0x2225, // PARALLEL TO - 0xA1FD: 0x2223, // DIVIDES - 0xA241: 0xFF0F, // FULLWIDTH SOLIDUS - 0xA242: 0xFF3C, // FULLWIDTH REVERSE SOLIDUS - 0xA243: 0xFF04, // FULLWIDTH DOLLAR SIGN - 0xA244: 0x00A5, // YEN SIGN - 0xA245: 0x3012, // POSTAL MARK - 0xA246: 0x00A2, // CENT SIGN - 0xA247: 0x00A3, // POUND SIGN - 0xA248: 0xFF05, // FULLWIDTH PERCENT SIGN - 0xA249: 0xFF20, // FULLWIDTH COMMERCIAL AT - 0xA24A: 0x2103, // DEGREE CELSIUS - 0xA24B: 0x2109, // DEGREE FAHRENHEIT - 0xA24C: 0xFE69, // SMALL DOLLAR SIGN - 0xA24D: 0xFE6A, // SMALL PERCENT SIGN - 0xA24E: 0xFE6B, // SMALL COMMERCIAL AT - 0xA24F: 0x33D5, // SQUARE MIL - 0xA250: 0x339C, // SQUARE MM - 0xA251: 0x339D, // SQUARE CM - 0xA252: 0x339E, // SQUARE KM - 0xA253: 0x33CE, // SQUARE KM CAPITAL - 0xA254: 0x33A1, // SQUARE M SQUARED - 0xA255: 0x338E, // SQUARE MG - 0xA256: 0x338F, // SQUARE KG - 0xA257: 0x33C4, // SQUARE CC - 0xA258: 0x00B0, // DEGREE SIGN - 0xA259: 0x5159, - 0xA25A: 0x515B, - 0xA25B: 0x515E, - 0xA25C: 0x515D, - 0xA25D: 0x5161, - 0xA25E: 0x5163, - 0xA25F: 0x55E7, - 0xA260: 0x74E9, - 0xA261: 0x7CCE, - 0xA262: 0x2581, // LOWER ONE EIGHTH BLOCK - 0xA263: 0x2582, // LOWER ONE QUARTER BLOCK - 0xA264: 0x2583, // LOWER THREE EIGHTHS BLOCK - 0xA265: 0x2584, // LOWER HALF BLOCK - 0xA266: 0x2585, // LOWER FIVE EIGHTHS BLOCK - 0xA267: 0x2586, // LOWER THREE QUARTERS BLOCK - 0xA268: 0x2587, // LOWER SEVEN EIGHTHS BLOCK - 0xA269: 0x2588, // FULL BLOCK - 0xA26A: 0x258F, // LEFT ONE EIGHTH BLOCK - 0xA26B: 0x258E, // LEFT ONE QUARTER BLOCK - 0xA26C: 0x258D, // LEFT THREE EIGHTHS BLOCK - 0xA26D: 0x258C, // LEFT HALF BLOCK - 0xA26E: 0x258B, // LEFT FIVE EIGHTHS BLOCK - 0xA26F: 0x258A, // LEFT THREE QUARTERS BLOCK - 0xA270: 0x2589, // LEFT SEVEN EIGHTHS BLOCK - 0xA271: 0x253C, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0xA272: 0x2534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0xA273: 0x252C, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0xA274: 0x2524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0xA275: 0x251C, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0xA276: 0x2594, // UPPER ONE EIGHTH BLOCK - 0xA277: 0x2500, // BOX DRAWINGS LIGHT HORIZONTAL - 0xA278: 0x2502, // BOX DRAWINGS LIGHT VERTICAL - 0xA279: 0x2595, // RIGHT ONE EIGHTH BLOCK - 0xA27A: 0x250C, // BOX DRAWINGS LIGHT DOWN AND RIGHT - 0xA27B: 0x2510, // BOX DRAWINGS LIGHT DOWN AND LEFT - 0xA27C: 0x2514, // BOX DRAWINGS LIGHT UP AND RIGHT - 0xA27D: 0x2518, // BOX DRAWINGS LIGHT UP AND LEFT - 0xA27E: 0x256D, // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT - 0xA2A1: 0x256E, // BOX DRAWINGS LIGHT ARC DOWN AND LEFT - 0xA2A2: 0x2570, // BOX DRAWINGS LIGHT ARC UP AND RIGHT - 0xA2A3: 0x256F, // BOX DRAWINGS LIGHT ARC UP AND LEFT - 0xA2A4: 0x2550, // BOX DRAWINGS DOUBLE HORIZONTAL - 0xA2A5: 0x255E, // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0xA2A6: 0x256A, // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0xA2A7: 0x2561, // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0xA2A8: 0x25E2, // BLACK LOWER RIGHT TRIANGLE - 0xA2A9: 0x25E3, // BLACK LOWER LEFT TRIANGLE - 0xA2AA: 0x25E5, // BLACK UPPER RIGHT TRIANGLE - 0xA2AB: 0x25E4, // BLACK UPPER LEFT TRIANGLE - 0xA2AC: 0x2571, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - 0xA2AD: 0x2572, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - 0xA2AE: 0x2573, // BOX DRAWINGS LIGHT DIAGONAL CROSS - 0xA2AF: 0xFF10, // FULLWIDTH DIGIT ZERO - 0xA2B0: 0xFF11, // FULLWIDTH DIGIT ONE - 0xA2B1: 0xFF12, // FULLWIDTH DIGIT TWO - 0xA2B2: 0xFF13, // FULLWIDTH DIGIT THREE - 0xA2B3: 0xFF14, // FULLWIDTH DIGIT FOUR - 0xA2B4: 0xFF15, // FULLWIDTH DIGIT FIVE - 0xA2B5: 0xFF16, // FULLWIDTH DIGIT SIX - 0xA2B6: 0xFF17, // FULLWIDTH DIGIT SEVEN - 0xA2B7: 0xFF18, // FULLWIDTH DIGIT EIGHT - 0xA2B8: 0xFF19, // FULLWIDTH DIGIT NINE - 0xA2B9: 0x2160, // ROMAN NUMERAL ONE - 0xA2BA: 0x2161, // ROMAN NUMERAL TWO - 0xA2BB: 0x2162, // ROMAN NUMERAL THREE - 0xA2BC: 0x2163, // ROMAN NUMERAL FOUR - 0xA2BD: 0x2164, // ROMAN NUMERAL FIVE - 0xA2BE: 0x2165, // ROMAN NUMERAL SIX - 0xA2BF: 0x2166, // ROMAN NUMERAL SEVEN - 0xA2C0: 0x2167, // ROMAN NUMERAL EIGHT - 0xA2C1: 0x2168, // ROMAN NUMERAL NINE - 0xA2C2: 0x2169, // ROMAN NUMERAL TEN - 0xA2C3: 0x3021, // HANGZHOU NUMERAL ONE - 0xA2C4: 0x3022, // HANGZHOU NUMERAL TWO - 0xA2C5: 0x3023, // HANGZHOU NUMERAL THREE - 0xA2C6: 0x3024, // HANGZHOU NUMERAL FOUR - 0xA2C7: 0x3025, // HANGZHOU NUMERAL FIVE - 0xA2C8: 0x3026, // HANGZHOU NUMERAL SIX - 0xA2C9: 0x3027, // HANGZHOU NUMERAL SEVEN - 0xA2CA: 0x3028, // HANGZHOU NUMERAL EIGHT - 0xA2CB: 0x3029, // HANGZHOU NUMERAL NINE - 0xA2CD: 0x5344, - 0xA2CF: 0xFF21, // FULLWIDTH LATIN CAPITAL LETTER A - 0xA2D0: 0xFF22, // FULLWIDTH LATIN CAPITAL LETTER B - 0xA2D1: 0xFF23, // FULLWIDTH LATIN CAPITAL LETTER C - 0xA2D2: 0xFF24, // FULLWIDTH LATIN CAPITAL LETTER D - 0xA2D3: 0xFF25, // FULLWIDTH LATIN CAPITAL LETTER E - 0xA2D4: 0xFF26, // FULLWIDTH LATIN CAPITAL LETTER F - 0xA2D5: 0xFF27, // FULLWIDTH LATIN CAPITAL LETTER G - 0xA2D6: 0xFF28, // FULLWIDTH LATIN CAPITAL LETTER H - 0xA2D7: 0xFF29, // FULLWIDTH LATIN CAPITAL LETTER I - 0xA2D8: 0xFF2A, // FULLWIDTH LATIN CAPITAL LETTER J - 0xA2D9: 0xFF2B, // FULLWIDTH LATIN CAPITAL LETTER K - 0xA2DA: 0xFF2C, // FULLWIDTH LATIN CAPITAL LETTER L - 0xA2DB: 0xFF2D, // FULLWIDTH LATIN CAPITAL LETTER M - 0xA2DC: 0xFF2E, // FULLWIDTH LATIN CAPITAL LETTER N - 0xA2DD: 0xFF2F, // FULLWIDTH LATIN CAPITAL LETTER O - 0xA2DE: 0xFF30, // FULLWIDTH LATIN CAPITAL LETTER P - 0xA2DF: 0xFF31, // FULLWIDTH LATIN CAPITAL LETTER Q - 0xA2E0: 0xFF32, // FULLWIDTH LATIN CAPITAL LETTER R - 0xA2E1: 0xFF33, // FULLWIDTH LATIN CAPITAL LETTER S - 0xA2E2: 0xFF34, // FULLWIDTH LATIN CAPITAL LETTER T - 0xA2E3: 0xFF35, // FULLWIDTH LATIN CAPITAL LETTER U - 0xA2E4: 0xFF36, // FULLWIDTH LATIN CAPITAL LETTER V - 0xA2E5: 0xFF37, // FULLWIDTH LATIN CAPITAL LETTER W - 0xA2E6: 0xFF38, // FULLWIDTH LATIN CAPITAL LETTER X - 0xA2E7: 0xFF39, // FULLWIDTH LATIN CAPITAL LETTER Y - 0xA2E8: 0xFF3A, // FULLWIDTH LATIN CAPITAL LETTER Z - 0xA2E9: 0xFF41, // FULLWIDTH LATIN SMALL LETTER A - 0xA2EA: 0xFF42, // FULLWIDTH LATIN SMALL LETTER B - 0xA2EB: 0xFF43, // FULLWIDTH LATIN SMALL LETTER C - 0xA2EC: 0xFF44, // FULLWIDTH LATIN SMALL LETTER D - 0xA2ED: 0xFF45, // FULLWIDTH LATIN SMALL LETTER E - 0xA2EE: 0xFF46, // FULLWIDTH LATIN SMALL LETTER F - 0xA2EF: 0xFF47, // FULLWIDTH LATIN SMALL LETTER G - 0xA2F0: 0xFF48, // FULLWIDTH LATIN SMALL LETTER H - 0xA2F1: 0xFF49, // FULLWIDTH LATIN SMALL LETTER I - 0xA2F2: 0xFF4A, // FULLWIDTH LATIN SMALL LETTER J - 0xA2F3: 0xFF4B, // FULLWIDTH LATIN SMALL LETTER K - 0xA2F4: 0xFF4C, // FULLWIDTH LATIN SMALL LETTER L - 0xA2F5: 0xFF4D, // FULLWIDTH LATIN SMALL LETTER M - 0xA2F6: 0xFF4E, // FULLWIDTH LATIN SMALL LETTER N - 0xA2F7: 0xFF4F, // FULLWIDTH LATIN SMALL LETTER O - 0xA2F8: 0xFF50, // FULLWIDTH LATIN SMALL LETTER P - 0xA2F9: 0xFF51, // FULLWIDTH LATIN SMALL LETTER Q - 0xA2FA: 0xFF52, // FULLWIDTH LATIN SMALL LETTER R - 0xA2FB: 0xFF53, // FULLWIDTH LATIN SMALL LETTER S - 0xA2FC: 0xFF54, // FULLWIDTH LATIN SMALL LETTER T - 0xA2FD: 0xFF55, // FULLWIDTH LATIN SMALL LETTER U - 0xA2FE: 0xFF56, // FULLWIDTH LATIN SMALL LETTER V - 0xA340: 0xFF57, // FULLWIDTH LATIN SMALL LETTER W - 0xA341: 0xFF58, // FULLWIDTH LATIN SMALL LETTER X - 0xA342: 0xFF59, // FULLWIDTH LATIN SMALL LETTER Y - 0xA343: 0xFF5A, // FULLWIDTH LATIN SMALL LETTER Z - 0xA344: 0x0391, // GREEK CAPITAL LETTER ALPHA - 0xA345: 0x0392, // GREEK CAPITAL LETTER BETA - 0xA346: 0x0393, // GREEK CAPITAL LETTER GAMMA - 0xA347: 0x0394, // GREEK CAPITAL LETTER DELTA - 0xA348: 0x0395, // GREEK CAPITAL LETTER EPSILON - 0xA349: 0x0396, // GREEK CAPITAL LETTER ZETA - 0xA34A: 0x0397, // GREEK CAPITAL LETTER ETA - 0xA34B: 0x0398, // GREEK CAPITAL LETTER THETA - 0xA34C: 0x0399, // GREEK CAPITAL LETTER IOTA - 0xA34D: 0x039A, // GREEK CAPITAL LETTER KAPPA - 0xA34E: 0x039B, // GREEK CAPITAL LETTER LAMDA - 0xA34F: 0x039C, // GREEK CAPITAL LETTER MU - 0xA350: 0x039D, // GREEK CAPITAL LETTER NU - 0xA351: 0x039E, // GREEK CAPITAL LETTER XI - 0xA352: 0x039F, // GREEK CAPITAL LETTER OMICRON - 0xA353: 0x03A0, // GREEK CAPITAL LETTER PI - 0xA354: 0x03A1, // GREEK CAPITAL LETTER RHO - 0xA355: 0x03A3, // GREEK CAPITAL LETTER SIGMA - 0xA356: 0x03A4, // GREEK CAPITAL LETTER TAU - 0xA357: 0x03A5, // GREEK CAPITAL LETTER UPSILON - 0xA358: 0x03A6, // GREEK CAPITAL LETTER PHI - 0xA359: 0x03A7, // GREEK CAPITAL LETTER CHI - 0xA35A: 0x03A8, // GREEK CAPITAL LETTER PSI - 0xA35B: 0x03A9, // GREEK CAPITAL LETTER OMEGA - 0xA35C: 0x03B1, // GREEK SMALL LETTER ALPHA - 0xA35D: 0x03B2, // GREEK SMALL LETTER BETA - 0xA35E: 0x03B3, // GREEK SMALL LETTER GAMMA - 0xA35F: 0x03B4, // GREEK SMALL LETTER DELTA - 0xA360: 0x03B5, // GREEK SMALL LETTER EPSILON - 0xA361: 0x03B6, // GREEK SMALL LETTER ZETA - 0xA362: 0x03B7, // GREEK SMALL LETTER ETA - 0xA363: 0x03B8, // GREEK SMALL LETTER THETA - 0xA364: 0x03B9, // GREEK SMALL LETTER IOTA - 0xA365: 0x03BA, // GREEK SMALL LETTER KAPPA - 0xA366: 0x03BB, // GREEK SMALL LETTER LAMDA - 0xA367: 0x03BC, // GREEK SMALL LETTER MU - 0xA368: 0x03BD, // GREEK SMALL LETTER NU - 0xA369: 0x03BE, // GREEK SMALL LETTER XI - 0xA36A: 0x03BF, // GREEK SMALL LETTER OMICRON - 0xA36B: 0x03C0, // GREEK SMALL LETTER PI - 0xA36C: 0x03C1, // GREEK SMALL LETTER RHO - 0xA36D: 0x03C3, // GREEK SMALL LETTER SIGMA - 0xA36E: 0x03C4, // GREEK SMALL LETTER TAU - 0xA36F: 0x03C5, // GREEK SMALL LETTER UPSILON - 0xA370: 0x03C6, // GREEK SMALL LETTER PHI - 0xA371: 0x03C7, // GREEK SMALL LETTER CHI - 0xA372: 0x03C8, // GREEK SMALL LETTER PSI - 0xA373: 0x03C9, // GREEK SMALL LETTER OMEGA - 0xA374: 0x3105, // BOPOMOFO LETTER B - 0xA375: 0x3106, // BOPOMOFO LETTER P - 0xA376: 0x3107, // BOPOMOFO LETTER M - 0xA377: 0x3108, // BOPOMOFO LETTER F - 0xA378: 0x3109, // BOPOMOFO LETTER D - 0xA379: 0x310A, // BOPOMOFO LETTER T - 0xA37A: 0x310B, // BOPOMOFO LETTER N - 0xA37B: 0x310C, // BOPOMOFO LETTER L - 0xA37C: 0x310D, // BOPOMOFO LETTER G - 0xA37D: 0x310E, // BOPOMOFO LETTER K - 0xA37E: 0x310F, // BOPOMOFO LETTER H - 0xA3A1: 0x3110, // BOPOMOFO LETTER J - 0xA3A2: 0x3111, // BOPOMOFO LETTER Q - 0xA3A3: 0x3112, // BOPOMOFO LETTER X - 0xA3A4: 0x3113, // BOPOMOFO LETTER ZH - 0xA3A5: 0x3114, // BOPOMOFO LETTER CH - 0xA3A6: 0x3115, // BOPOMOFO LETTER SH - 0xA3A7: 0x3116, // BOPOMOFO LETTER R - 0xA3A8: 0x3117, // BOPOMOFO LETTER Z - 0xA3A9: 0x3118, // BOPOMOFO LETTER C - 0xA3AA: 0x3119, // BOPOMOFO LETTER S - 0xA3AB: 0x311A, // BOPOMOFO LETTER A - 0xA3AC: 0x311B, // BOPOMOFO LETTER O - 0xA3AD: 0x311C, // BOPOMOFO LETTER E - 0xA3AE: 0x311D, // BOPOMOFO LETTER EH - 0xA3AF: 0x311E, // BOPOMOFO LETTER AI - 0xA3B0: 0x311F, // BOPOMOFO LETTER EI - 0xA3B1: 0x3120, // BOPOMOFO LETTER AU - 0xA3B2: 0x3121, // BOPOMOFO LETTER OU - 0xA3B3: 0x3122, // BOPOMOFO LETTER AN - 0xA3B4: 0x3123, // BOPOMOFO LETTER EN - 0xA3B5: 0x3124, // BOPOMOFO LETTER ANG - 0xA3B6: 0x3125, // BOPOMOFO LETTER ENG - 0xA3B7: 0x3126, // BOPOMOFO LETTER ER - 0xA3B8: 0x3127, // BOPOMOFO LETTER I - 0xA3B9: 0x3128, // BOPOMOFO LETTER U - 0xA3BA: 0x3129, // BOPOMOFO LETTER IU - 0xA3BB: 0x02D9, // DOT ABOVE (Mandarin Chinese light tone) - 0xA3BC: 0x02C9, // MODIFIER LETTER MACRON (Mandarin Chinese first tone) - 0xA3BD: 0x02CA, // MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone) - 0xA3BE: 0x02C7, // CARON (Mandarin Chinese third tone) - 0xA3BF: 0x02CB, // MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone) - 0xA440: 0x4E00, - 0xA441: 0x4E59, - 0xA442: 0x4E01, - 0xA443: 0x4E03, - 0xA444: 0x4E43, - 0xA445: 0x4E5D, - 0xA446: 0x4E86, - 0xA447: 0x4E8C, - 0xA448: 0x4EBA, - 0xA449: 0x513F, - 0xA44A: 0x5165, - 0xA44B: 0x516B, - 0xA44C: 0x51E0, - 0xA44D: 0x5200, - 0xA44E: 0x5201, - 0xA44F: 0x529B, - 0xA450: 0x5315, - 0xA451: 0x5341, - 0xA452: 0x535C, - 0xA453: 0x53C8, - 0xA454: 0x4E09, - 0xA455: 0x4E0B, - 0xA456: 0x4E08, - 0xA457: 0x4E0A, - 0xA458: 0x4E2B, - 0xA459: 0x4E38, - 0xA45A: 0x51E1, - 0xA45B: 0x4E45, - 0xA45C: 0x4E48, - 0xA45D: 0x4E5F, - 0xA45E: 0x4E5E, - 0xA45F: 0x4E8E, - 0xA460: 0x4EA1, - 0xA461: 0x5140, - 0xA462: 0x5203, - 0xA463: 0x52FA, - 0xA464: 0x5343, - 0xA465: 0x53C9, - 0xA466: 0x53E3, - 0xA467: 0x571F, - 0xA468: 0x58EB, - 0xA469: 0x5915, - 0xA46A: 0x5927, - 0xA46B: 0x5973, - 0xA46C: 0x5B50, - 0xA46D: 0x5B51, - 0xA46E: 0x5B53, - 0xA46F: 0x5BF8, - 0xA470: 0x5C0F, - 0xA471: 0x5C22, - 0xA472: 0x5C38, - 0xA473: 0x5C71, - 0xA474: 0x5DDD, - 0xA475: 0x5DE5, - 0xA476: 0x5DF1, - 0xA477: 0x5DF2, - 0xA478: 0x5DF3, - 0xA479: 0x5DFE, - 0xA47A: 0x5E72, - 0xA47B: 0x5EFE, - 0xA47C: 0x5F0B, - 0xA47D: 0x5F13, - 0xA47E: 0x624D, - 0xA4A1: 0x4E11, - 0xA4A2: 0x4E10, - 0xA4A3: 0x4E0D, - 0xA4A4: 0x4E2D, - 0xA4A5: 0x4E30, - 0xA4A6: 0x4E39, - 0xA4A7: 0x4E4B, - 0xA4A8: 0x5C39, - 0xA4A9: 0x4E88, - 0xA4AA: 0x4E91, - 0xA4AB: 0x4E95, - 0xA4AC: 0x4E92, - 0xA4AD: 0x4E94, - 0xA4AE: 0x4EA2, - 0xA4AF: 0x4EC1, - 0xA4B0: 0x4EC0, - 0xA4B1: 0x4EC3, - 0xA4B2: 0x4EC6, - 0xA4B3: 0x4EC7, - 0xA4B4: 0x4ECD, - 0xA4B5: 0x4ECA, - 0xA4B6: 0x4ECB, - 0xA4B7: 0x4EC4, - 0xA4B8: 0x5143, - 0xA4B9: 0x5141, - 0xA4BA: 0x5167, - 0xA4BB: 0x516D, - 0xA4BC: 0x516E, - 0xA4BD: 0x516C, - 0xA4BE: 0x5197, - 0xA4BF: 0x51F6, - 0xA4C0: 0x5206, - 0xA4C1: 0x5207, - 0xA4C2: 0x5208, - 0xA4C3: 0x52FB, - 0xA4C4: 0x52FE, - 0xA4C5: 0x52FF, - 0xA4C6: 0x5316, - 0xA4C7: 0x5339, - 0xA4C8: 0x5348, - 0xA4C9: 0x5347, - 0xA4CA: 0x5345, - 0xA4CB: 0x535E, - 0xA4CC: 0x5384, - 0xA4CD: 0x53CB, - 0xA4CE: 0x53CA, - 0xA4CF: 0x53CD, - 0xA4D0: 0x58EC, - 0xA4D1: 0x5929, - 0xA4D2: 0x592B, - 0xA4D3: 0x592A, - 0xA4D4: 0x592D, - 0xA4D5: 0x5B54, - 0xA4D6: 0x5C11, - 0xA4D7: 0x5C24, - 0xA4D8: 0x5C3A, - 0xA4D9: 0x5C6F, - 0xA4DA: 0x5DF4, - 0xA4DB: 0x5E7B, - 0xA4DC: 0x5EFF, - 0xA4DD: 0x5F14, - 0xA4DE: 0x5F15, - 0xA4DF: 0x5FC3, - 0xA4E0: 0x6208, - 0xA4E1: 0x6236, - 0xA4E2: 0x624B, - 0xA4E3: 0x624E, - 0xA4E4: 0x652F, - 0xA4E5: 0x6587, - 0xA4E6: 0x6597, - 0xA4E7: 0x65A4, - 0xA4E8: 0x65B9, - 0xA4E9: 0x65E5, - 0xA4EA: 0x66F0, - 0xA4EB: 0x6708, - 0xA4EC: 0x6728, - 0xA4ED: 0x6B20, - 0xA4EE: 0x6B62, - 0xA4EF: 0x6B79, - 0xA4F0: 0x6BCB, - 0xA4F1: 0x6BD4, - 0xA4F2: 0x6BDB, - 0xA4F3: 0x6C0F, - 0xA4F4: 0x6C34, - 0xA4F5: 0x706B, - 0xA4F6: 0x722A, - 0xA4F7: 0x7236, - 0xA4F8: 0x723B, - 0xA4F9: 0x7247, - 0xA4FA: 0x7259, - 0xA4FB: 0x725B, - 0xA4FC: 0x72AC, - 0xA4FD: 0x738B, - 0xA4FE: 0x4E19, - 0xA540: 0x4E16, - 0xA541: 0x4E15, - 0xA542: 0x4E14, - 0xA543: 0x4E18, - 0xA544: 0x4E3B, - 0xA545: 0x4E4D, - 0xA546: 0x4E4F, - 0xA547: 0x4E4E, - 0xA548: 0x4EE5, - 0xA549: 0x4ED8, - 0xA54A: 0x4ED4, - 0xA54B: 0x4ED5, - 0xA54C: 0x4ED6, - 0xA54D: 0x4ED7, - 0xA54E: 0x4EE3, - 0xA54F: 0x4EE4, - 0xA550: 0x4ED9, - 0xA551: 0x4EDE, - 0xA552: 0x5145, - 0xA553: 0x5144, - 0xA554: 0x5189, - 0xA555: 0x518A, - 0xA556: 0x51AC, - 0xA557: 0x51F9, - 0xA558: 0x51FA, - 0xA559: 0x51F8, - 0xA55A: 0x520A, - 0xA55B: 0x52A0, - 0xA55C: 0x529F, - 0xA55D: 0x5305, - 0xA55E: 0x5306, - 0xA55F: 0x5317, - 0xA560: 0x531D, - 0xA561: 0x4EDF, - 0xA562: 0x534A, - 0xA563: 0x5349, - 0xA564: 0x5361, - 0xA565: 0x5360, - 0xA566: 0x536F, - 0xA567: 0x536E, - 0xA568: 0x53BB, - 0xA569: 0x53EF, - 0xA56A: 0x53E4, - 0xA56B: 0x53F3, - 0xA56C: 0x53EC, - 0xA56D: 0x53EE, - 0xA56E: 0x53E9, - 0xA56F: 0x53E8, - 0xA570: 0x53FC, - 0xA571: 0x53F8, - 0xA572: 0x53F5, - 0xA573: 0x53EB, - 0xA574: 0x53E6, - 0xA575: 0x53EA, - 0xA576: 0x53F2, - 0xA577: 0x53F1, - 0xA578: 0x53F0, - 0xA579: 0x53E5, - 0xA57A: 0x53ED, - 0xA57B: 0x53FB, - 0xA57C: 0x56DB, - 0xA57D: 0x56DA, - 0xA57E: 0x5916, - 0xA5A1: 0x592E, - 0xA5A2: 0x5931, - 0xA5A3: 0x5974, - 0xA5A4: 0x5976, - 0xA5A5: 0x5B55, - 0xA5A6: 0x5B83, - 0xA5A7: 0x5C3C, - 0xA5A8: 0x5DE8, - 0xA5A9: 0x5DE7, - 0xA5AA: 0x5DE6, - 0xA5AB: 0x5E02, - 0xA5AC: 0x5E03, - 0xA5AD: 0x5E73, - 0xA5AE: 0x5E7C, - 0xA5AF: 0x5F01, - 0xA5B0: 0x5F18, - 0xA5B1: 0x5F17, - 0xA5B2: 0x5FC5, - 0xA5B3: 0x620A, - 0xA5B4: 0x6253, - 0xA5B5: 0x6254, - 0xA5B6: 0x6252, - 0xA5B7: 0x6251, - 0xA5B8: 0x65A5, - 0xA5B9: 0x65E6, - 0xA5BA: 0x672E, - 0xA5BB: 0x672C, - 0xA5BC: 0x672A, - 0xA5BD: 0x672B, - 0xA5BE: 0x672D, - 0xA5BF: 0x6B63, - 0xA5C0: 0x6BCD, - 0xA5C1: 0x6C11, - 0xA5C2: 0x6C10, - 0xA5C3: 0x6C38, - 0xA5C4: 0x6C41, - 0xA5C5: 0x6C40, - 0xA5C6: 0x6C3E, - 0xA5C7: 0x72AF, - 0xA5C8: 0x7384, - 0xA5C9: 0x7389, - 0xA5CA: 0x74DC, - 0xA5CB: 0x74E6, - 0xA5CC: 0x7518, - 0xA5CD: 0x751F, - 0xA5CE: 0x7528, - 0xA5CF: 0x7529, - 0xA5D0: 0x7530, - 0xA5D1: 0x7531, - 0xA5D2: 0x7532, - 0xA5D3: 0x7533, - 0xA5D4: 0x758B, - 0xA5D5: 0x767D, - 0xA5D6: 0x76AE, - 0xA5D7: 0x76BF, - 0xA5D8: 0x76EE, - 0xA5D9: 0x77DB, - 0xA5DA: 0x77E2, - 0xA5DB: 0x77F3, - 0xA5DC: 0x793A, - 0xA5DD: 0x79BE, - 0xA5DE: 0x7A74, - 0xA5DF: 0x7ACB, - 0xA5E0: 0x4E1E, - 0xA5E1: 0x4E1F, - 0xA5E2: 0x4E52, - 0xA5E3: 0x4E53, - 0xA5E4: 0x4E69, - 0xA5E5: 0x4E99, - 0xA5E6: 0x4EA4, - 0xA5E7: 0x4EA6, - 0xA5E8: 0x4EA5, - 0xA5E9: 0x4EFF, - 0xA5EA: 0x4F09, - 0xA5EB: 0x4F19, - 0xA5EC: 0x4F0A, - 0xA5ED: 0x4F15, - 0xA5EE: 0x4F0D, - 0xA5EF: 0x4F10, - 0xA5F0: 0x4F11, - 0xA5F1: 0x4F0F, - 0xA5F2: 0x4EF2, - 0xA5F3: 0x4EF6, - 0xA5F4: 0x4EFB, - 0xA5F5: 0x4EF0, - 0xA5F6: 0x4EF3, - 0xA5F7: 0x4EFD, - 0xA5F8: 0x4F01, - 0xA5F9: 0x4F0B, - 0xA5FA: 0x5149, - 0xA5FB: 0x5147, - 0xA5FC: 0x5146, - 0xA5FD: 0x5148, - 0xA5FE: 0x5168, - 0xA640: 0x5171, - 0xA641: 0x518D, - 0xA642: 0x51B0, - 0xA643: 0x5217, - 0xA644: 0x5211, - 0xA645: 0x5212, - 0xA646: 0x520E, - 0xA647: 0x5216, - 0xA648: 0x52A3, - 0xA649: 0x5308, - 0xA64A: 0x5321, - 0xA64B: 0x5320, - 0xA64C: 0x5370, - 0xA64D: 0x5371, - 0xA64E: 0x5409, - 0xA64F: 0x540F, - 0xA650: 0x540C, - 0xA651: 0x540A, - 0xA652: 0x5410, - 0xA653: 0x5401, - 0xA654: 0x540B, - 0xA655: 0x5404, - 0xA656: 0x5411, - 0xA657: 0x540D, - 0xA658: 0x5408, - 0xA659: 0x5403, - 0xA65A: 0x540E, - 0xA65B: 0x5406, - 0xA65C: 0x5412, - 0xA65D: 0x56E0, - 0xA65E: 0x56DE, - 0xA65F: 0x56DD, - 0xA660: 0x5733, - 0xA661: 0x5730, - 0xA662: 0x5728, - 0xA663: 0x572D, - 0xA664: 0x572C, - 0xA665: 0x572F, - 0xA666: 0x5729, - 0xA667: 0x5919, - 0xA668: 0x591A, - 0xA669: 0x5937, - 0xA66A: 0x5938, - 0xA66B: 0x5984, - 0xA66C: 0x5978, - 0xA66D: 0x5983, - 0xA66E: 0x597D, - 0xA66F: 0x5979, - 0xA670: 0x5982, - 0xA671: 0x5981, - 0xA672: 0x5B57, - 0xA673: 0x5B58, - 0xA674: 0x5B87, - 0xA675: 0x5B88, - 0xA676: 0x5B85, - 0xA677: 0x5B89, - 0xA678: 0x5BFA, - 0xA679: 0x5C16, - 0xA67A: 0x5C79, - 0xA67B: 0x5DDE, - 0xA67C: 0x5E06, - 0xA67D: 0x5E76, - 0xA67E: 0x5E74, - 0xA6A1: 0x5F0F, - 0xA6A2: 0x5F1B, - 0xA6A3: 0x5FD9, - 0xA6A4: 0x5FD6, - 0xA6A5: 0x620E, - 0xA6A6: 0x620C, - 0xA6A7: 0x620D, - 0xA6A8: 0x6210, - 0xA6A9: 0x6263, - 0xA6AA: 0x625B, - 0xA6AB: 0x6258, - 0xA6AC: 0x6536, - 0xA6AD: 0x65E9, - 0xA6AE: 0x65E8, - 0xA6AF: 0x65EC, - 0xA6B0: 0x65ED, - 0xA6B1: 0x66F2, - 0xA6B2: 0x66F3, - 0xA6B3: 0x6709, - 0xA6B4: 0x673D, - 0xA6B5: 0x6734, - 0xA6B6: 0x6731, - 0xA6B7: 0x6735, - 0xA6B8: 0x6B21, - 0xA6B9: 0x6B64, - 0xA6BA: 0x6B7B, - 0xA6BB: 0x6C16, - 0xA6BC: 0x6C5D, - 0xA6BD: 0x6C57, - 0xA6BE: 0x6C59, - 0xA6BF: 0x6C5F, - 0xA6C0: 0x6C60, - 0xA6C1: 0x6C50, - 0xA6C2: 0x6C55, - 0xA6C3: 0x6C61, - 0xA6C4: 0x6C5B, - 0xA6C5: 0x6C4D, - 0xA6C6: 0x6C4E, - 0xA6C7: 0x7070, - 0xA6C8: 0x725F, - 0xA6C9: 0x725D, - 0xA6CA: 0x767E, - 0xA6CB: 0x7AF9, - 0xA6CC: 0x7C73, - 0xA6CD: 0x7CF8, - 0xA6CE: 0x7F36, - 0xA6CF: 0x7F8A, - 0xA6D0: 0x7FBD, - 0xA6D1: 0x8001, - 0xA6D2: 0x8003, - 0xA6D3: 0x800C, - 0xA6D4: 0x8012, - 0xA6D5: 0x8033, - 0xA6D6: 0x807F, - 0xA6D7: 0x8089, - 0xA6D8: 0x808B, - 0xA6D9: 0x808C, - 0xA6DA: 0x81E3, - 0xA6DB: 0x81EA, - 0xA6DC: 0x81F3, - 0xA6DD: 0x81FC, - 0xA6DE: 0x820C, - 0xA6DF: 0x821B, - 0xA6E0: 0x821F, - 0xA6E1: 0x826E, - 0xA6E2: 0x8272, - 0xA6E3: 0x827E, - 0xA6E4: 0x866B, - 0xA6E5: 0x8840, - 0xA6E6: 0x884C, - 0xA6E7: 0x8863, - 0xA6E8: 0x897F, - 0xA6E9: 0x9621, - 0xA6EA: 0x4E32, - 0xA6EB: 0x4EA8, - 0xA6EC: 0x4F4D, - 0xA6ED: 0x4F4F, - 0xA6EE: 0x4F47, - 0xA6EF: 0x4F57, - 0xA6F0: 0x4F5E, - 0xA6F1: 0x4F34, - 0xA6F2: 0x4F5B, - 0xA6F3: 0x4F55, - 0xA6F4: 0x4F30, - 0xA6F5: 0x4F50, - 0xA6F6: 0x4F51, - 0xA6F7: 0x4F3D, - 0xA6F8: 0x4F3A, - 0xA6F9: 0x4F38, - 0xA6FA: 0x4F43, - 0xA6FB: 0x4F54, - 0xA6FC: 0x4F3C, - 0xA6FD: 0x4F46, - 0xA6FE: 0x4F63, - 0xA740: 0x4F5C, - 0xA741: 0x4F60, - 0xA742: 0x4F2F, - 0xA743: 0x4F4E, - 0xA744: 0x4F36, - 0xA745: 0x4F59, - 0xA746: 0x4F5D, - 0xA747: 0x4F48, - 0xA748: 0x4F5A, - 0xA749: 0x514C, - 0xA74A: 0x514B, - 0xA74B: 0x514D, - 0xA74C: 0x5175, - 0xA74D: 0x51B6, - 0xA74E: 0x51B7, - 0xA74F: 0x5225, - 0xA750: 0x5224, - 0xA751: 0x5229, - 0xA752: 0x522A, - 0xA753: 0x5228, - 0xA754: 0x52AB, - 0xA755: 0x52A9, - 0xA756: 0x52AA, - 0xA757: 0x52AC, - 0xA758: 0x5323, - 0xA759: 0x5373, - 0xA75A: 0x5375, - 0xA75B: 0x541D, - 0xA75C: 0x542D, - 0xA75D: 0x541E, - 0xA75E: 0x543E, - 0xA75F: 0x5426, - 0xA760: 0x544E, - 0xA761: 0x5427, - 0xA762: 0x5446, - 0xA763: 0x5443, - 0xA764: 0x5433, - 0xA765: 0x5448, - 0xA766: 0x5442, - 0xA767: 0x541B, - 0xA768: 0x5429, - 0xA769: 0x544A, - 0xA76A: 0x5439, - 0xA76B: 0x543B, - 0xA76C: 0x5438, - 0xA76D: 0x542E, - 0xA76E: 0x5435, - 0xA76F: 0x5436, - 0xA770: 0x5420, - 0xA771: 0x543C, - 0xA772: 0x5440, - 0xA773: 0x5431, - 0xA774: 0x542B, - 0xA775: 0x541F, - 0xA776: 0x542C, - 0xA777: 0x56EA, - 0xA778: 0x56F0, - 0xA779: 0x56E4, - 0xA77A: 0x56EB, - 0xA77B: 0x574A, - 0xA77C: 0x5751, - 0xA77D: 0x5740, - 0xA77E: 0x574D, - 0xA7A1: 0x5747, - 0xA7A2: 0x574E, - 0xA7A3: 0x573E, - 0xA7A4: 0x5750, - 0xA7A5: 0x574F, - 0xA7A6: 0x573B, - 0xA7A7: 0x58EF, - 0xA7A8: 0x593E, - 0xA7A9: 0x599D, - 0xA7AA: 0x5992, - 0xA7AB: 0x59A8, - 0xA7AC: 0x599E, - 0xA7AD: 0x59A3, - 0xA7AE: 0x5999, - 0xA7AF: 0x5996, - 0xA7B0: 0x598D, - 0xA7B1: 0x59A4, - 0xA7B2: 0x5993, - 0xA7B3: 0x598A, - 0xA7B4: 0x59A5, - 0xA7B5: 0x5B5D, - 0xA7B6: 0x5B5C, - 0xA7B7: 0x5B5A, - 0xA7B8: 0x5B5B, - 0xA7B9: 0x5B8C, - 0xA7BA: 0x5B8B, - 0xA7BB: 0x5B8F, - 0xA7BC: 0x5C2C, - 0xA7BD: 0x5C40, - 0xA7BE: 0x5C41, - 0xA7BF: 0x5C3F, - 0xA7C0: 0x5C3E, - 0xA7C1: 0x5C90, - 0xA7C2: 0x5C91, - 0xA7C3: 0x5C94, - 0xA7C4: 0x5C8C, - 0xA7C5: 0x5DEB, - 0xA7C6: 0x5E0C, - 0xA7C7: 0x5E8F, - 0xA7C8: 0x5E87, - 0xA7C9: 0x5E8A, - 0xA7CA: 0x5EF7, - 0xA7CB: 0x5F04, - 0xA7CC: 0x5F1F, - 0xA7CD: 0x5F64, - 0xA7CE: 0x5F62, - 0xA7CF: 0x5F77, - 0xA7D0: 0x5F79, - 0xA7D1: 0x5FD8, - 0xA7D2: 0x5FCC, - 0xA7D3: 0x5FD7, - 0xA7D4: 0x5FCD, - 0xA7D5: 0x5FF1, - 0xA7D6: 0x5FEB, - 0xA7D7: 0x5FF8, - 0xA7D8: 0x5FEA, - 0xA7D9: 0x6212, - 0xA7DA: 0x6211, - 0xA7DB: 0x6284, - 0xA7DC: 0x6297, - 0xA7DD: 0x6296, - 0xA7DE: 0x6280, - 0xA7DF: 0x6276, - 0xA7E0: 0x6289, - 0xA7E1: 0x626D, - 0xA7E2: 0x628A, - 0xA7E3: 0x627C, - 0xA7E4: 0x627E, - 0xA7E5: 0x6279, - 0xA7E6: 0x6273, - 0xA7E7: 0x6292, - 0xA7E8: 0x626F, - 0xA7E9: 0x6298, - 0xA7EA: 0x626E, - 0xA7EB: 0x6295, - 0xA7EC: 0x6293, - 0xA7ED: 0x6291, - 0xA7EE: 0x6286, - 0xA7EF: 0x6539, - 0xA7F0: 0x653B, - 0xA7F1: 0x6538, - 0xA7F2: 0x65F1, - 0xA7F3: 0x66F4, - 0xA7F4: 0x675F, - 0xA7F5: 0x674E, - 0xA7F6: 0x674F, - 0xA7F7: 0x6750, - 0xA7F8: 0x6751, - 0xA7F9: 0x675C, - 0xA7FA: 0x6756, - 0xA7FB: 0x675E, - 0xA7FC: 0x6749, - 0xA7FD: 0x6746, - 0xA7FE: 0x6760, - 0xA840: 0x6753, - 0xA841: 0x6757, - 0xA842: 0x6B65, - 0xA843: 0x6BCF, - 0xA844: 0x6C42, - 0xA845: 0x6C5E, - 0xA846: 0x6C99, - 0xA847: 0x6C81, - 0xA848: 0x6C88, - 0xA849: 0x6C89, - 0xA84A: 0x6C85, - 0xA84B: 0x6C9B, - 0xA84C: 0x6C6A, - 0xA84D: 0x6C7A, - 0xA84E: 0x6C90, - 0xA84F: 0x6C70, - 0xA850: 0x6C8C, - 0xA851: 0x6C68, - 0xA852: 0x6C96, - 0xA853: 0x6C92, - 0xA854: 0x6C7D, - 0xA855: 0x6C83, - 0xA856: 0x6C72, - 0xA857: 0x6C7E, - 0xA858: 0x6C74, - 0xA859: 0x6C86, - 0xA85A: 0x6C76, - 0xA85B: 0x6C8D, - 0xA85C: 0x6C94, - 0xA85D: 0x6C98, - 0xA85E: 0x6C82, - 0xA85F: 0x7076, - 0xA860: 0x707C, - 0xA861: 0x707D, - 0xA862: 0x7078, - 0xA863: 0x7262, - 0xA864: 0x7261, - 0xA865: 0x7260, - 0xA866: 0x72C4, - 0xA867: 0x72C2, - 0xA868: 0x7396, - 0xA869: 0x752C, - 0xA86A: 0x752B, - 0xA86B: 0x7537, - 0xA86C: 0x7538, - 0xA86D: 0x7682, - 0xA86E: 0x76EF, - 0xA86F: 0x77E3, - 0xA870: 0x79C1, - 0xA871: 0x79C0, - 0xA872: 0x79BF, - 0xA873: 0x7A76, - 0xA874: 0x7CFB, - 0xA875: 0x7F55, - 0xA876: 0x8096, - 0xA877: 0x8093, - 0xA878: 0x809D, - 0xA879: 0x8098, - 0xA87A: 0x809B, - 0xA87B: 0x809A, - 0xA87C: 0x80B2, - 0xA87D: 0x826F, - 0xA87E: 0x8292, - 0xA8A1: 0x828B, - 0xA8A2: 0x828D, - 0xA8A3: 0x898B, - 0xA8A4: 0x89D2, - 0xA8A5: 0x8A00, - 0xA8A6: 0x8C37, - 0xA8A7: 0x8C46, - 0xA8A8: 0x8C55, - 0xA8A9: 0x8C9D, - 0xA8AA: 0x8D64, - 0xA8AB: 0x8D70, - 0xA8AC: 0x8DB3, - 0xA8AD: 0x8EAB, - 0xA8AE: 0x8ECA, - 0xA8AF: 0x8F9B, - 0xA8B0: 0x8FB0, - 0xA8B1: 0x8FC2, - 0xA8B2: 0x8FC6, - 0xA8B3: 0x8FC5, - 0xA8B4: 0x8FC4, - 0xA8B5: 0x5DE1, - 0xA8B6: 0x9091, - 0xA8B7: 0x90A2, - 0xA8B8: 0x90AA, - 0xA8B9: 0x90A6, - 0xA8BA: 0x90A3, - 0xA8BB: 0x9149, - 0xA8BC: 0x91C6, - 0xA8BD: 0x91CC, - 0xA8BE: 0x9632, - 0xA8BF: 0x962E, - 0xA8C0: 0x9631, - 0xA8C1: 0x962A, - 0xA8C2: 0x962C, - 0xA8C3: 0x4E26, - 0xA8C4: 0x4E56, - 0xA8C5: 0x4E73, - 0xA8C6: 0x4E8B, - 0xA8C7: 0x4E9B, - 0xA8C8: 0x4E9E, - 0xA8C9: 0x4EAB, - 0xA8CA: 0x4EAC, - 0xA8CB: 0x4F6F, - 0xA8CC: 0x4F9D, - 0xA8CD: 0x4F8D, - 0xA8CE: 0x4F73, - 0xA8CF: 0x4F7F, - 0xA8D0: 0x4F6C, - 0xA8D1: 0x4F9B, - 0xA8D2: 0x4F8B, - 0xA8D3: 0x4F86, - 0xA8D4: 0x4F83, - 0xA8D5: 0x4F70, - 0xA8D6: 0x4F75, - 0xA8D7: 0x4F88, - 0xA8D8: 0x4F69, - 0xA8D9: 0x4F7B, - 0xA8DA: 0x4F96, - 0xA8DB: 0x4F7E, - 0xA8DC: 0x4F8F, - 0xA8DD: 0x4F91, - 0xA8DE: 0x4F7A, - 0xA8DF: 0x5154, - 0xA8E0: 0x5152, - 0xA8E1: 0x5155, - 0xA8E2: 0x5169, - 0xA8E3: 0x5177, - 0xA8E4: 0x5176, - 0xA8E5: 0x5178, - 0xA8E6: 0x51BD, - 0xA8E7: 0x51FD, - 0xA8E8: 0x523B, - 0xA8E9: 0x5238, - 0xA8EA: 0x5237, - 0xA8EB: 0x523A, - 0xA8EC: 0x5230, - 0xA8ED: 0x522E, - 0xA8EE: 0x5236, - 0xA8EF: 0x5241, - 0xA8F0: 0x52BE, - 0xA8F1: 0x52BB, - 0xA8F2: 0x5352, - 0xA8F3: 0x5354, - 0xA8F4: 0x5353, - 0xA8F5: 0x5351, - 0xA8F6: 0x5366, - 0xA8F7: 0x5377, - 0xA8F8: 0x5378, - 0xA8F9: 0x5379, - 0xA8FA: 0x53D6, - 0xA8FB: 0x53D4, - 0xA8FC: 0x53D7, - 0xA8FD: 0x5473, - 0xA8FE: 0x5475, - 0xA940: 0x5496, - 0xA941: 0x5478, - 0xA942: 0x5495, - 0xA943: 0x5480, - 0xA944: 0x547B, - 0xA945: 0x5477, - 0xA946: 0x5484, - 0xA947: 0x5492, - 0xA948: 0x5486, - 0xA949: 0x547C, - 0xA94A: 0x5490, - 0xA94B: 0x5471, - 0xA94C: 0x5476, - 0xA94D: 0x548C, - 0xA94E: 0x549A, - 0xA94F: 0x5462, - 0xA950: 0x5468, - 0xA951: 0x548B, - 0xA952: 0x547D, - 0xA953: 0x548E, - 0xA954: 0x56FA, - 0xA955: 0x5783, - 0xA956: 0x5777, - 0xA957: 0x576A, - 0xA958: 0x5769, - 0xA959: 0x5761, - 0xA95A: 0x5766, - 0xA95B: 0x5764, - 0xA95C: 0x577C, - 0xA95D: 0x591C, - 0xA95E: 0x5949, - 0xA95F: 0x5947, - 0xA960: 0x5948, - 0xA961: 0x5944, - 0xA962: 0x5954, - 0xA963: 0x59BE, - 0xA964: 0x59BB, - 0xA965: 0x59D4, - 0xA966: 0x59B9, - 0xA967: 0x59AE, - 0xA968: 0x59D1, - 0xA969: 0x59C6, - 0xA96A: 0x59D0, - 0xA96B: 0x59CD, - 0xA96C: 0x59CB, - 0xA96D: 0x59D3, - 0xA96E: 0x59CA, - 0xA96F: 0x59AF, - 0xA970: 0x59B3, - 0xA971: 0x59D2, - 0xA972: 0x59C5, - 0xA973: 0x5B5F, - 0xA974: 0x5B64, - 0xA975: 0x5B63, - 0xA976: 0x5B97, - 0xA977: 0x5B9A, - 0xA978: 0x5B98, - 0xA979: 0x5B9C, - 0xA97A: 0x5B99, - 0xA97B: 0x5B9B, - 0xA97C: 0x5C1A, - 0xA97D: 0x5C48, - 0xA97E: 0x5C45, - 0xA9A1: 0x5C46, - 0xA9A2: 0x5CB7, - 0xA9A3: 0x5CA1, - 0xA9A4: 0x5CB8, - 0xA9A5: 0x5CA9, - 0xA9A6: 0x5CAB, - 0xA9A7: 0x5CB1, - 0xA9A8: 0x5CB3, - 0xA9A9: 0x5E18, - 0xA9AA: 0x5E1A, - 0xA9AB: 0x5E16, - 0xA9AC: 0x5E15, - 0xA9AD: 0x5E1B, - 0xA9AE: 0x5E11, - 0xA9AF: 0x5E78, - 0xA9B0: 0x5E9A, - 0xA9B1: 0x5E97, - 0xA9B2: 0x5E9C, - 0xA9B3: 0x5E95, - 0xA9B4: 0x5E96, - 0xA9B5: 0x5EF6, - 0xA9B6: 0x5F26, - 0xA9B7: 0x5F27, - 0xA9B8: 0x5F29, - 0xA9B9: 0x5F80, - 0xA9BA: 0x5F81, - 0xA9BB: 0x5F7F, - 0xA9BC: 0x5F7C, - 0xA9BD: 0x5FDD, - 0xA9BE: 0x5FE0, - 0xA9BF: 0x5FFD, - 0xA9C0: 0x5FF5, - 0xA9C1: 0x5FFF, - 0xA9C2: 0x600F, - 0xA9C3: 0x6014, - 0xA9C4: 0x602F, - 0xA9C5: 0x6035, - 0xA9C6: 0x6016, - 0xA9C7: 0x602A, - 0xA9C8: 0x6015, - 0xA9C9: 0x6021, - 0xA9CA: 0x6027, - 0xA9CB: 0x6029, - 0xA9CC: 0x602B, - 0xA9CD: 0x601B, - 0xA9CE: 0x6216, - 0xA9CF: 0x6215, - 0xA9D0: 0x623F, - 0xA9D1: 0x623E, - 0xA9D2: 0x6240, - 0xA9D3: 0x627F, - 0xA9D4: 0x62C9, - 0xA9D5: 0x62CC, - 0xA9D6: 0x62C4, - 0xA9D7: 0x62BF, - 0xA9D8: 0x62C2, - 0xA9D9: 0x62B9, - 0xA9DA: 0x62D2, - 0xA9DB: 0x62DB, - 0xA9DC: 0x62AB, - 0xA9DD: 0x62D3, - 0xA9DE: 0x62D4, - 0xA9DF: 0x62CB, - 0xA9E0: 0x62C8, - 0xA9E1: 0x62A8, - 0xA9E2: 0x62BD, - 0xA9E3: 0x62BC, - 0xA9E4: 0x62D0, - 0xA9E5: 0x62D9, - 0xA9E6: 0x62C7, - 0xA9E7: 0x62CD, - 0xA9E8: 0x62B5, - 0xA9E9: 0x62DA, - 0xA9EA: 0x62B1, - 0xA9EB: 0x62D8, - 0xA9EC: 0x62D6, - 0xA9ED: 0x62D7, - 0xA9EE: 0x62C6, - 0xA9EF: 0x62AC, - 0xA9F0: 0x62CE, - 0xA9F1: 0x653E, - 0xA9F2: 0x65A7, - 0xA9F3: 0x65BC, - 0xA9F4: 0x65FA, - 0xA9F5: 0x6614, - 0xA9F6: 0x6613, - 0xA9F7: 0x660C, - 0xA9F8: 0x6606, - 0xA9F9: 0x6602, - 0xA9FA: 0x660E, - 0xA9FB: 0x6600, - 0xA9FC: 0x660F, - 0xA9FD: 0x6615, - 0xA9FE: 0x660A, - 0xAA40: 0x6607, - 0xAA41: 0x670D, - 0xAA42: 0x670B, - 0xAA43: 0x676D, - 0xAA44: 0x678B, - 0xAA45: 0x6795, - 0xAA46: 0x6771, - 0xAA47: 0x679C, - 0xAA48: 0x6773, - 0xAA49: 0x6777, - 0xAA4A: 0x6787, - 0xAA4B: 0x679D, - 0xAA4C: 0x6797, - 0xAA4D: 0x676F, - 0xAA4E: 0x6770, - 0xAA4F: 0x677F, - 0xAA50: 0x6789, - 0xAA51: 0x677E, - 0xAA52: 0x6790, - 0xAA53: 0x6775, - 0xAA54: 0x679A, - 0xAA55: 0x6793, - 0xAA56: 0x677C, - 0xAA57: 0x676A, - 0xAA58: 0x6772, - 0xAA59: 0x6B23, - 0xAA5A: 0x6B66, - 0xAA5B: 0x6B67, - 0xAA5C: 0x6B7F, - 0xAA5D: 0x6C13, - 0xAA5E: 0x6C1B, - 0xAA5F: 0x6CE3, - 0xAA60: 0x6CE8, - 0xAA61: 0x6CF3, - 0xAA62: 0x6CB1, - 0xAA63: 0x6CCC, - 0xAA64: 0x6CE5, - 0xAA65: 0x6CB3, - 0xAA66: 0x6CBD, - 0xAA67: 0x6CBE, - 0xAA68: 0x6CBC, - 0xAA69: 0x6CE2, - 0xAA6A: 0x6CAB, - 0xAA6B: 0x6CD5, - 0xAA6C: 0x6CD3, - 0xAA6D: 0x6CB8, - 0xAA6E: 0x6CC4, - 0xAA6F: 0x6CB9, - 0xAA70: 0x6CC1, - 0xAA71: 0x6CAE, - 0xAA72: 0x6CD7, - 0xAA73: 0x6CC5, - 0xAA74: 0x6CF1, - 0xAA75: 0x6CBF, - 0xAA76: 0x6CBB, - 0xAA77: 0x6CE1, - 0xAA78: 0x6CDB, - 0xAA79: 0x6CCA, - 0xAA7A: 0x6CAC, - 0xAA7B: 0x6CEF, - 0xAA7C: 0x6CDC, - 0xAA7D: 0x6CD6, - 0xAA7E: 0x6CE0, - 0xAAA1: 0x7095, - 0xAAA2: 0x708E, - 0xAAA3: 0x7092, - 0xAAA4: 0x708A, - 0xAAA5: 0x7099, - 0xAAA6: 0x722C, - 0xAAA7: 0x722D, - 0xAAA8: 0x7238, - 0xAAA9: 0x7248, - 0xAAAA: 0x7267, - 0xAAAB: 0x7269, - 0xAAAC: 0x72C0, - 0xAAAD: 0x72CE, - 0xAAAE: 0x72D9, - 0xAAAF: 0x72D7, - 0xAAB0: 0x72D0, - 0xAAB1: 0x73A9, - 0xAAB2: 0x73A8, - 0xAAB3: 0x739F, - 0xAAB4: 0x73AB, - 0xAAB5: 0x73A5, - 0xAAB6: 0x753D, - 0xAAB7: 0x759D, - 0xAAB8: 0x7599, - 0xAAB9: 0x759A, - 0xAABA: 0x7684, - 0xAABB: 0x76C2, - 0xAABC: 0x76F2, - 0xAABD: 0x76F4, - 0xAABE: 0x77E5, - 0xAABF: 0x77FD, - 0xAAC0: 0x793E, - 0xAAC1: 0x7940, - 0xAAC2: 0x7941, - 0xAAC3: 0x79C9, - 0xAAC4: 0x79C8, - 0xAAC5: 0x7A7A, - 0xAAC6: 0x7A79, - 0xAAC7: 0x7AFA, - 0xAAC8: 0x7CFE, - 0xAAC9: 0x7F54, - 0xAACA: 0x7F8C, - 0xAACB: 0x7F8B, - 0xAACC: 0x8005, - 0xAACD: 0x80BA, - 0xAACE: 0x80A5, - 0xAACF: 0x80A2, - 0xAAD0: 0x80B1, - 0xAAD1: 0x80A1, - 0xAAD2: 0x80AB, - 0xAAD3: 0x80A9, - 0xAAD4: 0x80B4, - 0xAAD5: 0x80AA, - 0xAAD6: 0x80AF, - 0xAAD7: 0x81E5, - 0xAAD8: 0x81FE, - 0xAAD9: 0x820D, - 0xAADA: 0x82B3, - 0xAADB: 0x829D, - 0xAADC: 0x8299, - 0xAADD: 0x82AD, - 0xAADE: 0x82BD, - 0xAADF: 0x829F, - 0xAAE0: 0x82B9, - 0xAAE1: 0x82B1, - 0xAAE2: 0x82AC, - 0xAAE3: 0x82A5, - 0xAAE4: 0x82AF, - 0xAAE5: 0x82B8, - 0xAAE6: 0x82A3, - 0xAAE7: 0x82B0, - 0xAAE8: 0x82BE, - 0xAAE9: 0x82B7, - 0xAAEA: 0x864E, - 0xAAEB: 0x8671, - 0xAAEC: 0x521D, - 0xAAED: 0x8868, - 0xAAEE: 0x8ECB, - 0xAAEF: 0x8FCE, - 0xAAF0: 0x8FD4, - 0xAAF1: 0x8FD1, - 0xAAF2: 0x90B5, - 0xAAF3: 0x90B8, - 0xAAF4: 0x90B1, - 0xAAF5: 0x90B6, - 0xAAF6: 0x91C7, - 0xAAF7: 0x91D1, - 0xAAF8: 0x9577, - 0xAAF9: 0x9580, - 0xAAFA: 0x961C, - 0xAAFB: 0x9640, - 0xAAFC: 0x963F, - 0xAAFD: 0x963B, - 0xAAFE: 0x9644, - 0xAB40: 0x9642, - 0xAB41: 0x96B9, - 0xAB42: 0x96E8, - 0xAB43: 0x9752, - 0xAB44: 0x975E, - 0xAB45: 0x4E9F, - 0xAB46: 0x4EAD, - 0xAB47: 0x4EAE, - 0xAB48: 0x4FE1, - 0xAB49: 0x4FB5, - 0xAB4A: 0x4FAF, - 0xAB4B: 0x4FBF, - 0xAB4C: 0x4FE0, - 0xAB4D: 0x4FD1, - 0xAB4E: 0x4FCF, - 0xAB4F: 0x4FDD, - 0xAB50: 0x4FC3, - 0xAB51: 0x4FB6, - 0xAB52: 0x4FD8, - 0xAB53: 0x4FDF, - 0xAB54: 0x4FCA, - 0xAB55: 0x4FD7, - 0xAB56: 0x4FAE, - 0xAB57: 0x4FD0, - 0xAB58: 0x4FC4, - 0xAB59: 0x4FC2, - 0xAB5A: 0x4FDA, - 0xAB5B: 0x4FCE, - 0xAB5C: 0x4FDE, - 0xAB5D: 0x4FB7, - 0xAB5E: 0x5157, - 0xAB5F: 0x5192, - 0xAB60: 0x5191, - 0xAB61: 0x51A0, - 0xAB62: 0x524E, - 0xAB63: 0x5243, - 0xAB64: 0x524A, - 0xAB65: 0x524D, - 0xAB66: 0x524C, - 0xAB67: 0x524B, - 0xAB68: 0x5247, - 0xAB69: 0x52C7, - 0xAB6A: 0x52C9, - 0xAB6B: 0x52C3, - 0xAB6C: 0x52C1, - 0xAB6D: 0x530D, - 0xAB6E: 0x5357, - 0xAB6F: 0x537B, - 0xAB70: 0x539A, - 0xAB71: 0x53DB, - 0xAB72: 0x54AC, - 0xAB73: 0x54C0, - 0xAB74: 0x54A8, - 0xAB75: 0x54CE, - 0xAB76: 0x54C9, - 0xAB77: 0x54B8, - 0xAB78: 0x54A6, - 0xAB79: 0x54B3, - 0xAB7A: 0x54C7, - 0xAB7B: 0x54C2, - 0xAB7C: 0x54BD, - 0xAB7D: 0x54AA, - 0xAB7E: 0x54C1, - 0xABA1: 0x54C4, - 0xABA2: 0x54C8, - 0xABA3: 0x54AF, - 0xABA4: 0x54AB, - 0xABA5: 0x54B1, - 0xABA6: 0x54BB, - 0xABA7: 0x54A9, - 0xABA8: 0x54A7, - 0xABA9: 0x54BF, - 0xABAA: 0x56FF, - 0xABAB: 0x5782, - 0xABAC: 0x578B, - 0xABAD: 0x57A0, - 0xABAE: 0x57A3, - 0xABAF: 0x57A2, - 0xABB0: 0x57CE, - 0xABB1: 0x57AE, - 0xABB2: 0x5793, - 0xABB3: 0x5955, - 0xABB4: 0x5951, - 0xABB5: 0x594F, - 0xABB6: 0x594E, - 0xABB7: 0x5950, - 0xABB8: 0x59DC, - 0xABB9: 0x59D8, - 0xABBA: 0x59FF, - 0xABBB: 0x59E3, - 0xABBC: 0x59E8, - 0xABBD: 0x5A03, - 0xABBE: 0x59E5, - 0xABBF: 0x59EA, - 0xABC0: 0x59DA, - 0xABC1: 0x59E6, - 0xABC2: 0x5A01, - 0xABC3: 0x59FB, - 0xABC4: 0x5B69, - 0xABC5: 0x5BA3, - 0xABC6: 0x5BA6, - 0xABC7: 0x5BA4, - 0xABC8: 0x5BA2, - 0xABC9: 0x5BA5, - 0xABCA: 0x5C01, - 0xABCB: 0x5C4E, - 0xABCC: 0x5C4F, - 0xABCD: 0x5C4D, - 0xABCE: 0x5C4B, - 0xABCF: 0x5CD9, - 0xABD0: 0x5CD2, - 0xABD1: 0x5DF7, - 0xABD2: 0x5E1D, - 0xABD3: 0x5E25, - 0xABD4: 0x5E1F, - 0xABD5: 0x5E7D, - 0xABD6: 0x5EA0, - 0xABD7: 0x5EA6, - 0xABD8: 0x5EFA, - 0xABD9: 0x5F08, - 0xABDA: 0x5F2D, - 0xABDB: 0x5F65, - 0xABDC: 0x5F88, - 0xABDD: 0x5F85, - 0xABDE: 0x5F8A, - 0xABDF: 0x5F8B, - 0xABE0: 0x5F87, - 0xABE1: 0x5F8C, - 0xABE2: 0x5F89, - 0xABE3: 0x6012, - 0xABE4: 0x601D, - 0xABE5: 0x6020, - 0xABE6: 0x6025, - 0xABE7: 0x600E, - 0xABE8: 0x6028, - 0xABE9: 0x604D, - 0xABEA: 0x6070, - 0xABEB: 0x6068, - 0xABEC: 0x6062, - 0xABED: 0x6046, - 0xABEE: 0x6043, - 0xABEF: 0x606C, - 0xABF0: 0x606B, - 0xABF1: 0x606A, - 0xABF2: 0x6064, - 0xABF3: 0x6241, - 0xABF4: 0x62DC, - 0xABF5: 0x6316, - 0xABF6: 0x6309, - 0xABF7: 0x62FC, - 0xABF8: 0x62ED, - 0xABF9: 0x6301, - 0xABFA: 0x62EE, - 0xABFB: 0x62FD, - 0xABFC: 0x6307, - 0xABFD: 0x62F1, - 0xABFE: 0x62F7, - 0xAC40: 0x62EF, - 0xAC41: 0x62EC, - 0xAC42: 0x62FE, - 0xAC43: 0x62F4, - 0xAC44: 0x6311, - 0xAC45: 0x6302, - 0xAC46: 0x653F, - 0xAC47: 0x6545, - 0xAC48: 0x65AB, - 0xAC49: 0x65BD, - 0xAC4A: 0x65E2, - 0xAC4B: 0x6625, - 0xAC4C: 0x662D, - 0xAC4D: 0x6620, - 0xAC4E: 0x6627, - 0xAC4F: 0x662F, - 0xAC50: 0x661F, - 0xAC51: 0x6628, - 0xAC52: 0x6631, - 0xAC53: 0x6624, - 0xAC54: 0x66F7, - 0xAC55: 0x67FF, - 0xAC56: 0x67D3, - 0xAC57: 0x67F1, - 0xAC58: 0x67D4, - 0xAC59: 0x67D0, - 0xAC5A: 0x67EC, - 0xAC5B: 0x67B6, - 0xAC5C: 0x67AF, - 0xAC5D: 0x67F5, - 0xAC5E: 0x67E9, - 0xAC5F: 0x67EF, - 0xAC60: 0x67C4, - 0xAC61: 0x67D1, - 0xAC62: 0x67B4, - 0xAC63: 0x67DA, - 0xAC64: 0x67E5, - 0xAC65: 0x67B8, - 0xAC66: 0x67CF, - 0xAC67: 0x67DE, - 0xAC68: 0x67F3, - 0xAC69: 0x67B0, - 0xAC6A: 0x67D9, - 0xAC6B: 0x67E2, - 0xAC6C: 0x67DD, - 0xAC6D: 0x67D2, - 0xAC6E: 0x6B6A, - 0xAC6F: 0x6B83, - 0xAC70: 0x6B86, - 0xAC71: 0x6BB5, - 0xAC72: 0x6BD2, - 0xAC73: 0x6BD7, - 0xAC74: 0x6C1F, - 0xAC75: 0x6CC9, - 0xAC76: 0x6D0B, - 0xAC77: 0x6D32, - 0xAC78: 0x6D2A, - 0xAC79: 0x6D41, - 0xAC7A: 0x6D25, - 0xAC7B: 0x6D0C, - 0xAC7C: 0x6D31, - 0xAC7D: 0x6D1E, - 0xAC7E: 0x6D17, - 0xACA1: 0x6D3B, - 0xACA2: 0x6D3D, - 0xACA3: 0x6D3E, - 0xACA4: 0x6D36, - 0xACA5: 0x6D1B, - 0xACA6: 0x6CF5, - 0xACA7: 0x6D39, - 0xACA8: 0x6D27, - 0xACA9: 0x6D38, - 0xACAA: 0x6D29, - 0xACAB: 0x6D2E, - 0xACAC: 0x6D35, - 0xACAD: 0x6D0E, - 0xACAE: 0x6D2B, - 0xACAF: 0x70AB, - 0xACB0: 0x70BA, - 0xACB1: 0x70B3, - 0xACB2: 0x70AC, - 0xACB3: 0x70AF, - 0xACB4: 0x70AD, - 0xACB5: 0x70B8, - 0xACB6: 0x70AE, - 0xACB7: 0x70A4, - 0xACB8: 0x7230, - 0xACB9: 0x7272, - 0xACBA: 0x726F, - 0xACBB: 0x7274, - 0xACBC: 0x72E9, - 0xACBD: 0x72E0, - 0xACBE: 0x72E1, - 0xACBF: 0x73B7, - 0xACC0: 0x73CA, - 0xACC1: 0x73BB, - 0xACC2: 0x73B2, - 0xACC3: 0x73CD, - 0xACC4: 0x73C0, - 0xACC5: 0x73B3, - 0xACC6: 0x751A, - 0xACC7: 0x752D, - 0xACC8: 0x754F, - 0xACC9: 0x754C, - 0xACCA: 0x754E, - 0xACCB: 0x754B, - 0xACCC: 0x75AB, - 0xACCD: 0x75A4, - 0xACCE: 0x75A5, - 0xACCF: 0x75A2, - 0xACD0: 0x75A3, - 0xACD1: 0x7678, - 0xACD2: 0x7686, - 0xACD3: 0x7687, - 0xACD4: 0x7688, - 0xACD5: 0x76C8, - 0xACD6: 0x76C6, - 0xACD7: 0x76C3, - 0xACD8: 0x76C5, - 0xACD9: 0x7701, - 0xACDA: 0x76F9, - 0xACDB: 0x76F8, - 0xACDC: 0x7709, - 0xACDD: 0x770B, - 0xACDE: 0x76FE, - 0xACDF: 0x76FC, - 0xACE0: 0x7707, - 0xACE1: 0x77DC, - 0xACE2: 0x7802, - 0xACE3: 0x7814, - 0xACE4: 0x780C, - 0xACE5: 0x780D, - 0xACE6: 0x7946, - 0xACE7: 0x7949, - 0xACE8: 0x7948, - 0xACE9: 0x7947, - 0xACEA: 0x79B9, - 0xACEB: 0x79BA, - 0xACEC: 0x79D1, - 0xACED: 0x79D2, - 0xACEE: 0x79CB, - 0xACEF: 0x7A7F, - 0xACF0: 0x7A81, - 0xACF1: 0x7AFF, - 0xACF2: 0x7AFD, - 0xACF3: 0x7C7D, - 0xACF4: 0x7D02, - 0xACF5: 0x7D05, - 0xACF6: 0x7D00, - 0xACF7: 0x7D09, - 0xACF8: 0x7D07, - 0xACF9: 0x7D04, - 0xACFA: 0x7D06, - 0xACFB: 0x7F38, - 0xACFC: 0x7F8E, - 0xACFD: 0x7FBF, - 0xACFE: 0x8004, - 0xAD40: 0x8010, - 0xAD41: 0x800D, - 0xAD42: 0x8011, - 0xAD43: 0x8036, - 0xAD44: 0x80D6, - 0xAD45: 0x80E5, - 0xAD46: 0x80DA, - 0xAD47: 0x80C3, - 0xAD48: 0x80C4, - 0xAD49: 0x80CC, - 0xAD4A: 0x80E1, - 0xAD4B: 0x80DB, - 0xAD4C: 0x80CE, - 0xAD4D: 0x80DE, - 0xAD4E: 0x80E4, - 0xAD4F: 0x80DD, - 0xAD50: 0x81F4, - 0xAD51: 0x8222, - 0xAD52: 0x82E7, - 0xAD53: 0x8303, - 0xAD54: 0x8305, - 0xAD55: 0x82E3, - 0xAD56: 0x82DB, - 0xAD57: 0x82E6, - 0xAD58: 0x8304, - 0xAD59: 0x82E5, - 0xAD5A: 0x8302, - 0xAD5B: 0x8309, - 0xAD5C: 0x82D2, - 0xAD5D: 0x82D7, - 0xAD5E: 0x82F1, - 0xAD5F: 0x8301, - 0xAD60: 0x82DC, - 0xAD61: 0x82D4, - 0xAD62: 0x82D1, - 0xAD63: 0x82DE, - 0xAD64: 0x82D3, - 0xAD65: 0x82DF, - 0xAD66: 0x82EF, - 0xAD67: 0x8306, - 0xAD68: 0x8650, - 0xAD69: 0x8679, - 0xAD6A: 0x867B, - 0xAD6B: 0x867A, - 0xAD6C: 0x884D, - 0xAD6D: 0x886B, - 0xAD6E: 0x8981, - 0xAD6F: 0x89D4, - 0xAD70: 0x8A08, - 0xAD71: 0x8A02, - 0xAD72: 0x8A03, - 0xAD73: 0x8C9E, - 0xAD74: 0x8CA0, - 0xAD75: 0x8D74, - 0xAD76: 0x8D73, - 0xAD77: 0x8DB4, - 0xAD78: 0x8ECD, - 0xAD79: 0x8ECC, - 0xAD7A: 0x8FF0, - 0xAD7B: 0x8FE6, - 0xAD7C: 0x8FE2, - 0xAD7D: 0x8FEA, - 0xAD7E: 0x8FE5, - 0xADA1: 0x8FED, - 0xADA2: 0x8FEB, - 0xADA3: 0x8FE4, - 0xADA4: 0x8FE8, - 0xADA5: 0x90CA, - 0xADA6: 0x90CE, - 0xADA7: 0x90C1, - 0xADA8: 0x90C3, - 0xADA9: 0x914B, - 0xADAA: 0x914A, - 0xADAB: 0x91CD, - 0xADAC: 0x9582, - 0xADAD: 0x9650, - 0xADAE: 0x964B, - 0xADAF: 0x964C, - 0xADB0: 0x964D, - 0xADB1: 0x9762, - 0xADB2: 0x9769, - 0xADB3: 0x97CB, - 0xADB4: 0x97ED, - 0xADB5: 0x97F3, - 0xADB6: 0x9801, - 0xADB7: 0x98A8, - 0xADB8: 0x98DB, - 0xADB9: 0x98DF, - 0xADBA: 0x9996, - 0xADBB: 0x9999, - 0xADBC: 0x4E58, - 0xADBD: 0x4EB3, - 0xADBE: 0x500C, - 0xADBF: 0x500D, - 0xADC0: 0x5023, - 0xADC1: 0x4FEF, - 0xADC2: 0x5026, - 0xADC3: 0x5025, - 0xADC4: 0x4FF8, - 0xADC5: 0x5029, - 0xADC6: 0x5016, - 0xADC7: 0x5006, - 0xADC8: 0x503C, - 0xADC9: 0x501F, - 0xADCA: 0x501A, - 0xADCB: 0x5012, - 0xADCC: 0x5011, - 0xADCD: 0x4FFA, - 0xADCE: 0x5000, - 0xADCF: 0x5014, - 0xADD0: 0x5028, - 0xADD1: 0x4FF1, - 0xADD2: 0x5021, - 0xADD3: 0x500B, - 0xADD4: 0x5019, - 0xADD5: 0x5018, - 0xADD6: 0x4FF3, - 0xADD7: 0x4FEE, - 0xADD8: 0x502D, - 0xADD9: 0x502A, - 0xADDA: 0x4FFE, - 0xADDB: 0x502B, - 0xADDC: 0x5009, - 0xADDD: 0x517C, - 0xADDE: 0x51A4, - 0xADDF: 0x51A5, - 0xADE0: 0x51A2, - 0xADE1: 0x51CD, - 0xADE2: 0x51CC, - 0xADE3: 0x51C6, - 0xADE4: 0x51CB, - 0xADE5: 0x5256, - 0xADE6: 0x525C, - 0xADE7: 0x5254, - 0xADE8: 0x525B, - 0xADE9: 0x525D, - 0xADEA: 0x532A, - 0xADEB: 0x537F, - 0xADEC: 0x539F, - 0xADED: 0x539D, - 0xADEE: 0x53DF, - 0xADEF: 0x54E8, - 0xADF0: 0x5510, - 0xADF1: 0x5501, - 0xADF2: 0x5537, - 0xADF3: 0x54FC, - 0xADF4: 0x54E5, - 0xADF5: 0x54F2, - 0xADF6: 0x5506, - 0xADF7: 0x54FA, - 0xADF8: 0x5514, - 0xADF9: 0x54E9, - 0xADFA: 0x54ED, - 0xADFB: 0x54E1, - 0xADFC: 0x5509, - 0xADFD: 0x54EE, - 0xADFE: 0x54EA, - 0xAE40: 0x54E6, - 0xAE41: 0x5527, - 0xAE42: 0x5507, - 0xAE43: 0x54FD, - 0xAE44: 0x550F, - 0xAE45: 0x5703, - 0xAE46: 0x5704, - 0xAE47: 0x57C2, - 0xAE48: 0x57D4, - 0xAE49: 0x57CB, - 0xAE4A: 0x57C3, - 0xAE4B: 0x5809, - 0xAE4C: 0x590F, - 0xAE4D: 0x5957, - 0xAE4E: 0x5958, - 0xAE4F: 0x595A, - 0xAE50: 0x5A11, - 0xAE51: 0x5A18, - 0xAE52: 0x5A1C, - 0xAE53: 0x5A1F, - 0xAE54: 0x5A1B, - 0xAE55: 0x5A13, - 0xAE56: 0x59EC, - 0xAE57: 0x5A20, - 0xAE58: 0x5A23, - 0xAE59: 0x5A29, - 0xAE5A: 0x5A25, - 0xAE5B: 0x5A0C, - 0xAE5C: 0x5A09, - 0xAE5D: 0x5B6B, - 0xAE5E: 0x5C58, - 0xAE5F: 0x5BB0, - 0xAE60: 0x5BB3, - 0xAE61: 0x5BB6, - 0xAE62: 0x5BB4, - 0xAE63: 0x5BAE, - 0xAE64: 0x5BB5, - 0xAE65: 0x5BB9, - 0xAE66: 0x5BB8, - 0xAE67: 0x5C04, - 0xAE68: 0x5C51, - 0xAE69: 0x5C55, - 0xAE6A: 0x5C50, - 0xAE6B: 0x5CED, - 0xAE6C: 0x5CFD, - 0xAE6D: 0x5CFB, - 0xAE6E: 0x5CEA, - 0xAE6F: 0x5CE8, - 0xAE70: 0x5CF0, - 0xAE71: 0x5CF6, - 0xAE72: 0x5D01, - 0xAE73: 0x5CF4, - 0xAE74: 0x5DEE, - 0xAE75: 0x5E2D, - 0xAE76: 0x5E2B, - 0xAE77: 0x5EAB, - 0xAE78: 0x5EAD, - 0xAE79: 0x5EA7, - 0xAE7A: 0x5F31, - 0xAE7B: 0x5F92, - 0xAE7C: 0x5F91, - 0xAE7D: 0x5F90, - 0xAE7E: 0x6059, - 0xAEA1: 0x6063, - 0xAEA2: 0x6065, - 0xAEA3: 0x6050, - 0xAEA4: 0x6055, - 0xAEA5: 0x606D, - 0xAEA6: 0x6069, - 0xAEA7: 0x606F, - 0xAEA8: 0x6084, - 0xAEA9: 0x609F, - 0xAEAA: 0x609A, - 0xAEAB: 0x608D, - 0xAEAC: 0x6094, - 0xAEAD: 0x608C, - 0xAEAE: 0x6085, - 0xAEAF: 0x6096, - 0xAEB0: 0x6247, - 0xAEB1: 0x62F3, - 0xAEB2: 0x6308, - 0xAEB3: 0x62FF, - 0xAEB4: 0x634E, - 0xAEB5: 0x633E, - 0xAEB6: 0x632F, - 0xAEB7: 0x6355, - 0xAEB8: 0x6342, - 0xAEB9: 0x6346, - 0xAEBA: 0x634F, - 0xAEBB: 0x6349, - 0xAEBC: 0x633A, - 0xAEBD: 0x6350, - 0xAEBE: 0x633D, - 0xAEBF: 0x632A, - 0xAEC0: 0x632B, - 0xAEC1: 0x6328, - 0xAEC2: 0x634D, - 0xAEC3: 0x634C, - 0xAEC4: 0x6548, - 0xAEC5: 0x6549, - 0xAEC6: 0x6599, - 0xAEC7: 0x65C1, - 0xAEC8: 0x65C5, - 0xAEC9: 0x6642, - 0xAECA: 0x6649, - 0xAECB: 0x664F, - 0xAECC: 0x6643, - 0xAECD: 0x6652, - 0xAECE: 0x664C, - 0xAECF: 0x6645, - 0xAED0: 0x6641, - 0xAED1: 0x66F8, - 0xAED2: 0x6714, - 0xAED3: 0x6715, - 0xAED4: 0x6717, - 0xAED5: 0x6821, - 0xAED6: 0x6838, - 0xAED7: 0x6848, - 0xAED8: 0x6846, - 0xAED9: 0x6853, - 0xAEDA: 0x6839, - 0xAEDB: 0x6842, - 0xAEDC: 0x6854, - 0xAEDD: 0x6829, - 0xAEDE: 0x68B3, - 0xAEDF: 0x6817, - 0xAEE0: 0x684C, - 0xAEE1: 0x6851, - 0xAEE2: 0x683D, - 0xAEE3: 0x67F4, - 0xAEE4: 0x6850, - 0xAEE5: 0x6840, - 0xAEE6: 0x683C, - 0xAEE7: 0x6843, - 0xAEE8: 0x682A, - 0xAEE9: 0x6845, - 0xAEEA: 0x6813, - 0xAEEB: 0x6818, - 0xAEEC: 0x6841, - 0xAEED: 0x6B8A, - 0xAEEE: 0x6B89, - 0xAEEF: 0x6BB7, - 0xAEF0: 0x6C23, - 0xAEF1: 0x6C27, - 0xAEF2: 0x6C28, - 0xAEF3: 0x6C26, - 0xAEF4: 0x6C24, - 0xAEF5: 0x6CF0, - 0xAEF6: 0x6D6A, - 0xAEF7: 0x6D95, - 0xAEF8: 0x6D88, - 0xAEF9: 0x6D87, - 0xAEFA: 0x6D66, - 0xAEFB: 0x6D78, - 0xAEFC: 0x6D77, - 0xAEFD: 0x6D59, - 0xAEFE: 0x6D93, - 0xAF40: 0x6D6C, - 0xAF41: 0x6D89, - 0xAF42: 0x6D6E, - 0xAF43: 0x6D5A, - 0xAF44: 0x6D74, - 0xAF45: 0x6D69, - 0xAF46: 0x6D8C, - 0xAF47: 0x6D8A, - 0xAF48: 0x6D79, - 0xAF49: 0x6D85, - 0xAF4A: 0x6D65, - 0xAF4B: 0x6D94, - 0xAF4C: 0x70CA, - 0xAF4D: 0x70D8, - 0xAF4E: 0x70E4, - 0xAF4F: 0x70D9, - 0xAF50: 0x70C8, - 0xAF51: 0x70CF, - 0xAF52: 0x7239, - 0xAF53: 0x7279, - 0xAF54: 0x72FC, - 0xAF55: 0x72F9, - 0xAF56: 0x72FD, - 0xAF57: 0x72F8, - 0xAF58: 0x72F7, - 0xAF59: 0x7386, - 0xAF5A: 0x73ED, - 0xAF5B: 0x7409, - 0xAF5C: 0x73EE, - 0xAF5D: 0x73E0, - 0xAF5E: 0x73EA, - 0xAF5F: 0x73DE, - 0xAF60: 0x7554, - 0xAF61: 0x755D, - 0xAF62: 0x755C, - 0xAF63: 0x755A, - 0xAF64: 0x7559, - 0xAF65: 0x75BE, - 0xAF66: 0x75C5, - 0xAF67: 0x75C7, - 0xAF68: 0x75B2, - 0xAF69: 0x75B3, - 0xAF6A: 0x75BD, - 0xAF6B: 0x75BC, - 0xAF6C: 0x75B9, - 0xAF6D: 0x75C2, - 0xAF6E: 0x75B8, - 0xAF6F: 0x768B, - 0xAF70: 0x76B0, - 0xAF71: 0x76CA, - 0xAF72: 0x76CD, - 0xAF73: 0x76CE, - 0xAF74: 0x7729, - 0xAF75: 0x771F, - 0xAF76: 0x7720, - 0xAF77: 0x7728, - 0xAF78: 0x77E9, - 0xAF79: 0x7830, - 0xAF7A: 0x7827, - 0xAF7B: 0x7838, - 0xAF7C: 0x781D, - 0xAF7D: 0x7834, - 0xAF7E: 0x7837, - 0xAFA1: 0x7825, - 0xAFA2: 0x782D, - 0xAFA3: 0x7820, - 0xAFA4: 0x781F, - 0xAFA5: 0x7832, - 0xAFA6: 0x7955, - 0xAFA7: 0x7950, - 0xAFA8: 0x7960, - 0xAFA9: 0x795F, - 0xAFAA: 0x7956, - 0xAFAB: 0x795E, - 0xAFAC: 0x795D, - 0xAFAD: 0x7957, - 0xAFAE: 0x795A, - 0xAFAF: 0x79E4, - 0xAFB0: 0x79E3, - 0xAFB1: 0x79E7, - 0xAFB2: 0x79DF, - 0xAFB3: 0x79E6, - 0xAFB4: 0x79E9, - 0xAFB5: 0x79D8, - 0xAFB6: 0x7A84, - 0xAFB7: 0x7A88, - 0xAFB8: 0x7AD9, - 0xAFB9: 0x7B06, - 0xAFBA: 0x7B11, - 0xAFBB: 0x7C89, - 0xAFBC: 0x7D21, - 0xAFBD: 0x7D17, - 0xAFBE: 0x7D0B, - 0xAFBF: 0x7D0A, - 0xAFC0: 0x7D20, - 0xAFC1: 0x7D22, - 0xAFC2: 0x7D14, - 0xAFC3: 0x7D10, - 0xAFC4: 0x7D15, - 0xAFC5: 0x7D1A, - 0xAFC6: 0x7D1C, - 0xAFC7: 0x7D0D, - 0xAFC8: 0x7D19, - 0xAFC9: 0x7D1B, - 0xAFCA: 0x7F3A, - 0xAFCB: 0x7F5F, - 0xAFCC: 0x7F94, - 0xAFCD: 0x7FC5, - 0xAFCE: 0x7FC1, - 0xAFCF: 0x8006, - 0xAFD0: 0x8018, - 0xAFD1: 0x8015, - 0xAFD2: 0x8019, - 0xAFD3: 0x8017, - 0xAFD4: 0x803D, - 0xAFD5: 0x803F, - 0xAFD6: 0x80F1, - 0xAFD7: 0x8102, - 0xAFD8: 0x80F0, - 0xAFD9: 0x8105, - 0xAFDA: 0x80ED, - 0xAFDB: 0x80F4, - 0xAFDC: 0x8106, - 0xAFDD: 0x80F8, - 0xAFDE: 0x80F3, - 0xAFDF: 0x8108, - 0xAFE0: 0x80FD, - 0xAFE1: 0x810A, - 0xAFE2: 0x80FC, - 0xAFE3: 0x80EF, - 0xAFE4: 0x81ED, - 0xAFE5: 0x81EC, - 0xAFE6: 0x8200, - 0xAFE7: 0x8210, - 0xAFE8: 0x822A, - 0xAFE9: 0x822B, - 0xAFEA: 0x8228, - 0xAFEB: 0x822C, - 0xAFEC: 0x82BB, - 0xAFED: 0x832B, - 0xAFEE: 0x8352, - 0xAFEF: 0x8354, - 0xAFF0: 0x834A, - 0xAFF1: 0x8338, - 0xAFF2: 0x8350, - 0xAFF3: 0x8349, - 0xAFF4: 0x8335, - 0xAFF5: 0x8334, - 0xAFF6: 0x834F, - 0xAFF7: 0x8332, - 0xAFF8: 0x8339, - 0xAFF9: 0x8336, - 0xAFFA: 0x8317, - 0xAFFB: 0x8340, - 0xAFFC: 0x8331, - 0xAFFD: 0x8328, - 0xAFFE: 0x8343, - 0xB040: 0x8654, - 0xB041: 0x868A, - 0xB042: 0x86AA, - 0xB043: 0x8693, - 0xB044: 0x86A4, - 0xB045: 0x86A9, - 0xB046: 0x868C, - 0xB047: 0x86A3, - 0xB048: 0x869C, - 0xB049: 0x8870, - 0xB04A: 0x8877, - 0xB04B: 0x8881, - 0xB04C: 0x8882, - 0xB04D: 0x887D, - 0xB04E: 0x8879, - 0xB04F: 0x8A18, - 0xB050: 0x8A10, - 0xB051: 0x8A0E, - 0xB052: 0x8A0C, - 0xB053: 0x8A15, - 0xB054: 0x8A0A, - 0xB055: 0x8A17, - 0xB056: 0x8A13, - 0xB057: 0x8A16, - 0xB058: 0x8A0F, - 0xB059: 0x8A11, - 0xB05A: 0x8C48, - 0xB05B: 0x8C7A, - 0xB05C: 0x8C79, - 0xB05D: 0x8CA1, - 0xB05E: 0x8CA2, - 0xB05F: 0x8D77, - 0xB060: 0x8EAC, - 0xB061: 0x8ED2, - 0xB062: 0x8ED4, - 0xB063: 0x8ECF, - 0xB064: 0x8FB1, - 0xB065: 0x9001, - 0xB066: 0x9006, - 0xB067: 0x8FF7, - 0xB068: 0x9000, - 0xB069: 0x8FFA, - 0xB06A: 0x8FF4, - 0xB06B: 0x9003, - 0xB06C: 0x8FFD, - 0xB06D: 0x9005, - 0xB06E: 0x8FF8, - 0xB06F: 0x9095, - 0xB070: 0x90E1, - 0xB071: 0x90DD, - 0xB072: 0x90E2, - 0xB073: 0x9152, - 0xB074: 0x914D, - 0xB075: 0x914C, - 0xB076: 0x91D8, - 0xB077: 0x91DD, - 0xB078: 0x91D7, - 0xB079: 0x91DC, - 0xB07A: 0x91D9, - 0xB07B: 0x9583, - 0xB07C: 0x9662, - 0xB07D: 0x9663, - 0xB07E: 0x9661, - 0xB0A1: 0x965B, - 0xB0A2: 0x965D, - 0xB0A3: 0x9664, - 0xB0A4: 0x9658, - 0xB0A5: 0x965E, - 0xB0A6: 0x96BB, - 0xB0A7: 0x98E2, - 0xB0A8: 0x99AC, - 0xB0A9: 0x9AA8, - 0xB0AA: 0x9AD8, - 0xB0AB: 0x9B25, - 0xB0AC: 0x9B32, - 0xB0AD: 0x9B3C, - 0xB0AE: 0x4E7E, - 0xB0AF: 0x507A, - 0xB0B0: 0x507D, - 0xB0B1: 0x505C, - 0xB0B2: 0x5047, - 0xB0B3: 0x5043, - 0xB0B4: 0x504C, - 0xB0B5: 0x505A, - 0xB0B6: 0x5049, - 0xB0B7: 0x5065, - 0xB0B8: 0x5076, - 0xB0B9: 0x504E, - 0xB0BA: 0x5055, - 0xB0BB: 0x5075, - 0xB0BC: 0x5074, - 0xB0BD: 0x5077, - 0xB0BE: 0x504F, - 0xB0BF: 0x500F, - 0xB0C0: 0x506F, - 0xB0C1: 0x506D, - 0xB0C2: 0x515C, - 0xB0C3: 0x5195, - 0xB0C4: 0x51F0, - 0xB0C5: 0x526A, - 0xB0C6: 0x526F, - 0xB0C7: 0x52D2, - 0xB0C8: 0x52D9, - 0xB0C9: 0x52D8, - 0xB0CA: 0x52D5, - 0xB0CB: 0x5310, - 0xB0CC: 0x530F, - 0xB0CD: 0x5319, - 0xB0CE: 0x533F, - 0xB0CF: 0x5340, - 0xB0D0: 0x533E, - 0xB0D1: 0x53C3, - 0xB0D2: 0x66FC, - 0xB0D3: 0x5546, - 0xB0D4: 0x556A, - 0xB0D5: 0x5566, - 0xB0D6: 0x5544, - 0xB0D7: 0x555E, - 0xB0D8: 0x5561, - 0xB0D9: 0x5543, - 0xB0DA: 0x554A, - 0xB0DB: 0x5531, - 0xB0DC: 0x5556, - 0xB0DD: 0x554F, - 0xB0DE: 0x5555, - 0xB0DF: 0x552F, - 0xB0E0: 0x5564, - 0xB0E1: 0x5538, - 0xB0E2: 0x552E, - 0xB0E3: 0x555C, - 0xB0E4: 0x552C, - 0xB0E5: 0x5563, - 0xB0E6: 0x5533, - 0xB0E7: 0x5541, - 0xB0E8: 0x5557, - 0xB0E9: 0x5708, - 0xB0EA: 0x570B, - 0xB0EB: 0x5709, - 0xB0EC: 0x57DF, - 0xB0ED: 0x5805, - 0xB0EE: 0x580A, - 0xB0EF: 0x5806, - 0xB0F0: 0x57E0, - 0xB0F1: 0x57E4, - 0xB0F2: 0x57FA, - 0xB0F3: 0x5802, - 0xB0F4: 0x5835, - 0xB0F5: 0x57F7, - 0xB0F6: 0x57F9, - 0xB0F7: 0x5920, - 0xB0F8: 0x5962, - 0xB0F9: 0x5A36, - 0xB0FA: 0x5A41, - 0xB0FB: 0x5A49, - 0xB0FC: 0x5A66, - 0xB0FD: 0x5A6A, - 0xB0FE: 0x5A40, - 0xB140: 0x5A3C, - 0xB141: 0x5A62, - 0xB142: 0x5A5A, - 0xB143: 0x5A46, - 0xB144: 0x5A4A, - 0xB145: 0x5B70, - 0xB146: 0x5BC7, - 0xB147: 0x5BC5, - 0xB148: 0x5BC4, - 0xB149: 0x5BC2, - 0xB14A: 0x5BBF, - 0xB14B: 0x5BC6, - 0xB14C: 0x5C09, - 0xB14D: 0x5C08, - 0xB14E: 0x5C07, - 0xB14F: 0x5C60, - 0xB150: 0x5C5C, - 0xB151: 0x5C5D, - 0xB152: 0x5D07, - 0xB153: 0x5D06, - 0xB154: 0x5D0E, - 0xB155: 0x5D1B, - 0xB156: 0x5D16, - 0xB157: 0x5D22, - 0xB158: 0x5D11, - 0xB159: 0x5D29, - 0xB15A: 0x5D14, - 0xB15B: 0x5D19, - 0xB15C: 0x5D24, - 0xB15D: 0x5D27, - 0xB15E: 0x5D17, - 0xB15F: 0x5DE2, - 0xB160: 0x5E38, - 0xB161: 0x5E36, - 0xB162: 0x5E33, - 0xB163: 0x5E37, - 0xB164: 0x5EB7, - 0xB165: 0x5EB8, - 0xB166: 0x5EB6, - 0xB167: 0x5EB5, - 0xB168: 0x5EBE, - 0xB169: 0x5F35, - 0xB16A: 0x5F37, - 0xB16B: 0x5F57, - 0xB16C: 0x5F6C, - 0xB16D: 0x5F69, - 0xB16E: 0x5F6B, - 0xB16F: 0x5F97, - 0xB170: 0x5F99, - 0xB171: 0x5F9E, - 0xB172: 0x5F98, - 0xB173: 0x5FA1, - 0xB174: 0x5FA0, - 0xB175: 0x5F9C, - 0xB176: 0x607F, - 0xB177: 0x60A3, - 0xB178: 0x6089, - 0xB179: 0x60A0, - 0xB17A: 0x60A8, - 0xB17B: 0x60CB, - 0xB17C: 0x60B4, - 0xB17D: 0x60E6, - 0xB17E: 0x60BD, - 0xB1A1: 0x60C5, - 0xB1A2: 0x60BB, - 0xB1A3: 0x60B5, - 0xB1A4: 0x60DC, - 0xB1A5: 0x60BC, - 0xB1A6: 0x60D8, - 0xB1A7: 0x60D5, - 0xB1A8: 0x60C6, - 0xB1A9: 0x60DF, - 0xB1AA: 0x60B8, - 0xB1AB: 0x60DA, - 0xB1AC: 0x60C7, - 0xB1AD: 0x621A, - 0xB1AE: 0x621B, - 0xB1AF: 0x6248, - 0xB1B0: 0x63A0, - 0xB1B1: 0x63A7, - 0xB1B2: 0x6372, - 0xB1B3: 0x6396, - 0xB1B4: 0x63A2, - 0xB1B5: 0x63A5, - 0xB1B6: 0x6377, - 0xB1B7: 0x6367, - 0xB1B8: 0x6398, - 0xB1B9: 0x63AA, - 0xB1BA: 0x6371, - 0xB1BB: 0x63A9, - 0xB1BC: 0x6389, - 0xB1BD: 0x6383, - 0xB1BE: 0x639B, - 0xB1BF: 0x636B, - 0xB1C0: 0x63A8, - 0xB1C1: 0x6384, - 0xB1C2: 0x6388, - 0xB1C3: 0x6399, - 0xB1C4: 0x63A1, - 0xB1C5: 0x63AC, - 0xB1C6: 0x6392, - 0xB1C7: 0x638F, - 0xB1C8: 0x6380, - 0xB1C9: 0x637B, - 0xB1CA: 0x6369, - 0xB1CB: 0x6368, - 0xB1CC: 0x637A, - 0xB1CD: 0x655D, - 0xB1CE: 0x6556, - 0xB1CF: 0x6551, - 0xB1D0: 0x6559, - 0xB1D1: 0x6557, - 0xB1D2: 0x555F, - 0xB1D3: 0x654F, - 0xB1D4: 0x6558, - 0xB1D5: 0x6555, - 0xB1D6: 0x6554, - 0xB1D7: 0x659C, - 0xB1D8: 0x659B, - 0xB1D9: 0x65AC, - 0xB1DA: 0x65CF, - 0xB1DB: 0x65CB, - 0xB1DC: 0x65CC, - 0xB1DD: 0x65CE, - 0xB1DE: 0x665D, - 0xB1DF: 0x665A, - 0xB1E0: 0x6664, - 0xB1E1: 0x6668, - 0xB1E2: 0x6666, - 0xB1E3: 0x665E, - 0xB1E4: 0x66F9, - 0xB1E5: 0x52D7, - 0xB1E6: 0x671B, - 0xB1E7: 0x6881, - 0xB1E8: 0x68AF, - 0xB1E9: 0x68A2, - 0xB1EA: 0x6893, - 0xB1EB: 0x68B5, - 0xB1EC: 0x687F, - 0xB1ED: 0x6876, - 0xB1EE: 0x68B1, - 0xB1EF: 0x68A7, - 0xB1F0: 0x6897, - 0xB1F1: 0x68B0, - 0xB1F2: 0x6883, - 0xB1F3: 0x68C4, - 0xB1F4: 0x68AD, - 0xB1F5: 0x6886, - 0xB1F6: 0x6885, - 0xB1F7: 0x6894, - 0xB1F8: 0x689D, - 0xB1F9: 0x68A8, - 0xB1FA: 0x689F, - 0xB1FB: 0x68A1, - 0xB1FC: 0x6882, - 0xB1FD: 0x6B32, - 0xB1FE: 0x6BBA, - 0xB240: 0x6BEB, - 0xB241: 0x6BEC, - 0xB242: 0x6C2B, - 0xB243: 0x6D8E, - 0xB244: 0x6DBC, - 0xB245: 0x6DF3, - 0xB246: 0x6DD9, - 0xB247: 0x6DB2, - 0xB248: 0x6DE1, - 0xB249: 0x6DCC, - 0xB24A: 0x6DE4, - 0xB24B: 0x6DFB, - 0xB24C: 0x6DFA, - 0xB24D: 0x6E05, - 0xB24E: 0x6DC7, - 0xB24F: 0x6DCB, - 0xB250: 0x6DAF, - 0xB251: 0x6DD1, - 0xB252: 0x6DAE, - 0xB253: 0x6DDE, - 0xB254: 0x6DF9, - 0xB255: 0x6DB8, - 0xB256: 0x6DF7, - 0xB257: 0x6DF5, - 0xB258: 0x6DC5, - 0xB259: 0x6DD2, - 0xB25A: 0x6E1A, - 0xB25B: 0x6DB5, - 0xB25C: 0x6DDA, - 0xB25D: 0x6DEB, - 0xB25E: 0x6DD8, - 0xB25F: 0x6DEA, - 0xB260: 0x6DF1, - 0xB261: 0x6DEE, - 0xB262: 0x6DE8, - 0xB263: 0x6DC6, - 0xB264: 0x6DC4, - 0xB265: 0x6DAA, - 0xB266: 0x6DEC, - 0xB267: 0x6DBF, - 0xB268: 0x6DE6, - 0xB269: 0x70F9, - 0xB26A: 0x7109, - 0xB26B: 0x710A, - 0xB26C: 0x70FD, - 0xB26D: 0x70EF, - 0xB26E: 0x723D, - 0xB26F: 0x727D, - 0xB270: 0x7281, - 0xB271: 0x731C, - 0xB272: 0x731B, - 0xB273: 0x7316, - 0xB274: 0x7313, - 0xB275: 0x7319, - 0xB276: 0x7387, - 0xB277: 0x7405, - 0xB278: 0x740A, - 0xB279: 0x7403, - 0xB27A: 0x7406, - 0xB27B: 0x73FE, - 0xB27C: 0x740D, - 0xB27D: 0x74E0, - 0xB27E: 0x74F6, - 0xB2A1: 0x74F7, - 0xB2A2: 0x751C, - 0xB2A3: 0x7522, - 0xB2A4: 0x7565, - 0xB2A5: 0x7566, - 0xB2A6: 0x7562, - 0xB2A7: 0x7570, - 0xB2A8: 0x758F, - 0xB2A9: 0x75D4, - 0xB2AA: 0x75D5, - 0xB2AB: 0x75B5, - 0xB2AC: 0x75CA, - 0xB2AD: 0x75CD, - 0xB2AE: 0x768E, - 0xB2AF: 0x76D4, - 0xB2B0: 0x76D2, - 0xB2B1: 0x76DB, - 0xB2B2: 0x7737, - 0xB2B3: 0x773E, - 0xB2B4: 0x773C, - 0xB2B5: 0x7736, - 0xB2B6: 0x7738, - 0xB2B7: 0x773A, - 0xB2B8: 0x786B, - 0xB2B9: 0x7843, - 0xB2BA: 0x784E, - 0xB2BB: 0x7965, - 0xB2BC: 0x7968, - 0xB2BD: 0x796D, - 0xB2BE: 0x79FB, - 0xB2BF: 0x7A92, - 0xB2C0: 0x7A95, - 0xB2C1: 0x7B20, - 0xB2C2: 0x7B28, - 0xB2C3: 0x7B1B, - 0xB2C4: 0x7B2C, - 0xB2C5: 0x7B26, - 0xB2C6: 0x7B19, - 0xB2C7: 0x7B1E, - 0xB2C8: 0x7B2E, - 0xB2C9: 0x7C92, - 0xB2CA: 0x7C97, - 0xB2CB: 0x7C95, - 0xB2CC: 0x7D46, - 0xB2CD: 0x7D43, - 0xB2CE: 0x7D71, - 0xB2CF: 0x7D2E, - 0xB2D0: 0x7D39, - 0xB2D1: 0x7D3C, - 0xB2D2: 0x7D40, - 0xB2D3: 0x7D30, - 0xB2D4: 0x7D33, - 0xB2D5: 0x7D44, - 0xB2D6: 0x7D2F, - 0xB2D7: 0x7D42, - 0xB2D8: 0x7D32, - 0xB2D9: 0x7D31, - 0xB2DA: 0x7F3D, - 0xB2DB: 0x7F9E, - 0xB2DC: 0x7F9A, - 0xB2DD: 0x7FCC, - 0xB2DE: 0x7FCE, - 0xB2DF: 0x7FD2, - 0xB2E0: 0x801C, - 0xB2E1: 0x804A, - 0xB2E2: 0x8046, - 0xB2E3: 0x812F, - 0xB2E4: 0x8116, - 0xB2E5: 0x8123, - 0xB2E6: 0x812B, - 0xB2E7: 0x8129, - 0xB2E8: 0x8130, - 0xB2E9: 0x8124, - 0xB2EA: 0x8202, - 0xB2EB: 0x8235, - 0xB2EC: 0x8237, - 0xB2ED: 0x8236, - 0xB2EE: 0x8239, - 0xB2EF: 0x838E, - 0xB2F0: 0x839E, - 0xB2F1: 0x8398, - 0xB2F2: 0x8378, - 0xB2F3: 0x83A2, - 0xB2F4: 0x8396, - 0xB2F5: 0x83BD, - 0xB2F6: 0x83AB, - 0xB2F7: 0x8392, - 0xB2F8: 0x838A, - 0xB2F9: 0x8393, - 0xB2FA: 0x8389, - 0xB2FB: 0x83A0, - 0xB2FC: 0x8377, - 0xB2FD: 0x837B, - 0xB2FE: 0x837C, - 0xB340: 0x8386, - 0xB341: 0x83A7, - 0xB342: 0x8655, - 0xB343: 0x5F6A, - 0xB344: 0x86C7, - 0xB345: 0x86C0, - 0xB346: 0x86B6, - 0xB347: 0x86C4, - 0xB348: 0x86B5, - 0xB349: 0x86C6, - 0xB34A: 0x86CB, - 0xB34B: 0x86B1, - 0xB34C: 0x86AF, - 0xB34D: 0x86C9, - 0xB34E: 0x8853, - 0xB34F: 0x889E, - 0xB350: 0x8888, - 0xB351: 0x88AB, - 0xB352: 0x8892, - 0xB353: 0x8896, - 0xB354: 0x888D, - 0xB355: 0x888B, - 0xB356: 0x8993, - 0xB357: 0x898F, - 0xB358: 0x8A2A, - 0xB359: 0x8A1D, - 0xB35A: 0x8A23, - 0xB35B: 0x8A25, - 0xB35C: 0x8A31, - 0xB35D: 0x8A2D, - 0xB35E: 0x8A1F, - 0xB35F: 0x8A1B, - 0xB360: 0x8A22, - 0xB361: 0x8C49, - 0xB362: 0x8C5A, - 0xB363: 0x8CA9, - 0xB364: 0x8CAC, - 0xB365: 0x8CAB, - 0xB366: 0x8CA8, - 0xB367: 0x8CAA, - 0xB368: 0x8CA7, - 0xB369: 0x8D67, - 0xB36A: 0x8D66, - 0xB36B: 0x8DBE, - 0xB36C: 0x8DBA, - 0xB36D: 0x8EDB, - 0xB36E: 0x8EDF, - 0xB36F: 0x9019, - 0xB370: 0x900D, - 0xB371: 0x901A, - 0xB372: 0x9017, - 0xB373: 0x9023, - 0xB374: 0x901F, - 0xB375: 0x901D, - 0xB376: 0x9010, - 0xB377: 0x9015, - 0xB378: 0x901E, - 0xB379: 0x9020, - 0xB37A: 0x900F, - 0xB37B: 0x9022, - 0xB37C: 0x9016, - 0xB37D: 0x901B, - 0xB37E: 0x9014, - 0xB3A1: 0x90E8, - 0xB3A2: 0x90ED, - 0xB3A3: 0x90FD, - 0xB3A4: 0x9157, - 0xB3A5: 0x91CE, - 0xB3A6: 0x91F5, - 0xB3A7: 0x91E6, - 0xB3A8: 0x91E3, - 0xB3A9: 0x91E7, - 0xB3AA: 0x91ED, - 0xB3AB: 0x91E9, - 0xB3AC: 0x9589, - 0xB3AD: 0x966A, - 0xB3AE: 0x9675, - 0xB3AF: 0x9673, - 0xB3B0: 0x9678, - 0xB3B1: 0x9670, - 0xB3B2: 0x9674, - 0xB3B3: 0x9676, - 0xB3B4: 0x9677, - 0xB3B5: 0x966C, - 0xB3B6: 0x96C0, - 0xB3B7: 0x96EA, - 0xB3B8: 0x96E9, - 0xB3B9: 0x7AE0, - 0xB3BA: 0x7ADF, - 0xB3BB: 0x9802, - 0xB3BC: 0x9803, - 0xB3BD: 0x9B5A, - 0xB3BE: 0x9CE5, - 0xB3BF: 0x9E75, - 0xB3C0: 0x9E7F, - 0xB3C1: 0x9EA5, - 0xB3C2: 0x9EBB, - 0xB3C3: 0x50A2, - 0xB3C4: 0x508D, - 0xB3C5: 0x5085, - 0xB3C6: 0x5099, - 0xB3C7: 0x5091, - 0xB3C8: 0x5080, - 0xB3C9: 0x5096, - 0xB3CA: 0x5098, - 0xB3CB: 0x509A, - 0xB3CC: 0x6700, - 0xB3CD: 0x51F1, - 0xB3CE: 0x5272, - 0xB3CF: 0x5274, - 0xB3D0: 0x5275, - 0xB3D1: 0x5269, - 0xB3D2: 0x52DE, - 0xB3D3: 0x52DD, - 0xB3D4: 0x52DB, - 0xB3D5: 0x535A, - 0xB3D6: 0x53A5, - 0xB3D7: 0x557B, - 0xB3D8: 0x5580, - 0xB3D9: 0x55A7, - 0xB3DA: 0x557C, - 0xB3DB: 0x558A, - 0xB3DC: 0x559D, - 0xB3DD: 0x5598, - 0xB3DE: 0x5582, - 0xB3DF: 0x559C, - 0xB3E0: 0x55AA, - 0xB3E1: 0x5594, - 0xB3E2: 0x5587, - 0xB3E3: 0x558B, - 0xB3E4: 0x5583, - 0xB3E5: 0x55B3, - 0xB3E6: 0x55AE, - 0xB3E7: 0x559F, - 0xB3E8: 0x553E, - 0xB3E9: 0x55B2, - 0xB3EA: 0x559A, - 0xB3EB: 0x55BB, - 0xB3EC: 0x55AC, - 0xB3ED: 0x55B1, - 0xB3EE: 0x557E, - 0xB3EF: 0x5589, - 0xB3F0: 0x55AB, - 0xB3F1: 0x5599, - 0xB3F2: 0x570D, - 0xB3F3: 0x582F, - 0xB3F4: 0x582A, - 0xB3F5: 0x5834, - 0xB3F6: 0x5824, - 0xB3F7: 0x5830, - 0xB3F8: 0x5831, - 0xB3F9: 0x5821, - 0xB3FA: 0x581D, - 0xB3FB: 0x5820, - 0xB3FC: 0x58F9, - 0xB3FD: 0x58FA, - 0xB3FE: 0x5960, - 0xB440: 0x5A77, - 0xB441: 0x5A9A, - 0xB442: 0x5A7F, - 0xB443: 0x5A92, - 0xB444: 0x5A9B, - 0xB445: 0x5AA7, - 0xB446: 0x5B73, - 0xB447: 0x5B71, - 0xB448: 0x5BD2, - 0xB449: 0x5BCC, - 0xB44A: 0x5BD3, - 0xB44B: 0x5BD0, - 0xB44C: 0x5C0A, - 0xB44D: 0x5C0B, - 0xB44E: 0x5C31, - 0xB44F: 0x5D4C, - 0xB450: 0x5D50, - 0xB451: 0x5D34, - 0xB452: 0x5D47, - 0xB453: 0x5DFD, - 0xB454: 0x5E45, - 0xB455: 0x5E3D, - 0xB456: 0x5E40, - 0xB457: 0x5E43, - 0xB458: 0x5E7E, - 0xB459: 0x5ECA, - 0xB45A: 0x5EC1, - 0xB45B: 0x5EC2, - 0xB45C: 0x5EC4, - 0xB45D: 0x5F3C, - 0xB45E: 0x5F6D, - 0xB45F: 0x5FA9, - 0xB460: 0x5FAA, - 0xB461: 0x5FA8, - 0xB462: 0x60D1, - 0xB463: 0x60E1, - 0xB464: 0x60B2, - 0xB465: 0x60B6, - 0xB466: 0x60E0, - 0xB467: 0x611C, - 0xB468: 0x6123, - 0xB469: 0x60FA, - 0xB46A: 0x6115, - 0xB46B: 0x60F0, - 0xB46C: 0x60FB, - 0xB46D: 0x60F4, - 0xB46E: 0x6168, - 0xB46F: 0x60F1, - 0xB470: 0x610E, - 0xB471: 0x60F6, - 0xB472: 0x6109, - 0xB473: 0x6100, - 0xB474: 0x6112, - 0xB475: 0x621F, - 0xB476: 0x6249, - 0xB477: 0x63A3, - 0xB478: 0x638C, - 0xB479: 0x63CF, - 0xB47A: 0x63C0, - 0xB47B: 0x63E9, - 0xB47C: 0x63C9, - 0xB47D: 0x63C6, - 0xB47E: 0x63CD, - 0xB4A1: 0x63D2, - 0xB4A2: 0x63E3, - 0xB4A3: 0x63D0, - 0xB4A4: 0x63E1, - 0xB4A5: 0x63D6, - 0xB4A6: 0x63ED, - 0xB4A7: 0x63EE, - 0xB4A8: 0x6376, - 0xB4A9: 0x63F4, - 0xB4AA: 0x63EA, - 0xB4AB: 0x63DB, - 0xB4AC: 0x6452, - 0xB4AD: 0x63DA, - 0xB4AE: 0x63F9, - 0xB4AF: 0x655E, - 0xB4B0: 0x6566, - 0xB4B1: 0x6562, - 0xB4B2: 0x6563, - 0xB4B3: 0x6591, - 0xB4B4: 0x6590, - 0xB4B5: 0x65AF, - 0xB4B6: 0x666E, - 0xB4B7: 0x6670, - 0xB4B8: 0x6674, - 0xB4B9: 0x6676, - 0xB4BA: 0x666F, - 0xB4BB: 0x6691, - 0xB4BC: 0x667A, - 0xB4BD: 0x667E, - 0xB4BE: 0x6677, - 0xB4BF: 0x66FE, - 0xB4C0: 0x66FF, - 0xB4C1: 0x671F, - 0xB4C2: 0x671D, - 0xB4C3: 0x68FA, - 0xB4C4: 0x68D5, - 0xB4C5: 0x68E0, - 0xB4C6: 0x68D8, - 0xB4C7: 0x68D7, - 0xB4C8: 0x6905, - 0xB4C9: 0x68DF, - 0xB4CA: 0x68F5, - 0xB4CB: 0x68EE, - 0xB4CC: 0x68E7, - 0xB4CD: 0x68F9, - 0xB4CE: 0x68D2, - 0xB4CF: 0x68F2, - 0xB4D0: 0x68E3, - 0xB4D1: 0x68CB, - 0xB4D2: 0x68CD, - 0xB4D3: 0x690D, - 0xB4D4: 0x6912, - 0xB4D5: 0x690E, - 0xB4D6: 0x68C9, - 0xB4D7: 0x68DA, - 0xB4D8: 0x696E, - 0xB4D9: 0x68FB, - 0xB4DA: 0x6B3E, - 0xB4DB: 0x6B3A, - 0xB4DC: 0x6B3D, - 0xB4DD: 0x6B98, - 0xB4DE: 0x6B96, - 0xB4DF: 0x6BBC, - 0xB4E0: 0x6BEF, - 0xB4E1: 0x6C2E, - 0xB4E2: 0x6C2F, - 0xB4E3: 0x6C2C, - 0xB4E4: 0x6E2F, - 0xB4E5: 0x6E38, - 0xB4E6: 0x6E54, - 0xB4E7: 0x6E21, - 0xB4E8: 0x6E32, - 0xB4E9: 0x6E67, - 0xB4EA: 0x6E4A, - 0xB4EB: 0x6E20, - 0xB4EC: 0x6E25, - 0xB4ED: 0x6E23, - 0xB4EE: 0x6E1B, - 0xB4EF: 0x6E5B, - 0xB4F0: 0x6E58, - 0xB4F1: 0x6E24, - 0xB4F2: 0x6E56, - 0xB4F3: 0x6E6E, - 0xB4F4: 0x6E2D, - 0xB4F5: 0x6E26, - 0xB4F6: 0x6E6F, - 0xB4F7: 0x6E34, - 0xB4F8: 0x6E4D, - 0xB4F9: 0x6E3A, - 0xB4FA: 0x6E2C, - 0xB4FB: 0x6E43, - 0xB4FC: 0x6E1D, - 0xB4FD: 0x6E3E, - 0xB4FE: 0x6ECB, - 0xB540: 0x6E89, - 0xB541: 0x6E19, - 0xB542: 0x6E4E, - 0xB543: 0x6E63, - 0xB544: 0x6E44, - 0xB545: 0x6E72, - 0xB546: 0x6E69, - 0xB547: 0x6E5F, - 0xB548: 0x7119, - 0xB549: 0x711A, - 0xB54A: 0x7126, - 0xB54B: 0x7130, - 0xB54C: 0x7121, - 0xB54D: 0x7136, - 0xB54E: 0x716E, - 0xB54F: 0x711C, - 0xB550: 0x724C, - 0xB551: 0x7284, - 0xB552: 0x7280, - 0xB553: 0x7336, - 0xB554: 0x7325, - 0xB555: 0x7334, - 0xB556: 0x7329, - 0xB557: 0x743A, - 0xB558: 0x742A, - 0xB559: 0x7433, - 0xB55A: 0x7422, - 0xB55B: 0x7425, - 0xB55C: 0x7435, - 0xB55D: 0x7436, - 0xB55E: 0x7434, - 0xB55F: 0x742F, - 0xB560: 0x741B, - 0xB561: 0x7426, - 0xB562: 0x7428, - 0xB563: 0x7525, - 0xB564: 0x7526, - 0xB565: 0x756B, - 0xB566: 0x756A, - 0xB567: 0x75E2, - 0xB568: 0x75DB, - 0xB569: 0x75E3, - 0xB56A: 0x75D9, - 0xB56B: 0x75D8, - 0xB56C: 0x75DE, - 0xB56D: 0x75E0, - 0xB56E: 0x767B, - 0xB56F: 0x767C, - 0xB570: 0x7696, - 0xB571: 0x7693, - 0xB572: 0x76B4, - 0xB573: 0x76DC, - 0xB574: 0x774F, - 0xB575: 0x77ED, - 0xB576: 0x785D, - 0xB577: 0x786C, - 0xB578: 0x786F, - 0xB579: 0x7A0D, - 0xB57A: 0x7A08, - 0xB57B: 0x7A0B, - 0xB57C: 0x7A05, - 0xB57D: 0x7A00, - 0xB57E: 0x7A98, - 0xB5A1: 0x7A97, - 0xB5A2: 0x7A96, - 0xB5A3: 0x7AE5, - 0xB5A4: 0x7AE3, - 0xB5A5: 0x7B49, - 0xB5A6: 0x7B56, - 0xB5A7: 0x7B46, - 0xB5A8: 0x7B50, - 0xB5A9: 0x7B52, - 0xB5AA: 0x7B54, - 0xB5AB: 0x7B4D, - 0xB5AC: 0x7B4B, - 0xB5AD: 0x7B4F, - 0xB5AE: 0x7B51, - 0xB5AF: 0x7C9F, - 0xB5B0: 0x7CA5, - 0xB5B1: 0x7D5E, - 0xB5B2: 0x7D50, - 0xB5B3: 0x7D68, - 0xB5B4: 0x7D55, - 0xB5B5: 0x7D2B, - 0xB5B6: 0x7D6E, - 0xB5B7: 0x7D72, - 0xB5B8: 0x7D61, - 0xB5B9: 0x7D66, - 0xB5BA: 0x7D62, - 0xB5BB: 0x7D70, - 0xB5BC: 0x7D73, - 0xB5BD: 0x5584, - 0xB5BE: 0x7FD4, - 0xB5BF: 0x7FD5, - 0xB5C0: 0x800B, - 0xB5C1: 0x8052, - 0xB5C2: 0x8085, - 0xB5C3: 0x8155, - 0xB5C4: 0x8154, - 0xB5C5: 0x814B, - 0xB5C6: 0x8151, - 0xB5C7: 0x814E, - 0xB5C8: 0x8139, - 0xB5C9: 0x8146, - 0xB5CA: 0x813E, - 0xB5CB: 0x814C, - 0xB5CC: 0x8153, - 0xB5CD: 0x8174, - 0xB5CE: 0x8212, - 0xB5CF: 0x821C, - 0xB5D0: 0x83E9, - 0xB5D1: 0x8403, - 0xB5D2: 0x83F8, - 0xB5D3: 0x840D, - 0xB5D4: 0x83E0, - 0xB5D5: 0x83C5, - 0xB5D6: 0x840B, - 0xB5D7: 0x83C1, - 0xB5D8: 0x83EF, - 0xB5D9: 0x83F1, - 0xB5DA: 0x83F4, - 0xB5DB: 0x8457, - 0xB5DC: 0x840A, - 0xB5DD: 0x83F0, - 0xB5DE: 0x840C, - 0xB5DF: 0x83CC, - 0xB5E0: 0x83FD, - 0xB5E1: 0x83F2, - 0xB5E2: 0x83CA, - 0xB5E3: 0x8438, - 0xB5E4: 0x840E, - 0xB5E5: 0x8404, - 0xB5E6: 0x83DC, - 0xB5E7: 0x8407, - 0xB5E8: 0x83D4, - 0xB5E9: 0x83DF, - 0xB5EA: 0x865B, - 0xB5EB: 0x86DF, - 0xB5EC: 0x86D9, - 0xB5ED: 0x86ED, - 0xB5EE: 0x86D4, - 0xB5EF: 0x86DB, - 0xB5F0: 0x86E4, - 0xB5F1: 0x86D0, - 0xB5F2: 0x86DE, - 0xB5F3: 0x8857, - 0xB5F4: 0x88C1, - 0xB5F5: 0x88C2, - 0xB5F6: 0x88B1, - 0xB5F7: 0x8983, - 0xB5F8: 0x8996, - 0xB5F9: 0x8A3B, - 0xB5FA: 0x8A60, - 0xB5FB: 0x8A55, - 0xB5FC: 0x8A5E, - 0xB5FD: 0x8A3C, - 0xB5FE: 0x8A41, - 0xB640: 0x8A54, - 0xB641: 0x8A5B, - 0xB642: 0x8A50, - 0xB643: 0x8A46, - 0xB644: 0x8A34, - 0xB645: 0x8A3A, - 0xB646: 0x8A36, - 0xB647: 0x8A56, - 0xB648: 0x8C61, - 0xB649: 0x8C82, - 0xB64A: 0x8CAF, - 0xB64B: 0x8CBC, - 0xB64C: 0x8CB3, - 0xB64D: 0x8CBD, - 0xB64E: 0x8CC1, - 0xB64F: 0x8CBB, - 0xB650: 0x8CC0, - 0xB651: 0x8CB4, - 0xB652: 0x8CB7, - 0xB653: 0x8CB6, - 0xB654: 0x8CBF, - 0xB655: 0x8CB8, - 0xB656: 0x8D8A, - 0xB657: 0x8D85, - 0xB658: 0x8D81, - 0xB659: 0x8DCE, - 0xB65A: 0x8DDD, - 0xB65B: 0x8DCB, - 0xB65C: 0x8DDA, - 0xB65D: 0x8DD1, - 0xB65E: 0x8DCC, - 0xB65F: 0x8DDB, - 0xB660: 0x8DC6, - 0xB661: 0x8EFB, - 0xB662: 0x8EF8, - 0xB663: 0x8EFC, - 0xB664: 0x8F9C, - 0xB665: 0x902E, - 0xB666: 0x9035, - 0xB667: 0x9031, - 0xB668: 0x9038, - 0xB669: 0x9032, - 0xB66A: 0x9036, - 0xB66B: 0x9102, - 0xB66C: 0x90F5, - 0xB66D: 0x9109, - 0xB66E: 0x90FE, - 0xB66F: 0x9163, - 0xB670: 0x9165, - 0xB671: 0x91CF, - 0xB672: 0x9214, - 0xB673: 0x9215, - 0xB674: 0x9223, - 0xB675: 0x9209, - 0xB676: 0x921E, - 0xB677: 0x920D, - 0xB678: 0x9210, - 0xB679: 0x9207, - 0xB67A: 0x9211, - 0xB67B: 0x9594, - 0xB67C: 0x958F, - 0xB67D: 0x958B, - 0xB67E: 0x9591, - 0xB6A1: 0x9593, - 0xB6A2: 0x9592, - 0xB6A3: 0x958E, - 0xB6A4: 0x968A, - 0xB6A5: 0x968E, - 0xB6A6: 0x968B, - 0xB6A7: 0x967D, - 0xB6A8: 0x9685, - 0xB6A9: 0x9686, - 0xB6AA: 0x968D, - 0xB6AB: 0x9672, - 0xB6AC: 0x9684, - 0xB6AD: 0x96C1, - 0xB6AE: 0x96C5, - 0xB6AF: 0x96C4, - 0xB6B0: 0x96C6, - 0xB6B1: 0x96C7, - 0xB6B2: 0x96EF, - 0xB6B3: 0x96F2, - 0xB6B4: 0x97CC, - 0xB6B5: 0x9805, - 0xB6B6: 0x9806, - 0xB6B7: 0x9808, - 0xB6B8: 0x98E7, - 0xB6B9: 0x98EA, - 0xB6BA: 0x98EF, - 0xB6BB: 0x98E9, - 0xB6BC: 0x98F2, - 0xB6BD: 0x98ED, - 0xB6BE: 0x99AE, - 0xB6BF: 0x99AD, - 0xB6C0: 0x9EC3, - 0xB6C1: 0x9ECD, - 0xB6C2: 0x9ED1, - 0xB6C3: 0x4E82, - 0xB6C4: 0x50AD, - 0xB6C5: 0x50B5, - 0xB6C6: 0x50B2, - 0xB6C7: 0x50B3, - 0xB6C8: 0x50C5, - 0xB6C9: 0x50BE, - 0xB6CA: 0x50AC, - 0xB6CB: 0x50B7, - 0xB6CC: 0x50BB, - 0xB6CD: 0x50AF, - 0xB6CE: 0x50C7, - 0xB6CF: 0x527F, - 0xB6D0: 0x5277, - 0xB6D1: 0x527D, - 0xB6D2: 0x52DF, - 0xB6D3: 0x52E6, - 0xB6D4: 0x52E4, - 0xB6D5: 0x52E2, - 0xB6D6: 0x52E3, - 0xB6D7: 0x532F, - 0xB6D8: 0x55DF, - 0xB6D9: 0x55E8, - 0xB6DA: 0x55D3, - 0xB6DB: 0x55E6, - 0xB6DC: 0x55CE, - 0xB6DD: 0x55DC, - 0xB6DE: 0x55C7, - 0xB6DF: 0x55D1, - 0xB6E0: 0x55E3, - 0xB6E1: 0x55E4, - 0xB6E2: 0x55EF, - 0xB6E3: 0x55DA, - 0xB6E4: 0x55E1, - 0xB6E5: 0x55C5, - 0xB6E6: 0x55C6, - 0xB6E7: 0x55E5, - 0xB6E8: 0x55C9, - 0xB6E9: 0x5712, - 0xB6EA: 0x5713, - 0xB6EB: 0x585E, - 0xB6EC: 0x5851, - 0xB6ED: 0x5858, - 0xB6EE: 0x5857, - 0xB6EF: 0x585A, - 0xB6F0: 0x5854, - 0xB6F1: 0x586B, - 0xB6F2: 0x584C, - 0xB6F3: 0x586D, - 0xB6F4: 0x584A, - 0xB6F5: 0x5862, - 0xB6F6: 0x5852, - 0xB6F7: 0x584B, - 0xB6F8: 0x5967, - 0xB6F9: 0x5AC1, - 0xB6FA: 0x5AC9, - 0xB6FB: 0x5ACC, - 0xB6FC: 0x5ABE, - 0xB6FD: 0x5ABD, - 0xB6FE: 0x5ABC, - 0xB740: 0x5AB3, - 0xB741: 0x5AC2, - 0xB742: 0x5AB2, - 0xB743: 0x5D69, - 0xB744: 0x5D6F, - 0xB745: 0x5E4C, - 0xB746: 0x5E79, - 0xB747: 0x5EC9, - 0xB748: 0x5EC8, - 0xB749: 0x5F12, - 0xB74A: 0x5F59, - 0xB74B: 0x5FAC, - 0xB74C: 0x5FAE, - 0xB74D: 0x611A, - 0xB74E: 0x610F, - 0xB74F: 0x6148, - 0xB750: 0x611F, - 0xB751: 0x60F3, - 0xB752: 0x611B, - 0xB753: 0x60F9, - 0xB754: 0x6101, - 0xB755: 0x6108, - 0xB756: 0x614E, - 0xB757: 0x614C, - 0xB758: 0x6144, - 0xB759: 0x614D, - 0xB75A: 0x613E, - 0xB75B: 0x6134, - 0xB75C: 0x6127, - 0xB75D: 0x610D, - 0xB75E: 0x6106, - 0xB75F: 0x6137, - 0xB760: 0x6221, - 0xB761: 0x6222, - 0xB762: 0x6413, - 0xB763: 0x643E, - 0xB764: 0x641E, - 0xB765: 0x642A, - 0xB766: 0x642D, - 0xB767: 0x643D, - 0xB768: 0x642C, - 0xB769: 0x640F, - 0xB76A: 0x641C, - 0xB76B: 0x6414, - 0xB76C: 0x640D, - 0xB76D: 0x6436, - 0xB76E: 0x6416, - 0xB76F: 0x6417, - 0xB770: 0x6406, - 0xB771: 0x656C, - 0xB772: 0x659F, - 0xB773: 0x65B0, - 0xB774: 0x6697, - 0xB775: 0x6689, - 0xB776: 0x6687, - 0xB777: 0x6688, - 0xB778: 0x6696, - 0xB779: 0x6684, - 0xB77A: 0x6698, - 0xB77B: 0x668D, - 0xB77C: 0x6703, - 0xB77D: 0x6994, - 0xB77E: 0x696D, - 0xB7A1: 0x695A, - 0xB7A2: 0x6977, - 0xB7A3: 0x6960, - 0xB7A4: 0x6954, - 0xB7A5: 0x6975, - 0xB7A6: 0x6930, - 0xB7A7: 0x6982, - 0xB7A8: 0x694A, - 0xB7A9: 0x6968, - 0xB7AA: 0x696B, - 0xB7AB: 0x695E, - 0xB7AC: 0x6953, - 0xB7AD: 0x6979, - 0xB7AE: 0x6986, - 0xB7AF: 0x695D, - 0xB7B0: 0x6963, - 0xB7B1: 0x695B, - 0xB7B2: 0x6B47, - 0xB7B3: 0x6B72, - 0xB7B4: 0x6BC0, - 0xB7B5: 0x6BBF, - 0xB7B6: 0x6BD3, - 0xB7B7: 0x6BFD, - 0xB7B8: 0x6EA2, - 0xB7B9: 0x6EAF, - 0xB7BA: 0x6ED3, - 0xB7BB: 0x6EB6, - 0xB7BC: 0x6EC2, - 0xB7BD: 0x6E90, - 0xB7BE: 0x6E9D, - 0xB7BF: 0x6EC7, - 0xB7C0: 0x6EC5, - 0xB7C1: 0x6EA5, - 0xB7C2: 0x6E98, - 0xB7C3: 0x6EBC, - 0xB7C4: 0x6EBA, - 0xB7C5: 0x6EAB, - 0xB7C6: 0x6ED1, - 0xB7C7: 0x6E96, - 0xB7C8: 0x6E9C, - 0xB7C9: 0x6EC4, - 0xB7CA: 0x6ED4, - 0xB7CB: 0x6EAA, - 0xB7CC: 0x6EA7, - 0xB7CD: 0x6EB4, - 0xB7CE: 0x714E, - 0xB7CF: 0x7159, - 0xB7D0: 0x7169, - 0xB7D1: 0x7164, - 0xB7D2: 0x7149, - 0xB7D3: 0x7167, - 0xB7D4: 0x715C, - 0xB7D5: 0x716C, - 0xB7D6: 0x7166, - 0xB7D7: 0x714C, - 0xB7D8: 0x7165, - 0xB7D9: 0x715E, - 0xB7DA: 0x7146, - 0xB7DB: 0x7168, - 0xB7DC: 0x7156, - 0xB7DD: 0x723A, - 0xB7DE: 0x7252, - 0xB7DF: 0x7337, - 0xB7E0: 0x7345, - 0xB7E1: 0x733F, - 0xB7E2: 0x733E, - 0xB7E3: 0x746F, - 0xB7E4: 0x745A, - 0xB7E5: 0x7455, - 0xB7E6: 0x745F, - 0xB7E7: 0x745E, - 0xB7E8: 0x7441, - 0xB7E9: 0x743F, - 0xB7EA: 0x7459, - 0xB7EB: 0x745B, - 0xB7EC: 0x745C, - 0xB7ED: 0x7576, - 0xB7EE: 0x7578, - 0xB7EF: 0x7600, - 0xB7F0: 0x75F0, - 0xB7F1: 0x7601, - 0xB7F2: 0x75F2, - 0xB7F3: 0x75F1, - 0xB7F4: 0x75FA, - 0xB7F5: 0x75FF, - 0xB7F6: 0x75F4, - 0xB7F7: 0x75F3, - 0xB7F8: 0x76DE, - 0xB7F9: 0x76DF, - 0xB7FA: 0x775B, - 0xB7FB: 0x776B, - 0xB7FC: 0x7766, - 0xB7FD: 0x775E, - 0xB7FE: 0x7763, - 0xB840: 0x7779, - 0xB841: 0x776A, - 0xB842: 0x776C, - 0xB843: 0x775C, - 0xB844: 0x7765, - 0xB845: 0x7768, - 0xB846: 0x7762, - 0xB847: 0x77EE, - 0xB848: 0x788E, - 0xB849: 0x78B0, - 0xB84A: 0x7897, - 0xB84B: 0x7898, - 0xB84C: 0x788C, - 0xB84D: 0x7889, - 0xB84E: 0x787C, - 0xB84F: 0x7891, - 0xB850: 0x7893, - 0xB851: 0x787F, - 0xB852: 0x797A, - 0xB853: 0x797F, - 0xB854: 0x7981, - 0xB855: 0x842C, - 0xB856: 0x79BD, - 0xB857: 0x7A1C, - 0xB858: 0x7A1A, - 0xB859: 0x7A20, - 0xB85A: 0x7A14, - 0xB85B: 0x7A1F, - 0xB85C: 0x7A1E, - 0xB85D: 0x7A9F, - 0xB85E: 0x7AA0, - 0xB85F: 0x7B77, - 0xB860: 0x7BC0, - 0xB861: 0x7B60, - 0xB862: 0x7B6E, - 0xB863: 0x7B67, - 0xB864: 0x7CB1, - 0xB865: 0x7CB3, - 0xB866: 0x7CB5, - 0xB867: 0x7D93, - 0xB868: 0x7D79, - 0xB869: 0x7D91, - 0xB86A: 0x7D81, - 0xB86B: 0x7D8F, - 0xB86C: 0x7D5B, - 0xB86D: 0x7F6E, - 0xB86E: 0x7F69, - 0xB86F: 0x7F6A, - 0xB870: 0x7F72, - 0xB871: 0x7FA9, - 0xB872: 0x7FA8, - 0xB873: 0x7FA4, - 0xB874: 0x8056, - 0xB875: 0x8058, - 0xB876: 0x8086, - 0xB877: 0x8084, - 0xB878: 0x8171, - 0xB879: 0x8170, - 0xB87A: 0x8178, - 0xB87B: 0x8165, - 0xB87C: 0x816E, - 0xB87D: 0x8173, - 0xB87E: 0x816B, - 0xB8A1: 0x8179, - 0xB8A2: 0x817A, - 0xB8A3: 0x8166, - 0xB8A4: 0x8205, - 0xB8A5: 0x8247, - 0xB8A6: 0x8482, - 0xB8A7: 0x8477, - 0xB8A8: 0x843D, - 0xB8A9: 0x8431, - 0xB8AA: 0x8475, - 0xB8AB: 0x8466, - 0xB8AC: 0x846B, - 0xB8AD: 0x8449, - 0xB8AE: 0x846C, - 0xB8AF: 0x845B, - 0xB8B0: 0x843C, - 0xB8B1: 0x8435, - 0xB8B2: 0x8461, - 0xB8B3: 0x8463, - 0xB8B4: 0x8469, - 0xB8B5: 0x846D, - 0xB8B6: 0x8446, - 0xB8B7: 0x865E, - 0xB8B8: 0x865C, - 0xB8B9: 0x865F, - 0xB8BA: 0x86F9, - 0xB8BB: 0x8713, - 0xB8BC: 0x8708, - 0xB8BD: 0x8707, - 0xB8BE: 0x8700, - 0xB8BF: 0x86FE, - 0xB8C0: 0x86FB, - 0xB8C1: 0x8702, - 0xB8C2: 0x8703, - 0xB8C3: 0x8706, - 0xB8C4: 0x870A, - 0xB8C5: 0x8859, - 0xB8C6: 0x88DF, - 0xB8C7: 0x88D4, - 0xB8C8: 0x88D9, - 0xB8C9: 0x88DC, - 0xB8CA: 0x88D8, - 0xB8CB: 0x88DD, - 0xB8CC: 0x88E1, - 0xB8CD: 0x88CA, - 0xB8CE: 0x88D5, - 0xB8CF: 0x88D2, - 0xB8D0: 0x899C, - 0xB8D1: 0x89E3, - 0xB8D2: 0x8A6B, - 0xB8D3: 0x8A72, - 0xB8D4: 0x8A73, - 0xB8D5: 0x8A66, - 0xB8D6: 0x8A69, - 0xB8D7: 0x8A70, - 0xB8D8: 0x8A87, - 0xB8D9: 0x8A7C, - 0xB8DA: 0x8A63, - 0xB8DB: 0x8AA0, - 0xB8DC: 0x8A71, - 0xB8DD: 0x8A85, - 0xB8DE: 0x8A6D, - 0xB8DF: 0x8A62, - 0xB8E0: 0x8A6E, - 0xB8E1: 0x8A6C, - 0xB8E2: 0x8A79, - 0xB8E3: 0x8A7B, - 0xB8E4: 0x8A3E, - 0xB8E5: 0x8A68, - 0xB8E6: 0x8C62, - 0xB8E7: 0x8C8A, - 0xB8E8: 0x8C89, - 0xB8E9: 0x8CCA, - 0xB8EA: 0x8CC7, - 0xB8EB: 0x8CC8, - 0xB8EC: 0x8CC4, - 0xB8ED: 0x8CB2, - 0xB8EE: 0x8CC3, - 0xB8EF: 0x8CC2, - 0xB8F0: 0x8CC5, - 0xB8F1: 0x8DE1, - 0xB8F2: 0x8DDF, - 0xB8F3: 0x8DE8, - 0xB8F4: 0x8DEF, - 0xB8F5: 0x8DF3, - 0xB8F6: 0x8DFA, - 0xB8F7: 0x8DEA, - 0xB8F8: 0x8DE4, - 0xB8F9: 0x8DE6, - 0xB8FA: 0x8EB2, - 0xB8FB: 0x8F03, - 0xB8FC: 0x8F09, - 0xB8FD: 0x8EFE, - 0xB8FE: 0x8F0A, - 0xB940: 0x8F9F, - 0xB941: 0x8FB2, - 0xB942: 0x904B, - 0xB943: 0x904A, - 0xB944: 0x9053, - 0xB945: 0x9042, - 0xB946: 0x9054, - 0xB947: 0x903C, - 0xB948: 0x9055, - 0xB949: 0x9050, - 0xB94A: 0x9047, - 0xB94B: 0x904F, - 0xB94C: 0x904E, - 0xB94D: 0x904D, - 0xB94E: 0x9051, - 0xB94F: 0x903E, - 0xB950: 0x9041, - 0xB951: 0x9112, - 0xB952: 0x9117, - 0xB953: 0x916C, - 0xB954: 0x916A, - 0xB955: 0x9169, - 0xB956: 0x91C9, - 0xB957: 0x9237, - 0xB958: 0x9257, - 0xB959: 0x9238, - 0xB95A: 0x923D, - 0xB95B: 0x9240, - 0xB95C: 0x923E, - 0xB95D: 0x925B, - 0xB95E: 0x924B, - 0xB95F: 0x9264, - 0xB960: 0x9251, - 0xB961: 0x9234, - 0xB962: 0x9249, - 0xB963: 0x924D, - 0xB964: 0x9245, - 0xB965: 0x9239, - 0xB966: 0x923F, - 0xB967: 0x925A, - 0xB968: 0x9598, - 0xB969: 0x9698, - 0xB96A: 0x9694, - 0xB96B: 0x9695, - 0xB96C: 0x96CD, - 0xB96D: 0x96CB, - 0xB96E: 0x96C9, - 0xB96F: 0x96CA, - 0xB970: 0x96F7, - 0xB971: 0x96FB, - 0xB972: 0x96F9, - 0xB973: 0x96F6, - 0xB974: 0x9756, - 0xB975: 0x9774, - 0xB976: 0x9776, - 0xB977: 0x9810, - 0xB978: 0x9811, - 0xB979: 0x9813, - 0xB97A: 0x980A, - 0xB97B: 0x9812, - 0xB97C: 0x980C, - 0xB97D: 0x98FC, - 0xB97E: 0x98F4, - 0xB9A1: 0x98FD, - 0xB9A2: 0x98FE, - 0xB9A3: 0x99B3, - 0xB9A4: 0x99B1, - 0xB9A5: 0x99B4, - 0xB9A6: 0x9AE1, - 0xB9A7: 0x9CE9, - 0xB9A8: 0x9E82, - 0xB9A9: 0x9F0E, - 0xB9AA: 0x9F13, - 0xB9AB: 0x9F20, - 0xB9AC: 0x50E7, - 0xB9AD: 0x50EE, - 0xB9AE: 0x50E5, - 0xB9AF: 0x50D6, - 0xB9B0: 0x50ED, - 0xB9B1: 0x50DA, - 0xB9B2: 0x50D5, - 0xB9B3: 0x50CF, - 0xB9B4: 0x50D1, - 0xB9B5: 0x50F1, - 0xB9B6: 0x50CE, - 0xB9B7: 0x50E9, - 0xB9B8: 0x5162, - 0xB9B9: 0x51F3, - 0xB9BA: 0x5283, - 0xB9BB: 0x5282, - 0xB9BC: 0x5331, - 0xB9BD: 0x53AD, - 0xB9BE: 0x55FE, - 0xB9BF: 0x5600, - 0xB9C0: 0x561B, - 0xB9C1: 0x5617, - 0xB9C2: 0x55FD, - 0xB9C3: 0x5614, - 0xB9C4: 0x5606, - 0xB9C5: 0x5609, - 0xB9C6: 0x560D, - 0xB9C7: 0x560E, - 0xB9C8: 0x55F7, - 0xB9C9: 0x5616, - 0xB9CA: 0x561F, - 0xB9CB: 0x5608, - 0xB9CC: 0x5610, - 0xB9CD: 0x55F6, - 0xB9CE: 0x5718, - 0xB9CF: 0x5716, - 0xB9D0: 0x5875, - 0xB9D1: 0x587E, - 0xB9D2: 0x5883, - 0xB9D3: 0x5893, - 0xB9D4: 0x588A, - 0xB9D5: 0x5879, - 0xB9D6: 0x5885, - 0xB9D7: 0x587D, - 0xB9D8: 0x58FD, - 0xB9D9: 0x5925, - 0xB9DA: 0x5922, - 0xB9DB: 0x5924, - 0xB9DC: 0x596A, - 0xB9DD: 0x5969, - 0xB9DE: 0x5AE1, - 0xB9DF: 0x5AE6, - 0xB9E0: 0x5AE9, - 0xB9E1: 0x5AD7, - 0xB9E2: 0x5AD6, - 0xB9E3: 0x5AD8, - 0xB9E4: 0x5AE3, - 0xB9E5: 0x5B75, - 0xB9E6: 0x5BDE, - 0xB9E7: 0x5BE7, - 0xB9E8: 0x5BE1, - 0xB9E9: 0x5BE5, - 0xB9EA: 0x5BE6, - 0xB9EB: 0x5BE8, - 0xB9EC: 0x5BE2, - 0xB9ED: 0x5BE4, - 0xB9EE: 0x5BDF, - 0xB9EF: 0x5C0D, - 0xB9F0: 0x5C62, - 0xB9F1: 0x5D84, - 0xB9F2: 0x5D87, - 0xB9F3: 0x5E5B, - 0xB9F4: 0x5E63, - 0xB9F5: 0x5E55, - 0xB9F6: 0x5E57, - 0xB9F7: 0x5E54, - 0xB9F8: 0x5ED3, - 0xB9F9: 0x5ED6, - 0xB9FA: 0x5F0A, - 0xB9FB: 0x5F46, - 0xB9FC: 0x5F70, - 0xB9FD: 0x5FB9, - 0xB9FE: 0x6147, - 0xBA40: 0x613F, - 0xBA41: 0x614B, - 0xBA42: 0x6177, - 0xBA43: 0x6162, - 0xBA44: 0x6163, - 0xBA45: 0x615F, - 0xBA46: 0x615A, - 0xBA47: 0x6158, - 0xBA48: 0x6175, - 0xBA49: 0x622A, - 0xBA4A: 0x6487, - 0xBA4B: 0x6458, - 0xBA4C: 0x6454, - 0xBA4D: 0x64A4, - 0xBA4E: 0x6478, - 0xBA4F: 0x645F, - 0xBA50: 0x647A, - 0xBA51: 0x6451, - 0xBA52: 0x6467, - 0xBA53: 0x6434, - 0xBA54: 0x646D, - 0xBA55: 0x647B, - 0xBA56: 0x6572, - 0xBA57: 0x65A1, - 0xBA58: 0x65D7, - 0xBA59: 0x65D6, - 0xBA5A: 0x66A2, - 0xBA5B: 0x66A8, - 0xBA5C: 0x669D, - 0xBA5D: 0x699C, - 0xBA5E: 0x69A8, - 0xBA5F: 0x6995, - 0xBA60: 0x69C1, - 0xBA61: 0x69AE, - 0xBA62: 0x69D3, - 0xBA63: 0x69CB, - 0xBA64: 0x699B, - 0xBA65: 0x69B7, - 0xBA66: 0x69BB, - 0xBA67: 0x69AB, - 0xBA68: 0x69B4, - 0xBA69: 0x69D0, - 0xBA6A: 0x69CD, - 0xBA6B: 0x69AD, - 0xBA6C: 0x69CC, - 0xBA6D: 0x69A6, - 0xBA6E: 0x69C3, - 0xBA6F: 0x69A3, - 0xBA70: 0x6B49, - 0xBA71: 0x6B4C, - 0xBA72: 0x6C33, - 0xBA73: 0x6F33, - 0xBA74: 0x6F14, - 0xBA75: 0x6EFE, - 0xBA76: 0x6F13, - 0xBA77: 0x6EF4, - 0xBA78: 0x6F29, - 0xBA79: 0x6F3E, - 0xBA7A: 0x6F20, - 0xBA7B: 0x6F2C, - 0xBA7C: 0x6F0F, - 0xBA7D: 0x6F02, - 0xBA7E: 0x6F22, - 0xBAA1: 0x6EFF, - 0xBAA2: 0x6EEF, - 0xBAA3: 0x6F06, - 0xBAA4: 0x6F31, - 0xBAA5: 0x6F38, - 0xBAA6: 0x6F32, - 0xBAA7: 0x6F23, - 0xBAA8: 0x6F15, - 0xBAA9: 0x6F2B, - 0xBAAA: 0x6F2F, - 0xBAAB: 0x6F88, - 0xBAAC: 0x6F2A, - 0xBAAD: 0x6EEC, - 0xBAAE: 0x6F01, - 0xBAAF: 0x6EF2, - 0xBAB0: 0x6ECC, - 0xBAB1: 0x6EF7, - 0xBAB2: 0x7194, - 0xBAB3: 0x7199, - 0xBAB4: 0x717D, - 0xBAB5: 0x718A, - 0xBAB6: 0x7184, - 0xBAB7: 0x7192, - 0xBAB8: 0x723E, - 0xBAB9: 0x7292, - 0xBABA: 0x7296, - 0xBABB: 0x7344, - 0xBABC: 0x7350, - 0xBABD: 0x7464, - 0xBABE: 0x7463, - 0xBABF: 0x746A, - 0xBAC0: 0x7470, - 0xBAC1: 0x746D, - 0xBAC2: 0x7504, - 0xBAC3: 0x7591, - 0xBAC4: 0x7627, - 0xBAC5: 0x760D, - 0xBAC6: 0x760B, - 0xBAC7: 0x7609, - 0xBAC8: 0x7613, - 0xBAC9: 0x76E1, - 0xBACA: 0x76E3, - 0xBACB: 0x7784, - 0xBACC: 0x777D, - 0xBACD: 0x777F, - 0xBACE: 0x7761, - 0xBACF: 0x78C1, - 0xBAD0: 0x789F, - 0xBAD1: 0x78A7, - 0xBAD2: 0x78B3, - 0xBAD3: 0x78A9, - 0xBAD4: 0x78A3, - 0xBAD5: 0x798E, - 0xBAD6: 0x798F, - 0xBAD7: 0x798D, - 0xBAD8: 0x7A2E, - 0xBAD9: 0x7A31, - 0xBADA: 0x7AAA, - 0xBADB: 0x7AA9, - 0xBADC: 0x7AED, - 0xBADD: 0x7AEF, - 0xBADE: 0x7BA1, - 0xBADF: 0x7B95, - 0xBAE0: 0x7B8B, - 0xBAE1: 0x7B75, - 0xBAE2: 0x7B97, - 0xBAE3: 0x7B9D, - 0xBAE4: 0x7B94, - 0xBAE5: 0x7B8F, - 0xBAE6: 0x7BB8, - 0xBAE7: 0x7B87, - 0xBAE8: 0x7B84, - 0xBAE9: 0x7CB9, - 0xBAEA: 0x7CBD, - 0xBAEB: 0x7CBE, - 0xBAEC: 0x7DBB, - 0xBAED: 0x7DB0, - 0xBAEE: 0x7D9C, - 0xBAEF: 0x7DBD, - 0xBAF0: 0x7DBE, - 0xBAF1: 0x7DA0, - 0xBAF2: 0x7DCA, - 0xBAF3: 0x7DB4, - 0xBAF4: 0x7DB2, - 0xBAF5: 0x7DB1, - 0xBAF6: 0x7DBA, - 0xBAF7: 0x7DA2, - 0xBAF8: 0x7DBF, - 0xBAF9: 0x7DB5, - 0xBAFA: 0x7DB8, - 0xBAFB: 0x7DAD, - 0xBAFC: 0x7DD2, - 0xBAFD: 0x7DC7, - 0xBAFE: 0x7DAC, - 0xBB40: 0x7F70, - 0xBB41: 0x7FE0, - 0xBB42: 0x7FE1, - 0xBB43: 0x7FDF, - 0xBB44: 0x805E, - 0xBB45: 0x805A, - 0xBB46: 0x8087, - 0xBB47: 0x8150, - 0xBB48: 0x8180, - 0xBB49: 0x818F, - 0xBB4A: 0x8188, - 0xBB4B: 0x818A, - 0xBB4C: 0x817F, - 0xBB4D: 0x8182, - 0xBB4E: 0x81E7, - 0xBB4F: 0x81FA, - 0xBB50: 0x8207, - 0xBB51: 0x8214, - 0xBB52: 0x821E, - 0xBB53: 0x824B, - 0xBB54: 0x84C9, - 0xBB55: 0x84BF, - 0xBB56: 0x84C6, - 0xBB57: 0x84C4, - 0xBB58: 0x8499, - 0xBB59: 0x849E, - 0xBB5A: 0x84B2, - 0xBB5B: 0x849C, - 0xBB5C: 0x84CB, - 0xBB5D: 0x84B8, - 0xBB5E: 0x84C0, - 0xBB5F: 0x84D3, - 0xBB60: 0x8490, - 0xBB61: 0x84BC, - 0xBB62: 0x84D1, - 0xBB63: 0x84CA, - 0xBB64: 0x873F, - 0xBB65: 0x871C, - 0xBB66: 0x873B, - 0xBB67: 0x8722, - 0xBB68: 0x8725, - 0xBB69: 0x8734, - 0xBB6A: 0x8718, - 0xBB6B: 0x8755, - 0xBB6C: 0x8737, - 0xBB6D: 0x8729, - 0xBB6E: 0x88F3, - 0xBB6F: 0x8902, - 0xBB70: 0x88F4, - 0xBB71: 0x88F9, - 0xBB72: 0x88F8, - 0xBB73: 0x88FD, - 0xBB74: 0x88E8, - 0xBB75: 0x891A, - 0xBB76: 0x88EF, - 0xBB77: 0x8AA6, - 0xBB78: 0x8A8C, - 0xBB79: 0x8A9E, - 0xBB7A: 0x8AA3, - 0xBB7B: 0x8A8D, - 0xBB7C: 0x8AA1, - 0xBB7D: 0x8A93, - 0xBB7E: 0x8AA4, - 0xBBA1: 0x8AAA, - 0xBBA2: 0x8AA5, - 0xBBA3: 0x8AA8, - 0xBBA4: 0x8A98, - 0xBBA5: 0x8A91, - 0xBBA6: 0x8A9A, - 0xBBA7: 0x8AA7, - 0xBBA8: 0x8C6A, - 0xBBA9: 0x8C8D, - 0xBBAA: 0x8C8C, - 0xBBAB: 0x8CD3, - 0xBBAC: 0x8CD1, - 0xBBAD: 0x8CD2, - 0xBBAE: 0x8D6B, - 0xBBAF: 0x8D99, - 0xBBB0: 0x8D95, - 0xBBB1: 0x8DFC, - 0xBBB2: 0x8F14, - 0xBBB3: 0x8F12, - 0xBBB4: 0x8F15, - 0xBBB5: 0x8F13, - 0xBBB6: 0x8FA3, - 0xBBB7: 0x9060, - 0xBBB8: 0x9058, - 0xBBB9: 0x905C, - 0xBBBA: 0x9063, - 0xBBBB: 0x9059, - 0xBBBC: 0x905E, - 0xBBBD: 0x9062, - 0xBBBE: 0x905D, - 0xBBBF: 0x905B, - 0xBBC0: 0x9119, - 0xBBC1: 0x9118, - 0xBBC2: 0x911E, - 0xBBC3: 0x9175, - 0xBBC4: 0x9178, - 0xBBC5: 0x9177, - 0xBBC6: 0x9174, - 0xBBC7: 0x9278, - 0xBBC8: 0x9280, - 0xBBC9: 0x9285, - 0xBBCA: 0x9298, - 0xBBCB: 0x9296, - 0xBBCC: 0x927B, - 0xBBCD: 0x9293, - 0xBBCE: 0x929C, - 0xBBCF: 0x92A8, - 0xBBD0: 0x927C, - 0xBBD1: 0x9291, - 0xBBD2: 0x95A1, - 0xBBD3: 0x95A8, - 0xBBD4: 0x95A9, - 0xBBD5: 0x95A3, - 0xBBD6: 0x95A5, - 0xBBD7: 0x95A4, - 0xBBD8: 0x9699, - 0xBBD9: 0x969C, - 0xBBDA: 0x969B, - 0xBBDB: 0x96CC, - 0xBBDC: 0x96D2, - 0xBBDD: 0x9700, - 0xBBDE: 0x977C, - 0xBBDF: 0x9785, - 0xBBE0: 0x97F6, - 0xBBE1: 0x9817, - 0xBBE2: 0x9818, - 0xBBE3: 0x98AF, - 0xBBE4: 0x98B1, - 0xBBE5: 0x9903, - 0xBBE6: 0x9905, - 0xBBE7: 0x990C, - 0xBBE8: 0x9909, - 0xBBE9: 0x99C1, - 0xBBEA: 0x9AAF, - 0xBBEB: 0x9AB0, - 0xBBEC: 0x9AE6, - 0xBBED: 0x9B41, - 0xBBEE: 0x9B42, - 0xBBEF: 0x9CF4, - 0xBBF0: 0x9CF6, - 0xBBF1: 0x9CF3, - 0xBBF2: 0x9EBC, - 0xBBF3: 0x9F3B, - 0xBBF4: 0x9F4A, - 0xBBF5: 0x5104, - 0xBBF6: 0x5100, - 0xBBF7: 0x50FB, - 0xBBF8: 0x50F5, - 0xBBF9: 0x50F9, - 0xBBFA: 0x5102, - 0xBBFB: 0x5108, - 0xBBFC: 0x5109, - 0xBBFD: 0x5105, - 0xBBFE: 0x51DC, - 0xBC40: 0x5287, - 0xBC41: 0x5288, - 0xBC42: 0x5289, - 0xBC43: 0x528D, - 0xBC44: 0x528A, - 0xBC45: 0x52F0, - 0xBC46: 0x53B2, - 0xBC47: 0x562E, - 0xBC48: 0x563B, - 0xBC49: 0x5639, - 0xBC4A: 0x5632, - 0xBC4B: 0x563F, - 0xBC4C: 0x5634, - 0xBC4D: 0x5629, - 0xBC4E: 0x5653, - 0xBC4F: 0x564E, - 0xBC50: 0x5657, - 0xBC51: 0x5674, - 0xBC52: 0x5636, - 0xBC53: 0x562F, - 0xBC54: 0x5630, - 0xBC55: 0x5880, - 0xBC56: 0x589F, - 0xBC57: 0x589E, - 0xBC58: 0x58B3, - 0xBC59: 0x589C, - 0xBC5A: 0x58AE, - 0xBC5B: 0x58A9, - 0xBC5C: 0x58A6, - 0xBC5D: 0x596D, - 0xBC5E: 0x5B09, - 0xBC5F: 0x5AFB, - 0xBC60: 0x5B0B, - 0xBC61: 0x5AF5, - 0xBC62: 0x5B0C, - 0xBC63: 0x5B08, - 0xBC64: 0x5BEE, - 0xBC65: 0x5BEC, - 0xBC66: 0x5BE9, - 0xBC67: 0x5BEB, - 0xBC68: 0x5C64, - 0xBC69: 0x5C65, - 0xBC6A: 0x5D9D, - 0xBC6B: 0x5D94, - 0xBC6C: 0x5E62, - 0xBC6D: 0x5E5F, - 0xBC6E: 0x5E61, - 0xBC6F: 0x5EE2, - 0xBC70: 0x5EDA, - 0xBC71: 0x5EDF, - 0xBC72: 0x5EDD, - 0xBC73: 0x5EE3, - 0xBC74: 0x5EE0, - 0xBC75: 0x5F48, - 0xBC76: 0x5F71, - 0xBC77: 0x5FB7, - 0xBC78: 0x5FB5, - 0xBC79: 0x6176, - 0xBC7A: 0x6167, - 0xBC7B: 0x616E, - 0xBC7C: 0x615D, - 0xBC7D: 0x6155, - 0xBC7E: 0x6182, - 0xBCA1: 0x617C, - 0xBCA2: 0x6170, - 0xBCA3: 0x616B, - 0xBCA4: 0x617E, - 0xBCA5: 0x61A7, - 0xBCA6: 0x6190, - 0xBCA7: 0x61AB, - 0xBCA8: 0x618E, - 0xBCA9: 0x61AC, - 0xBCAA: 0x619A, - 0xBCAB: 0x61A4, - 0xBCAC: 0x6194, - 0xBCAD: 0x61AE, - 0xBCAE: 0x622E, - 0xBCAF: 0x6469, - 0xBCB0: 0x646F, - 0xBCB1: 0x6479, - 0xBCB2: 0x649E, - 0xBCB3: 0x64B2, - 0xBCB4: 0x6488, - 0xBCB5: 0x6490, - 0xBCB6: 0x64B0, - 0xBCB7: 0x64A5, - 0xBCB8: 0x6493, - 0xBCB9: 0x6495, - 0xBCBA: 0x64A9, - 0xBCBB: 0x6492, - 0xBCBC: 0x64AE, - 0xBCBD: 0x64AD, - 0xBCBE: 0x64AB, - 0xBCBF: 0x649A, - 0xBCC0: 0x64AC, - 0xBCC1: 0x6499, - 0xBCC2: 0x64A2, - 0xBCC3: 0x64B3, - 0xBCC4: 0x6575, - 0xBCC5: 0x6577, - 0xBCC6: 0x6578, - 0xBCC7: 0x66AE, - 0xBCC8: 0x66AB, - 0xBCC9: 0x66B4, - 0xBCCA: 0x66B1, - 0xBCCB: 0x6A23, - 0xBCCC: 0x6A1F, - 0xBCCD: 0x69E8, - 0xBCCE: 0x6A01, - 0xBCCF: 0x6A1E, - 0xBCD0: 0x6A19, - 0xBCD1: 0x69FD, - 0xBCD2: 0x6A21, - 0xBCD3: 0x6A13, - 0xBCD4: 0x6A0A, - 0xBCD5: 0x69F3, - 0xBCD6: 0x6A02, - 0xBCD7: 0x6A05, - 0xBCD8: 0x69ED, - 0xBCD9: 0x6A11, - 0xBCDA: 0x6B50, - 0xBCDB: 0x6B4E, - 0xBCDC: 0x6BA4, - 0xBCDD: 0x6BC5, - 0xBCDE: 0x6BC6, - 0xBCDF: 0x6F3F, - 0xBCE0: 0x6F7C, - 0xBCE1: 0x6F84, - 0xBCE2: 0x6F51, - 0xBCE3: 0x6F66, - 0xBCE4: 0x6F54, - 0xBCE5: 0x6F86, - 0xBCE6: 0x6F6D, - 0xBCE7: 0x6F5B, - 0xBCE8: 0x6F78, - 0xBCE9: 0x6F6E, - 0xBCEA: 0x6F8E, - 0xBCEB: 0x6F7A, - 0xBCEC: 0x6F70, - 0xBCED: 0x6F64, - 0xBCEE: 0x6F97, - 0xBCEF: 0x6F58, - 0xBCF0: 0x6ED5, - 0xBCF1: 0x6F6F, - 0xBCF2: 0x6F60, - 0xBCF3: 0x6F5F, - 0xBCF4: 0x719F, - 0xBCF5: 0x71AC, - 0xBCF6: 0x71B1, - 0xBCF7: 0x71A8, - 0xBCF8: 0x7256, - 0xBCF9: 0x729B, - 0xBCFA: 0x734E, - 0xBCFB: 0x7357, - 0xBCFC: 0x7469, - 0xBCFD: 0x748B, - 0xBCFE: 0x7483, - 0xBD40: 0x747E, - 0xBD41: 0x7480, - 0xBD42: 0x757F, - 0xBD43: 0x7620, - 0xBD44: 0x7629, - 0xBD45: 0x761F, - 0xBD46: 0x7624, - 0xBD47: 0x7626, - 0xBD48: 0x7621, - 0xBD49: 0x7622, - 0xBD4A: 0x769A, - 0xBD4B: 0x76BA, - 0xBD4C: 0x76E4, - 0xBD4D: 0x778E, - 0xBD4E: 0x7787, - 0xBD4F: 0x778C, - 0xBD50: 0x7791, - 0xBD51: 0x778B, - 0xBD52: 0x78CB, - 0xBD53: 0x78C5, - 0xBD54: 0x78BA, - 0xBD55: 0x78CA, - 0xBD56: 0x78BE, - 0xBD57: 0x78D5, - 0xBD58: 0x78BC, - 0xBD59: 0x78D0, - 0xBD5A: 0x7A3F, - 0xBD5B: 0x7A3C, - 0xBD5C: 0x7A40, - 0xBD5D: 0x7A3D, - 0xBD5E: 0x7A37, - 0xBD5F: 0x7A3B, - 0xBD60: 0x7AAF, - 0xBD61: 0x7AAE, - 0xBD62: 0x7BAD, - 0xBD63: 0x7BB1, - 0xBD64: 0x7BC4, - 0xBD65: 0x7BB4, - 0xBD66: 0x7BC6, - 0xBD67: 0x7BC7, - 0xBD68: 0x7BC1, - 0xBD69: 0x7BA0, - 0xBD6A: 0x7BCC, - 0xBD6B: 0x7CCA, - 0xBD6C: 0x7DE0, - 0xBD6D: 0x7DF4, - 0xBD6E: 0x7DEF, - 0xBD6F: 0x7DFB, - 0xBD70: 0x7DD8, - 0xBD71: 0x7DEC, - 0xBD72: 0x7DDD, - 0xBD73: 0x7DE8, - 0xBD74: 0x7DE3, - 0xBD75: 0x7DDA, - 0xBD76: 0x7DDE, - 0xBD77: 0x7DE9, - 0xBD78: 0x7D9E, - 0xBD79: 0x7DD9, - 0xBD7A: 0x7DF2, - 0xBD7B: 0x7DF9, - 0xBD7C: 0x7F75, - 0xBD7D: 0x7F77, - 0xBD7E: 0x7FAF, - 0xBDA1: 0x7FE9, - 0xBDA2: 0x8026, - 0xBDA3: 0x819B, - 0xBDA4: 0x819C, - 0xBDA5: 0x819D, - 0xBDA6: 0x81A0, - 0xBDA7: 0x819A, - 0xBDA8: 0x8198, - 0xBDA9: 0x8517, - 0xBDAA: 0x853D, - 0xBDAB: 0x851A, - 0xBDAC: 0x84EE, - 0xBDAD: 0x852C, - 0xBDAE: 0x852D, - 0xBDAF: 0x8513, - 0xBDB0: 0x8511, - 0xBDB1: 0x8523, - 0xBDB2: 0x8521, - 0xBDB3: 0x8514, - 0xBDB4: 0x84EC, - 0xBDB5: 0x8525, - 0xBDB6: 0x84FF, - 0xBDB7: 0x8506, - 0xBDB8: 0x8782, - 0xBDB9: 0x8774, - 0xBDBA: 0x8776, - 0xBDBB: 0x8760, - 0xBDBC: 0x8766, - 0xBDBD: 0x8778, - 0xBDBE: 0x8768, - 0xBDBF: 0x8759, - 0xBDC0: 0x8757, - 0xBDC1: 0x874C, - 0xBDC2: 0x8753, - 0xBDC3: 0x885B, - 0xBDC4: 0x885D, - 0xBDC5: 0x8910, - 0xBDC6: 0x8907, - 0xBDC7: 0x8912, - 0xBDC8: 0x8913, - 0xBDC9: 0x8915, - 0xBDCA: 0x890A, - 0xBDCB: 0x8ABC, - 0xBDCC: 0x8AD2, - 0xBDCD: 0x8AC7, - 0xBDCE: 0x8AC4, - 0xBDCF: 0x8A95, - 0xBDD0: 0x8ACB, - 0xBDD1: 0x8AF8, - 0xBDD2: 0x8AB2, - 0xBDD3: 0x8AC9, - 0xBDD4: 0x8AC2, - 0xBDD5: 0x8ABF, - 0xBDD6: 0x8AB0, - 0xBDD7: 0x8AD6, - 0xBDD8: 0x8ACD, - 0xBDD9: 0x8AB6, - 0xBDDA: 0x8AB9, - 0xBDDB: 0x8ADB, - 0xBDDC: 0x8C4C, - 0xBDDD: 0x8C4E, - 0xBDDE: 0x8C6C, - 0xBDDF: 0x8CE0, - 0xBDE0: 0x8CDE, - 0xBDE1: 0x8CE6, - 0xBDE2: 0x8CE4, - 0xBDE3: 0x8CEC, - 0xBDE4: 0x8CED, - 0xBDE5: 0x8CE2, - 0xBDE6: 0x8CE3, - 0xBDE7: 0x8CDC, - 0xBDE8: 0x8CEA, - 0xBDE9: 0x8CE1, - 0xBDEA: 0x8D6D, - 0xBDEB: 0x8D9F, - 0xBDEC: 0x8DA3, - 0xBDED: 0x8E2B, - 0xBDEE: 0x8E10, - 0xBDEF: 0x8E1D, - 0xBDF0: 0x8E22, - 0xBDF1: 0x8E0F, - 0xBDF2: 0x8E29, - 0xBDF3: 0x8E1F, - 0xBDF4: 0x8E21, - 0xBDF5: 0x8E1E, - 0xBDF6: 0x8EBA, - 0xBDF7: 0x8F1D, - 0xBDF8: 0x8F1B, - 0xBDF9: 0x8F1F, - 0xBDFA: 0x8F29, - 0xBDFB: 0x8F26, - 0xBDFC: 0x8F2A, - 0xBDFD: 0x8F1C, - 0xBDFE: 0x8F1E, - 0xBE40: 0x8F25, - 0xBE41: 0x9069, - 0xBE42: 0x906E, - 0xBE43: 0x9068, - 0xBE44: 0x906D, - 0xBE45: 0x9077, - 0xBE46: 0x9130, - 0xBE47: 0x912D, - 0xBE48: 0x9127, - 0xBE49: 0x9131, - 0xBE4A: 0x9187, - 0xBE4B: 0x9189, - 0xBE4C: 0x918B, - 0xBE4D: 0x9183, - 0xBE4E: 0x92C5, - 0xBE4F: 0x92BB, - 0xBE50: 0x92B7, - 0xBE51: 0x92EA, - 0xBE52: 0x92AC, - 0xBE53: 0x92E4, - 0xBE54: 0x92C1, - 0xBE55: 0x92B3, - 0xBE56: 0x92BC, - 0xBE57: 0x92D2, - 0xBE58: 0x92C7, - 0xBE59: 0x92F0, - 0xBE5A: 0x92B2, - 0xBE5B: 0x95AD, - 0xBE5C: 0x95B1, - 0xBE5D: 0x9704, - 0xBE5E: 0x9706, - 0xBE5F: 0x9707, - 0xBE60: 0x9709, - 0xBE61: 0x9760, - 0xBE62: 0x978D, - 0xBE63: 0x978B, - 0xBE64: 0x978F, - 0xBE65: 0x9821, - 0xBE66: 0x982B, - 0xBE67: 0x981C, - 0xBE68: 0x98B3, - 0xBE69: 0x990A, - 0xBE6A: 0x9913, - 0xBE6B: 0x9912, - 0xBE6C: 0x9918, - 0xBE6D: 0x99DD, - 0xBE6E: 0x99D0, - 0xBE6F: 0x99DF, - 0xBE70: 0x99DB, - 0xBE71: 0x99D1, - 0xBE72: 0x99D5, - 0xBE73: 0x99D2, - 0xBE74: 0x99D9, - 0xBE75: 0x9AB7, - 0xBE76: 0x9AEE, - 0xBE77: 0x9AEF, - 0xBE78: 0x9B27, - 0xBE79: 0x9B45, - 0xBE7A: 0x9B44, - 0xBE7B: 0x9B77, - 0xBE7C: 0x9B6F, - 0xBE7D: 0x9D06, - 0xBE7E: 0x9D09, - 0xBEA1: 0x9D03, - 0xBEA2: 0x9EA9, - 0xBEA3: 0x9EBE, - 0xBEA4: 0x9ECE, - 0xBEA5: 0x58A8, - 0xBEA6: 0x9F52, - 0xBEA7: 0x5112, - 0xBEA8: 0x5118, - 0xBEA9: 0x5114, - 0xBEAA: 0x5110, - 0xBEAB: 0x5115, - 0xBEAC: 0x5180, - 0xBEAD: 0x51AA, - 0xBEAE: 0x51DD, - 0xBEAF: 0x5291, - 0xBEB0: 0x5293, - 0xBEB1: 0x52F3, - 0xBEB2: 0x5659, - 0xBEB3: 0x566B, - 0xBEB4: 0x5679, - 0xBEB5: 0x5669, - 0xBEB6: 0x5664, - 0xBEB7: 0x5678, - 0xBEB8: 0x566A, - 0xBEB9: 0x5668, - 0xBEBA: 0x5665, - 0xBEBB: 0x5671, - 0xBEBC: 0x566F, - 0xBEBD: 0x566C, - 0xBEBE: 0x5662, - 0xBEBF: 0x5676, - 0xBEC0: 0x58C1, - 0xBEC1: 0x58BE, - 0xBEC2: 0x58C7, - 0xBEC3: 0x58C5, - 0xBEC4: 0x596E, - 0xBEC5: 0x5B1D, - 0xBEC6: 0x5B34, - 0xBEC7: 0x5B78, - 0xBEC8: 0x5BF0, - 0xBEC9: 0x5C0E, - 0xBECA: 0x5F4A, - 0xBECB: 0x61B2, - 0xBECC: 0x6191, - 0xBECD: 0x61A9, - 0xBECE: 0x618A, - 0xBECF: 0x61CD, - 0xBED0: 0x61B6, - 0xBED1: 0x61BE, - 0xBED2: 0x61CA, - 0xBED3: 0x61C8, - 0xBED4: 0x6230, - 0xBED5: 0x64C5, - 0xBED6: 0x64C1, - 0xBED7: 0x64CB, - 0xBED8: 0x64BB, - 0xBED9: 0x64BC, - 0xBEDA: 0x64DA, - 0xBEDB: 0x64C4, - 0xBEDC: 0x64C7, - 0xBEDD: 0x64C2, - 0xBEDE: 0x64CD, - 0xBEDF: 0x64BF, - 0xBEE0: 0x64D2, - 0xBEE1: 0x64D4, - 0xBEE2: 0x64BE, - 0xBEE3: 0x6574, - 0xBEE4: 0x66C6, - 0xBEE5: 0x66C9, - 0xBEE6: 0x66B9, - 0xBEE7: 0x66C4, - 0xBEE8: 0x66C7, - 0xBEE9: 0x66B8, - 0xBEEA: 0x6A3D, - 0xBEEB: 0x6A38, - 0xBEEC: 0x6A3A, - 0xBEED: 0x6A59, - 0xBEEE: 0x6A6B, - 0xBEEF: 0x6A58, - 0xBEF0: 0x6A39, - 0xBEF1: 0x6A44, - 0xBEF2: 0x6A62, - 0xBEF3: 0x6A61, - 0xBEF4: 0x6A4B, - 0xBEF5: 0x6A47, - 0xBEF6: 0x6A35, - 0xBEF7: 0x6A5F, - 0xBEF8: 0x6A48, - 0xBEF9: 0x6B59, - 0xBEFA: 0x6B77, - 0xBEFB: 0x6C05, - 0xBEFC: 0x6FC2, - 0xBEFD: 0x6FB1, - 0xBEFE: 0x6FA1, - 0xBF40: 0x6FC3, - 0xBF41: 0x6FA4, - 0xBF42: 0x6FC1, - 0xBF43: 0x6FA7, - 0xBF44: 0x6FB3, - 0xBF45: 0x6FC0, - 0xBF46: 0x6FB9, - 0xBF47: 0x6FB6, - 0xBF48: 0x6FA6, - 0xBF49: 0x6FA0, - 0xBF4A: 0x6FB4, - 0xBF4B: 0x71BE, - 0xBF4C: 0x71C9, - 0xBF4D: 0x71D0, - 0xBF4E: 0x71D2, - 0xBF4F: 0x71C8, - 0xBF50: 0x71D5, - 0xBF51: 0x71B9, - 0xBF52: 0x71CE, - 0xBF53: 0x71D9, - 0xBF54: 0x71DC, - 0xBF55: 0x71C3, - 0xBF56: 0x71C4, - 0xBF57: 0x7368, - 0xBF58: 0x749C, - 0xBF59: 0x74A3, - 0xBF5A: 0x7498, - 0xBF5B: 0x749F, - 0xBF5C: 0x749E, - 0xBF5D: 0x74E2, - 0xBF5E: 0x750C, - 0xBF5F: 0x750D, - 0xBF60: 0x7634, - 0xBF61: 0x7638, - 0xBF62: 0x763A, - 0xBF63: 0x76E7, - 0xBF64: 0x76E5, - 0xBF65: 0x77A0, - 0xBF66: 0x779E, - 0xBF67: 0x779F, - 0xBF68: 0x77A5, - 0xBF69: 0x78E8, - 0xBF6A: 0x78DA, - 0xBF6B: 0x78EC, - 0xBF6C: 0x78E7, - 0xBF6D: 0x79A6, - 0xBF6E: 0x7A4D, - 0xBF6F: 0x7A4E, - 0xBF70: 0x7A46, - 0xBF71: 0x7A4C, - 0xBF72: 0x7A4B, - 0xBF73: 0x7ABA, - 0xBF74: 0x7BD9, - 0xBF75: 0x7C11, - 0xBF76: 0x7BC9, - 0xBF77: 0x7BE4, - 0xBF78: 0x7BDB, - 0xBF79: 0x7BE1, - 0xBF7A: 0x7BE9, - 0xBF7B: 0x7BE6, - 0xBF7C: 0x7CD5, - 0xBF7D: 0x7CD6, - 0xBF7E: 0x7E0A, - 0xBFA1: 0x7E11, - 0xBFA2: 0x7E08, - 0xBFA3: 0x7E1B, - 0xBFA4: 0x7E23, - 0xBFA5: 0x7E1E, - 0xBFA6: 0x7E1D, - 0xBFA7: 0x7E09, - 0xBFA8: 0x7E10, - 0xBFA9: 0x7F79, - 0xBFAA: 0x7FB2, - 0xBFAB: 0x7FF0, - 0xBFAC: 0x7FF1, - 0xBFAD: 0x7FEE, - 0xBFAE: 0x8028, - 0xBFAF: 0x81B3, - 0xBFB0: 0x81A9, - 0xBFB1: 0x81A8, - 0xBFB2: 0x81FB, - 0xBFB3: 0x8208, - 0xBFB4: 0x8258, - 0xBFB5: 0x8259, - 0xBFB6: 0x854A, - 0xBFB7: 0x8559, - 0xBFB8: 0x8548, - 0xBFB9: 0x8568, - 0xBFBA: 0x8569, - 0xBFBB: 0x8543, - 0xBFBC: 0x8549, - 0xBFBD: 0x856D, - 0xBFBE: 0x856A, - 0xBFBF: 0x855E, - 0xBFC0: 0x8783, - 0xBFC1: 0x879F, - 0xBFC2: 0x879E, - 0xBFC3: 0x87A2, - 0xBFC4: 0x878D, - 0xBFC5: 0x8861, - 0xBFC6: 0x892A, - 0xBFC7: 0x8932, - 0xBFC8: 0x8925, - 0xBFC9: 0x892B, - 0xBFCA: 0x8921, - 0xBFCB: 0x89AA, - 0xBFCC: 0x89A6, - 0xBFCD: 0x8AE6, - 0xBFCE: 0x8AFA, - 0xBFCF: 0x8AEB, - 0xBFD0: 0x8AF1, - 0xBFD1: 0x8B00, - 0xBFD2: 0x8ADC, - 0xBFD3: 0x8AE7, - 0xBFD4: 0x8AEE, - 0xBFD5: 0x8AFE, - 0xBFD6: 0x8B01, - 0xBFD7: 0x8B02, - 0xBFD8: 0x8AF7, - 0xBFD9: 0x8AED, - 0xBFDA: 0x8AF3, - 0xBFDB: 0x8AF6, - 0xBFDC: 0x8AFC, - 0xBFDD: 0x8C6B, - 0xBFDE: 0x8C6D, - 0xBFDF: 0x8C93, - 0xBFE0: 0x8CF4, - 0xBFE1: 0x8E44, - 0xBFE2: 0x8E31, - 0xBFE3: 0x8E34, - 0xBFE4: 0x8E42, - 0xBFE5: 0x8E39, - 0xBFE6: 0x8E35, - 0xBFE7: 0x8F3B, - 0xBFE8: 0x8F2F, - 0xBFE9: 0x8F38, - 0xBFEA: 0x8F33, - 0xBFEB: 0x8FA8, - 0xBFEC: 0x8FA6, - 0xBFED: 0x9075, - 0xBFEE: 0x9074, - 0xBFEF: 0x9078, - 0xBFF0: 0x9072, - 0xBFF1: 0x907C, - 0xBFF2: 0x907A, - 0xBFF3: 0x9134, - 0xBFF4: 0x9192, - 0xBFF5: 0x9320, - 0xBFF6: 0x9336, - 0xBFF7: 0x92F8, - 0xBFF8: 0x9333, - 0xBFF9: 0x932F, - 0xBFFA: 0x9322, - 0xBFFB: 0x92FC, - 0xBFFC: 0x932B, - 0xBFFD: 0x9304, - 0xBFFE: 0x931A, - 0xC040: 0x9310, - 0xC041: 0x9326, - 0xC042: 0x9321, - 0xC043: 0x9315, - 0xC044: 0x932E, - 0xC045: 0x9319, - 0xC046: 0x95BB, - 0xC047: 0x96A7, - 0xC048: 0x96A8, - 0xC049: 0x96AA, - 0xC04A: 0x96D5, - 0xC04B: 0x970E, - 0xC04C: 0x9711, - 0xC04D: 0x9716, - 0xC04E: 0x970D, - 0xC04F: 0x9713, - 0xC050: 0x970F, - 0xC051: 0x975B, - 0xC052: 0x975C, - 0xC053: 0x9766, - 0xC054: 0x9798, - 0xC055: 0x9830, - 0xC056: 0x9838, - 0xC057: 0x983B, - 0xC058: 0x9837, - 0xC059: 0x982D, - 0xC05A: 0x9839, - 0xC05B: 0x9824, - 0xC05C: 0x9910, - 0xC05D: 0x9928, - 0xC05E: 0x991E, - 0xC05F: 0x991B, - 0xC060: 0x9921, - 0xC061: 0x991A, - 0xC062: 0x99ED, - 0xC063: 0x99E2, - 0xC064: 0x99F1, - 0xC065: 0x9AB8, - 0xC066: 0x9ABC, - 0xC067: 0x9AFB, - 0xC068: 0x9AED, - 0xC069: 0x9B28, - 0xC06A: 0x9B91, - 0xC06B: 0x9D15, - 0xC06C: 0x9D23, - 0xC06D: 0x9D26, - 0xC06E: 0x9D28, - 0xC06F: 0x9D12, - 0xC070: 0x9D1B, - 0xC071: 0x9ED8, - 0xC072: 0x9ED4, - 0xC073: 0x9F8D, - 0xC074: 0x9F9C, - 0xC075: 0x512A, - 0xC076: 0x511F, - 0xC077: 0x5121, - 0xC078: 0x5132, - 0xC079: 0x52F5, - 0xC07A: 0x568E, - 0xC07B: 0x5680, - 0xC07C: 0x5690, - 0xC07D: 0x5685, - 0xC07E: 0x5687, - 0xC0A1: 0x568F, - 0xC0A2: 0x58D5, - 0xC0A3: 0x58D3, - 0xC0A4: 0x58D1, - 0xC0A5: 0x58CE, - 0xC0A6: 0x5B30, - 0xC0A7: 0x5B2A, - 0xC0A8: 0x5B24, - 0xC0A9: 0x5B7A, - 0xC0AA: 0x5C37, - 0xC0AB: 0x5C68, - 0xC0AC: 0x5DBC, - 0xC0AD: 0x5DBA, - 0xC0AE: 0x5DBD, - 0xC0AF: 0x5DB8, - 0xC0B0: 0x5E6B, - 0xC0B1: 0x5F4C, - 0xC0B2: 0x5FBD, - 0xC0B3: 0x61C9, - 0xC0B4: 0x61C2, - 0xC0B5: 0x61C7, - 0xC0B6: 0x61E6, - 0xC0B7: 0x61CB, - 0xC0B8: 0x6232, - 0xC0B9: 0x6234, - 0xC0BA: 0x64CE, - 0xC0BB: 0x64CA, - 0xC0BC: 0x64D8, - 0xC0BD: 0x64E0, - 0xC0BE: 0x64F0, - 0xC0BF: 0x64E6, - 0xC0C0: 0x64EC, - 0xC0C1: 0x64F1, - 0xC0C2: 0x64E2, - 0xC0C3: 0x64ED, - 0xC0C4: 0x6582, - 0xC0C5: 0x6583, - 0xC0C6: 0x66D9, - 0xC0C7: 0x66D6, - 0xC0C8: 0x6A80, - 0xC0C9: 0x6A94, - 0xC0CA: 0x6A84, - 0xC0CB: 0x6AA2, - 0xC0CC: 0x6A9C, - 0xC0CD: 0x6ADB, - 0xC0CE: 0x6AA3, - 0xC0CF: 0x6A7E, - 0xC0D0: 0x6A97, - 0xC0D1: 0x6A90, - 0xC0D2: 0x6AA0, - 0xC0D3: 0x6B5C, - 0xC0D4: 0x6BAE, - 0xC0D5: 0x6BDA, - 0xC0D6: 0x6C08, - 0xC0D7: 0x6FD8, - 0xC0D8: 0x6FF1, - 0xC0D9: 0x6FDF, - 0xC0DA: 0x6FE0, - 0xC0DB: 0x6FDB, - 0xC0DC: 0x6FE4, - 0xC0DD: 0x6FEB, - 0xC0DE: 0x6FEF, - 0xC0DF: 0x6F80, - 0xC0E0: 0x6FEC, - 0xC0E1: 0x6FE1, - 0xC0E2: 0x6FE9, - 0xC0E3: 0x6FD5, - 0xC0E4: 0x6FEE, - 0xC0E5: 0x6FF0, - 0xC0E6: 0x71E7, - 0xC0E7: 0x71DF, - 0xC0E8: 0x71EE, - 0xC0E9: 0x71E6, - 0xC0EA: 0x71E5, - 0xC0EB: 0x71ED, - 0xC0EC: 0x71EC, - 0xC0ED: 0x71F4, - 0xC0EE: 0x71E0, - 0xC0EF: 0x7235, - 0xC0F0: 0x7246, - 0xC0F1: 0x7370, - 0xC0F2: 0x7372, - 0xC0F3: 0x74A9, - 0xC0F4: 0x74B0, - 0xC0F5: 0x74A6, - 0xC0F6: 0x74A8, - 0xC0F7: 0x7646, - 0xC0F8: 0x7642, - 0xC0F9: 0x764C, - 0xC0FA: 0x76EA, - 0xC0FB: 0x77B3, - 0xC0FC: 0x77AA, - 0xC0FD: 0x77B0, - 0xC0FE: 0x77AC, - 0xC140: 0x77A7, - 0xC141: 0x77AD, - 0xC142: 0x77EF, - 0xC143: 0x78F7, - 0xC144: 0x78FA, - 0xC145: 0x78F4, - 0xC146: 0x78EF, - 0xC147: 0x7901, - 0xC148: 0x79A7, - 0xC149: 0x79AA, - 0xC14A: 0x7A57, - 0xC14B: 0x7ABF, - 0xC14C: 0x7C07, - 0xC14D: 0x7C0D, - 0xC14E: 0x7BFE, - 0xC14F: 0x7BF7, - 0xC150: 0x7C0C, - 0xC151: 0x7BE0, - 0xC152: 0x7CE0, - 0xC153: 0x7CDC, - 0xC154: 0x7CDE, - 0xC155: 0x7CE2, - 0xC156: 0x7CDF, - 0xC157: 0x7CD9, - 0xC158: 0x7CDD, - 0xC159: 0x7E2E, - 0xC15A: 0x7E3E, - 0xC15B: 0x7E46, - 0xC15C: 0x7E37, - 0xC15D: 0x7E32, - 0xC15E: 0x7E43, - 0xC15F: 0x7E2B, - 0xC160: 0x7E3D, - 0xC161: 0x7E31, - 0xC162: 0x7E45, - 0xC163: 0x7E41, - 0xC164: 0x7E34, - 0xC165: 0x7E39, - 0xC166: 0x7E48, - 0xC167: 0x7E35, - 0xC168: 0x7E3F, - 0xC169: 0x7E2F, - 0xC16A: 0x7F44, - 0xC16B: 0x7FF3, - 0xC16C: 0x7FFC, - 0xC16D: 0x8071, - 0xC16E: 0x8072, - 0xC16F: 0x8070, - 0xC170: 0x806F, - 0xC171: 0x8073, - 0xC172: 0x81C6, - 0xC173: 0x81C3, - 0xC174: 0x81BA, - 0xC175: 0x81C2, - 0xC176: 0x81C0, - 0xC177: 0x81BF, - 0xC178: 0x81BD, - 0xC179: 0x81C9, - 0xC17A: 0x81BE, - 0xC17B: 0x81E8, - 0xC17C: 0x8209, - 0xC17D: 0x8271, - 0xC17E: 0x85AA, - 0xC1A1: 0x8584, - 0xC1A2: 0x857E, - 0xC1A3: 0x859C, - 0xC1A4: 0x8591, - 0xC1A5: 0x8594, - 0xC1A6: 0x85AF, - 0xC1A7: 0x859B, - 0xC1A8: 0x8587, - 0xC1A9: 0x85A8, - 0xC1AA: 0x858A, - 0xC1AB: 0x8667, - 0xC1AC: 0x87C0, - 0xC1AD: 0x87D1, - 0xC1AE: 0x87B3, - 0xC1AF: 0x87D2, - 0xC1B0: 0x87C6, - 0xC1B1: 0x87AB, - 0xC1B2: 0x87BB, - 0xC1B3: 0x87BA, - 0xC1B4: 0x87C8, - 0xC1B5: 0x87CB, - 0xC1B6: 0x893B, - 0xC1B7: 0x8936, - 0xC1B8: 0x8944, - 0xC1B9: 0x8938, - 0xC1BA: 0x893D, - 0xC1BB: 0x89AC, - 0xC1BC: 0x8B0E, - 0xC1BD: 0x8B17, - 0xC1BE: 0x8B19, - 0xC1BF: 0x8B1B, - 0xC1C0: 0x8B0A, - 0xC1C1: 0x8B20, - 0xC1C2: 0x8B1D, - 0xC1C3: 0x8B04, - 0xC1C4: 0x8B10, - 0xC1C5: 0x8C41, - 0xC1C6: 0x8C3F, - 0xC1C7: 0x8C73, - 0xC1C8: 0x8CFA, - 0xC1C9: 0x8CFD, - 0xC1CA: 0x8CFC, - 0xC1CB: 0x8CF8, - 0xC1CC: 0x8CFB, - 0xC1CD: 0x8DA8, - 0xC1CE: 0x8E49, - 0xC1CF: 0x8E4B, - 0xC1D0: 0x8E48, - 0xC1D1: 0x8E4A, - 0xC1D2: 0x8F44, - 0xC1D3: 0x8F3E, - 0xC1D4: 0x8F42, - 0xC1D5: 0x8F45, - 0xC1D6: 0x8F3F, - 0xC1D7: 0x907F, - 0xC1D8: 0x907D, - 0xC1D9: 0x9084, - 0xC1DA: 0x9081, - 0xC1DB: 0x9082, - 0xC1DC: 0x9080, - 0xC1DD: 0x9139, - 0xC1DE: 0x91A3, - 0xC1DF: 0x919E, - 0xC1E0: 0x919C, - 0xC1E1: 0x934D, - 0xC1E2: 0x9382, - 0xC1E3: 0x9328, - 0xC1E4: 0x9375, - 0xC1E5: 0x934A, - 0xC1E6: 0x9365, - 0xC1E7: 0x934B, - 0xC1E8: 0x9318, - 0xC1E9: 0x937E, - 0xC1EA: 0x936C, - 0xC1EB: 0x935B, - 0xC1EC: 0x9370, - 0xC1ED: 0x935A, - 0xC1EE: 0x9354, - 0xC1EF: 0x95CA, - 0xC1F0: 0x95CB, - 0xC1F1: 0x95CC, - 0xC1F2: 0x95C8, - 0xC1F3: 0x95C6, - 0xC1F4: 0x96B1, - 0xC1F5: 0x96B8, - 0xC1F6: 0x96D6, - 0xC1F7: 0x971C, - 0xC1F8: 0x971E, - 0xC1F9: 0x97A0, - 0xC1FA: 0x97D3, - 0xC1FB: 0x9846, - 0xC1FC: 0x98B6, - 0xC1FD: 0x9935, - 0xC1FE: 0x9A01, - 0xC240: 0x99FF, - 0xC241: 0x9BAE, - 0xC242: 0x9BAB, - 0xC243: 0x9BAA, - 0xC244: 0x9BAD, - 0xC245: 0x9D3B, - 0xC246: 0x9D3F, - 0xC247: 0x9E8B, - 0xC248: 0x9ECF, - 0xC249: 0x9EDE, - 0xC24A: 0x9EDC, - 0xC24B: 0x9EDD, - 0xC24C: 0x9EDB, - 0xC24D: 0x9F3E, - 0xC24E: 0x9F4B, - 0xC24F: 0x53E2, - 0xC250: 0x5695, - 0xC251: 0x56AE, - 0xC252: 0x58D9, - 0xC253: 0x58D8, - 0xC254: 0x5B38, - 0xC255: 0x5F5D, - 0xC256: 0x61E3, - 0xC257: 0x6233, - 0xC258: 0x64F4, - 0xC259: 0x64F2, - 0xC25A: 0x64FE, - 0xC25B: 0x6506, - 0xC25C: 0x64FA, - 0xC25D: 0x64FB, - 0xC25E: 0x64F7, - 0xC25F: 0x65B7, - 0xC260: 0x66DC, - 0xC261: 0x6726, - 0xC262: 0x6AB3, - 0xC263: 0x6AAC, - 0xC264: 0x6AC3, - 0xC265: 0x6ABB, - 0xC266: 0x6AB8, - 0xC267: 0x6AC2, - 0xC268: 0x6AAE, - 0xC269: 0x6AAF, - 0xC26A: 0x6B5F, - 0xC26B: 0x6B78, - 0xC26C: 0x6BAF, - 0xC26D: 0x7009, - 0xC26E: 0x700B, - 0xC26F: 0x6FFE, - 0xC270: 0x7006, - 0xC271: 0x6FFA, - 0xC272: 0x7011, - 0xC273: 0x700F, - 0xC274: 0x71FB, - 0xC275: 0x71FC, - 0xC276: 0x71FE, - 0xC277: 0x71F8, - 0xC278: 0x7377, - 0xC279: 0x7375, - 0xC27A: 0x74A7, - 0xC27B: 0x74BF, - 0xC27C: 0x7515, - 0xC27D: 0x7656, - 0xC27E: 0x7658, - 0xC2A1: 0x7652, - 0xC2A2: 0x77BD, - 0xC2A3: 0x77BF, - 0xC2A4: 0x77BB, - 0xC2A5: 0x77BC, - 0xC2A6: 0x790E, - 0xC2A7: 0x79AE, - 0xC2A8: 0x7A61, - 0xC2A9: 0x7A62, - 0xC2AA: 0x7A60, - 0xC2AB: 0x7AC4, - 0xC2AC: 0x7AC5, - 0xC2AD: 0x7C2B, - 0xC2AE: 0x7C27, - 0xC2AF: 0x7C2A, - 0xC2B0: 0x7C1E, - 0xC2B1: 0x7C23, - 0xC2B2: 0x7C21, - 0xC2B3: 0x7CE7, - 0xC2B4: 0x7E54, - 0xC2B5: 0x7E55, - 0xC2B6: 0x7E5E, - 0xC2B7: 0x7E5A, - 0xC2B8: 0x7E61, - 0xC2B9: 0x7E52, - 0xC2BA: 0x7E59, - 0xC2BB: 0x7F48, - 0xC2BC: 0x7FF9, - 0xC2BD: 0x7FFB, - 0xC2BE: 0x8077, - 0xC2BF: 0x8076, - 0xC2C0: 0x81CD, - 0xC2C1: 0x81CF, - 0xC2C2: 0x820A, - 0xC2C3: 0x85CF, - 0xC2C4: 0x85A9, - 0xC2C5: 0x85CD, - 0xC2C6: 0x85D0, - 0xC2C7: 0x85C9, - 0xC2C8: 0x85B0, - 0xC2C9: 0x85BA, - 0xC2CA: 0x85B9, - 0xC2CB: 0x85A6, - 0xC2CC: 0x87EF, - 0xC2CD: 0x87EC, - 0xC2CE: 0x87F2, - 0xC2CF: 0x87E0, - 0xC2D0: 0x8986, - 0xC2D1: 0x89B2, - 0xC2D2: 0x89F4, - 0xC2D3: 0x8B28, - 0xC2D4: 0x8B39, - 0xC2D5: 0x8B2C, - 0xC2D6: 0x8B2B, - 0xC2D7: 0x8C50, - 0xC2D8: 0x8D05, - 0xC2D9: 0x8E59, - 0xC2DA: 0x8E63, - 0xC2DB: 0x8E66, - 0xC2DC: 0x8E64, - 0xC2DD: 0x8E5F, - 0xC2DE: 0x8E55, - 0xC2DF: 0x8EC0, - 0xC2E0: 0x8F49, - 0xC2E1: 0x8F4D, - 0xC2E2: 0x9087, - 0xC2E3: 0x9083, - 0xC2E4: 0x9088, - 0xC2E5: 0x91AB, - 0xC2E6: 0x91AC, - 0xC2E7: 0x91D0, - 0xC2E8: 0x9394, - 0xC2E9: 0x938A, - 0xC2EA: 0x9396, - 0xC2EB: 0x93A2, - 0xC2EC: 0x93B3, - 0xC2ED: 0x93AE, - 0xC2EE: 0x93AC, - 0xC2EF: 0x93B0, - 0xC2F0: 0x9398, - 0xC2F1: 0x939A, - 0xC2F2: 0x9397, - 0xC2F3: 0x95D4, - 0xC2F4: 0x95D6, - 0xC2F5: 0x95D0, - 0xC2F6: 0x95D5, - 0xC2F7: 0x96E2, - 0xC2F8: 0x96DC, - 0xC2F9: 0x96D9, - 0xC2FA: 0x96DB, - 0xC2FB: 0x96DE, - 0xC2FC: 0x9724, - 0xC2FD: 0x97A3, - 0xC2FE: 0x97A6, - 0xC340: 0x97AD, - 0xC341: 0x97F9, - 0xC342: 0x984D, - 0xC343: 0x984F, - 0xC344: 0x984C, - 0xC345: 0x984E, - 0xC346: 0x9853, - 0xC347: 0x98BA, - 0xC348: 0x993E, - 0xC349: 0x993F, - 0xC34A: 0x993D, - 0xC34B: 0x992E, - 0xC34C: 0x99A5, - 0xC34D: 0x9A0E, - 0xC34E: 0x9AC1, - 0xC34F: 0x9B03, - 0xC350: 0x9B06, - 0xC351: 0x9B4F, - 0xC352: 0x9B4E, - 0xC353: 0x9B4D, - 0xC354: 0x9BCA, - 0xC355: 0x9BC9, - 0xC356: 0x9BFD, - 0xC357: 0x9BC8, - 0xC358: 0x9BC0, - 0xC359: 0x9D51, - 0xC35A: 0x9D5D, - 0xC35B: 0x9D60, - 0xC35C: 0x9EE0, - 0xC35D: 0x9F15, - 0xC35E: 0x9F2C, - 0xC35F: 0x5133, - 0xC360: 0x56A5, - 0xC361: 0x58DE, - 0xC362: 0x58DF, - 0xC363: 0x58E2, - 0xC364: 0x5BF5, - 0xC365: 0x9F90, - 0xC366: 0x5EEC, - 0xC367: 0x61F2, - 0xC368: 0x61F7, - 0xC369: 0x61F6, - 0xC36A: 0x61F5, - 0xC36B: 0x6500, - 0xC36C: 0x650F, - 0xC36D: 0x66E0, - 0xC36E: 0x66DD, - 0xC36F: 0x6AE5, - 0xC370: 0x6ADD, - 0xC371: 0x6ADA, - 0xC372: 0x6AD3, - 0xC373: 0x701B, - 0xC374: 0x701F, - 0xC375: 0x7028, - 0xC376: 0x701A, - 0xC377: 0x701D, - 0xC378: 0x7015, - 0xC379: 0x7018, - 0xC37A: 0x7206, - 0xC37B: 0x720D, - 0xC37C: 0x7258, - 0xC37D: 0x72A2, - 0xC37E: 0x7378, - 0xC3A1: 0x737A, - 0xC3A2: 0x74BD, - 0xC3A3: 0x74CA, - 0xC3A4: 0x74E3, - 0xC3A5: 0x7587, - 0xC3A6: 0x7586, - 0xC3A7: 0x765F, - 0xC3A8: 0x7661, - 0xC3A9: 0x77C7, - 0xC3AA: 0x7919, - 0xC3AB: 0x79B1, - 0xC3AC: 0x7A6B, - 0xC3AD: 0x7A69, - 0xC3AE: 0x7C3E, - 0xC3AF: 0x7C3F, - 0xC3B0: 0x7C38, - 0xC3B1: 0x7C3D, - 0xC3B2: 0x7C37, - 0xC3B3: 0x7C40, - 0xC3B4: 0x7E6B, - 0xC3B5: 0x7E6D, - 0xC3B6: 0x7E79, - 0xC3B7: 0x7E69, - 0xC3B8: 0x7E6A, - 0xC3B9: 0x7F85, - 0xC3BA: 0x7E73, - 0xC3BB: 0x7FB6, - 0xC3BC: 0x7FB9, - 0xC3BD: 0x7FB8, - 0xC3BE: 0x81D8, - 0xC3BF: 0x85E9, - 0xC3C0: 0x85DD, - 0xC3C1: 0x85EA, - 0xC3C2: 0x85D5, - 0xC3C3: 0x85E4, - 0xC3C4: 0x85E5, - 0xC3C5: 0x85F7, - 0xC3C6: 0x87FB, - 0xC3C7: 0x8805, - 0xC3C8: 0x880D, - 0xC3C9: 0x87F9, - 0xC3CA: 0x87FE, - 0xC3CB: 0x8960, - 0xC3CC: 0x895F, - 0xC3CD: 0x8956, - 0xC3CE: 0x895E, - 0xC3CF: 0x8B41, - 0xC3D0: 0x8B5C, - 0xC3D1: 0x8B58, - 0xC3D2: 0x8B49, - 0xC3D3: 0x8B5A, - 0xC3D4: 0x8B4E, - 0xC3D5: 0x8B4F, - 0xC3D6: 0x8B46, - 0xC3D7: 0x8B59, - 0xC3D8: 0x8D08, - 0xC3D9: 0x8D0A, - 0xC3DA: 0x8E7C, - 0xC3DB: 0x8E72, - 0xC3DC: 0x8E87, - 0xC3DD: 0x8E76, - 0xC3DE: 0x8E6C, - 0xC3DF: 0x8E7A, - 0xC3E0: 0x8E74, - 0xC3E1: 0x8F54, - 0xC3E2: 0x8F4E, - 0xC3E3: 0x8FAD, - 0xC3E4: 0x908A, - 0xC3E5: 0x908B, - 0xC3E6: 0x91B1, - 0xC3E7: 0x91AE, - 0xC3E8: 0x93E1, - 0xC3E9: 0x93D1, - 0xC3EA: 0x93DF, - 0xC3EB: 0x93C3, - 0xC3EC: 0x93C8, - 0xC3ED: 0x93DC, - 0xC3EE: 0x93DD, - 0xC3EF: 0x93D6, - 0xC3F0: 0x93E2, - 0xC3F1: 0x93CD, - 0xC3F2: 0x93D8, - 0xC3F3: 0x93E4, - 0xC3F4: 0x93D7, - 0xC3F5: 0x93E8, - 0xC3F6: 0x95DC, - 0xC3F7: 0x96B4, - 0xC3F8: 0x96E3, - 0xC3F9: 0x972A, - 0xC3FA: 0x9727, - 0xC3FB: 0x9761, - 0xC3FC: 0x97DC, - 0xC3FD: 0x97FB, - 0xC3FE: 0x985E, - 0xC440: 0x9858, - 0xC441: 0x985B, - 0xC442: 0x98BC, - 0xC443: 0x9945, - 0xC444: 0x9949, - 0xC445: 0x9A16, - 0xC446: 0x9A19, - 0xC447: 0x9B0D, - 0xC448: 0x9BE8, - 0xC449: 0x9BE7, - 0xC44A: 0x9BD6, - 0xC44B: 0x9BDB, - 0xC44C: 0x9D89, - 0xC44D: 0x9D61, - 0xC44E: 0x9D72, - 0xC44F: 0x9D6A, - 0xC450: 0x9D6C, - 0xC451: 0x9E92, - 0xC452: 0x9E97, - 0xC453: 0x9E93, - 0xC454: 0x9EB4, - 0xC455: 0x52F8, - 0xC456: 0x56A8, - 0xC457: 0x56B7, - 0xC458: 0x56B6, - 0xC459: 0x56B4, - 0xC45A: 0x56BC, - 0xC45B: 0x58E4, - 0xC45C: 0x5B40, - 0xC45D: 0x5B43, - 0xC45E: 0x5B7D, - 0xC45F: 0x5BF6, - 0xC460: 0x5DC9, - 0xC461: 0x61F8, - 0xC462: 0x61FA, - 0xC463: 0x6518, - 0xC464: 0x6514, - 0xC465: 0x6519, - 0xC466: 0x66E6, - 0xC467: 0x6727, - 0xC468: 0x6AEC, - 0xC469: 0x703E, - 0xC46A: 0x7030, - 0xC46B: 0x7032, - 0xC46C: 0x7210, - 0xC46D: 0x737B, - 0xC46E: 0x74CF, - 0xC46F: 0x7662, - 0xC470: 0x7665, - 0xC471: 0x7926, - 0xC472: 0x792A, - 0xC473: 0x792C, - 0xC474: 0x792B, - 0xC475: 0x7AC7, - 0xC476: 0x7AF6, - 0xC477: 0x7C4C, - 0xC478: 0x7C43, - 0xC479: 0x7C4D, - 0xC47A: 0x7CEF, - 0xC47B: 0x7CF0, - 0xC47C: 0x8FAE, - 0xC47D: 0x7E7D, - 0xC47E: 0x7E7C, - 0xC4A1: 0x7E82, - 0xC4A2: 0x7F4C, - 0xC4A3: 0x8000, - 0xC4A4: 0x81DA, - 0xC4A5: 0x8266, - 0xC4A6: 0x85FB, - 0xC4A7: 0x85F9, - 0xC4A8: 0x8611, - 0xC4A9: 0x85FA, - 0xC4AA: 0x8606, - 0xC4AB: 0x860B, - 0xC4AC: 0x8607, - 0xC4AD: 0x860A, - 0xC4AE: 0x8814, - 0xC4AF: 0x8815, - 0xC4B0: 0x8964, - 0xC4B1: 0x89BA, - 0xC4B2: 0x89F8, - 0xC4B3: 0x8B70, - 0xC4B4: 0x8B6C, - 0xC4B5: 0x8B66, - 0xC4B6: 0x8B6F, - 0xC4B7: 0x8B5F, - 0xC4B8: 0x8B6B, - 0xC4B9: 0x8D0F, - 0xC4BA: 0x8D0D, - 0xC4BB: 0x8E89, - 0xC4BC: 0x8E81, - 0xC4BD: 0x8E85, - 0xC4BE: 0x8E82, - 0xC4BF: 0x91B4, - 0xC4C0: 0x91CB, - 0xC4C1: 0x9418, - 0xC4C2: 0x9403, - 0xC4C3: 0x93FD, - 0xC4C4: 0x95E1, - 0xC4C5: 0x9730, - 0xC4C6: 0x98C4, - 0xC4C7: 0x9952, - 0xC4C8: 0x9951, - 0xC4C9: 0x99A8, - 0xC4CA: 0x9A2B, - 0xC4CB: 0x9A30, - 0xC4CC: 0x9A37, - 0xC4CD: 0x9A35, - 0xC4CE: 0x9C13, - 0xC4CF: 0x9C0D, - 0xC4D0: 0x9E79, - 0xC4D1: 0x9EB5, - 0xC4D2: 0x9EE8, - 0xC4D3: 0x9F2F, - 0xC4D4: 0x9F5F, - 0xC4D5: 0x9F63, - 0xC4D6: 0x9F61, - 0xC4D7: 0x5137, - 0xC4D8: 0x5138, - 0xC4D9: 0x56C1, - 0xC4DA: 0x56C0, - 0xC4DB: 0x56C2, - 0xC4DC: 0x5914, - 0xC4DD: 0x5C6C, - 0xC4DE: 0x5DCD, - 0xC4DF: 0x61FC, - 0xC4E0: 0x61FE, - 0xC4E1: 0x651D, - 0xC4E2: 0x651C, - 0xC4E3: 0x6595, - 0xC4E4: 0x66E9, - 0xC4E5: 0x6AFB, - 0xC4E6: 0x6B04, - 0xC4E7: 0x6AFA, - 0xC4E8: 0x6BB2, - 0xC4E9: 0x704C, - 0xC4EA: 0x721B, - 0xC4EB: 0x72A7, - 0xC4EC: 0x74D6, - 0xC4ED: 0x74D4, - 0xC4EE: 0x7669, - 0xC4EF: 0x77D3, - 0xC4F0: 0x7C50, - 0xC4F1: 0x7E8F, - 0xC4F2: 0x7E8C, - 0xC4F3: 0x7FBC, - 0xC4F4: 0x8617, - 0xC4F5: 0x862D, - 0xC4F6: 0x861A, - 0xC4F7: 0x8823, - 0xC4F8: 0x8822, - 0xC4F9: 0x8821, - 0xC4FA: 0x881F, - 0xC4FB: 0x896A, - 0xC4FC: 0x896C, - 0xC4FD: 0x89BD, - 0xC4FE: 0x8B74, - 0xC540: 0x8B77, - 0xC541: 0x8B7D, - 0xC542: 0x8D13, - 0xC543: 0x8E8A, - 0xC544: 0x8E8D, - 0xC545: 0x8E8B, - 0xC546: 0x8F5F, - 0xC547: 0x8FAF, - 0xC548: 0x91BA, - 0xC549: 0x942E, - 0xC54A: 0x9433, - 0xC54B: 0x9435, - 0xC54C: 0x943A, - 0xC54D: 0x9438, - 0xC54E: 0x9432, - 0xC54F: 0x942B, - 0xC550: 0x95E2, - 0xC551: 0x9738, - 0xC552: 0x9739, - 0xC553: 0x9732, - 0xC554: 0x97FF, - 0xC555: 0x9867, - 0xC556: 0x9865, - 0xC557: 0x9957, - 0xC558: 0x9A45, - 0xC559: 0x9A43, - 0xC55A: 0x9A40, - 0xC55B: 0x9A3E, - 0xC55C: 0x9ACF, - 0xC55D: 0x9B54, - 0xC55E: 0x9B51, - 0xC55F: 0x9C2D, - 0xC560: 0x9C25, - 0xC561: 0x9DAF, - 0xC562: 0x9DB4, - 0xC563: 0x9DC2, - 0xC564: 0x9DB8, - 0xC565: 0x9E9D, - 0xC566: 0x9EEF, - 0xC567: 0x9F19, - 0xC568: 0x9F5C, - 0xC569: 0x9F66, - 0xC56A: 0x9F67, - 0xC56B: 0x513C, - 0xC56C: 0x513B, - 0xC56D: 0x56C8, - 0xC56E: 0x56CA, - 0xC56F: 0x56C9, - 0xC570: 0x5B7F, - 0xC571: 0x5DD4, - 0xC572: 0x5DD2, - 0xC573: 0x5F4E, - 0xC574: 0x61FF, - 0xC575: 0x6524, - 0xC576: 0x6B0A, - 0xC577: 0x6B61, - 0xC578: 0x7051, - 0xC579: 0x7058, - 0xC57A: 0x7380, - 0xC57B: 0x74E4, - 0xC57C: 0x758A, - 0xC57D: 0x766E, - 0xC57E: 0x766C, - 0xC5A1: 0x79B3, - 0xC5A2: 0x7C60, - 0xC5A3: 0x7C5F, - 0xC5A4: 0x807E, - 0xC5A5: 0x807D, - 0xC5A6: 0x81DF, - 0xC5A7: 0x8972, - 0xC5A8: 0x896F, - 0xC5A9: 0x89FC, - 0xC5AA: 0x8B80, - 0xC5AB: 0x8D16, - 0xC5AC: 0x8D17, - 0xC5AD: 0x8E91, - 0xC5AE: 0x8E93, - 0xC5AF: 0x8F61, - 0xC5B0: 0x9148, - 0xC5B1: 0x9444, - 0xC5B2: 0x9451, - 0xC5B3: 0x9452, - 0xC5B4: 0x973D, - 0xC5B5: 0x973E, - 0xC5B6: 0x97C3, - 0xC5B7: 0x97C1, - 0xC5B8: 0x986B, - 0xC5B9: 0x9955, - 0xC5BA: 0x9A55, - 0xC5BB: 0x9A4D, - 0xC5BC: 0x9AD2, - 0xC5BD: 0x9B1A, - 0xC5BE: 0x9C49, - 0xC5BF: 0x9C31, - 0xC5C0: 0x9C3E, - 0xC5C1: 0x9C3B, - 0xC5C2: 0x9DD3, - 0xC5C3: 0x9DD7, - 0xC5C4: 0x9F34, - 0xC5C5: 0x9F6C, - 0xC5C6: 0x9F6A, - 0xC5C7: 0x9F94, - 0xC5C8: 0x56CC, - 0xC5C9: 0x5DD6, - 0xC5CA: 0x6200, - 0xC5CB: 0x6523, - 0xC5CC: 0x652B, - 0xC5CD: 0x652A, - 0xC5CE: 0x66EC, - 0xC5CF: 0x6B10, - 0xC5D0: 0x74DA, - 0xC5D1: 0x7ACA, - 0xC5D2: 0x7C64, - 0xC5D3: 0x7C63, - 0xC5D4: 0x7C65, - 0xC5D5: 0x7E93, - 0xC5D6: 0x7E96, - 0xC5D7: 0x7E94, - 0xC5D8: 0x81E2, - 0xC5D9: 0x8638, - 0xC5DA: 0x863F, - 0xC5DB: 0x8831, - 0xC5DC: 0x8B8A, - 0xC5DD: 0x9090, - 0xC5DE: 0x908F, - 0xC5DF: 0x9463, - 0xC5E0: 0x9460, - 0xC5E1: 0x9464, - 0xC5E2: 0x9768, - 0xC5E3: 0x986F, - 0xC5E4: 0x995C, - 0xC5E5: 0x9A5A, - 0xC5E6: 0x9A5B, - 0xC5E7: 0x9A57, - 0xC5E8: 0x9AD3, - 0xC5E9: 0x9AD4, - 0xC5EA: 0x9AD1, - 0xC5EB: 0x9C54, - 0xC5EC: 0x9C57, - 0xC5ED: 0x9C56, - 0xC5EE: 0x9DE5, - 0xC5EF: 0x9E9F, - 0xC5F0: 0x9EF4, - 0xC5F1: 0x56D1, - 0xC5F2: 0x58E9, - 0xC5F3: 0x652C, - 0xC5F4: 0x705E, - 0xC5F5: 0x7671, - 0xC5F6: 0x7672, - 0xC5F7: 0x77D7, - 0xC5F8: 0x7F50, - 0xC5F9: 0x7F88, - 0xC5FA: 0x8836, - 0xC5FB: 0x8839, - 0xC5FC: 0x8862, - 0xC5FD: 0x8B93, - 0xC5FE: 0x8B92, - 0xC640: 0x8B96, - 0xC641: 0x8277, - 0xC642: 0x8D1B, - 0xC643: 0x91C0, - 0xC644: 0x946A, - 0xC645: 0x9742, - 0xC646: 0x9748, - 0xC647: 0x9744, - 0xC648: 0x97C6, - 0xC649: 0x9870, - 0xC64A: 0x9A5F, - 0xC64B: 0x9B22, - 0xC64C: 0x9B58, - 0xC64D: 0x9C5F, - 0xC64E: 0x9DF9, - 0xC64F: 0x9DFA, - 0xC650: 0x9E7C, - 0xC651: 0x9E7D, - 0xC652: 0x9F07, - 0xC653: 0x9F77, - 0xC654: 0x9F72, - 0xC655: 0x5EF3, - 0xC656: 0x6B16, - 0xC657: 0x7063, - 0xC658: 0x7C6C, - 0xC659: 0x7C6E, - 0xC65A: 0x883B, - 0xC65B: 0x89C0, - 0xC65C: 0x8EA1, - 0xC65D: 0x91C1, - 0xC65E: 0x9472, - 0xC65F: 0x9470, - 0xC660: 0x9871, - 0xC661: 0x995E, - 0xC662: 0x9AD6, - 0xC663: 0x9B23, - 0xC664: 0x9ECC, - 0xC665: 0x7064, - 0xC666: 0x77DA, - 0xC667: 0x8B9A, - 0xC668: 0x9477, - 0xC669: 0x97C9, - 0xC66A: 0x9A62, - 0xC66B: 0x9A65, - 0xC66C: 0x7E9C, - 0xC66D: 0x8B9C, - 0xC66E: 0x8EAA, - 0xC66F: 0x91C5, - 0xC670: 0x947D, - 0xC671: 0x947E, - 0xC672: 0x947C, - 0xC673: 0x9C77, - 0xC674: 0x9C78, - 0xC675: 0x9EF7, - 0xC676: 0x8C54, - 0xC677: 0x947F, - 0xC678: 0x9E1A, - 0xC679: 0x7228, - 0xC67A: 0x9A6A, - 0xC67B: 0x9B31, - 0xC67C: 0x9E1B, - 0xC67D: 0x9E1E, - 0xC67E: 0x7C72, - 0xC6A1: 0x30FE, // KATAKANA VOICED ITERATION MARK - 0xC6A2: 0x309D, // HIRAGANA ITERATION MARK - 0xC6A3: 0x309E, // HIRAGANA VOICED ITERATION MARK - 0xC6A4: 0x3005, // IDEOGRAPHIC ITERATION MARK - 0xC6A5: 0x3041, // HIRAGANA LETTER SMALL A - 0xC6A6: 0x3042, // HIRAGANA LETTER A - 0xC6A7: 0x3043, // HIRAGANA LETTER SMALL I - 0xC6A8: 0x3044, // HIRAGANA LETTER I - 0xC6A9: 0x3045, // HIRAGANA LETTER SMALL U - 0xC6AA: 0x3046, // HIRAGANA LETTER U - 0xC6AB: 0x3047, // HIRAGANA LETTER SMALL E - 0xC6AC: 0x3048, // HIRAGANA LETTER E - 0xC6AD: 0x3049, // HIRAGANA LETTER SMALL O - 0xC6AE: 0x304A, // HIRAGANA LETTER O - 0xC6AF: 0x304B, // HIRAGANA LETTER KA - 0xC6B0: 0x304C, // HIRAGANA LETTER GA - 0xC6B1: 0x304D, // HIRAGANA LETTER KI - 0xC6B2: 0x304E, // HIRAGANA LETTER GI - 0xC6B3: 0x304F, // HIRAGANA LETTER KU - 0xC6B4: 0x3050, // HIRAGANA LETTER GU - 0xC6B5: 0x3051, // HIRAGANA LETTER KE - 0xC6B6: 0x3052, // HIRAGANA LETTER GE - 0xC6B7: 0x3053, // HIRAGANA LETTER KO - 0xC6B8: 0x3054, // HIRAGANA LETTER GO - 0xC6B9: 0x3055, // HIRAGANA LETTER SA - 0xC6BA: 0x3056, // HIRAGANA LETTER ZA - 0xC6BB: 0x3057, // HIRAGANA LETTER SI - 0xC6BC: 0x3058, // HIRAGANA LETTER ZI - 0xC6BD: 0x3059, // HIRAGANA LETTER SU - 0xC6BE: 0x305A, // HIRAGANA LETTER ZU - 0xC6BF: 0x305B, // HIRAGANA LETTER SE - 0xC6C0: 0x305C, // HIRAGANA LETTER ZE - 0xC6C1: 0x305D, // HIRAGANA LETTER SO - 0xC6C2: 0x305E, // HIRAGANA LETTER ZO - 0xC6C3: 0x305F, // HIRAGANA LETTER TA - 0xC6C4: 0x3060, // HIRAGANA LETTER DA - 0xC6C5: 0x3061, // HIRAGANA LETTER TI - 0xC6C6: 0x3062, // HIRAGANA LETTER DI - 0xC6C7: 0x3063, // HIRAGANA LETTER SMALL TU - 0xC6C8: 0x3064, // HIRAGANA LETTER TU - 0xC6C9: 0x3065, // HIRAGANA LETTER DU - 0xC6CA: 0x3066, // HIRAGANA LETTER TE - 0xC6CB: 0x3067, // HIRAGANA LETTER DE - 0xC6CC: 0x3068, // HIRAGANA LETTER TO - 0xC6CD: 0x3069, // HIRAGANA LETTER DO - 0xC6CE: 0x306A, // HIRAGANA LETTER NA - 0xC6CF: 0x306B, // HIRAGANA LETTER NI - 0xC6D0: 0x306C, // HIRAGANA LETTER NU - 0xC6D1: 0x306D, // HIRAGANA LETTER NE - 0xC6D2: 0x306E, // HIRAGANA LETTER NO - 0xC6D3: 0x306F, // HIRAGANA LETTER HA - 0xC6D4: 0x3070, // HIRAGANA LETTER BA - 0xC6D5: 0x3071, // HIRAGANA LETTER PA - 0xC6D6: 0x3072, // HIRAGANA LETTER HI - 0xC6D7: 0x3073, // HIRAGANA LETTER BI - 0xC6D8: 0x3074, // HIRAGANA LETTER PI - 0xC6D9: 0x3075, // HIRAGANA LETTER HU - 0xC6DA: 0x3076, // HIRAGANA LETTER BU - 0xC6DB: 0x3077, // HIRAGANA LETTER PU - 0xC6DC: 0x3078, // HIRAGANA LETTER HE - 0xC6DD: 0x3079, // HIRAGANA LETTER BE - 0xC6DE: 0x307A, // HIRAGANA LETTER PE - 0xC6DF: 0x307B, // HIRAGANA LETTER HO - 0xC6E0: 0x307C, // HIRAGANA LETTER BO - 0xC6E1: 0x307D, // HIRAGANA LETTER PO - 0xC6E2: 0x307E, // HIRAGANA LETTER MA - 0xC6E3: 0x307F, // HIRAGANA LETTER MI - 0xC6E4: 0x3080, // HIRAGANA LETTER MU - 0xC6E5: 0x3081, // HIRAGANA LETTER ME - 0xC6E6: 0x3082, // HIRAGANA LETTER MO - 0xC6E7: 0x3083, // HIRAGANA LETTER SMALL YA - 0xC6E8: 0x3084, // HIRAGANA LETTER YA - 0xC6E9: 0x3085, // HIRAGANA LETTER SMALL YU - 0xC6EA: 0x3086, // HIRAGANA LETTER YU - 0xC6EB: 0x3087, // HIRAGANA LETTER SMALL YO - 0xC6EC: 0x3088, // HIRAGANA LETTER YO - 0xC6ED: 0x3089, // HIRAGANA LETTER RA - 0xC6EE: 0x308A, // HIRAGANA LETTER RI - 0xC6EF: 0x308B, // HIRAGANA LETTER RU - 0xC6F0: 0x308C, // HIRAGANA LETTER RE - 0xC6F1: 0x308D, // HIRAGANA LETTER RO - 0xC6F2: 0x308E, // HIRAGANA LETTER SMALL WA - 0xC6F3: 0x308F, // HIRAGANA LETTER WA - 0xC6F4: 0x3090, // HIRAGANA LETTER WI - 0xC6F5: 0x3091, // HIRAGANA LETTER WE - 0xC6F6: 0x3092, // HIRAGANA LETTER WO - 0xC6F7: 0x3093, // HIRAGANA LETTER N - 0xC6F8: 0x30A1, // KATAKANA LETTER SMALL A - 0xC6F9: 0x30A2, // KATAKANA LETTER A - 0xC6FA: 0x30A3, // KATAKANA LETTER SMALL I - 0xC6FB: 0x30A4, // KATAKANA LETTER I - 0xC6FC: 0x30A5, // KATAKANA LETTER SMALL U - 0xC6FD: 0x30A6, // KATAKANA LETTER U - 0xC6FE: 0x30A7, // KATAKANA LETTER SMALL E - 0xC740: 0x30A8, // KATAKANA LETTER E - 0xC741: 0x30A9, // KATAKANA LETTER SMALL O - 0xC742: 0x30AA, // KATAKANA LETTER O - 0xC743: 0x30AB, // KATAKANA LETTER KA - 0xC744: 0x30AC, // KATAKANA LETTER GA - 0xC745: 0x30AD, // KATAKANA LETTER KI - 0xC746: 0x30AE, // KATAKANA LETTER GI - 0xC747: 0x30AF, // KATAKANA LETTER KU - 0xC748: 0x30B0, // KATAKANA LETTER GU - 0xC749: 0x30B1, // KATAKANA LETTER KE - 0xC74A: 0x30B2, // KATAKANA LETTER GE - 0xC74B: 0x30B3, // KATAKANA LETTER KO - 0xC74C: 0x30B4, // KATAKANA LETTER GO - 0xC74D: 0x30B5, // KATAKANA LETTER SA - 0xC74E: 0x30B6, // KATAKANA LETTER ZA - 0xC74F: 0x30B7, // KATAKANA LETTER SI - 0xC750: 0x30B8, // KATAKANA LETTER ZI - 0xC751: 0x30B9, // KATAKANA LETTER SU - 0xC752: 0x30BA, // KATAKANA LETTER ZU - 0xC753: 0x30BB, // KATAKANA LETTER SE - 0xC754: 0x30BC, // KATAKANA LETTER ZE - 0xC755: 0x30BD, // KATAKANA LETTER SO - 0xC756: 0x30BE, // KATAKANA LETTER ZO - 0xC757: 0x30BF, // KATAKANA LETTER TA - 0xC758: 0x30C0, // KATAKANA LETTER DA - 0xC759: 0x30C1, // KATAKANA LETTER TI - 0xC75A: 0x30C2, // KATAKANA LETTER DI - 0xC75B: 0x30C3, // KATAKANA LETTER SMALL TU - 0xC75C: 0x30C4, // KATAKANA LETTER TU - 0xC75D: 0x30C5, // KATAKANA LETTER DU - 0xC75E: 0x30C6, // KATAKANA LETTER TE - 0xC75F: 0x30C7, // KATAKANA LETTER DE - 0xC760: 0x30C8, // KATAKANA LETTER TO - 0xC761: 0x30C9, // KATAKANA LETTER DO - 0xC762: 0x30CA, // KATAKANA LETTER NA - 0xC763: 0x30CB, // KATAKANA LETTER NI - 0xC764: 0x30CC, // KATAKANA LETTER NU - 0xC765: 0x30CD, // KATAKANA LETTER NE - 0xC766: 0x30CE, // KATAKANA LETTER NO - 0xC767: 0x30CF, // KATAKANA LETTER HA - 0xC768: 0x30D0, // KATAKANA LETTER BA - 0xC769: 0x30D1, // KATAKANA LETTER PA - 0xC76A: 0x30D2, // KATAKANA LETTER HI - 0xC76B: 0x30D3, // KATAKANA LETTER BI - 0xC76C: 0x30D4, // KATAKANA LETTER PI - 0xC76D: 0x30D5, // KATAKANA LETTER HU - 0xC76E: 0x30D6, // KATAKANA LETTER BU - 0xC76F: 0x30D7, // KATAKANA LETTER PU - 0xC770: 0x30D8, // KATAKANA LETTER HE - 0xC771: 0x30D9, // KATAKANA LETTER BE - 0xC772: 0x30DA, // KATAKANA LETTER PE - 0xC773: 0x30DB, // KATAKANA LETTER HO - 0xC774: 0x30DC, // KATAKANA LETTER BO - 0xC775: 0x30DD, // KATAKANA LETTER PO - 0xC776: 0x30DE, // KATAKANA LETTER MA - 0xC777: 0x30DF, // KATAKANA LETTER MI - 0xC778: 0x30E0, // KATAKANA LETTER MU - 0xC779: 0x30E1, // KATAKANA LETTER ME - 0xC77A: 0x30E2, // KATAKANA LETTER MO - 0xC77B: 0x30E3, // KATAKANA LETTER SMALL YA - 0xC77C: 0x30E4, // KATAKANA LETTER YA - 0xC77D: 0x30E5, // KATAKANA LETTER SMALL YU - 0xC77E: 0x30E6, // KATAKANA LETTER YU - 0xC7A1: 0x30E7, // KATAKANA LETTER SMALL YO - 0xC7A2: 0x30E8, // KATAKANA LETTER YO - 0xC7A3: 0x30E9, // KATAKANA LETTER RA - 0xC7A4: 0x30EA, // KATAKANA LETTER RI - 0xC7A5: 0x30EB, // KATAKANA LETTER RU - 0xC7A6: 0x30EC, // KATAKANA LETTER RE - 0xC7A7: 0x30ED, // KATAKANA LETTER RO - 0xC7A8: 0x30EE, // KATAKANA LETTER SMALL WA - 0xC7A9: 0x30EF, // KATAKANA LETTER WA - 0xC7AA: 0x30F0, // KATAKANA LETTER WI - 0xC7AB: 0x30F1, // KATAKANA LETTER WE - 0xC7AC: 0x30F2, // KATAKANA LETTER WO - 0xC7AD: 0x30F3, // KATAKANA LETTER N - 0xC7AE: 0x30F4, // KATAKANA LETTER VU - 0xC7AF: 0x30F5, // KATAKANA LETTER SMALL KA - 0xC7B0: 0x30F6, // KATAKANA LETTER SMALL KE - 0xC7B1: 0x0414, // CYRILLIC CAPITAL LETTER DE - 0xC7B2: 0x0415, // CYRILLIC CAPITAL LETTER IE - 0xC7B3: 0x0401, // CYRILLIC CAPITAL LETTER IO - 0xC7B4: 0x0416, // CYRILLIC CAPITAL LETTER ZHE - 0xC7B5: 0x0417, // CYRILLIC CAPITAL LETTER ZE - 0xC7B6: 0x0418, // CYRILLIC CAPITAL LETTER I - 0xC7B7: 0x0419, // CYRILLIC CAPITAL LETTER SHORT I - 0xC7B8: 0x041A, // CYRILLIC CAPITAL LETTER KA - 0xC7B9: 0x041B, // CYRILLIC CAPITAL LETTER EL - 0xC7BA: 0x041C, // CYRILLIC CAPITAL LETTER EM - 0xC7BB: 0x0423, // CYRILLIC CAPITAL LETTER U - 0xC7BC: 0x0424, // CYRILLIC CAPITAL LETTER EF - 0xC7BD: 0x0425, // CYRILLIC CAPITAL LETTER HA - 0xC7BE: 0x0426, // CYRILLIC CAPITAL LETTER TSE - 0xC7BF: 0x0427, // CYRILLIC CAPITAL LETTER CHE - 0xC7C0: 0x0428, // CYRILLIC CAPITAL LETTER SHA - 0xC7C1: 0x0429, // CYRILLIC CAPITAL LETTER SHCHA - 0xC7C2: 0x042A, // CYRILLIC CAPITAL LETTER HARD SIGN - 0xC7C3: 0x042B, // CYRILLIC CAPITAL LETTER YERU - 0xC7C4: 0x042C, // CYRILLIC CAPITAL LETTER SOFT SIGN - 0xC7C5: 0x042D, // CYRILLIC CAPITAL LETTER E - 0xC7C6: 0x042E, // CYRILLIC CAPITAL LETTER YU - 0xC7C7: 0x042F, // CYRILLIC CAPITAL LETTER YA - 0xC7C8: 0x0430, // CYRILLIC SMALL LETTER A - 0xC7C9: 0x0431, // CYRILLIC SMALL LETTER BE - 0xC7CA: 0x0432, // CYRILLIC SMALL LETTER VE - 0xC7CB: 0x0433, // CYRILLIC SMALL LETTER GHE - 0xC7CC: 0x0434, // CYRILLIC SMALL LETTER DE - 0xC7CD: 0x0435, // CYRILLIC SMALL LETTER IE - 0xC7CE: 0x0451, // CYRILLIC SMALL LETTER IO - 0xC7CF: 0x0436, // CYRILLIC SMALL LETTER ZHE - 0xC7D0: 0x0437, // CYRILLIC SMALL LETTER ZE - 0xC7D1: 0x0438, // CYRILLIC SMALL LETTER I - 0xC7D2: 0x0439, // CYRILLIC SMALL LETTER SHORT I - 0xC7D3: 0x043A, // CYRILLIC SMALL LETTER KA - 0xC7D4: 0x043B, // CYRILLIC SMALL LETTER EL - 0xC7D5: 0x043C, // CYRILLIC SMALL LETTER EM - 0xC7D6: 0x043D, // CYRILLIC SMALL LETTER EN - 0xC7D7: 0x043E, // CYRILLIC SMALL LETTER O - 0xC7D8: 0x043F, // CYRILLIC SMALL LETTER PE - 0xC7D9: 0x0440, // CYRILLIC SMALL LETTER ER - 0xC7DA: 0x0441, // CYRILLIC SMALL LETTER ES - 0xC7DB: 0x0442, // CYRILLIC SMALL LETTER TE - 0xC7DC: 0x0443, // CYRILLIC SMALL LETTER U - 0xC7DD: 0x0444, // CYRILLIC SMALL LETTER EF - 0xC7DE: 0x0445, // CYRILLIC SMALL LETTER HA - 0xC7DF: 0x0446, // CYRILLIC SMALL LETTER TSE - 0xC7E0: 0x0447, // CYRILLIC SMALL LETTER CHE - 0xC7E1: 0x0448, // CYRILLIC SMALL LETTER SHA - 0xC7E2: 0x0449, // CYRILLIC SMALL LETTER SHCHA - 0xC7E3: 0x044A, // CYRILLIC SMALL LETTER HARD SIGN - 0xC7E4: 0x044B, // CYRILLIC SMALL LETTER YERU - 0xC7E5: 0x044C, // CYRILLIC SMALL LETTER SOFT SIGN - 0xC7E6: 0x044D, // CYRILLIC SMALL LETTER E - 0xC7E7: 0x044E, // CYRILLIC SMALL LETTER YU - 0xC7E8: 0x044F, // CYRILLIC SMALL LETTER YA - 0xC7E9: 0x2460, // CIRCLED DIGIT ONE - 0xC7EA: 0x2461, // CIRCLED DIGIT TWO - 0xC7EB: 0x2462, // CIRCLED DIGIT THREE - 0xC7EC: 0x2463, // CIRCLED DIGIT FOUR - 0xC7ED: 0x2464, // CIRCLED DIGIT FIVE - 0xC7EE: 0x2465, // CIRCLED DIGIT SIX - 0xC7EF: 0x2466, // CIRCLED DIGIT SEVEN - 0xC7F0: 0x2467, // CIRCLED DIGIT EIGHT - 0xC7F1: 0x2468, // CIRCLED DIGIT NINE - 0xC7F2: 0x2469, // CIRCLED NUMBER TEN - 0xC7F3: 0x2474, // PARENTHESIZED DIGIT ONE - 0xC7F4: 0x2475, // PARENTHESIZED DIGIT TWO - 0xC7F5: 0x2476, // PARENTHESIZED DIGIT THREE - 0xC7F6: 0x2477, // PARENTHESIZED DIGIT FOUR - 0xC7F7: 0x2478, // PARENTHESIZED DIGIT FIVE - 0xC7F8: 0x2479, // PARENTHESIZED DIGIT SIX - 0xC7F9: 0x247A, // PARENTHESIZED DIGIT SEVEN - 0xC7FA: 0x247B, // PARENTHESIZED DIGIT EIGHT - 0xC7FB: 0x247C, // PARENTHESIZED DIGIT NINE - 0xC7FC: 0x247D, // PARENTHESIZED NUMBER TEN - 0xC940: 0x4E42, - 0xC941: 0x4E5C, - 0xC942: 0x51F5, - 0xC943: 0x531A, - 0xC944: 0x5382, - 0xC945: 0x4E07, - 0xC946: 0x4E0C, - 0xC947: 0x4E47, - 0xC948: 0x4E8D, - 0xC949: 0x56D7, - 0xC94A: 0xFA0C, // CJK COMPATIBILITY IDEOGRAPH-FA0C - 0xC94B: 0x5C6E, - 0xC94C: 0x5F73, - 0xC94D: 0x4E0F, - 0xC94E: 0x5187, - 0xC94F: 0x4E0E, - 0xC950: 0x4E2E, - 0xC951: 0x4E93, - 0xC952: 0x4EC2, - 0xC953: 0x4EC9, - 0xC954: 0x4EC8, - 0xC955: 0x5198, - 0xC956: 0x52FC, - 0xC957: 0x536C, - 0xC958: 0x53B9, - 0xC959: 0x5720, - 0xC95A: 0x5903, - 0xC95B: 0x592C, - 0xC95C: 0x5C10, - 0xC95D: 0x5DFF, - 0xC95E: 0x65E1, - 0xC95F: 0x6BB3, - 0xC960: 0x6BCC, - 0xC961: 0x6C14, - 0xC962: 0x723F, - 0xC963: 0x4E31, - 0xC964: 0x4E3C, - 0xC965: 0x4EE8, - 0xC966: 0x4EDC, - 0xC967: 0x4EE9, - 0xC968: 0x4EE1, - 0xC969: 0x4EDD, - 0xC96A: 0x4EDA, - 0xC96B: 0x520C, - 0xC96C: 0x531C, - 0xC96D: 0x534C, - 0xC96E: 0x5722, - 0xC96F: 0x5723, - 0xC970: 0x5917, - 0xC971: 0x592F, - 0xC972: 0x5B81, - 0xC973: 0x5B84, - 0xC974: 0x5C12, - 0xC975: 0x5C3B, - 0xC976: 0x5C74, - 0xC977: 0x5C73, - 0xC978: 0x5E04, - 0xC979: 0x5E80, - 0xC97A: 0x5E82, - 0xC97B: 0x5FC9, - 0xC97C: 0x6209, - 0xC97D: 0x6250, - 0xC97E: 0x6C15, - 0xC9A1: 0x6C36, - 0xC9A2: 0x6C43, - 0xC9A3: 0x6C3F, - 0xC9A4: 0x6C3B, - 0xC9A5: 0x72AE, - 0xC9A6: 0x72B0, - 0xC9A7: 0x738A, - 0xC9A8: 0x79B8, - 0xC9A9: 0x808A, - 0xC9AA: 0x961E, - 0xC9AB: 0x4F0E, - 0xC9AC: 0x4F18, - 0xC9AD: 0x4F2C, - 0xC9AE: 0x4EF5, - 0xC9AF: 0x4F14, - 0xC9B0: 0x4EF1, - 0xC9B1: 0x4F00, - 0xC9B2: 0x4EF7, - 0xC9B3: 0x4F08, - 0xC9B4: 0x4F1D, - 0xC9B5: 0x4F02, - 0xC9B6: 0x4F05, - 0xC9B7: 0x4F22, - 0xC9B8: 0x4F13, - 0xC9B9: 0x4F04, - 0xC9BA: 0x4EF4, - 0xC9BB: 0x4F12, - 0xC9BC: 0x51B1, - 0xC9BD: 0x5213, - 0xC9BE: 0x5209, - 0xC9BF: 0x5210, - 0xC9C0: 0x52A6, - 0xC9C1: 0x5322, - 0xC9C2: 0x531F, - 0xC9C3: 0x534D, - 0xC9C4: 0x538A, - 0xC9C5: 0x5407, - 0xC9C6: 0x56E1, - 0xC9C7: 0x56DF, - 0xC9C8: 0x572E, - 0xC9C9: 0x572A, - 0xC9CA: 0x5734, - 0xC9CB: 0x593C, - 0xC9CC: 0x5980, - 0xC9CD: 0x597C, - 0xC9CE: 0x5985, - 0xC9CF: 0x597B, - 0xC9D0: 0x597E, - 0xC9D1: 0x5977, - 0xC9D2: 0x597F, - 0xC9D3: 0x5B56, - 0xC9D4: 0x5C15, - 0xC9D5: 0x5C25, - 0xC9D6: 0x5C7C, - 0xC9D7: 0x5C7A, - 0xC9D8: 0x5C7B, - 0xC9D9: 0x5C7E, - 0xC9DA: 0x5DDF, - 0xC9DB: 0x5E75, - 0xC9DC: 0x5E84, - 0xC9DD: 0x5F02, - 0xC9DE: 0x5F1A, - 0xC9DF: 0x5F74, - 0xC9E0: 0x5FD5, - 0xC9E1: 0x5FD4, - 0xC9E2: 0x5FCF, - 0xC9E3: 0x625C, - 0xC9E4: 0x625E, - 0xC9E5: 0x6264, - 0xC9E6: 0x6261, - 0xC9E7: 0x6266, - 0xC9E8: 0x6262, - 0xC9E9: 0x6259, - 0xC9EA: 0x6260, - 0xC9EB: 0x625A, - 0xC9EC: 0x6265, - 0xC9ED: 0x65EF, - 0xC9EE: 0x65EE, - 0xC9EF: 0x673E, - 0xC9F0: 0x6739, - 0xC9F1: 0x6738, - 0xC9F2: 0x673B, - 0xC9F3: 0x673A, - 0xC9F4: 0x673F, - 0xC9F5: 0x673C, - 0xC9F6: 0x6733, - 0xC9F7: 0x6C18, - 0xC9F8: 0x6C46, - 0xC9F9: 0x6C52, - 0xC9FA: 0x6C5C, - 0xC9FB: 0x6C4F, - 0xC9FC: 0x6C4A, - 0xC9FD: 0x6C54, - 0xC9FE: 0x6C4B, - 0xCA40: 0x6C4C, - 0xCA41: 0x7071, - 0xCA42: 0x725E, - 0xCA43: 0x72B4, - 0xCA44: 0x72B5, - 0xCA45: 0x738E, - 0xCA46: 0x752A, - 0xCA47: 0x767F, - 0xCA48: 0x7A75, - 0xCA49: 0x7F51, - 0xCA4A: 0x8278, - 0xCA4B: 0x827C, - 0xCA4C: 0x8280, - 0xCA4D: 0x827D, - 0xCA4E: 0x827F, - 0xCA4F: 0x864D, - 0xCA50: 0x897E, - 0xCA51: 0x9099, - 0xCA52: 0x9097, - 0xCA53: 0x9098, - 0xCA54: 0x909B, - 0xCA55: 0x9094, - 0xCA56: 0x9622, - 0xCA57: 0x9624, - 0xCA58: 0x9620, - 0xCA59: 0x9623, - 0xCA5A: 0x4F56, - 0xCA5B: 0x4F3B, - 0xCA5C: 0x4F62, - 0xCA5D: 0x4F49, - 0xCA5E: 0x4F53, - 0xCA5F: 0x4F64, - 0xCA60: 0x4F3E, - 0xCA61: 0x4F67, - 0xCA62: 0x4F52, - 0xCA63: 0x4F5F, - 0xCA64: 0x4F41, - 0xCA65: 0x4F58, - 0xCA66: 0x4F2D, - 0xCA67: 0x4F33, - 0xCA68: 0x4F3F, - 0xCA69: 0x4F61, - 0xCA6A: 0x518F, - 0xCA6B: 0x51B9, - 0xCA6C: 0x521C, - 0xCA6D: 0x521E, - 0xCA6E: 0x5221, - 0xCA6F: 0x52AD, - 0xCA70: 0x52AE, - 0xCA71: 0x5309, - 0xCA72: 0x5363, - 0xCA73: 0x5372, - 0xCA74: 0x538E, - 0xCA75: 0x538F, - 0xCA76: 0x5430, - 0xCA77: 0x5437, - 0xCA78: 0x542A, - 0xCA79: 0x5454, - 0xCA7A: 0x5445, - 0xCA7B: 0x5419, - 0xCA7C: 0x541C, - 0xCA7D: 0x5425, - 0xCA7E: 0x5418, - 0xCAA1: 0x543D, - 0xCAA2: 0x544F, - 0xCAA3: 0x5441, - 0xCAA4: 0x5428, - 0xCAA5: 0x5424, - 0xCAA6: 0x5447, - 0xCAA7: 0x56EE, - 0xCAA8: 0x56E7, - 0xCAA9: 0x56E5, - 0xCAAA: 0x5741, - 0xCAAB: 0x5745, - 0xCAAC: 0x574C, - 0xCAAD: 0x5749, - 0xCAAE: 0x574B, - 0xCAAF: 0x5752, - 0xCAB0: 0x5906, - 0xCAB1: 0x5940, - 0xCAB2: 0x59A6, - 0xCAB3: 0x5998, - 0xCAB4: 0x59A0, - 0xCAB5: 0x5997, - 0xCAB6: 0x598E, - 0xCAB7: 0x59A2, - 0xCAB8: 0x5990, - 0xCAB9: 0x598F, - 0xCABA: 0x59A7, - 0xCABB: 0x59A1, - 0xCABC: 0x5B8E, - 0xCABD: 0x5B92, - 0xCABE: 0x5C28, - 0xCABF: 0x5C2A, - 0xCAC0: 0x5C8D, - 0xCAC1: 0x5C8F, - 0xCAC2: 0x5C88, - 0xCAC3: 0x5C8B, - 0xCAC4: 0x5C89, - 0xCAC5: 0x5C92, - 0xCAC6: 0x5C8A, - 0xCAC7: 0x5C86, - 0xCAC8: 0x5C93, - 0xCAC9: 0x5C95, - 0xCACA: 0x5DE0, - 0xCACB: 0x5E0A, - 0xCACC: 0x5E0E, - 0xCACD: 0x5E8B, - 0xCACE: 0x5E89, - 0xCACF: 0x5E8C, - 0xCAD0: 0x5E88, - 0xCAD1: 0x5E8D, - 0xCAD2: 0x5F05, - 0xCAD3: 0x5F1D, - 0xCAD4: 0x5F78, - 0xCAD5: 0x5F76, - 0xCAD6: 0x5FD2, - 0xCAD7: 0x5FD1, - 0xCAD8: 0x5FD0, - 0xCAD9: 0x5FED, - 0xCADA: 0x5FE8, - 0xCADB: 0x5FEE, - 0xCADC: 0x5FF3, - 0xCADD: 0x5FE1, - 0xCADE: 0x5FE4, - 0xCADF: 0x5FE3, - 0xCAE0: 0x5FFA, - 0xCAE1: 0x5FEF, - 0xCAE2: 0x5FF7, - 0xCAE3: 0x5FFB, - 0xCAE4: 0x6000, - 0xCAE5: 0x5FF4, - 0xCAE6: 0x623A, - 0xCAE7: 0x6283, - 0xCAE8: 0x628C, - 0xCAE9: 0x628E, - 0xCAEA: 0x628F, - 0xCAEB: 0x6294, - 0xCAEC: 0x6287, - 0xCAED: 0x6271, - 0xCAEE: 0x627B, - 0xCAEF: 0x627A, - 0xCAF0: 0x6270, - 0xCAF1: 0x6281, - 0xCAF2: 0x6288, - 0xCAF3: 0x6277, - 0xCAF4: 0x627D, - 0xCAF5: 0x6272, - 0xCAF6: 0x6274, - 0xCAF7: 0x6537, - 0xCAF8: 0x65F0, - 0xCAF9: 0x65F4, - 0xCAFA: 0x65F3, - 0xCAFB: 0x65F2, - 0xCAFC: 0x65F5, - 0xCAFD: 0x6745, - 0xCAFE: 0x6747, - 0xCB40: 0x6759, - 0xCB41: 0x6755, - 0xCB42: 0x674C, - 0xCB43: 0x6748, - 0xCB44: 0x675D, - 0xCB45: 0x674D, - 0xCB46: 0x675A, - 0xCB47: 0x674B, - 0xCB48: 0x6BD0, - 0xCB49: 0x6C19, - 0xCB4A: 0x6C1A, - 0xCB4B: 0x6C78, - 0xCB4C: 0x6C67, - 0xCB4D: 0x6C6B, - 0xCB4E: 0x6C84, - 0xCB4F: 0x6C8B, - 0xCB50: 0x6C8F, - 0xCB51: 0x6C71, - 0xCB52: 0x6C6F, - 0xCB53: 0x6C69, - 0xCB54: 0x6C9A, - 0xCB55: 0x6C6D, - 0xCB56: 0x6C87, - 0xCB57: 0x6C95, - 0xCB58: 0x6C9C, - 0xCB59: 0x6C66, - 0xCB5A: 0x6C73, - 0xCB5B: 0x6C65, - 0xCB5C: 0x6C7B, - 0xCB5D: 0x6C8E, - 0xCB5E: 0x7074, - 0xCB5F: 0x707A, - 0xCB60: 0x7263, - 0xCB61: 0x72BF, - 0xCB62: 0x72BD, - 0xCB63: 0x72C3, - 0xCB64: 0x72C6, - 0xCB65: 0x72C1, - 0xCB66: 0x72BA, - 0xCB67: 0x72C5, - 0xCB68: 0x7395, - 0xCB69: 0x7397, - 0xCB6A: 0x7393, - 0xCB6B: 0x7394, - 0xCB6C: 0x7392, - 0xCB6D: 0x753A, - 0xCB6E: 0x7539, - 0xCB6F: 0x7594, - 0xCB70: 0x7595, - 0xCB71: 0x7681, - 0xCB72: 0x793D, - 0xCB73: 0x8034, - 0xCB74: 0x8095, - 0xCB75: 0x8099, - 0xCB76: 0x8090, - 0xCB77: 0x8092, - 0xCB78: 0x809C, - 0xCB79: 0x8290, - 0xCB7A: 0x828F, - 0xCB7B: 0x8285, - 0xCB7C: 0x828E, - 0xCB7D: 0x8291, - 0xCB7E: 0x8293, - 0xCBA1: 0x828A, - 0xCBA2: 0x8283, - 0xCBA3: 0x8284, - 0xCBA4: 0x8C78, - 0xCBA5: 0x8FC9, - 0xCBA6: 0x8FBF, - 0xCBA7: 0x909F, - 0xCBA8: 0x90A1, - 0xCBA9: 0x90A5, - 0xCBAA: 0x909E, - 0xCBAB: 0x90A7, - 0xCBAC: 0x90A0, - 0xCBAD: 0x9630, - 0xCBAE: 0x9628, - 0xCBAF: 0x962F, - 0xCBB0: 0x962D, - 0xCBB1: 0x4E33, - 0xCBB2: 0x4F98, - 0xCBB3: 0x4F7C, - 0xCBB4: 0x4F85, - 0xCBB5: 0x4F7D, - 0xCBB6: 0x4F80, - 0xCBB7: 0x4F87, - 0xCBB8: 0x4F76, - 0xCBB9: 0x4F74, - 0xCBBA: 0x4F89, - 0xCBBB: 0x4F84, - 0xCBBC: 0x4F77, - 0xCBBD: 0x4F4C, - 0xCBBE: 0x4F97, - 0xCBBF: 0x4F6A, - 0xCBC0: 0x4F9A, - 0xCBC1: 0x4F79, - 0xCBC2: 0x4F81, - 0xCBC3: 0x4F78, - 0xCBC4: 0x4F90, - 0xCBC5: 0x4F9C, - 0xCBC6: 0x4F94, - 0xCBC7: 0x4F9E, - 0xCBC8: 0x4F92, - 0xCBC9: 0x4F82, - 0xCBCA: 0x4F95, - 0xCBCB: 0x4F6B, - 0xCBCC: 0x4F6E, - 0xCBCD: 0x519E, - 0xCBCE: 0x51BC, - 0xCBCF: 0x51BE, - 0xCBD0: 0x5235, - 0xCBD1: 0x5232, - 0xCBD2: 0x5233, - 0xCBD3: 0x5246, - 0xCBD4: 0x5231, - 0xCBD5: 0x52BC, - 0xCBD6: 0x530A, - 0xCBD7: 0x530B, - 0xCBD8: 0x533C, - 0xCBD9: 0x5392, - 0xCBDA: 0x5394, - 0xCBDB: 0x5487, - 0xCBDC: 0x547F, - 0xCBDD: 0x5481, - 0xCBDE: 0x5491, - 0xCBDF: 0x5482, - 0xCBE0: 0x5488, - 0xCBE1: 0x546B, - 0xCBE2: 0x547A, - 0xCBE3: 0x547E, - 0xCBE4: 0x5465, - 0xCBE5: 0x546C, - 0xCBE6: 0x5474, - 0xCBE7: 0x5466, - 0xCBE8: 0x548D, - 0xCBE9: 0x546F, - 0xCBEA: 0x5461, - 0xCBEB: 0x5460, - 0xCBEC: 0x5498, - 0xCBED: 0x5463, - 0xCBEE: 0x5467, - 0xCBEF: 0x5464, - 0xCBF0: 0x56F7, - 0xCBF1: 0x56F9, - 0xCBF2: 0x576F, - 0xCBF3: 0x5772, - 0xCBF4: 0x576D, - 0xCBF5: 0x576B, - 0xCBF6: 0x5771, - 0xCBF7: 0x5770, - 0xCBF8: 0x5776, - 0xCBF9: 0x5780, - 0xCBFA: 0x5775, - 0xCBFB: 0x577B, - 0xCBFC: 0x5773, - 0xCBFD: 0x5774, - 0xCBFE: 0x5762, - 0xCC40: 0x5768, - 0xCC41: 0x577D, - 0xCC42: 0x590C, - 0xCC43: 0x5945, - 0xCC44: 0x59B5, - 0xCC45: 0x59BA, - 0xCC46: 0x59CF, - 0xCC47: 0x59CE, - 0xCC48: 0x59B2, - 0xCC49: 0x59CC, - 0xCC4A: 0x59C1, - 0xCC4B: 0x59B6, - 0xCC4C: 0x59BC, - 0xCC4D: 0x59C3, - 0xCC4E: 0x59D6, - 0xCC4F: 0x59B1, - 0xCC50: 0x59BD, - 0xCC51: 0x59C0, - 0xCC52: 0x59C8, - 0xCC53: 0x59B4, - 0xCC54: 0x59C7, - 0xCC55: 0x5B62, - 0xCC56: 0x5B65, - 0xCC57: 0x5B93, - 0xCC58: 0x5B95, - 0xCC59: 0x5C44, - 0xCC5A: 0x5C47, - 0xCC5B: 0x5CAE, - 0xCC5C: 0x5CA4, - 0xCC5D: 0x5CA0, - 0xCC5E: 0x5CB5, - 0xCC5F: 0x5CAF, - 0xCC60: 0x5CA8, - 0xCC61: 0x5CAC, - 0xCC62: 0x5C9F, - 0xCC63: 0x5CA3, - 0xCC64: 0x5CAD, - 0xCC65: 0x5CA2, - 0xCC66: 0x5CAA, - 0xCC67: 0x5CA7, - 0xCC68: 0x5C9D, - 0xCC69: 0x5CA5, - 0xCC6A: 0x5CB6, - 0xCC6B: 0x5CB0, - 0xCC6C: 0x5CA6, - 0xCC6D: 0x5E17, - 0xCC6E: 0x5E14, - 0xCC6F: 0x5E19, - 0xCC70: 0x5F28, - 0xCC71: 0x5F22, - 0xCC72: 0x5F23, - 0xCC73: 0x5F24, - 0xCC74: 0x5F54, - 0xCC75: 0x5F82, - 0xCC76: 0x5F7E, - 0xCC77: 0x5F7D, - 0xCC78: 0x5FDE, - 0xCC79: 0x5FE5, - 0xCC7A: 0x602D, - 0xCC7B: 0x6026, - 0xCC7C: 0x6019, - 0xCC7D: 0x6032, - 0xCC7E: 0x600B, - 0xCCA1: 0x6034, - 0xCCA2: 0x600A, - 0xCCA3: 0x6017, - 0xCCA4: 0x6033, - 0xCCA5: 0x601A, - 0xCCA6: 0x601E, - 0xCCA7: 0x602C, - 0xCCA8: 0x6022, - 0xCCA9: 0x600D, - 0xCCAA: 0x6010, - 0xCCAB: 0x602E, - 0xCCAC: 0x6013, - 0xCCAD: 0x6011, - 0xCCAE: 0x600C, - 0xCCAF: 0x6009, - 0xCCB0: 0x601C, - 0xCCB1: 0x6214, - 0xCCB2: 0x623D, - 0xCCB3: 0x62AD, - 0xCCB4: 0x62B4, - 0xCCB5: 0x62D1, - 0xCCB6: 0x62BE, - 0xCCB7: 0x62AA, - 0xCCB8: 0x62B6, - 0xCCB9: 0x62CA, - 0xCCBA: 0x62AE, - 0xCCBB: 0x62B3, - 0xCCBC: 0x62AF, - 0xCCBD: 0x62BB, - 0xCCBE: 0x62A9, - 0xCCBF: 0x62B0, - 0xCCC0: 0x62B8, - 0xCCC1: 0x653D, - 0xCCC2: 0x65A8, - 0xCCC3: 0x65BB, - 0xCCC4: 0x6609, - 0xCCC5: 0x65FC, - 0xCCC6: 0x6604, - 0xCCC7: 0x6612, - 0xCCC8: 0x6608, - 0xCCC9: 0x65FB, - 0xCCCA: 0x6603, - 0xCCCB: 0x660B, - 0xCCCC: 0x660D, - 0xCCCD: 0x6605, - 0xCCCE: 0x65FD, - 0xCCCF: 0x6611, - 0xCCD0: 0x6610, - 0xCCD1: 0x66F6, - 0xCCD2: 0x670A, - 0xCCD3: 0x6785, - 0xCCD4: 0x676C, - 0xCCD5: 0x678E, - 0xCCD6: 0x6792, - 0xCCD7: 0x6776, - 0xCCD8: 0x677B, - 0xCCD9: 0x6798, - 0xCCDA: 0x6786, - 0xCCDB: 0x6784, - 0xCCDC: 0x6774, - 0xCCDD: 0x678D, - 0xCCDE: 0x678C, - 0xCCDF: 0x677A, - 0xCCE0: 0x679F, - 0xCCE1: 0x6791, - 0xCCE2: 0x6799, - 0xCCE3: 0x6783, - 0xCCE4: 0x677D, - 0xCCE5: 0x6781, - 0xCCE6: 0x6778, - 0xCCE7: 0x6779, - 0xCCE8: 0x6794, - 0xCCE9: 0x6B25, - 0xCCEA: 0x6B80, - 0xCCEB: 0x6B7E, - 0xCCEC: 0x6BDE, - 0xCCED: 0x6C1D, - 0xCCEE: 0x6C93, - 0xCCEF: 0x6CEC, - 0xCCF0: 0x6CEB, - 0xCCF1: 0x6CEE, - 0xCCF2: 0x6CD9, - 0xCCF3: 0x6CB6, - 0xCCF4: 0x6CD4, - 0xCCF5: 0x6CAD, - 0xCCF6: 0x6CE7, - 0xCCF7: 0x6CB7, - 0xCCF8: 0x6CD0, - 0xCCF9: 0x6CC2, - 0xCCFA: 0x6CBA, - 0xCCFB: 0x6CC3, - 0xCCFC: 0x6CC6, - 0xCCFD: 0x6CED, - 0xCCFE: 0x6CF2, - 0xCD40: 0x6CD2, - 0xCD41: 0x6CDD, - 0xCD42: 0x6CB4, - 0xCD43: 0x6C8A, - 0xCD44: 0x6C9D, - 0xCD45: 0x6C80, - 0xCD46: 0x6CDE, - 0xCD47: 0x6CC0, - 0xCD48: 0x6D30, - 0xCD49: 0x6CCD, - 0xCD4A: 0x6CC7, - 0xCD4B: 0x6CB0, - 0xCD4C: 0x6CF9, - 0xCD4D: 0x6CCF, - 0xCD4E: 0x6CE9, - 0xCD4F: 0x6CD1, - 0xCD50: 0x7094, - 0xCD51: 0x7098, - 0xCD52: 0x7085, - 0xCD53: 0x7093, - 0xCD54: 0x7086, - 0xCD55: 0x7084, - 0xCD56: 0x7091, - 0xCD57: 0x7096, - 0xCD58: 0x7082, - 0xCD59: 0x709A, - 0xCD5A: 0x7083, - 0xCD5B: 0x726A, - 0xCD5C: 0x72D6, - 0xCD5D: 0x72CB, - 0xCD5E: 0x72D8, - 0xCD5F: 0x72C9, - 0xCD60: 0x72DC, - 0xCD61: 0x72D2, - 0xCD62: 0x72D4, - 0xCD63: 0x72DA, - 0xCD64: 0x72CC, - 0xCD65: 0x72D1, - 0xCD66: 0x73A4, - 0xCD67: 0x73A1, - 0xCD68: 0x73AD, - 0xCD69: 0x73A6, - 0xCD6A: 0x73A2, - 0xCD6B: 0x73A0, - 0xCD6C: 0x73AC, - 0xCD6D: 0x739D, - 0xCD6E: 0x74DD, - 0xCD6F: 0x74E8, - 0xCD70: 0x753F, - 0xCD71: 0x7540, - 0xCD72: 0x753E, - 0xCD73: 0x758C, - 0xCD74: 0x7598, - 0xCD75: 0x76AF, - 0xCD76: 0x76F3, - 0xCD77: 0x76F1, - 0xCD78: 0x76F0, - 0xCD79: 0x76F5, - 0xCD7A: 0x77F8, - 0xCD7B: 0x77FC, - 0xCD7C: 0x77F9, - 0xCD7D: 0x77FB, - 0xCD7E: 0x77FA, - 0xCDA1: 0x77F7, - 0xCDA2: 0x7942, - 0xCDA3: 0x793F, - 0xCDA4: 0x79C5, - 0xCDA5: 0x7A78, - 0xCDA6: 0x7A7B, - 0xCDA7: 0x7AFB, - 0xCDA8: 0x7C75, - 0xCDA9: 0x7CFD, - 0xCDAA: 0x8035, - 0xCDAB: 0x808F, - 0xCDAC: 0x80AE, - 0xCDAD: 0x80A3, - 0xCDAE: 0x80B8, - 0xCDAF: 0x80B5, - 0xCDB0: 0x80AD, - 0xCDB1: 0x8220, - 0xCDB2: 0x82A0, - 0xCDB3: 0x82C0, - 0xCDB4: 0x82AB, - 0xCDB5: 0x829A, - 0xCDB6: 0x8298, - 0xCDB7: 0x829B, - 0xCDB8: 0x82B5, - 0xCDB9: 0x82A7, - 0xCDBA: 0x82AE, - 0xCDBB: 0x82BC, - 0xCDBC: 0x829E, - 0xCDBD: 0x82BA, - 0xCDBE: 0x82B4, - 0xCDBF: 0x82A8, - 0xCDC0: 0x82A1, - 0xCDC1: 0x82A9, - 0xCDC2: 0x82C2, - 0xCDC3: 0x82A4, - 0xCDC4: 0x82C3, - 0xCDC5: 0x82B6, - 0xCDC6: 0x82A2, - 0xCDC7: 0x8670, - 0xCDC8: 0x866F, - 0xCDC9: 0x866D, - 0xCDCA: 0x866E, - 0xCDCB: 0x8C56, - 0xCDCC: 0x8FD2, - 0xCDCD: 0x8FCB, - 0xCDCE: 0x8FD3, - 0xCDCF: 0x8FCD, - 0xCDD0: 0x8FD6, - 0xCDD1: 0x8FD5, - 0xCDD2: 0x8FD7, - 0xCDD3: 0x90B2, - 0xCDD4: 0x90B4, - 0xCDD5: 0x90AF, - 0xCDD6: 0x90B3, - 0xCDD7: 0x90B0, - 0xCDD8: 0x9639, - 0xCDD9: 0x963D, - 0xCDDA: 0x963C, - 0xCDDB: 0x963A, - 0xCDDC: 0x9643, - 0xCDDD: 0x4FCD, - 0xCDDE: 0x4FC5, - 0xCDDF: 0x4FD3, - 0xCDE0: 0x4FB2, - 0xCDE1: 0x4FC9, - 0xCDE2: 0x4FCB, - 0xCDE3: 0x4FC1, - 0xCDE4: 0x4FD4, - 0xCDE5: 0x4FDC, - 0xCDE6: 0x4FD9, - 0xCDE7: 0x4FBB, - 0xCDE8: 0x4FB3, - 0xCDE9: 0x4FDB, - 0xCDEA: 0x4FC7, - 0xCDEB: 0x4FD6, - 0xCDEC: 0x4FBA, - 0xCDED: 0x4FC0, - 0xCDEE: 0x4FB9, - 0xCDEF: 0x4FEC, - 0xCDF0: 0x5244, - 0xCDF1: 0x5249, - 0xCDF2: 0x52C0, - 0xCDF3: 0x52C2, - 0xCDF4: 0x533D, - 0xCDF5: 0x537C, - 0xCDF6: 0x5397, - 0xCDF7: 0x5396, - 0xCDF8: 0x5399, - 0xCDF9: 0x5398, - 0xCDFA: 0x54BA, - 0xCDFB: 0x54A1, - 0xCDFC: 0x54AD, - 0xCDFD: 0x54A5, - 0xCDFE: 0x54CF, - 0xCE40: 0x54C3, - 0xCE41: 0x830D, - 0xCE42: 0x54B7, - 0xCE43: 0x54AE, - 0xCE44: 0x54D6, - 0xCE45: 0x54B6, - 0xCE46: 0x54C5, - 0xCE47: 0x54C6, - 0xCE48: 0x54A0, - 0xCE49: 0x5470, - 0xCE4A: 0x54BC, - 0xCE4B: 0x54A2, - 0xCE4C: 0x54BE, - 0xCE4D: 0x5472, - 0xCE4E: 0x54DE, - 0xCE4F: 0x54B0, - 0xCE50: 0x57B5, - 0xCE51: 0x579E, - 0xCE52: 0x579F, - 0xCE53: 0x57A4, - 0xCE54: 0x578C, - 0xCE55: 0x5797, - 0xCE56: 0x579D, - 0xCE57: 0x579B, - 0xCE58: 0x5794, - 0xCE59: 0x5798, - 0xCE5A: 0x578F, - 0xCE5B: 0x5799, - 0xCE5C: 0x57A5, - 0xCE5D: 0x579A, - 0xCE5E: 0x5795, - 0xCE5F: 0x58F4, - 0xCE60: 0x590D, - 0xCE61: 0x5953, - 0xCE62: 0x59E1, - 0xCE63: 0x59DE, - 0xCE64: 0x59EE, - 0xCE65: 0x5A00, - 0xCE66: 0x59F1, - 0xCE67: 0x59DD, - 0xCE68: 0x59FA, - 0xCE69: 0x59FD, - 0xCE6A: 0x59FC, - 0xCE6B: 0x59F6, - 0xCE6C: 0x59E4, - 0xCE6D: 0x59F2, - 0xCE6E: 0x59F7, - 0xCE6F: 0x59DB, - 0xCE70: 0x59E9, - 0xCE71: 0x59F3, - 0xCE72: 0x59F5, - 0xCE73: 0x59E0, - 0xCE74: 0x59FE, - 0xCE75: 0x59F4, - 0xCE76: 0x59ED, - 0xCE77: 0x5BA8, - 0xCE78: 0x5C4C, - 0xCE79: 0x5CD0, - 0xCE7A: 0x5CD8, - 0xCE7B: 0x5CCC, - 0xCE7C: 0x5CD7, - 0xCE7D: 0x5CCB, - 0xCE7E: 0x5CDB, - 0xCEA1: 0x5CDE, - 0xCEA2: 0x5CDA, - 0xCEA3: 0x5CC9, - 0xCEA4: 0x5CC7, - 0xCEA5: 0x5CCA, - 0xCEA6: 0x5CD6, - 0xCEA7: 0x5CD3, - 0xCEA8: 0x5CD4, - 0xCEA9: 0x5CCF, - 0xCEAA: 0x5CC8, - 0xCEAB: 0x5CC6, - 0xCEAC: 0x5CCE, - 0xCEAD: 0x5CDF, - 0xCEAE: 0x5CF8, - 0xCEAF: 0x5DF9, - 0xCEB0: 0x5E21, - 0xCEB1: 0x5E22, - 0xCEB2: 0x5E23, - 0xCEB3: 0x5E20, - 0xCEB4: 0x5E24, - 0xCEB5: 0x5EB0, - 0xCEB6: 0x5EA4, - 0xCEB7: 0x5EA2, - 0xCEB8: 0x5E9B, - 0xCEB9: 0x5EA3, - 0xCEBA: 0x5EA5, - 0xCEBB: 0x5F07, - 0xCEBC: 0x5F2E, - 0xCEBD: 0x5F56, - 0xCEBE: 0x5F86, - 0xCEBF: 0x6037, - 0xCEC0: 0x6039, - 0xCEC1: 0x6054, - 0xCEC2: 0x6072, - 0xCEC3: 0x605E, - 0xCEC4: 0x6045, - 0xCEC5: 0x6053, - 0xCEC6: 0x6047, - 0xCEC7: 0x6049, - 0xCEC8: 0x605B, - 0xCEC9: 0x604C, - 0xCECA: 0x6040, - 0xCECB: 0x6042, - 0xCECC: 0x605F, - 0xCECD: 0x6024, - 0xCECE: 0x6044, - 0xCECF: 0x6058, - 0xCED0: 0x6066, - 0xCED1: 0x606E, - 0xCED2: 0x6242, - 0xCED3: 0x6243, - 0xCED4: 0x62CF, - 0xCED5: 0x630D, - 0xCED6: 0x630B, - 0xCED7: 0x62F5, - 0xCED8: 0x630E, - 0xCED9: 0x6303, - 0xCEDA: 0x62EB, - 0xCEDB: 0x62F9, - 0xCEDC: 0x630F, - 0xCEDD: 0x630C, - 0xCEDE: 0x62F8, - 0xCEDF: 0x62F6, - 0xCEE0: 0x6300, - 0xCEE1: 0x6313, - 0xCEE2: 0x6314, - 0xCEE3: 0x62FA, - 0xCEE4: 0x6315, - 0xCEE5: 0x62FB, - 0xCEE6: 0x62F0, - 0xCEE7: 0x6541, - 0xCEE8: 0x6543, - 0xCEE9: 0x65AA, - 0xCEEA: 0x65BF, - 0xCEEB: 0x6636, - 0xCEEC: 0x6621, - 0xCEED: 0x6632, - 0xCEEE: 0x6635, - 0xCEEF: 0x661C, - 0xCEF0: 0x6626, - 0xCEF1: 0x6622, - 0xCEF2: 0x6633, - 0xCEF3: 0x662B, - 0xCEF4: 0x663A, - 0xCEF5: 0x661D, - 0xCEF6: 0x6634, - 0xCEF7: 0x6639, - 0xCEF8: 0x662E, - 0xCEF9: 0x670F, - 0xCEFA: 0x6710, - 0xCEFB: 0x67C1, - 0xCEFC: 0x67F2, - 0xCEFD: 0x67C8, - 0xCEFE: 0x67BA, - 0xCF40: 0x67DC, - 0xCF41: 0x67BB, - 0xCF42: 0x67F8, - 0xCF43: 0x67D8, - 0xCF44: 0x67C0, - 0xCF45: 0x67B7, - 0xCF46: 0x67C5, - 0xCF47: 0x67EB, - 0xCF48: 0x67E4, - 0xCF49: 0x67DF, - 0xCF4A: 0x67B5, - 0xCF4B: 0x67CD, - 0xCF4C: 0x67B3, - 0xCF4D: 0x67F7, - 0xCF4E: 0x67F6, - 0xCF4F: 0x67EE, - 0xCF50: 0x67E3, - 0xCF51: 0x67C2, - 0xCF52: 0x67B9, - 0xCF53: 0x67CE, - 0xCF54: 0x67E7, - 0xCF55: 0x67F0, - 0xCF56: 0x67B2, - 0xCF57: 0x67FC, - 0xCF58: 0x67C6, - 0xCF59: 0x67ED, - 0xCF5A: 0x67CC, - 0xCF5B: 0x67AE, - 0xCF5C: 0x67E6, - 0xCF5D: 0x67DB, - 0xCF5E: 0x67FA, - 0xCF5F: 0x67C9, - 0xCF60: 0x67CA, - 0xCF61: 0x67C3, - 0xCF62: 0x67EA, - 0xCF63: 0x67CB, - 0xCF64: 0x6B28, - 0xCF65: 0x6B82, - 0xCF66: 0x6B84, - 0xCF67: 0x6BB6, - 0xCF68: 0x6BD6, - 0xCF69: 0x6BD8, - 0xCF6A: 0x6BE0, - 0xCF6B: 0x6C20, - 0xCF6C: 0x6C21, - 0xCF6D: 0x6D28, - 0xCF6E: 0x6D34, - 0xCF6F: 0x6D2D, - 0xCF70: 0x6D1F, - 0xCF71: 0x6D3C, - 0xCF72: 0x6D3F, - 0xCF73: 0x6D12, - 0xCF74: 0x6D0A, - 0xCF75: 0x6CDA, - 0xCF76: 0x6D33, - 0xCF77: 0x6D04, - 0xCF78: 0x6D19, - 0xCF79: 0x6D3A, - 0xCF7A: 0x6D1A, - 0xCF7B: 0x6D11, - 0xCF7C: 0x6D00, - 0xCF7D: 0x6D1D, - 0xCF7E: 0x6D42, - 0xCFA1: 0x6D01, - 0xCFA2: 0x6D18, - 0xCFA3: 0x6D37, - 0xCFA4: 0x6D03, - 0xCFA5: 0x6D0F, - 0xCFA6: 0x6D40, - 0xCFA7: 0x6D07, - 0xCFA8: 0x6D20, - 0xCFA9: 0x6D2C, - 0xCFAA: 0x6D08, - 0xCFAB: 0x6D22, - 0xCFAC: 0x6D09, - 0xCFAD: 0x6D10, - 0xCFAE: 0x70B7, - 0xCFAF: 0x709F, - 0xCFB0: 0x70BE, - 0xCFB1: 0x70B1, - 0xCFB2: 0x70B0, - 0xCFB3: 0x70A1, - 0xCFB4: 0x70B4, - 0xCFB5: 0x70B5, - 0xCFB6: 0x70A9, - 0xCFB7: 0x7241, - 0xCFB8: 0x7249, - 0xCFB9: 0x724A, - 0xCFBA: 0x726C, - 0xCFBB: 0x7270, - 0xCFBC: 0x7273, - 0xCFBD: 0x726E, - 0xCFBE: 0x72CA, - 0xCFBF: 0x72E4, - 0xCFC0: 0x72E8, - 0xCFC1: 0x72EB, - 0xCFC2: 0x72DF, - 0xCFC3: 0x72EA, - 0xCFC4: 0x72E6, - 0xCFC5: 0x72E3, - 0xCFC6: 0x7385, - 0xCFC7: 0x73CC, - 0xCFC8: 0x73C2, - 0xCFC9: 0x73C8, - 0xCFCA: 0x73C5, - 0xCFCB: 0x73B9, - 0xCFCC: 0x73B6, - 0xCFCD: 0x73B5, - 0xCFCE: 0x73B4, - 0xCFCF: 0x73EB, - 0xCFD0: 0x73BF, - 0xCFD1: 0x73C7, - 0xCFD2: 0x73BE, - 0xCFD3: 0x73C3, - 0xCFD4: 0x73C6, - 0xCFD5: 0x73B8, - 0xCFD6: 0x73CB, - 0xCFD7: 0x74EC, - 0xCFD8: 0x74EE, - 0xCFD9: 0x752E, - 0xCFDA: 0x7547, - 0xCFDB: 0x7548, - 0xCFDC: 0x75A7, - 0xCFDD: 0x75AA, - 0xCFDE: 0x7679, - 0xCFDF: 0x76C4, - 0xCFE0: 0x7708, - 0xCFE1: 0x7703, - 0xCFE2: 0x7704, - 0xCFE3: 0x7705, - 0xCFE4: 0x770A, - 0xCFE5: 0x76F7, - 0xCFE6: 0x76FB, - 0xCFE7: 0x76FA, - 0xCFE8: 0x77E7, - 0xCFE9: 0x77E8, - 0xCFEA: 0x7806, - 0xCFEB: 0x7811, - 0xCFEC: 0x7812, - 0xCFED: 0x7805, - 0xCFEE: 0x7810, - 0xCFEF: 0x780F, - 0xCFF0: 0x780E, - 0xCFF1: 0x7809, - 0xCFF2: 0x7803, - 0xCFF3: 0x7813, - 0xCFF4: 0x794A, - 0xCFF5: 0x794C, - 0xCFF6: 0x794B, - 0xCFF7: 0x7945, - 0xCFF8: 0x7944, - 0xCFF9: 0x79D5, - 0xCFFA: 0x79CD, - 0xCFFB: 0x79CF, - 0xCFFC: 0x79D6, - 0xCFFD: 0x79CE, - 0xCFFE: 0x7A80, - 0xD040: 0x7A7E, - 0xD041: 0x7AD1, - 0xD042: 0x7B00, - 0xD043: 0x7B01, - 0xD044: 0x7C7A, - 0xD045: 0x7C78, - 0xD046: 0x7C79, - 0xD047: 0x7C7F, - 0xD048: 0x7C80, - 0xD049: 0x7C81, - 0xD04A: 0x7D03, - 0xD04B: 0x7D08, - 0xD04C: 0x7D01, - 0xD04D: 0x7F58, - 0xD04E: 0x7F91, - 0xD04F: 0x7F8D, - 0xD050: 0x7FBE, - 0xD051: 0x8007, - 0xD052: 0x800E, - 0xD053: 0x800F, - 0xD054: 0x8014, - 0xD055: 0x8037, - 0xD056: 0x80D8, - 0xD057: 0x80C7, - 0xD058: 0x80E0, - 0xD059: 0x80D1, - 0xD05A: 0x80C8, - 0xD05B: 0x80C2, - 0xD05C: 0x80D0, - 0xD05D: 0x80C5, - 0xD05E: 0x80E3, - 0xD05F: 0x80D9, - 0xD060: 0x80DC, - 0xD061: 0x80CA, - 0xD062: 0x80D5, - 0xD063: 0x80C9, - 0xD064: 0x80CF, - 0xD065: 0x80D7, - 0xD066: 0x80E6, - 0xD067: 0x80CD, - 0xD068: 0x81FF, - 0xD069: 0x8221, - 0xD06A: 0x8294, - 0xD06B: 0x82D9, - 0xD06C: 0x82FE, - 0xD06D: 0x82F9, - 0xD06E: 0x8307, - 0xD06F: 0x82E8, - 0xD070: 0x8300, - 0xD071: 0x82D5, - 0xD072: 0x833A, - 0xD073: 0x82EB, - 0xD074: 0x82D6, - 0xD075: 0x82F4, - 0xD076: 0x82EC, - 0xD077: 0x82E1, - 0xD078: 0x82F2, - 0xD079: 0x82F5, - 0xD07A: 0x830C, - 0xD07B: 0x82FB, - 0xD07C: 0x82F6, - 0xD07D: 0x82F0, - 0xD07E: 0x82EA, - 0xD0A1: 0x82E4, - 0xD0A2: 0x82E0, - 0xD0A3: 0x82FA, - 0xD0A4: 0x82F3, - 0xD0A5: 0x82ED, - 0xD0A6: 0x8677, - 0xD0A7: 0x8674, - 0xD0A8: 0x867C, - 0xD0A9: 0x8673, - 0xD0AA: 0x8841, - 0xD0AB: 0x884E, - 0xD0AC: 0x8867, - 0xD0AD: 0x886A, - 0xD0AE: 0x8869, - 0xD0AF: 0x89D3, - 0xD0B0: 0x8A04, - 0xD0B1: 0x8A07, - 0xD0B2: 0x8D72, - 0xD0B3: 0x8FE3, - 0xD0B4: 0x8FE1, - 0xD0B5: 0x8FEE, - 0xD0B6: 0x8FE0, - 0xD0B7: 0x90F1, - 0xD0B8: 0x90BD, - 0xD0B9: 0x90BF, - 0xD0BA: 0x90D5, - 0xD0BB: 0x90C5, - 0xD0BC: 0x90BE, - 0xD0BD: 0x90C7, - 0xD0BE: 0x90CB, - 0xD0BF: 0x90C8, - 0xD0C0: 0x91D4, - 0xD0C1: 0x91D3, - 0xD0C2: 0x9654, - 0xD0C3: 0x964F, - 0xD0C4: 0x9651, - 0xD0C5: 0x9653, - 0xD0C6: 0x964A, - 0xD0C7: 0x964E, - 0xD0C8: 0x501E, - 0xD0C9: 0x5005, - 0xD0CA: 0x5007, - 0xD0CB: 0x5013, - 0xD0CC: 0x5022, - 0xD0CD: 0x5030, - 0xD0CE: 0x501B, - 0xD0CF: 0x4FF5, - 0xD0D0: 0x4FF4, - 0xD0D1: 0x5033, - 0xD0D2: 0x5037, - 0xD0D3: 0x502C, - 0xD0D4: 0x4FF6, - 0xD0D5: 0x4FF7, - 0xD0D6: 0x5017, - 0xD0D7: 0x501C, - 0xD0D8: 0x5020, - 0xD0D9: 0x5027, - 0xD0DA: 0x5035, - 0xD0DB: 0x502F, - 0xD0DC: 0x5031, - 0xD0DD: 0x500E, - 0xD0DE: 0x515A, - 0xD0DF: 0x5194, - 0xD0E0: 0x5193, - 0xD0E1: 0x51CA, - 0xD0E2: 0x51C4, - 0xD0E3: 0x51C5, - 0xD0E4: 0x51C8, - 0xD0E5: 0x51CE, - 0xD0E6: 0x5261, - 0xD0E7: 0x525A, - 0xD0E8: 0x5252, - 0xD0E9: 0x525E, - 0xD0EA: 0x525F, - 0xD0EB: 0x5255, - 0xD0EC: 0x5262, - 0xD0ED: 0x52CD, - 0xD0EE: 0x530E, - 0xD0EF: 0x539E, - 0xD0F0: 0x5526, - 0xD0F1: 0x54E2, - 0xD0F2: 0x5517, - 0xD0F3: 0x5512, - 0xD0F4: 0x54E7, - 0xD0F5: 0x54F3, - 0xD0F6: 0x54E4, - 0xD0F7: 0x551A, - 0xD0F8: 0x54FF, - 0xD0F9: 0x5504, - 0xD0FA: 0x5508, - 0xD0FB: 0x54EB, - 0xD0FC: 0x5511, - 0xD0FD: 0x5505, - 0xD0FE: 0x54F1, - 0xD140: 0x550A, - 0xD141: 0x54FB, - 0xD142: 0x54F7, - 0xD143: 0x54F8, - 0xD144: 0x54E0, - 0xD145: 0x550E, - 0xD146: 0x5503, - 0xD147: 0x550B, - 0xD148: 0x5701, - 0xD149: 0x5702, - 0xD14A: 0x57CC, - 0xD14B: 0x5832, - 0xD14C: 0x57D5, - 0xD14D: 0x57D2, - 0xD14E: 0x57BA, - 0xD14F: 0x57C6, - 0xD150: 0x57BD, - 0xD151: 0x57BC, - 0xD152: 0x57B8, - 0xD153: 0x57B6, - 0xD154: 0x57BF, - 0xD155: 0x57C7, - 0xD156: 0x57D0, - 0xD157: 0x57B9, - 0xD158: 0x57C1, - 0xD159: 0x590E, - 0xD15A: 0x594A, - 0xD15B: 0x5A19, - 0xD15C: 0x5A16, - 0xD15D: 0x5A2D, - 0xD15E: 0x5A2E, - 0xD15F: 0x5A15, - 0xD160: 0x5A0F, - 0xD161: 0x5A17, - 0xD162: 0x5A0A, - 0xD163: 0x5A1E, - 0xD164: 0x5A33, - 0xD165: 0x5B6C, - 0xD166: 0x5BA7, - 0xD167: 0x5BAD, - 0xD168: 0x5BAC, - 0xD169: 0x5C03, - 0xD16A: 0x5C56, - 0xD16B: 0x5C54, - 0xD16C: 0x5CEC, - 0xD16D: 0x5CFF, - 0xD16E: 0x5CEE, - 0xD16F: 0x5CF1, - 0xD170: 0x5CF7, - 0xD171: 0x5D00, - 0xD172: 0x5CF9, - 0xD173: 0x5E29, - 0xD174: 0x5E28, - 0xD175: 0x5EA8, - 0xD176: 0x5EAE, - 0xD177: 0x5EAA, - 0xD178: 0x5EAC, - 0xD179: 0x5F33, - 0xD17A: 0x5F30, - 0xD17B: 0x5F67, - 0xD17C: 0x605D, - 0xD17D: 0x605A, - 0xD17E: 0x6067, - 0xD1A1: 0x6041, - 0xD1A2: 0x60A2, - 0xD1A3: 0x6088, - 0xD1A4: 0x6080, - 0xD1A5: 0x6092, - 0xD1A6: 0x6081, - 0xD1A7: 0x609D, - 0xD1A8: 0x6083, - 0xD1A9: 0x6095, - 0xD1AA: 0x609B, - 0xD1AB: 0x6097, - 0xD1AC: 0x6087, - 0xD1AD: 0x609C, - 0xD1AE: 0x608E, - 0xD1AF: 0x6219, - 0xD1B0: 0x6246, - 0xD1B1: 0x62F2, - 0xD1B2: 0x6310, - 0xD1B3: 0x6356, - 0xD1B4: 0x632C, - 0xD1B5: 0x6344, - 0xD1B6: 0x6345, - 0xD1B7: 0x6336, - 0xD1B8: 0x6343, - 0xD1B9: 0x63E4, - 0xD1BA: 0x6339, - 0xD1BB: 0x634B, - 0xD1BC: 0x634A, - 0xD1BD: 0x633C, - 0xD1BE: 0x6329, - 0xD1BF: 0x6341, - 0xD1C0: 0x6334, - 0xD1C1: 0x6358, - 0xD1C2: 0x6354, - 0xD1C3: 0x6359, - 0xD1C4: 0x632D, - 0xD1C5: 0x6347, - 0xD1C6: 0x6333, - 0xD1C7: 0x635A, - 0xD1C8: 0x6351, - 0xD1C9: 0x6338, - 0xD1CA: 0x6357, - 0xD1CB: 0x6340, - 0xD1CC: 0x6348, - 0xD1CD: 0x654A, - 0xD1CE: 0x6546, - 0xD1CF: 0x65C6, - 0xD1D0: 0x65C3, - 0xD1D1: 0x65C4, - 0xD1D2: 0x65C2, - 0xD1D3: 0x664A, - 0xD1D4: 0x665F, - 0xD1D5: 0x6647, - 0xD1D6: 0x6651, - 0xD1D7: 0x6712, - 0xD1D8: 0x6713, - 0xD1D9: 0x681F, - 0xD1DA: 0x681A, - 0xD1DB: 0x6849, - 0xD1DC: 0x6832, - 0xD1DD: 0x6833, - 0xD1DE: 0x683B, - 0xD1DF: 0x684B, - 0xD1E0: 0x684F, - 0xD1E1: 0x6816, - 0xD1E2: 0x6831, - 0xD1E3: 0x681C, - 0xD1E4: 0x6835, - 0xD1E5: 0x682B, - 0xD1E6: 0x682D, - 0xD1E7: 0x682F, - 0xD1E8: 0x684E, - 0xD1E9: 0x6844, - 0xD1EA: 0x6834, - 0xD1EB: 0x681D, - 0xD1EC: 0x6812, - 0xD1ED: 0x6814, - 0xD1EE: 0x6826, - 0xD1EF: 0x6828, - 0xD1F0: 0x682E, - 0xD1F1: 0x684D, - 0xD1F2: 0x683A, - 0xD1F3: 0x6825, - 0xD1F4: 0x6820, - 0xD1F5: 0x6B2C, - 0xD1F6: 0x6B2F, - 0xD1F7: 0x6B2D, - 0xD1F8: 0x6B31, - 0xD1F9: 0x6B34, - 0xD1FA: 0x6B6D, - 0xD1FB: 0x8082, - 0xD1FC: 0x6B88, - 0xD1FD: 0x6BE6, - 0xD1FE: 0x6BE4, - 0xD240: 0x6BE8, - 0xD241: 0x6BE3, - 0xD242: 0x6BE2, - 0xD243: 0x6BE7, - 0xD244: 0x6C25, - 0xD245: 0x6D7A, - 0xD246: 0x6D63, - 0xD247: 0x6D64, - 0xD248: 0x6D76, - 0xD249: 0x6D0D, - 0xD24A: 0x6D61, - 0xD24B: 0x6D92, - 0xD24C: 0x6D58, - 0xD24D: 0x6D62, - 0xD24E: 0x6D6D, - 0xD24F: 0x6D6F, - 0xD250: 0x6D91, - 0xD251: 0x6D8D, - 0xD252: 0x6DEF, - 0xD253: 0x6D7F, - 0xD254: 0x6D86, - 0xD255: 0x6D5E, - 0xD256: 0x6D67, - 0xD257: 0x6D60, - 0xD258: 0x6D97, - 0xD259: 0x6D70, - 0xD25A: 0x6D7C, - 0xD25B: 0x6D5F, - 0xD25C: 0x6D82, - 0xD25D: 0x6D98, - 0xD25E: 0x6D2F, - 0xD25F: 0x6D68, - 0xD260: 0x6D8B, - 0xD261: 0x6D7E, - 0xD262: 0x6D80, - 0xD263: 0x6D84, - 0xD264: 0x6D16, - 0xD265: 0x6D83, - 0xD266: 0x6D7B, - 0xD267: 0x6D7D, - 0xD268: 0x6D75, - 0xD269: 0x6D90, - 0xD26A: 0x70DC, - 0xD26B: 0x70D3, - 0xD26C: 0x70D1, - 0xD26D: 0x70DD, - 0xD26E: 0x70CB, - 0xD26F: 0x7F39, - 0xD270: 0x70E2, - 0xD271: 0x70D7, - 0xD272: 0x70D2, - 0xD273: 0x70DE, - 0xD274: 0x70E0, - 0xD275: 0x70D4, - 0xD276: 0x70CD, - 0xD277: 0x70C5, - 0xD278: 0x70C6, - 0xD279: 0x70C7, - 0xD27A: 0x70DA, - 0xD27B: 0x70CE, - 0xD27C: 0x70E1, - 0xD27D: 0x7242, - 0xD27E: 0x7278, - 0xD2A1: 0x7277, - 0xD2A2: 0x7276, - 0xD2A3: 0x7300, - 0xD2A4: 0x72FA, - 0xD2A5: 0x72F4, - 0xD2A6: 0x72FE, - 0xD2A7: 0x72F6, - 0xD2A8: 0x72F3, - 0xD2A9: 0x72FB, - 0xD2AA: 0x7301, - 0xD2AB: 0x73D3, - 0xD2AC: 0x73D9, - 0xD2AD: 0x73E5, - 0xD2AE: 0x73D6, - 0xD2AF: 0x73BC, - 0xD2B0: 0x73E7, - 0xD2B1: 0x73E3, - 0xD2B2: 0x73E9, - 0xD2B3: 0x73DC, - 0xD2B4: 0x73D2, - 0xD2B5: 0x73DB, - 0xD2B6: 0x73D4, - 0xD2B7: 0x73DD, - 0xD2B8: 0x73DA, - 0xD2B9: 0x73D7, - 0xD2BA: 0x73D8, - 0xD2BB: 0x73E8, - 0xD2BC: 0x74DE, - 0xD2BD: 0x74DF, - 0xD2BE: 0x74F4, - 0xD2BF: 0x74F5, - 0xD2C0: 0x7521, - 0xD2C1: 0x755B, - 0xD2C2: 0x755F, - 0xD2C3: 0x75B0, - 0xD2C4: 0x75C1, - 0xD2C5: 0x75BB, - 0xD2C6: 0x75C4, - 0xD2C7: 0x75C0, - 0xD2C8: 0x75BF, - 0xD2C9: 0x75B6, - 0xD2CA: 0x75BA, - 0xD2CB: 0x768A, - 0xD2CC: 0x76C9, - 0xD2CD: 0x771D, - 0xD2CE: 0x771B, - 0xD2CF: 0x7710, - 0xD2D0: 0x7713, - 0xD2D1: 0x7712, - 0xD2D2: 0x7723, - 0xD2D3: 0x7711, - 0xD2D4: 0x7715, - 0xD2D5: 0x7719, - 0xD2D6: 0x771A, - 0xD2D7: 0x7722, - 0xD2D8: 0x7727, - 0xD2D9: 0x7823, - 0xD2DA: 0x782C, - 0xD2DB: 0x7822, - 0xD2DC: 0x7835, - 0xD2DD: 0x782F, - 0xD2DE: 0x7828, - 0xD2DF: 0x782E, - 0xD2E0: 0x782B, - 0xD2E1: 0x7821, - 0xD2E2: 0x7829, - 0xD2E3: 0x7833, - 0xD2E4: 0x782A, - 0xD2E5: 0x7831, - 0xD2E6: 0x7954, - 0xD2E7: 0x795B, - 0xD2E8: 0x794F, - 0xD2E9: 0x795C, - 0xD2EA: 0x7953, - 0xD2EB: 0x7952, - 0xD2EC: 0x7951, - 0xD2ED: 0x79EB, - 0xD2EE: 0x79EC, - 0xD2EF: 0x79E0, - 0xD2F0: 0x79EE, - 0xD2F1: 0x79ED, - 0xD2F2: 0x79EA, - 0xD2F3: 0x79DC, - 0xD2F4: 0x79DE, - 0xD2F5: 0x79DD, - 0xD2F6: 0x7A86, - 0xD2F7: 0x7A89, - 0xD2F8: 0x7A85, - 0xD2F9: 0x7A8B, - 0xD2FA: 0x7A8C, - 0xD2FB: 0x7A8A, - 0xD2FC: 0x7A87, - 0xD2FD: 0x7AD8, - 0xD2FE: 0x7B10, - 0xD340: 0x7B04, - 0xD341: 0x7B13, - 0xD342: 0x7B05, - 0xD343: 0x7B0F, - 0xD344: 0x7B08, - 0xD345: 0x7B0A, - 0xD346: 0x7B0E, - 0xD347: 0x7B09, - 0xD348: 0x7B12, - 0xD349: 0x7C84, - 0xD34A: 0x7C91, - 0xD34B: 0x7C8A, - 0xD34C: 0x7C8C, - 0xD34D: 0x7C88, - 0xD34E: 0x7C8D, - 0xD34F: 0x7C85, - 0xD350: 0x7D1E, - 0xD351: 0x7D1D, - 0xD352: 0x7D11, - 0xD353: 0x7D0E, - 0xD354: 0x7D18, - 0xD355: 0x7D16, - 0xD356: 0x7D13, - 0xD357: 0x7D1F, - 0xD358: 0x7D12, - 0xD359: 0x7D0F, - 0xD35A: 0x7D0C, - 0xD35B: 0x7F5C, - 0xD35C: 0x7F61, - 0xD35D: 0x7F5E, - 0xD35E: 0x7F60, - 0xD35F: 0x7F5D, - 0xD360: 0x7F5B, - 0xD361: 0x7F96, - 0xD362: 0x7F92, - 0xD363: 0x7FC3, - 0xD364: 0x7FC2, - 0xD365: 0x7FC0, - 0xD366: 0x8016, - 0xD367: 0x803E, - 0xD368: 0x8039, - 0xD369: 0x80FA, - 0xD36A: 0x80F2, - 0xD36B: 0x80F9, - 0xD36C: 0x80F5, - 0xD36D: 0x8101, - 0xD36E: 0x80FB, - 0xD36F: 0x8100, - 0xD370: 0x8201, - 0xD371: 0x822F, - 0xD372: 0x8225, - 0xD373: 0x8333, - 0xD374: 0x832D, - 0xD375: 0x8344, - 0xD376: 0x8319, - 0xD377: 0x8351, - 0xD378: 0x8325, - 0xD379: 0x8356, - 0xD37A: 0x833F, - 0xD37B: 0x8341, - 0xD37C: 0x8326, - 0xD37D: 0x831C, - 0xD37E: 0x8322, - 0xD3A1: 0x8342, - 0xD3A2: 0x834E, - 0xD3A3: 0x831B, - 0xD3A4: 0x832A, - 0xD3A5: 0x8308, - 0xD3A6: 0x833C, - 0xD3A7: 0x834D, - 0xD3A8: 0x8316, - 0xD3A9: 0x8324, - 0xD3AA: 0x8320, - 0xD3AB: 0x8337, - 0xD3AC: 0x832F, - 0xD3AD: 0x8329, - 0xD3AE: 0x8347, - 0xD3AF: 0x8345, - 0xD3B0: 0x834C, - 0xD3B1: 0x8353, - 0xD3B2: 0x831E, - 0xD3B3: 0x832C, - 0xD3B4: 0x834B, - 0xD3B5: 0x8327, - 0xD3B6: 0x8348, - 0xD3B7: 0x8653, - 0xD3B8: 0x8652, - 0xD3B9: 0x86A2, - 0xD3BA: 0x86A8, - 0xD3BB: 0x8696, - 0xD3BC: 0x868D, - 0xD3BD: 0x8691, - 0xD3BE: 0x869E, - 0xD3BF: 0x8687, - 0xD3C0: 0x8697, - 0xD3C1: 0x8686, - 0xD3C2: 0x868B, - 0xD3C3: 0x869A, - 0xD3C4: 0x8685, - 0xD3C5: 0x86A5, - 0xD3C6: 0x8699, - 0xD3C7: 0x86A1, - 0xD3C8: 0x86A7, - 0xD3C9: 0x8695, - 0xD3CA: 0x8698, - 0xD3CB: 0x868E, - 0xD3CC: 0x869D, - 0xD3CD: 0x8690, - 0xD3CE: 0x8694, - 0xD3CF: 0x8843, - 0xD3D0: 0x8844, - 0xD3D1: 0x886D, - 0xD3D2: 0x8875, - 0xD3D3: 0x8876, - 0xD3D4: 0x8872, - 0xD3D5: 0x8880, - 0xD3D6: 0x8871, - 0xD3D7: 0x887F, - 0xD3D8: 0x886F, - 0xD3D9: 0x8883, - 0xD3DA: 0x887E, - 0xD3DB: 0x8874, - 0xD3DC: 0x887C, - 0xD3DD: 0x8A12, - 0xD3DE: 0x8C47, - 0xD3DF: 0x8C57, - 0xD3E0: 0x8C7B, - 0xD3E1: 0x8CA4, - 0xD3E2: 0x8CA3, - 0xD3E3: 0x8D76, - 0xD3E4: 0x8D78, - 0xD3E5: 0x8DB5, - 0xD3E6: 0x8DB7, - 0xD3E7: 0x8DB6, - 0xD3E8: 0x8ED1, - 0xD3E9: 0x8ED3, - 0xD3EA: 0x8FFE, - 0xD3EB: 0x8FF5, - 0xD3EC: 0x9002, - 0xD3ED: 0x8FFF, - 0xD3EE: 0x8FFB, - 0xD3EF: 0x9004, - 0xD3F0: 0x8FFC, - 0xD3F1: 0x8FF6, - 0xD3F2: 0x90D6, - 0xD3F3: 0x90E0, - 0xD3F4: 0x90D9, - 0xD3F5: 0x90DA, - 0xD3F6: 0x90E3, - 0xD3F7: 0x90DF, - 0xD3F8: 0x90E5, - 0xD3F9: 0x90D8, - 0xD3FA: 0x90DB, - 0xD3FB: 0x90D7, - 0xD3FC: 0x90DC, - 0xD3FD: 0x90E4, - 0xD3FE: 0x9150, - 0xD440: 0x914E, - 0xD441: 0x914F, - 0xD442: 0x91D5, - 0xD443: 0x91E2, - 0xD444: 0x91DA, - 0xD445: 0x965C, - 0xD446: 0x965F, - 0xD447: 0x96BC, - 0xD448: 0x98E3, - 0xD449: 0x9ADF, - 0xD44A: 0x9B2F, - 0xD44B: 0x4E7F, - 0xD44C: 0x5070, - 0xD44D: 0x506A, - 0xD44E: 0x5061, - 0xD44F: 0x505E, - 0xD450: 0x5060, - 0xD451: 0x5053, - 0xD452: 0x504B, - 0xD453: 0x505D, - 0xD454: 0x5072, - 0xD455: 0x5048, - 0xD456: 0x504D, - 0xD457: 0x5041, - 0xD458: 0x505B, - 0xD459: 0x504A, - 0xD45A: 0x5062, - 0xD45B: 0x5015, - 0xD45C: 0x5045, - 0xD45D: 0x505F, - 0xD45E: 0x5069, - 0xD45F: 0x506B, - 0xD460: 0x5063, - 0xD461: 0x5064, - 0xD462: 0x5046, - 0xD463: 0x5040, - 0xD464: 0x506E, - 0xD465: 0x5073, - 0xD466: 0x5057, - 0xD467: 0x5051, - 0xD468: 0x51D0, - 0xD469: 0x526B, - 0xD46A: 0x526D, - 0xD46B: 0x526C, - 0xD46C: 0x526E, - 0xD46D: 0x52D6, - 0xD46E: 0x52D3, - 0xD46F: 0x532D, - 0xD470: 0x539C, - 0xD471: 0x5575, - 0xD472: 0x5576, - 0xD473: 0x553C, - 0xD474: 0x554D, - 0xD475: 0x5550, - 0xD476: 0x5534, - 0xD477: 0x552A, - 0xD478: 0x5551, - 0xD479: 0x5562, - 0xD47A: 0x5536, - 0xD47B: 0x5535, - 0xD47C: 0x5530, - 0xD47D: 0x5552, - 0xD47E: 0x5545, - 0xD4A1: 0x550C, - 0xD4A2: 0x5532, - 0xD4A3: 0x5565, - 0xD4A4: 0x554E, - 0xD4A5: 0x5539, - 0xD4A6: 0x5548, - 0xD4A7: 0x552D, - 0xD4A8: 0x553B, - 0xD4A9: 0x5540, - 0xD4AA: 0x554B, - 0xD4AB: 0x570A, - 0xD4AC: 0x5707, - 0xD4AD: 0x57FB, - 0xD4AE: 0x5814, - 0xD4AF: 0x57E2, - 0xD4B0: 0x57F6, - 0xD4B1: 0x57DC, - 0xD4B2: 0x57F4, - 0xD4B3: 0x5800, - 0xD4B4: 0x57ED, - 0xD4B5: 0x57FD, - 0xD4B6: 0x5808, - 0xD4B7: 0x57F8, - 0xD4B8: 0x580B, - 0xD4B9: 0x57F3, - 0xD4BA: 0x57CF, - 0xD4BB: 0x5807, - 0xD4BC: 0x57EE, - 0xD4BD: 0x57E3, - 0xD4BE: 0x57F2, - 0xD4BF: 0x57E5, - 0xD4C0: 0x57EC, - 0xD4C1: 0x57E1, - 0xD4C2: 0x580E, - 0xD4C3: 0x57FC, - 0xD4C4: 0x5810, - 0xD4C5: 0x57E7, - 0xD4C6: 0x5801, - 0xD4C7: 0x580C, - 0xD4C8: 0x57F1, - 0xD4C9: 0x57E9, - 0xD4CA: 0x57F0, - 0xD4CB: 0x580D, - 0xD4CC: 0x5804, - 0xD4CD: 0x595C, - 0xD4CE: 0x5A60, - 0xD4CF: 0x5A58, - 0xD4D0: 0x5A55, - 0xD4D1: 0x5A67, - 0xD4D2: 0x5A5E, - 0xD4D3: 0x5A38, - 0xD4D4: 0x5A35, - 0xD4D5: 0x5A6D, - 0xD4D6: 0x5A50, - 0xD4D7: 0x5A5F, - 0xD4D8: 0x5A65, - 0xD4D9: 0x5A6C, - 0xD4DA: 0x5A53, - 0xD4DB: 0x5A64, - 0xD4DC: 0x5A57, - 0xD4DD: 0x5A43, - 0xD4DE: 0x5A5D, - 0xD4DF: 0x5A52, - 0xD4E0: 0x5A44, - 0xD4E1: 0x5A5B, - 0xD4E2: 0x5A48, - 0xD4E3: 0x5A8E, - 0xD4E4: 0x5A3E, - 0xD4E5: 0x5A4D, - 0xD4E6: 0x5A39, - 0xD4E7: 0x5A4C, - 0xD4E8: 0x5A70, - 0xD4E9: 0x5A69, - 0xD4EA: 0x5A47, - 0xD4EB: 0x5A51, - 0xD4EC: 0x5A56, - 0xD4ED: 0x5A42, - 0xD4EE: 0x5A5C, - 0xD4EF: 0x5B72, - 0xD4F0: 0x5B6E, - 0xD4F1: 0x5BC1, - 0xD4F2: 0x5BC0, - 0xD4F3: 0x5C59, - 0xD4F4: 0x5D1E, - 0xD4F5: 0x5D0B, - 0xD4F6: 0x5D1D, - 0xD4F7: 0x5D1A, - 0xD4F8: 0x5D20, - 0xD4F9: 0x5D0C, - 0xD4FA: 0x5D28, - 0xD4FB: 0x5D0D, - 0xD4FC: 0x5D26, - 0xD4FD: 0x5D25, - 0xD4FE: 0x5D0F, - 0xD540: 0x5D30, - 0xD541: 0x5D12, - 0xD542: 0x5D23, - 0xD543: 0x5D1F, - 0xD544: 0x5D2E, - 0xD545: 0x5E3E, - 0xD546: 0x5E34, - 0xD547: 0x5EB1, - 0xD548: 0x5EB4, - 0xD549: 0x5EB9, - 0xD54A: 0x5EB2, - 0xD54B: 0x5EB3, - 0xD54C: 0x5F36, - 0xD54D: 0x5F38, - 0xD54E: 0x5F9B, - 0xD54F: 0x5F96, - 0xD550: 0x5F9F, - 0xD551: 0x608A, - 0xD552: 0x6090, - 0xD553: 0x6086, - 0xD554: 0x60BE, - 0xD555: 0x60B0, - 0xD556: 0x60BA, - 0xD557: 0x60D3, - 0xD558: 0x60D4, - 0xD559: 0x60CF, - 0xD55A: 0x60E4, - 0xD55B: 0x60D9, - 0xD55C: 0x60DD, - 0xD55D: 0x60C8, - 0xD55E: 0x60B1, - 0xD55F: 0x60DB, - 0xD560: 0x60B7, - 0xD561: 0x60CA, - 0xD562: 0x60BF, - 0xD563: 0x60C3, - 0xD564: 0x60CD, - 0xD565: 0x60C0, - 0xD566: 0x6332, - 0xD567: 0x6365, - 0xD568: 0x638A, - 0xD569: 0x6382, - 0xD56A: 0x637D, - 0xD56B: 0x63BD, - 0xD56C: 0x639E, - 0xD56D: 0x63AD, - 0xD56E: 0x639D, - 0xD56F: 0x6397, - 0xD570: 0x63AB, - 0xD571: 0x638E, - 0xD572: 0x636F, - 0xD573: 0x6387, - 0xD574: 0x6390, - 0xD575: 0x636E, - 0xD576: 0x63AF, - 0xD577: 0x6375, - 0xD578: 0x639C, - 0xD579: 0x636D, - 0xD57A: 0x63AE, - 0xD57B: 0x637C, - 0xD57C: 0x63A4, - 0xD57D: 0x633B, - 0xD57E: 0x639F, - 0xD5A1: 0x6378, - 0xD5A2: 0x6385, - 0xD5A3: 0x6381, - 0xD5A4: 0x6391, - 0xD5A5: 0x638D, - 0xD5A6: 0x6370, - 0xD5A7: 0x6553, - 0xD5A8: 0x65CD, - 0xD5A9: 0x6665, - 0xD5AA: 0x6661, - 0xD5AB: 0x665B, - 0xD5AC: 0x6659, - 0xD5AD: 0x665C, - 0xD5AE: 0x6662, - 0xD5AF: 0x6718, - 0xD5B0: 0x6879, - 0xD5B1: 0x6887, - 0xD5B2: 0x6890, - 0xD5B3: 0x689C, - 0xD5B4: 0x686D, - 0xD5B5: 0x686E, - 0xD5B6: 0x68AE, - 0xD5B7: 0x68AB, - 0xD5B8: 0x6956, - 0xD5B9: 0x686F, - 0xD5BA: 0x68A3, - 0xD5BB: 0x68AC, - 0xD5BC: 0x68A9, - 0xD5BD: 0x6875, - 0xD5BE: 0x6874, - 0xD5BF: 0x68B2, - 0xD5C0: 0x688F, - 0xD5C1: 0x6877, - 0xD5C2: 0x6892, - 0xD5C3: 0x687C, - 0xD5C4: 0x686B, - 0xD5C5: 0x6872, - 0xD5C6: 0x68AA, - 0xD5C7: 0x6880, - 0xD5C8: 0x6871, - 0xD5C9: 0x687E, - 0xD5CA: 0x689B, - 0xD5CB: 0x6896, - 0xD5CC: 0x688B, - 0xD5CD: 0x68A0, - 0xD5CE: 0x6889, - 0xD5CF: 0x68A4, - 0xD5D0: 0x6878, - 0xD5D1: 0x687B, - 0xD5D2: 0x6891, - 0xD5D3: 0x688C, - 0xD5D4: 0x688A, - 0xD5D5: 0x687D, - 0xD5D6: 0x6B36, - 0xD5D7: 0x6B33, - 0xD5D8: 0x6B37, - 0xD5D9: 0x6B38, - 0xD5DA: 0x6B91, - 0xD5DB: 0x6B8F, - 0xD5DC: 0x6B8D, - 0xD5DD: 0x6B8E, - 0xD5DE: 0x6B8C, - 0xD5DF: 0x6C2A, - 0xD5E0: 0x6DC0, - 0xD5E1: 0x6DAB, - 0xD5E2: 0x6DB4, - 0xD5E3: 0x6DB3, - 0xD5E4: 0x6E74, - 0xD5E5: 0x6DAC, - 0xD5E6: 0x6DE9, - 0xD5E7: 0x6DE2, - 0xD5E8: 0x6DB7, - 0xD5E9: 0x6DF6, - 0xD5EA: 0x6DD4, - 0xD5EB: 0x6E00, - 0xD5EC: 0x6DC8, - 0xD5ED: 0x6DE0, - 0xD5EE: 0x6DDF, - 0xD5EF: 0x6DD6, - 0xD5F0: 0x6DBE, - 0xD5F1: 0x6DE5, - 0xD5F2: 0x6DDC, - 0xD5F3: 0x6DDD, - 0xD5F4: 0x6DDB, - 0xD5F5: 0x6DF4, - 0xD5F6: 0x6DCA, - 0xD5F7: 0x6DBD, - 0xD5F8: 0x6DED, - 0xD5F9: 0x6DF0, - 0xD5FA: 0x6DBA, - 0xD5FB: 0x6DD5, - 0xD5FC: 0x6DC2, - 0xD5FD: 0x6DCF, - 0xD5FE: 0x6DC9, - 0xD640: 0x6DD0, - 0xD641: 0x6DF2, - 0xD642: 0x6DD3, - 0xD643: 0x6DFD, - 0xD644: 0x6DD7, - 0xD645: 0x6DCD, - 0xD646: 0x6DE3, - 0xD647: 0x6DBB, - 0xD648: 0x70FA, - 0xD649: 0x710D, - 0xD64A: 0x70F7, - 0xD64B: 0x7117, - 0xD64C: 0x70F4, - 0xD64D: 0x710C, - 0xD64E: 0x70F0, - 0xD64F: 0x7104, - 0xD650: 0x70F3, - 0xD651: 0x7110, - 0xD652: 0x70FC, - 0xD653: 0x70FF, - 0xD654: 0x7106, - 0xD655: 0x7113, - 0xD656: 0x7100, - 0xD657: 0x70F8, - 0xD658: 0x70F6, - 0xD659: 0x710B, - 0xD65A: 0x7102, - 0xD65B: 0x710E, - 0xD65C: 0x727E, - 0xD65D: 0x727B, - 0xD65E: 0x727C, - 0xD65F: 0x727F, - 0xD660: 0x731D, - 0xD661: 0x7317, - 0xD662: 0x7307, - 0xD663: 0x7311, - 0xD664: 0x7318, - 0xD665: 0x730A, - 0xD666: 0x7308, - 0xD667: 0x72FF, - 0xD668: 0x730F, - 0xD669: 0x731E, - 0xD66A: 0x7388, - 0xD66B: 0x73F6, - 0xD66C: 0x73F8, - 0xD66D: 0x73F5, - 0xD66E: 0x7404, - 0xD66F: 0x7401, - 0xD670: 0x73FD, - 0xD671: 0x7407, - 0xD672: 0x7400, - 0xD673: 0x73FA, - 0xD674: 0x73FC, - 0xD675: 0x73FF, - 0xD676: 0x740C, - 0xD677: 0x740B, - 0xD678: 0x73F4, - 0xD679: 0x7408, - 0xD67A: 0x7564, - 0xD67B: 0x7563, - 0xD67C: 0x75CE, - 0xD67D: 0x75D2, - 0xD67E: 0x75CF, - 0xD6A1: 0x75CB, - 0xD6A2: 0x75CC, - 0xD6A3: 0x75D1, - 0xD6A4: 0x75D0, - 0xD6A5: 0x768F, - 0xD6A6: 0x7689, - 0xD6A7: 0x76D3, - 0xD6A8: 0x7739, - 0xD6A9: 0x772F, - 0xD6AA: 0x772D, - 0xD6AB: 0x7731, - 0xD6AC: 0x7732, - 0xD6AD: 0x7734, - 0xD6AE: 0x7733, - 0xD6AF: 0x773D, - 0xD6B0: 0x7725, - 0xD6B1: 0x773B, - 0xD6B2: 0x7735, - 0xD6B3: 0x7848, - 0xD6B4: 0x7852, - 0xD6B5: 0x7849, - 0xD6B6: 0x784D, - 0xD6B7: 0x784A, - 0xD6B8: 0x784C, - 0xD6B9: 0x7826, - 0xD6BA: 0x7845, - 0xD6BB: 0x7850, - 0xD6BC: 0x7964, - 0xD6BD: 0x7967, - 0xD6BE: 0x7969, - 0xD6BF: 0x796A, - 0xD6C0: 0x7963, - 0xD6C1: 0x796B, - 0xD6C2: 0x7961, - 0xD6C3: 0x79BB, - 0xD6C4: 0x79FA, - 0xD6C5: 0x79F8, - 0xD6C6: 0x79F6, - 0xD6C7: 0x79F7, - 0xD6C8: 0x7A8F, - 0xD6C9: 0x7A94, - 0xD6CA: 0x7A90, - 0xD6CB: 0x7B35, - 0xD6CC: 0x7B47, - 0xD6CD: 0x7B34, - 0xD6CE: 0x7B25, - 0xD6CF: 0x7B30, - 0xD6D0: 0x7B22, - 0xD6D1: 0x7B24, - 0xD6D2: 0x7B33, - 0xD6D3: 0x7B18, - 0xD6D4: 0x7B2A, - 0xD6D5: 0x7B1D, - 0xD6D6: 0x7B31, - 0xD6D7: 0x7B2B, - 0xD6D8: 0x7B2D, - 0xD6D9: 0x7B2F, - 0xD6DA: 0x7B32, - 0xD6DB: 0x7B38, - 0xD6DC: 0x7B1A, - 0xD6DD: 0x7B23, - 0xD6DE: 0x7C94, - 0xD6DF: 0x7C98, - 0xD6E0: 0x7C96, - 0xD6E1: 0x7CA3, - 0xD6E2: 0x7D35, - 0xD6E3: 0x7D3D, - 0xD6E4: 0x7D38, - 0xD6E5: 0x7D36, - 0xD6E6: 0x7D3A, - 0xD6E7: 0x7D45, - 0xD6E8: 0x7D2C, - 0xD6E9: 0x7D29, - 0xD6EA: 0x7D41, - 0xD6EB: 0x7D47, - 0xD6EC: 0x7D3E, - 0xD6ED: 0x7D3F, - 0xD6EE: 0x7D4A, - 0xD6EF: 0x7D3B, - 0xD6F0: 0x7D28, - 0xD6F1: 0x7F63, - 0xD6F2: 0x7F95, - 0xD6F3: 0x7F9C, - 0xD6F4: 0x7F9D, - 0xD6F5: 0x7F9B, - 0xD6F6: 0x7FCA, - 0xD6F7: 0x7FCB, - 0xD6F8: 0x7FCD, - 0xD6F9: 0x7FD0, - 0xD6FA: 0x7FD1, - 0xD6FB: 0x7FC7, - 0xD6FC: 0x7FCF, - 0xD6FD: 0x7FC9, - 0xD6FE: 0x801F, - 0xD740: 0x801E, - 0xD741: 0x801B, - 0xD742: 0x8047, - 0xD743: 0x8043, - 0xD744: 0x8048, - 0xD745: 0x8118, - 0xD746: 0x8125, - 0xD747: 0x8119, - 0xD748: 0x811B, - 0xD749: 0x812D, - 0xD74A: 0x811F, - 0xD74B: 0x812C, - 0xD74C: 0x811E, - 0xD74D: 0x8121, - 0xD74E: 0x8115, - 0xD74F: 0x8127, - 0xD750: 0x811D, - 0xD751: 0x8122, - 0xD752: 0x8211, - 0xD753: 0x8238, - 0xD754: 0x8233, - 0xD755: 0x823A, - 0xD756: 0x8234, - 0xD757: 0x8232, - 0xD758: 0x8274, - 0xD759: 0x8390, - 0xD75A: 0x83A3, - 0xD75B: 0x83A8, - 0xD75C: 0x838D, - 0xD75D: 0x837A, - 0xD75E: 0x8373, - 0xD75F: 0x83A4, - 0xD760: 0x8374, - 0xD761: 0x838F, - 0xD762: 0x8381, - 0xD763: 0x8395, - 0xD764: 0x8399, - 0xD765: 0x8375, - 0xD766: 0x8394, - 0xD767: 0x83A9, - 0xD768: 0x837D, - 0xD769: 0x8383, - 0xD76A: 0x838C, - 0xD76B: 0x839D, - 0xD76C: 0x839B, - 0xD76D: 0x83AA, - 0xD76E: 0x838B, - 0xD76F: 0x837E, - 0xD770: 0x83A5, - 0xD771: 0x83AF, - 0xD772: 0x8388, - 0xD773: 0x8397, - 0xD774: 0x83B0, - 0xD775: 0x837F, - 0xD776: 0x83A6, - 0xD777: 0x8387, - 0xD778: 0x83AE, - 0xD779: 0x8376, - 0xD77A: 0x839A, - 0xD77B: 0x8659, - 0xD77C: 0x8656, - 0xD77D: 0x86BF, - 0xD77E: 0x86B7, - 0xD7A1: 0x86C2, - 0xD7A2: 0x86C1, - 0xD7A3: 0x86C5, - 0xD7A4: 0x86BA, - 0xD7A5: 0x86B0, - 0xD7A6: 0x86C8, - 0xD7A7: 0x86B9, - 0xD7A8: 0x86B3, - 0xD7A9: 0x86B8, - 0xD7AA: 0x86CC, - 0xD7AB: 0x86B4, - 0xD7AC: 0x86BB, - 0xD7AD: 0x86BC, - 0xD7AE: 0x86C3, - 0xD7AF: 0x86BD, - 0xD7B0: 0x86BE, - 0xD7B1: 0x8852, - 0xD7B2: 0x8889, - 0xD7B3: 0x8895, - 0xD7B4: 0x88A8, - 0xD7B5: 0x88A2, - 0xD7B6: 0x88AA, - 0xD7B7: 0x889A, - 0xD7B8: 0x8891, - 0xD7B9: 0x88A1, - 0xD7BA: 0x889F, - 0xD7BB: 0x8898, - 0xD7BC: 0x88A7, - 0xD7BD: 0x8899, - 0xD7BE: 0x889B, - 0xD7BF: 0x8897, - 0xD7C0: 0x88A4, - 0xD7C1: 0x88AC, - 0xD7C2: 0x888C, - 0xD7C3: 0x8893, - 0xD7C4: 0x888E, - 0xD7C5: 0x8982, - 0xD7C6: 0x89D6, - 0xD7C7: 0x89D9, - 0xD7C8: 0x89D5, - 0xD7C9: 0x8A30, - 0xD7CA: 0x8A27, - 0xD7CB: 0x8A2C, - 0xD7CC: 0x8A1E, - 0xD7CD: 0x8C39, - 0xD7CE: 0x8C3B, - 0xD7CF: 0x8C5C, - 0xD7D0: 0x8C5D, - 0xD7D1: 0x8C7D, - 0xD7D2: 0x8CA5, - 0xD7D3: 0x8D7D, - 0xD7D4: 0x8D7B, - 0xD7D5: 0x8D79, - 0xD7D6: 0x8DBC, - 0xD7D7: 0x8DC2, - 0xD7D8: 0x8DB9, - 0xD7D9: 0x8DBF, - 0xD7DA: 0x8DC1, - 0xD7DB: 0x8ED8, - 0xD7DC: 0x8EDE, - 0xD7DD: 0x8EDD, - 0xD7DE: 0x8EDC, - 0xD7DF: 0x8ED7, - 0xD7E0: 0x8EE0, - 0xD7E1: 0x8EE1, - 0xD7E2: 0x9024, - 0xD7E3: 0x900B, - 0xD7E4: 0x9011, - 0xD7E5: 0x901C, - 0xD7E6: 0x900C, - 0xD7E7: 0x9021, - 0xD7E8: 0x90EF, - 0xD7E9: 0x90EA, - 0xD7EA: 0x90F0, - 0xD7EB: 0x90F4, - 0xD7EC: 0x90F2, - 0xD7ED: 0x90F3, - 0xD7EE: 0x90D4, - 0xD7EF: 0x90EB, - 0xD7F0: 0x90EC, - 0xD7F1: 0x90E9, - 0xD7F2: 0x9156, - 0xD7F3: 0x9158, - 0xD7F4: 0x915A, - 0xD7F5: 0x9153, - 0xD7F6: 0x9155, - 0xD7F7: 0x91EC, - 0xD7F8: 0x91F4, - 0xD7F9: 0x91F1, - 0xD7FA: 0x91F3, - 0xD7FB: 0x91F8, - 0xD7FC: 0x91E4, - 0xD7FD: 0x91F9, - 0xD7FE: 0x91EA, - 0xD840: 0x91EB, - 0xD841: 0x91F7, - 0xD842: 0x91E8, - 0xD843: 0x91EE, - 0xD844: 0x957A, - 0xD845: 0x9586, - 0xD846: 0x9588, - 0xD847: 0x967C, - 0xD848: 0x966D, - 0xD849: 0x966B, - 0xD84A: 0x9671, - 0xD84B: 0x966F, - 0xD84C: 0x96BF, - 0xD84D: 0x976A, - 0xD84E: 0x9804, - 0xD84F: 0x98E5, - 0xD850: 0x9997, - 0xD851: 0x509B, - 0xD852: 0x5095, - 0xD853: 0x5094, - 0xD854: 0x509E, - 0xD855: 0x508B, - 0xD856: 0x50A3, - 0xD857: 0x5083, - 0xD858: 0x508C, - 0xD859: 0x508E, - 0xD85A: 0x509D, - 0xD85B: 0x5068, - 0xD85C: 0x509C, - 0xD85D: 0x5092, - 0xD85E: 0x5082, - 0xD85F: 0x5087, - 0xD860: 0x515F, - 0xD861: 0x51D4, - 0xD862: 0x5312, - 0xD863: 0x5311, - 0xD864: 0x53A4, - 0xD865: 0x53A7, - 0xD866: 0x5591, - 0xD867: 0x55A8, - 0xD868: 0x55A5, - 0xD869: 0x55AD, - 0xD86A: 0x5577, - 0xD86B: 0x5645, - 0xD86C: 0x55A2, - 0xD86D: 0x5593, - 0xD86E: 0x5588, - 0xD86F: 0x558F, - 0xD870: 0x55B5, - 0xD871: 0x5581, - 0xD872: 0x55A3, - 0xD873: 0x5592, - 0xD874: 0x55A4, - 0xD875: 0x557D, - 0xD876: 0x558C, - 0xD877: 0x55A6, - 0xD878: 0x557F, - 0xD879: 0x5595, - 0xD87A: 0x55A1, - 0xD87B: 0x558E, - 0xD87C: 0x570C, - 0xD87D: 0x5829, - 0xD87E: 0x5837, - 0xD8A1: 0x5819, - 0xD8A2: 0x581E, - 0xD8A3: 0x5827, - 0xD8A4: 0x5823, - 0xD8A5: 0x5828, - 0xD8A6: 0x57F5, - 0xD8A7: 0x5848, - 0xD8A8: 0x5825, - 0xD8A9: 0x581C, - 0xD8AA: 0x581B, - 0xD8AB: 0x5833, - 0xD8AC: 0x583F, - 0xD8AD: 0x5836, - 0xD8AE: 0x582E, - 0xD8AF: 0x5839, - 0xD8B0: 0x5838, - 0xD8B1: 0x582D, - 0xD8B2: 0x582C, - 0xD8B3: 0x583B, - 0xD8B4: 0x5961, - 0xD8B5: 0x5AAF, - 0xD8B6: 0x5A94, - 0xD8B7: 0x5A9F, - 0xD8B8: 0x5A7A, - 0xD8B9: 0x5AA2, - 0xD8BA: 0x5A9E, - 0xD8BB: 0x5A78, - 0xD8BC: 0x5AA6, - 0xD8BD: 0x5A7C, - 0xD8BE: 0x5AA5, - 0xD8BF: 0x5AAC, - 0xD8C0: 0x5A95, - 0xD8C1: 0x5AAE, - 0xD8C2: 0x5A37, - 0xD8C3: 0x5A84, - 0xD8C4: 0x5A8A, - 0xD8C5: 0x5A97, - 0xD8C6: 0x5A83, - 0xD8C7: 0x5A8B, - 0xD8C8: 0x5AA9, - 0xD8C9: 0x5A7B, - 0xD8CA: 0x5A7D, - 0xD8CB: 0x5A8C, - 0xD8CC: 0x5A9C, - 0xD8CD: 0x5A8F, - 0xD8CE: 0x5A93, - 0xD8CF: 0x5A9D, - 0xD8D0: 0x5BEA, - 0xD8D1: 0x5BCD, - 0xD8D2: 0x5BCB, - 0xD8D3: 0x5BD4, - 0xD8D4: 0x5BD1, - 0xD8D5: 0x5BCA, - 0xD8D6: 0x5BCE, - 0xD8D7: 0x5C0C, - 0xD8D8: 0x5C30, - 0xD8D9: 0x5D37, - 0xD8DA: 0x5D43, - 0xD8DB: 0x5D6B, - 0xD8DC: 0x5D41, - 0xD8DD: 0x5D4B, - 0xD8DE: 0x5D3F, - 0xD8DF: 0x5D35, - 0xD8E0: 0x5D51, - 0xD8E1: 0x5D4E, - 0xD8E2: 0x5D55, - 0xD8E3: 0x5D33, - 0xD8E4: 0x5D3A, - 0xD8E5: 0x5D52, - 0xD8E6: 0x5D3D, - 0xD8E7: 0x5D31, - 0xD8E8: 0x5D59, - 0xD8E9: 0x5D42, - 0xD8EA: 0x5D39, - 0xD8EB: 0x5D49, - 0xD8EC: 0x5D38, - 0xD8ED: 0x5D3C, - 0xD8EE: 0x5D32, - 0xD8EF: 0x5D36, - 0xD8F0: 0x5D40, - 0xD8F1: 0x5D45, - 0xD8F2: 0x5E44, - 0xD8F3: 0x5E41, - 0xD8F4: 0x5F58, - 0xD8F5: 0x5FA6, - 0xD8F6: 0x5FA5, - 0xD8F7: 0x5FAB, - 0xD8F8: 0x60C9, - 0xD8F9: 0x60B9, - 0xD8FA: 0x60CC, - 0xD8FB: 0x60E2, - 0xD8FC: 0x60CE, - 0xD8FD: 0x60C4, - 0xD8FE: 0x6114, - 0xD940: 0x60F2, - 0xD941: 0x610A, - 0xD942: 0x6116, - 0xD943: 0x6105, - 0xD944: 0x60F5, - 0xD945: 0x6113, - 0xD946: 0x60F8, - 0xD947: 0x60FC, - 0xD948: 0x60FE, - 0xD949: 0x60C1, - 0xD94A: 0x6103, - 0xD94B: 0x6118, - 0xD94C: 0x611D, - 0xD94D: 0x6110, - 0xD94E: 0x60FF, - 0xD94F: 0x6104, - 0xD950: 0x610B, - 0xD951: 0x624A, - 0xD952: 0x6394, - 0xD953: 0x63B1, - 0xD954: 0x63B0, - 0xD955: 0x63CE, - 0xD956: 0x63E5, - 0xD957: 0x63E8, - 0xD958: 0x63EF, - 0xD959: 0x63C3, - 0xD95A: 0x649D, - 0xD95B: 0x63F3, - 0xD95C: 0x63CA, - 0xD95D: 0x63E0, - 0xD95E: 0x63F6, - 0xD95F: 0x63D5, - 0xD960: 0x63F2, - 0xD961: 0x63F5, - 0xD962: 0x6461, - 0xD963: 0x63DF, - 0xD964: 0x63BE, - 0xD965: 0x63DD, - 0xD966: 0x63DC, - 0xD967: 0x63C4, - 0xD968: 0x63D8, - 0xD969: 0x63D3, - 0xD96A: 0x63C2, - 0xD96B: 0x63C7, - 0xD96C: 0x63CC, - 0xD96D: 0x63CB, - 0xD96E: 0x63C8, - 0xD96F: 0x63F0, - 0xD970: 0x63D7, - 0xD971: 0x63D9, - 0xD972: 0x6532, - 0xD973: 0x6567, - 0xD974: 0x656A, - 0xD975: 0x6564, - 0xD976: 0x655C, - 0xD977: 0x6568, - 0xD978: 0x6565, - 0xD979: 0x658C, - 0xD97A: 0x659D, - 0xD97B: 0x659E, - 0xD97C: 0x65AE, - 0xD97D: 0x65D0, - 0xD97E: 0x65D2, - 0xD9A1: 0x667C, - 0xD9A2: 0x666C, - 0xD9A3: 0x667B, - 0xD9A4: 0x6680, - 0xD9A5: 0x6671, - 0xD9A6: 0x6679, - 0xD9A7: 0x666A, - 0xD9A8: 0x6672, - 0xD9A9: 0x6701, - 0xD9AA: 0x690C, - 0xD9AB: 0x68D3, - 0xD9AC: 0x6904, - 0xD9AD: 0x68DC, - 0xD9AE: 0x692A, - 0xD9AF: 0x68EC, - 0xD9B0: 0x68EA, - 0xD9B1: 0x68F1, - 0xD9B2: 0x690F, - 0xD9B3: 0x68D6, - 0xD9B4: 0x68F7, - 0xD9B5: 0x68EB, - 0xD9B6: 0x68E4, - 0xD9B7: 0x68F6, - 0xD9B8: 0x6913, - 0xD9B9: 0x6910, - 0xD9BA: 0x68F3, - 0xD9BB: 0x68E1, - 0xD9BC: 0x6907, - 0xD9BD: 0x68CC, - 0xD9BE: 0x6908, - 0xD9BF: 0x6970, - 0xD9C0: 0x68B4, - 0xD9C1: 0x6911, - 0xD9C2: 0x68EF, - 0xD9C3: 0x68C6, - 0xD9C4: 0x6914, - 0xD9C5: 0x68F8, - 0xD9C6: 0x68D0, - 0xD9C7: 0x68FD, - 0xD9C8: 0x68FC, - 0xD9C9: 0x68E8, - 0xD9CA: 0x690B, - 0xD9CB: 0x690A, - 0xD9CC: 0x6917, - 0xD9CD: 0x68CE, - 0xD9CE: 0x68C8, - 0xD9CF: 0x68DD, - 0xD9D0: 0x68DE, - 0xD9D1: 0x68E6, - 0xD9D2: 0x68F4, - 0xD9D3: 0x68D1, - 0xD9D4: 0x6906, - 0xD9D5: 0x68D4, - 0xD9D6: 0x68E9, - 0xD9D7: 0x6915, - 0xD9D8: 0x6925, - 0xD9D9: 0x68C7, - 0xD9DA: 0x6B39, - 0xD9DB: 0x6B3B, - 0xD9DC: 0x6B3F, - 0xD9DD: 0x6B3C, - 0xD9DE: 0x6B94, - 0xD9DF: 0x6B97, - 0xD9E0: 0x6B99, - 0xD9E1: 0x6B95, - 0xD9E2: 0x6BBD, - 0xD9E3: 0x6BF0, - 0xD9E4: 0x6BF2, - 0xD9E5: 0x6BF3, - 0xD9E6: 0x6C30, - 0xD9E7: 0x6DFC, - 0xD9E8: 0x6E46, - 0xD9E9: 0x6E47, - 0xD9EA: 0x6E1F, - 0xD9EB: 0x6E49, - 0xD9EC: 0x6E88, - 0xD9ED: 0x6E3C, - 0xD9EE: 0x6E3D, - 0xD9EF: 0x6E45, - 0xD9F0: 0x6E62, - 0xD9F1: 0x6E2B, - 0xD9F2: 0x6E3F, - 0xD9F3: 0x6E41, - 0xD9F4: 0x6E5D, - 0xD9F5: 0x6E73, - 0xD9F6: 0x6E1C, - 0xD9F7: 0x6E33, - 0xD9F8: 0x6E4B, - 0xD9F9: 0x6E40, - 0xD9FA: 0x6E51, - 0xD9FB: 0x6E3B, - 0xD9FC: 0x6E03, - 0xD9FD: 0x6E2E, - 0xD9FE: 0x6E5E, - 0xDA40: 0x6E68, - 0xDA41: 0x6E5C, - 0xDA42: 0x6E61, - 0xDA43: 0x6E31, - 0xDA44: 0x6E28, - 0xDA45: 0x6E60, - 0xDA46: 0x6E71, - 0xDA47: 0x6E6B, - 0xDA48: 0x6E39, - 0xDA49: 0x6E22, - 0xDA4A: 0x6E30, - 0xDA4B: 0x6E53, - 0xDA4C: 0x6E65, - 0xDA4D: 0x6E27, - 0xDA4E: 0x6E78, - 0xDA4F: 0x6E64, - 0xDA50: 0x6E77, - 0xDA51: 0x6E55, - 0xDA52: 0x6E79, - 0xDA53: 0x6E52, - 0xDA54: 0x6E66, - 0xDA55: 0x6E35, - 0xDA56: 0x6E36, - 0xDA57: 0x6E5A, - 0xDA58: 0x7120, - 0xDA59: 0x711E, - 0xDA5A: 0x712F, - 0xDA5B: 0x70FB, - 0xDA5C: 0x712E, - 0xDA5D: 0x7131, - 0xDA5E: 0x7123, - 0xDA5F: 0x7125, - 0xDA60: 0x7122, - 0xDA61: 0x7132, - 0xDA62: 0x711F, - 0xDA63: 0x7128, - 0xDA64: 0x713A, - 0xDA65: 0x711B, - 0xDA66: 0x724B, - 0xDA67: 0x725A, - 0xDA68: 0x7288, - 0xDA69: 0x7289, - 0xDA6A: 0x7286, - 0xDA6B: 0x7285, - 0xDA6C: 0x728B, - 0xDA6D: 0x7312, - 0xDA6E: 0x730B, - 0xDA6F: 0x7330, - 0xDA70: 0x7322, - 0xDA71: 0x7331, - 0xDA72: 0x7333, - 0xDA73: 0x7327, - 0xDA74: 0x7332, - 0xDA75: 0x732D, - 0xDA76: 0x7326, - 0xDA77: 0x7323, - 0xDA78: 0x7335, - 0xDA79: 0x730C, - 0xDA7A: 0x742E, - 0xDA7B: 0x742C, - 0xDA7C: 0x7430, - 0xDA7D: 0x742B, - 0xDA7E: 0x7416, - 0xDAA1: 0x741A, - 0xDAA2: 0x7421, - 0xDAA3: 0x742D, - 0xDAA4: 0x7431, - 0xDAA5: 0x7424, - 0xDAA6: 0x7423, - 0xDAA7: 0x741D, - 0xDAA8: 0x7429, - 0xDAA9: 0x7420, - 0xDAAA: 0x7432, - 0xDAAB: 0x74FB, - 0xDAAC: 0x752F, - 0xDAAD: 0x756F, - 0xDAAE: 0x756C, - 0xDAAF: 0x75E7, - 0xDAB0: 0x75DA, - 0xDAB1: 0x75E1, - 0xDAB2: 0x75E6, - 0xDAB3: 0x75DD, - 0xDAB4: 0x75DF, - 0xDAB5: 0x75E4, - 0xDAB6: 0x75D7, - 0xDAB7: 0x7695, - 0xDAB8: 0x7692, - 0xDAB9: 0x76DA, - 0xDABA: 0x7746, - 0xDABB: 0x7747, - 0xDABC: 0x7744, - 0xDABD: 0x774D, - 0xDABE: 0x7745, - 0xDABF: 0x774A, - 0xDAC0: 0x774E, - 0xDAC1: 0x774B, - 0xDAC2: 0x774C, - 0xDAC3: 0x77DE, - 0xDAC4: 0x77EC, - 0xDAC5: 0x7860, - 0xDAC6: 0x7864, - 0xDAC7: 0x7865, - 0xDAC8: 0x785C, - 0xDAC9: 0x786D, - 0xDACA: 0x7871, - 0xDACB: 0x786A, - 0xDACC: 0x786E, - 0xDACD: 0x7870, - 0xDACE: 0x7869, - 0xDACF: 0x7868, - 0xDAD0: 0x785E, - 0xDAD1: 0x7862, - 0xDAD2: 0x7974, - 0xDAD3: 0x7973, - 0xDAD4: 0x7972, - 0xDAD5: 0x7970, - 0xDAD6: 0x7A02, - 0xDAD7: 0x7A0A, - 0xDAD8: 0x7A03, - 0xDAD9: 0x7A0C, - 0xDADA: 0x7A04, - 0xDADB: 0x7A99, - 0xDADC: 0x7AE6, - 0xDADD: 0x7AE4, - 0xDADE: 0x7B4A, - 0xDADF: 0x7B3B, - 0xDAE0: 0x7B44, - 0xDAE1: 0x7B48, - 0xDAE2: 0x7B4C, - 0xDAE3: 0x7B4E, - 0xDAE4: 0x7B40, - 0xDAE5: 0x7B58, - 0xDAE6: 0x7B45, - 0xDAE7: 0x7CA2, - 0xDAE8: 0x7C9E, - 0xDAE9: 0x7CA8, - 0xDAEA: 0x7CA1, - 0xDAEB: 0x7D58, - 0xDAEC: 0x7D6F, - 0xDAED: 0x7D63, - 0xDAEE: 0x7D53, - 0xDAEF: 0x7D56, - 0xDAF0: 0x7D67, - 0xDAF1: 0x7D6A, - 0xDAF2: 0x7D4F, - 0xDAF3: 0x7D6D, - 0xDAF4: 0x7D5C, - 0xDAF5: 0x7D6B, - 0xDAF6: 0x7D52, - 0xDAF7: 0x7D54, - 0xDAF8: 0x7D69, - 0xDAF9: 0x7D51, - 0xDAFA: 0x7D5F, - 0xDAFB: 0x7D4E, - 0xDAFC: 0x7F3E, - 0xDAFD: 0x7F3F, - 0xDAFE: 0x7F65, - 0xDB40: 0x7F66, - 0xDB41: 0x7FA2, - 0xDB42: 0x7FA0, - 0xDB43: 0x7FA1, - 0xDB44: 0x7FD7, - 0xDB45: 0x8051, - 0xDB46: 0x804F, - 0xDB47: 0x8050, - 0xDB48: 0x80FE, - 0xDB49: 0x80D4, - 0xDB4A: 0x8143, - 0xDB4B: 0x814A, - 0xDB4C: 0x8152, - 0xDB4D: 0x814F, - 0xDB4E: 0x8147, - 0xDB4F: 0x813D, - 0xDB50: 0x814D, - 0xDB51: 0x813A, - 0xDB52: 0x81E6, - 0xDB53: 0x81EE, - 0xDB54: 0x81F7, - 0xDB55: 0x81F8, - 0xDB56: 0x81F9, - 0xDB57: 0x8204, - 0xDB58: 0x823C, - 0xDB59: 0x823D, - 0xDB5A: 0x823F, - 0xDB5B: 0x8275, - 0xDB5C: 0x833B, - 0xDB5D: 0x83CF, - 0xDB5E: 0x83F9, - 0xDB5F: 0x8423, - 0xDB60: 0x83C0, - 0xDB61: 0x83E8, - 0xDB62: 0x8412, - 0xDB63: 0x83E7, - 0xDB64: 0x83E4, - 0xDB65: 0x83FC, - 0xDB66: 0x83F6, - 0xDB67: 0x8410, - 0xDB68: 0x83C6, - 0xDB69: 0x83C8, - 0xDB6A: 0x83EB, - 0xDB6B: 0x83E3, - 0xDB6C: 0x83BF, - 0xDB6D: 0x8401, - 0xDB6E: 0x83DD, - 0xDB6F: 0x83E5, - 0xDB70: 0x83D8, - 0xDB71: 0x83FF, - 0xDB72: 0x83E1, - 0xDB73: 0x83CB, - 0xDB74: 0x83CE, - 0xDB75: 0x83D6, - 0xDB76: 0x83F5, - 0xDB77: 0x83C9, - 0xDB78: 0x8409, - 0xDB79: 0x840F, - 0xDB7A: 0x83DE, - 0xDB7B: 0x8411, - 0xDB7C: 0x8406, - 0xDB7D: 0x83C2, - 0xDB7E: 0x83F3, - 0xDBA1: 0x83D5, - 0xDBA2: 0x83FA, - 0xDBA3: 0x83C7, - 0xDBA4: 0x83D1, - 0xDBA5: 0x83EA, - 0xDBA6: 0x8413, - 0xDBA7: 0x83C3, - 0xDBA8: 0x83EC, - 0xDBA9: 0x83EE, - 0xDBAA: 0x83C4, - 0xDBAB: 0x83FB, - 0xDBAC: 0x83D7, - 0xDBAD: 0x83E2, - 0xDBAE: 0x841B, - 0xDBAF: 0x83DB, - 0xDBB0: 0x83FE, - 0xDBB1: 0x86D8, - 0xDBB2: 0x86E2, - 0xDBB3: 0x86E6, - 0xDBB4: 0x86D3, - 0xDBB5: 0x86E3, - 0xDBB6: 0x86DA, - 0xDBB7: 0x86EA, - 0xDBB8: 0x86DD, - 0xDBB9: 0x86EB, - 0xDBBA: 0x86DC, - 0xDBBB: 0x86EC, - 0xDBBC: 0x86E9, - 0xDBBD: 0x86D7, - 0xDBBE: 0x86E8, - 0xDBBF: 0x86D1, - 0xDBC0: 0x8848, - 0xDBC1: 0x8856, - 0xDBC2: 0x8855, - 0xDBC3: 0x88BA, - 0xDBC4: 0x88D7, - 0xDBC5: 0x88B9, - 0xDBC6: 0x88B8, - 0xDBC7: 0x88C0, - 0xDBC8: 0x88BE, - 0xDBC9: 0x88B6, - 0xDBCA: 0x88BC, - 0xDBCB: 0x88B7, - 0xDBCC: 0x88BD, - 0xDBCD: 0x88B2, - 0xDBCE: 0x8901, - 0xDBCF: 0x88C9, - 0xDBD0: 0x8995, - 0xDBD1: 0x8998, - 0xDBD2: 0x8997, - 0xDBD3: 0x89DD, - 0xDBD4: 0x89DA, - 0xDBD5: 0x89DB, - 0xDBD6: 0x8A4E, - 0xDBD7: 0x8A4D, - 0xDBD8: 0x8A39, - 0xDBD9: 0x8A59, - 0xDBDA: 0x8A40, - 0xDBDB: 0x8A57, - 0xDBDC: 0x8A58, - 0xDBDD: 0x8A44, - 0xDBDE: 0x8A45, - 0xDBDF: 0x8A52, - 0xDBE0: 0x8A48, - 0xDBE1: 0x8A51, - 0xDBE2: 0x8A4A, - 0xDBE3: 0x8A4C, - 0xDBE4: 0x8A4F, - 0xDBE5: 0x8C5F, - 0xDBE6: 0x8C81, - 0xDBE7: 0x8C80, - 0xDBE8: 0x8CBA, - 0xDBE9: 0x8CBE, - 0xDBEA: 0x8CB0, - 0xDBEB: 0x8CB9, - 0xDBEC: 0x8CB5, - 0xDBED: 0x8D84, - 0xDBEE: 0x8D80, - 0xDBEF: 0x8D89, - 0xDBF0: 0x8DD8, - 0xDBF1: 0x8DD3, - 0xDBF2: 0x8DCD, - 0xDBF3: 0x8DC7, - 0xDBF4: 0x8DD6, - 0xDBF5: 0x8DDC, - 0xDBF6: 0x8DCF, - 0xDBF7: 0x8DD5, - 0xDBF8: 0x8DD9, - 0xDBF9: 0x8DC8, - 0xDBFA: 0x8DD7, - 0xDBFB: 0x8DC5, - 0xDBFC: 0x8EEF, - 0xDBFD: 0x8EF7, - 0xDBFE: 0x8EFA, - 0xDC40: 0x8EF9, - 0xDC41: 0x8EE6, - 0xDC42: 0x8EEE, - 0xDC43: 0x8EE5, - 0xDC44: 0x8EF5, - 0xDC45: 0x8EE7, - 0xDC46: 0x8EE8, - 0xDC47: 0x8EF6, - 0xDC48: 0x8EEB, - 0xDC49: 0x8EF1, - 0xDC4A: 0x8EEC, - 0xDC4B: 0x8EF4, - 0xDC4C: 0x8EE9, - 0xDC4D: 0x902D, - 0xDC4E: 0x9034, - 0xDC4F: 0x902F, - 0xDC50: 0x9106, - 0xDC51: 0x912C, - 0xDC52: 0x9104, - 0xDC53: 0x90FF, - 0xDC54: 0x90FC, - 0xDC55: 0x9108, - 0xDC56: 0x90F9, - 0xDC57: 0x90FB, - 0xDC58: 0x9101, - 0xDC59: 0x9100, - 0xDC5A: 0x9107, - 0xDC5B: 0x9105, - 0xDC5C: 0x9103, - 0xDC5D: 0x9161, - 0xDC5E: 0x9164, - 0xDC5F: 0x915F, - 0xDC60: 0x9162, - 0xDC61: 0x9160, - 0xDC62: 0x9201, - 0xDC63: 0x920A, - 0xDC64: 0x9225, - 0xDC65: 0x9203, - 0xDC66: 0x921A, - 0xDC67: 0x9226, - 0xDC68: 0x920F, - 0xDC69: 0x920C, - 0xDC6A: 0x9200, - 0xDC6B: 0x9212, - 0xDC6C: 0x91FF, - 0xDC6D: 0x91FD, - 0xDC6E: 0x9206, - 0xDC6F: 0x9204, - 0xDC70: 0x9227, - 0xDC71: 0x9202, - 0xDC72: 0x921C, - 0xDC73: 0x9224, - 0xDC74: 0x9219, - 0xDC75: 0x9217, - 0xDC76: 0x9205, - 0xDC77: 0x9216, - 0xDC78: 0x957B, - 0xDC79: 0x958D, - 0xDC7A: 0x958C, - 0xDC7B: 0x9590, - 0xDC7C: 0x9687, - 0xDC7D: 0x967E, - 0xDC7E: 0x9688, - 0xDCA1: 0x9689, - 0xDCA2: 0x9683, - 0xDCA3: 0x9680, - 0xDCA4: 0x96C2, - 0xDCA5: 0x96C8, - 0xDCA6: 0x96C3, - 0xDCA7: 0x96F1, - 0xDCA8: 0x96F0, - 0xDCA9: 0x976C, - 0xDCAA: 0x9770, - 0xDCAB: 0x976E, - 0xDCAC: 0x9807, - 0xDCAD: 0x98A9, - 0xDCAE: 0x98EB, - 0xDCAF: 0x9CE6, - 0xDCB0: 0x9EF9, - 0xDCB1: 0x4E83, - 0xDCB2: 0x4E84, - 0xDCB3: 0x4EB6, - 0xDCB4: 0x50BD, - 0xDCB5: 0x50BF, - 0xDCB6: 0x50C6, - 0xDCB7: 0x50AE, - 0xDCB8: 0x50C4, - 0xDCB9: 0x50CA, - 0xDCBA: 0x50B4, - 0xDCBB: 0x50C8, - 0xDCBC: 0x50C2, - 0xDCBD: 0x50B0, - 0xDCBE: 0x50C1, - 0xDCBF: 0x50BA, - 0xDCC0: 0x50B1, - 0xDCC1: 0x50CB, - 0xDCC2: 0x50C9, - 0xDCC3: 0x50B6, - 0xDCC4: 0x50B8, - 0xDCC5: 0x51D7, - 0xDCC6: 0x527A, - 0xDCC7: 0x5278, - 0xDCC8: 0x527B, - 0xDCC9: 0x527C, - 0xDCCA: 0x55C3, - 0xDCCB: 0x55DB, - 0xDCCC: 0x55CC, - 0xDCCD: 0x55D0, - 0xDCCE: 0x55CB, - 0xDCCF: 0x55CA, - 0xDCD0: 0x55DD, - 0xDCD1: 0x55C0, - 0xDCD2: 0x55D4, - 0xDCD3: 0x55C4, - 0xDCD4: 0x55E9, - 0xDCD5: 0x55BF, - 0xDCD6: 0x55D2, - 0xDCD7: 0x558D, - 0xDCD8: 0x55CF, - 0xDCD9: 0x55D5, - 0xDCDA: 0x55E2, - 0xDCDB: 0x55D6, - 0xDCDC: 0x55C8, - 0xDCDD: 0x55F2, - 0xDCDE: 0x55CD, - 0xDCDF: 0x55D9, - 0xDCE0: 0x55C2, - 0xDCE1: 0x5714, - 0xDCE2: 0x5853, - 0xDCE3: 0x5868, - 0xDCE4: 0x5864, - 0xDCE5: 0x584F, - 0xDCE6: 0x584D, - 0xDCE7: 0x5849, - 0xDCE8: 0x586F, - 0xDCE9: 0x5855, - 0xDCEA: 0x584E, - 0xDCEB: 0x585D, - 0xDCEC: 0x5859, - 0xDCED: 0x5865, - 0xDCEE: 0x585B, - 0xDCEF: 0x583D, - 0xDCF0: 0x5863, - 0xDCF1: 0x5871, - 0xDCF2: 0x58FC, - 0xDCF3: 0x5AC7, - 0xDCF4: 0x5AC4, - 0xDCF5: 0x5ACB, - 0xDCF6: 0x5ABA, - 0xDCF7: 0x5AB8, - 0xDCF8: 0x5AB1, - 0xDCF9: 0x5AB5, - 0xDCFA: 0x5AB0, - 0xDCFB: 0x5ABF, - 0xDCFC: 0x5AC8, - 0xDCFD: 0x5ABB, - 0xDCFE: 0x5AC6, - 0xDD40: 0x5AB7, - 0xDD41: 0x5AC0, - 0xDD42: 0x5ACA, - 0xDD43: 0x5AB4, - 0xDD44: 0x5AB6, - 0xDD45: 0x5ACD, - 0xDD46: 0x5AB9, - 0xDD47: 0x5A90, - 0xDD48: 0x5BD6, - 0xDD49: 0x5BD8, - 0xDD4A: 0x5BD9, - 0xDD4B: 0x5C1F, - 0xDD4C: 0x5C33, - 0xDD4D: 0x5D71, - 0xDD4E: 0x5D63, - 0xDD4F: 0x5D4A, - 0xDD50: 0x5D65, - 0xDD51: 0x5D72, - 0xDD52: 0x5D6C, - 0xDD53: 0x5D5E, - 0xDD54: 0x5D68, - 0xDD55: 0x5D67, - 0xDD56: 0x5D62, - 0xDD57: 0x5DF0, - 0xDD58: 0x5E4F, - 0xDD59: 0x5E4E, - 0xDD5A: 0x5E4A, - 0xDD5B: 0x5E4D, - 0xDD5C: 0x5E4B, - 0xDD5D: 0x5EC5, - 0xDD5E: 0x5ECC, - 0xDD5F: 0x5EC6, - 0xDD60: 0x5ECB, - 0xDD61: 0x5EC7, - 0xDD62: 0x5F40, - 0xDD63: 0x5FAF, - 0xDD64: 0x5FAD, - 0xDD65: 0x60F7, - 0xDD66: 0x6149, - 0xDD67: 0x614A, - 0xDD68: 0x612B, - 0xDD69: 0x6145, - 0xDD6A: 0x6136, - 0xDD6B: 0x6132, - 0xDD6C: 0x612E, - 0xDD6D: 0x6146, - 0xDD6E: 0x612F, - 0xDD6F: 0x614F, - 0xDD70: 0x6129, - 0xDD71: 0x6140, - 0xDD72: 0x6220, - 0xDD73: 0x9168, - 0xDD74: 0x6223, - 0xDD75: 0x6225, - 0xDD76: 0x6224, - 0xDD77: 0x63C5, - 0xDD78: 0x63F1, - 0xDD79: 0x63EB, - 0xDD7A: 0x6410, - 0xDD7B: 0x6412, - 0xDD7C: 0x6409, - 0xDD7D: 0x6420, - 0xDD7E: 0x6424, - 0xDDA1: 0x6433, - 0xDDA2: 0x6443, - 0xDDA3: 0x641F, - 0xDDA4: 0x6415, - 0xDDA5: 0x6418, - 0xDDA6: 0x6439, - 0xDDA7: 0x6437, - 0xDDA8: 0x6422, - 0xDDA9: 0x6423, - 0xDDAA: 0x640C, - 0xDDAB: 0x6426, - 0xDDAC: 0x6430, - 0xDDAD: 0x6428, - 0xDDAE: 0x6441, - 0xDDAF: 0x6435, - 0xDDB0: 0x642F, - 0xDDB1: 0x640A, - 0xDDB2: 0x641A, - 0xDDB3: 0x6440, - 0xDDB4: 0x6425, - 0xDDB5: 0x6427, - 0xDDB6: 0x640B, - 0xDDB7: 0x63E7, - 0xDDB8: 0x641B, - 0xDDB9: 0x642E, - 0xDDBA: 0x6421, - 0xDDBB: 0x640E, - 0xDDBC: 0x656F, - 0xDDBD: 0x6592, - 0xDDBE: 0x65D3, - 0xDDBF: 0x6686, - 0xDDC0: 0x668C, - 0xDDC1: 0x6695, - 0xDDC2: 0x6690, - 0xDDC3: 0x668B, - 0xDDC4: 0x668A, - 0xDDC5: 0x6699, - 0xDDC6: 0x6694, - 0xDDC7: 0x6678, - 0xDDC8: 0x6720, - 0xDDC9: 0x6966, - 0xDDCA: 0x695F, - 0xDDCB: 0x6938, - 0xDDCC: 0x694E, - 0xDDCD: 0x6962, - 0xDDCE: 0x6971, - 0xDDCF: 0x693F, - 0xDDD0: 0x6945, - 0xDDD1: 0x696A, - 0xDDD2: 0x6939, - 0xDDD3: 0x6942, - 0xDDD4: 0x6957, - 0xDDD5: 0x6959, - 0xDDD6: 0x697A, - 0xDDD7: 0x6948, - 0xDDD8: 0x6949, - 0xDDD9: 0x6935, - 0xDDDA: 0x696C, - 0xDDDB: 0x6933, - 0xDDDC: 0x693D, - 0xDDDD: 0x6965, - 0xDDDE: 0x68F0, - 0xDDDF: 0x6978, - 0xDDE0: 0x6934, - 0xDDE1: 0x6969, - 0xDDE2: 0x6940, - 0xDDE3: 0x696F, - 0xDDE4: 0x6944, - 0xDDE5: 0x6976, - 0xDDE6: 0x6958, - 0xDDE7: 0x6941, - 0xDDE8: 0x6974, - 0xDDE9: 0x694C, - 0xDDEA: 0x693B, - 0xDDEB: 0x694B, - 0xDDEC: 0x6937, - 0xDDED: 0x695C, - 0xDDEE: 0x694F, - 0xDDEF: 0x6951, - 0xDDF0: 0x6932, - 0xDDF1: 0x6952, - 0xDDF2: 0x692F, - 0xDDF3: 0x697B, - 0xDDF4: 0x693C, - 0xDDF5: 0x6B46, - 0xDDF6: 0x6B45, - 0xDDF7: 0x6B43, - 0xDDF8: 0x6B42, - 0xDDF9: 0x6B48, - 0xDDFA: 0x6B41, - 0xDDFB: 0x6B9B, - 0xDDFC: 0xFA0D, // CJK COMPATIBILITY IDEOGRAPH-FA0D - 0xDDFD: 0x6BFB, - 0xDDFE: 0x6BFC, - 0xDE40: 0x6BF9, - 0xDE41: 0x6BF7, - 0xDE42: 0x6BF8, - 0xDE43: 0x6E9B, - 0xDE44: 0x6ED6, - 0xDE45: 0x6EC8, - 0xDE46: 0x6E8F, - 0xDE47: 0x6EC0, - 0xDE48: 0x6E9F, - 0xDE49: 0x6E93, - 0xDE4A: 0x6E94, - 0xDE4B: 0x6EA0, - 0xDE4C: 0x6EB1, - 0xDE4D: 0x6EB9, - 0xDE4E: 0x6EC6, - 0xDE4F: 0x6ED2, - 0xDE50: 0x6EBD, - 0xDE51: 0x6EC1, - 0xDE52: 0x6E9E, - 0xDE53: 0x6EC9, - 0xDE54: 0x6EB7, - 0xDE55: 0x6EB0, - 0xDE56: 0x6ECD, - 0xDE57: 0x6EA6, - 0xDE58: 0x6ECF, - 0xDE59: 0x6EB2, - 0xDE5A: 0x6EBE, - 0xDE5B: 0x6EC3, - 0xDE5C: 0x6EDC, - 0xDE5D: 0x6ED8, - 0xDE5E: 0x6E99, - 0xDE5F: 0x6E92, - 0xDE60: 0x6E8E, - 0xDE61: 0x6E8D, - 0xDE62: 0x6EA4, - 0xDE63: 0x6EA1, - 0xDE64: 0x6EBF, - 0xDE65: 0x6EB3, - 0xDE66: 0x6ED0, - 0xDE67: 0x6ECA, - 0xDE68: 0x6E97, - 0xDE69: 0x6EAE, - 0xDE6A: 0x6EA3, - 0xDE6B: 0x7147, - 0xDE6C: 0x7154, - 0xDE6D: 0x7152, - 0xDE6E: 0x7163, - 0xDE6F: 0x7160, - 0xDE70: 0x7141, - 0xDE71: 0x715D, - 0xDE72: 0x7162, - 0xDE73: 0x7172, - 0xDE74: 0x7178, - 0xDE75: 0x716A, - 0xDE76: 0x7161, - 0xDE77: 0x7142, - 0xDE78: 0x7158, - 0xDE79: 0x7143, - 0xDE7A: 0x714B, - 0xDE7B: 0x7170, - 0xDE7C: 0x715F, - 0xDE7D: 0x7150, - 0xDE7E: 0x7153, - 0xDEA1: 0x7144, - 0xDEA2: 0x714D, - 0xDEA3: 0x715A, - 0xDEA4: 0x724F, - 0xDEA5: 0x728D, - 0xDEA6: 0x728C, - 0xDEA7: 0x7291, - 0xDEA8: 0x7290, - 0xDEA9: 0x728E, - 0xDEAA: 0x733C, - 0xDEAB: 0x7342, - 0xDEAC: 0x733B, - 0xDEAD: 0x733A, - 0xDEAE: 0x7340, - 0xDEAF: 0x734A, - 0xDEB0: 0x7349, - 0xDEB1: 0x7444, - 0xDEB2: 0x744A, - 0xDEB3: 0x744B, - 0xDEB4: 0x7452, - 0xDEB5: 0x7451, - 0xDEB6: 0x7457, - 0xDEB7: 0x7440, - 0xDEB8: 0x744F, - 0xDEB9: 0x7450, - 0xDEBA: 0x744E, - 0xDEBB: 0x7442, - 0xDEBC: 0x7446, - 0xDEBD: 0x744D, - 0xDEBE: 0x7454, - 0xDEBF: 0x74E1, - 0xDEC0: 0x74FF, - 0xDEC1: 0x74FE, - 0xDEC2: 0x74FD, - 0xDEC3: 0x751D, - 0xDEC4: 0x7579, - 0xDEC5: 0x7577, - 0xDEC6: 0x6983, - 0xDEC7: 0x75EF, - 0xDEC8: 0x760F, - 0xDEC9: 0x7603, - 0xDECA: 0x75F7, - 0xDECB: 0x75FE, - 0xDECC: 0x75FC, - 0xDECD: 0x75F9, - 0xDECE: 0x75F8, - 0xDECF: 0x7610, - 0xDED0: 0x75FB, - 0xDED1: 0x75F6, - 0xDED2: 0x75ED, - 0xDED3: 0x75F5, - 0xDED4: 0x75FD, - 0xDED5: 0x7699, - 0xDED6: 0x76B5, - 0xDED7: 0x76DD, - 0xDED8: 0x7755, - 0xDED9: 0x775F, - 0xDEDA: 0x7760, - 0xDEDB: 0x7752, - 0xDEDC: 0x7756, - 0xDEDD: 0x775A, - 0xDEDE: 0x7769, - 0xDEDF: 0x7767, - 0xDEE0: 0x7754, - 0xDEE1: 0x7759, - 0xDEE2: 0x776D, - 0xDEE3: 0x77E0, - 0xDEE4: 0x7887, - 0xDEE5: 0x789A, - 0xDEE6: 0x7894, - 0xDEE7: 0x788F, - 0xDEE8: 0x7884, - 0xDEE9: 0x7895, - 0xDEEA: 0x7885, - 0xDEEB: 0x7886, - 0xDEEC: 0x78A1, - 0xDEED: 0x7883, - 0xDEEE: 0x7879, - 0xDEEF: 0x7899, - 0xDEF0: 0x7880, - 0xDEF1: 0x7896, - 0xDEF2: 0x787B, - 0xDEF3: 0x797C, - 0xDEF4: 0x7982, - 0xDEF5: 0x797D, - 0xDEF6: 0x7979, - 0xDEF7: 0x7A11, - 0xDEF8: 0x7A18, - 0xDEF9: 0x7A19, - 0xDEFA: 0x7A12, - 0xDEFB: 0x7A17, - 0xDEFC: 0x7A15, - 0xDEFD: 0x7A22, - 0xDEFE: 0x7A13, - 0xDF40: 0x7A1B, - 0xDF41: 0x7A10, - 0xDF42: 0x7AA3, - 0xDF43: 0x7AA2, - 0xDF44: 0x7A9E, - 0xDF45: 0x7AEB, - 0xDF46: 0x7B66, - 0xDF47: 0x7B64, - 0xDF48: 0x7B6D, - 0xDF49: 0x7B74, - 0xDF4A: 0x7B69, - 0xDF4B: 0x7B72, - 0xDF4C: 0x7B65, - 0xDF4D: 0x7B73, - 0xDF4E: 0x7B71, - 0xDF4F: 0x7B70, - 0xDF50: 0x7B61, - 0xDF51: 0x7B78, - 0xDF52: 0x7B76, - 0xDF53: 0x7B63, - 0xDF54: 0x7CB2, - 0xDF55: 0x7CB4, - 0xDF56: 0x7CAF, - 0xDF57: 0x7D88, - 0xDF58: 0x7D86, - 0xDF59: 0x7D80, - 0xDF5A: 0x7D8D, - 0xDF5B: 0x7D7F, - 0xDF5C: 0x7D85, - 0xDF5D: 0x7D7A, - 0xDF5E: 0x7D8E, - 0xDF5F: 0x7D7B, - 0xDF60: 0x7D83, - 0xDF61: 0x7D7C, - 0xDF62: 0x7D8C, - 0xDF63: 0x7D94, - 0xDF64: 0x7D84, - 0xDF65: 0x7D7D, - 0xDF66: 0x7D92, - 0xDF67: 0x7F6D, - 0xDF68: 0x7F6B, - 0xDF69: 0x7F67, - 0xDF6A: 0x7F68, - 0xDF6B: 0x7F6C, - 0xDF6C: 0x7FA6, - 0xDF6D: 0x7FA5, - 0xDF6E: 0x7FA7, - 0xDF6F: 0x7FDB, - 0xDF70: 0x7FDC, - 0xDF71: 0x8021, - 0xDF72: 0x8164, - 0xDF73: 0x8160, - 0xDF74: 0x8177, - 0xDF75: 0x815C, - 0xDF76: 0x8169, - 0xDF77: 0x815B, - 0xDF78: 0x8162, - 0xDF79: 0x8172, - 0xDF7A: 0x6721, - 0xDF7B: 0x815E, - 0xDF7C: 0x8176, - 0xDF7D: 0x8167, - 0xDF7E: 0x816F, - 0xDFA1: 0x8144, - 0xDFA2: 0x8161, - 0xDFA3: 0x821D, - 0xDFA4: 0x8249, - 0xDFA5: 0x8244, - 0xDFA6: 0x8240, - 0xDFA7: 0x8242, - 0xDFA8: 0x8245, - 0xDFA9: 0x84F1, - 0xDFAA: 0x843F, - 0xDFAB: 0x8456, - 0xDFAC: 0x8476, - 0xDFAD: 0x8479, - 0xDFAE: 0x848F, - 0xDFAF: 0x848D, - 0xDFB0: 0x8465, - 0xDFB1: 0x8451, - 0xDFB2: 0x8440, - 0xDFB3: 0x8486, - 0xDFB4: 0x8467, - 0xDFB5: 0x8430, - 0xDFB6: 0x844D, - 0xDFB7: 0x847D, - 0xDFB8: 0x845A, - 0xDFB9: 0x8459, - 0xDFBA: 0x8474, - 0xDFBB: 0x8473, - 0xDFBC: 0x845D, - 0xDFBD: 0x8507, - 0xDFBE: 0x845E, - 0xDFBF: 0x8437, - 0xDFC0: 0x843A, - 0xDFC1: 0x8434, - 0xDFC2: 0x847A, - 0xDFC3: 0x8443, - 0xDFC4: 0x8478, - 0xDFC5: 0x8432, - 0xDFC6: 0x8445, - 0xDFC7: 0x8429, - 0xDFC8: 0x83D9, - 0xDFC9: 0x844B, - 0xDFCA: 0x842F, - 0xDFCB: 0x8442, - 0xDFCC: 0x842D, - 0xDFCD: 0x845F, - 0xDFCE: 0x8470, - 0xDFCF: 0x8439, - 0xDFD0: 0x844E, - 0xDFD1: 0x844C, - 0xDFD2: 0x8452, - 0xDFD3: 0x846F, - 0xDFD4: 0x84C5, - 0xDFD5: 0x848E, - 0xDFD6: 0x843B, - 0xDFD7: 0x8447, - 0xDFD8: 0x8436, - 0xDFD9: 0x8433, - 0xDFDA: 0x8468, - 0xDFDB: 0x847E, - 0xDFDC: 0x8444, - 0xDFDD: 0x842B, - 0xDFDE: 0x8460, - 0xDFDF: 0x8454, - 0xDFE0: 0x846E, - 0xDFE1: 0x8450, - 0xDFE2: 0x870B, - 0xDFE3: 0x8704, - 0xDFE4: 0x86F7, - 0xDFE5: 0x870C, - 0xDFE6: 0x86FA, - 0xDFE7: 0x86D6, - 0xDFE8: 0x86F5, - 0xDFE9: 0x874D, - 0xDFEA: 0x86F8, - 0xDFEB: 0x870E, - 0xDFEC: 0x8709, - 0xDFED: 0x8701, - 0xDFEE: 0x86F6, - 0xDFEF: 0x870D, - 0xDFF0: 0x8705, - 0xDFF1: 0x88D6, - 0xDFF2: 0x88CB, - 0xDFF3: 0x88CD, - 0xDFF4: 0x88CE, - 0xDFF5: 0x88DE, - 0xDFF6: 0x88DB, - 0xDFF7: 0x88DA, - 0xDFF8: 0x88CC, - 0xDFF9: 0x88D0, - 0xDFFA: 0x8985, - 0xDFFB: 0x899B, - 0xDFFC: 0x89DF, - 0xDFFD: 0x89E5, - 0xDFFE: 0x89E4, - 0xE040: 0x89E1, - 0xE041: 0x89E0, - 0xE042: 0x89E2, - 0xE043: 0x89DC, - 0xE044: 0x89E6, - 0xE045: 0x8A76, - 0xE046: 0x8A86, - 0xE047: 0x8A7F, - 0xE048: 0x8A61, - 0xE049: 0x8A3F, - 0xE04A: 0x8A77, - 0xE04B: 0x8A82, - 0xE04C: 0x8A84, - 0xE04D: 0x8A75, - 0xE04E: 0x8A83, - 0xE04F: 0x8A81, - 0xE050: 0x8A74, - 0xE051: 0x8A7A, - 0xE052: 0x8C3C, - 0xE053: 0x8C4B, - 0xE054: 0x8C4A, - 0xE055: 0x8C65, - 0xE056: 0x8C64, - 0xE057: 0x8C66, - 0xE058: 0x8C86, - 0xE059: 0x8C84, - 0xE05A: 0x8C85, - 0xE05B: 0x8CCC, - 0xE05C: 0x8D68, - 0xE05D: 0x8D69, - 0xE05E: 0x8D91, - 0xE05F: 0x8D8C, - 0xE060: 0x8D8E, - 0xE061: 0x8D8F, - 0xE062: 0x8D8D, - 0xE063: 0x8D93, - 0xE064: 0x8D94, - 0xE065: 0x8D90, - 0xE066: 0x8D92, - 0xE067: 0x8DF0, - 0xE068: 0x8DE0, - 0xE069: 0x8DEC, - 0xE06A: 0x8DF1, - 0xE06B: 0x8DEE, - 0xE06C: 0x8DD0, - 0xE06D: 0x8DE9, - 0xE06E: 0x8DE3, - 0xE06F: 0x8DE2, - 0xE070: 0x8DE7, - 0xE071: 0x8DF2, - 0xE072: 0x8DEB, - 0xE073: 0x8DF4, - 0xE074: 0x8F06, - 0xE075: 0x8EFF, - 0xE076: 0x8F01, - 0xE077: 0x8F00, - 0xE078: 0x8F05, - 0xE079: 0x8F07, - 0xE07A: 0x8F08, - 0xE07B: 0x8F02, - 0xE07C: 0x8F0B, - 0xE07D: 0x9052, - 0xE07E: 0x903F, - 0xE0A1: 0x9044, - 0xE0A2: 0x9049, - 0xE0A3: 0x903D, - 0xE0A4: 0x9110, - 0xE0A5: 0x910D, - 0xE0A6: 0x910F, - 0xE0A7: 0x9111, - 0xE0A8: 0x9116, - 0xE0A9: 0x9114, - 0xE0AA: 0x910B, - 0xE0AB: 0x910E, - 0xE0AC: 0x916E, - 0xE0AD: 0x916F, - 0xE0AE: 0x9248, - 0xE0AF: 0x9252, - 0xE0B0: 0x9230, - 0xE0B1: 0x923A, - 0xE0B2: 0x9266, - 0xE0B3: 0x9233, - 0xE0B4: 0x9265, - 0xE0B5: 0x925E, - 0xE0B6: 0x9283, - 0xE0B7: 0x922E, - 0xE0B8: 0x924A, - 0xE0B9: 0x9246, - 0xE0BA: 0x926D, - 0xE0BB: 0x926C, - 0xE0BC: 0x924F, - 0xE0BD: 0x9260, - 0xE0BE: 0x9267, - 0xE0BF: 0x926F, - 0xE0C0: 0x9236, - 0xE0C1: 0x9261, - 0xE0C2: 0x9270, - 0xE0C3: 0x9231, - 0xE0C4: 0x9254, - 0xE0C5: 0x9263, - 0xE0C6: 0x9250, - 0xE0C7: 0x9272, - 0xE0C8: 0x924E, - 0xE0C9: 0x9253, - 0xE0CA: 0x924C, - 0xE0CB: 0x9256, - 0xE0CC: 0x9232, - 0xE0CD: 0x959F, - 0xE0CE: 0x959C, - 0xE0CF: 0x959E, - 0xE0D0: 0x959B, - 0xE0D1: 0x9692, - 0xE0D2: 0x9693, - 0xE0D3: 0x9691, - 0xE0D4: 0x9697, - 0xE0D5: 0x96CE, - 0xE0D6: 0x96FA, - 0xE0D7: 0x96FD, - 0xE0D8: 0x96F8, - 0xE0D9: 0x96F5, - 0xE0DA: 0x9773, - 0xE0DB: 0x9777, - 0xE0DC: 0x9778, - 0xE0DD: 0x9772, - 0xE0DE: 0x980F, - 0xE0DF: 0x980D, - 0xE0E0: 0x980E, - 0xE0E1: 0x98AC, - 0xE0E2: 0x98F6, - 0xE0E3: 0x98F9, - 0xE0E4: 0x99AF, - 0xE0E5: 0x99B2, - 0xE0E6: 0x99B0, - 0xE0E7: 0x99B5, - 0xE0E8: 0x9AAD, - 0xE0E9: 0x9AAB, - 0xE0EA: 0x9B5B, - 0xE0EB: 0x9CEA, - 0xE0EC: 0x9CED, - 0xE0ED: 0x9CE7, - 0xE0EE: 0x9E80, - 0xE0EF: 0x9EFD, - 0xE0F0: 0x50E6, - 0xE0F1: 0x50D4, - 0xE0F2: 0x50D7, - 0xE0F3: 0x50E8, - 0xE0F4: 0x50F3, - 0xE0F5: 0x50DB, - 0xE0F6: 0x50EA, - 0xE0F7: 0x50DD, - 0xE0F8: 0x50E4, - 0xE0F9: 0x50D3, - 0xE0FA: 0x50EC, - 0xE0FB: 0x50F0, - 0xE0FC: 0x50EF, - 0xE0FD: 0x50E3, - 0xE0FE: 0x50E0, - 0xE140: 0x51D8, - 0xE141: 0x5280, - 0xE142: 0x5281, - 0xE143: 0x52E9, - 0xE144: 0x52EB, - 0xE145: 0x5330, - 0xE146: 0x53AC, - 0xE147: 0x5627, - 0xE148: 0x5615, - 0xE149: 0x560C, - 0xE14A: 0x5612, - 0xE14B: 0x55FC, - 0xE14C: 0x560F, - 0xE14D: 0x561C, - 0xE14E: 0x5601, - 0xE14F: 0x5613, - 0xE150: 0x5602, - 0xE151: 0x55FA, - 0xE152: 0x561D, - 0xE153: 0x5604, - 0xE154: 0x55FF, - 0xE155: 0x55F9, - 0xE156: 0x5889, - 0xE157: 0x587C, - 0xE158: 0x5890, - 0xE159: 0x5898, - 0xE15A: 0x5886, - 0xE15B: 0x5881, - 0xE15C: 0x587F, - 0xE15D: 0x5874, - 0xE15E: 0x588B, - 0xE15F: 0x587A, - 0xE160: 0x5887, - 0xE161: 0x5891, - 0xE162: 0x588E, - 0xE163: 0x5876, - 0xE164: 0x5882, - 0xE165: 0x5888, - 0xE166: 0x587B, - 0xE167: 0x5894, - 0xE168: 0x588F, - 0xE169: 0x58FE, - 0xE16A: 0x596B, - 0xE16B: 0x5ADC, - 0xE16C: 0x5AEE, - 0xE16D: 0x5AE5, - 0xE16E: 0x5AD5, - 0xE16F: 0x5AEA, - 0xE170: 0x5ADA, - 0xE171: 0x5AED, - 0xE172: 0x5AEB, - 0xE173: 0x5AF3, - 0xE174: 0x5AE2, - 0xE175: 0x5AE0, - 0xE176: 0x5ADB, - 0xE177: 0x5AEC, - 0xE178: 0x5ADE, - 0xE179: 0x5ADD, - 0xE17A: 0x5AD9, - 0xE17B: 0x5AE8, - 0xE17C: 0x5ADF, - 0xE17D: 0x5B77, - 0xE17E: 0x5BE0, - 0xE1A1: 0x5BE3, - 0xE1A2: 0x5C63, - 0xE1A3: 0x5D82, - 0xE1A4: 0x5D80, - 0xE1A5: 0x5D7D, - 0xE1A6: 0x5D86, - 0xE1A7: 0x5D7A, - 0xE1A8: 0x5D81, - 0xE1A9: 0x5D77, - 0xE1AA: 0x5D8A, - 0xE1AB: 0x5D89, - 0xE1AC: 0x5D88, - 0xE1AD: 0x5D7E, - 0xE1AE: 0x5D7C, - 0xE1AF: 0x5D8D, - 0xE1B0: 0x5D79, - 0xE1B1: 0x5D7F, - 0xE1B2: 0x5E58, - 0xE1B3: 0x5E59, - 0xE1B4: 0x5E53, - 0xE1B5: 0x5ED8, - 0xE1B6: 0x5ED1, - 0xE1B7: 0x5ED7, - 0xE1B8: 0x5ECE, - 0xE1B9: 0x5EDC, - 0xE1BA: 0x5ED5, - 0xE1BB: 0x5ED9, - 0xE1BC: 0x5ED2, - 0xE1BD: 0x5ED4, - 0xE1BE: 0x5F44, - 0xE1BF: 0x5F43, - 0xE1C0: 0x5F6F, - 0xE1C1: 0x5FB6, - 0xE1C2: 0x612C, - 0xE1C3: 0x6128, - 0xE1C4: 0x6141, - 0xE1C5: 0x615E, - 0xE1C6: 0x6171, - 0xE1C7: 0x6173, - 0xE1C8: 0x6152, - 0xE1C9: 0x6153, - 0xE1CA: 0x6172, - 0xE1CB: 0x616C, - 0xE1CC: 0x6180, - 0xE1CD: 0x6174, - 0xE1CE: 0x6154, - 0xE1CF: 0x617A, - 0xE1D0: 0x615B, - 0xE1D1: 0x6165, - 0xE1D2: 0x613B, - 0xE1D3: 0x616A, - 0xE1D4: 0x6161, - 0xE1D5: 0x6156, - 0xE1D6: 0x6229, - 0xE1D7: 0x6227, - 0xE1D8: 0x622B, - 0xE1D9: 0x642B, - 0xE1DA: 0x644D, - 0xE1DB: 0x645B, - 0xE1DC: 0x645D, - 0xE1DD: 0x6474, - 0xE1DE: 0x6476, - 0xE1DF: 0x6472, - 0xE1E0: 0x6473, - 0xE1E1: 0x647D, - 0xE1E2: 0x6475, - 0xE1E3: 0x6466, - 0xE1E4: 0x64A6, - 0xE1E5: 0x644E, - 0xE1E6: 0x6482, - 0xE1E7: 0x645E, - 0xE1E8: 0x645C, - 0xE1E9: 0x644B, - 0xE1EA: 0x6453, - 0xE1EB: 0x6460, - 0xE1EC: 0x6450, - 0xE1ED: 0x647F, - 0xE1EE: 0x643F, - 0xE1EF: 0x646C, - 0xE1F0: 0x646B, - 0xE1F1: 0x6459, - 0xE1F2: 0x6465, - 0xE1F3: 0x6477, - 0xE1F4: 0x6573, - 0xE1F5: 0x65A0, - 0xE1F6: 0x66A1, - 0xE1F7: 0x66A0, - 0xE1F8: 0x669F, - 0xE1F9: 0x6705, - 0xE1FA: 0x6704, - 0xE1FB: 0x6722, - 0xE1FC: 0x69B1, - 0xE1FD: 0x69B6, - 0xE1FE: 0x69C9, - 0xE240: 0x69A0, - 0xE241: 0x69CE, - 0xE242: 0x6996, - 0xE243: 0x69B0, - 0xE244: 0x69AC, - 0xE245: 0x69BC, - 0xE246: 0x6991, - 0xE247: 0x6999, - 0xE248: 0x698E, - 0xE249: 0x69A7, - 0xE24A: 0x698D, - 0xE24B: 0x69A9, - 0xE24C: 0x69BE, - 0xE24D: 0x69AF, - 0xE24E: 0x69BF, - 0xE24F: 0x69C4, - 0xE250: 0x69BD, - 0xE251: 0x69A4, - 0xE252: 0x69D4, - 0xE253: 0x69B9, - 0xE254: 0x69CA, - 0xE255: 0x699A, - 0xE256: 0x69CF, - 0xE257: 0x69B3, - 0xE258: 0x6993, - 0xE259: 0x69AA, - 0xE25A: 0x69A1, - 0xE25B: 0x699E, - 0xE25C: 0x69D9, - 0xE25D: 0x6997, - 0xE25E: 0x6990, - 0xE25F: 0x69C2, - 0xE260: 0x69B5, - 0xE261: 0x69A5, - 0xE262: 0x69C6, - 0xE263: 0x6B4A, - 0xE264: 0x6B4D, - 0xE265: 0x6B4B, - 0xE266: 0x6B9E, - 0xE267: 0x6B9F, - 0xE268: 0x6BA0, - 0xE269: 0x6BC3, - 0xE26A: 0x6BC4, - 0xE26B: 0x6BFE, - 0xE26C: 0x6ECE, - 0xE26D: 0x6EF5, - 0xE26E: 0x6EF1, - 0xE26F: 0x6F03, - 0xE270: 0x6F25, - 0xE271: 0x6EF8, - 0xE272: 0x6F37, - 0xE273: 0x6EFB, - 0xE274: 0x6F2E, - 0xE275: 0x6F09, - 0xE276: 0x6F4E, - 0xE277: 0x6F19, - 0xE278: 0x6F1A, - 0xE279: 0x6F27, - 0xE27A: 0x6F18, - 0xE27B: 0x6F3B, - 0xE27C: 0x6F12, - 0xE27D: 0x6EED, - 0xE27E: 0x6F0A, - 0xE2A1: 0x6F36, - 0xE2A2: 0x6F73, - 0xE2A3: 0x6EF9, - 0xE2A4: 0x6EEE, - 0xE2A5: 0x6F2D, - 0xE2A6: 0x6F40, - 0xE2A7: 0x6F30, - 0xE2A8: 0x6F3C, - 0xE2A9: 0x6F35, - 0xE2AA: 0x6EEB, - 0xE2AB: 0x6F07, - 0xE2AC: 0x6F0E, - 0xE2AD: 0x6F43, - 0xE2AE: 0x6F05, - 0xE2AF: 0x6EFD, - 0xE2B0: 0x6EF6, - 0xE2B1: 0x6F39, - 0xE2B2: 0x6F1C, - 0xE2B3: 0x6EFC, - 0xE2B4: 0x6F3A, - 0xE2B5: 0x6F1F, - 0xE2B6: 0x6F0D, - 0xE2B7: 0x6F1E, - 0xE2B8: 0x6F08, - 0xE2B9: 0x6F21, - 0xE2BA: 0x7187, - 0xE2BB: 0x7190, - 0xE2BC: 0x7189, - 0xE2BD: 0x7180, - 0xE2BE: 0x7185, - 0xE2BF: 0x7182, - 0xE2C0: 0x718F, - 0xE2C1: 0x717B, - 0xE2C2: 0x7186, - 0xE2C3: 0x7181, - 0xE2C4: 0x7197, - 0xE2C5: 0x7244, - 0xE2C6: 0x7253, - 0xE2C7: 0x7297, - 0xE2C8: 0x7295, - 0xE2C9: 0x7293, - 0xE2CA: 0x7343, - 0xE2CB: 0x734D, - 0xE2CC: 0x7351, - 0xE2CD: 0x734C, - 0xE2CE: 0x7462, - 0xE2CF: 0x7473, - 0xE2D0: 0x7471, - 0xE2D1: 0x7475, - 0xE2D2: 0x7472, - 0xE2D3: 0x7467, - 0xE2D4: 0x746E, - 0xE2D5: 0x7500, - 0xE2D6: 0x7502, - 0xE2D7: 0x7503, - 0xE2D8: 0x757D, - 0xE2D9: 0x7590, - 0xE2DA: 0x7616, - 0xE2DB: 0x7608, - 0xE2DC: 0x760C, - 0xE2DD: 0x7615, - 0xE2DE: 0x7611, - 0xE2DF: 0x760A, - 0xE2E0: 0x7614, - 0xE2E1: 0x76B8, - 0xE2E2: 0x7781, - 0xE2E3: 0x777C, - 0xE2E4: 0x7785, - 0xE2E5: 0x7782, - 0xE2E6: 0x776E, - 0xE2E7: 0x7780, - 0xE2E8: 0x776F, - 0xE2E9: 0x777E, - 0xE2EA: 0x7783, - 0xE2EB: 0x78B2, - 0xE2EC: 0x78AA, - 0xE2ED: 0x78B4, - 0xE2EE: 0x78AD, - 0xE2EF: 0x78A8, - 0xE2F0: 0x787E, - 0xE2F1: 0x78AB, - 0xE2F2: 0x789E, - 0xE2F3: 0x78A5, - 0xE2F4: 0x78A0, - 0xE2F5: 0x78AC, - 0xE2F6: 0x78A2, - 0xE2F7: 0x78A4, - 0xE2F8: 0x7998, - 0xE2F9: 0x798A, - 0xE2FA: 0x798B, - 0xE2FB: 0x7996, - 0xE2FC: 0x7995, - 0xE2FD: 0x7994, - 0xE2FE: 0x7993, - 0xE340: 0x7997, - 0xE341: 0x7988, - 0xE342: 0x7992, - 0xE343: 0x7990, - 0xE344: 0x7A2B, - 0xE345: 0x7A4A, - 0xE346: 0x7A30, - 0xE347: 0x7A2F, - 0xE348: 0x7A28, - 0xE349: 0x7A26, - 0xE34A: 0x7AA8, - 0xE34B: 0x7AAB, - 0xE34C: 0x7AAC, - 0xE34D: 0x7AEE, - 0xE34E: 0x7B88, - 0xE34F: 0x7B9C, - 0xE350: 0x7B8A, - 0xE351: 0x7B91, - 0xE352: 0x7B90, - 0xE353: 0x7B96, - 0xE354: 0x7B8D, - 0xE355: 0x7B8C, - 0xE356: 0x7B9B, - 0xE357: 0x7B8E, - 0xE358: 0x7B85, - 0xE359: 0x7B98, - 0xE35A: 0x5284, - 0xE35B: 0x7B99, - 0xE35C: 0x7BA4, - 0xE35D: 0x7B82, - 0xE35E: 0x7CBB, - 0xE35F: 0x7CBF, - 0xE360: 0x7CBC, - 0xE361: 0x7CBA, - 0xE362: 0x7DA7, - 0xE363: 0x7DB7, - 0xE364: 0x7DC2, - 0xE365: 0x7DA3, - 0xE366: 0x7DAA, - 0xE367: 0x7DC1, - 0xE368: 0x7DC0, - 0xE369: 0x7DC5, - 0xE36A: 0x7D9D, - 0xE36B: 0x7DCE, - 0xE36C: 0x7DC4, - 0xE36D: 0x7DC6, - 0xE36E: 0x7DCB, - 0xE36F: 0x7DCC, - 0xE370: 0x7DAF, - 0xE371: 0x7DB9, - 0xE372: 0x7D96, - 0xE373: 0x7DBC, - 0xE374: 0x7D9F, - 0xE375: 0x7DA6, - 0xE376: 0x7DAE, - 0xE377: 0x7DA9, - 0xE378: 0x7DA1, - 0xE379: 0x7DC9, - 0xE37A: 0x7F73, - 0xE37B: 0x7FE2, - 0xE37C: 0x7FE3, - 0xE37D: 0x7FE5, - 0xE37E: 0x7FDE, - 0xE3A1: 0x8024, - 0xE3A2: 0x805D, - 0xE3A3: 0x805C, - 0xE3A4: 0x8189, - 0xE3A5: 0x8186, - 0xE3A6: 0x8183, - 0xE3A7: 0x8187, - 0xE3A8: 0x818D, - 0xE3A9: 0x818C, - 0xE3AA: 0x818B, - 0xE3AB: 0x8215, - 0xE3AC: 0x8497, - 0xE3AD: 0x84A4, - 0xE3AE: 0x84A1, - 0xE3AF: 0x849F, - 0xE3B0: 0x84BA, - 0xE3B1: 0x84CE, - 0xE3B2: 0x84C2, - 0xE3B3: 0x84AC, - 0xE3B4: 0x84AE, - 0xE3B5: 0x84AB, - 0xE3B6: 0x84B9, - 0xE3B7: 0x84B4, - 0xE3B8: 0x84C1, - 0xE3B9: 0x84CD, - 0xE3BA: 0x84AA, - 0xE3BB: 0x849A, - 0xE3BC: 0x84B1, - 0xE3BD: 0x84D0, - 0xE3BE: 0x849D, - 0xE3BF: 0x84A7, - 0xE3C0: 0x84BB, - 0xE3C1: 0x84A2, - 0xE3C2: 0x8494, - 0xE3C3: 0x84C7, - 0xE3C4: 0x84CC, - 0xE3C5: 0x849B, - 0xE3C6: 0x84A9, - 0xE3C7: 0x84AF, - 0xE3C8: 0x84A8, - 0xE3C9: 0x84D6, - 0xE3CA: 0x8498, - 0xE3CB: 0x84B6, - 0xE3CC: 0x84CF, - 0xE3CD: 0x84A0, - 0xE3CE: 0x84D7, - 0xE3CF: 0x84D4, - 0xE3D0: 0x84D2, - 0xE3D1: 0x84DB, - 0xE3D2: 0x84B0, - 0xE3D3: 0x8491, - 0xE3D4: 0x8661, - 0xE3D5: 0x8733, - 0xE3D6: 0x8723, - 0xE3D7: 0x8728, - 0xE3D8: 0x876B, - 0xE3D9: 0x8740, - 0xE3DA: 0x872E, - 0xE3DB: 0x871E, - 0xE3DC: 0x8721, - 0xE3DD: 0x8719, - 0xE3DE: 0x871B, - 0xE3DF: 0x8743, - 0xE3E0: 0x872C, - 0xE3E1: 0x8741, - 0xE3E2: 0x873E, - 0xE3E3: 0x8746, - 0xE3E4: 0x8720, - 0xE3E5: 0x8732, - 0xE3E6: 0x872A, - 0xE3E7: 0x872D, - 0xE3E8: 0x873C, - 0xE3E9: 0x8712, - 0xE3EA: 0x873A, - 0xE3EB: 0x8731, - 0xE3EC: 0x8735, - 0xE3ED: 0x8742, - 0xE3EE: 0x8726, - 0xE3EF: 0x8727, - 0xE3F0: 0x8738, - 0xE3F1: 0x8724, - 0xE3F2: 0x871A, - 0xE3F3: 0x8730, - 0xE3F4: 0x8711, - 0xE3F5: 0x88F7, - 0xE3F6: 0x88E7, - 0xE3F7: 0x88F1, - 0xE3F8: 0x88F2, - 0xE3F9: 0x88FA, - 0xE3FA: 0x88FE, - 0xE3FB: 0x88EE, - 0xE3FC: 0x88FC, - 0xE3FD: 0x88F6, - 0xE3FE: 0x88FB, - 0xE440: 0x88F0, - 0xE441: 0x88EC, - 0xE442: 0x88EB, - 0xE443: 0x899D, - 0xE444: 0x89A1, - 0xE445: 0x899F, - 0xE446: 0x899E, - 0xE447: 0x89E9, - 0xE448: 0x89EB, - 0xE449: 0x89E8, - 0xE44A: 0x8AAB, - 0xE44B: 0x8A99, - 0xE44C: 0x8A8B, - 0xE44D: 0x8A92, - 0xE44E: 0x8A8F, - 0xE44F: 0x8A96, - 0xE450: 0x8C3D, - 0xE451: 0x8C68, - 0xE452: 0x8C69, - 0xE453: 0x8CD5, - 0xE454: 0x8CCF, - 0xE455: 0x8CD7, - 0xE456: 0x8D96, - 0xE457: 0x8E09, - 0xE458: 0x8E02, - 0xE459: 0x8DFF, - 0xE45A: 0x8E0D, - 0xE45B: 0x8DFD, - 0xE45C: 0x8E0A, - 0xE45D: 0x8E03, - 0xE45E: 0x8E07, - 0xE45F: 0x8E06, - 0xE460: 0x8E05, - 0xE461: 0x8DFE, - 0xE462: 0x8E00, - 0xE463: 0x8E04, - 0xE464: 0x8F10, - 0xE465: 0x8F11, - 0xE466: 0x8F0E, - 0xE467: 0x8F0D, - 0xE468: 0x9123, - 0xE469: 0x911C, - 0xE46A: 0x9120, - 0xE46B: 0x9122, - 0xE46C: 0x911F, - 0xE46D: 0x911D, - 0xE46E: 0x911A, - 0xE46F: 0x9124, - 0xE470: 0x9121, - 0xE471: 0x911B, - 0xE472: 0x917A, - 0xE473: 0x9172, - 0xE474: 0x9179, - 0xE475: 0x9173, - 0xE476: 0x92A5, - 0xE477: 0x92A4, - 0xE478: 0x9276, - 0xE479: 0x929B, - 0xE47A: 0x927A, - 0xE47B: 0x92A0, - 0xE47C: 0x9294, - 0xE47D: 0x92AA, - 0xE47E: 0x928D, - 0xE4A1: 0x92A6, - 0xE4A2: 0x929A, - 0xE4A3: 0x92AB, - 0xE4A4: 0x9279, - 0xE4A5: 0x9297, - 0xE4A6: 0x927F, - 0xE4A7: 0x92A3, - 0xE4A8: 0x92EE, - 0xE4A9: 0x928E, - 0xE4AA: 0x9282, - 0xE4AB: 0x9295, - 0xE4AC: 0x92A2, - 0xE4AD: 0x927D, - 0xE4AE: 0x9288, - 0xE4AF: 0x92A1, - 0xE4B0: 0x928A, - 0xE4B1: 0x9286, - 0xE4B2: 0x928C, - 0xE4B3: 0x9299, - 0xE4B4: 0x92A7, - 0xE4B5: 0x927E, - 0xE4B6: 0x9287, - 0xE4B7: 0x92A9, - 0xE4B8: 0x929D, - 0xE4B9: 0x928B, - 0xE4BA: 0x922D, - 0xE4BB: 0x969E, - 0xE4BC: 0x96A1, - 0xE4BD: 0x96FF, - 0xE4BE: 0x9758, - 0xE4BF: 0x977D, - 0xE4C0: 0x977A, - 0xE4C1: 0x977E, - 0xE4C2: 0x9783, - 0xE4C3: 0x9780, - 0xE4C4: 0x9782, - 0xE4C5: 0x977B, - 0xE4C6: 0x9784, - 0xE4C7: 0x9781, - 0xE4C8: 0x977F, - 0xE4C9: 0x97CE, - 0xE4CA: 0x97CD, - 0xE4CB: 0x9816, - 0xE4CC: 0x98AD, - 0xE4CD: 0x98AE, - 0xE4CE: 0x9902, - 0xE4CF: 0x9900, - 0xE4D0: 0x9907, - 0xE4D1: 0x999D, - 0xE4D2: 0x999C, - 0xE4D3: 0x99C3, - 0xE4D4: 0x99B9, - 0xE4D5: 0x99BB, - 0xE4D6: 0x99BA, - 0xE4D7: 0x99C2, - 0xE4D8: 0x99BD, - 0xE4D9: 0x99C7, - 0xE4DA: 0x9AB1, - 0xE4DB: 0x9AE3, - 0xE4DC: 0x9AE7, - 0xE4DD: 0x9B3E, - 0xE4DE: 0x9B3F, - 0xE4DF: 0x9B60, - 0xE4E0: 0x9B61, - 0xE4E1: 0x9B5F, - 0xE4E2: 0x9CF1, - 0xE4E3: 0x9CF2, - 0xE4E4: 0x9CF5, - 0xE4E5: 0x9EA7, - 0xE4E6: 0x50FF, - 0xE4E7: 0x5103, - 0xE4E8: 0x5130, - 0xE4E9: 0x50F8, - 0xE4EA: 0x5106, - 0xE4EB: 0x5107, - 0xE4EC: 0x50F6, - 0xE4ED: 0x50FE, - 0xE4EE: 0x510B, - 0xE4EF: 0x510C, - 0xE4F0: 0x50FD, - 0xE4F1: 0x510A, - 0xE4F2: 0x528B, - 0xE4F3: 0x528C, - 0xE4F4: 0x52F1, - 0xE4F5: 0x52EF, - 0xE4F6: 0x5648, - 0xE4F7: 0x5642, - 0xE4F8: 0x564C, - 0xE4F9: 0x5635, - 0xE4FA: 0x5641, - 0xE4FB: 0x564A, - 0xE4FC: 0x5649, - 0xE4FD: 0x5646, - 0xE4FE: 0x5658, - 0xE540: 0x565A, - 0xE541: 0x5640, - 0xE542: 0x5633, - 0xE543: 0x563D, - 0xE544: 0x562C, - 0xE545: 0x563E, - 0xE546: 0x5638, - 0xE547: 0x562A, - 0xE548: 0x563A, - 0xE549: 0x571A, - 0xE54A: 0x58AB, - 0xE54B: 0x589D, - 0xE54C: 0x58B1, - 0xE54D: 0x58A0, - 0xE54E: 0x58A3, - 0xE54F: 0x58AF, - 0xE550: 0x58AC, - 0xE551: 0x58A5, - 0xE552: 0x58A1, - 0xE553: 0x58FF, - 0xE554: 0x5AFF, - 0xE555: 0x5AF4, - 0xE556: 0x5AFD, - 0xE557: 0x5AF7, - 0xE558: 0x5AF6, - 0xE559: 0x5B03, - 0xE55A: 0x5AF8, - 0xE55B: 0x5B02, - 0xE55C: 0x5AF9, - 0xE55D: 0x5B01, - 0xE55E: 0x5B07, - 0xE55F: 0x5B05, - 0xE560: 0x5B0F, - 0xE561: 0x5C67, - 0xE562: 0x5D99, - 0xE563: 0x5D97, - 0xE564: 0x5D9F, - 0xE565: 0x5D92, - 0xE566: 0x5DA2, - 0xE567: 0x5D93, - 0xE568: 0x5D95, - 0xE569: 0x5DA0, - 0xE56A: 0x5D9C, - 0xE56B: 0x5DA1, - 0xE56C: 0x5D9A, - 0xE56D: 0x5D9E, - 0xE56E: 0x5E69, - 0xE56F: 0x5E5D, - 0xE570: 0x5E60, - 0xE571: 0x5E5C, - 0xE572: 0x7DF3, - 0xE573: 0x5EDB, - 0xE574: 0x5EDE, - 0xE575: 0x5EE1, - 0xE576: 0x5F49, - 0xE577: 0x5FB2, - 0xE578: 0x618B, - 0xE579: 0x6183, - 0xE57A: 0x6179, - 0xE57B: 0x61B1, - 0xE57C: 0x61B0, - 0xE57D: 0x61A2, - 0xE57E: 0x6189, - 0xE5A1: 0x619B, - 0xE5A2: 0x6193, - 0xE5A3: 0x61AF, - 0xE5A4: 0x61AD, - 0xE5A5: 0x619F, - 0xE5A6: 0x6192, - 0xE5A7: 0x61AA, - 0xE5A8: 0x61A1, - 0xE5A9: 0x618D, - 0xE5AA: 0x6166, - 0xE5AB: 0x61B3, - 0xE5AC: 0x622D, - 0xE5AD: 0x646E, - 0xE5AE: 0x6470, - 0xE5AF: 0x6496, - 0xE5B0: 0x64A0, - 0xE5B1: 0x6485, - 0xE5B2: 0x6497, - 0xE5B3: 0x649C, - 0xE5B4: 0x648F, - 0xE5B5: 0x648B, - 0xE5B6: 0x648A, - 0xE5B7: 0x648C, - 0xE5B8: 0x64A3, - 0xE5B9: 0x649F, - 0xE5BA: 0x6468, - 0xE5BB: 0x64B1, - 0xE5BC: 0x6498, - 0xE5BD: 0x6576, - 0xE5BE: 0x657A, - 0xE5BF: 0x6579, - 0xE5C0: 0x657B, - 0xE5C1: 0x65B2, - 0xE5C2: 0x65B3, - 0xE5C3: 0x66B5, - 0xE5C4: 0x66B0, - 0xE5C5: 0x66A9, - 0xE5C6: 0x66B2, - 0xE5C7: 0x66B7, - 0xE5C8: 0x66AA, - 0xE5C9: 0x66AF, - 0xE5CA: 0x6A00, - 0xE5CB: 0x6A06, - 0xE5CC: 0x6A17, - 0xE5CD: 0x69E5, - 0xE5CE: 0x69F8, - 0xE5CF: 0x6A15, - 0xE5D0: 0x69F1, - 0xE5D1: 0x69E4, - 0xE5D2: 0x6A20, - 0xE5D3: 0x69FF, - 0xE5D4: 0x69EC, - 0xE5D5: 0x69E2, - 0xE5D6: 0x6A1B, - 0xE5D7: 0x6A1D, - 0xE5D8: 0x69FE, - 0xE5D9: 0x6A27, - 0xE5DA: 0x69F2, - 0xE5DB: 0x69EE, - 0xE5DC: 0x6A14, - 0xE5DD: 0x69F7, - 0xE5DE: 0x69E7, - 0xE5DF: 0x6A40, - 0xE5E0: 0x6A08, - 0xE5E1: 0x69E6, - 0xE5E2: 0x69FB, - 0xE5E3: 0x6A0D, - 0xE5E4: 0x69FC, - 0xE5E5: 0x69EB, - 0xE5E6: 0x6A09, - 0xE5E7: 0x6A04, - 0xE5E8: 0x6A18, - 0xE5E9: 0x6A25, - 0xE5EA: 0x6A0F, - 0xE5EB: 0x69F6, - 0xE5EC: 0x6A26, - 0xE5ED: 0x6A07, - 0xE5EE: 0x69F4, - 0xE5EF: 0x6A16, - 0xE5F0: 0x6B51, - 0xE5F1: 0x6BA5, - 0xE5F2: 0x6BA3, - 0xE5F3: 0x6BA2, - 0xE5F4: 0x6BA6, - 0xE5F5: 0x6C01, - 0xE5F6: 0x6C00, - 0xE5F7: 0x6BFF, - 0xE5F8: 0x6C02, - 0xE5F9: 0x6F41, - 0xE5FA: 0x6F26, - 0xE5FB: 0x6F7E, - 0xE5FC: 0x6F87, - 0xE5FD: 0x6FC6, - 0xE5FE: 0x6F92, - 0xE640: 0x6F8D, - 0xE641: 0x6F89, - 0xE642: 0x6F8C, - 0xE643: 0x6F62, - 0xE644: 0x6F4F, - 0xE645: 0x6F85, - 0xE646: 0x6F5A, - 0xE647: 0x6F96, - 0xE648: 0x6F76, - 0xE649: 0x6F6C, - 0xE64A: 0x6F82, - 0xE64B: 0x6F55, - 0xE64C: 0x6F72, - 0xE64D: 0x6F52, - 0xE64E: 0x6F50, - 0xE64F: 0x6F57, - 0xE650: 0x6F94, - 0xE651: 0x6F93, - 0xE652: 0x6F5D, - 0xE653: 0x6F00, - 0xE654: 0x6F61, - 0xE655: 0x6F6B, - 0xE656: 0x6F7D, - 0xE657: 0x6F67, - 0xE658: 0x6F90, - 0xE659: 0x6F53, - 0xE65A: 0x6F8B, - 0xE65B: 0x6F69, - 0xE65C: 0x6F7F, - 0xE65D: 0x6F95, - 0xE65E: 0x6F63, - 0xE65F: 0x6F77, - 0xE660: 0x6F6A, - 0xE661: 0x6F7B, - 0xE662: 0x71B2, - 0xE663: 0x71AF, - 0xE664: 0x719B, - 0xE665: 0x71B0, - 0xE666: 0x71A0, - 0xE667: 0x719A, - 0xE668: 0x71A9, - 0xE669: 0x71B5, - 0xE66A: 0x719D, - 0xE66B: 0x71A5, - 0xE66C: 0x719E, - 0xE66D: 0x71A4, - 0xE66E: 0x71A1, - 0xE66F: 0x71AA, - 0xE670: 0x719C, - 0xE671: 0x71A7, - 0xE672: 0x71B3, - 0xE673: 0x7298, - 0xE674: 0x729A, - 0xE675: 0x7358, - 0xE676: 0x7352, - 0xE677: 0x735E, - 0xE678: 0x735F, - 0xE679: 0x7360, - 0xE67A: 0x735D, - 0xE67B: 0x735B, - 0xE67C: 0x7361, - 0xE67D: 0x735A, - 0xE67E: 0x7359, - 0xE6A1: 0x7362, - 0xE6A2: 0x7487, - 0xE6A3: 0x7489, - 0xE6A4: 0x748A, - 0xE6A5: 0x7486, - 0xE6A6: 0x7481, - 0xE6A7: 0x747D, - 0xE6A8: 0x7485, - 0xE6A9: 0x7488, - 0xE6AA: 0x747C, - 0xE6AB: 0x7479, - 0xE6AC: 0x7508, - 0xE6AD: 0x7507, - 0xE6AE: 0x757E, - 0xE6AF: 0x7625, - 0xE6B0: 0x761E, - 0xE6B1: 0x7619, - 0xE6B2: 0x761D, - 0xE6B3: 0x761C, - 0xE6B4: 0x7623, - 0xE6B5: 0x761A, - 0xE6B6: 0x7628, - 0xE6B7: 0x761B, - 0xE6B8: 0x769C, - 0xE6B9: 0x769D, - 0xE6BA: 0x769E, - 0xE6BB: 0x769B, - 0xE6BC: 0x778D, - 0xE6BD: 0x778F, - 0xE6BE: 0x7789, - 0xE6BF: 0x7788, - 0xE6C0: 0x78CD, - 0xE6C1: 0x78BB, - 0xE6C2: 0x78CF, - 0xE6C3: 0x78CC, - 0xE6C4: 0x78D1, - 0xE6C5: 0x78CE, - 0xE6C6: 0x78D4, - 0xE6C7: 0x78C8, - 0xE6C8: 0x78C3, - 0xE6C9: 0x78C4, - 0xE6CA: 0x78C9, - 0xE6CB: 0x799A, - 0xE6CC: 0x79A1, - 0xE6CD: 0x79A0, - 0xE6CE: 0x799C, - 0xE6CF: 0x79A2, - 0xE6D0: 0x799B, - 0xE6D1: 0x6B76, - 0xE6D2: 0x7A39, - 0xE6D3: 0x7AB2, - 0xE6D4: 0x7AB4, - 0xE6D5: 0x7AB3, - 0xE6D6: 0x7BB7, - 0xE6D7: 0x7BCB, - 0xE6D8: 0x7BBE, - 0xE6D9: 0x7BAC, - 0xE6DA: 0x7BCE, - 0xE6DB: 0x7BAF, - 0xE6DC: 0x7BB9, - 0xE6DD: 0x7BCA, - 0xE6DE: 0x7BB5, - 0xE6DF: 0x7CC5, - 0xE6E0: 0x7CC8, - 0xE6E1: 0x7CCC, - 0xE6E2: 0x7CCB, - 0xE6E3: 0x7DF7, - 0xE6E4: 0x7DDB, - 0xE6E5: 0x7DEA, - 0xE6E6: 0x7DE7, - 0xE6E7: 0x7DD7, - 0xE6E8: 0x7DE1, - 0xE6E9: 0x7E03, - 0xE6EA: 0x7DFA, - 0xE6EB: 0x7DE6, - 0xE6EC: 0x7DF6, - 0xE6ED: 0x7DF1, - 0xE6EE: 0x7DF0, - 0xE6EF: 0x7DEE, - 0xE6F0: 0x7DDF, - 0xE6F1: 0x7F76, - 0xE6F2: 0x7FAC, - 0xE6F3: 0x7FB0, - 0xE6F4: 0x7FAD, - 0xE6F5: 0x7FED, - 0xE6F6: 0x7FEB, - 0xE6F7: 0x7FEA, - 0xE6F8: 0x7FEC, - 0xE6F9: 0x7FE6, - 0xE6FA: 0x7FE8, - 0xE6FB: 0x8064, - 0xE6FC: 0x8067, - 0xE6FD: 0x81A3, - 0xE6FE: 0x819F, - 0xE740: 0x819E, - 0xE741: 0x8195, - 0xE742: 0x81A2, - 0xE743: 0x8199, - 0xE744: 0x8197, - 0xE745: 0x8216, - 0xE746: 0x824F, - 0xE747: 0x8253, - 0xE748: 0x8252, - 0xE749: 0x8250, - 0xE74A: 0x824E, - 0xE74B: 0x8251, - 0xE74C: 0x8524, - 0xE74D: 0x853B, - 0xE74E: 0x850F, - 0xE74F: 0x8500, - 0xE750: 0x8529, - 0xE751: 0x850E, - 0xE752: 0x8509, - 0xE753: 0x850D, - 0xE754: 0x851F, - 0xE755: 0x850A, - 0xE756: 0x8527, - 0xE757: 0x851C, - 0xE758: 0x84FB, - 0xE759: 0x852B, - 0xE75A: 0x84FA, - 0xE75B: 0x8508, - 0xE75C: 0x850C, - 0xE75D: 0x84F4, - 0xE75E: 0x852A, - 0xE75F: 0x84F2, - 0xE760: 0x8515, - 0xE761: 0x84F7, - 0xE762: 0x84EB, - 0xE763: 0x84F3, - 0xE764: 0x84FC, - 0xE765: 0x8512, - 0xE766: 0x84EA, - 0xE767: 0x84E9, - 0xE768: 0x8516, - 0xE769: 0x84FE, - 0xE76A: 0x8528, - 0xE76B: 0x851D, - 0xE76C: 0x852E, - 0xE76D: 0x8502, - 0xE76E: 0x84FD, - 0xE76F: 0x851E, - 0xE770: 0x84F6, - 0xE771: 0x8531, - 0xE772: 0x8526, - 0xE773: 0x84E7, - 0xE774: 0x84E8, - 0xE775: 0x84F0, - 0xE776: 0x84EF, - 0xE777: 0x84F9, - 0xE778: 0x8518, - 0xE779: 0x8520, - 0xE77A: 0x8530, - 0xE77B: 0x850B, - 0xE77C: 0x8519, - 0xE77D: 0x852F, - 0xE77E: 0x8662, - 0xE7A1: 0x8756, - 0xE7A2: 0x8763, - 0xE7A3: 0x8764, - 0xE7A4: 0x8777, - 0xE7A5: 0x87E1, - 0xE7A6: 0x8773, - 0xE7A7: 0x8758, - 0xE7A8: 0x8754, - 0xE7A9: 0x875B, - 0xE7AA: 0x8752, - 0xE7AB: 0x8761, - 0xE7AC: 0x875A, - 0xE7AD: 0x8751, - 0xE7AE: 0x875E, - 0xE7AF: 0x876D, - 0xE7B0: 0x876A, - 0xE7B1: 0x8750, - 0xE7B2: 0x874E, - 0xE7B3: 0x875F, - 0xE7B4: 0x875D, - 0xE7B5: 0x876F, - 0xE7B6: 0x876C, - 0xE7B7: 0x877A, - 0xE7B8: 0x876E, - 0xE7B9: 0x875C, - 0xE7BA: 0x8765, - 0xE7BB: 0x874F, - 0xE7BC: 0x877B, - 0xE7BD: 0x8775, - 0xE7BE: 0x8762, - 0xE7BF: 0x8767, - 0xE7C0: 0x8769, - 0xE7C1: 0x885A, - 0xE7C2: 0x8905, - 0xE7C3: 0x890C, - 0xE7C4: 0x8914, - 0xE7C5: 0x890B, - 0xE7C6: 0x8917, - 0xE7C7: 0x8918, - 0xE7C8: 0x8919, - 0xE7C9: 0x8906, - 0xE7CA: 0x8916, - 0xE7CB: 0x8911, - 0xE7CC: 0x890E, - 0xE7CD: 0x8909, - 0xE7CE: 0x89A2, - 0xE7CF: 0x89A4, - 0xE7D0: 0x89A3, - 0xE7D1: 0x89ED, - 0xE7D2: 0x89F0, - 0xE7D3: 0x89EC, - 0xE7D4: 0x8ACF, - 0xE7D5: 0x8AC6, - 0xE7D6: 0x8AB8, - 0xE7D7: 0x8AD3, - 0xE7D8: 0x8AD1, - 0xE7D9: 0x8AD4, - 0xE7DA: 0x8AD5, - 0xE7DB: 0x8ABB, - 0xE7DC: 0x8AD7, - 0xE7DD: 0x8ABE, - 0xE7DE: 0x8AC0, - 0xE7DF: 0x8AC5, - 0xE7E0: 0x8AD8, - 0xE7E1: 0x8AC3, - 0xE7E2: 0x8ABA, - 0xE7E3: 0x8ABD, - 0xE7E4: 0x8AD9, - 0xE7E5: 0x8C3E, - 0xE7E6: 0x8C4D, - 0xE7E7: 0x8C8F, - 0xE7E8: 0x8CE5, - 0xE7E9: 0x8CDF, - 0xE7EA: 0x8CD9, - 0xE7EB: 0x8CE8, - 0xE7EC: 0x8CDA, - 0xE7ED: 0x8CDD, - 0xE7EE: 0x8CE7, - 0xE7EF: 0x8DA0, - 0xE7F0: 0x8D9C, - 0xE7F1: 0x8DA1, - 0xE7F2: 0x8D9B, - 0xE7F3: 0x8E20, - 0xE7F4: 0x8E23, - 0xE7F5: 0x8E25, - 0xE7F6: 0x8E24, - 0xE7F7: 0x8E2E, - 0xE7F8: 0x8E15, - 0xE7F9: 0x8E1B, - 0xE7FA: 0x8E16, - 0xE7FB: 0x8E11, - 0xE7FC: 0x8E19, - 0xE7FD: 0x8E26, - 0xE7FE: 0x8E27, - 0xE840: 0x8E14, - 0xE841: 0x8E12, - 0xE842: 0x8E18, - 0xE843: 0x8E13, - 0xE844: 0x8E1C, - 0xE845: 0x8E17, - 0xE846: 0x8E1A, - 0xE847: 0x8F2C, - 0xE848: 0x8F24, - 0xE849: 0x8F18, - 0xE84A: 0x8F1A, - 0xE84B: 0x8F20, - 0xE84C: 0x8F23, - 0xE84D: 0x8F16, - 0xE84E: 0x8F17, - 0xE84F: 0x9073, - 0xE850: 0x9070, - 0xE851: 0x906F, - 0xE852: 0x9067, - 0xE853: 0x906B, - 0xE854: 0x912F, - 0xE855: 0x912B, - 0xE856: 0x9129, - 0xE857: 0x912A, - 0xE858: 0x9132, - 0xE859: 0x9126, - 0xE85A: 0x912E, - 0xE85B: 0x9185, - 0xE85C: 0x9186, - 0xE85D: 0x918A, - 0xE85E: 0x9181, - 0xE85F: 0x9182, - 0xE860: 0x9184, - 0xE861: 0x9180, - 0xE862: 0x92D0, - 0xE863: 0x92C3, - 0xE864: 0x92C4, - 0xE865: 0x92C0, - 0xE866: 0x92D9, - 0xE867: 0x92B6, - 0xE868: 0x92CF, - 0xE869: 0x92F1, - 0xE86A: 0x92DF, - 0xE86B: 0x92D8, - 0xE86C: 0x92E9, - 0xE86D: 0x92D7, - 0xE86E: 0x92DD, - 0xE86F: 0x92CC, - 0xE870: 0x92EF, - 0xE871: 0x92C2, - 0xE872: 0x92E8, - 0xE873: 0x92CA, - 0xE874: 0x92C8, - 0xE875: 0x92CE, - 0xE876: 0x92E6, - 0xE877: 0x92CD, - 0xE878: 0x92D5, - 0xE879: 0x92C9, - 0xE87A: 0x92E0, - 0xE87B: 0x92DE, - 0xE87C: 0x92E7, - 0xE87D: 0x92D1, - 0xE87E: 0x92D3, - 0xE8A1: 0x92B5, - 0xE8A2: 0x92E1, - 0xE8A3: 0x92C6, - 0xE8A4: 0x92B4, - 0xE8A5: 0x957C, - 0xE8A6: 0x95AC, - 0xE8A7: 0x95AB, - 0xE8A8: 0x95AE, - 0xE8A9: 0x95B0, - 0xE8AA: 0x96A4, - 0xE8AB: 0x96A2, - 0xE8AC: 0x96D3, - 0xE8AD: 0x9705, - 0xE8AE: 0x9708, - 0xE8AF: 0x9702, - 0xE8B0: 0x975A, - 0xE8B1: 0x978A, - 0xE8B2: 0x978E, - 0xE8B3: 0x9788, - 0xE8B4: 0x97D0, - 0xE8B5: 0x97CF, - 0xE8B6: 0x981E, - 0xE8B7: 0x981D, - 0xE8B8: 0x9826, - 0xE8B9: 0x9829, - 0xE8BA: 0x9828, - 0xE8BB: 0x9820, - 0xE8BC: 0x981B, - 0xE8BD: 0x9827, - 0xE8BE: 0x98B2, - 0xE8BF: 0x9908, - 0xE8C0: 0x98FA, - 0xE8C1: 0x9911, - 0xE8C2: 0x9914, - 0xE8C3: 0x9916, - 0xE8C4: 0x9917, - 0xE8C5: 0x9915, - 0xE8C6: 0x99DC, - 0xE8C7: 0x99CD, - 0xE8C8: 0x99CF, - 0xE8C9: 0x99D3, - 0xE8CA: 0x99D4, - 0xE8CB: 0x99CE, - 0xE8CC: 0x99C9, - 0xE8CD: 0x99D6, - 0xE8CE: 0x99D8, - 0xE8CF: 0x99CB, - 0xE8D0: 0x99D7, - 0xE8D1: 0x99CC, - 0xE8D2: 0x9AB3, - 0xE8D3: 0x9AEC, - 0xE8D4: 0x9AEB, - 0xE8D5: 0x9AF3, - 0xE8D6: 0x9AF2, - 0xE8D7: 0x9AF1, - 0xE8D8: 0x9B46, - 0xE8D9: 0x9B43, - 0xE8DA: 0x9B67, - 0xE8DB: 0x9B74, - 0xE8DC: 0x9B71, - 0xE8DD: 0x9B66, - 0xE8DE: 0x9B76, - 0xE8DF: 0x9B75, - 0xE8E0: 0x9B70, - 0xE8E1: 0x9B68, - 0xE8E2: 0x9B64, - 0xE8E3: 0x9B6C, - 0xE8E4: 0x9CFC, - 0xE8E5: 0x9CFA, - 0xE8E6: 0x9CFD, - 0xE8E7: 0x9CFF, - 0xE8E8: 0x9CF7, - 0xE8E9: 0x9D07, - 0xE8EA: 0x9D00, - 0xE8EB: 0x9CF9, - 0xE8EC: 0x9CFB, - 0xE8ED: 0x9D08, - 0xE8EE: 0x9D05, - 0xE8EF: 0x9D04, - 0xE8F0: 0x9E83, - 0xE8F1: 0x9ED3, - 0xE8F2: 0x9F0F, - 0xE8F3: 0x9F10, - 0xE8F4: 0x511C, - 0xE8F5: 0x5113, - 0xE8F6: 0x5117, - 0xE8F7: 0x511A, - 0xE8F8: 0x5111, - 0xE8F9: 0x51DE, - 0xE8FA: 0x5334, - 0xE8FB: 0x53E1, - 0xE8FC: 0x5670, - 0xE8FD: 0x5660, - 0xE8FE: 0x566E, - 0xE940: 0x5673, - 0xE941: 0x5666, - 0xE942: 0x5663, - 0xE943: 0x566D, - 0xE944: 0x5672, - 0xE945: 0x565E, - 0xE946: 0x5677, - 0xE947: 0x571C, - 0xE948: 0x571B, - 0xE949: 0x58C8, - 0xE94A: 0x58BD, - 0xE94B: 0x58C9, - 0xE94C: 0x58BF, - 0xE94D: 0x58BA, - 0xE94E: 0x58C2, - 0xE94F: 0x58BC, - 0xE950: 0x58C6, - 0xE951: 0x5B17, - 0xE952: 0x5B19, - 0xE953: 0x5B1B, - 0xE954: 0x5B21, - 0xE955: 0x5B14, - 0xE956: 0x5B13, - 0xE957: 0x5B10, - 0xE958: 0x5B16, - 0xE959: 0x5B28, - 0xE95A: 0x5B1A, - 0xE95B: 0x5B20, - 0xE95C: 0x5B1E, - 0xE95D: 0x5BEF, - 0xE95E: 0x5DAC, - 0xE95F: 0x5DB1, - 0xE960: 0x5DA9, - 0xE961: 0x5DA7, - 0xE962: 0x5DB5, - 0xE963: 0x5DB0, - 0xE964: 0x5DAE, - 0xE965: 0x5DAA, - 0xE966: 0x5DA8, - 0xE967: 0x5DB2, - 0xE968: 0x5DAD, - 0xE969: 0x5DAF, - 0xE96A: 0x5DB4, - 0xE96B: 0x5E67, - 0xE96C: 0x5E68, - 0xE96D: 0x5E66, - 0xE96E: 0x5E6F, - 0xE96F: 0x5EE9, - 0xE970: 0x5EE7, - 0xE971: 0x5EE6, - 0xE972: 0x5EE8, - 0xE973: 0x5EE5, - 0xE974: 0x5F4B, - 0xE975: 0x5FBC, - 0xE976: 0x619D, - 0xE977: 0x61A8, - 0xE978: 0x6196, - 0xE979: 0x61C5, - 0xE97A: 0x61B4, - 0xE97B: 0x61C6, - 0xE97C: 0x61C1, - 0xE97D: 0x61CC, - 0xE97E: 0x61BA, - 0xE9A1: 0x61BF, - 0xE9A2: 0x61B8, - 0xE9A3: 0x618C, - 0xE9A4: 0x64D7, - 0xE9A5: 0x64D6, - 0xE9A6: 0x64D0, - 0xE9A7: 0x64CF, - 0xE9A8: 0x64C9, - 0xE9A9: 0x64BD, - 0xE9AA: 0x6489, - 0xE9AB: 0x64C3, - 0xE9AC: 0x64DB, - 0xE9AD: 0x64F3, - 0xE9AE: 0x64D9, - 0xE9AF: 0x6533, - 0xE9B0: 0x657F, - 0xE9B1: 0x657C, - 0xE9B2: 0x65A2, - 0xE9B3: 0x66C8, - 0xE9B4: 0x66BE, - 0xE9B5: 0x66C0, - 0xE9B6: 0x66CA, - 0xE9B7: 0x66CB, - 0xE9B8: 0x66CF, - 0xE9B9: 0x66BD, - 0xE9BA: 0x66BB, - 0xE9BB: 0x66BA, - 0xE9BC: 0x66CC, - 0xE9BD: 0x6723, - 0xE9BE: 0x6A34, - 0xE9BF: 0x6A66, - 0xE9C0: 0x6A49, - 0xE9C1: 0x6A67, - 0xE9C2: 0x6A32, - 0xE9C3: 0x6A68, - 0xE9C4: 0x6A3E, - 0xE9C5: 0x6A5D, - 0xE9C6: 0x6A6D, - 0xE9C7: 0x6A76, - 0xE9C8: 0x6A5B, - 0xE9C9: 0x6A51, - 0xE9CA: 0x6A28, - 0xE9CB: 0x6A5A, - 0xE9CC: 0x6A3B, - 0xE9CD: 0x6A3F, - 0xE9CE: 0x6A41, - 0xE9CF: 0x6A6A, - 0xE9D0: 0x6A64, - 0xE9D1: 0x6A50, - 0xE9D2: 0x6A4F, - 0xE9D3: 0x6A54, - 0xE9D4: 0x6A6F, - 0xE9D5: 0x6A69, - 0xE9D6: 0x6A60, - 0xE9D7: 0x6A3C, - 0xE9D8: 0x6A5E, - 0xE9D9: 0x6A56, - 0xE9DA: 0x6A55, - 0xE9DB: 0x6A4D, - 0xE9DC: 0x6A4E, - 0xE9DD: 0x6A46, - 0xE9DE: 0x6B55, - 0xE9DF: 0x6B54, - 0xE9E0: 0x6B56, - 0xE9E1: 0x6BA7, - 0xE9E2: 0x6BAA, - 0xE9E3: 0x6BAB, - 0xE9E4: 0x6BC8, - 0xE9E5: 0x6BC7, - 0xE9E6: 0x6C04, - 0xE9E7: 0x6C03, - 0xE9E8: 0x6C06, - 0xE9E9: 0x6FAD, - 0xE9EA: 0x6FCB, - 0xE9EB: 0x6FA3, - 0xE9EC: 0x6FC7, - 0xE9ED: 0x6FBC, - 0xE9EE: 0x6FCE, - 0xE9EF: 0x6FC8, - 0xE9F0: 0x6F5E, - 0xE9F1: 0x6FC4, - 0xE9F2: 0x6FBD, - 0xE9F3: 0x6F9E, - 0xE9F4: 0x6FCA, - 0xE9F5: 0x6FA8, - 0xE9F6: 0x7004, - 0xE9F7: 0x6FA5, - 0xE9F8: 0x6FAE, - 0xE9F9: 0x6FBA, - 0xE9FA: 0x6FAC, - 0xE9FB: 0x6FAA, - 0xE9FC: 0x6FCF, - 0xE9FD: 0x6FBF, - 0xE9FE: 0x6FB8, - 0xEA40: 0x6FA2, - 0xEA41: 0x6FC9, - 0xEA42: 0x6FAB, - 0xEA43: 0x6FCD, - 0xEA44: 0x6FAF, - 0xEA45: 0x6FB2, - 0xEA46: 0x6FB0, - 0xEA47: 0x71C5, - 0xEA48: 0x71C2, - 0xEA49: 0x71BF, - 0xEA4A: 0x71B8, - 0xEA4B: 0x71D6, - 0xEA4C: 0x71C0, - 0xEA4D: 0x71C1, - 0xEA4E: 0x71CB, - 0xEA4F: 0x71D4, - 0xEA50: 0x71CA, - 0xEA51: 0x71C7, - 0xEA52: 0x71CF, - 0xEA53: 0x71BD, - 0xEA54: 0x71D8, - 0xEA55: 0x71BC, - 0xEA56: 0x71C6, - 0xEA57: 0x71DA, - 0xEA58: 0x71DB, - 0xEA59: 0x729D, - 0xEA5A: 0x729E, - 0xEA5B: 0x7369, - 0xEA5C: 0x7366, - 0xEA5D: 0x7367, - 0xEA5E: 0x736C, - 0xEA5F: 0x7365, - 0xEA60: 0x736B, - 0xEA61: 0x736A, - 0xEA62: 0x747F, - 0xEA63: 0x749A, - 0xEA64: 0x74A0, - 0xEA65: 0x7494, - 0xEA66: 0x7492, - 0xEA67: 0x7495, - 0xEA68: 0x74A1, - 0xEA69: 0x750B, - 0xEA6A: 0x7580, - 0xEA6B: 0x762F, - 0xEA6C: 0x762D, - 0xEA6D: 0x7631, - 0xEA6E: 0x763D, - 0xEA6F: 0x7633, - 0xEA70: 0x763C, - 0xEA71: 0x7635, - 0xEA72: 0x7632, - 0xEA73: 0x7630, - 0xEA74: 0x76BB, - 0xEA75: 0x76E6, - 0xEA76: 0x779A, - 0xEA77: 0x779D, - 0xEA78: 0x77A1, - 0xEA79: 0x779C, - 0xEA7A: 0x779B, - 0xEA7B: 0x77A2, - 0xEA7C: 0x77A3, - 0xEA7D: 0x7795, - 0xEA7E: 0x7799, - 0xEAA1: 0x7797, - 0xEAA2: 0x78DD, - 0xEAA3: 0x78E9, - 0xEAA4: 0x78E5, - 0xEAA5: 0x78EA, - 0xEAA6: 0x78DE, - 0xEAA7: 0x78E3, - 0xEAA8: 0x78DB, - 0xEAA9: 0x78E1, - 0xEAAA: 0x78E2, - 0xEAAB: 0x78ED, - 0xEAAC: 0x78DF, - 0xEAAD: 0x78E0, - 0xEAAE: 0x79A4, - 0xEAAF: 0x7A44, - 0xEAB0: 0x7A48, - 0xEAB1: 0x7A47, - 0xEAB2: 0x7AB6, - 0xEAB3: 0x7AB8, - 0xEAB4: 0x7AB5, - 0xEAB5: 0x7AB1, - 0xEAB6: 0x7AB7, - 0xEAB7: 0x7BDE, - 0xEAB8: 0x7BE3, - 0xEAB9: 0x7BE7, - 0xEABA: 0x7BDD, - 0xEABB: 0x7BD5, - 0xEABC: 0x7BE5, - 0xEABD: 0x7BDA, - 0xEABE: 0x7BE8, - 0xEABF: 0x7BF9, - 0xEAC0: 0x7BD4, - 0xEAC1: 0x7BEA, - 0xEAC2: 0x7BE2, - 0xEAC3: 0x7BDC, - 0xEAC4: 0x7BEB, - 0xEAC5: 0x7BD8, - 0xEAC6: 0x7BDF, - 0xEAC7: 0x7CD2, - 0xEAC8: 0x7CD4, - 0xEAC9: 0x7CD7, - 0xEACA: 0x7CD0, - 0xEACB: 0x7CD1, - 0xEACC: 0x7E12, - 0xEACD: 0x7E21, - 0xEACE: 0x7E17, - 0xEACF: 0x7E0C, - 0xEAD0: 0x7E1F, - 0xEAD1: 0x7E20, - 0xEAD2: 0x7E13, - 0xEAD3: 0x7E0E, - 0xEAD4: 0x7E1C, - 0xEAD5: 0x7E15, - 0xEAD6: 0x7E1A, - 0xEAD7: 0x7E22, - 0xEAD8: 0x7E0B, - 0xEAD9: 0x7E0F, - 0xEADA: 0x7E16, - 0xEADB: 0x7E0D, - 0xEADC: 0x7E14, - 0xEADD: 0x7E25, - 0xEADE: 0x7E24, - 0xEADF: 0x7F43, - 0xEAE0: 0x7F7B, - 0xEAE1: 0x7F7C, - 0xEAE2: 0x7F7A, - 0xEAE3: 0x7FB1, - 0xEAE4: 0x7FEF, - 0xEAE5: 0x802A, - 0xEAE6: 0x8029, - 0xEAE7: 0x806C, - 0xEAE8: 0x81B1, - 0xEAE9: 0x81A6, - 0xEAEA: 0x81AE, - 0xEAEB: 0x81B9, - 0xEAEC: 0x81B5, - 0xEAED: 0x81AB, - 0xEAEE: 0x81B0, - 0xEAEF: 0x81AC, - 0xEAF0: 0x81B4, - 0xEAF1: 0x81B2, - 0xEAF2: 0x81B7, - 0xEAF3: 0x81A7, - 0xEAF4: 0x81F2, - 0xEAF5: 0x8255, - 0xEAF6: 0x8256, - 0xEAF7: 0x8257, - 0xEAF8: 0x8556, - 0xEAF9: 0x8545, - 0xEAFA: 0x856B, - 0xEAFB: 0x854D, - 0xEAFC: 0x8553, - 0xEAFD: 0x8561, - 0xEAFE: 0x8558, - 0xEB40: 0x8540, - 0xEB41: 0x8546, - 0xEB42: 0x8564, - 0xEB43: 0x8541, - 0xEB44: 0x8562, - 0xEB45: 0x8544, - 0xEB46: 0x8551, - 0xEB47: 0x8547, - 0xEB48: 0x8563, - 0xEB49: 0x853E, - 0xEB4A: 0x855B, - 0xEB4B: 0x8571, - 0xEB4C: 0x854E, - 0xEB4D: 0x856E, - 0xEB4E: 0x8575, - 0xEB4F: 0x8555, - 0xEB50: 0x8567, - 0xEB51: 0x8560, - 0xEB52: 0x858C, - 0xEB53: 0x8566, - 0xEB54: 0x855D, - 0xEB55: 0x8554, - 0xEB56: 0x8565, - 0xEB57: 0x856C, - 0xEB58: 0x8663, - 0xEB59: 0x8665, - 0xEB5A: 0x8664, - 0xEB5B: 0x879B, - 0xEB5C: 0x878F, - 0xEB5D: 0x8797, - 0xEB5E: 0x8793, - 0xEB5F: 0x8792, - 0xEB60: 0x8788, - 0xEB61: 0x8781, - 0xEB62: 0x8796, - 0xEB63: 0x8798, - 0xEB64: 0x8779, - 0xEB65: 0x8787, - 0xEB66: 0x87A3, - 0xEB67: 0x8785, - 0xEB68: 0x8790, - 0xEB69: 0x8791, - 0xEB6A: 0x879D, - 0xEB6B: 0x8784, - 0xEB6C: 0x8794, - 0xEB6D: 0x879C, - 0xEB6E: 0x879A, - 0xEB6F: 0x8789, - 0xEB70: 0x891E, - 0xEB71: 0x8926, - 0xEB72: 0x8930, - 0xEB73: 0x892D, - 0xEB74: 0x892E, - 0xEB75: 0x8927, - 0xEB76: 0x8931, - 0xEB77: 0x8922, - 0xEB78: 0x8929, - 0xEB79: 0x8923, - 0xEB7A: 0x892F, - 0xEB7B: 0x892C, - 0xEB7C: 0x891F, - 0xEB7D: 0x89F1, - 0xEB7E: 0x8AE0, - 0xEBA1: 0x8AE2, - 0xEBA2: 0x8AF2, - 0xEBA3: 0x8AF4, - 0xEBA4: 0x8AF5, - 0xEBA5: 0x8ADD, - 0xEBA6: 0x8B14, - 0xEBA7: 0x8AE4, - 0xEBA8: 0x8ADF, - 0xEBA9: 0x8AF0, - 0xEBAA: 0x8AC8, - 0xEBAB: 0x8ADE, - 0xEBAC: 0x8AE1, - 0xEBAD: 0x8AE8, - 0xEBAE: 0x8AFF, - 0xEBAF: 0x8AEF, - 0xEBB0: 0x8AFB, - 0xEBB1: 0x8C91, - 0xEBB2: 0x8C92, - 0xEBB3: 0x8C90, - 0xEBB4: 0x8CF5, - 0xEBB5: 0x8CEE, - 0xEBB6: 0x8CF1, - 0xEBB7: 0x8CF0, - 0xEBB8: 0x8CF3, - 0xEBB9: 0x8D6C, - 0xEBBA: 0x8D6E, - 0xEBBB: 0x8DA5, - 0xEBBC: 0x8DA7, - 0xEBBD: 0x8E33, - 0xEBBE: 0x8E3E, - 0xEBBF: 0x8E38, - 0xEBC0: 0x8E40, - 0xEBC1: 0x8E45, - 0xEBC2: 0x8E36, - 0xEBC3: 0x8E3C, - 0xEBC4: 0x8E3D, - 0xEBC5: 0x8E41, - 0xEBC6: 0x8E30, - 0xEBC7: 0x8E3F, - 0xEBC8: 0x8EBD, - 0xEBC9: 0x8F36, - 0xEBCA: 0x8F2E, - 0xEBCB: 0x8F35, - 0xEBCC: 0x8F32, - 0xEBCD: 0x8F39, - 0xEBCE: 0x8F37, - 0xEBCF: 0x8F34, - 0xEBD0: 0x9076, - 0xEBD1: 0x9079, - 0xEBD2: 0x907B, - 0xEBD3: 0x9086, - 0xEBD4: 0x90FA, - 0xEBD5: 0x9133, - 0xEBD6: 0x9135, - 0xEBD7: 0x9136, - 0xEBD8: 0x9193, - 0xEBD9: 0x9190, - 0xEBDA: 0x9191, - 0xEBDB: 0x918D, - 0xEBDC: 0x918F, - 0xEBDD: 0x9327, - 0xEBDE: 0x931E, - 0xEBDF: 0x9308, - 0xEBE0: 0x931F, - 0xEBE1: 0x9306, - 0xEBE2: 0x930F, - 0xEBE3: 0x937A, - 0xEBE4: 0x9338, - 0xEBE5: 0x933C, - 0xEBE6: 0x931B, - 0xEBE7: 0x9323, - 0xEBE8: 0x9312, - 0xEBE9: 0x9301, - 0xEBEA: 0x9346, - 0xEBEB: 0x932D, - 0xEBEC: 0x930E, - 0xEBED: 0x930D, - 0xEBEE: 0x92CB, - 0xEBEF: 0x931D, - 0xEBF0: 0x92FA, - 0xEBF1: 0x9325, - 0xEBF2: 0x9313, - 0xEBF3: 0x92F9, - 0xEBF4: 0x92F7, - 0xEBF5: 0x9334, - 0xEBF6: 0x9302, - 0xEBF7: 0x9324, - 0xEBF8: 0x92FF, - 0xEBF9: 0x9329, - 0xEBFA: 0x9339, - 0xEBFB: 0x9335, - 0xEBFC: 0x932A, - 0xEBFD: 0x9314, - 0xEBFE: 0x930C, - 0xEC40: 0x930B, - 0xEC41: 0x92FE, - 0xEC42: 0x9309, - 0xEC43: 0x9300, - 0xEC44: 0x92FB, - 0xEC45: 0x9316, - 0xEC46: 0x95BC, - 0xEC47: 0x95CD, - 0xEC48: 0x95BE, - 0xEC49: 0x95B9, - 0xEC4A: 0x95BA, - 0xEC4B: 0x95B6, - 0xEC4C: 0x95BF, - 0xEC4D: 0x95B5, - 0xEC4E: 0x95BD, - 0xEC4F: 0x96A9, - 0xEC50: 0x96D4, - 0xEC51: 0x970B, - 0xEC52: 0x9712, - 0xEC53: 0x9710, - 0xEC54: 0x9799, - 0xEC55: 0x9797, - 0xEC56: 0x9794, - 0xEC57: 0x97F0, - 0xEC58: 0x97F8, - 0xEC59: 0x9835, - 0xEC5A: 0x982F, - 0xEC5B: 0x9832, - 0xEC5C: 0x9924, - 0xEC5D: 0x991F, - 0xEC5E: 0x9927, - 0xEC5F: 0x9929, - 0xEC60: 0x999E, - 0xEC61: 0x99EE, - 0xEC62: 0x99EC, - 0xEC63: 0x99E5, - 0xEC64: 0x99E4, - 0xEC65: 0x99F0, - 0xEC66: 0x99E3, - 0xEC67: 0x99EA, - 0xEC68: 0x99E9, - 0xEC69: 0x99E7, - 0xEC6A: 0x9AB9, - 0xEC6B: 0x9ABF, - 0xEC6C: 0x9AB4, - 0xEC6D: 0x9ABB, - 0xEC6E: 0x9AF6, - 0xEC6F: 0x9AFA, - 0xEC70: 0x9AF9, - 0xEC71: 0x9AF7, - 0xEC72: 0x9B33, - 0xEC73: 0x9B80, - 0xEC74: 0x9B85, - 0xEC75: 0x9B87, - 0xEC76: 0x9B7C, - 0xEC77: 0x9B7E, - 0xEC78: 0x9B7B, - 0xEC79: 0x9B82, - 0xEC7A: 0x9B93, - 0xEC7B: 0x9B92, - 0xEC7C: 0x9B90, - 0xEC7D: 0x9B7A, - 0xEC7E: 0x9B95, - 0xECA1: 0x9B7D, - 0xECA2: 0x9B88, - 0xECA3: 0x9D25, - 0xECA4: 0x9D17, - 0xECA5: 0x9D20, - 0xECA6: 0x9D1E, - 0xECA7: 0x9D14, - 0xECA8: 0x9D29, - 0xECA9: 0x9D1D, - 0xECAA: 0x9D18, - 0xECAB: 0x9D22, - 0xECAC: 0x9D10, - 0xECAD: 0x9D19, - 0xECAE: 0x9D1F, - 0xECAF: 0x9E88, - 0xECB0: 0x9E86, - 0xECB1: 0x9E87, - 0xECB2: 0x9EAE, - 0xECB3: 0x9EAD, - 0xECB4: 0x9ED5, - 0xECB5: 0x9ED6, - 0xECB6: 0x9EFA, - 0xECB7: 0x9F12, - 0xECB8: 0x9F3D, - 0xECB9: 0x5126, - 0xECBA: 0x5125, - 0xECBB: 0x5122, - 0xECBC: 0x5124, - 0xECBD: 0x5120, - 0xECBE: 0x5129, - 0xECBF: 0x52F4, - 0xECC0: 0x5693, - 0xECC1: 0x568C, - 0xECC2: 0x568D, - 0xECC3: 0x5686, - 0xECC4: 0x5684, - 0xECC5: 0x5683, - 0xECC6: 0x567E, - 0xECC7: 0x5682, - 0xECC8: 0x567F, - 0xECC9: 0x5681, - 0xECCA: 0x58D6, - 0xECCB: 0x58D4, - 0xECCC: 0x58CF, - 0xECCD: 0x58D2, - 0xECCE: 0x5B2D, - 0xECCF: 0x5B25, - 0xECD0: 0x5B32, - 0xECD1: 0x5B23, - 0xECD2: 0x5B2C, - 0xECD3: 0x5B27, - 0xECD4: 0x5B26, - 0xECD5: 0x5B2F, - 0xECD6: 0x5B2E, - 0xECD7: 0x5B7B, - 0xECD8: 0x5BF1, - 0xECD9: 0x5BF2, - 0xECDA: 0x5DB7, - 0xECDB: 0x5E6C, - 0xECDC: 0x5E6A, - 0xECDD: 0x5FBE, - 0xECDE: 0x5FBB, - 0xECDF: 0x61C3, - 0xECE0: 0x61B5, - 0xECE1: 0x61BC, - 0xECE2: 0x61E7, - 0xECE3: 0x61E0, - 0xECE4: 0x61E5, - 0xECE5: 0x61E4, - 0xECE6: 0x61E8, - 0xECE7: 0x61DE, - 0xECE8: 0x64EF, - 0xECE9: 0x64E9, - 0xECEA: 0x64E3, - 0xECEB: 0x64EB, - 0xECEC: 0x64E4, - 0xECED: 0x64E8, - 0xECEE: 0x6581, - 0xECEF: 0x6580, - 0xECF0: 0x65B6, - 0xECF1: 0x65DA, - 0xECF2: 0x66D2, - 0xECF3: 0x6A8D, - 0xECF4: 0x6A96, - 0xECF5: 0x6A81, - 0xECF6: 0x6AA5, - 0xECF7: 0x6A89, - 0xECF8: 0x6A9F, - 0xECF9: 0x6A9B, - 0xECFA: 0x6AA1, - 0xECFB: 0x6A9E, - 0xECFC: 0x6A87, - 0xECFD: 0x6A93, - 0xECFE: 0x6A8E, - 0xED40: 0x6A95, - 0xED41: 0x6A83, - 0xED42: 0x6AA8, - 0xED43: 0x6AA4, - 0xED44: 0x6A91, - 0xED45: 0x6A7F, - 0xED46: 0x6AA6, - 0xED47: 0x6A9A, - 0xED48: 0x6A85, - 0xED49: 0x6A8C, - 0xED4A: 0x6A92, - 0xED4B: 0x6B5B, - 0xED4C: 0x6BAD, - 0xED4D: 0x6C09, - 0xED4E: 0x6FCC, - 0xED4F: 0x6FA9, - 0xED50: 0x6FF4, - 0xED51: 0x6FD4, - 0xED52: 0x6FE3, - 0xED53: 0x6FDC, - 0xED54: 0x6FED, - 0xED55: 0x6FE7, - 0xED56: 0x6FE6, - 0xED57: 0x6FDE, - 0xED58: 0x6FF2, - 0xED59: 0x6FDD, - 0xED5A: 0x6FE2, - 0xED5B: 0x6FE8, - 0xED5C: 0x71E1, - 0xED5D: 0x71F1, - 0xED5E: 0x71E8, - 0xED5F: 0x71F2, - 0xED60: 0x71E4, - 0xED61: 0x71F0, - 0xED62: 0x71E2, - 0xED63: 0x7373, - 0xED64: 0x736E, - 0xED65: 0x736F, - 0xED66: 0x7497, - 0xED67: 0x74B2, - 0xED68: 0x74AB, - 0xED69: 0x7490, - 0xED6A: 0x74AA, - 0xED6B: 0x74AD, - 0xED6C: 0x74B1, - 0xED6D: 0x74A5, - 0xED6E: 0x74AF, - 0xED6F: 0x7510, - 0xED70: 0x7511, - 0xED71: 0x7512, - 0xED72: 0x750F, - 0xED73: 0x7584, - 0xED74: 0x7643, - 0xED75: 0x7648, - 0xED76: 0x7649, - 0xED77: 0x7647, - 0xED78: 0x76A4, - 0xED79: 0x76E9, - 0xED7A: 0x77B5, - 0xED7B: 0x77AB, - 0xED7C: 0x77B2, - 0xED7D: 0x77B7, - 0xED7E: 0x77B6, - 0xEDA1: 0x77B4, - 0xEDA2: 0x77B1, - 0xEDA3: 0x77A8, - 0xEDA4: 0x77F0, - 0xEDA5: 0x78F3, - 0xEDA6: 0x78FD, - 0xEDA7: 0x7902, - 0xEDA8: 0x78FB, - 0xEDA9: 0x78FC, - 0xEDAA: 0x78F2, - 0xEDAB: 0x7905, - 0xEDAC: 0x78F9, - 0xEDAD: 0x78FE, - 0xEDAE: 0x7904, - 0xEDAF: 0x79AB, - 0xEDB0: 0x79A8, - 0xEDB1: 0x7A5C, - 0xEDB2: 0x7A5B, - 0xEDB3: 0x7A56, - 0xEDB4: 0x7A58, - 0xEDB5: 0x7A54, - 0xEDB6: 0x7A5A, - 0xEDB7: 0x7ABE, - 0xEDB8: 0x7AC0, - 0xEDB9: 0x7AC1, - 0xEDBA: 0x7C05, - 0xEDBB: 0x7C0F, - 0xEDBC: 0x7BF2, - 0xEDBD: 0x7C00, - 0xEDBE: 0x7BFF, - 0xEDBF: 0x7BFB, - 0xEDC0: 0x7C0E, - 0xEDC1: 0x7BF4, - 0xEDC2: 0x7C0B, - 0xEDC3: 0x7BF3, - 0xEDC4: 0x7C02, - 0xEDC5: 0x7C09, - 0xEDC6: 0x7C03, - 0xEDC7: 0x7C01, - 0xEDC8: 0x7BF8, - 0xEDC9: 0x7BFD, - 0xEDCA: 0x7C06, - 0xEDCB: 0x7BF0, - 0xEDCC: 0x7BF1, - 0xEDCD: 0x7C10, - 0xEDCE: 0x7C0A, - 0xEDCF: 0x7CE8, - 0xEDD0: 0x7E2D, - 0xEDD1: 0x7E3C, - 0xEDD2: 0x7E42, - 0xEDD3: 0x7E33, - 0xEDD4: 0x9848, - 0xEDD5: 0x7E38, - 0xEDD6: 0x7E2A, - 0xEDD7: 0x7E49, - 0xEDD8: 0x7E40, - 0xEDD9: 0x7E47, - 0xEDDA: 0x7E29, - 0xEDDB: 0x7E4C, - 0xEDDC: 0x7E30, - 0xEDDD: 0x7E3B, - 0xEDDE: 0x7E36, - 0xEDDF: 0x7E44, - 0xEDE0: 0x7E3A, - 0xEDE1: 0x7F45, - 0xEDE2: 0x7F7F, - 0xEDE3: 0x7F7E, - 0xEDE4: 0x7F7D, - 0xEDE5: 0x7FF4, - 0xEDE6: 0x7FF2, - 0xEDE7: 0x802C, - 0xEDE8: 0x81BB, - 0xEDE9: 0x81C4, - 0xEDEA: 0x81CC, - 0xEDEB: 0x81CA, - 0xEDEC: 0x81C5, - 0xEDED: 0x81C7, - 0xEDEE: 0x81BC, - 0xEDEF: 0x81E9, - 0xEDF0: 0x825B, - 0xEDF1: 0x825A, - 0xEDF2: 0x825C, - 0xEDF3: 0x8583, - 0xEDF4: 0x8580, - 0xEDF5: 0x858F, - 0xEDF6: 0x85A7, - 0xEDF7: 0x8595, - 0xEDF8: 0x85A0, - 0xEDF9: 0x858B, - 0xEDFA: 0x85A3, - 0xEDFB: 0x857B, - 0xEDFC: 0x85A4, - 0xEDFD: 0x859A, - 0xEDFE: 0x859E, - 0xEE40: 0x8577, - 0xEE41: 0x857C, - 0xEE42: 0x8589, - 0xEE43: 0x85A1, - 0xEE44: 0x857A, - 0xEE45: 0x8578, - 0xEE46: 0x8557, - 0xEE47: 0x858E, - 0xEE48: 0x8596, - 0xEE49: 0x8586, - 0xEE4A: 0x858D, - 0xEE4B: 0x8599, - 0xEE4C: 0x859D, - 0xEE4D: 0x8581, - 0xEE4E: 0x85A2, - 0xEE4F: 0x8582, - 0xEE50: 0x8588, - 0xEE51: 0x8585, - 0xEE52: 0x8579, - 0xEE53: 0x8576, - 0xEE54: 0x8598, - 0xEE55: 0x8590, - 0xEE56: 0x859F, - 0xEE57: 0x8668, - 0xEE58: 0x87BE, - 0xEE59: 0x87AA, - 0xEE5A: 0x87AD, - 0xEE5B: 0x87C5, - 0xEE5C: 0x87B0, - 0xEE5D: 0x87AC, - 0xEE5E: 0x87B9, - 0xEE5F: 0x87B5, - 0xEE60: 0x87BC, - 0xEE61: 0x87AE, - 0xEE62: 0x87C9, - 0xEE63: 0x87C3, - 0xEE64: 0x87C2, - 0xEE65: 0x87CC, - 0xEE66: 0x87B7, - 0xEE67: 0x87AF, - 0xEE68: 0x87C4, - 0xEE69: 0x87CA, - 0xEE6A: 0x87B4, - 0xEE6B: 0x87B6, - 0xEE6C: 0x87BF, - 0xEE6D: 0x87B8, - 0xEE6E: 0x87BD, - 0xEE6F: 0x87DE, - 0xEE70: 0x87B2, - 0xEE71: 0x8935, - 0xEE72: 0x8933, - 0xEE73: 0x893C, - 0xEE74: 0x893E, - 0xEE75: 0x8941, - 0xEE76: 0x8952, - 0xEE77: 0x8937, - 0xEE78: 0x8942, - 0xEE79: 0x89AD, - 0xEE7A: 0x89AF, - 0xEE7B: 0x89AE, - 0xEE7C: 0x89F2, - 0xEE7D: 0x89F3, - 0xEE7E: 0x8B1E, - 0xEEA1: 0x8B18, - 0xEEA2: 0x8B16, - 0xEEA3: 0x8B11, - 0xEEA4: 0x8B05, - 0xEEA5: 0x8B0B, - 0xEEA6: 0x8B22, - 0xEEA7: 0x8B0F, - 0xEEA8: 0x8B12, - 0xEEA9: 0x8B15, - 0xEEAA: 0x8B07, - 0xEEAB: 0x8B0D, - 0xEEAC: 0x8B08, - 0xEEAD: 0x8B06, - 0xEEAE: 0x8B1C, - 0xEEAF: 0x8B13, - 0xEEB0: 0x8B1A, - 0xEEB1: 0x8C4F, - 0xEEB2: 0x8C70, - 0xEEB3: 0x8C72, - 0xEEB4: 0x8C71, - 0xEEB5: 0x8C6F, - 0xEEB6: 0x8C95, - 0xEEB7: 0x8C94, - 0xEEB8: 0x8CF9, - 0xEEB9: 0x8D6F, - 0xEEBA: 0x8E4E, - 0xEEBB: 0x8E4D, - 0xEEBC: 0x8E53, - 0xEEBD: 0x8E50, - 0xEEBE: 0x8E4C, - 0xEEBF: 0x8E47, - 0xEEC0: 0x8F43, - 0xEEC1: 0x8F40, - 0xEEC2: 0x9085, - 0xEEC3: 0x907E, - 0xEEC4: 0x9138, - 0xEEC5: 0x919A, - 0xEEC6: 0x91A2, - 0xEEC7: 0x919B, - 0xEEC8: 0x9199, - 0xEEC9: 0x919F, - 0xEECA: 0x91A1, - 0xEECB: 0x919D, - 0xEECC: 0x91A0, - 0xEECD: 0x93A1, - 0xEECE: 0x9383, - 0xEECF: 0x93AF, - 0xEED0: 0x9364, - 0xEED1: 0x9356, - 0xEED2: 0x9347, - 0xEED3: 0x937C, - 0xEED4: 0x9358, - 0xEED5: 0x935C, - 0xEED6: 0x9376, - 0xEED7: 0x9349, - 0xEED8: 0x9350, - 0xEED9: 0x9351, - 0xEEDA: 0x9360, - 0xEEDB: 0x936D, - 0xEEDC: 0x938F, - 0xEEDD: 0x934C, - 0xEEDE: 0x936A, - 0xEEDF: 0x9379, - 0xEEE0: 0x9357, - 0xEEE1: 0x9355, - 0xEEE2: 0x9352, - 0xEEE3: 0x934F, - 0xEEE4: 0x9371, - 0xEEE5: 0x9377, - 0xEEE6: 0x937B, - 0xEEE7: 0x9361, - 0xEEE8: 0x935E, - 0xEEE9: 0x9363, - 0xEEEA: 0x9367, - 0xEEEB: 0x9380, - 0xEEEC: 0x934E, - 0xEEED: 0x9359, - 0xEEEE: 0x95C7, - 0xEEEF: 0x95C0, - 0xEEF0: 0x95C9, - 0xEEF1: 0x95C3, - 0xEEF2: 0x95C5, - 0xEEF3: 0x95B7, - 0xEEF4: 0x96AE, - 0xEEF5: 0x96B0, - 0xEEF6: 0x96AC, - 0xEEF7: 0x9720, - 0xEEF8: 0x971F, - 0xEEF9: 0x9718, - 0xEEFA: 0x971D, - 0xEEFB: 0x9719, - 0xEEFC: 0x979A, - 0xEEFD: 0x97A1, - 0xEEFE: 0x979C, - 0xEF40: 0x979E, - 0xEF41: 0x979D, - 0xEF42: 0x97D5, - 0xEF43: 0x97D4, - 0xEF44: 0x97F1, - 0xEF45: 0x9841, - 0xEF46: 0x9844, - 0xEF47: 0x984A, - 0xEF48: 0x9849, - 0xEF49: 0x9845, - 0xEF4A: 0x9843, - 0xEF4B: 0x9925, - 0xEF4C: 0x992B, - 0xEF4D: 0x992C, - 0xEF4E: 0x992A, - 0xEF4F: 0x9933, - 0xEF50: 0x9932, - 0xEF51: 0x992F, - 0xEF52: 0x992D, - 0xEF53: 0x9931, - 0xEF54: 0x9930, - 0xEF55: 0x9998, - 0xEF56: 0x99A3, - 0xEF57: 0x99A1, - 0xEF58: 0x9A02, - 0xEF59: 0x99FA, - 0xEF5A: 0x99F4, - 0xEF5B: 0x99F7, - 0xEF5C: 0x99F9, - 0xEF5D: 0x99F8, - 0xEF5E: 0x99F6, - 0xEF5F: 0x99FB, - 0xEF60: 0x99FD, - 0xEF61: 0x99FE, - 0xEF62: 0x99FC, - 0xEF63: 0x9A03, - 0xEF64: 0x9ABE, - 0xEF65: 0x9AFE, - 0xEF66: 0x9AFD, - 0xEF67: 0x9B01, - 0xEF68: 0x9AFC, - 0xEF69: 0x9B48, - 0xEF6A: 0x9B9A, - 0xEF6B: 0x9BA8, - 0xEF6C: 0x9B9E, - 0xEF6D: 0x9B9B, - 0xEF6E: 0x9BA6, - 0xEF6F: 0x9BA1, - 0xEF70: 0x9BA5, - 0xEF71: 0x9BA4, - 0xEF72: 0x9B86, - 0xEF73: 0x9BA2, - 0xEF74: 0x9BA0, - 0xEF75: 0x9BAF, - 0xEF76: 0x9D33, - 0xEF77: 0x9D41, - 0xEF78: 0x9D67, - 0xEF79: 0x9D36, - 0xEF7A: 0x9D2E, - 0xEF7B: 0x9D2F, - 0xEF7C: 0x9D31, - 0xEF7D: 0x9D38, - 0xEF7E: 0x9D30, - 0xEFA1: 0x9D45, - 0xEFA2: 0x9D42, - 0xEFA3: 0x9D43, - 0xEFA4: 0x9D3E, - 0xEFA5: 0x9D37, - 0xEFA6: 0x9D40, - 0xEFA7: 0x9D3D, - 0xEFA8: 0x7FF5, - 0xEFA9: 0x9D2D, - 0xEFAA: 0x9E8A, - 0xEFAB: 0x9E89, - 0xEFAC: 0x9E8D, - 0xEFAD: 0x9EB0, - 0xEFAE: 0x9EC8, - 0xEFAF: 0x9EDA, - 0xEFB0: 0x9EFB, - 0xEFB1: 0x9EFF, - 0xEFB2: 0x9F24, - 0xEFB3: 0x9F23, - 0xEFB4: 0x9F22, - 0xEFB5: 0x9F54, - 0xEFB6: 0x9FA0, - 0xEFB7: 0x5131, - 0xEFB8: 0x512D, - 0xEFB9: 0x512E, - 0xEFBA: 0x5698, - 0xEFBB: 0x569C, - 0xEFBC: 0x5697, - 0xEFBD: 0x569A, - 0xEFBE: 0x569D, - 0xEFBF: 0x5699, - 0xEFC0: 0x5970, - 0xEFC1: 0x5B3C, - 0xEFC2: 0x5C69, - 0xEFC3: 0x5C6A, - 0xEFC4: 0x5DC0, - 0xEFC5: 0x5E6D, - 0xEFC6: 0x5E6E, - 0xEFC7: 0x61D8, - 0xEFC8: 0x61DF, - 0xEFC9: 0x61ED, - 0xEFCA: 0x61EE, - 0xEFCB: 0x61F1, - 0xEFCC: 0x61EA, - 0xEFCD: 0x61F0, - 0xEFCE: 0x61EB, - 0xEFCF: 0x61D6, - 0xEFD0: 0x61E9, - 0xEFD1: 0x64FF, - 0xEFD2: 0x6504, - 0xEFD3: 0x64FD, - 0xEFD4: 0x64F8, - 0xEFD5: 0x6501, - 0xEFD6: 0x6503, - 0xEFD7: 0x64FC, - 0xEFD8: 0x6594, - 0xEFD9: 0x65DB, - 0xEFDA: 0x66DA, - 0xEFDB: 0x66DB, - 0xEFDC: 0x66D8, - 0xEFDD: 0x6AC5, - 0xEFDE: 0x6AB9, - 0xEFDF: 0x6ABD, - 0xEFE0: 0x6AE1, - 0xEFE1: 0x6AC6, - 0xEFE2: 0x6ABA, - 0xEFE3: 0x6AB6, - 0xEFE4: 0x6AB7, - 0xEFE5: 0x6AC7, - 0xEFE6: 0x6AB4, - 0xEFE7: 0x6AAD, - 0xEFE8: 0x6B5E, - 0xEFE9: 0x6BC9, - 0xEFEA: 0x6C0B, - 0xEFEB: 0x7007, - 0xEFEC: 0x700C, - 0xEFED: 0x700D, - 0xEFEE: 0x7001, - 0xEFEF: 0x7005, - 0xEFF0: 0x7014, - 0xEFF1: 0x700E, - 0xEFF2: 0x6FFF, - 0xEFF3: 0x7000, - 0xEFF4: 0x6FFB, - 0xEFF5: 0x7026, - 0xEFF6: 0x6FFC, - 0xEFF7: 0x6FF7, - 0xEFF8: 0x700A, - 0xEFF9: 0x7201, - 0xEFFA: 0x71FF, - 0xEFFB: 0x71F9, - 0xEFFC: 0x7203, - 0xEFFD: 0x71FD, - 0xEFFE: 0x7376, - 0xF040: 0x74B8, - 0xF041: 0x74C0, - 0xF042: 0x74B5, - 0xF043: 0x74C1, - 0xF044: 0x74BE, - 0xF045: 0x74B6, - 0xF046: 0x74BB, - 0xF047: 0x74C2, - 0xF048: 0x7514, - 0xF049: 0x7513, - 0xF04A: 0x765C, - 0xF04B: 0x7664, - 0xF04C: 0x7659, - 0xF04D: 0x7650, - 0xF04E: 0x7653, - 0xF04F: 0x7657, - 0xF050: 0x765A, - 0xF051: 0x76A6, - 0xF052: 0x76BD, - 0xF053: 0x76EC, - 0xF054: 0x77C2, - 0xF055: 0x77BA, - 0xF056: 0x78FF, - 0xF057: 0x790C, - 0xF058: 0x7913, - 0xF059: 0x7914, - 0xF05A: 0x7909, - 0xF05B: 0x7910, - 0xF05C: 0x7912, - 0xF05D: 0x7911, - 0xF05E: 0x79AD, - 0xF05F: 0x79AC, - 0xF060: 0x7A5F, - 0xF061: 0x7C1C, - 0xF062: 0x7C29, - 0xF063: 0x7C19, - 0xF064: 0x7C20, - 0xF065: 0x7C1F, - 0xF066: 0x7C2D, - 0xF067: 0x7C1D, - 0xF068: 0x7C26, - 0xF069: 0x7C28, - 0xF06A: 0x7C22, - 0xF06B: 0x7C25, - 0xF06C: 0x7C30, - 0xF06D: 0x7E5C, - 0xF06E: 0x7E50, - 0xF06F: 0x7E56, - 0xF070: 0x7E63, - 0xF071: 0x7E58, - 0xF072: 0x7E62, - 0xF073: 0x7E5F, - 0xF074: 0x7E51, - 0xF075: 0x7E60, - 0xF076: 0x7E57, - 0xF077: 0x7E53, - 0xF078: 0x7FB5, - 0xF079: 0x7FB3, - 0xF07A: 0x7FF7, - 0xF07B: 0x7FF8, - 0xF07C: 0x8075, - 0xF07D: 0x81D1, - 0xF07E: 0x81D2, - 0xF0A1: 0x81D0, - 0xF0A2: 0x825F, - 0xF0A3: 0x825E, - 0xF0A4: 0x85B4, - 0xF0A5: 0x85C6, - 0xF0A6: 0x85C0, - 0xF0A7: 0x85C3, - 0xF0A8: 0x85C2, - 0xF0A9: 0x85B3, - 0xF0AA: 0x85B5, - 0xF0AB: 0x85BD, - 0xF0AC: 0x85C7, - 0xF0AD: 0x85C4, - 0xF0AE: 0x85BF, - 0xF0AF: 0x85CB, - 0xF0B0: 0x85CE, - 0xF0B1: 0x85C8, - 0xF0B2: 0x85C5, - 0xF0B3: 0x85B1, - 0xF0B4: 0x85B6, - 0xF0B5: 0x85D2, - 0xF0B6: 0x8624, - 0xF0B7: 0x85B8, - 0xF0B8: 0x85B7, - 0xF0B9: 0x85BE, - 0xF0BA: 0x8669, - 0xF0BB: 0x87E7, - 0xF0BC: 0x87E6, - 0xF0BD: 0x87E2, - 0xF0BE: 0x87DB, - 0xF0BF: 0x87EB, - 0xF0C0: 0x87EA, - 0xF0C1: 0x87E5, - 0xF0C2: 0x87DF, - 0xF0C3: 0x87F3, - 0xF0C4: 0x87E4, - 0xF0C5: 0x87D4, - 0xF0C6: 0x87DC, - 0xF0C7: 0x87D3, - 0xF0C8: 0x87ED, - 0xF0C9: 0x87D8, - 0xF0CA: 0x87E3, - 0xF0CB: 0x87A4, - 0xF0CC: 0x87D7, - 0xF0CD: 0x87D9, - 0xF0CE: 0x8801, - 0xF0CF: 0x87F4, - 0xF0D0: 0x87E8, - 0xF0D1: 0x87DD, - 0xF0D2: 0x8953, - 0xF0D3: 0x894B, - 0xF0D4: 0x894F, - 0xF0D5: 0x894C, - 0xF0D6: 0x8946, - 0xF0D7: 0x8950, - 0xF0D8: 0x8951, - 0xF0D9: 0x8949, - 0xF0DA: 0x8B2A, - 0xF0DB: 0x8B27, - 0xF0DC: 0x8B23, - 0xF0DD: 0x8B33, - 0xF0DE: 0x8B30, - 0xF0DF: 0x8B35, - 0xF0E0: 0x8B47, - 0xF0E1: 0x8B2F, - 0xF0E2: 0x8B3C, - 0xF0E3: 0x8B3E, - 0xF0E4: 0x8B31, - 0xF0E5: 0x8B25, - 0xF0E6: 0x8B37, - 0xF0E7: 0x8B26, - 0xF0E8: 0x8B36, - 0xF0E9: 0x8B2E, - 0xF0EA: 0x8B24, - 0xF0EB: 0x8B3B, - 0xF0EC: 0x8B3D, - 0xF0ED: 0x8B3A, - 0xF0EE: 0x8C42, - 0xF0EF: 0x8C75, - 0xF0F0: 0x8C99, - 0xF0F1: 0x8C98, - 0xF0F2: 0x8C97, - 0xF0F3: 0x8CFE, - 0xF0F4: 0x8D04, - 0xF0F5: 0x8D02, - 0xF0F6: 0x8D00, - 0xF0F7: 0x8E5C, - 0xF0F8: 0x8E62, - 0xF0F9: 0x8E60, - 0xF0FA: 0x8E57, - 0xF0FB: 0x8E56, - 0xF0FC: 0x8E5E, - 0xF0FD: 0x8E65, - 0xF0FE: 0x8E67, - 0xF140: 0x8E5B, - 0xF141: 0x8E5A, - 0xF142: 0x8E61, - 0xF143: 0x8E5D, - 0xF144: 0x8E69, - 0xF145: 0x8E54, - 0xF146: 0x8F46, - 0xF147: 0x8F47, - 0xF148: 0x8F48, - 0xF149: 0x8F4B, - 0xF14A: 0x9128, - 0xF14B: 0x913A, - 0xF14C: 0x913B, - 0xF14D: 0x913E, - 0xF14E: 0x91A8, - 0xF14F: 0x91A5, - 0xF150: 0x91A7, - 0xF151: 0x91AF, - 0xF152: 0x91AA, - 0xF153: 0x93B5, - 0xF154: 0x938C, - 0xF155: 0x9392, - 0xF156: 0x93B7, - 0xF157: 0x939B, - 0xF158: 0x939D, - 0xF159: 0x9389, - 0xF15A: 0x93A7, - 0xF15B: 0x938E, - 0xF15C: 0x93AA, - 0xF15D: 0x939E, - 0xF15E: 0x93A6, - 0xF15F: 0x9395, - 0xF160: 0x9388, - 0xF161: 0x9399, - 0xF162: 0x939F, - 0xF163: 0x938D, - 0xF164: 0x93B1, - 0xF165: 0x9391, - 0xF166: 0x93B2, - 0xF167: 0x93A4, - 0xF168: 0x93A8, - 0xF169: 0x93B4, - 0xF16A: 0x93A3, - 0xF16B: 0x93A5, - 0xF16C: 0x95D2, - 0xF16D: 0x95D3, - 0xF16E: 0x95D1, - 0xF16F: 0x96B3, - 0xF170: 0x96D7, - 0xF171: 0x96DA, - 0xF172: 0x5DC2, - 0xF173: 0x96DF, - 0xF174: 0x96D8, - 0xF175: 0x96DD, - 0xF176: 0x9723, - 0xF177: 0x9722, - 0xF178: 0x9725, - 0xF179: 0x97AC, - 0xF17A: 0x97AE, - 0xF17B: 0x97A8, - 0xF17C: 0x97AB, - 0xF17D: 0x97A4, - 0xF17E: 0x97AA, - 0xF1A1: 0x97A2, - 0xF1A2: 0x97A5, - 0xF1A3: 0x97D7, - 0xF1A4: 0x97D9, - 0xF1A5: 0x97D6, - 0xF1A6: 0x97D8, - 0xF1A7: 0x97FA, - 0xF1A8: 0x9850, - 0xF1A9: 0x9851, - 0xF1AA: 0x9852, - 0xF1AB: 0x98B8, - 0xF1AC: 0x9941, - 0xF1AD: 0x993C, - 0xF1AE: 0x993A, - 0xF1AF: 0x9A0F, - 0xF1B0: 0x9A0B, - 0xF1B1: 0x9A09, - 0xF1B2: 0x9A0D, - 0xF1B3: 0x9A04, - 0xF1B4: 0x9A11, - 0xF1B5: 0x9A0A, - 0xF1B6: 0x9A05, - 0xF1B7: 0x9A07, - 0xF1B8: 0x9A06, - 0xF1B9: 0x9AC0, - 0xF1BA: 0x9ADC, - 0xF1BB: 0x9B08, - 0xF1BC: 0x9B04, - 0xF1BD: 0x9B05, - 0xF1BE: 0x9B29, - 0xF1BF: 0x9B35, - 0xF1C0: 0x9B4A, - 0xF1C1: 0x9B4C, - 0xF1C2: 0x9B4B, - 0xF1C3: 0x9BC7, - 0xF1C4: 0x9BC6, - 0xF1C5: 0x9BC3, - 0xF1C6: 0x9BBF, - 0xF1C7: 0x9BC1, - 0xF1C8: 0x9BB5, - 0xF1C9: 0x9BB8, - 0xF1CA: 0x9BD3, - 0xF1CB: 0x9BB6, - 0xF1CC: 0x9BC4, - 0xF1CD: 0x9BB9, - 0xF1CE: 0x9BBD, - 0xF1CF: 0x9D5C, - 0xF1D0: 0x9D53, - 0xF1D1: 0x9D4F, - 0xF1D2: 0x9D4A, - 0xF1D3: 0x9D5B, - 0xF1D4: 0x9D4B, - 0xF1D5: 0x9D59, - 0xF1D6: 0x9D56, - 0xF1D7: 0x9D4C, - 0xF1D8: 0x9D57, - 0xF1D9: 0x9D52, - 0xF1DA: 0x9D54, - 0xF1DB: 0x9D5F, - 0xF1DC: 0x9D58, - 0xF1DD: 0x9D5A, - 0xF1DE: 0x9E8E, - 0xF1DF: 0x9E8C, - 0xF1E0: 0x9EDF, - 0xF1E1: 0x9F01, - 0xF1E2: 0x9F00, - 0xF1E3: 0x9F16, - 0xF1E4: 0x9F25, - 0xF1E5: 0x9F2B, - 0xF1E6: 0x9F2A, - 0xF1E7: 0x9F29, - 0xF1E8: 0x9F28, - 0xF1E9: 0x9F4C, - 0xF1EA: 0x9F55, - 0xF1EB: 0x5134, - 0xF1EC: 0x5135, - 0xF1ED: 0x5296, - 0xF1EE: 0x52F7, - 0xF1EF: 0x53B4, - 0xF1F0: 0x56AB, - 0xF1F1: 0x56AD, - 0xF1F2: 0x56A6, - 0xF1F3: 0x56A7, - 0xF1F4: 0x56AA, - 0xF1F5: 0x56AC, - 0xF1F6: 0x58DA, - 0xF1F7: 0x58DD, - 0xF1F8: 0x58DB, - 0xF1F9: 0x5912, - 0xF1FA: 0x5B3D, - 0xF1FB: 0x5B3E, - 0xF1FC: 0x5B3F, - 0xF1FD: 0x5DC3, - 0xF1FE: 0x5E70, - 0xF240: 0x5FBF, - 0xF241: 0x61FB, - 0xF242: 0x6507, - 0xF243: 0x6510, - 0xF244: 0x650D, - 0xF245: 0x6509, - 0xF246: 0x650C, - 0xF247: 0x650E, - 0xF248: 0x6584, - 0xF249: 0x65DE, - 0xF24A: 0x65DD, - 0xF24B: 0x66DE, - 0xF24C: 0x6AE7, - 0xF24D: 0x6AE0, - 0xF24E: 0x6ACC, - 0xF24F: 0x6AD1, - 0xF250: 0x6AD9, - 0xF251: 0x6ACB, - 0xF252: 0x6ADF, - 0xF253: 0x6ADC, - 0xF254: 0x6AD0, - 0xF255: 0x6AEB, - 0xF256: 0x6ACF, - 0xF257: 0x6ACD, - 0xF258: 0x6ADE, - 0xF259: 0x6B60, - 0xF25A: 0x6BB0, - 0xF25B: 0x6C0C, - 0xF25C: 0x7019, - 0xF25D: 0x7027, - 0xF25E: 0x7020, - 0xF25F: 0x7016, - 0xF260: 0x702B, - 0xF261: 0x7021, - 0xF262: 0x7022, - 0xF263: 0x7023, - 0xF264: 0x7029, - 0xF265: 0x7017, - 0xF266: 0x7024, - 0xF267: 0x701C, - 0xF268: 0x702A, - 0xF269: 0x720C, - 0xF26A: 0x720A, - 0xF26B: 0x7207, - 0xF26C: 0x7202, - 0xF26D: 0x7205, - 0xF26E: 0x72A5, - 0xF26F: 0x72A6, - 0xF270: 0x72A4, - 0xF271: 0x72A3, - 0xF272: 0x72A1, - 0xF273: 0x74CB, - 0xF274: 0x74C5, - 0xF275: 0x74B7, - 0xF276: 0x74C3, - 0xF277: 0x7516, - 0xF278: 0x7660, - 0xF279: 0x77C9, - 0xF27A: 0x77CA, - 0xF27B: 0x77C4, - 0xF27C: 0x77F1, - 0xF27D: 0x791D, - 0xF27E: 0x791B, - 0xF2A1: 0x7921, - 0xF2A2: 0x791C, - 0xF2A3: 0x7917, - 0xF2A4: 0x791E, - 0xF2A5: 0x79B0, - 0xF2A6: 0x7A67, - 0xF2A7: 0x7A68, - 0xF2A8: 0x7C33, - 0xF2A9: 0x7C3C, - 0xF2AA: 0x7C39, - 0xF2AB: 0x7C2C, - 0xF2AC: 0x7C3B, - 0xF2AD: 0x7CEC, - 0xF2AE: 0x7CEA, - 0xF2AF: 0x7E76, - 0xF2B0: 0x7E75, - 0xF2B1: 0x7E78, - 0xF2B2: 0x7E70, - 0xF2B3: 0x7E77, - 0xF2B4: 0x7E6F, - 0xF2B5: 0x7E7A, - 0xF2B6: 0x7E72, - 0xF2B7: 0x7E74, - 0xF2B8: 0x7E68, - 0xF2B9: 0x7F4B, - 0xF2BA: 0x7F4A, - 0xF2BB: 0x7F83, - 0xF2BC: 0x7F86, - 0xF2BD: 0x7FB7, - 0xF2BE: 0x7FFD, - 0xF2BF: 0x7FFE, - 0xF2C0: 0x8078, - 0xF2C1: 0x81D7, - 0xF2C2: 0x81D5, - 0xF2C3: 0x8264, - 0xF2C4: 0x8261, - 0xF2C5: 0x8263, - 0xF2C6: 0x85EB, - 0xF2C7: 0x85F1, - 0xF2C8: 0x85ED, - 0xF2C9: 0x85D9, - 0xF2CA: 0x85E1, - 0xF2CB: 0x85E8, - 0xF2CC: 0x85DA, - 0xF2CD: 0x85D7, - 0xF2CE: 0x85EC, - 0xF2CF: 0x85F2, - 0xF2D0: 0x85F8, - 0xF2D1: 0x85D8, - 0xF2D2: 0x85DF, - 0xF2D3: 0x85E3, - 0xF2D4: 0x85DC, - 0xF2D5: 0x85D1, - 0xF2D6: 0x85F0, - 0xF2D7: 0x85E6, - 0xF2D8: 0x85EF, - 0xF2D9: 0x85DE, - 0xF2DA: 0x85E2, - 0xF2DB: 0x8800, - 0xF2DC: 0x87FA, - 0xF2DD: 0x8803, - 0xF2DE: 0x87F6, - 0xF2DF: 0x87F7, - 0xF2E0: 0x8809, - 0xF2E1: 0x880C, - 0xF2E2: 0x880B, - 0xF2E3: 0x8806, - 0xF2E4: 0x87FC, - 0xF2E5: 0x8808, - 0xF2E6: 0x87FF, - 0xF2E7: 0x880A, - 0xF2E8: 0x8802, - 0xF2E9: 0x8962, - 0xF2EA: 0x895A, - 0xF2EB: 0x895B, - 0xF2EC: 0x8957, - 0xF2ED: 0x8961, - 0xF2EE: 0x895C, - 0xF2EF: 0x8958, - 0xF2F0: 0x895D, - 0xF2F1: 0x8959, - 0xF2F2: 0x8988, - 0xF2F3: 0x89B7, - 0xF2F4: 0x89B6, - 0xF2F5: 0x89F6, - 0xF2F6: 0x8B50, - 0xF2F7: 0x8B48, - 0xF2F8: 0x8B4A, - 0xF2F9: 0x8B40, - 0xF2FA: 0x8B53, - 0xF2FB: 0x8B56, - 0xF2FC: 0x8B54, - 0xF2FD: 0x8B4B, - 0xF2FE: 0x8B55, - 0xF340: 0x8B51, - 0xF341: 0x8B42, - 0xF342: 0x8B52, - 0xF343: 0x8B57, - 0xF344: 0x8C43, - 0xF345: 0x8C77, - 0xF346: 0x8C76, - 0xF347: 0x8C9A, - 0xF348: 0x8D06, - 0xF349: 0x8D07, - 0xF34A: 0x8D09, - 0xF34B: 0x8DAC, - 0xF34C: 0x8DAA, - 0xF34D: 0x8DAD, - 0xF34E: 0x8DAB, - 0xF34F: 0x8E6D, - 0xF350: 0x8E78, - 0xF351: 0x8E73, - 0xF352: 0x8E6A, - 0xF353: 0x8E6F, - 0xF354: 0x8E7B, - 0xF355: 0x8EC2, - 0xF356: 0x8F52, - 0xF357: 0x8F51, - 0xF358: 0x8F4F, - 0xF359: 0x8F50, - 0xF35A: 0x8F53, - 0xF35B: 0x8FB4, - 0xF35C: 0x9140, - 0xF35D: 0x913F, - 0xF35E: 0x91B0, - 0xF35F: 0x91AD, - 0xF360: 0x93DE, - 0xF361: 0x93C7, - 0xF362: 0x93CF, - 0xF363: 0x93C2, - 0xF364: 0x93DA, - 0xF365: 0x93D0, - 0xF366: 0x93F9, - 0xF367: 0x93EC, - 0xF368: 0x93CC, - 0xF369: 0x93D9, - 0xF36A: 0x93A9, - 0xF36B: 0x93E6, - 0xF36C: 0x93CA, - 0xF36D: 0x93D4, - 0xF36E: 0x93EE, - 0xF36F: 0x93E3, - 0xF370: 0x93D5, - 0xF371: 0x93C4, - 0xF372: 0x93CE, - 0xF373: 0x93C0, - 0xF374: 0x93D2, - 0xF375: 0x93E7, - 0xF376: 0x957D, - 0xF377: 0x95DA, - 0xF378: 0x95DB, - 0xF379: 0x96E1, - 0xF37A: 0x9729, - 0xF37B: 0x972B, - 0xF37C: 0x972C, - 0xF37D: 0x9728, - 0xF37E: 0x9726, - 0xF3A1: 0x97B3, - 0xF3A2: 0x97B7, - 0xF3A3: 0x97B6, - 0xF3A4: 0x97DD, - 0xF3A5: 0x97DE, - 0xF3A6: 0x97DF, - 0xF3A7: 0x985C, - 0xF3A8: 0x9859, - 0xF3A9: 0x985D, - 0xF3AA: 0x9857, - 0xF3AB: 0x98BF, - 0xF3AC: 0x98BD, - 0xF3AD: 0x98BB, - 0xF3AE: 0x98BE, - 0xF3AF: 0x9948, - 0xF3B0: 0x9947, - 0xF3B1: 0x9943, - 0xF3B2: 0x99A6, - 0xF3B3: 0x99A7, - 0xF3B4: 0x9A1A, - 0xF3B5: 0x9A15, - 0xF3B6: 0x9A25, - 0xF3B7: 0x9A1D, - 0xF3B8: 0x9A24, - 0xF3B9: 0x9A1B, - 0xF3BA: 0x9A22, - 0xF3BB: 0x9A20, - 0xF3BC: 0x9A27, - 0xF3BD: 0x9A23, - 0xF3BE: 0x9A1E, - 0xF3BF: 0x9A1C, - 0xF3C0: 0x9A14, - 0xF3C1: 0x9AC2, - 0xF3C2: 0x9B0B, - 0xF3C3: 0x9B0A, - 0xF3C4: 0x9B0E, - 0xF3C5: 0x9B0C, - 0xF3C6: 0x9B37, - 0xF3C7: 0x9BEA, - 0xF3C8: 0x9BEB, - 0xF3C9: 0x9BE0, - 0xF3CA: 0x9BDE, - 0xF3CB: 0x9BE4, - 0xF3CC: 0x9BE6, - 0xF3CD: 0x9BE2, - 0xF3CE: 0x9BF0, - 0xF3CF: 0x9BD4, - 0xF3D0: 0x9BD7, - 0xF3D1: 0x9BEC, - 0xF3D2: 0x9BDC, - 0xF3D3: 0x9BD9, - 0xF3D4: 0x9BE5, - 0xF3D5: 0x9BD5, - 0xF3D6: 0x9BE1, - 0xF3D7: 0x9BDA, - 0xF3D8: 0x9D77, - 0xF3D9: 0x9D81, - 0xF3DA: 0x9D8A, - 0xF3DB: 0x9D84, - 0xF3DC: 0x9D88, - 0xF3DD: 0x9D71, - 0xF3DE: 0x9D80, - 0xF3DF: 0x9D78, - 0xF3E0: 0x9D86, - 0xF3E1: 0x9D8B, - 0xF3E2: 0x9D8C, - 0xF3E3: 0x9D7D, - 0xF3E4: 0x9D6B, - 0xF3E5: 0x9D74, - 0xF3E6: 0x9D75, - 0xF3E7: 0x9D70, - 0xF3E8: 0x9D69, - 0xF3E9: 0x9D85, - 0xF3EA: 0x9D73, - 0xF3EB: 0x9D7B, - 0xF3EC: 0x9D82, - 0xF3ED: 0x9D6F, - 0xF3EE: 0x9D79, - 0xF3EF: 0x9D7F, - 0xF3F0: 0x9D87, - 0xF3F1: 0x9D68, - 0xF3F2: 0x9E94, - 0xF3F3: 0x9E91, - 0xF3F4: 0x9EC0, - 0xF3F5: 0x9EFC, - 0xF3F6: 0x9F2D, - 0xF3F7: 0x9F40, - 0xF3F8: 0x9F41, - 0xF3F9: 0x9F4D, - 0xF3FA: 0x9F56, - 0xF3FB: 0x9F57, - 0xF3FC: 0x9F58, - 0xF3FD: 0x5337, - 0xF3FE: 0x56B2, - 0xF440: 0x56B5, - 0xF441: 0x56B3, - 0xF442: 0x58E3, - 0xF443: 0x5B45, - 0xF444: 0x5DC6, - 0xF445: 0x5DC7, - 0xF446: 0x5EEE, - 0xF447: 0x5EEF, - 0xF448: 0x5FC0, - 0xF449: 0x5FC1, - 0xF44A: 0x61F9, - 0xF44B: 0x6517, - 0xF44C: 0x6516, - 0xF44D: 0x6515, - 0xF44E: 0x6513, - 0xF44F: 0x65DF, - 0xF450: 0x66E8, - 0xF451: 0x66E3, - 0xF452: 0x66E4, - 0xF453: 0x6AF3, - 0xF454: 0x6AF0, - 0xF455: 0x6AEA, - 0xF456: 0x6AE8, - 0xF457: 0x6AF9, - 0xF458: 0x6AF1, - 0xF459: 0x6AEE, - 0xF45A: 0x6AEF, - 0xF45B: 0x703C, - 0xF45C: 0x7035, - 0xF45D: 0x702F, - 0xF45E: 0x7037, - 0xF45F: 0x7034, - 0xF460: 0x7031, - 0xF461: 0x7042, - 0xF462: 0x7038, - 0xF463: 0x703F, - 0xF464: 0x703A, - 0xF465: 0x7039, - 0xF466: 0x7040, - 0xF467: 0x703B, - 0xF468: 0x7033, - 0xF469: 0x7041, - 0xF46A: 0x7213, - 0xF46B: 0x7214, - 0xF46C: 0x72A8, - 0xF46D: 0x737D, - 0xF46E: 0x737C, - 0xF46F: 0x74BA, - 0xF470: 0x76AB, - 0xF471: 0x76AA, - 0xF472: 0x76BE, - 0xF473: 0x76ED, - 0xF474: 0x77CC, - 0xF475: 0x77CE, - 0xF476: 0x77CF, - 0xF477: 0x77CD, - 0xF478: 0x77F2, - 0xF479: 0x7925, - 0xF47A: 0x7923, - 0xF47B: 0x7927, - 0xF47C: 0x7928, - 0xF47D: 0x7924, - 0xF47E: 0x7929, - 0xF4A1: 0x79B2, - 0xF4A2: 0x7A6E, - 0xF4A3: 0x7A6C, - 0xF4A4: 0x7A6D, - 0xF4A5: 0x7AF7, - 0xF4A6: 0x7C49, - 0xF4A7: 0x7C48, - 0xF4A8: 0x7C4A, - 0xF4A9: 0x7C47, - 0xF4AA: 0x7C45, - 0xF4AB: 0x7CEE, - 0xF4AC: 0x7E7B, - 0xF4AD: 0x7E7E, - 0xF4AE: 0x7E81, - 0xF4AF: 0x7E80, - 0xF4B0: 0x7FBA, - 0xF4B1: 0x7FFF, - 0xF4B2: 0x8079, - 0xF4B3: 0x81DB, - 0xF4B4: 0x81D9, - 0xF4B5: 0x820B, - 0xF4B6: 0x8268, - 0xF4B7: 0x8269, - 0xF4B8: 0x8622, - 0xF4B9: 0x85FF, - 0xF4BA: 0x8601, - 0xF4BB: 0x85FE, - 0xF4BC: 0x861B, - 0xF4BD: 0x8600, - 0xF4BE: 0x85F6, - 0xF4BF: 0x8604, - 0xF4C0: 0x8609, - 0xF4C1: 0x8605, - 0xF4C2: 0x860C, - 0xF4C3: 0x85FD, - 0xF4C4: 0x8819, - 0xF4C5: 0x8810, - 0xF4C6: 0x8811, - 0xF4C7: 0x8817, - 0xF4C8: 0x8813, - 0xF4C9: 0x8816, - 0xF4CA: 0x8963, - 0xF4CB: 0x8966, - 0xF4CC: 0x89B9, - 0xF4CD: 0x89F7, - 0xF4CE: 0x8B60, - 0xF4CF: 0x8B6A, - 0xF4D0: 0x8B5D, - 0xF4D1: 0x8B68, - 0xF4D2: 0x8B63, - 0xF4D3: 0x8B65, - 0xF4D4: 0x8B67, - 0xF4D5: 0x8B6D, - 0xF4D6: 0x8DAE, - 0xF4D7: 0x8E86, - 0xF4D8: 0x8E88, - 0xF4D9: 0x8E84, - 0xF4DA: 0x8F59, - 0xF4DB: 0x8F56, - 0xF4DC: 0x8F57, - 0xF4DD: 0x8F55, - 0xF4DE: 0x8F58, - 0xF4DF: 0x8F5A, - 0xF4E0: 0x908D, - 0xF4E1: 0x9143, - 0xF4E2: 0x9141, - 0xF4E3: 0x91B7, - 0xF4E4: 0x91B5, - 0xF4E5: 0x91B2, - 0xF4E6: 0x91B3, - 0xF4E7: 0x940B, - 0xF4E8: 0x9413, - 0xF4E9: 0x93FB, - 0xF4EA: 0x9420, - 0xF4EB: 0x940F, - 0xF4EC: 0x9414, - 0xF4ED: 0x93FE, - 0xF4EE: 0x9415, - 0xF4EF: 0x9410, - 0xF4F0: 0x9428, - 0xF4F1: 0x9419, - 0xF4F2: 0x940D, - 0xF4F3: 0x93F5, - 0xF4F4: 0x9400, - 0xF4F5: 0x93F7, - 0xF4F6: 0x9407, - 0xF4F7: 0x940E, - 0xF4F8: 0x9416, - 0xF4F9: 0x9412, - 0xF4FA: 0x93FA, - 0xF4FB: 0x9409, - 0xF4FC: 0x93F8, - 0xF4FD: 0x940A, - 0xF4FE: 0x93FF, - 0xF540: 0x93FC, - 0xF541: 0x940C, - 0xF542: 0x93F6, - 0xF543: 0x9411, - 0xF544: 0x9406, - 0xF545: 0x95DE, - 0xF546: 0x95E0, - 0xF547: 0x95DF, - 0xF548: 0x972E, - 0xF549: 0x972F, - 0xF54A: 0x97B9, - 0xF54B: 0x97BB, - 0xF54C: 0x97FD, - 0xF54D: 0x97FE, - 0xF54E: 0x9860, - 0xF54F: 0x9862, - 0xF550: 0x9863, - 0xF551: 0x985F, - 0xF552: 0x98C1, - 0xF553: 0x98C2, - 0xF554: 0x9950, - 0xF555: 0x994E, - 0xF556: 0x9959, - 0xF557: 0x994C, - 0xF558: 0x994B, - 0xF559: 0x9953, - 0xF55A: 0x9A32, - 0xF55B: 0x9A34, - 0xF55C: 0x9A31, - 0xF55D: 0x9A2C, - 0xF55E: 0x9A2A, - 0xF55F: 0x9A36, - 0xF560: 0x9A29, - 0xF561: 0x9A2E, - 0xF562: 0x9A38, - 0xF563: 0x9A2D, - 0xF564: 0x9AC7, - 0xF565: 0x9ACA, - 0xF566: 0x9AC6, - 0xF567: 0x9B10, - 0xF568: 0x9B12, - 0xF569: 0x9B11, - 0xF56A: 0x9C0B, - 0xF56B: 0x9C08, - 0xF56C: 0x9BF7, - 0xF56D: 0x9C05, - 0xF56E: 0x9C12, - 0xF56F: 0x9BF8, - 0xF570: 0x9C40, - 0xF571: 0x9C07, - 0xF572: 0x9C0E, - 0xF573: 0x9C06, - 0xF574: 0x9C17, - 0xF575: 0x9C14, - 0xF576: 0x9C09, - 0xF577: 0x9D9F, - 0xF578: 0x9D99, - 0xF579: 0x9DA4, - 0xF57A: 0x9D9D, - 0xF57B: 0x9D92, - 0xF57C: 0x9D98, - 0xF57D: 0x9D90, - 0xF57E: 0x9D9B, - 0xF5A1: 0x9DA0, - 0xF5A2: 0x9D94, - 0xF5A3: 0x9D9C, - 0xF5A4: 0x9DAA, - 0xF5A5: 0x9D97, - 0xF5A6: 0x9DA1, - 0xF5A7: 0x9D9A, - 0xF5A8: 0x9DA2, - 0xF5A9: 0x9DA8, - 0xF5AA: 0x9D9E, - 0xF5AB: 0x9DA3, - 0xF5AC: 0x9DBF, - 0xF5AD: 0x9DA9, - 0xF5AE: 0x9D96, - 0xF5AF: 0x9DA6, - 0xF5B0: 0x9DA7, - 0xF5B1: 0x9E99, - 0xF5B2: 0x9E9B, - 0xF5B3: 0x9E9A, - 0xF5B4: 0x9EE5, - 0xF5B5: 0x9EE4, - 0xF5B6: 0x9EE7, - 0xF5B7: 0x9EE6, - 0xF5B8: 0x9F30, - 0xF5B9: 0x9F2E, - 0xF5BA: 0x9F5B, - 0xF5BB: 0x9F60, - 0xF5BC: 0x9F5E, - 0xF5BD: 0x9F5D, - 0xF5BE: 0x9F59, - 0xF5BF: 0x9F91, - 0xF5C0: 0x513A, - 0xF5C1: 0x5139, - 0xF5C2: 0x5298, - 0xF5C3: 0x5297, - 0xF5C4: 0x56C3, - 0xF5C5: 0x56BD, - 0xF5C6: 0x56BE, - 0xF5C7: 0x5B48, - 0xF5C8: 0x5B47, - 0xF5C9: 0x5DCB, - 0xF5CA: 0x5DCF, - 0xF5CB: 0x5EF1, - 0xF5CC: 0x61FD, - 0xF5CD: 0x651B, - 0xF5CE: 0x6B02, - 0xF5CF: 0x6AFC, - 0xF5D0: 0x6B03, - 0xF5D1: 0x6AF8, - 0xF5D2: 0x6B00, - 0xF5D3: 0x7043, - 0xF5D4: 0x7044, - 0xF5D5: 0x704A, - 0xF5D6: 0x7048, - 0xF5D7: 0x7049, - 0xF5D8: 0x7045, - 0xF5D9: 0x7046, - 0xF5DA: 0x721D, - 0xF5DB: 0x721A, - 0xF5DC: 0x7219, - 0xF5DD: 0x737E, - 0xF5DE: 0x7517, - 0xF5DF: 0x766A, - 0xF5E0: 0x77D0, - 0xF5E1: 0x792D, - 0xF5E2: 0x7931, - 0xF5E3: 0x792F, - 0xF5E4: 0x7C54, - 0xF5E5: 0x7C53, - 0xF5E6: 0x7CF2, - 0xF5E7: 0x7E8A, - 0xF5E8: 0x7E87, - 0xF5E9: 0x7E88, - 0xF5EA: 0x7E8B, - 0xF5EB: 0x7E86, - 0xF5EC: 0x7E8D, - 0xF5ED: 0x7F4D, - 0xF5EE: 0x7FBB, - 0xF5EF: 0x8030, - 0xF5F0: 0x81DD, - 0xF5F1: 0x8618, - 0xF5F2: 0x862A, - 0xF5F3: 0x8626, - 0xF5F4: 0x861F, - 0xF5F5: 0x8623, - 0xF5F6: 0x861C, - 0xF5F7: 0x8619, - 0xF5F8: 0x8627, - 0xF5F9: 0x862E, - 0xF5FA: 0x8621, - 0xF5FB: 0x8620, - 0xF5FC: 0x8629, - 0xF5FD: 0x861E, - 0xF5FE: 0x8625, - 0xF640: 0x8829, - 0xF641: 0x881D, - 0xF642: 0x881B, - 0xF643: 0x8820, - 0xF644: 0x8824, - 0xF645: 0x881C, - 0xF646: 0x882B, - 0xF647: 0x884A, - 0xF648: 0x896D, - 0xF649: 0x8969, - 0xF64A: 0x896E, - 0xF64B: 0x896B, - 0xF64C: 0x89FA, - 0xF64D: 0x8B79, - 0xF64E: 0x8B78, - 0xF64F: 0x8B45, - 0xF650: 0x8B7A, - 0xF651: 0x8B7B, - 0xF652: 0x8D10, - 0xF653: 0x8D14, - 0xF654: 0x8DAF, - 0xF655: 0x8E8E, - 0xF656: 0x8E8C, - 0xF657: 0x8F5E, - 0xF658: 0x8F5B, - 0xF659: 0x8F5D, - 0xF65A: 0x9146, - 0xF65B: 0x9144, - 0xF65C: 0x9145, - 0xF65D: 0x91B9, - 0xF65E: 0x943F, - 0xF65F: 0x943B, - 0xF660: 0x9436, - 0xF661: 0x9429, - 0xF662: 0x943D, - 0xF663: 0x943C, - 0xF664: 0x9430, - 0xF665: 0x9439, - 0xF666: 0x942A, - 0xF667: 0x9437, - 0xF668: 0x942C, - 0xF669: 0x9440, - 0xF66A: 0x9431, - 0xF66B: 0x95E5, - 0xF66C: 0x95E4, - 0xF66D: 0x95E3, - 0xF66E: 0x9735, - 0xF66F: 0x973A, - 0xF670: 0x97BF, - 0xF671: 0x97E1, - 0xF672: 0x9864, - 0xF673: 0x98C9, - 0xF674: 0x98C6, - 0xF675: 0x98C0, - 0xF676: 0x9958, - 0xF677: 0x9956, - 0xF678: 0x9A39, - 0xF679: 0x9A3D, - 0xF67A: 0x9A46, - 0xF67B: 0x9A44, - 0xF67C: 0x9A42, - 0xF67D: 0x9A41, - 0xF67E: 0x9A3A, - 0xF6A1: 0x9A3F, - 0xF6A2: 0x9ACD, - 0xF6A3: 0x9B15, - 0xF6A4: 0x9B17, - 0xF6A5: 0x9B18, - 0xF6A6: 0x9B16, - 0xF6A7: 0x9B3A, - 0xF6A8: 0x9B52, - 0xF6A9: 0x9C2B, - 0xF6AA: 0x9C1D, - 0xF6AB: 0x9C1C, - 0xF6AC: 0x9C2C, - 0xF6AD: 0x9C23, - 0xF6AE: 0x9C28, - 0xF6AF: 0x9C29, - 0xF6B0: 0x9C24, - 0xF6B1: 0x9C21, - 0xF6B2: 0x9DB7, - 0xF6B3: 0x9DB6, - 0xF6B4: 0x9DBC, - 0xF6B5: 0x9DC1, - 0xF6B6: 0x9DC7, - 0xF6B7: 0x9DCA, - 0xF6B8: 0x9DCF, - 0xF6B9: 0x9DBE, - 0xF6BA: 0x9DC5, - 0xF6BB: 0x9DC3, - 0xF6BC: 0x9DBB, - 0xF6BD: 0x9DB5, - 0xF6BE: 0x9DCE, - 0xF6BF: 0x9DB9, - 0xF6C0: 0x9DBA, - 0xF6C1: 0x9DAC, - 0xF6C2: 0x9DC8, - 0xF6C3: 0x9DB1, - 0xF6C4: 0x9DAD, - 0xF6C5: 0x9DCC, - 0xF6C6: 0x9DB3, - 0xF6C7: 0x9DCD, - 0xF6C8: 0x9DB2, - 0xF6C9: 0x9E7A, - 0xF6CA: 0x9E9C, - 0xF6CB: 0x9EEB, - 0xF6CC: 0x9EEE, - 0xF6CD: 0x9EED, - 0xF6CE: 0x9F1B, - 0xF6CF: 0x9F18, - 0xF6D0: 0x9F1A, - 0xF6D1: 0x9F31, - 0xF6D2: 0x9F4E, - 0xF6D3: 0x9F65, - 0xF6D4: 0x9F64, - 0xF6D5: 0x9F92, - 0xF6D6: 0x4EB9, - 0xF6D7: 0x56C6, - 0xF6D8: 0x56C5, - 0xF6D9: 0x56CB, - 0xF6DA: 0x5971, - 0xF6DB: 0x5B4B, - 0xF6DC: 0x5B4C, - 0xF6DD: 0x5DD5, - 0xF6DE: 0x5DD1, - 0xF6DF: 0x5EF2, - 0xF6E0: 0x6521, - 0xF6E1: 0x6520, - 0xF6E2: 0x6526, - 0xF6E3: 0x6522, - 0xF6E4: 0x6B0B, - 0xF6E5: 0x6B08, - 0xF6E6: 0x6B09, - 0xF6E7: 0x6C0D, - 0xF6E8: 0x7055, - 0xF6E9: 0x7056, - 0xF6EA: 0x7057, - 0xF6EB: 0x7052, - 0xF6EC: 0x721E, - 0xF6ED: 0x721F, - 0xF6EE: 0x72A9, - 0xF6EF: 0x737F, - 0xF6F0: 0x74D8, - 0xF6F1: 0x74D5, - 0xF6F2: 0x74D9, - 0xF6F3: 0x74D7, - 0xF6F4: 0x766D, - 0xF6F5: 0x76AD, - 0xF6F6: 0x7935, - 0xF6F7: 0x79B4, - 0xF6F8: 0x7A70, - 0xF6F9: 0x7A71, - 0xF6FA: 0x7C57, - 0xF6FB: 0x7C5C, - 0xF6FC: 0x7C59, - 0xF6FD: 0x7C5B, - 0xF6FE: 0x7C5A, - 0xF740: 0x7CF4, - 0xF741: 0x7CF1, - 0xF742: 0x7E91, - 0xF743: 0x7F4F, - 0xF744: 0x7F87, - 0xF745: 0x81DE, - 0xF746: 0x826B, - 0xF747: 0x8634, - 0xF748: 0x8635, - 0xF749: 0x8633, - 0xF74A: 0x862C, - 0xF74B: 0x8632, - 0xF74C: 0x8636, - 0xF74D: 0x882C, - 0xF74E: 0x8828, - 0xF74F: 0x8826, - 0xF750: 0x882A, - 0xF751: 0x8825, - 0xF752: 0x8971, - 0xF753: 0x89BF, - 0xF754: 0x89BE, - 0xF755: 0x89FB, - 0xF756: 0x8B7E, - 0xF757: 0x8B84, - 0xF758: 0x8B82, - 0xF759: 0x8B86, - 0xF75A: 0x8B85, - 0xF75B: 0x8B7F, - 0xF75C: 0x8D15, - 0xF75D: 0x8E95, - 0xF75E: 0x8E94, - 0xF75F: 0x8E9A, - 0xF760: 0x8E92, - 0xF761: 0x8E90, - 0xF762: 0x8E96, - 0xF763: 0x8E97, - 0xF764: 0x8F60, - 0xF765: 0x8F62, - 0xF766: 0x9147, - 0xF767: 0x944C, - 0xF768: 0x9450, - 0xF769: 0x944A, - 0xF76A: 0x944B, - 0xF76B: 0x944F, - 0xF76C: 0x9447, - 0xF76D: 0x9445, - 0xF76E: 0x9448, - 0xF76F: 0x9449, - 0xF770: 0x9446, - 0xF771: 0x973F, - 0xF772: 0x97E3, - 0xF773: 0x986A, - 0xF774: 0x9869, - 0xF775: 0x98CB, - 0xF776: 0x9954, - 0xF777: 0x995B, - 0xF778: 0x9A4E, - 0xF779: 0x9A53, - 0xF77A: 0x9A54, - 0xF77B: 0x9A4C, - 0xF77C: 0x9A4F, - 0xF77D: 0x9A48, - 0xF77E: 0x9A4A, - 0xF7A1: 0x9A49, - 0xF7A2: 0x9A52, - 0xF7A3: 0x9A50, - 0xF7A4: 0x9AD0, - 0xF7A5: 0x9B19, - 0xF7A6: 0x9B2B, - 0xF7A7: 0x9B3B, - 0xF7A8: 0x9B56, - 0xF7A9: 0x9B55, - 0xF7AA: 0x9C46, - 0xF7AB: 0x9C48, - 0xF7AC: 0x9C3F, - 0xF7AD: 0x9C44, - 0xF7AE: 0x9C39, - 0xF7AF: 0x9C33, - 0xF7B0: 0x9C41, - 0xF7B1: 0x9C3C, - 0xF7B2: 0x9C37, - 0xF7B3: 0x9C34, - 0xF7B4: 0x9C32, - 0xF7B5: 0x9C3D, - 0xF7B6: 0x9C36, - 0xF7B7: 0x9DDB, - 0xF7B8: 0x9DD2, - 0xF7B9: 0x9DDE, - 0xF7BA: 0x9DDA, - 0xF7BB: 0x9DCB, - 0xF7BC: 0x9DD0, - 0xF7BD: 0x9DDC, - 0xF7BE: 0x9DD1, - 0xF7BF: 0x9DDF, - 0xF7C0: 0x9DE9, - 0xF7C1: 0x9DD9, - 0xF7C2: 0x9DD8, - 0xF7C3: 0x9DD6, - 0xF7C4: 0x9DF5, - 0xF7C5: 0x9DD5, - 0xF7C6: 0x9DDD, - 0xF7C7: 0x9EB6, - 0xF7C8: 0x9EF0, - 0xF7C9: 0x9F35, - 0xF7CA: 0x9F33, - 0xF7CB: 0x9F32, - 0xF7CC: 0x9F42, - 0xF7CD: 0x9F6B, - 0xF7CE: 0x9F95, - 0xF7CF: 0x9FA2, - 0xF7D0: 0x513D, - 0xF7D1: 0x5299, - 0xF7D2: 0x58E8, - 0xF7D3: 0x58E7, - 0xF7D4: 0x5972, - 0xF7D5: 0x5B4D, - 0xF7D6: 0x5DD8, - 0xF7D7: 0x882F, - 0xF7D8: 0x5F4F, - 0xF7D9: 0x6201, - 0xF7DA: 0x6203, - 0xF7DB: 0x6204, - 0xF7DC: 0x6529, - 0xF7DD: 0x6525, - 0xF7DE: 0x6596, - 0xF7DF: 0x66EB, - 0xF7E0: 0x6B11, - 0xF7E1: 0x6B12, - 0xF7E2: 0x6B0F, - 0xF7E3: 0x6BCA, - 0xF7E4: 0x705B, - 0xF7E5: 0x705A, - 0xF7E6: 0x7222, - 0xF7E7: 0x7382, - 0xF7E8: 0x7381, - 0xF7E9: 0x7383, - 0xF7EA: 0x7670, - 0xF7EB: 0x77D4, - 0xF7EC: 0x7C67, - 0xF7ED: 0x7C66, - 0xF7EE: 0x7E95, - 0xF7EF: 0x826C, - 0xF7F0: 0x863A, - 0xF7F1: 0x8640, - 0xF7F2: 0x8639, - 0xF7F3: 0x863C, - 0xF7F4: 0x8631, - 0xF7F5: 0x863B, - 0xF7F6: 0x863E, - 0xF7F7: 0x8830, - 0xF7F8: 0x8832, - 0xF7F9: 0x882E, - 0xF7FA: 0x8833, - 0xF7FB: 0x8976, - 0xF7FC: 0x8974, - 0xF7FD: 0x8973, - 0xF7FE: 0x89FE, - 0xF840: 0x8B8C, - 0xF841: 0x8B8E, - 0xF842: 0x8B8B, - 0xF843: 0x8B88, - 0xF844: 0x8C45, - 0xF845: 0x8D19, - 0xF846: 0x8E98, - 0xF847: 0x8F64, - 0xF848: 0x8F63, - 0xF849: 0x91BC, - 0xF84A: 0x9462, - 0xF84B: 0x9455, - 0xF84C: 0x945D, - 0xF84D: 0x9457, - 0xF84E: 0x945E, - 0xF84F: 0x97C4, - 0xF850: 0x97C5, - 0xF851: 0x9800, - 0xF852: 0x9A56, - 0xF853: 0x9A59, - 0xF854: 0x9B1E, - 0xF855: 0x9B1F, - 0xF856: 0x9B20, - 0xF857: 0x9C52, - 0xF858: 0x9C58, - 0xF859: 0x9C50, - 0xF85A: 0x9C4A, - 0xF85B: 0x9C4D, - 0xF85C: 0x9C4B, - 0xF85D: 0x9C55, - 0xF85E: 0x9C59, - 0xF85F: 0x9C4C, - 0xF860: 0x9C4E, - 0xF861: 0x9DFB, - 0xF862: 0x9DF7, - 0xF863: 0x9DEF, - 0xF864: 0x9DE3, - 0xF865: 0x9DEB, - 0xF866: 0x9DF8, - 0xF867: 0x9DE4, - 0xF868: 0x9DF6, - 0xF869: 0x9DE1, - 0xF86A: 0x9DEE, - 0xF86B: 0x9DE6, - 0xF86C: 0x9DF2, - 0xF86D: 0x9DF0, - 0xF86E: 0x9DE2, - 0xF86F: 0x9DEC, - 0xF870: 0x9DF4, - 0xF871: 0x9DF3, - 0xF872: 0x9DE8, - 0xF873: 0x9DED, - 0xF874: 0x9EC2, - 0xF875: 0x9ED0, - 0xF876: 0x9EF2, - 0xF877: 0x9EF3, - 0xF878: 0x9F06, - 0xF879: 0x9F1C, - 0xF87A: 0x9F38, - 0xF87B: 0x9F37, - 0xF87C: 0x9F36, - 0xF87D: 0x9F43, - 0xF87E: 0x9F4F, - 0xF8A1: 0x9F71, - 0xF8A2: 0x9F70, - 0xF8A3: 0x9F6E, - 0xF8A4: 0x9F6F, - 0xF8A5: 0x56D3, - 0xF8A6: 0x56CD, - 0xF8A7: 0x5B4E, - 0xF8A8: 0x5C6D, - 0xF8A9: 0x652D, - 0xF8AA: 0x66ED, - 0xF8AB: 0x66EE, - 0xF8AC: 0x6B13, - 0xF8AD: 0x705F, - 0xF8AE: 0x7061, - 0xF8AF: 0x705D, - 0xF8B0: 0x7060, - 0xF8B1: 0x7223, - 0xF8B2: 0x74DB, - 0xF8B3: 0x74E5, - 0xF8B4: 0x77D5, - 0xF8B5: 0x7938, - 0xF8B6: 0x79B7, - 0xF8B7: 0x79B6, - 0xF8B8: 0x7C6A, - 0xF8B9: 0x7E97, - 0xF8BA: 0x7F89, - 0xF8BB: 0x826D, - 0xF8BC: 0x8643, - 0xF8BD: 0x8838, - 0xF8BE: 0x8837, - 0xF8BF: 0x8835, - 0xF8C0: 0x884B, - 0xF8C1: 0x8B94, - 0xF8C2: 0x8B95, - 0xF8C3: 0x8E9E, - 0xF8C4: 0x8E9F, - 0xF8C5: 0x8EA0, - 0xF8C6: 0x8E9D, - 0xF8C7: 0x91BE, - 0xF8C8: 0x91BD, - 0xF8C9: 0x91C2, - 0xF8CA: 0x946B, - 0xF8CB: 0x9468, - 0xF8CC: 0x9469, - 0xF8CD: 0x96E5, - 0xF8CE: 0x9746, - 0xF8CF: 0x9743, - 0xF8D0: 0x9747, - 0xF8D1: 0x97C7, - 0xF8D2: 0x97E5, - 0xF8D3: 0x9A5E, - 0xF8D4: 0x9AD5, - 0xF8D5: 0x9B59, - 0xF8D6: 0x9C63, - 0xF8D7: 0x9C67, - 0xF8D8: 0x9C66, - 0xF8D9: 0x9C62, - 0xF8DA: 0x9C5E, - 0xF8DB: 0x9C60, - 0xF8DC: 0x9E02, - 0xF8DD: 0x9DFE, - 0xF8DE: 0x9E07, - 0xF8DF: 0x9E03, - 0xF8E0: 0x9E06, - 0xF8E1: 0x9E05, - 0xF8E2: 0x9E00, - 0xF8E3: 0x9E01, - 0xF8E4: 0x9E09, - 0xF8E5: 0x9DFF, - 0xF8E6: 0x9DFD, - 0xF8E7: 0x9E04, - 0xF8E8: 0x9EA0, - 0xF8E9: 0x9F1E, - 0xF8EA: 0x9F46, - 0xF8EB: 0x9F74, - 0xF8EC: 0x9F75, - 0xF8ED: 0x9F76, - 0xF8EE: 0x56D4, - 0xF8EF: 0x652E, - 0xF8F0: 0x65B8, - 0xF8F1: 0x6B18, - 0xF8F2: 0x6B19, - 0xF8F3: 0x6B17, - 0xF8F4: 0x6B1A, - 0xF8F5: 0x7062, - 0xF8F6: 0x7226, - 0xF8F7: 0x72AA, - 0xF8F8: 0x77D8, - 0xF8F9: 0x77D9, - 0xF8FA: 0x7939, - 0xF8FB: 0x7C69, - 0xF8FC: 0x7C6B, - 0xF8FD: 0x7CF6, - 0xF8FE: 0x7E9A, - 0xF940: 0x7E98, - 0xF941: 0x7E9B, - 0xF942: 0x7E99, - 0xF943: 0x81E0, - 0xF944: 0x81E1, - 0xF945: 0x8646, - 0xF946: 0x8647, - 0xF947: 0x8648, - 0xF948: 0x8979, - 0xF949: 0x897A, - 0xF94A: 0x897C, - 0xF94B: 0x897B, - 0xF94C: 0x89FF, - 0xF94D: 0x8B98, - 0xF94E: 0x8B99, - 0xF94F: 0x8EA5, - 0xF950: 0x8EA4, - 0xF951: 0x8EA3, - 0xF952: 0x946E, - 0xF953: 0x946D, - 0xF954: 0x946F, - 0xF955: 0x9471, - 0xF956: 0x9473, - 0xF957: 0x9749, - 0xF958: 0x9872, - 0xF959: 0x995F, - 0xF95A: 0x9C68, - 0xF95B: 0x9C6E, - 0xF95C: 0x9C6D, - 0xF95D: 0x9E0B, - 0xF95E: 0x9E0D, - 0xF95F: 0x9E10, - 0xF960: 0x9E0F, - 0xF961: 0x9E12, - 0xF962: 0x9E11, - 0xF963: 0x9EA1, - 0xF964: 0x9EF5, - 0xF965: 0x9F09, - 0xF966: 0x9F47, - 0xF967: 0x9F78, - 0xF968: 0x9F7B, - 0xF969: 0x9F7A, - 0xF96A: 0x9F79, - 0xF96B: 0x571E, - 0xF96C: 0x7066, - 0xF96D: 0x7C6F, - 0xF96E: 0x883C, - 0xF96F: 0x8DB2, - 0xF970: 0x8EA6, - 0xF971: 0x91C3, - 0xF972: 0x9474, - 0xF973: 0x9478, - 0xF974: 0x9476, - 0xF975: 0x9475, - 0xF976: 0x9A60, - 0xF977: 0x9C74, - 0xF978: 0x9C73, - 0xF979: 0x9C71, - 0xF97A: 0x9C75, - 0xF97B: 0x9E14, - 0xF97C: 0x9E13, - 0xF97D: 0x9EF6, - 0xF97E: 0x9F0A, - 0xF9A1: 0x9FA4, - 0xF9A2: 0x7068, - 0xF9A3: 0x7065, - 0xF9A4: 0x7CF7, - 0xF9A5: 0x866A, - 0xF9A6: 0x883E, - 0xF9A7: 0x883D, - 0xF9A8: 0x883F, - 0xF9A9: 0x8B9E, - 0xF9AA: 0x8C9C, - 0xF9AB: 0x8EA9, - 0xF9AC: 0x8EC9, - 0xF9AD: 0x974B, - 0xF9AE: 0x9873, - 0xF9AF: 0x9874, - 0xF9B0: 0x98CC, - 0xF9B1: 0x9961, - 0xF9B2: 0x99AB, - 0xF9B3: 0x9A64, - 0xF9B4: 0x9A66, - 0xF9B5: 0x9A67, - 0xF9B6: 0x9B24, - 0xF9B7: 0x9E15, - 0xF9B8: 0x9E17, - 0xF9B9: 0x9F48, - 0xF9BA: 0x6207, - 0xF9BB: 0x6B1E, - 0xF9BC: 0x7227, - 0xF9BD: 0x864C, - 0xF9BE: 0x8EA8, - 0xF9BF: 0x9482, - 0xF9C0: 0x9480, - 0xF9C1: 0x9481, - 0xF9C2: 0x9A69, - 0xF9C3: 0x9A68, - 0xF9C4: 0x9B2E, - 0xF9C5: 0x9E19, - 0xF9C6: 0x7229, - 0xF9C7: 0x864B, - 0xF9C8: 0x8B9F, - 0xF9C9: 0x9483, - 0xF9CA: 0x9C79, - 0xF9CB: 0x9EB7, - 0xF9CC: 0x7675, - 0xF9CD: 0x9A6B, - 0xF9CE: 0x9C7A, - 0xF9CF: 0x9E1D, - 0xF9D0: 0x7069, - 0xF9D1: 0x706A, - 0xF9D2: 0x9EA4, - 0xF9D3: 0x9F7E, - 0xF9D4: 0x9F49, - 0xF9D5: 0x9F98, -} diff --git a/vendor/github.com/axgle/mahonia/big5.go b/vendor/github.com/axgle/mahonia/big5.go deleted file mode 100644 index 07044fe..0000000 --- a/vendor/github.com/axgle/mahonia/big5.go +++ /dev/null @@ -1,89 +0,0 @@ -package mahonia - -// Converters for Big 5 encoding. - -import ( - "sync" -) - -func init() { - RegisterCharset(&Charset{ - Name: "Big5", - Aliases: []string{"csBig5"}, - NewDecoder: func() Decoder { - return decodeBig5Rune - }, - NewEncoder: func() Encoder { - big5Once.Do(reverseBig5Table) - return encodeBig5Rune - }, - }) -} - -func decodeBig5Rune(p []byte) (r rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b < 128 { - return rune(b), 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - c := int(p[0])<<8 + int(p[1]) - c = int(big5ToUnicode[c]) - if c > 0 { - return rune(c), 2, SUCCESS - } - - return 0xfffd, 1, INVALID_CHAR -} - -func encodeBig5Rune(p []byte, r rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if r < 128 { - p[0] = byte(r) - return 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - if r < 0x10000 { - c := unicodeToBig5[r] - if c > 0 { - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - } - - p[0] = '?' - return 1, INVALID_CHAR -} - -var big5Once sync.Once - -var unicodeToBig5 []uint16 - -func reverseBig5Table() { - unicodeToBig5 = make([]uint16, 65536) - - for big5, unicode := range big5ToUnicode { - if unicode > 0 { - unicodeToBig5[unicode] = uint16(big5) - } - } -} diff --git a/vendor/github.com/axgle/mahonia/charset.go b/vendor/github.com/axgle/mahonia/charset.go deleted file mode 100644 index 6955c8e..0000000 --- a/vendor/github.com/axgle/mahonia/charset.go +++ /dev/null @@ -1,112 +0,0 @@ -// This package is a character-set conversion library for Go. -package mahonia - -import ( - "bytes" - "unicode" -) - -// Status is the type for the status return value from a Decoder or Encoder. -type Status int - -const ( - // SUCCESS means that the character was converted with no problems. - SUCCESS = Status(iota) - - // INVALID_CHAR means that the source contained invalid bytes, or that the character - // could not be represented in the destination encoding. - // The Encoder or Decoder should have output a substitute character. - INVALID_CHAR - - // NO_ROOM means there were not enough input bytes to form a complete character, - // or there was not enough room in the output buffer to write a complete character. - // No bytes were written, and no internal state was changed in the Encoder or Decoder. - NO_ROOM - - // STATE_ONLY means that bytes were read or written indicating a state transition, - // but no actual character was processed. (Examples: byte order marks, ISO-2022 escape sequences) - STATE_ONLY -) - -// A Decoder is a function that decodes a character set, one character at a time. -// It works much like utf8.DecodeRune, but has an aditional status return value. -type Decoder func(p []byte) (c rune, size int, status Status) - -// An Encoder is a function that encodes a character set, one character at a time. -// It works much like utf8.EncodeRune, but has an additional status return value. -type Encoder func(p []byte, c rune) (size int, status Status) - -// A Charset represents a character set that can be converted, and contains functions -// to create Converters to encode and decode strings in that character set. -type Charset struct { - // Name is the character set's canonical name. - Name string - - // Aliases returns a list of alternate names. - Aliases []string - - // NewDecoder returns a Decoder to convert from the charset to Unicode. - NewDecoder func() Decoder - - // NewEncoder returns an Encoder to convert from Unicode to the charset. - NewEncoder func() Encoder -} - -// The charsets are stored in charsets under their canonical names. -var charsets = make(map[string]*Charset) - -// aliases maps their aliases to their canonical names. -var aliases = make(map[string]string) - -// simplifyName converts a name to lower case and removes non-alphanumeric characters. -// This is how the names are used as keys to the maps. -func simplifyName(name string) string { - var buf bytes.Buffer - for _, c := range name { - switch { - case unicode.IsDigit(c): - buf.WriteRune(c) - case unicode.IsLetter(c): - buf.WriteRune(unicode.ToLower(c)) - default: - - } - } - - return buf.String() -} - -// RegisterCharset adds a charset to the charsetMap. -func RegisterCharset(cs *Charset) { - name := cs.Name - charsets[name] = cs - aliases[simplifyName(name)] = name - for _, alias := range cs.Aliases { - aliases[simplifyName(alias)] = name - } -} - -// GetCharset fetches a charset by name. -// If the name is not found, it returns nil. -func GetCharset(name string) *Charset { - return charsets[aliases[simplifyName(name)]] -} - -// NewDecoder returns a Decoder to decode the named charset. -// If the name is not found, it returns nil. -func NewDecoder(name string) Decoder { - cs := GetCharset(name) - if cs == nil { - return nil - } - return cs.NewDecoder() -} - -// NewEncoder returns an Encoder to encode the named charset. -func NewEncoder(name string) Encoder { - cs := GetCharset(name) - if cs == nil { - return nil - } - return cs.NewEncoder() -} diff --git a/vendor/github.com/axgle/mahonia/convert_string.go b/vendor/github.com/axgle/mahonia/convert_string.go deleted file mode 100644 index f95fbb5..0000000 --- a/vendor/github.com/axgle/mahonia/convert_string.go +++ /dev/null @@ -1,56 +0,0 @@ -package mahonia - -// ConvertString converts a string from UTF-8 to e's encoding. -func (e Encoder) ConvertString(s string) string { - dest := make([]byte, len(s)+10) - destPos := 0 - - for _, rune := range s { - retry: - size, status := e(dest[destPos:], rune) - - if status == NO_ROOM { - newDest := make([]byte, len(dest)*2) - copy(newDest, dest) - dest = newDest - goto retry - } - - if status == STATE_ONLY { - destPos += size - goto retry - } - - destPos += size - } - - return string(dest[:destPos]) -} - -// ConvertString converts a string from d's encoding to UTF-8. -func (d Decoder) ConvertString(s string) string { - bytes := []byte(s) - runes := make([]rune, len(s)) - destPos := 0 - - for len(bytes) > 0 { - c, size, status := d(bytes) - - if status == STATE_ONLY { - bytes = bytes[size:] - continue - } - - if status == NO_ROOM { - c = 0xfffd - size = len(bytes) - status = INVALID_CHAR - } - - bytes = bytes[size:] - runes[destPos] = c - destPos++ - } - - return string(runes[:destPos]) -} diff --git a/vendor/github.com/axgle/mahonia/entity.go b/vendor/github.com/axgle/mahonia/entity.go deleted file mode 100644 index 9a47ba1..0000000 --- a/vendor/github.com/axgle/mahonia/entity.go +++ /dev/null @@ -1,196 +0,0 @@ -package mahonia - -// decoding HTML entities - -import ( - "sync" -) - -var entityOnce sync.Once - -// entityTrie is similar to mbcsTrie, but not identical. -type htmlEntityTrie struct { - runes [2]rune // Some HTML entities decode to two characters. - children []htmlEntityTrie -} - -var entityTrie htmlEntityTrie - -func buildEntityTrie() { - for e, c := range entity { - current := &entityTrie - for i := 0; i < len(e); i++ { - if current.children == nil { - current.children = make([]htmlEntityTrie, 256) - } - current = ¤t.children[e[i]] - } - current.runes[0] = c - } - - for e, runes := range entity2 { - current := &entityTrie - for i := 0; i < len(e); i++ { - if current.children == nil { - current.children = make([]htmlEntityTrie, 256) - } - current = ¤t.children[e[i]] - } - current.runes = runes - } -} - -// EntityDecoder returns a Decoder that decodes HTML character entities. -// If there is no valid character entity at the current position, it returns INVALID_CHAR. -// So it needs to be combined with another Decoder via FallbackDecoder. -func EntityDecoder() Decoder { - entityOnce.Do(buildEntityTrie) - var leftover rune // leftover rune from two-rune entity - return func(p []byte) (r rune, size int, status Status) { - if leftover != 0 { - r = leftover - leftover = 0 - return r, 0, SUCCESS - } - - if len(p) == 0 { - return 0, 0, NO_ROOM - } - - if p[0] != '&' { - return 0xfffd, 1, INVALID_CHAR - } - - if len(p) < 3 { - return 0, 1, NO_ROOM - } - - r, size, status = 0xfffd, 1, INVALID_CHAR - n := 1 // number of bytes read so far - - if p[n] == '#' { - n++ - c := p[n] - hex := false - if c == 'x' || c == 'X' { - hex = true - n++ - } - - var x rune - for n < len(p) { - c = p[n] - n++ - if hex { - if '0' <= c && c <= '9' { - x = 16*x + rune(c) - '0' - continue - } else if 'a' <= c && c <= 'f' { - x = 16*x + rune(c) - 'a' + 10 - continue - } else if 'A' <= c && c <= 'F' { - x = 16*x + rune(c) - 'A' + 10 - continue - } - } else if '0' <= c && c <= '9' { - x = 10*x + rune(c) - '0' - continue - } - if c != ';' { - n-- - } - break - } - - if n == len(p) && p[n-1] != ';' { - return 0, 0, NO_ROOM - } - - size = n - if p[n-1] == ';' { - n-- - } - if hex { - n-- - } - n-- - // Now n is the number of actual digits read. - if n == 0 { - return 0xfffd, 1, INVALID_CHAR - } - - if 0x80 <= x && x <= 0x9F { - // Replace characters from Windows-1252 with UTF-8 equivalents. - x = replacementTable[x-0x80] - } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { - // Replace invalid characters with the replacement character. - return 0xfffd, size, INVALID_CHAR - } - - r = x - status = SUCCESS - return - } - - current := &entityTrie - for current.children != nil { - if len(p) <= n { - leftover = 0 - return 0, 0, NO_ROOM - } - - current = ¤t.children[p[n]] - n++ - if current.runes[0] != 0 { - r, leftover = current.runes[0], current.runes[1] - size = n - status = SUCCESS - // but don't return yet, since we need the longest match - } - } - - return - } -} - -// This table is copied from /src/pkg/html/escape.go in the Go source -// -// These replacements permit compatibility with old numeric entities that -// assumed Windows-1252 encoding. -// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference -var replacementTable = [...]rune{ - '\u20AC', // First entry is what 0x80 should be replaced with. - '\u0081', - '\u201A', - '\u0192', - '\u201E', - '\u2026', - '\u2020', - '\u2021', - '\u02C6', - '\u2030', - '\u0160', - '\u2039', - '\u0152', - '\u008D', - '\u017D', - '\u008F', - '\u0090', - '\u2018', - '\u2019', - '\u201C', - '\u201D', - '\u2022', - '\u2013', - '\u2014', - '\u02DC', - '\u2122', - '\u0161', - '\u203A', - '\u0153', - '\u009D', - '\u017E', - '\u0178', // Last entry is 0x9F. - // 0x00->'\uFFFD' is handled programmatically. - // 0x0D->'\u000D' is a no-op. -} diff --git a/vendor/github.com/axgle/mahonia/entity_data.go b/vendor/github.com/axgle/mahonia/entity_data.go deleted file mode 100644 index 380b256..0000000 --- a/vendor/github.com/axgle/mahonia/entity_data.go +++ /dev/null @@ -1,2253 +0,0 @@ -package mahonia - -// Taken from /src/pkg/html/entity.go in the Go source code. - -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//package html - -// entity is a map from HTML entity names to their values. The semicolon matters: -// http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html -// lists both "amp" and "amp;" as two separate entries. -// -// Note that the HTML5 list is larger than the HTML4 list at -// http://www.w3.org/TR/html4/sgml/entities.html -var entity = map[string]rune{ - "AElig;": '\U000000C6', - "AMP;": '\U00000026', - "Aacute;": '\U000000C1', - "Abreve;": '\U00000102', - "Acirc;": '\U000000C2', - "Acy;": '\U00000410', - "Afr;": '\U0001D504', - "Agrave;": '\U000000C0', - "Alpha;": '\U00000391', - "Amacr;": '\U00000100', - "And;": '\U00002A53', - "Aogon;": '\U00000104', - "Aopf;": '\U0001D538', - "ApplyFunction;": '\U00002061', - "Aring;": '\U000000C5', - "Ascr;": '\U0001D49C', - "Assign;": '\U00002254', - "Atilde;": '\U000000C3', - "Auml;": '\U000000C4', - "Backslash;": '\U00002216', - "Barv;": '\U00002AE7', - "Barwed;": '\U00002306', - "Bcy;": '\U00000411', - "Because;": '\U00002235', - "Bernoullis;": '\U0000212C', - "Beta;": '\U00000392', - "Bfr;": '\U0001D505', - "Bopf;": '\U0001D539', - "Breve;": '\U000002D8', - "Bscr;": '\U0000212C', - "Bumpeq;": '\U0000224E', - "CHcy;": '\U00000427', - "COPY;": '\U000000A9', - "Cacute;": '\U00000106', - "Cap;": '\U000022D2', - "CapitalDifferentialD;": '\U00002145', - "Cayleys;": '\U0000212D', - "Ccaron;": '\U0000010C', - "Ccedil;": '\U000000C7', - "Ccirc;": '\U00000108', - "Cconint;": '\U00002230', - "Cdot;": '\U0000010A', - "Cedilla;": '\U000000B8', - "CenterDot;": '\U000000B7', - "Cfr;": '\U0000212D', - "Chi;": '\U000003A7', - "CircleDot;": '\U00002299', - "CircleMinus;": '\U00002296', - "CirclePlus;": '\U00002295', - "CircleTimes;": '\U00002297', - "ClockwiseContourIntegral;": '\U00002232', - "CloseCurlyDoubleQuote;": '\U0000201D', - "CloseCurlyQuote;": '\U00002019', - "Colon;": '\U00002237', - "Colone;": '\U00002A74', - "Congruent;": '\U00002261', - "Conint;": '\U0000222F', - "ContourIntegral;": '\U0000222E', - "Copf;": '\U00002102', - "Coproduct;": '\U00002210', - "CounterClockwiseContourIntegral;": '\U00002233', - "Cross;": '\U00002A2F', - "Cscr;": '\U0001D49E', - "Cup;": '\U000022D3', - "CupCap;": '\U0000224D', - "DD;": '\U00002145', - "DDotrahd;": '\U00002911', - "DJcy;": '\U00000402', - "DScy;": '\U00000405', - "DZcy;": '\U0000040F', - "Dagger;": '\U00002021', - "Darr;": '\U000021A1', - "Dashv;": '\U00002AE4', - "Dcaron;": '\U0000010E', - "Dcy;": '\U00000414', - "Del;": '\U00002207', - "Delta;": '\U00000394', - "Dfr;": '\U0001D507', - "DiacriticalAcute;": '\U000000B4', - "DiacriticalDot;": '\U000002D9', - "DiacriticalDoubleAcute;": '\U000002DD', - "DiacriticalGrave;": '\U00000060', - "DiacriticalTilde;": '\U000002DC', - "Diamond;": '\U000022C4', - "DifferentialD;": '\U00002146', - "Dopf;": '\U0001D53B', - "Dot;": '\U000000A8', - "DotDot;": '\U000020DC', - "DotEqual;": '\U00002250', - "DoubleContourIntegral;": '\U0000222F', - "DoubleDot;": '\U000000A8', - "DoubleDownArrow;": '\U000021D3', - "DoubleLeftArrow;": '\U000021D0', - "DoubleLeftRightArrow;": '\U000021D4', - "DoubleLeftTee;": '\U00002AE4', - "DoubleLongLeftArrow;": '\U000027F8', - "DoubleLongLeftRightArrow;": '\U000027FA', - "DoubleLongRightArrow;": '\U000027F9', - "DoubleRightArrow;": '\U000021D2', - "DoubleRightTee;": '\U000022A8', - "DoubleUpArrow;": '\U000021D1', - "DoubleUpDownArrow;": '\U000021D5', - "DoubleVerticalBar;": '\U00002225', - "DownArrow;": '\U00002193', - "DownArrowBar;": '\U00002913', - "DownArrowUpArrow;": '\U000021F5', - "DownBreve;": '\U00000311', - "DownLeftRightVector;": '\U00002950', - "DownLeftTeeVector;": '\U0000295E', - "DownLeftVector;": '\U000021BD', - "DownLeftVectorBar;": '\U00002956', - "DownRightTeeVector;": '\U0000295F', - "DownRightVector;": '\U000021C1', - "DownRightVectorBar;": '\U00002957', - "DownTee;": '\U000022A4', - "DownTeeArrow;": '\U000021A7', - "Downarrow;": '\U000021D3', - "Dscr;": '\U0001D49F', - "Dstrok;": '\U00000110', - "ENG;": '\U0000014A', - "ETH;": '\U000000D0', - "Eacute;": '\U000000C9', - "Ecaron;": '\U0000011A', - "Ecirc;": '\U000000CA', - "Ecy;": '\U0000042D', - "Edot;": '\U00000116', - "Efr;": '\U0001D508', - "Egrave;": '\U000000C8', - "Element;": '\U00002208', - "Emacr;": '\U00000112', - "EmptySmallSquare;": '\U000025FB', - "EmptyVerySmallSquare;": '\U000025AB', - "Eogon;": '\U00000118', - "Eopf;": '\U0001D53C', - "Epsilon;": '\U00000395', - "Equal;": '\U00002A75', - "EqualTilde;": '\U00002242', - "Equilibrium;": '\U000021CC', - "Escr;": '\U00002130', - "Esim;": '\U00002A73', - "Eta;": '\U00000397', - "Euml;": '\U000000CB', - "Exists;": '\U00002203', - "ExponentialE;": '\U00002147', - "Fcy;": '\U00000424', - "Ffr;": '\U0001D509', - "FilledSmallSquare;": '\U000025FC', - "FilledVerySmallSquare;": '\U000025AA', - "Fopf;": '\U0001D53D', - "ForAll;": '\U00002200', - "Fouriertrf;": '\U00002131', - "Fscr;": '\U00002131', - "GJcy;": '\U00000403', - "GT;": '\U0000003E', - "Gamma;": '\U00000393', - "Gammad;": '\U000003DC', - "Gbreve;": '\U0000011E', - "Gcedil;": '\U00000122', - "Gcirc;": '\U0000011C', - "Gcy;": '\U00000413', - "Gdot;": '\U00000120', - "Gfr;": '\U0001D50A', - "Gg;": '\U000022D9', - "Gopf;": '\U0001D53E', - "GreaterEqual;": '\U00002265', - "GreaterEqualLess;": '\U000022DB', - "GreaterFullEqual;": '\U00002267', - "GreaterGreater;": '\U00002AA2', - "GreaterLess;": '\U00002277', - "GreaterSlantEqual;": '\U00002A7E', - "GreaterTilde;": '\U00002273', - "Gscr;": '\U0001D4A2', - "Gt;": '\U0000226B', - "HARDcy;": '\U0000042A', - "Hacek;": '\U000002C7', - "Hat;": '\U0000005E', - "Hcirc;": '\U00000124', - "Hfr;": '\U0000210C', - "HilbertSpace;": '\U0000210B', - "Hopf;": '\U0000210D', - "HorizontalLine;": '\U00002500', - "Hscr;": '\U0000210B', - "Hstrok;": '\U00000126', - "HumpDownHump;": '\U0000224E', - "HumpEqual;": '\U0000224F', - "IEcy;": '\U00000415', - "IJlig;": '\U00000132', - "IOcy;": '\U00000401', - "Iacute;": '\U000000CD', - "Icirc;": '\U000000CE', - "Icy;": '\U00000418', - "Idot;": '\U00000130', - "Ifr;": '\U00002111', - "Igrave;": '\U000000CC', - "Im;": '\U00002111', - "Imacr;": '\U0000012A', - "ImaginaryI;": '\U00002148', - "Implies;": '\U000021D2', - "Int;": '\U0000222C', - "Integral;": '\U0000222B', - "Intersection;": '\U000022C2', - "InvisibleComma;": '\U00002063', - "InvisibleTimes;": '\U00002062', - "Iogon;": '\U0000012E', - "Iopf;": '\U0001D540', - "Iota;": '\U00000399', - "Iscr;": '\U00002110', - "Itilde;": '\U00000128', - "Iukcy;": '\U00000406', - "Iuml;": '\U000000CF', - "Jcirc;": '\U00000134', - "Jcy;": '\U00000419', - "Jfr;": '\U0001D50D', - "Jopf;": '\U0001D541', - "Jscr;": '\U0001D4A5', - "Jsercy;": '\U00000408', - "Jukcy;": '\U00000404', - "KHcy;": '\U00000425', - "KJcy;": '\U0000040C', - "Kappa;": '\U0000039A', - "Kcedil;": '\U00000136', - "Kcy;": '\U0000041A', - "Kfr;": '\U0001D50E', - "Kopf;": '\U0001D542', - "Kscr;": '\U0001D4A6', - "LJcy;": '\U00000409', - "LT;": '\U0000003C', - "Lacute;": '\U00000139', - "Lambda;": '\U0000039B', - "Lang;": '\U000027EA', - "Laplacetrf;": '\U00002112', - "Larr;": '\U0000219E', - "Lcaron;": '\U0000013D', - "Lcedil;": '\U0000013B', - "Lcy;": '\U0000041B', - "LeftAngleBracket;": '\U000027E8', - "LeftArrow;": '\U00002190', - "LeftArrowBar;": '\U000021E4', - "LeftArrowRightArrow;": '\U000021C6', - "LeftCeiling;": '\U00002308', - "LeftDoubleBracket;": '\U000027E6', - "LeftDownTeeVector;": '\U00002961', - "LeftDownVector;": '\U000021C3', - "LeftDownVectorBar;": '\U00002959', - "LeftFloor;": '\U0000230A', - "LeftRightArrow;": '\U00002194', - "LeftRightVector;": '\U0000294E', - "LeftTee;": '\U000022A3', - "LeftTeeArrow;": '\U000021A4', - "LeftTeeVector;": '\U0000295A', - "LeftTriangle;": '\U000022B2', - "LeftTriangleBar;": '\U000029CF', - "LeftTriangleEqual;": '\U000022B4', - "LeftUpDownVector;": '\U00002951', - "LeftUpTeeVector;": '\U00002960', - "LeftUpVector;": '\U000021BF', - "LeftUpVectorBar;": '\U00002958', - "LeftVector;": '\U000021BC', - "LeftVectorBar;": '\U00002952', - "Leftarrow;": '\U000021D0', - "Leftrightarrow;": '\U000021D4', - "LessEqualGreater;": '\U000022DA', - "LessFullEqual;": '\U00002266', - "LessGreater;": '\U00002276', - "LessLess;": '\U00002AA1', - "LessSlantEqual;": '\U00002A7D', - "LessTilde;": '\U00002272', - "Lfr;": '\U0001D50F', - "Ll;": '\U000022D8', - "Lleftarrow;": '\U000021DA', - "Lmidot;": '\U0000013F', - "LongLeftArrow;": '\U000027F5', - "LongLeftRightArrow;": '\U000027F7', - "LongRightArrow;": '\U000027F6', - "Longleftarrow;": '\U000027F8', - "Longleftrightarrow;": '\U000027FA', - "Longrightarrow;": '\U000027F9', - "Lopf;": '\U0001D543', - "LowerLeftArrow;": '\U00002199', - "LowerRightArrow;": '\U00002198', - "Lscr;": '\U00002112', - "Lsh;": '\U000021B0', - "Lstrok;": '\U00000141', - "Lt;": '\U0000226A', - "Map;": '\U00002905', - "Mcy;": '\U0000041C', - "MediumSpace;": '\U0000205F', - "Mellintrf;": '\U00002133', - "Mfr;": '\U0001D510', - "MinusPlus;": '\U00002213', - "Mopf;": '\U0001D544', - "Mscr;": '\U00002133', - "Mu;": '\U0000039C', - "NJcy;": '\U0000040A', - "Nacute;": '\U00000143', - "Ncaron;": '\U00000147', - "Ncedil;": '\U00000145', - "Ncy;": '\U0000041D', - "NegativeMediumSpace;": '\U0000200B', - "NegativeThickSpace;": '\U0000200B', - "NegativeThinSpace;": '\U0000200B', - "NegativeVeryThinSpace;": '\U0000200B', - "NestedGreaterGreater;": '\U0000226B', - "NestedLessLess;": '\U0000226A', - "NewLine;": '\U0000000A', - "Nfr;": '\U0001D511', - "NoBreak;": '\U00002060', - "NonBreakingSpace;": '\U000000A0', - "Nopf;": '\U00002115', - "Not;": '\U00002AEC', - "NotCongruent;": '\U00002262', - "NotCupCap;": '\U0000226D', - "NotDoubleVerticalBar;": '\U00002226', - "NotElement;": '\U00002209', - "NotEqual;": '\U00002260', - "NotExists;": '\U00002204', - "NotGreater;": '\U0000226F', - "NotGreaterEqual;": '\U00002271', - "NotGreaterLess;": '\U00002279', - "NotGreaterTilde;": '\U00002275', - "NotLeftTriangle;": '\U000022EA', - "NotLeftTriangleEqual;": '\U000022EC', - "NotLess;": '\U0000226E', - "NotLessEqual;": '\U00002270', - "NotLessGreater;": '\U00002278', - "NotLessTilde;": '\U00002274', - "NotPrecedes;": '\U00002280', - "NotPrecedesSlantEqual;": '\U000022E0', - "NotReverseElement;": '\U0000220C', - "NotRightTriangle;": '\U000022EB', - "NotRightTriangleEqual;": '\U000022ED', - "NotSquareSubsetEqual;": '\U000022E2', - "NotSquareSupersetEqual;": '\U000022E3', - "NotSubsetEqual;": '\U00002288', - "NotSucceeds;": '\U00002281', - "NotSucceedsSlantEqual;": '\U000022E1', - "NotSupersetEqual;": '\U00002289', - "NotTilde;": '\U00002241', - "NotTildeEqual;": '\U00002244', - "NotTildeFullEqual;": '\U00002247', - "NotTildeTilde;": '\U00002249', - "NotVerticalBar;": '\U00002224', - "Nscr;": '\U0001D4A9', - "Ntilde;": '\U000000D1', - "Nu;": '\U0000039D', - "OElig;": '\U00000152', - "Oacute;": '\U000000D3', - "Ocirc;": '\U000000D4', - "Ocy;": '\U0000041E', - "Odblac;": '\U00000150', - "Ofr;": '\U0001D512', - "Ograve;": '\U000000D2', - "Omacr;": '\U0000014C', - "Omega;": '\U000003A9', - "Omicron;": '\U0000039F', - "Oopf;": '\U0001D546', - "OpenCurlyDoubleQuote;": '\U0000201C', - "OpenCurlyQuote;": '\U00002018', - "Or;": '\U00002A54', - "Oscr;": '\U0001D4AA', - "Oslash;": '\U000000D8', - "Otilde;": '\U000000D5', - "Otimes;": '\U00002A37', - "Ouml;": '\U000000D6', - "OverBar;": '\U0000203E', - "OverBrace;": '\U000023DE', - "OverBracket;": '\U000023B4', - "OverParenthesis;": '\U000023DC', - "PartialD;": '\U00002202', - "Pcy;": '\U0000041F', - "Pfr;": '\U0001D513', - "Phi;": '\U000003A6', - "Pi;": '\U000003A0', - "PlusMinus;": '\U000000B1', - "Poincareplane;": '\U0000210C', - "Popf;": '\U00002119', - "Pr;": '\U00002ABB', - "Precedes;": '\U0000227A', - "PrecedesEqual;": '\U00002AAF', - "PrecedesSlantEqual;": '\U0000227C', - "PrecedesTilde;": '\U0000227E', - "Prime;": '\U00002033', - "Product;": '\U0000220F', - "Proportion;": '\U00002237', - "Proportional;": '\U0000221D', - "Pscr;": '\U0001D4AB', - "Psi;": '\U000003A8', - "QUOT;": '\U00000022', - "Qfr;": '\U0001D514', - "Qopf;": '\U0000211A', - "Qscr;": '\U0001D4AC', - "RBarr;": '\U00002910', - "REG;": '\U000000AE', - "Racute;": '\U00000154', - "Rang;": '\U000027EB', - "Rarr;": '\U000021A0', - "Rarrtl;": '\U00002916', - "Rcaron;": '\U00000158', - "Rcedil;": '\U00000156', - "Rcy;": '\U00000420', - "Re;": '\U0000211C', - "ReverseElement;": '\U0000220B', - "ReverseEquilibrium;": '\U000021CB', - "ReverseUpEquilibrium;": '\U0000296F', - "Rfr;": '\U0000211C', - "Rho;": '\U000003A1', - "RightAngleBracket;": '\U000027E9', - "RightArrow;": '\U00002192', - "RightArrowBar;": '\U000021E5', - "RightArrowLeftArrow;": '\U000021C4', - "RightCeiling;": '\U00002309', - "RightDoubleBracket;": '\U000027E7', - "RightDownTeeVector;": '\U0000295D', - "RightDownVector;": '\U000021C2', - "RightDownVectorBar;": '\U00002955', - "RightFloor;": '\U0000230B', - "RightTee;": '\U000022A2', - "RightTeeArrow;": '\U000021A6', - "RightTeeVector;": '\U0000295B', - "RightTriangle;": '\U000022B3', - "RightTriangleBar;": '\U000029D0', - "RightTriangleEqual;": '\U000022B5', - "RightUpDownVector;": '\U0000294F', - "RightUpTeeVector;": '\U0000295C', - "RightUpVector;": '\U000021BE', - "RightUpVectorBar;": '\U00002954', - "RightVector;": '\U000021C0', - "RightVectorBar;": '\U00002953', - "Rightarrow;": '\U000021D2', - "Ropf;": '\U0000211D', - "RoundImplies;": '\U00002970', - "Rrightarrow;": '\U000021DB', - "Rscr;": '\U0000211B', - "Rsh;": '\U000021B1', - "RuleDelayed;": '\U000029F4', - "SHCHcy;": '\U00000429', - "SHcy;": '\U00000428', - "SOFTcy;": '\U0000042C', - "Sacute;": '\U0000015A', - "Sc;": '\U00002ABC', - "Scaron;": '\U00000160', - "Scedil;": '\U0000015E', - "Scirc;": '\U0000015C', - "Scy;": '\U00000421', - "Sfr;": '\U0001D516', - "ShortDownArrow;": '\U00002193', - "ShortLeftArrow;": '\U00002190', - "ShortRightArrow;": '\U00002192', - "ShortUpArrow;": '\U00002191', - "Sigma;": '\U000003A3', - "SmallCircle;": '\U00002218', - "Sopf;": '\U0001D54A', - "Sqrt;": '\U0000221A', - "Square;": '\U000025A1', - "SquareIntersection;": '\U00002293', - "SquareSubset;": '\U0000228F', - "SquareSubsetEqual;": '\U00002291', - "SquareSuperset;": '\U00002290', - "SquareSupersetEqual;": '\U00002292', - "SquareUnion;": '\U00002294', - "Sscr;": '\U0001D4AE', - "Star;": '\U000022C6', - "Sub;": '\U000022D0', - "Subset;": '\U000022D0', - "SubsetEqual;": '\U00002286', - "Succeeds;": '\U0000227B', - "SucceedsEqual;": '\U00002AB0', - "SucceedsSlantEqual;": '\U0000227D', - "SucceedsTilde;": '\U0000227F', - "SuchThat;": '\U0000220B', - "Sum;": '\U00002211', - "Sup;": '\U000022D1', - "Superset;": '\U00002283', - "SupersetEqual;": '\U00002287', - "Supset;": '\U000022D1', - "THORN;": '\U000000DE', - "TRADE;": '\U00002122', - "TSHcy;": '\U0000040B', - "TScy;": '\U00000426', - "Tab;": '\U00000009', - "Tau;": '\U000003A4', - "Tcaron;": '\U00000164', - "Tcedil;": '\U00000162', - "Tcy;": '\U00000422', - "Tfr;": '\U0001D517', - "Therefore;": '\U00002234', - "Theta;": '\U00000398', - "ThinSpace;": '\U00002009', - "Tilde;": '\U0000223C', - "TildeEqual;": '\U00002243', - "TildeFullEqual;": '\U00002245', - "TildeTilde;": '\U00002248', - "Topf;": '\U0001D54B', - "TripleDot;": '\U000020DB', - "Tscr;": '\U0001D4AF', - "Tstrok;": '\U00000166', - "Uacute;": '\U000000DA', - "Uarr;": '\U0000219F', - "Uarrocir;": '\U00002949', - "Ubrcy;": '\U0000040E', - "Ubreve;": '\U0000016C', - "Ucirc;": '\U000000DB', - "Ucy;": '\U00000423', - "Udblac;": '\U00000170', - "Ufr;": '\U0001D518', - "Ugrave;": '\U000000D9', - "Umacr;": '\U0000016A', - "UnderBar;": '\U0000005F', - "UnderBrace;": '\U000023DF', - "UnderBracket;": '\U000023B5', - "UnderParenthesis;": '\U000023DD', - "Union;": '\U000022C3', - "UnionPlus;": '\U0000228E', - "Uogon;": '\U00000172', - "Uopf;": '\U0001D54C', - "UpArrow;": '\U00002191', - "UpArrowBar;": '\U00002912', - "UpArrowDownArrow;": '\U000021C5', - "UpDownArrow;": '\U00002195', - "UpEquilibrium;": '\U0000296E', - "UpTee;": '\U000022A5', - "UpTeeArrow;": '\U000021A5', - "Uparrow;": '\U000021D1', - "Updownarrow;": '\U000021D5', - "UpperLeftArrow;": '\U00002196', - "UpperRightArrow;": '\U00002197', - "Upsi;": '\U000003D2', - "Upsilon;": '\U000003A5', - "Uring;": '\U0000016E', - "Uscr;": '\U0001D4B0', - "Utilde;": '\U00000168', - "Uuml;": '\U000000DC', - "VDash;": '\U000022AB', - "Vbar;": '\U00002AEB', - "Vcy;": '\U00000412', - "Vdash;": '\U000022A9', - "Vdashl;": '\U00002AE6', - "Vee;": '\U000022C1', - "Verbar;": '\U00002016', - "Vert;": '\U00002016', - "VerticalBar;": '\U00002223', - "VerticalLine;": '\U0000007C', - "VerticalSeparator;": '\U00002758', - "VerticalTilde;": '\U00002240', - "VeryThinSpace;": '\U0000200A', - "Vfr;": '\U0001D519', - "Vopf;": '\U0001D54D', - "Vscr;": '\U0001D4B1', - "Vvdash;": '\U000022AA', - "Wcirc;": '\U00000174', - "Wedge;": '\U000022C0', - "Wfr;": '\U0001D51A', - "Wopf;": '\U0001D54E', - "Wscr;": '\U0001D4B2', - "Xfr;": '\U0001D51B', - "Xi;": '\U0000039E', - "Xopf;": '\U0001D54F', - "Xscr;": '\U0001D4B3', - "YAcy;": '\U0000042F', - "YIcy;": '\U00000407', - "YUcy;": '\U0000042E', - "Yacute;": '\U000000DD', - "Ycirc;": '\U00000176', - "Ycy;": '\U0000042B', - "Yfr;": '\U0001D51C', - "Yopf;": '\U0001D550', - "Yscr;": '\U0001D4B4', - "Yuml;": '\U00000178', - "ZHcy;": '\U00000416', - "Zacute;": '\U00000179', - "Zcaron;": '\U0000017D', - "Zcy;": '\U00000417', - "Zdot;": '\U0000017B', - "ZeroWidthSpace;": '\U0000200B', - "Zeta;": '\U00000396', - "Zfr;": '\U00002128', - "Zopf;": '\U00002124', - "Zscr;": '\U0001D4B5', - "aacute;": '\U000000E1', - "abreve;": '\U00000103', - "ac;": '\U0000223E', - "acd;": '\U0000223F', - "acirc;": '\U000000E2', - "acute;": '\U000000B4', - "acy;": '\U00000430', - "aelig;": '\U000000E6', - "af;": '\U00002061', - "afr;": '\U0001D51E', - "agrave;": '\U000000E0', - "alefsym;": '\U00002135', - "aleph;": '\U00002135', - "alpha;": '\U000003B1', - "amacr;": '\U00000101', - "amalg;": '\U00002A3F', - "amp;": '\U00000026', - "and;": '\U00002227', - "andand;": '\U00002A55', - "andd;": '\U00002A5C', - "andslope;": '\U00002A58', - "andv;": '\U00002A5A', - "ang;": '\U00002220', - "ange;": '\U000029A4', - "angle;": '\U00002220', - "angmsd;": '\U00002221', - "angmsdaa;": '\U000029A8', - "angmsdab;": '\U000029A9', - "angmsdac;": '\U000029AA', - "angmsdad;": '\U000029AB', - "angmsdae;": '\U000029AC', - "angmsdaf;": '\U000029AD', - "angmsdag;": '\U000029AE', - "angmsdah;": '\U000029AF', - "angrt;": '\U0000221F', - "angrtvb;": '\U000022BE', - "angrtvbd;": '\U0000299D', - "angsph;": '\U00002222', - "angst;": '\U000000C5', - "angzarr;": '\U0000237C', - "aogon;": '\U00000105', - "aopf;": '\U0001D552', - "ap;": '\U00002248', - "apE;": '\U00002A70', - "apacir;": '\U00002A6F', - "ape;": '\U0000224A', - "apid;": '\U0000224B', - "apos;": '\U00000027', - "approx;": '\U00002248', - "approxeq;": '\U0000224A', - "aring;": '\U000000E5', - "ascr;": '\U0001D4B6', - "ast;": '\U0000002A', - "asymp;": '\U00002248', - "asympeq;": '\U0000224D', - "atilde;": '\U000000E3', - "auml;": '\U000000E4', - "awconint;": '\U00002233', - "awint;": '\U00002A11', - "bNot;": '\U00002AED', - "backcong;": '\U0000224C', - "backepsilon;": '\U000003F6', - "backprime;": '\U00002035', - "backsim;": '\U0000223D', - "backsimeq;": '\U000022CD', - "barvee;": '\U000022BD', - "barwed;": '\U00002305', - "barwedge;": '\U00002305', - "bbrk;": '\U000023B5', - "bbrktbrk;": '\U000023B6', - "bcong;": '\U0000224C', - "bcy;": '\U00000431', - "bdquo;": '\U0000201E', - "becaus;": '\U00002235', - "because;": '\U00002235', - "bemptyv;": '\U000029B0', - "bepsi;": '\U000003F6', - "bernou;": '\U0000212C', - "beta;": '\U000003B2', - "beth;": '\U00002136', - "between;": '\U0000226C', - "bfr;": '\U0001D51F', - "bigcap;": '\U000022C2', - "bigcirc;": '\U000025EF', - "bigcup;": '\U000022C3', - "bigodot;": '\U00002A00', - "bigoplus;": '\U00002A01', - "bigotimes;": '\U00002A02', - "bigsqcup;": '\U00002A06', - "bigstar;": '\U00002605', - "bigtriangledown;": '\U000025BD', - "bigtriangleup;": '\U000025B3', - "biguplus;": '\U00002A04', - "bigvee;": '\U000022C1', - "bigwedge;": '\U000022C0', - "bkarow;": '\U0000290D', - "blacklozenge;": '\U000029EB', - "blacksquare;": '\U000025AA', - "blacktriangle;": '\U000025B4', - "blacktriangledown;": '\U000025BE', - "blacktriangleleft;": '\U000025C2', - "blacktriangleright;": '\U000025B8', - "blank;": '\U00002423', - "blk12;": '\U00002592', - "blk14;": '\U00002591', - "blk34;": '\U00002593', - "block;": '\U00002588', - "bnot;": '\U00002310', - "bopf;": '\U0001D553', - "bot;": '\U000022A5', - "bottom;": '\U000022A5', - "bowtie;": '\U000022C8', - "boxDL;": '\U00002557', - "boxDR;": '\U00002554', - "boxDl;": '\U00002556', - "boxDr;": '\U00002553', - "boxH;": '\U00002550', - "boxHD;": '\U00002566', - "boxHU;": '\U00002569', - "boxHd;": '\U00002564', - "boxHu;": '\U00002567', - "boxUL;": '\U0000255D', - "boxUR;": '\U0000255A', - "boxUl;": '\U0000255C', - "boxUr;": '\U00002559', - "boxV;": '\U00002551', - "boxVH;": '\U0000256C', - "boxVL;": '\U00002563', - "boxVR;": '\U00002560', - "boxVh;": '\U0000256B', - "boxVl;": '\U00002562', - "boxVr;": '\U0000255F', - "boxbox;": '\U000029C9', - "boxdL;": '\U00002555', - "boxdR;": '\U00002552', - "boxdl;": '\U00002510', - "boxdr;": '\U0000250C', - "boxh;": '\U00002500', - "boxhD;": '\U00002565', - "boxhU;": '\U00002568', - "boxhd;": '\U0000252C', - "boxhu;": '\U00002534', - "boxminus;": '\U0000229F', - "boxplus;": '\U0000229E', - "boxtimes;": '\U000022A0', - "boxuL;": '\U0000255B', - "boxuR;": '\U00002558', - "boxul;": '\U00002518', - "boxur;": '\U00002514', - "boxv;": '\U00002502', - "boxvH;": '\U0000256A', - "boxvL;": '\U00002561', - "boxvR;": '\U0000255E', - "boxvh;": '\U0000253C', - "boxvl;": '\U00002524', - "boxvr;": '\U0000251C', - "bprime;": '\U00002035', - "breve;": '\U000002D8', - "brvbar;": '\U000000A6', - "bscr;": '\U0001D4B7', - "bsemi;": '\U0000204F', - "bsim;": '\U0000223D', - "bsime;": '\U000022CD', - "bsol;": '\U0000005C', - "bsolb;": '\U000029C5', - "bsolhsub;": '\U000027C8', - "bull;": '\U00002022', - "bullet;": '\U00002022', - "bump;": '\U0000224E', - "bumpE;": '\U00002AAE', - "bumpe;": '\U0000224F', - "bumpeq;": '\U0000224F', - "cacute;": '\U00000107', - "cap;": '\U00002229', - "capand;": '\U00002A44', - "capbrcup;": '\U00002A49', - "capcap;": '\U00002A4B', - "capcup;": '\U00002A47', - "capdot;": '\U00002A40', - "caret;": '\U00002041', - "caron;": '\U000002C7', - "ccaps;": '\U00002A4D', - "ccaron;": '\U0000010D', - "ccedil;": '\U000000E7', - "ccirc;": '\U00000109', - "ccups;": '\U00002A4C', - "ccupssm;": '\U00002A50', - "cdot;": '\U0000010B', - "cedil;": '\U000000B8', - "cemptyv;": '\U000029B2', - "cent;": '\U000000A2', - "centerdot;": '\U000000B7', - "cfr;": '\U0001D520', - "chcy;": '\U00000447', - "check;": '\U00002713', - "checkmark;": '\U00002713', - "chi;": '\U000003C7', - "cir;": '\U000025CB', - "cirE;": '\U000029C3', - "circ;": '\U000002C6', - "circeq;": '\U00002257', - "circlearrowleft;": '\U000021BA', - "circlearrowright;": '\U000021BB', - "circledR;": '\U000000AE', - "circledS;": '\U000024C8', - "circledast;": '\U0000229B', - "circledcirc;": '\U0000229A', - "circleddash;": '\U0000229D', - "cire;": '\U00002257', - "cirfnint;": '\U00002A10', - "cirmid;": '\U00002AEF', - "cirscir;": '\U000029C2', - "clubs;": '\U00002663', - "clubsuit;": '\U00002663', - "colon;": '\U0000003A', - "colone;": '\U00002254', - "coloneq;": '\U00002254', - "comma;": '\U0000002C', - "commat;": '\U00000040', - "comp;": '\U00002201', - "compfn;": '\U00002218', - "complement;": '\U00002201', - "complexes;": '\U00002102', - "cong;": '\U00002245', - "congdot;": '\U00002A6D', - "conint;": '\U0000222E', - "copf;": '\U0001D554', - "coprod;": '\U00002210', - "copy;": '\U000000A9', - "copysr;": '\U00002117', - "crarr;": '\U000021B5', - "cross;": '\U00002717', - "cscr;": '\U0001D4B8', - "csub;": '\U00002ACF', - "csube;": '\U00002AD1', - "csup;": '\U00002AD0', - "csupe;": '\U00002AD2', - "ctdot;": '\U000022EF', - "cudarrl;": '\U00002938', - "cudarrr;": '\U00002935', - "cuepr;": '\U000022DE', - "cuesc;": '\U000022DF', - "cularr;": '\U000021B6', - "cularrp;": '\U0000293D', - "cup;": '\U0000222A', - "cupbrcap;": '\U00002A48', - "cupcap;": '\U00002A46', - "cupcup;": '\U00002A4A', - "cupdot;": '\U0000228D', - "cupor;": '\U00002A45', - "curarr;": '\U000021B7', - "curarrm;": '\U0000293C', - "curlyeqprec;": '\U000022DE', - "curlyeqsucc;": '\U000022DF', - "curlyvee;": '\U000022CE', - "curlywedge;": '\U000022CF', - "curren;": '\U000000A4', - "curvearrowleft;": '\U000021B6', - "curvearrowright;": '\U000021B7', - "cuvee;": '\U000022CE', - "cuwed;": '\U000022CF', - "cwconint;": '\U00002232', - "cwint;": '\U00002231', - "cylcty;": '\U0000232D', - "dArr;": '\U000021D3', - "dHar;": '\U00002965', - "dagger;": '\U00002020', - "daleth;": '\U00002138', - "darr;": '\U00002193', - "dash;": '\U00002010', - "dashv;": '\U000022A3', - "dbkarow;": '\U0000290F', - "dblac;": '\U000002DD', - "dcaron;": '\U0000010F', - "dcy;": '\U00000434', - "dd;": '\U00002146', - "ddagger;": '\U00002021', - "ddarr;": '\U000021CA', - "ddotseq;": '\U00002A77', - "deg;": '\U000000B0', - "delta;": '\U000003B4', - "demptyv;": '\U000029B1', - "dfisht;": '\U0000297F', - "dfr;": '\U0001D521', - "dharl;": '\U000021C3', - "dharr;": '\U000021C2', - "diam;": '\U000022C4', - "diamond;": '\U000022C4', - "diamondsuit;": '\U00002666', - "diams;": '\U00002666', - "die;": '\U000000A8', - "digamma;": '\U000003DD', - "disin;": '\U000022F2', - "div;": '\U000000F7', - "divide;": '\U000000F7', - "divideontimes;": '\U000022C7', - "divonx;": '\U000022C7', - "djcy;": '\U00000452', - "dlcorn;": '\U0000231E', - "dlcrop;": '\U0000230D', - "dollar;": '\U00000024', - "dopf;": '\U0001D555', - "dot;": '\U000002D9', - "doteq;": '\U00002250', - "doteqdot;": '\U00002251', - "dotminus;": '\U00002238', - "dotplus;": '\U00002214', - "dotsquare;": '\U000022A1', - "doublebarwedge;": '\U00002306', - "downarrow;": '\U00002193', - "downdownarrows;": '\U000021CA', - "downharpoonleft;": '\U000021C3', - "downharpoonright;": '\U000021C2', - "drbkarow;": '\U00002910', - "drcorn;": '\U0000231F', - "drcrop;": '\U0000230C', - "dscr;": '\U0001D4B9', - "dscy;": '\U00000455', - "dsol;": '\U000029F6', - "dstrok;": '\U00000111', - "dtdot;": '\U000022F1', - "dtri;": '\U000025BF', - "dtrif;": '\U000025BE', - "duarr;": '\U000021F5', - "duhar;": '\U0000296F', - "dwangle;": '\U000029A6', - "dzcy;": '\U0000045F', - "dzigrarr;": '\U000027FF', - "eDDot;": '\U00002A77', - "eDot;": '\U00002251', - "eacute;": '\U000000E9', - "easter;": '\U00002A6E', - "ecaron;": '\U0000011B', - "ecir;": '\U00002256', - "ecirc;": '\U000000EA', - "ecolon;": '\U00002255', - "ecy;": '\U0000044D', - "edot;": '\U00000117', - "ee;": '\U00002147', - "efDot;": '\U00002252', - "efr;": '\U0001D522', - "eg;": '\U00002A9A', - "egrave;": '\U000000E8', - "egs;": '\U00002A96', - "egsdot;": '\U00002A98', - "el;": '\U00002A99', - "elinters;": '\U000023E7', - "ell;": '\U00002113', - "els;": '\U00002A95', - "elsdot;": '\U00002A97', - "emacr;": '\U00000113', - "empty;": '\U00002205', - "emptyset;": '\U00002205', - "emptyv;": '\U00002205', - "emsp;": '\U00002003', - "emsp13;": '\U00002004', - "emsp14;": '\U00002005', - "eng;": '\U0000014B', - "ensp;": '\U00002002', - "eogon;": '\U00000119', - "eopf;": '\U0001D556', - "epar;": '\U000022D5', - "eparsl;": '\U000029E3', - "eplus;": '\U00002A71', - "epsi;": '\U000003B5', - "epsilon;": '\U000003B5', - "epsiv;": '\U000003F5', - "eqcirc;": '\U00002256', - "eqcolon;": '\U00002255', - "eqsim;": '\U00002242', - "eqslantgtr;": '\U00002A96', - "eqslantless;": '\U00002A95', - "equals;": '\U0000003D', - "equest;": '\U0000225F', - "equiv;": '\U00002261', - "equivDD;": '\U00002A78', - "eqvparsl;": '\U000029E5', - "erDot;": '\U00002253', - "erarr;": '\U00002971', - "escr;": '\U0000212F', - "esdot;": '\U00002250', - "esim;": '\U00002242', - "eta;": '\U000003B7', - "eth;": '\U000000F0', - "euml;": '\U000000EB', - "euro;": '\U000020AC', - "excl;": '\U00000021', - "exist;": '\U00002203', - "expectation;": '\U00002130', - "exponentiale;": '\U00002147', - "fallingdotseq;": '\U00002252', - "fcy;": '\U00000444', - "female;": '\U00002640', - "ffilig;": '\U0000FB03', - "fflig;": '\U0000FB00', - "ffllig;": '\U0000FB04', - "ffr;": '\U0001D523', - "filig;": '\U0000FB01', - "flat;": '\U0000266D', - "fllig;": '\U0000FB02', - "fltns;": '\U000025B1', - "fnof;": '\U00000192', - "fopf;": '\U0001D557', - "forall;": '\U00002200', - "fork;": '\U000022D4', - "forkv;": '\U00002AD9', - "fpartint;": '\U00002A0D', - "frac12;": '\U000000BD', - "frac13;": '\U00002153', - "frac14;": '\U000000BC', - "frac15;": '\U00002155', - "frac16;": '\U00002159', - "frac18;": '\U0000215B', - "frac23;": '\U00002154', - "frac25;": '\U00002156', - "frac34;": '\U000000BE', - "frac35;": '\U00002157', - "frac38;": '\U0000215C', - "frac45;": '\U00002158', - "frac56;": '\U0000215A', - "frac58;": '\U0000215D', - "frac78;": '\U0000215E', - "frasl;": '\U00002044', - "frown;": '\U00002322', - "fscr;": '\U0001D4BB', - "gE;": '\U00002267', - "gEl;": '\U00002A8C', - "gacute;": '\U000001F5', - "gamma;": '\U000003B3', - "gammad;": '\U000003DD', - "gap;": '\U00002A86', - "gbreve;": '\U0000011F', - "gcirc;": '\U0000011D', - "gcy;": '\U00000433', - "gdot;": '\U00000121', - "ge;": '\U00002265', - "gel;": '\U000022DB', - "geq;": '\U00002265', - "geqq;": '\U00002267', - "geqslant;": '\U00002A7E', - "ges;": '\U00002A7E', - "gescc;": '\U00002AA9', - "gesdot;": '\U00002A80', - "gesdoto;": '\U00002A82', - "gesdotol;": '\U00002A84', - "gesles;": '\U00002A94', - "gfr;": '\U0001D524', - "gg;": '\U0000226B', - "ggg;": '\U000022D9', - "gimel;": '\U00002137', - "gjcy;": '\U00000453', - "gl;": '\U00002277', - "glE;": '\U00002A92', - "gla;": '\U00002AA5', - "glj;": '\U00002AA4', - "gnE;": '\U00002269', - "gnap;": '\U00002A8A', - "gnapprox;": '\U00002A8A', - "gne;": '\U00002A88', - "gneq;": '\U00002A88', - "gneqq;": '\U00002269', - "gnsim;": '\U000022E7', - "gopf;": '\U0001D558', - "grave;": '\U00000060', - "gscr;": '\U0000210A', - "gsim;": '\U00002273', - "gsime;": '\U00002A8E', - "gsiml;": '\U00002A90', - "gt;": '\U0000003E', - "gtcc;": '\U00002AA7', - "gtcir;": '\U00002A7A', - "gtdot;": '\U000022D7', - "gtlPar;": '\U00002995', - "gtquest;": '\U00002A7C', - "gtrapprox;": '\U00002A86', - "gtrarr;": '\U00002978', - "gtrdot;": '\U000022D7', - "gtreqless;": '\U000022DB', - "gtreqqless;": '\U00002A8C', - "gtrless;": '\U00002277', - "gtrsim;": '\U00002273', - "hArr;": '\U000021D4', - "hairsp;": '\U0000200A', - "half;": '\U000000BD', - "hamilt;": '\U0000210B', - "hardcy;": '\U0000044A', - "harr;": '\U00002194', - "harrcir;": '\U00002948', - "harrw;": '\U000021AD', - "hbar;": '\U0000210F', - "hcirc;": '\U00000125', - "hearts;": '\U00002665', - "heartsuit;": '\U00002665', - "hellip;": '\U00002026', - "hercon;": '\U000022B9', - "hfr;": '\U0001D525', - "hksearow;": '\U00002925', - "hkswarow;": '\U00002926', - "hoarr;": '\U000021FF', - "homtht;": '\U0000223B', - "hookleftarrow;": '\U000021A9', - "hookrightarrow;": '\U000021AA', - "hopf;": '\U0001D559', - "horbar;": '\U00002015', - "hscr;": '\U0001D4BD', - "hslash;": '\U0000210F', - "hstrok;": '\U00000127', - "hybull;": '\U00002043', - "hyphen;": '\U00002010', - "iacute;": '\U000000ED', - "ic;": '\U00002063', - "icirc;": '\U000000EE', - "icy;": '\U00000438', - "iecy;": '\U00000435', - "iexcl;": '\U000000A1', - "iff;": '\U000021D4', - "ifr;": '\U0001D526', - "igrave;": '\U000000EC', - "ii;": '\U00002148', - "iiiint;": '\U00002A0C', - "iiint;": '\U0000222D', - "iinfin;": '\U000029DC', - "iiota;": '\U00002129', - "ijlig;": '\U00000133', - "imacr;": '\U0000012B', - "image;": '\U00002111', - "imagline;": '\U00002110', - "imagpart;": '\U00002111', - "imath;": '\U00000131', - "imof;": '\U000022B7', - "imped;": '\U000001B5', - "in;": '\U00002208', - "incare;": '\U00002105', - "infin;": '\U0000221E', - "infintie;": '\U000029DD', - "inodot;": '\U00000131', - "int;": '\U0000222B', - "intcal;": '\U000022BA', - "integers;": '\U00002124', - "intercal;": '\U000022BA', - "intlarhk;": '\U00002A17', - "intprod;": '\U00002A3C', - "iocy;": '\U00000451', - "iogon;": '\U0000012F', - "iopf;": '\U0001D55A', - "iota;": '\U000003B9', - "iprod;": '\U00002A3C', - "iquest;": '\U000000BF', - "iscr;": '\U0001D4BE', - "isin;": '\U00002208', - "isinE;": '\U000022F9', - "isindot;": '\U000022F5', - "isins;": '\U000022F4', - "isinsv;": '\U000022F3', - "isinv;": '\U00002208', - "it;": '\U00002062', - "itilde;": '\U00000129', - "iukcy;": '\U00000456', - "iuml;": '\U000000EF', - "jcirc;": '\U00000135', - "jcy;": '\U00000439', - "jfr;": '\U0001D527', - "jmath;": '\U00000237', - "jopf;": '\U0001D55B', - "jscr;": '\U0001D4BF', - "jsercy;": '\U00000458', - "jukcy;": '\U00000454', - "kappa;": '\U000003BA', - "kappav;": '\U000003F0', - "kcedil;": '\U00000137', - "kcy;": '\U0000043A', - "kfr;": '\U0001D528', - "kgreen;": '\U00000138', - "khcy;": '\U00000445', - "kjcy;": '\U0000045C', - "kopf;": '\U0001D55C', - "kscr;": '\U0001D4C0', - "lAarr;": '\U000021DA', - "lArr;": '\U000021D0', - "lAtail;": '\U0000291B', - "lBarr;": '\U0000290E', - "lE;": '\U00002266', - "lEg;": '\U00002A8B', - "lHar;": '\U00002962', - "lacute;": '\U0000013A', - "laemptyv;": '\U000029B4', - "lagran;": '\U00002112', - "lambda;": '\U000003BB', - "lang;": '\U000027E8', - "langd;": '\U00002991', - "langle;": '\U000027E8', - "lap;": '\U00002A85', - "laquo;": '\U000000AB', - "larr;": '\U00002190', - "larrb;": '\U000021E4', - "larrbfs;": '\U0000291F', - "larrfs;": '\U0000291D', - "larrhk;": '\U000021A9', - "larrlp;": '\U000021AB', - "larrpl;": '\U00002939', - "larrsim;": '\U00002973', - "larrtl;": '\U000021A2', - "lat;": '\U00002AAB', - "latail;": '\U00002919', - "late;": '\U00002AAD', - "lbarr;": '\U0000290C', - "lbbrk;": '\U00002772', - "lbrace;": '\U0000007B', - "lbrack;": '\U0000005B', - "lbrke;": '\U0000298B', - "lbrksld;": '\U0000298F', - "lbrkslu;": '\U0000298D', - "lcaron;": '\U0000013E', - "lcedil;": '\U0000013C', - "lceil;": '\U00002308', - "lcub;": '\U0000007B', - "lcy;": '\U0000043B', - "ldca;": '\U00002936', - "ldquo;": '\U0000201C', - "ldquor;": '\U0000201E', - "ldrdhar;": '\U00002967', - "ldrushar;": '\U0000294B', - "ldsh;": '\U000021B2', - "le;": '\U00002264', - "leftarrow;": '\U00002190', - "leftarrowtail;": '\U000021A2', - "leftharpoondown;": '\U000021BD', - "leftharpoonup;": '\U000021BC', - "leftleftarrows;": '\U000021C7', - "leftrightarrow;": '\U00002194', - "leftrightarrows;": '\U000021C6', - "leftrightharpoons;": '\U000021CB', - "leftrightsquigarrow;": '\U000021AD', - "leftthreetimes;": '\U000022CB', - "leg;": '\U000022DA', - "leq;": '\U00002264', - "leqq;": '\U00002266', - "leqslant;": '\U00002A7D', - "les;": '\U00002A7D', - "lescc;": '\U00002AA8', - "lesdot;": '\U00002A7F', - "lesdoto;": '\U00002A81', - "lesdotor;": '\U00002A83', - "lesges;": '\U00002A93', - "lessapprox;": '\U00002A85', - "lessdot;": '\U000022D6', - "lesseqgtr;": '\U000022DA', - "lesseqqgtr;": '\U00002A8B', - "lessgtr;": '\U00002276', - "lesssim;": '\U00002272', - "lfisht;": '\U0000297C', - "lfloor;": '\U0000230A', - "lfr;": '\U0001D529', - "lg;": '\U00002276', - "lgE;": '\U00002A91', - "lhard;": '\U000021BD', - "lharu;": '\U000021BC', - "lharul;": '\U0000296A', - "lhblk;": '\U00002584', - "ljcy;": '\U00000459', - "ll;": '\U0000226A', - "llarr;": '\U000021C7', - "llcorner;": '\U0000231E', - "llhard;": '\U0000296B', - "lltri;": '\U000025FA', - "lmidot;": '\U00000140', - "lmoust;": '\U000023B0', - "lmoustache;": '\U000023B0', - "lnE;": '\U00002268', - "lnap;": '\U00002A89', - "lnapprox;": '\U00002A89', - "lne;": '\U00002A87', - "lneq;": '\U00002A87', - "lneqq;": '\U00002268', - "lnsim;": '\U000022E6', - "loang;": '\U000027EC', - "loarr;": '\U000021FD', - "lobrk;": '\U000027E6', - "longleftarrow;": '\U000027F5', - "longleftrightarrow;": '\U000027F7', - "longmapsto;": '\U000027FC', - "longrightarrow;": '\U000027F6', - "looparrowleft;": '\U000021AB', - "looparrowright;": '\U000021AC', - "lopar;": '\U00002985', - "lopf;": '\U0001D55D', - "loplus;": '\U00002A2D', - "lotimes;": '\U00002A34', - "lowast;": '\U00002217', - "lowbar;": '\U0000005F', - "loz;": '\U000025CA', - "lozenge;": '\U000025CA', - "lozf;": '\U000029EB', - "lpar;": '\U00000028', - "lparlt;": '\U00002993', - "lrarr;": '\U000021C6', - "lrcorner;": '\U0000231F', - "lrhar;": '\U000021CB', - "lrhard;": '\U0000296D', - "lrm;": '\U0000200E', - "lrtri;": '\U000022BF', - "lsaquo;": '\U00002039', - "lscr;": '\U0001D4C1', - "lsh;": '\U000021B0', - "lsim;": '\U00002272', - "lsime;": '\U00002A8D', - "lsimg;": '\U00002A8F', - "lsqb;": '\U0000005B', - "lsquo;": '\U00002018', - "lsquor;": '\U0000201A', - "lstrok;": '\U00000142', - "lt;": '\U0000003C', - "ltcc;": '\U00002AA6', - "ltcir;": '\U00002A79', - "ltdot;": '\U000022D6', - "lthree;": '\U000022CB', - "ltimes;": '\U000022C9', - "ltlarr;": '\U00002976', - "ltquest;": '\U00002A7B', - "ltrPar;": '\U00002996', - "ltri;": '\U000025C3', - "ltrie;": '\U000022B4', - "ltrif;": '\U000025C2', - "lurdshar;": '\U0000294A', - "luruhar;": '\U00002966', - "mDDot;": '\U0000223A', - "macr;": '\U000000AF', - "male;": '\U00002642', - "malt;": '\U00002720', - "maltese;": '\U00002720', - "map;": '\U000021A6', - "mapsto;": '\U000021A6', - "mapstodown;": '\U000021A7', - "mapstoleft;": '\U000021A4', - "mapstoup;": '\U000021A5', - "marker;": '\U000025AE', - "mcomma;": '\U00002A29', - "mcy;": '\U0000043C', - "mdash;": '\U00002014', - "measuredangle;": '\U00002221', - "mfr;": '\U0001D52A', - "mho;": '\U00002127', - "micro;": '\U000000B5', - "mid;": '\U00002223', - "midast;": '\U0000002A', - "midcir;": '\U00002AF0', - "middot;": '\U000000B7', - "minus;": '\U00002212', - "minusb;": '\U0000229F', - "minusd;": '\U00002238', - "minusdu;": '\U00002A2A', - "mlcp;": '\U00002ADB', - "mldr;": '\U00002026', - "mnplus;": '\U00002213', - "models;": '\U000022A7', - "mopf;": '\U0001D55E', - "mp;": '\U00002213', - "mscr;": '\U0001D4C2', - "mstpos;": '\U0000223E', - "mu;": '\U000003BC', - "multimap;": '\U000022B8', - "mumap;": '\U000022B8', - "nLeftarrow;": '\U000021CD', - "nLeftrightarrow;": '\U000021CE', - "nRightarrow;": '\U000021CF', - "nVDash;": '\U000022AF', - "nVdash;": '\U000022AE', - "nabla;": '\U00002207', - "nacute;": '\U00000144', - "nap;": '\U00002249', - "napos;": '\U00000149', - "napprox;": '\U00002249', - "natur;": '\U0000266E', - "natural;": '\U0000266E', - "naturals;": '\U00002115', - "nbsp;": '\U000000A0', - "ncap;": '\U00002A43', - "ncaron;": '\U00000148', - "ncedil;": '\U00000146', - "ncong;": '\U00002247', - "ncup;": '\U00002A42', - "ncy;": '\U0000043D', - "ndash;": '\U00002013', - "ne;": '\U00002260', - "neArr;": '\U000021D7', - "nearhk;": '\U00002924', - "nearr;": '\U00002197', - "nearrow;": '\U00002197', - "nequiv;": '\U00002262', - "nesear;": '\U00002928', - "nexist;": '\U00002204', - "nexists;": '\U00002204', - "nfr;": '\U0001D52B', - "nge;": '\U00002271', - "ngeq;": '\U00002271', - "ngsim;": '\U00002275', - "ngt;": '\U0000226F', - "ngtr;": '\U0000226F', - "nhArr;": '\U000021CE', - "nharr;": '\U000021AE', - "nhpar;": '\U00002AF2', - "ni;": '\U0000220B', - "nis;": '\U000022FC', - "nisd;": '\U000022FA', - "niv;": '\U0000220B', - "njcy;": '\U0000045A', - "nlArr;": '\U000021CD', - "nlarr;": '\U0000219A', - "nldr;": '\U00002025', - "nle;": '\U00002270', - "nleftarrow;": '\U0000219A', - "nleftrightarrow;": '\U000021AE', - "nleq;": '\U00002270', - "nless;": '\U0000226E', - "nlsim;": '\U00002274', - "nlt;": '\U0000226E', - "nltri;": '\U000022EA', - "nltrie;": '\U000022EC', - "nmid;": '\U00002224', - "nopf;": '\U0001D55F', - "not;": '\U000000AC', - "notin;": '\U00002209', - "notinva;": '\U00002209', - "notinvb;": '\U000022F7', - "notinvc;": '\U000022F6', - "notni;": '\U0000220C', - "notniva;": '\U0000220C', - "notnivb;": '\U000022FE', - "notnivc;": '\U000022FD', - "npar;": '\U00002226', - "nparallel;": '\U00002226', - "npolint;": '\U00002A14', - "npr;": '\U00002280', - "nprcue;": '\U000022E0', - "nprec;": '\U00002280', - "nrArr;": '\U000021CF', - "nrarr;": '\U0000219B', - "nrightarrow;": '\U0000219B', - "nrtri;": '\U000022EB', - "nrtrie;": '\U000022ED', - "nsc;": '\U00002281', - "nsccue;": '\U000022E1', - "nscr;": '\U0001D4C3', - "nshortmid;": '\U00002224', - "nshortparallel;": '\U00002226', - "nsim;": '\U00002241', - "nsime;": '\U00002244', - "nsimeq;": '\U00002244', - "nsmid;": '\U00002224', - "nspar;": '\U00002226', - "nsqsube;": '\U000022E2', - "nsqsupe;": '\U000022E3', - "nsub;": '\U00002284', - "nsube;": '\U00002288', - "nsubseteq;": '\U00002288', - "nsucc;": '\U00002281', - "nsup;": '\U00002285', - "nsupe;": '\U00002289', - "nsupseteq;": '\U00002289', - "ntgl;": '\U00002279', - "ntilde;": '\U000000F1', - "ntlg;": '\U00002278', - "ntriangleleft;": '\U000022EA', - "ntrianglelefteq;": '\U000022EC', - "ntriangleright;": '\U000022EB', - "ntrianglerighteq;": '\U000022ED', - "nu;": '\U000003BD', - "num;": '\U00000023', - "numero;": '\U00002116', - "numsp;": '\U00002007', - "nvDash;": '\U000022AD', - "nvHarr;": '\U00002904', - "nvdash;": '\U000022AC', - "nvinfin;": '\U000029DE', - "nvlArr;": '\U00002902', - "nvrArr;": '\U00002903', - "nwArr;": '\U000021D6', - "nwarhk;": '\U00002923', - "nwarr;": '\U00002196', - "nwarrow;": '\U00002196', - "nwnear;": '\U00002927', - "oS;": '\U000024C8', - "oacute;": '\U000000F3', - "oast;": '\U0000229B', - "ocir;": '\U0000229A', - "ocirc;": '\U000000F4', - "ocy;": '\U0000043E', - "odash;": '\U0000229D', - "odblac;": '\U00000151', - "odiv;": '\U00002A38', - "odot;": '\U00002299', - "odsold;": '\U000029BC', - "oelig;": '\U00000153', - "ofcir;": '\U000029BF', - "ofr;": '\U0001D52C', - "ogon;": '\U000002DB', - "ograve;": '\U000000F2', - "ogt;": '\U000029C1', - "ohbar;": '\U000029B5', - "ohm;": '\U000003A9', - "oint;": '\U0000222E', - "olarr;": '\U000021BA', - "olcir;": '\U000029BE', - "olcross;": '\U000029BB', - "oline;": '\U0000203E', - "olt;": '\U000029C0', - "omacr;": '\U0000014D', - "omega;": '\U000003C9', - "omicron;": '\U000003BF', - "omid;": '\U000029B6', - "ominus;": '\U00002296', - "oopf;": '\U0001D560', - "opar;": '\U000029B7', - "operp;": '\U000029B9', - "oplus;": '\U00002295', - "or;": '\U00002228', - "orarr;": '\U000021BB', - "ord;": '\U00002A5D', - "order;": '\U00002134', - "orderof;": '\U00002134', - "ordf;": '\U000000AA', - "ordm;": '\U000000BA', - "origof;": '\U000022B6', - "oror;": '\U00002A56', - "orslope;": '\U00002A57', - "orv;": '\U00002A5B', - "oscr;": '\U00002134', - "oslash;": '\U000000F8', - "osol;": '\U00002298', - "otilde;": '\U000000F5', - "otimes;": '\U00002297', - "otimesas;": '\U00002A36', - "ouml;": '\U000000F6', - "ovbar;": '\U0000233D', - "par;": '\U00002225', - "para;": '\U000000B6', - "parallel;": '\U00002225', - "parsim;": '\U00002AF3', - "parsl;": '\U00002AFD', - "part;": '\U00002202', - "pcy;": '\U0000043F', - "percnt;": '\U00000025', - "period;": '\U0000002E', - "permil;": '\U00002030', - "perp;": '\U000022A5', - "pertenk;": '\U00002031', - "pfr;": '\U0001D52D', - "phi;": '\U000003C6', - "phiv;": '\U000003D5', - "phmmat;": '\U00002133', - "phone;": '\U0000260E', - "pi;": '\U000003C0', - "pitchfork;": '\U000022D4', - "piv;": '\U000003D6', - "planck;": '\U0000210F', - "planckh;": '\U0000210E', - "plankv;": '\U0000210F', - "plus;": '\U0000002B', - "plusacir;": '\U00002A23', - "plusb;": '\U0000229E', - "pluscir;": '\U00002A22', - "plusdo;": '\U00002214', - "plusdu;": '\U00002A25', - "pluse;": '\U00002A72', - "plusmn;": '\U000000B1', - "plussim;": '\U00002A26', - "plustwo;": '\U00002A27', - "pm;": '\U000000B1', - "pointint;": '\U00002A15', - "popf;": '\U0001D561', - "pound;": '\U000000A3', - "pr;": '\U0000227A', - "prE;": '\U00002AB3', - "prap;": '\U00002AB7', - "prcue;": '\U0000227C', - "pre;": '\U00002AAF', - "prec;": '\U0000227A', - "precapprox;": '\U00002AB7', - "preccurlyeq;": '\U0000227C', - "preceq;": '\U00002AAF', - "precnapprox;": '\U00002AB9', - "precneqq;": '\U00002AB5', - "precnsim;": '\U000022E8', - "precsim;": '\U0000227E', - "prime;": '\U00002032', - "primes;": '\U00002119', - "prnE;": '\U00002AB5', - "prnap;": '\U00002AB9', - "prnsim;": '\U000022E8', - "prod;": '\U0000220F', - "profalar;": '\U0000232E', - "profline;": '\U00002312', - "profsurf;": '\U00002313', - "prop;": '\U0000221D', - "propto;": '\U0000221D', - "prsim;": '\U0000227E', - "prurel;": '\U000022B0', - "pscr;": '\U0001D4C5', - "psi;": '\U000003C8', - "puncsp;": '\U00002008', - "qfr;": '\U0001D52E', - "qint;": '\U00002A0C', - "qopf;": '\U0001D562', - "qprime;": '\U00002057', - "qscr;": '\U0001D4C6', - "quaternions;": '\U0000210D', - "quatint;": '\U00002A16', - "quest;": '\U0000003F', - "questeq;": '\U0000225F', - "quot;": '\U00000022', - "rAarr;": '\U000021DB', - "rArr;": '\U000021D2', - "rAtail;": '\U0000291C', - "rBarr;": '\U0000290F', - "rHar;": '\U00002964', - "racute;": '\U00000155', - "radic;": '\U0000221A', - "raemptyv;": '\U000029B3', - "rang;": '\U000027E9', - "rangd;": '\U00002992', - "range;": '\U000029A5', - "rangle;": '\U000027E9', - "raquo;": '\U000000BB', - "rarr;": '\U00002192', - "rarrap;": '\U00002975', - "rarrb;": '\U000021E5', - "rarrbfs;": '\U00002920', - "rarrc;": '\U00002933', - "rarrfs;": '\U0000291E', - "rarrhk;": '\U000021AA', - "rarrlp;": '\U000021AC', - "rarrpl;": '\U00002945', - "rarrsim;": '\U00002974', - "rarrtl;": '\U000021A3', - "rarrw;": '\U0000219D', - "ratail;": '\U0000291A', - "ratio;": '\U00002236', - "rationals;": '\U0000211A', - "rbarr;": '\U0000290D', - "rbbrk;": '\U00002773', - "rbrace;": '\U0000007D', - "rbrack;": '\U0000005D', - "rbrke;": '\U0000298C', - "rbrksld;": '\U0000298E', - "rbrkslu;": '\U00002990', - "rcaron;": '\U00000159', - "rcedil;": '\U00000157', - "rceil;": '\U00002309', - "rcub;": '\U0000007D', - "rcy;": '\U00000440', - "rdca;": '\U00002937', - "rdldhar;": '\U00002969', - "rdquo;": '\U0000201D', - "rdquor;": '\U0000201D', - "rdsh;": '\U000021B3', - "real;": '\U0000211C', - "realine;": '\U0000211B', - "realpart;": '\U0000211C', - "reals;": '\U0000211D', - "rect;": '\U000025AD', - "reg;": '\U000000AE', - "rfisht;": '\U0000297D', - "rfloor;": '\U0000230B', - "rfr;": '\U0001D52F', - "rhard;": '\U000021C1', - "rharu;": '\U000021C0', - "rharul;": '\U0000296C', - "rho;": '\U000003C1', - "rhov;": '\U000003F1', - "rightarrow;": '\U00002192', - "rightarrowtail;": '\U000021A3', - "rightharpoondown;": '\U000021C1', - "rightharpoonup;": '\U000021C0', - "rightleftarrows;": '\U000021C4', - "rightleftharpoons;": '\U000021CC', - "rightrightarrows;": '\U000021C9', - "rightsquigarrow;": '\U0000219D', - "rightthreetimes;": '\U000022CC', - "ring;": '\U000002DA', - "risingdotseq;": '\U00002253', - "rlarr;": '\U000021C4', - "rlhar;": '\U000021CC', - "rlm;": '\U0000200F', - "rmoust;": '\U000023B1', - "rmoustache;": '\U000023B1', - "rnmid;": '\U00002AEE', - "roang;": '\U000027ED', - "roarr;": '\U000021FE', - "robrk;": '\U000027E7', - "ropar;": '\U00002986', - "ropf;": '\U0001D563', - "roplus;": '\U00002A2E', - "rotimes;": '\U00002A35', - "rpar;": '\U00000029', - "rpargt;": '\U00002994', - "rppolint;": '\U00002A12', - "rrarr;": '\U000021C9', - "rsaquo;": '\U0000203A', - "rscr;": '\U0001D4C7', - "rsh;": '\U000021B1', - "rsqb;": '\U0000005D', - "rsquo;": '\U00002019', - "rsquor;": '\U00002019', - "rthree;": '\U000022CC', - "rtimes;": '\U000022CA', - "rtri;": '\U000025B9', - "rtrie;": '\U000022B5', - "rtrif;": '\U000025B8', - "rtriltri;": '\U000029CE', - "ruluhar;": '\U00002968', - "rx;": '\U0000211E', - "sacute;": '\U0000015B', - "sbquo;": '\U0000201A', - "sc;": '\U0000227B', - "scE;": '\U00002AB4', - "scap;": '\U00002AB8', - "scaron;": '\U00000161', - "sccue;": '\U0000227D', - "sce;": '\U00002AB0', - "scedil;": '\U0000015F', - "scirc;": '\U0000015D', - "scnE;": '\U00002AB6', - "scnap;": '\U00002ABA', - "scnsim;": '\U000022E9', - "scpolint;": '\U00002A13', - "scsim;": '\U0000227F', - "scy;": '\U00000441', - "sdot;": '\U000022C5', - "sdotb;": '\U000022A1', - "sdote;": '\U00002A66', - "seArr;": '\U000021D8', - "searhk;": '\U00002925', - "searr;": '\U00002198', - "searrow;": '\U00002198', - "sect;": '\U000000A7', - "semi;": '\U0000003B', - "seswar;": '\U00002929', - "setminus;": '\U00002216', - "setmn;": '\U00002216', - "sext;": '\U00002736', - "sfr;": '\U0001D530', - "sfrown;": '\U00002322', - "sharp;": '\U0000266F', - "shchcy;": '\U00000449', - "shcy;": '\U00000448', - "shortmid;": '\U00002223', - "shortparallel;": '\U00002225', - "shy;": '\U000000AD', - "sigma;": '\U000003C3', - "sigmaf;": '\U000003C2', - "sigmav;": '\U000003C2', - "sim;": '\U0000223C', - "simdot;": '\U00002A6A', - "sime;": '\U00002243', - "simeq;": '\U00002243', - "simg;": '\U00002A9E', - "simgE;": '\U00002AA0', - "siml;": '\U00002A9D', - "simlE;": '\U00002A9F', - "simne;": '\U00002246', - "simplus;": '\U00002A24', - "simrarr;": '\U00002972', - "slarr;": '\U00002190', - "smallsetminus;": '\U00002216', - "smashp;": '\U00002A33', - "smeparsl;": '\U000029E4', - "smid;": '\U00002223', - "smile;": '\U00002323', - "smt;": '\U00002AAA', - "smte;": '\U00002AAC', - "softcy;": '\U0000044C', - "sol;": '\U0000002F', - "solb;": '\U000029C4', - "solbar;": '\U0000233F', - "sopf;": '\U0001D564', - "spades;": '\U00002660', - "spadesuit;": '\U00002660', - "spar;": '\U00002225', - "sqcap;": '\U00002293', - "sqcup;": '\U00002294', - "sqsub;": '\U0000228F', - "sqsube;": '\U00002291', - "sqsubset;": '\U0000228F', - "sqsubseteq;": '\U00002291', - "sqsup;": '\U00002290', - "sqsupe;": '\U00002292', - "sqsupset;": '\U00002290', - "sqsupseteq;": '\U00002292', - "squ;": '\U000025A1', - "square;": '\U000025A1', - "squarf;": '\U000025AA', - "squf;": '\U000025AA', - "srarr;": '\U00002192', - "sscr;": '\U0001D4C8', - "ssetmn;": '\U00002216', - "ssmile;": '\U00002323', - "sstarf;": '\U000022C6', - "star;": '\U00002606', - "starf;": '\U00002605', - "straightepsilon;": '\U000003F5', - "straightphi;": '\U000003D5', - "strns;": '\U000000AF', - "sub;": '\U00002282', - "subE;": '\U00002AC5', - "subdot;": '\U00002ABD', - "sube;": '\U00002286', - "subedot;": '\U00002AC3', - "submult;": '\U00002AC1', - "subnE;": '\U00002ACB', - "subne;": '\U0000228A', - "subplus;": '\U00002ABF', - "subrarr;": '\U00002979', - "subset;": '\U00002282', - "subseteq;": '\U00002286', - "subseteqq;": '\U00002AC5', - "subsetneq;": '\U0000228A', - "subsetneqq;": '\U00002ACB', - "subsim;": '\U00002AC7', - "subsub;": '\U00002AD5', - "subsup;": '\U00002AD3', - "succ;": '\U0000227B', - "succapprox;": '\U00002AB8', - "succcurlyeq;": '\U0000227D', - "succeq;": '\U00002AB0', - "succnapprox;": '\U00002ABA', - "succneqq;": '\U00002AB6', - "succnsim;": '\U000022E9', - "succsim;": '\U0000227F', - "sum;": '\U00002211', - "sung;": '\U0000266A', - "sup;": '\U00002283', - "sup1;": '\U000000B9', - "sup2;": '\U000000B2', - "sup3;": '\U000000B3', - "supE;": '\U00002AC6', - "supdot;": '\U00002ABE', - "supdsub;": '\U00002AD8', - "supe;": '\U00002287', - "supedot;": '\U00002AC4', - "suphsol;": '\U000027C9', - "suphsub;": '\U00002AD7', - "suplarr;": '\U0000297B', - "supmult;": '\U00002AC2', - "supnE;": '\U00002ACC', - "supne;": '\U0000228B', - "supplus;": '\U00002AC0', - "supset;": '\U00002283', - "supseteq;": '\U00002287', - "supseteqq;": '\U00002AC6', - "supsetneq;": '\U0000228B', - "supsetneqq;": '\U00002ACC', - "supsim;": '\U00002AC8', - "supsub;": '\U00002AD4', - "supsup;": '\U00002AD6', - "swArr;": '\U000021D9', - "swarhk;": '\U00002926', - "swarr;": '\U00002199', - "swarrow;": '\U00002199', - "swnwar;": '\U0000292A', - "szlig;": '\U000000DF', - "target;": '\U00002316', - "tau;": '\U000003C4', - "tbrk;": '\U000023B4', - "tcaron;": '\U00000165', - "tcedil;": '\U00000163', - "tcy;": '\U00000442', - "tdot;": '\U000020DB', - "telrec;": '\U00002315', - "tfr;": '\U0001D531', - "there4;": '\U00002234', - "therefore;": '\U00002234', - "theta;": '\U000003B8', - "thetasym;": '\U000003D1', - "thetav;": '\U000003D1', - "thickapprox;": '\U00002248', - "thicksim;": '\U0000223C', - "thinsp;": '\U00002009', - "thkap;": '\U00002248', - "thksim;": '\U0000223C', - "thorn;": '\U000000FE', - "tilde;": '\U000002DC', - "times;": '\U000000D7', - "timesb;": '\U000022A0', - "timesbar;": '\U00002A31', - "timesd;": '\U00002A30', - "tint;": '\U0000222D', - "toea;": '\U00002928', - "top;": '\U000022A4', - "topbot;": '\U00002336', - "topcir;": '\U00002AF1', - "topf;": '\U0001D565', - "topfork;": '\U00002ADA', - "tosa;": '\U00002929', - "tprime;": '\U00002034', - "trade;": '\U00002122', - "triangle;": '\U000025B5', - "triangledown;": '\U000025BF', - "triangleleft;": '\U000025C3', - "trianglelefteq;": '\U000022B4', - "triangleq;": '\U0000225C', - "triangleright;": '\U000025B9', - "trianglerighteq;": '\U000022B5', - "tridot;": '\U000025EC', - "trie;": '\U0000225C', - "triminus;": '\U00002A3A', - "triplus;": '\U00002A39', - "trisb;": '\U000029CD', - "tritime;": '\U00002A3B', - "trpezium;": '\U000023E2', - "tscr;": '\U0001D4C9', - "tscy;": '\U00000446', - "tshcy;": '\U0000045B', - "tstrok;": '\U00000167', - "twixt;": '\U0000226C', - "twoheadleftarrow;": '\U0000219E', - "twoheadrightarrow;": '\U000021A0', - "uArr;": '\U000021D1', - "uHar;": '\U00002963', - "uacute;": '\U000000FA', - "uarr;": '\U00002191', - "ubrcy;": '\U0000045E', - "ubreve;": '\U0000016D', - "ucirc;": '\U000000FB', - "ucy;": '\U00000443', - "udarr;": '\U000021C5', - "udblac;": '\U00000171', - "udhar;": '\U0000296E', - "ufisht;": '\U0000297E', - "ufr;": '\U0001D532', - "ugrave;": '\U000000F9', - "uharl;": '\U000021BF', - "uharr;": '\U000021BE', - "uhblk;": '\U00002580', - "ulcorn;": '\U0000231C', - "ulcorner;": '\U0000231C', - "ulcrop;": '\U0000230F', - "ultri;": '\U000025F8', - "umacr;": '\U0000016B', - "uml;": '\U000000A8', - "uogon;": '\U00000173', - "uopf;": '\U0001D566', - "uparrow;": '\U00002191', - "updownarrow;": '\U00002195', - "upharpoonleft;": '\U000021BF', - "upharpoonright;": '\U000021BE', - "uplus;": '\U0000228E', - "upsi;": '\U000003C5', - "upsih;": '\U000003D2', - "upsilon;": '\U000003C5', - "upuparrows;": '\U000021C8', - "urcorn;": '\U0000231D', - "urcorner;": '\U0000231D', - "urcrop;": '\U0000230E', - "uring;": '\U0000016F', - "urtri;": '\U000025F9', - "uscr;": '\U0001D4CA', - "utdot;": '\U000022F0', - "utilde;": '\U00000169', - "utri;": '\U000025B5', - "utrif;": '\U000025B4', - "uuarr;": '\U000021C8', - "uuml;": '\U000000FC', - "uwangle;": '\U000029A7', - "vArr;": '\U000021D5', - "vBar;": '\U00002AE8', - "vBarv;": '\U00002AE9', - "vDash;": '\U000022A8', - "vangrt;": '\U0000299C', - "varepsilon;": '\U000003F5', - "varkappa;": '\U000003F0', - "varnothing;": '\U00002205', - "varphi;": '\U000003D5', - "varpi;": '\U000003D6', - "varpropto;": '\U0000221D', - "varr;": '\U00002195', - "varrho;": '\U000003F1', - "varsigma;": '\U000003C2', - "vartheta;": '\U000003D1', - "vartriangleleft;": '\U000022B2', - "vartriangleright;": '\U000022B3', - "vcy;": '\U00000432', - "vdash;": '\U000022A2', - "vee;": '\U00002228', - "veebar;": '\U000022BB', - "veeeq;": '\U0000225A', - "vellip;": '\U000022EE', - "verbar;": '\U0000007C', - "vert;": '\U0000007C', - "vfr;": '\U0001D533', - "vltri;": '\U000022B2', - "vopf;": '\U0001D567', - "vprop;": '\U0000221D', - "vrtri;": '\U000022B3', - "vscr;": '\U0001D4CB', - "vzigzag;": '\U0000299A', - "wcirc;": '\U00000175', - "wedbar;": '\U00002A5F', - "wedge;": '\U00002227', - "wedgeq;": '\U00002259', - "weierp;": '\U00002118', - "wfr;": '\U0001D534', - "wopf;": '\U0001D568', - "wp;": '\U00002118', - "wr;": '\U00002240', - "wreath;": '\U00002240', - "wscr;": '\U0001D4CC', - "xcap;": '\U000022C2', - "xcirc;": '\U000025EF', - "xcup;": '\U000022C3', - "xdtri;": '\U000025BD', - "xfr;": '\U0001D535', - "xhArr;": '\U000027FA', - "xharr;": '\U000027F7', - "xi;": '\U000003BE', - "xlArr;": '\U000027F8', - "xlarr;": '\U000027F5', - "xmap;": '\U000027FC', - "xnis;": '\U000022FB', - "xodot;": '\U00002A00', - "xopf;": '\U0001D569', - "xoplus;": '\U00002A01', - "xotime;": '\U00002A02', - "xrArr;": '\U000027F9', - "xrarr;": '\U000027F6', - "xscr;": '\U0001D4CD', - "xsqcup;": '\U00002A06', - "xuplus;": '\U00002A04', - "xutri;": '\U000025B3', - "xvee;": '\U000022C1', - "xwedge;": '\U000022C0', - "yacute;": '\U000000FD', - "yacy;": '\U0000044F', - "ycirc;": '\U00000177', - "ycy;": '\U0000044B', - "yen;": '\U000000A5', - "yfr;": '\U0001D536', - "yicy;": '\U00000457', - "yopf;": '\U0001D56A', - "yscr;": '\U0001D4CE', - "yucy;": '\U0000044E', - "yuml;": '\U000000FF', - "zacute;": '\U0000017A', - "zcaron;": '\U0000017E', - "zcy;": '\U00000437', - "zdot;": '\U0000017C', - "zeetrf;": '\U00002128', - "zeta;": '\U000003B6', - "zfr;": '\U0001D537', - "zhcy;": '\U00000436', - "zigrarr;": '\U000021DD', - "zopf;": '\U0001D56B', - "zscr;": '\U0001D4CF', - "zwj;": '\U0000200D', - "zwnj;": '\U0000200C', - "AElig": '\U000000C6', - "AMP": '\U00000026', - "Aacute": '\U000000C1', - "Acirc": '\U000000C2', - "Agrave": '\U000000C0', - "Aring": '\U000000C5', - "Atilde": '\U000000C3', - "Auml": '\U000000C4', - "COPY": '\U000000A9', - "Ccedil": '\U000000C7', - "ETH": '\U000000D0', - "Eacute": '\U000000C9', - "Ecirc": '\U000000CA', - "Egrave": '\U000000C8', - "Euml": '\U000000CB', - "GT": '\U0000003E', - "Iacute": '\U000000CD', - "Icirc": '\U000000CE', - "Igrave": '\U000000CC', - "Iuml": '\U000000CF', - "LT": '\U0000003C', - "Ntilde": '\U000000D1', - "Oacute": '\U000000D3', - "Ocirc": '\U000000D4', - "Ograve": '\U000000D2', - "Oslash": '\U000000D8', - "Otilde": '\U000000D5', - "Ouml": '\U000000D6', - "QUOT": '\U00000022', - "REG": '\U000000AE', - "THORN": '\U000000DE', - "Uacute": '\U000000DA', - "Ucirc": '\U000000DB', - "Ugrave": '\U000000D9', - "Uuml": '\U000000DC', - "Yacute": '\U000000DD', - "aacute": '\U000000E1', - "acirc": '\U000000E2', - "acute": '\U000000B4', - "aelig": '\U000000E6', - "agrave": '\U000000E0', - "amp": '\U00000026', - "aring": '\U000000E5', - "atilde": '\U000000E3', - "auml": '\U000000E4', - "brvbar": '\U000000A6', - "ccedil": '\U000000E7', - "cedil": '\U000000B8', - "cent": '\U000000A2', - "copy": '\U000000A9', - "curren": '\U000000A4', - "deg": '\U000000B0', - "divide": '\U000000F7', - "eacute": '\U000000E9', - "ecirc": '\U000000EA', - "egrave": '\U000000E8', - "eth": '\U000000F0', - "euml": '\U000000EB', - "frac12": '\U000000BD', - "frac14": '\U000000BC', - "frac34": '\U000000BE', - "gt": '\U0000003E', - "iacute": '\U000000ED', - "icirc": '\U000000EE', - "iexcl": '\U000000A1', - "igrave": '\U000000EC', - "iquest": '\U000000BF', - "iuml": '\U000000EF', - "laquo": '\U000000AB', - "lt": '\U0000003C', - "macr": '\U000000AF', - "micro": '\U000000B5', - "middot": '\U000000B7', - "nbsp": '\U000000A0', - "not": '\U000000AC', - "ntilde": '\U000000F1', - "oacute": '\U000000F3', - "ocirc": '\U000000F4', - "ograve": '\U000000F2', - "ordf": '\U000000AA', - "ordm": '\U000000BA', - "oslash": '\U000000F8', - "otilde": '\U000000F5', - "ouml": '\U000000F6', - "para": '\U000000B6', - "plusmn": '\U000000B1', - "pound": '\U000000A3', - "quot": '\U00000022', - "raquo": '\U000000BB', - "reg": '\U000000AE', - "sect": '\U000000A7', - "shy": '\U000000AD', - "sup1": '\U000000B9', - "sup2": '\U000000B2', - "sup3": '\U000000B3', - "szlig": '\U000000DF', - "thorn": '\U000000FE', - "times": '\U000000D7', - "uacute": '\U000000FA', - "ucirc": '\U000000FB', - "ugrave": '\U000000F9', - "uml": '\U000000A8', - "uuml": '\U000000FC', - "yacute": '\U000000FD', - "yen": '\U000000A5', - "yuml": '\U000000FF', -} - -// HTML entities that are two unicode codepoints. -var entity2 = map[string][2]rune{ - "nLt;": {'\u226A', '\u20D2'}, - "nGt;": {'\u226B', '\u20D2'}, - "NotEqualTilde;": {'\u2242', '\u0338'}, - "NotGreaterFullEqual;": {'\u2267', '\u0338'}, - "NotGreaterGreater;": {'\u226B', '\u0338'}, - "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, - "NotHumpDownHump;": {'\u224E', '\u0338'}, - "NotHumpEqual;": {'\u224F', '\u0338'}, - "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, - "NotLessLess;": {'\u226A', '\u0338'}, - "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, - "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, - "NotNestedLessLess;": {'\u2AA1', '\u0338'}, - "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, - "NotRightTriangleBar;": {'\u29D0', '\u0338'}, - "NotSquareSubset;": {'\u228F', '\u0338'}, - "NotSquareSuperset;": {'\u2290', '\u0338'}, - "NotSubset;": {'\u2282', '\u20D2'}, - "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, - "NotSucceedsTilde;": {'\u227F', '\u0338'}, - "NotSuperset;": {'\u2283', '\u20D2'}, - "ThickSpace;": {'\u205F', '\u200A'}, - "acE;": {'\u223E', '\u0333'}, - "bne;": {'\u003D', '\u20E5'}, - "bnequiv;": {'\u2261', '\u20E5'}, - "caps;": {'\u2229', '\uFE00'}, - "cups;": {'\u222A', '\uFE00'}, - "fjlig;": {'\u0066', '\u006A'}, - "gesl;": {'\u22DB', '\uFE00'}, - "gvertneqq;": {'\u2269', '\uFE00'}, - "gvnE;": {'\u2269', '\uFE00'}, - "lates;": {'\u2AAD', '\uFE00'}, - "lesg;": {'\u22DA', '\uFE00'}, - "lvertneqq;": {'\u2268', '\uFE00'}, - "lvnE;": {'\u2268', '\uFE00'}, - "nGg;": {'\u22D9', '\u0338'}, - "nGtv;": {'\u226B', '\u0338'}, - "nLl;": {'\u22D8', '\u0338'}, - "nLtv;": {'\u226A', '\u0338'}, - "nang;": {'\u2220', '\u20D2'}, - "napE;": {'\u2A70', '\u0338'}, - "napid;": {'\u224B', '\u0338'}, - "nbump;": {'\u224E', '\u0338'}, - "nbumpe;": {'\u224F', '\u0338'}, - "ncongdot;": {'\u2A6D', '\u0338'}, - "nedot;": {'\u2250', '\u0338'}, - "nesim;": {'\u2242', '\u0338'}, - "ngE;": {'\u2267', '\u0338'}, - "ngeqq;": {'\u2267', '\u0338'}, - "ngeqslant;": {'\u2A7E', '\u0338'}, - "nges;": {'\u2A7E', '\u0338'}, - "nlE;": {'\u2266', '\u0338'}, - "nleqq;": {'\u2266', '\u0338'}, - "nleqslant;": {'\u2A7D', '\u0338'}, - "nles;": {'\u2A7D', '\u0338'}, - "notinE;": {'\u22F9', '\u0338'}, - "notindot;": {'\u22F5', '\u0338'}, - "nparsl;": {'\u2AFD', '\u20E5'}, - "npart;": {'\u2202', '\u0338'}, - "npre;": {'\u2AAF', '\u0338'}, - "npreceq;": {'\u2AAF', '\u0338'}, - "nrarrc;": {'\u2933', '\u0338'}, - "nrarrw;": {'\u219D', '\u0338'}, - "nsce;": {'\u2AB0', '\u0338'}, - "nsubE;": {'\u2AC5', '\u0338'}, - "nsubset;": {'\u2282', '\u20D2'}, - "nsubseteqq;": {'\u2AC5', '\u0338'}, - "nsucceq;": {'\u2AB0', '\u0338'}, - "nsupE;": {'\u2AC6', '\u0338'}, - "nsupset;": {'\u2283', '\u20D2'}, - "nsupseteqq;": {'\u2AC6', '\u0338'}, - "nvap;": {'\u224D', '\u20D2'}, - "nvge;": {'\u2265', '\u20D2'}, - "nvgt;": {'\u003E', '\u20D2'}, - "nvle;": {'\u2264', '\u20D2'}, - "nvlt;": {'\u003C', '\u20D2'}, - "nvltrie;": {'\u22B4', '\u20D2'}, - "nvrtrie;": {'\u22B5', '\u20D2'}, - "nvsim;": {'\u223C', '\u20D2'}, - "race;": {'\u223D', '\u0331'}, - "smtes;": {'\u2AAC', '\uFE00'}, - "sqcaps;": {'\u2293', '\uFE00'}, - "sqcups;": {'\u2294', '\uFE00'}, - "varsubsetneq;": {'\u228A', '\uFE00'}, - "varsubsetneqq;": {'\u2ACB', '\uFE00'}, - "varsupsetneq;": {'\u228B', '\uFE00'}, - "varsupsetneqq;": {'\u2ACC', '\uFE00'}, - "vnsub;": {'\u2282', '\u20D2'}, - "vnsup;": {'\u2283', '\u20D2'}, - "vsubnE;": {'\u2ACB', '\uFE00'}, - "vsubne;": {'\u228A', '\uFE00'}, - "vsupnE;": {'\u2ACC', '\uFE00'}, - "vsupne;": {'\u228B', '\uFE00'}, -} diff --git a/vendor/github.com/axgle/mahonia/euc-jp.go b/vendor/github.com/axgle/mahonia/euc-jp.go deleted file mode 100644 index 249b2c8..0000000 --- a/vendor/github.com/axgle/mahonia/euc-jp.go +++ /dev/null @@ -1,75 +0,0 @@ -package mahonia - -// Converters for the EUC-JP encoding - -import ( - "sync" -) - -func init() { - RegisterCharset(&Charset{ - Name: "EUC-JP", - Aliases: []string{"extended_unix_code_packed_format_for_japanese", "cseucpkdfmtjapanese"}, - NewDecoder: func() Decoder { - eucJPOnce.Do(makeEUCJPTable) - return eucJPTable.Decoder() - }, - NewEncoder: func() Encoder { - eucJPOnce.Do(makeEUCJPTable) - return eucJPTable.Encoder() - }, - }) -} - -var eucJPOnce sync.Once -var eucJPTable MBCSTable - -func makeEUCJPTable() { - var b [3]byte - - b[0] = 0x8f - for jis0212, unicode := range jis0212ToUnicode { - if unicode == 0 { - continue - } - - b[1] = byte(jis0212>>8) | 128 - b[2] = byte(jis0212) | 128 - eucJPTable.AddCharacter(rune(unicode), string(b[:3])) - } - - for jis0208, unicode := range jis0208ToUnicode { - if unicode == 0 { - continue - } - - b[0] = byte(jis0208>>8) | 128 - b[1] = byte(jis0208) | 128 - eucJPTable.AddCharacter(rune(unicode), string(b[:2])) - } - - b[0] = 0x8e - for i := 128; i < 256; i++ { - unicode := jis0201ToUnicode[i] - if unicode == 0 { - continue - } - - b[1] = byte(i) - eucJPTable.AddCharacter(rune(unicode), string(b[:2])) - } - - for i := '\x00'; i < 128; i++ { - var unicode rune - if i < 32 || i == 127 { - unicode = i - } else { - unicode = rune(jis0201ToUnicode[i]) - if unicode == 0 { - continue - } - } - - eucJPTable.AddCharacter(unicode, string(byte(i))) - } -} diff --git a/vendor/github.com/axgle/mahonia/fallback.go b/vendor/github.com/axgle/mahonia/fallback.go deleted file mode 100644 index 27259c5..0000000 --- a/vendor/github.com/axgle/mahonia/fallback.go +++ /dev/null @@ -1,19 +0,0 @@ -package mahonia - -// FallbackDecoder combines a series of Decoders into one. -// If the first Decoder returns a status of INVALID_CHAR, the others are tried as well. -// -// Note: if the text to be decoded ends with a sequence of bytes that is not a valid character in the first charset, -// but it could be the beginning of a valid character, the FallbackDecoder will give a status of NO_ROOM instead of -// falling back to the other Decoders. -func FallbackDecoder(decoders ...Decoder) Decoder { - return func(p []byte) (c rune, size int, status Status) { - for _, d := range decoders { - c, size, status = d(p) - if status != INVALID_CHAR { - return - } - } - return 0, 1, INVALID_CHAR - } -} diff --git a/vendor/github.com/axgle/mahonia/gb18030-data.go b/vendor/github.com/axgle/mahonia/gb18030-data.go deleted file mode 100644 index a63289b..0000000 --- a/vendor/github.com/axgle/mahonia/gb18030-data.go +++ /dev/null @@ -1,6839 +0,0 @@ -package mahonia - -// Data tables for 4-byte characters in GB18030 encoding. -// Based on http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/gb-18030-2005.ucm - -// gb18030Linear converts a 32-bit big-endian representation of a 4-byte -// character into a linearly-increasing integer, starting from the base -// sequence of 0x81308130 -func gb18030Linear(g uint32) uint32 { - lin := g>>24 - 0x81 - lin = lin*10 + (g>>16)&0xff - 0x30 - lin = lin*126 + (g>>8)&0xff - 0x81 - lin = lin*10 + g&0xff - 0x30 - return lin -} - -// Equivalent ranges between GB18030 and Unicode. -var gb18030Ranges = []struct { - firstRune, lastRune rune - firstGB, lastGB uint32 -}{ - {0x10000, 0x10FFFF, gb18030Linear(0x90308130), gb18030Linear(0xE3329A35)}, - {0x9FA6, 0xD7FF, gb18030Linear(0x82358F33), gb18030Linear(0x8336C738)}, - {0x0452, 0x200F, gb18030Linear(0x8130D330), gb18030Linear(0x8136A531)}, - {0xE865, 0xF92B, gb18030Linear(0x8336D030), gb18030Linear(0x84308534)}, - {0x2643, 0x2E80, gb18030Linear(0x8137A839), gb18030Linear(0x8138FD38)}, - {0xFA2A, 0xFE2F, gb18030Linear(0x84309C38), gb18030Linear(0x84318537)}, - {0x3CE1, 0x4055, gb18030Linear(0x8231D438), gb18030Linear(0x8232AF32)}, - {0x361B, 0x3917, gb18030Linear(0x8230A633), gb18030Linear(0x8230F237)}, - {0x49B8, 0x4C76, gb18030Linear(0x8234A131), gb18030Linear(0x8234E733)}, - {0x4160, 0x4336, gb18030Linear(0x8232C937), gb18030Linear(0x8232F837)}, - {0x478E, 0x4946, gb18030Linear(0x8233E838), gb18030Linear(0x82349638)}, - {0x44D7, 0x464B, gb18030Linear(0x8233A339), gb18030Linear(0x8233C931)}, - {0xFFE6, 0xFFFF, gb18030Linear(0x8431A234), gb18030Linear(0x8431A439)}, -} - -// The higest value returned by gb18030Linear for characters in gb18030Data -const maxGB18030Linear = 39393 - -// Unicode equivalents for characters not handled algorithmically. -var gb18030Data = []struct { - unicode uint16 - gb18030 uint32 -}{ - {0x0080, 0x81308130}, - {0x0081, 0x81308131}, - {0x0082, 0x81308132}, - {0x0083, 0x81308133}, - {0x0084, 0x81308134}, - {0x0085, 0x81308135}, - {0x0086, 0x81308136}, - {0x0087, 0x81308137}, - {0x0088, 0x81308138}, - {0x0089, 0x81308139}, - {0x008A, 0x81308230}, - {0x008B, 0x81308231}, - {0x008C, 0x81308232}, - {0x008D, 0x81308233}, - {0x008E, 0x81308234}, - {0x008F, 0x81308235}, - {0x0090, 0x81308236}, - {0x0091, 0x81308237}, - {0x0092, 0x81308238}, - {0x0093, 0x81308239}, - {0x0094, 0x81308330}, - {0x0095, 0x81308331}, - {0x0096, 0x81308332}, - {0x0097, 0x81308333}, - {0x0098, 0x81308334}, - {0x0099, 0x81308335}, - {0x009A, 0x81308336}, - {0x009B, 0x81308337}, - {0x009C, 0x81308338}, - {0x009D, 0x81308339}, - {0x009E, 0x81308430}, - {0x009F, 0x81308431}, - {0x00A0, 0x81308432}, - {0x00A1, 0x81308433}, - {0x00A2, 0x81308434}, - {0x00A3, 0x81308435}, - {0x00A5, 0x81308436}, - {0x00A6, 0x81308437}, - {0x00A9, 0x81308438}, - {0x00AA, 0x81308439}, - {0x00AB, 0x81308530}, - {0x00AC, 0x81308531}, - {0x00AD, 0x81308532}, - {0x00AE, 0x81308533}, - {0x00AF, 0x81308534}, - {0x00B2, 0x81308535}, - {0x00B3, 0x81308536}, - {0x00B4, 0x81308537}, - {0x00B5, 0x81308538}, - {0x00B6, 0x81308539}, - {0x00B8, 0x81308630}, - {0x00B9, 0x81308631}, - {0x00BA, 0x81308632}, - {0x00BB, 0x81308633}, - {0x00BC, 0x81308634}, - {0x00BD, 0x81308635}, - {0x00BE, 0x81308636}, - {0x00BF, 0x81308637}, - {0x00C0, 0x81308638}, - {0x00C1, 0x81308639}, - {0x00C2, 0x81308730}, - {0x00C3, 0x81308731}, - {0x00C4, 0x81308732}, - {0x00C5, 0x81308733}, - {0x00C6, 0x81308734}, - {0x00C7, 0x81308735}, - {0x00C8, 0x81308736}, - {0x00C9, 0x81308737}, - {0x00CA, 0x81308738}, - {0x00CB, 0x81308739}, - {0x00CC, 0x81308830}, - {0x00CD, 0x81308831}, - {0x00CE, 0x81308832}, - {0x00CF, 0x81308833}, - {0x00D0, 0x81308834}, - {0x00D1, 0x81308835}, - {0x00D2, 0x81308836}, - {0x00D3, 0x81308837}, - {0x00D4, 0x81308838}, - {0x00D5, 0x81308839}, - {0x00D6, 0x81308930}, - {0x00D8, 0x81308931}, - {0x00D9, 0x81308932}, - {0x00DA, 0x81308933}, - {0x00DB, 0x81308934}, - {0x00DC, 0x81308935}, - {0x00DD, 0x81308936}, - {0x00DE, 0x81308937}, - {0x00DF, 0x81308938}, - {0x00E2, 0x81308939}, - {0x00E3, 0x81308A30}, - {0x00E4, 0x81308A31}, - {0x00E5, 0x81308A32}, - {0x00E6, 0x81308A33}, - {0x00E7, 0x81308A34}, - {0x00EB, 0x81308A35}, - {0x00EE, 0x81308A36}, - {0x00EF, 0x81308A37}, - {0x00F0, 0x81308A38}, - {0x00F1, 0x81308A39}, - {0x00F4, 0x81308B30}, - {0x00F5, 0x81308B31}, - {0x00F6, 0x81308B32}, - {0x00F8, 0x81308B33}, - {0x00FB, 0x81308B34}, - {0x00FD, 0x81308B35}, - {0x00FE, 0x81308B36}, - {0x00FF, 0x81308B37}, - {0x0100, 0x81308B38}, - {0x0102, 0x81308B39}, - {0x0103, 0x81308C30}, - {0x0104, 0x81308C31}, - {0x0105, 0x81308C32}, - {0x0106, 0x81308C33}, - {0x0107, 0x81308C34}, - {0x0108, 0x81308C35}, - {0x0109, 0x81308C36}, - {0x010A, 0x81308C37}, - {0x010B, 0x81308C38}, - {0x010C, 0x81308C39}, - {0x010D, 0x81308D30}, - {0x010E, 0x81308D31}, - {0x010F, 0x81308D32}, - {0x0110, 0x81308D33}, - {0x0111, 0x81308D34}, - {0x0112, 0x81308D35}, - {0x0114, 0x81308D36}, - {0x0115, 0x81308D37}, - {0x0116, 0x81308D38}, - {0x0117, 0x81308D39}, - {0x0118, 0x81308E30}, - {0x0119, 0x81308E31}, - {0x011A, 0x81308E32}, - {0x011C, 0x81308E33}, - {0x011D, 0x81308E34}, - {0x011E, 0x81308E35}, - {0x011F, 0x81308E36}, - {0x0120, 0x81308E37}, - {0x0121, 0x81308E38}, - {0x0122, 0x81308E39}, - {0x0123, 0x81308F30}, - {0x0124, 0x81308F31}, - {0x0125, 0x81308F32}, - {0x0126, 0x81308F33}, - {0x0127, 0x81308F34}, - {0x0128, 0x81308F35}, - {0x0129, 0x81308F36}, - {0x012A, 0x81308F37}, - {0x012C, 0x81308F38}, - {0x012D, 0x81308F39}, - {0x012E, 0x81309030}, - {0x012F, 0x81309031}, - {0x0130, 0x81309032}, - {0x0131, 0x81309033}, - {0x0132, 0x81309034}, - {0x0133, 0x81309035}, - {0x0134, 0x81309036}, - {0x0135, 0x81309037}, - {0x0136, 0x81309038}, - {0x0137, 0x81309039}, - {0x0138, 0x81309130}, - {0x0139, 0x81309131}, - {0x013A, 0x81309132}, - {0x013B, 0x81309133}, - {0x013C, 0x81309134}, - {0x013D, 0x81309135}, - {0x013E, 0x81309136}, - {0x013F, 0x81309137}, - {0x0140, 0x81309138}, - {0x0141, 0x81309139}, - {0x0142, 0x81309230}, - {0x0143, 0x81309231}, - {0x0145, 0x81309232}, - {0x0146, 0x81309233}, - {0x0147, 0x81309234}, - {0x0149, 0x81309235}, - {0x014A, 0x81309236}, - {0x014B, 0x81309237}, - {0x014C, 0x81309238}, - {0x014E, 0x81309239}, - {0x014F, 0x81309330}, - {0x0150, 0x81309331}, - {0x0151, 0x81309332}, - {0x0152, 0x81309333}, - {0x0153, 0x81309334}, - {0x0154, 0x81309335}, - {0x0155, 0x81309336}, - {0x0156, 0x81309337}, - {0x0157, 0x81309338}, - {0x0158, 0x81309339}, - {0x0159, 0x81309430}, - {0x015A, 0x81309431}, - {0x015B, 0x81309432}, - {0x015C, 0x81309433}, - {0x015D, 0x81309434}, - {0x015E, 0x81309435}, - {0x015F, 0x81309436}, - {0x0160, 0x81309437}, - {0x0161, 0x81309438}, - {0x0162, 0x81309439}, - {0x0163, 0x81309530}, - {0x0164, 0x81309531}, - {0x0165, 0x81309532}, - {0x0166, 0x81309533}, - {0x0167, 0x81309534}, - {0x0168, 0x81309535}, - {0x0169, 0x81309536}, - {0x016A, 0x81309537}, - {0x016C, 0x81309538}, - {0x016D, 0x81309539}, - {0x016E, 0x81309630}, - {0x016F, 0x81309631}, - {0x0170, 0x81309632}, - {0x0171, 0x81309633}, - {0x0172, 0x81309634}, - {0x0173, 0x81309635}, - {0x0174, 0x81309636}, - {0x0175, 0x81309637}, - {0x0176, 0x81309638}, - {0x0177, 0x81309639}, - {0x0178, 0x81309730}, - {0x0179, 0x81309731}, - {0x017A, 0x81309732}, - {0x017B, 0x81309733}, - {0x017C, 0x81309734}, - {0x017D, 0x81309735}, - {0x017E, 0x81309736}, - {0x017F, 0x81309737}, - {0x0180, 0x81309738}, - {0x0181, 0x81309739}, - {0x0182, 0x81309830}, - {0x0183, 0x81309831}, - {0x0184, 0x81309832}, - {0x0185, 0x81309833}, - {0x0186, 0x81309834}, - {0x0187, 0x81309835}, - {0x0188, 0x81309836}, - {0x0189, 0x81309837}, - {0x018A, 0x81309838}, - {0x018B, 0x81309839}, - {0x018C, 0x81309930}, - {0x018D, 0x81309931}, - {0x018E, 0x81309932}, - {0x018F, 0x81309933}, - {0x0190, 0x81309934}, - {0x0191, 0x81309935}, - {0x0192, 0x81309936}, - {0x0193, 0x81309937}, - {0x0194, 0x81309938}, - {0x0195, 0x81309939}, - {0x0196, 0x81309A30}, - {0x0197, 0x81309A31}, - {0x0198, 0x81309A32}, - {0x0199, 0x81309A33}, - {0x019A, 0x81309A34}, - {0x019B, 0x81309A35}, - {0x019C, 0x81309A36}, - {0x019D, 0x81309A37}, - {0x019E, 0x81309A38}, - {0x019F, 0x81309A39}, - {0x01A0, 0x81309B30}, - {0x01A1, 0x81309B31}, - {0x01A2, 0x81309B32}, - {0x01A3, 0x81309B33}, - {0x01A4, 0x81309B34}, - {0x01A5, 0x81309B35}, - {0x01A6, 0x81309B36}, - {0x01A7, 0x81309B37}, - {0x01A8, 0x81309B38}, - {0x01A9, 0x81309B39}, - {0x01AA, 0x81309C30}, - {0x01AB, 0x81309C31}, - {0x01AC, 0x81309C32}, - {0x01AD, 0x81309C33}, - {0x01AE, 0x81309C34}, - {0x01AF, 0x81309C35}, - {0x01B0, 0x81309C36}, - {0x01B1, 0x81309C37}, - {0x01B2, 0x81309C38}, - {0x01B3, 0x81309C39}, - {0x01B4, 0x81309D30}, - {0x01B5, 0x81309D31}, - {0x01B6, 0x81309D32}, - {0x01B7, 0x81309D33}, - {0x01B8, 0x81309D34}, - {0x01B9, 0x81309D35}, - {0x01BA, 0x81309D36}, - {0x01BB, 0x81309D37}, - {0x01BC, 0x81309D38}, - {0x01BD, 0x81309D39}, - {0x01BE, 0x81309E30}, - {0x01BF, 0x81309E31}, - {0x01C0, 0x81309E32}, - {0x01C1, 0x81309E33}, - {0x01C2, 0x81309E34}, - {0x01C3, 0x81309E35}, - {0x01C4, 0x81309E36}, - {0x01C5, 0x81309E37}, - {0x01C6, 0x81309E38}, - {0x01C7, 0x81309E39}, - {0x01C8, 0x81309F30}, - {0x01C9, 0x81309F31}, - {0x01CA, 0x81309F32}, - {0x01CB, 0x81309F33}, - {0x01CC, 0x81309F34}, - {0x01CD, 0x81309F35}, - {0x01CF, 0x81309F36}, - {0x01D1, 0x81309F37}, - {0x01D3, 0x81309F38}, - {0x01D5, 0x81309F39}, - {0x01D7, 0x8130A030}, - {0x01D9, 0x8130A031}, - {0x01DB, 0x8130A032}, - {0x01DD, 0x8130A033}, - {0x01DE, 0x8130A034}, - {0x01DF, 0x8130A035}, - {0x01E0, 0x8130A036}, - {0x01E1, 0x8130A037}, - {0x01E2, 0x8130A038}, - {0x01E3, 0x8130A039}, - {0x01E4, 0x8130A130}, - {0x01E5, 0x8130A131}, - {0x01E6, 0x8130A132}, - {0x01E7, 0x8130A133}, - {0x01E8, 0x8130A134}, - {0x01E9, 0x8130A135}, - {0x01EA, 0x8130A136}, - {0x01EB, 0x8130A137}, - {0x01EC, 0x8130A138}, - {0x01ED, 0x8130A139}, - {0x01EE, 0x8130A230}, - {0x01EF, 0x8130A231}, - {0x01F0, 0x8130A232}, - {0x01F1, 0x8130A233}, - {0x01F2, 0x8130A234}, - {0x01F3, 0x8130A235}, - {0x01F4, 0x8130A236}, - {0x01F5, 0x8130A237}, - {0x01F6, 0x8130A238}, - {0x01F7, 0x8130A239}, - {0x01F8, 0x8130A330}, - {0x01FA, 0x8130A331}, - {0x01FB, 0x8130A332}, - {0x01FC, 0x8130A333}, - {0x01FD, 0x8130A334}, - {0x01FE, 0x8130A335}, - {0x01FF, 0x8130A336}, - {0x0200, 0x8130A337}, - {0x0201, 0x8130A338}, - {0x0202, 0x8130A339}, - {0x0203, 0x8130A430}, - {0x0204, 0x8130A431}, - {0x0205, 0x8130A432}, - {0x0206, 0x8130A433}, - {0x0207, 0x8130A434}, - {0x0208, 0x8130A435}, - {0x0209, 0x8130A436}, - {0x020A, 0x8130A437}, - {0x020B, 0x8130A438}, - {0x020C, 0x8130A439}, - {0x020D, 0x8130A530}, - {0x020E, 0x8130A531}, - {0x020F, 0x8130A532}, - {0x0210, 0x8130A533}, - {0x0211, 0x8130A534}, - {0x0212, 0x8130A535}, - {0x0213, 0x8130A536}, - {0x0214, 0x8130A537}, - {0x0215, 0x8130A538}, - {0x0216, 0x8130A539}, - {0x0217, 0x8130A630}, - {0x0218, 0x8130A631}, - {0x0219, 0x8130A632}, - {0x021A, 0x8130A633}, - {0x021B, 0x8130A634}, - {0x021C, 0x8130A635}, - {0x021D, 0x8130A636}, - {0x021E, 0x8130A637}, - {0x021F, 0x8130A638}, - {0x0220, 0x8130A639}, - {0x0221, 0x8130A730}, - {0x0222, 0x8130A731}, - {0x0223, 0x8130A732}, - {0x0224, 0x8130A733}, - {0x0225, 0x8130A734}, - {0x0226, 0x8130A735}, - {0x0227, 0x8130A736}, - {0x0228, 0x8130A737}, - {0x0229, 0x8130A738}, - {0x022A, 0x8130A739}, - {0x022B, 0x8130A830}, - {0x022C, 0x8130A831}, - {0x022D, 0x8130A832}, - {0x022E, 0x8130A833}, - {0x022F, 0x8130A834}, - {0x0230, 0x8130A835}, - {0x0231, 0x8130A836}, - {0x0232, 0x8130A837}, - {0x0233, 0x8130A838}, - {0x0234, 0x8130A839}, - {0x0235, 0x8130A930}, - {0x0236, 0x8130A931}, - {0x0237, 0x8130A932}, - {0x0238, 0x8130A933}, - {0x0239, 0x8130A934}, - {0x023A, 0x8130A935}, - {0x023B, 0x8130A936}, - {0x023C, 0x8130A937}, - {0x023D, 0x8130A938}, - {0x023E, 0x8130A939}, - {0x023F, 0x8130AA30}, - {0x0240, 0x8130AA31}, - {0x0241, 0x8130AA32}, - {0x0242, 0x8130AA33}, - {0x0243, 0x8130AA34}, - {0x0244, 0x8130AA35}, - {0x0245, 0x8130AA36}, - {0x0246, 0x8130AA37}, - {0x0247, 0x8130AA38}, - {0x0248, 0x8130AA39}, - {0x0249, 0x8130AB30}, - {0x024A, 0x8130AB31}, - {0x024B, 0x8130AB32}, - {0x024C, 0x8130AB33}, - {0x024D, 0x8130AB34}, - {0x024E, 0x8130AB35}, - {0x024F, 0x8130AB36}, - {0x0250, 0x8130AB37}, - {0x0252, 0x8130AB38}, - {0x0253, 0x8130AB39}, - {0x0254, 0x8130AC30}, - {0x0255, 0x8130AC31}, - {0x0256, 0x8130AC32}, - {0x0257, 0x8130AC33}, - {0x0258, 0x8130AC34}, - {0x0259, 0x8130AC35}, - {0x025A, 0x8130AC36}, - {0x025B, 0x8130AC37}, - {0x025C, 0x8130AC38}, - {0x025D, 0x8130AC39}, - {0x025E, 0x8130AD30}, - {0x025F, 0x8130AD31}, - {0x0260, 0x8130AD32}, - {0x0262, 0x8130AD33}, - {0x0263, 0x8130AD34}, - {0x0264, 0x8130AD35}, - {0x0265, 0x8130AD36}, - {0x0266, 0x8130AD37}, - {0x0267, 0x8130AD38}, - {0x0268, 0x8130AD39}, - {0x0269, 0x8130AE30}, - {0x026A, 0x8130AE31}, - {0x026B, 0x8130AE32}, - {0x026C, 0x8130AE33}, - {0x026D, 0x8130AE34}, - {0x026E, 0x8130AE35}, - {0x026F, 0x8130AE36}, - {0x0270, 0x8130AE37}, - {0x0271, 0x8130AE38}, - {0x0272, 0x8130AE39}, - {0x0273, 0x8130AF30}, - {0x0274, 0x8130AF31}, - {0x0275, 0x8130AF32}, - {0x0276, 0x8130AF33}, - {0x0277, 0x8130AF34}, - {0x0278, 0x8130AF35}, - {0x0279, 0x8130AF36}, - {0x027A, 0x8130AF37}, - {0x027B, 0x8130AF38}, - {0x027C, 0x8130AF39}, - {0x027D, 0x8130B030}, - {0x027E, 0x8130B031}, - {0x027F, 0x8130B032}, - {0x0280, 0x8130B033}, - {0x0281, 0x8130B034}, - {0x0282, 0x8130B035}, - {0x0283, 0x8130B036}, - {0x0284, 0x8130B037}, - {0x0285, 0x8130B038}, - {0x0286, 0x8130B039}, - {0x0287, 0x8130B130}, - {0x0288, 0x8130B131}, - {0x0289, 0x8130B132}, - {0x028A, 0x8130B133}, - {0x028B, 0x8130B134}, - {0x028C, 0x8130B135}, - {0x028D, 0x8130B136}, - {0x028E, 0x8130B137}, - {0x028F, 0x8130B138}, - {0x0290, 0x8130B139}, - {0x0291, 0x8130B230}, - {0x0292, 0x8130B231}, - {0x0293, 0x8130B232}, - {0x0294, 0x8130B233}, - {0x0295, 0x8130B234}, - {0x0296, 0x8130B235}, - {0x0297, 0x8130B236}, - {0x0298, 0x8130B237}, - {0x0299, 0x8130B238}, - {0x029A, 0x8130B239}, - {0x029B, 0x8130B330}, - {0x029C, 0x8130B331}, - {0x029D, 0x8130B332}, - {0x029E, 0x8130B333}, - {0x029F, 0x8130B334}, - {0x02A0, 0x8130B335}, - {0x02A1, 0x8130B336}, - {0x02A2, 0x8130B337}, - {0x02A3, 0x8130B338}, - {0x02A4, 0x8130B339}, - {0x02A5, 0x8130B430}, - {0x02A6, 0x8130B431}, - {0x02A7, 0x8130B432}, - {0x02A8, 0x8130B433}, - {0x02A9, 0x8130B434}, - {0x02AA, 0x8130B435}, - {0x02AB, 0x8130B436}, - {0x02AC, 0x8130B437}, - {0x02AD, 0x8130B438}, - {0x02AE, 0x8130B439}, - {0x02AF, 0x8130B530}, - {0x02B0, 0x8130B531}, - {0x02B1, 0x8130B532}, - {0x02B2, 0x8130B533}, - {0x02B3, 0x8130B534}, - {0x02B4, 0x8130B535}, - {0x02B5, 0x8130B536}, - {0x02B6, 0x8130B537}, - {0x02B7, 0x8130B538}, - {0x02B8, 0x8130B539}, - {0x02B9, 0x8130B630}, - {0x02BA, 0x8130B631}, - {0x02BB, 0x8130B632}, - {0x02BC, 0x8130B633}, - {0x02BD, 0x8130B634}, - {0x02BE, 0x8130B635}, - {0x02BF, 0x8130B636}, - {0x02C0, 0x8130B637}, - {0x02C1, 0x8130B638}, - {0x02C2, 0x8130B639}, - {0x02C3, 0x8130B730}, - {0x02C4, 0x8130B731}, - {0x02C5, 0x8130B732}, - {0x02C6, 0x8130B733}, - {0x02C8, 0x8130B734}, - {0x02CC, 0x8130B735}, - {0x02CD, 0x8130B736}, - {0x02CE, 0x8130B737}, - {0x02CF, 0x8130B738}, - {0x02D0, 0x8130B739}, - {0x02D1, 0x8130B830}, - {0x02D2, 0x8130B831}, - {0x02D3, 0x8130B832}, - {0x02D4, 0x8130B833}, - {0x02D5, 0x8130B834}, - {0x02D6, 0x8130B835}, - {0x02D7, 0x8130B836}, - {0x02D8, 0x8130B837}, - {0x02DA, 0x8130B838}, - {0x02DB, 0x8130B839}, - {0x02DC, 0x8130B930}, - {0x02DD, 0x8130B931}, - {0x02DE, 0x8130B932}, - {0x02DF, 0x8130B933}, - {0x02E0, 0x8130B934}, - {0x02E1, 0x8130B935}, - {0x02E2, 0x8130B936}, - {0x02E3, 0x8130B937}, - {0x02E4, 0x8130B938}, - {0x02E5, 0x8130B939}, - {0x02E6, 0x8130BA30}, - {0x02E7, 0x8130BA31}, - {0x02E8, 0x8130BA32}, - {0x02E9, 0x8130BA33}, - {0x02EA, 0x8130BA34}, - {0x02EB, 0x8130BA35}, - {0x02EC, 0x8130BA36}, - {0x02ED, 0x8130BA37}, - {0x02EE, 0x8130BA38}, - {0x02EF, 0x8130BA39}, - {0x02F0, 0x8130BB30}, - {0x02F1, 0x8130BB31}, - {0x02F2, 0x8130BB32}, - {0x02F3, 0x8130BB33}, - {0x02F4, 0x8130BB34}, - {0x02F5, 0x8130BB35}, - {0x02F6, 0x8130BB36}, - {0x02F7, 0x8130BB37}, - {0x02F8, 0x8130BB38}, - {0x02F9, 0x8130BB39}, - {0x02FA, 0x8130BC30}, - {0x02FB, 0x8130BC31}, - {0x02FC, 0x8130BC32}, - {0x02FD, 0x8130BC33}, - {0x02FE, 0x8130BC34}, - {0x02FF, 0x8130BC35}, - {0x0300, 0x8130BC36}, - {0x0301, 0x8130BC37}, - {0x0302, 0x8130BC38}, - {0x0303, 0x8130BC39}, - {0x0304, 0x8130BD30}, - {0x0305, 0x8130BD31}, - {0x0306, 0x8130BD32}, - {0x0307, 0x8130BD33}, - {0x0308, 0x8130BD34}, - {0x0309, 0x8130BD35}, - {0x030A, 0x8130BD36}, - {0x030B, 0x8130BD37}, - {0x030C, 0x8130BD38}, - {0x030D, 0x8130BD39}, - {0x030E, 0x8130BE30}, - {0x030F, 0x8130BE31}, - {0x0310, 0x8130BE32}, - {0x0311, 0x8130BE33}, - {0x0312, 0x8130BE34}, - {0x0313, 0x8130BE35}, - {0x0314, 0x8130BE36}, - {0x0315, 0x8130BE37}, - {0x0316, 0x8130BE38}, - {0x0317, 0x8130BE39}, - {0x0318, 0x8130BF30}, - {0x0319, 0x8130BF31}, - {0x031A, 0x8130BF32}, - {0x031B, 0x8130BF33}, - {0x031C, 0x8130BF34}, - {0x031D, 0x8130BF35}, - {0x031E, 0x8130BF36}, - {0x031F, 0x8130BF37}, - {0x0320, 0x8130BF38}, - {0x0321, 0x8130BF39}, - {0x0322, 0x8130C030}, - {0x0323, 0x8130C031}, - {0x0324, 0x8130C032}, - {0x0325, 0x8130C033}, - {0x0326, 0x8130C034}, - {0x0327, 0x8130C035}, - {0x0328, 0x8130C036}, - {0x0329, 0x8130C037}, - {0x032A, 0x8130C038}, - {0x032B, 0x8130C039}, - {0x032C, 0x8130C130}, - {0x032D, 0x8130C131}, - {0x032E, 0x8130C132}, - {0x032F, 0x8130C133}, - {0x0330, 0x8130C134}, - {0x0331, 0x8130C135}, - {0x0332, 0x8130C136}, - {0x0333, 0x8130C137}, - {0x0334, 0x8130C138}, - {0x0335, 0x8130C139}, - {0x0336, 0x8130C230}, - {0x0337, 0x8130C231}, - {0x0338, 0x8130C232}, - {0x0339, 0x8130C233}, - {0x033A, 0x8130C234}, - {0x033B, 0x8130C235}, - {0x033C, 0x8130C236}, - {0x033D, 0x8130C237}, - {0x033E, 0x8130C238}, - {0x033F, 0x8130C239}, - {0x0340, 0x8130C330}, - {0x0341, 0x8130C331}, - {0x0342, 0x8130C332}, - {0x0343, 0x8130C333}, - {0x0344, 0x8130C334}, - {0x0345, 0x8130C335}, - {0x0346, 0x8130C336}, - {0x0347, 0x8130C337}, - {0x0348, 0x8130C338}, - {0x0349, 0x8130C339}, - {0x034A, 0x8130C430}, - {0x034B, 0x8130C431}, - {0x034C, 0x8130C432}, - {0x034D, 0x8130C433}, - {0x034E, 0x8130C434}, - {0x034F, 0x8130C435}, - {0x0350, 0x8130C436}, - {0x0351, 0x8130C437}, - {0x0352, 0x8130C438}, - {0x0353, 0x8130C439}, - {0x0354, 0x8130C530}, - {0x0355, 0x8130C531}, - {0x0356, 0x8130C532}, - {0x0357, 0x8130C533}, - {0x0358, 0x8130C534}, - {0x0359, 0x8130C535}, - {0x035A, 0x8130C536}, - {0x035B, 0x8130C537}, - {0x035C, 0x8130C538}, - {0x035D, 0x8130C539}, - {0x035E, 0x8130C630}, - {0x035F, 0x8130C631}, - {0x0360, 0x8130C632}, - {0x0361, 0x8130C633}, - {0x0362, 0x8130C634}, - {0x0363, 0x8130C635}, - {0x0364, 0x8130C636}, - {0x0365, 0x8130C637}, - {0x0366, 0x8130C638}, - {0x0367, 0x8130C639}, - {0x0368, 0x8130C730}, - {0x0369, 0x8130C731}, - {0x036A, 0x8130C732}, - {0x036B, 0x8130C733}, - {0x036C, 0x8130C734}, - {0x036D, 0x8130C735}, - {0x036E, 0x8130C736}, - {0x036F, 0x8130C737}, - {0x0370, 0x8130C738}, - {0x0371, 0x8130C739}, - {0x0372, 0x8130C830}, - {0x0373, 0x8130C831}, - {0x0374, 0x8130C832}, - {0x0375, 0x8130C833}, - {0x0376, 0x8130C834}, - {0x0377, 0x8130C835}, - {0x0378, 0x8130C836}, - {0x0379, 0x8130C837}, - {0x037A, 0x8130C838}, - {0x037B, 0x8130C839}, - {0x037C, 0x8130C930}, - {0x037D, 0x8130C931}, - {0x037E, 0x8130C932}, - {0x037F, 0x8130C933}, - {0x0380, 0x8130C934}, - {0x0381, 0x8130C935}, - {0x0382, 0x8130C936}, - {0x0383, 0x8130C937}, - {0x0384, 0x8130C938}, - {0x0385, 0x8130C939}, - {0x0386, 0x8130CA30}, - {0x0387, 0x8130CA31}, - {0x0388, 0x8130CA32}, - {0x0389, 0x8130CA33}, - {0x038A, 0x8130CA34}, - {0x038B, 0x8130CA35}, - {0x038C, 0x8130CA36}, - {0x038D, 0x8130CA37}, - {0x038E, 0x8130CA38}, - {0x038F, 0x8130CA39}, - {0x0390, 0x8130CB30}, - {0x03A2, 0x8130CB31}, - {0x03AA, 0x8130CB32}, - {0x03AB, 0x8130CB33}, - {0x03AC, 0x8130CB34}, - {0x03AD, 0x8130CB35}, - {0x03AE, 0x8130CB36}, - {0x03AF, 0x8130CB37}, - {0x03B0, 0x8130CB38}, - {0x03C2, 0x8130CB39}, - {0x03CA, 0x8130CC30}, - {0x03CB, 0x8130CC31}, - {0x03CC, 0x8130CC32}, - {0x03CD, 0x8130CC33}, - {0x03CE, 0x8130CC34}, - {0x03CF, 0x8130CC35}, - {0x03D0, 0x8130CC36}, - {0x03D1, 0x8130CC37}, - {0x03D2, 0x8130CC38}, - {0x03D3, 0x8130CC39}, - {0x03D4, 0x8130CD30}, - {0x03D5, 0x8130CD31}, - {0x03D6, 0x8130CD32}, - {0x03D7, 0x8130CD33}, - {0x03D8, 0x8130CD34}, - {0x03D9, 0x8130CD35}, - {0x03DA, 0x8130CD36}, - {0x03DB, 0x8130CD37}, - {0x03DC, 0x8130CD38}, - {0x03DD, 0x8130CD39}, - {0x03DE, 0x8130CE30}, - {0x03DF, 0x8130CE31}, - {0x03E0, 0x8130CE32}, - {0x03E1, 0x8130CE33}, - {0x03E2, 0x8130CE34}, - {0x03E3, 0x8130CE35}, - {0x03E4, 0x8130CE36}, - {0x03E5, 0x8130CE37}, - {0x03E6, 0x8130CE38}, - {0x03E7, 0x8130CE39}, - {0x03E8, 0x8130CF30}, - {0x03E9, 0x8130CF31}, - {0x03EA, 0x8130CF32}, - {0x03EB, 0x8130CF33}, - {0x03EC, 0x8130CF34}, - {0x03ED, 0x8130CF35}, - {0x03EE, 0x8130CF36}, - {0x03EF, 0x8130CF37}, - {0x03F0, 0x8130CF38}, - {0x03F1, 0x8130CF39}, - {0x03F2, 0x8130D030}, - {0x03F3, 0x8130D031}, - {0x03F4, 0x8130D032}, - {0x03F5, 0x8130D033}, - {0x03F6, 0x8130D034}, - {0x03F7, 0x8130D035}, - {0x03F8, 0x8130D036}, - {0x03F9, 0x8130D037}, - {0x03FA, 0x8130D038}, - {0x03FB, 0x8130D039}, - {0x03FC, 0x8130D130}, - {0x03FD, 0x8130D131}, - {0x03FE, 0x8130D132}, - {0x03FF, 0x8130D133}, - {0x0400, 0x8130D134}, - {0x0402, 0x8130D135}, - {0x0403, 0x8130D136}, - {0x0404, 0x8130D137}, - {0x0405, 0x8130D138}, - {0x0406, 0x8130D139}, - {0x0407, 0x8130D230}, - {0x0408, 0x8130D231}, - {0x0409, 0x8130D232}, - {0x040A, 0x8130D233}, - {0x040B, 0x8130D234}, - {0x040C, 0x8130D235}, - {0x040D, 0x8130D236}, - {0x040E, 0x8130D237}, - {0x040F, 0x8130D238}, - {0x0450, 0x8130D239}, - {0x2011, 0x8136A532}, - {0x2012, 0x8136A533}, - {0x2017, 0x8136A534}, - {0x201A, 0x8136A535}, - {0x201B, 0x8136A536}, - {0x201E, 0x8136A537}, - {0x201F, 0x8136A538}, - {0x2020, 0x8136A539}, - {0x2021, 0x8136A630}, - {0x2022, 0x8136A631}, - {0x2023, 0x8136A632}, - {0x2024, 0x8136A633}, - {0x2027, 0x8136A634}, - {0x2028, 0x8136A635}, - {0x2029, 0x8136A636}, - {0x202A, 0x8136A637}, - {0x202B, 0x8136A638}, - {0x202C, 0x8136A639}, - {0x202D, 0x8136A730}, - {0x202E, 0x8136A731}, - {0x202F, 0x8136A732}, - {0x2031, 0x8136A733}, - {0x2034, 0x8136A734}, - {0x2036, 0x8136A735}, - {0x2037, 0x8136A736}, - {0x2038, 0x8136A737}, - {0x2039, 0x8136A738}, - {0x203A, 0x8136A739}, - {0x203C, 0x8136A830}, - {0x203D, 0x8136A831}, - {0x203E, 0x8136A832}, - {0x203F, 0x8136A833}, - {0x2040, 0x8136A834}, - {0x2041, 0x8136A835}, - {0x2042, 0x8136A836}, - {0x2043, 0x8136A837}, - {0x2044, 0x8136A838}, - {0x2045, 0x8136A839}, - {0x2046, 0x8136A930}, - {0x2047, 0x8136A931}, - {0x2048, 0x8136A932}, - {0x2049, 0x8136A933}, - {0x204A, 0x8136A934}, - {0x204B, 0x8136A935}, - {0x204C, 0x8136A936}, - {0x204D, 0x8136A937}, - {0x204E, 0x8136A938}, - {0x204F, 0x8136A939}, - {0x2050, 0x8136AA30}, - {0x2051, 0x8136AA31}, - {0x2052, 0x8136AA32}, - {0x2053, 0x8136AA33}, - {0x2054, 0x8136AA34}, - {0x2055, 0x8136AA35}, - {0x2056, 0x8136AA36}, - {0x2057, 0x8136AA37}, - {0x2058, 0x8136AA38}, - {0x2059, 0x8136AA39}, - {0x205A, 0x8136AB30}, - {0x205B, 0x8136AB31}, - {0x205C, 0x8136AB32}, - {0x205D, 0x8136AB33}, - {0x205E, 0x8136AB34}, - {0x205F, 0x8136AB35}, - {0x2060, 0x8136AB36}, - {0x2061, 0x8136AB37}, - {0x2062, 0x8136AB38}, - {0x2063, 0x8136AB39}, - {0x2064, 0x8136AC30}, - {0x2065, 0x8136AC31}, - {0x2066, 0x8136AC32}, - {0x2067, 0x8136AC33}, - {0x2068, 0x8136AC34}, - {0x2069, 0x8136AC35}, - {0x206A, 0x8136AC36}, - {0x206B, 0x8136AC37}, - {0x206C, 0x8136AC38}, - {0x206D, 0x8136AC39}, - {0x206E, 0x8136AD30}, - {0x206F, 0x8136AD31}, - {0x2070, 0x8136AD32}, - {0x2071, 0x8136AD33}, - {0x2072, 0x8136AD34}, - {0x2073, 0x8136AD35}, - {0x2074, 0x8136AD36}, - {0x2075, 0x8136AD37}, - {0x2076, 0x8136AD38}, - {0x2077, 0x8136AD39}, - {0x2078, 0x8136AE30}, - {0x2079, 0x8136AE31}, - {0x207A, 0x8136AE32}, - {0x207B, 0x8136AE33}, - {0x207C, 0x8136AE34}, - {0x207D, 0x8136AE35}, - {0x207E, 0x8136AE36}, - {0x207F, 0x8136AE37}, - {0x2080, 0x8136AE38}, - {0x2081, 0x8136AE39}, - {0x2082, 0x8136AF30}, - {0x2083, 0x8136AF31}, - {0x2084, 0x8136AF32}, - {0x2085, 0x8136AF33}, - {0x2086, 0x8136AF34}, - {0x2087, 0x8136AF35}, - {0x2088, 0x8136AF36}, - {0x2089, 0x8136AF37}, - {0x208A, 0x8136AF38}, - {0x208B, 0x8136AF39}, - {0x208C, 0x8136B030}, - {0x208D, 0x8136B031}, - {0x208E, 0x8136B032}, - {0x208F, 0x8136B033}, - {0x2090, 0x8136B034}, - {0x2091, 0x8136B035}, - {0x2092, 0x8136B036}, - {0x2093, 0x8136B037}, - {0x2094, 0x8136B038}, - {0x2095, 0x8136B039}, - {0x2096, 0x8136B130}, - {0x2097, 0x8136B131}, - {0x2098, 0x8136B132}, - {0x2099, 0x8136B133}, - {0x209A, 0x8136B134}, - {0x209B, 0x8136B135}, - {0x209C, 0x8136B136}, - {0x209D, 0x8136B137}, - {0x209E, 0x8136B138}, - {0x209F, 0x8136B139}, - {0x20A0, 0x8136B230}, - {0x20A1, 0x8136B231}, - {0x20A2, 0x8136B232}, - {0x20A3, 0x8136B233}, - {0x20A4, 0x8136B234}, - {0x20A5, 0x8136B235}, - {0x20A6, 0x8136B236}, - {0x20A7, 0x8136B237}, - {0x20A8, 0x8136B238}, - {0x20A9, 0x8136B239}, - {0x20AA, 0x8136B330}, - {0x20AB, 0x8136B331}, - {0x20AD, 0x8136B332}, - {0x20AE, 0x8136B333}, - {0x20AF, 0x8136B334}, - {0x20B0, 0x8136B335}, - {0x20B1, 0x8136B336}, - {0x20B2, 0x8136B337}, - {0x20B3, 0x8136B338}, - {0x20B4, 0x8136B339}, - {0x20B5, 0x8136B430}, - {0x20B6, 0x8136B431}, - {0x20B7, 0x8136B432}, - {0x20B8, 0x8136B433}, - {0x20B9, 0x8136B434}, - {0x20BA, 0x8136B435}, - {0x20BB, 0x8136B436}, - {0x20BC, 0x8136B437}, - {0x20BD, 0x8136B438}, - {0x20BE, 0x8136B439}, - {0x20BF, 0x8136B530}, - {0x20C0, 0x8136B531}, - {0x20C1, 0x8136B532}, - {0x20C2, 0x8136B533}, - {0x20C3, 0x8136B534}, - {0x20C4, 0x8136B535}, - {0x20C5, 0x8136B536}, - {0x20C6, 0x8136B537}, - {0x20C7, 0x8136B538}, - {0x20C8, 0x8136B539}, - {0x20C9, 0x8136B630}, - {0x20CA, 0x8136B631}, - {0x20CB, 0x8136B632}, - {0x20CC, 0x8136B633}, - {0x20CD, 0x8136B634}, - {0x20CE, 0x8136B635}, - {0x20CF, 0x8136B636}, - {0x20D0, 0x8136B637}, - {0x20D1, 0x8136B638}, - {0x20D2, 0x8136B639}, - {0x20D3, 0x8136B730}, - {0x20D4, 0x8136B731}, - {0x20D5, 0x8136B732}, - {0x20D6, 0x8136B733}, - {0x20D7, 0x8136B734}, - {0x20D8, 0x8136B735}, - {0x20D9, 0x8136B736}, - {0x20DA, 0x8136B737}, - {0x20DB, 0x8136B738}, - {0x20DC, 0x8136B739}, - {0x20DD, 0x8136B830}, - {0x20DE, 0x8136B831}, - {0x20DF, 0x8136B832}, - {0x20E0, 0x8136B833}, - {0x20E1, 0x8136B834}, - {0x20E2, 0x8136B835}, - {0x20E3, 0x8136B836}, - {0x20E4, 0x8136B837}, - {0x20E5, 0x8136B838}, - {0x20E6, 0x8136B839}, - {0x20E7, 0x8136B930}, - {0x20E8, 0x8136B931}, - {0x20E9, 0x8136B932}, - {0x20EA, 0x8136B933}, - {0x20EB, 0x8136B934}, - {0x20EC, 0x8136B935}, - {0x20ED, 0x8136B936}, - {0x20EE, 0x8136B937}, - {0x20EF, 0x8136B938}, - {0x20F0, 0x8136B939}, - {0x20F1, 0x8136BA30}, - {0x20F2, 0x8136BA31}, - {0x20F3, 0x8136BA32}, - {0x20F4, 0x8136BA33}, - {0x20F5, 0x8136BA34}, - {0x20F6, 0x8136BA35}, - {0x20F7, 0x8136BA36}, - {0x20F8, 0x8136BA37}, - {0x20F9, 0x8136BA38}, - {0x20FA, 0x8136BA39}, - {0x20FB, 0x8136BB30}, - {0x20FC, 0x8136BB31}, - {0x20FD, 0x8136BB32}, - {0x20FE, 0x8136BB33}, - {0x20FF, 0x8136BB34}, - {0x2100, 0x8136BB35}, - {0x2101, 0x8136BB36}, - {0x2102, 0x8136BB37}, - {0x2104, 0x8136BB38}, - {0x2106, 0x8136BB39}, - {0x2107, 0x8136BC30}, - {0x2108, 0x8136BC31}, - {0x210A, 0x8136BC32}, - {0x210B, 0x8136BC33}, - {0x210C, 0x8136BC34}, - {0x210D, 0x8136BC35}, - {0x210E, 0x8136BC36}, - {0x210F, 0x8136BC37}, - {0x2110, 0x8136BC38}, - {0x2111, 0x8136BC39}, - {0x2112, 0x8136BD30}, - {0x2113, 0x8136BD31}, - {0x2114, 0x8136BD32}, - {0x2115, 0x8136BD33}, - {0x2117, 0x8136BD34}, - {0x2118, 0x8136BD35}, - {0x2119, 0x8136BD36}, - {0x211A, 0x8136BD37}, - {0x211B, 0x8136BD38}, - {0x211C, 0x8136BD39}, - {0x211D, 0x8136BE30}, - {0x211E, 0x8136BE31}, - {0x211F, 0x8136BE32}, - {0x2120, 0x8136BE33}, - {0x2122, 0x8136BE34}, - {0x2123, 0x8136BE35}, - {0x2124, 0x8136BE36}, - {0x2125, 0x8136BE37}, - {0x2126, 0x8136BE38}, - {0x2127, 0x8136BE39}, - {0x2128, 0x8136BF30}, - {0x2129, 0x8136BF31}, - {0x212A, 0x8136BF32}, - {0x212B, 0x8136BF33}, - {0x212C, 0x8136BF34}, - {0x212D, 0x8136BF35}, - {0x212E, 0x8136BF36}, - {0x212F, 0x8136BF37}, - {0x2130, 0x8136BF38}, - {0x2131, 0x8136BF39}, - {0x2132, 0x8136C030}, - {0x2133, 0x8136C031}, - {0x2134, 0x8136C032}, - {0x2135, 0x8136C033}, - {0x2136, 0x8136C034}, - {0x2137, 0x8136C035}, - {0x2138, 0x8136C036}, - {0x2139, 0x8136C037}, - {0x213A, 0x8136C038}, - {0x213B, 0x8136C039}, - {0x213C, 0x8136C130}, - {0x213D, 0x8136C131}, - {0x213E, 0x8136C132}, - {0x213F, 0x8136C133}, - {0x2140, 0x8136C134}, - {0x2141, 0x8136C135}, - {0x2142, 0x8136C136}, - {0x2143, 0x8136C137}, - {0x2144, 0x8136C138}, - {0x2145, 0x8136C139}, - {0x2146, 0x8136C230}, - {0x2147, 0x8136C231}, - {0x2148, 0x8136C232}, - {0x2149, 0x8136C233}, - {0x214A, 0x8136C234}, - {0x214B, 0x8136C235}, - {0x214C, 0x8136C236}, - {0x214D, 0x8136C237}, - {0x214E, 0x8136C238}, - {0x214F, 0x8136C239}, - {0x2150, 0x8136C330}, - {0x2151, 0x8136C331}, - {0x2152, 0x8136C332}, - {0x2153, 0x8136C333}, - {0x2154, 0x8136C334}, - {0x2155, 0x8136C335}, - {0x2156, 0x8136C336}, - {0x2157, 0x8136C337}, - {0x2158, 0x8136C338}, - {0x2159, 0x8136C339}, - {0x215A, 0x8136C430}, - {0x215B, 0x8136C431}, - {0x215C, 0x8136C432}, - {0x215D, 0x8136C433}, - {0x215E, 0x8136C434}, - {0x215F, 0x8136C435}, - {0x216C, 0x8136C436}, - {0x216D, 0x8136C437}, - {0x216E, 0x8136C438}, - {0x216F, 0x8136C439}, - {0x217A, 0x8136C530}, - {0x217B, 0x8136C531}, - {0x217C, 0x8136C532}, - {0x217D, 0x8136C533}, - {0x217E, 0x8136C534}, - {0x217F, 0x8136C535}, - {0x2180, 0x8136C536}, - {0x2181, 0x8136C537}, - {0x2182, 0x8136C538}, - {0x2183, 0x8136C539}, - {0x2184, 0x8136C630}, - {0x2185, 0x8136C631}, - {0x2186, 0x8136C632}, - {0x2187, 0x8136C633}, - {0x2188, 0x8136C634}, - {0x2189, 0x8136C635}, - {0x218A, 0x8136C636}, - {0x218B, 0x8136C637}, - {0x218C, 0x8136C638}, - {0x218D, 0x8136C639}, - {0x218E, 0x8136C730}, - {0x218F, 0x8136C731}, - {0x2194, 0x8136C732}, - {0x2195, 0x8136C733}, - {0x219A, 0x8136C734}, - {0x219B, 0x8136C735}, - {0x219C, 0x8136C736}, - {0x219D, 0x8136C737}, - {0x219E, 0x8136C738}, - {0x219F, 0x8136C739}, - {0x21A0, 0x8136C830}, - {0x21A1, 0x8136C831}, - {0x21A2, 0x8136C832}, - {0x21A3, 0x8136C833}, - {0x21A4, 0x8136C834}, - {0x21A5, 0x8136C835}, - {0x21A6, 0x8136C836}, - {0x21A7, 0x8136C837}, - {0x21A8, 0x8136C838}, - {0x21A9, 0x8136C839}, - {0x21AA, 0x8136C930}, - {0x21AB, 0x8136C931}, - {0x21AC, 0x8136C932}, - {0x21AD, 0x8136C933}, - {0x21AE, 0x8136C934}, - {0x21AF, 0x8136C935}, - {0x21B0, 0x8136C936}, - {0x21B1, 0x8136C937}, - {0x21B2, 0x8136C938}, - {0x21B3, 0x8136C939}, - {0x21B4, 0x8136CA30}, - {0x21B5, 0x8136CA31}, - {0x21B6, 0x8136CA32}, - {0x21B7, 0x8136CA33}, - {0x21B8, 0x8136CA34}, - {0x21B9, 0x8136CA35}, - {0x21BA, 0x8136CA36}, - {0x21BB, 0x8136CA37}, - {0x21BC, 0x8136CA38}, - {0x21BD, 0x8136CA39}, - {0x21BE, 0x8136CB30}, - {0x21BF, 0x8136CB31}, - {0x21C0, 0x8136CB32}, - {0x21C1, 0x8136CB33}, - {0x21C2, 0x8136CB34}, - {0x21C3, 0x8136CB35}, - {0x21C4, 0x8136CB36}, - {0x21C5, 0x8136CB37}, - {0x21C6, 0x8136CB38}, - {0x21C7, 0x8136CB39}, - {0x21C8, 0x8136CC30}, - {0x21C9, 0x8136CC31}, - {0x21CA, 0x8136CC32}, - {0x21CB, 0x8136CC33}, - {0x21CC, 0x8136CC34}, - {0x21CD, 0x8136CC35}, - {0x21CE, 0x8136CC36}, - {0x21CF, 0x8136CC37}, - {0x21D0, 0x8136CC38}, - {0x21D1, 0x8136CC39}, - {0x21D2, 0x8136CD30}, - {0x21D3, 0x8136CD31}, - {0x21D4, 0x8136CD32}, - {0x21D5, 0x8136CD33}, - {0x21D6, 0x8136CD34}, - {0x21D7, 0x8136CD35}, - {0x21D8, 0x8136CD36}, - {0x21D9, 0x8136CD37}, - {0x21DA, 0x8136CD38}, - {0x21DB, 0x8136CD39}, - {0x21DC, 0x8136CE30}, - {0x21DD, 0x8136CE31}, - {0x21DE, 0x8136CE32}, - {0x21DF, 0x8136CE33}, - {0x21E0, 0x8136CE34}, - {0x21E1, 0x8136CE35}, - {0x21E2, 0x8136CE36}, - {0x21E3, 0x8136CE37}, - {0x21E4, 0x8136CE38}, - {0x21E5, 0x8136CE39}, - {0x21E6, 0x8136CF30}, - {0x21E7, 0x8136CF31}, - {0x21E8, 0x8136CF32}, - {0x21E9, 0x8136CF33}, - {0x21EA, 0x8136CF34}, - {0x21EB, 0x8136CF35}, - {0x21EC, 0x8136CF36}, - {0x21ED, 0x8136CF37}, - {0x21EE, 0x8136CF38}, - {0x21EF, 0x8136CF39}, - {0x21F0, 0x8136D030}, - {0x21F1, 0x8136D031}, - {0x21F2, 0x8136D032}, - {0x21F3, 0x8136D033}, - {0x21F4, 0x8136D034}, - {0x21F5, 0x8136D035}, - {0x21F6, 0x8136D036}, - {0x21F7, 0x8136D037}, - {0x21F8, 0x8136D038}, - {0x21F9, 0x8136D039}, - {0x21FA, 0x8136D130}, - {0x21FB, 0x8136D131}, - {0x21FC, 0x8136D132}, - {0x21FD, 0x8136D133}, - {0x21FE, 0x8136D134}, - {0x21FF, 0x8136D135}, - {0x2200, 0x8136D136}, - {0x2201, 0x8136D137}, - {0x2202, 0x8136D138}, - {0x2203, 0x8136D139}, - {0x2204, 0x8136D230}, - {0x2205, 0x8136D231}, - {0x2206, 0x8136D232}, - {0x2207, 0x8136D233}, - {0x2209, 0x8136D234}, - {0x220A, 0x8136D235}, - {0x220B, 0x8136D236}, - {0x220C, 0x8136D237}, - {0x220D, 0x8136D238}, - {0x220E, 0x8136D239}, - {0x2210, 0x8136D330}, - {0x2212, 0x8136D331}, - {0x2213, 0x8136D332}, - {0x2214, 0x8136D333}, - {0x2216, 0x8136D334}, - {0x2217, 0x8136D335}, - {0x2218, 0x8136D336}, - {0x2219, 0x8136D337}, - {0x221B, 0x8136D338}, - {0x221C, 0x8136D339}, - {0x2221, 0x8136D430}, - {0x2222, 0x8136D431}, - {0x2224, 0x8136D432}, - {0x2226, 0x8136D433}, - {0x222C, 0x8136D434}, - {0x222D, 0x8136D435}, - {0x222F, 0x8136D436}, - {0x2230, 0x8136D437}, - {0x2231, 0x8136D438}, - {0x2232, 0x8136D439}, - {0x2233, 0x8136D530}, - {0x2238, 0x8136D531}, - {0x2239, 0x8136D532}, - {0x223A, 0x8136D533}, - {0x223B, 0x8136D534}, - {0x223C, 0x8136D535}, - {0x223E, 0x8136D536}, - {0x223F, 0x8136D537}, - {0x2240, 0x8136D538}, - {0x2241, 0x8136D539}, - {0x2242, 0x8136D630}, - {0x2243, 0x8136D631}, - {0x2244, 0x8136D632}, - {0x2245, 0x8136D633}, - {0x2246, 0x8136D634}, - {0x2247, 0x8136D635}, - {0x2249, 0x8136D636}, - {0x224A, 0x8136D637}, - {0x224B, 0x8136D638}, - {0x224D, 0x8136D639}, - {0x224E, 0x8136D730}, - {0x224F, 0x8136D731}, - {0x2250, 0x8136D732}, - {0x2251, 0x8136D733}, - {0x2253, 0x8136D734}, - {0x2254, 0x8136D735}, - {0x2255, 0x8136D736}, - {0x2256, 0x8136D737}, - {0x2257, 0x8136D738}, - {0x2258, 0x8136D739}, - {0x2259, 0x8136D830}, - {0x225A, 0x8136D831}, - {0x225B, 0x8136D832}, - {0x225C, 0x8136D833}, - {0x225D, 0x8136D834}, - {0x225E, 0x8136D835}, - {0x225F, 0x8136D836}, - {0x2262, 0x8136D837}, - {0x2263, 0x8136D838}, - {0x2268, 0x8136D839}, - {0x2269, 0x8136D930}, - {0x226A, 0x8136D931}, - {0x226B, 0x8136D932}, - {0x226C, 0x8136D933}, - {0x226D, 0x8136D934}, - {0x2270, 0x8136D935}, - {0x2271, 0x8136D936}, - {0x2272, 0x8136D937}, - {0x2273, 0x8136D938}, - {0x2274, 0x8136D939}, - {0x2275, 0x8136DA30}, - {0x2276, 0x8136DA31}, - {0x2277, 0x8136DA32}, - {0x2278, 0x8136DA33}, - {0x2279, 0x8136DA34}, - {0x227A, 0x8136DA35}, - {0x227B, 0x8136DA36}, - {0x227C, 0x8136DA37}, - {0x227D, 0x8136DA38}, - {0x227E, 0x8136DA39}, - {0x227F, 0x8136DB30}, - {0x2280, 0x8136DB31}, - {0x2281, 0x8136DB32}, - {0x2282, 0x8136DB33}, - {0x2283, 0x8136DB34}, - {0x2284, 0x8136DB35}, - {0x2285, 0x8136DB36}, - {0x2286, 0x8136DB37}, - {0x2287, 0x8136DB38}, - {0x2288, 0x8136DB39}, - {0x2289, 0x8136DC30}, - {0x228A, 0x8136DC31}, - {0x228B, 0x8136DC32}, - {0x228C, 0x8136DC33}, - {0x228D, 0x8136DC34}, - {0x228E, 0x8136DC35}, - {0x228F, 0x8136DC36}, - {0x2290, 0x8136DC37}, - {0x2291, 0x8136DC38}, - {0x2292, 0x8136DC39}, - {0x2293, 0x8136DD30}, - {0x2294, 0x8136DD31}, - {0x2296, 0x8136DD32}, - {0x2297, 0x8136DD33}, - {0x2298, 0x8136DD34}, - {0x229A, 0x8136DD35}, - {0x229B, 0x8136DD36}, - {0x229C, 0x8136DD37}, - {0x229D, 0x8136DD38}, - {0x229E, 0x8136DD39}, - {0x229F, 0x8136DE30}, - {0x22A0, 0x8136DE31}, - {0x22A1, 0x8136DE32}, - {0x22A2, 0x8136DE33}, - {0x22A3, 0x8136DE34}, - {0x22A4, 0x8136DE35}, - {0x22A6, 0x8136DE36}, - {0x22A7, 0x8136DE37}, - {0x22A8, 0x8136DE38}, - {0x22A9, 0x8136DE39}, - {0x22AA, 0x8136DF30}, - {0x22AB, 0x8136DF31}, - {0x22AC, 0x8136DF32}, - {0x22AD, 0x8136DF33}, - {0x22AE, 0x8136DF34}, - {0x22AF, 0x8136DF35}, - {0x22B0, 0x8136DF36}, - {0x22B1, 0x8136DF37}, - {0x22B2, 0x8136DF38}, - {0x22B3, 0x8136DF39}, - {0x22B4, 0x8136E030}, - {0x22B5, 0x8136E031}, - {0x22B6, 0x8136E032}, - {0x22B7, 0x8136E033}, - {0x22B8, 0x8136E034}, - {0x22B9, 0x8136E035}, - {0x22BA, 0x8136E036}, - {0x22BB, 0x8136E037}, - {0x22BC, 0x8136E038}, - {0x22BD, 0x8136E039}, - {0x22BE, 0x8136E130}, - {0x22C0, 0x8136E131}, - {0x22C1, 0x8136E132}, - {0x22C2, 0x8136E133}, - {0x22C3, 0x8136E134}, - {0x22C4, 0x8136E135}, - {0x22C5, 0x8136E136}, - {0x22C6, 0x8136E137}, - {0x22C7, 0x8136E138}, - {0x22C8, 0x8136E139}, - {0x22C9, 0x8136E230}, - {0x22CA, 0x8136E231}, - {0x22CB, 0x8136E232}, - {0x22CC, 0x8136E233}, - {0x22CD, 0x8136E234}, - {0x22CE, 0x8136E235}, - {0x22CF, 0x8136E236}, - {0x22D0, 0x8136E237}, - {0x22D1, 0x8136E238}, - {0x22D2, 0x8136E239}, - {0x22D3, 0x8136E330}, - {0x22D4, 0x8136E331}, - {0x22D5, 0x8136E332}, - {0x22D6, 0x8136E333}, - {0x22D7, 0x8136E334}, - {0x22D8, 0x8136E335}, - {0x22D9, 0x8136E336}, - {0x22DA, 0x8136E337}, - {0x22DB, 0x8136E338}, - {0x22DC, 0x8136E339}, - {0x22DD, 0x8136E430}, - {0x22DE, 0x8136E431}, - {0x22DF, 0x8136E432}, - {0x22E0, 0x8136E433}, - {0x22E1, 0x8136E434}, - {0x22E2, 0x8136E435}, - {0x22E3, 0x8136E436}, - {0x22E4, 0x8136E437}, - {0x22E5, 0x8136E438}, - {0x22E6, 0x8136E439}, - {0x22E7, 0x8136E530}, - {0x22E8, 0x8136E531}, - {0x22E9, 0x8136E532}, - {0x22EA, 0x8136E533}, - {0x22EB, 0x8136E534}, - {0x22EC, 0x8136E535}, - {0x22ED, 0x8136E536}, - {0x22EE, 0x8136E537}, - {0x22EF, 0x8136E538}, - {0x22F0, 0x8136E539}, - {0x22F1, 0x8136E630}, - {0x22F2, 0x8136E631}, - {0x22F3, 0x8136E632}, - {0x22F4, 0x8136E633}, - {0x22F5, 0x8136E634}, - {0x22F6, 0x8136E635}, - {0x22F7, 0x8136E636}, - {0x22F8, 0x8136E637}, - {0x22F9, 0x8136E638}, - {0x22FA, 0x8136E639}, - {0x22FB, 0x8136E730}, - {0x22FC, 0x8136E731}, - {0x22FD, 0x8136E732}, - {0x22FE, 0x8136E733}, - {0x22FF, 0x8136E734}, - {0x2300, 0x8136E735}, - {0x2301, 0x8136E736}, - {0x2302, 0x8136E737}, - {0x2303, 0x8136E738}, - {0x2304, 0x8136E739}, - {0x2305, 0x8136E830}, - {0x2306, 0x8136E831}, - {0x2307, 0x8136E832}, - {0x2308, 0x8136E833}, - {0x2309, 0x8136E834}, - {0x230A, 0x8136E835}, - {0x230B, 0x8136E836}, - {0x230C, 0x8136E837}, - {0x230D, 0x8136E838}, - {0x230E, 0x8136E839}, - {0x230F, 0x8136E930}, - {0x2310, 0x8136E931}, - {0x2311, 0x8136E932}, - {0x2313, 0x8136E933}, - {0x2314, 0x8136E934}, - {0x2315, 0x8136E935}, - {0x2316, 0x8136E936}, - {0x2317, 0x8136E937}, - {0x2318, 0x8136E938}, - {0x2319, 0x8136E939}, - {0x231A, 0x8136EA30}, - {0x231B, 0x8136EA31}, - {0x231C, 0x8136EA32}, - {0x231D, 0x8136EA33}, - {0x231E, 0x8136EA34}, - {0x231F, 0x8136EA35}, - {0x2320, 0x8136EA36}, - {0x2321, 0x8136EA37}, - {0x2322, 0x8136EA38}, - {0x2323, 0x8136EA39}, - {0x2324, 0x8136EB30}, - {0x2325, 0x8136EB31}, - {0x2326, 0x8136EB32}, - {0x2327, 0x8136EB33}, - {0x2328, 0x8136EB34}, - {0x2329, 0x8136EB35}, - {0x232A, 0x8136EB36}, - {0x232B, 0x8136EB37}, - {0x232C, 0x8136EB38}, - {0x232D, 0x8136EB39}, - {0x232E, 0x8136EC30}, - {0x232F, 0x8136EC31}, - {0x2330, 0x8136EC32}, - {0x2331, 0x8136EC33}, - {0x2332, 0x8136EC34}, - {0x2333, 0x8136EC35}, - {0x2334, 0x8136EC36}, - {0x2335, 0x8136EC37}, - {0x2336, 0x8136EC38}, - {0x2337, 0x8136EC39}, - {0x2338, 0x8136ED30}, - {0x2339, 0x8136ED31}, - {0x233A, 0x8136ED32}, - {0x233B, 0x8136ED33}, - {0x233C, 0x8136ED34}, - {0x233D, 0x8136ED35}, - {0x233E, 0x8136ED36}, - {0x233F, 0x8136ED37}, - {0x2340, 0x8136ED38}, - {0x2341, 0x8136ED39}, - {0x2342, 0x8136EE30}, - {0x2343, 0x8136EE31}, - {0x2344, 0x8136EE32}, - {0x2345, 0x8136EE33}, - {0x2346, 0x8136EE34}, - {0x2347, 0x8136EE35}, - {0x2348, 0x8136EE36}, - {0x2349, 0x8136EE37}, - {0x234A, 0x8136EE38}, - {0x234B, 0x8136EE39}, - {0x234C, 0x8136EF30}, - {0x234D, 0x8136EF31}, - {0x234E, 0x8136EF32}, - {0x234F, 0x8136EF33}, - {0x2350, 0x8136EF34}, - {0x2351, 0x8136EF35}, - {0x2352, 0x8136EF36}, - {0x2353, 0x8136EF37}, - {0x2354, 0x8136EF38}, - {0x2355, 0x8136EF39}, - {0x2356, 0x8136F030}, - {0x2357, 0x8136F031}, - {0x2358, 0x8136F032}, - {0x2359, 0x8136F033}, - {0x235A, 0x8136F034}, - {0x235B, 0x8136F035}, - {0x235C, 0x8136F036}, - {0x235D, 0x8136F037}, - {0x235E, 0x8136F038}, - {0x235F, 0x8136F039}, - {0x2360, 0x8136F130}, - {0x2361, 0x8136F131}, - {0x2362, 0x8136F132}, - {0x2363, 0x8136F133}, - {0x2364, 0x8136F134}, - {0x2365, 0x8136F135}, - {0x2366, 0x8136F136}, - {0x2367, 0x8136F137}, - {0x2368, 0x8136F138}, - {0x2369, 0x8136F139}, - {0x236A, 0x8136F230}, - {0x236B, 0x8136F231}, - {0x236C, 0x8136F232}, - {0x236D, 0x8136F233}, - {0x236E, 0x8136F234}, - {0x236F, 0x8136F235}, - {0x2370, 0x8136F236}, - {0x2371, 0x8136F237}, - {0x2372, 0x8136F238}, - {0x2373, 0x8136F239}, - {0x2374, 0x8136F330}, - {0x2375, 0x8136F331}, - {0x2376, 0x8136F332}, - {0x2377, 0x8136F333}, - {0x2378, 0x8136F334}, - {0x2379, 0x8136F335}, - {0x237A, 0x8136F336}, - {0x237B, 0x8136F337}, - {0x237C, 0x8136F338}, - {0x237D, 0x8136F339}, - {0x237E, 0x8136F430}, - {0x237F, 0x8136F431}, - {0x2380, 0x8136F432}, - {0x2381, 0x8136F433}, - {0x2382, 0x8136F434}, - {0x2383, 0x8136F435}, - {0x2384, 0x8136F436}, - {0x2385, 0x8136F437}, - {0x2386, 0x8136F438}, - {0x2387, 0x8136F439}, - {0x2388, 0x8136F530}, - {0x2389, 0x8136F531}, - {0x238A, 0x8136F532}, - {0x238B, 0x8136F533}, - {0x238C, 0x8136F534}, - {0x238D, 0x8136F535}, - {0x238E, 0x8136F536}, - {0x238F, 0x8136F537}, - {0x2390, 0x8136F538}, - {0x2391, 0x8136F539}, - {0x2392, 0x8136F630}, - {0x2393, 0x8136F631}, - {0x2394, 0x8136F632}, - {0x2395, 0x8136F633}, - {0x2396, 0x8136F634}, - {0x2397, 0x8136F635}, - {0x2398, 0x8136F636}, - {0x2399, 0x8136F637}, - {0x239A, 0x8136F638}, - {0x239B, 0x8136F639}, - {0x239C, 0x8136F730}, - {0x239D, 0x8136F731}, - {0x239E, 0x8136F732}, - {0x239F, 0x8136F733}, - {0x23A0, 0x8136F734}, - {0x23A1, 0x8136F735}, - {0x23A2, 0x8136F736}, - {0x23A3, 0x8136F737}, - {0x23A4, 0x8136F738}, - {0x23A5, 0x8136F739}, - {0x23A6, 0x8136F830}, - {0x23A7, 0x8136F831}, - {0x23A8, 0x8136F832}, - {0x23A9, 0x8136F833}, - {0x23AA, 0x8136F834}, - {0x23AB, 0x8136F835}, - {0x23AC, 0x8136F836}, - {0x23AD, 0x8136F837}, - {0x23AE, 0x8136F838}, - {0x23AF, 0x8136F839}, - {0x23B0, 0x8136F930}, - {0x23B1, 0x8136F931}, - {0x23B2, 0x8136F932}, - {0x23B3, 0x8136F933}, - {0x23B4, 0x8136F934}, - {0x23B5, 0x8136F935}, - {0x23B6, 0x8136F936}, - {0x23B7, 0x8136F937}, - {0x23B8, 0x8136F938}, - {0x23B9, 0x8136F939}, - {0x23BA, 0x8136FA30}, - {0x23BB, 0x8136FA31}, - {0x23BC, 0x8136FA32}, - {0x23BD, 0x8136FA33}, - {0x23BE, 0x8136FA34}, - {0x23BF, 0x8136FA35}, - {0x23C0, 0x8136FA36}, - {0x23C1, 0x8136FA37}, - {0x23C2, 0x8136FA38}, - {0x23C3, 0x8136FA39}, - {0x23C4, 0x8136FB30}, - {0x23C5, 0x8136FB31}, - {0x23C6, 0x8136FB32}, - {0x23C7, 0x8136FB33}, - {0x23C8, 0x8136FB34}, - {0x23C9, 0x8136FB35}, - {0x23CA, 0x8136FB36}, - {0x23CB, 0x8136FB37}, - {0x23CC, 0x8136FB38}, - {0x23CD, 0x8136FB39}, - {0x23CE, 0x8136FC30}, - {0x23CF, 0x8136FC31}, - {0x23D0, 0x8136FC32}, - {0x23D1, 0x8136FC33}, - {0x23D2, 0x8136FC34}, - {0x23D3, 0x8136FC35}, - {0x23D4, 0x8136FC36}, - {0x23D5, 0x8136FC37}, - {0x23D6, 0x8136FC38}, - {0x23D7, 0x8136FC39}, - {0x23D8, 0x8136FD30}, - {0x23D9, 0x8136FD31}, - {0x23DA, 0x8136FD32}, - {0x23DB, 0x8136FD33}, - {0x23DC, 0x8136FD34}, - {0x23DD, 0x8136FD35}, - {0x23DE, 0x8136FD36}, - {0x23DF, 0x8136FD37}, - {0x23E0, 0x8136FD38}, - {0x23E1, 0x8136FD39}, - {0x23E2, 0x8136FE30}, - {0x23E3, 0x8136FE31}, - {0x23E4, 0x8136FE32}, - {0x23E5, 0x8136FE33}, - {0x23E6, 0x8136FE34}, - {0x23E7, 0x8136FE35}, - {0x23E8, 0x8136FE36}, - {0x23E9, 0x8136FE37}, - {0x23EA, 0x8136FE38}, - {0x23EB, 0x8136FE39}, - {0x23EC, 0x81378130}, - {0x23ED, 0x81378131}, - {0x23EE, 0x81378132}, - {0x23EF, 0x81378133}, - {0x23F0, 0x81378134}, - {0x23F1, 0x81378135}, - {0x23F2, 0x81378136}, - {0x23F3, 0x81378137}, - {0x23F4, 0x81378138}, - {0x23F5, 0x81378139}, - {0x23F6, 0x81378230}, - {0x23F7, 0x81378231}, - {0x23F8, 0x81378232}, - {0x23F9, 0x81378233}, - {0x23FA, 0x81378234}, - {0x23FB, 0x81378235}, - {0x23FC, 0x81378236}, - {0x23FD, 0x81378237}, - {0x23FE, 0x81378238}, - {0x23FF, 0x81378239}, - {0x2400, 0x81378330}, - {0x2401, 0x81378331}, - {0x2402, 0x81378332}, - {0x2403, 0x81378333}, - {0x2404, 0x81378334}, - {0x2405, 0x81378335}, - {0x2406, 0x81378336}, - {0x2407, 0x81378337}, - {0x2408, 0x81378338}, - {0x2409, 0x81378339}, - {0x240A, 0x81378430}, - {0x240B, 0x81378431}, - {0x240C, 0x81378432}, - {0x240D, 0x81378433}, - {0x240E, 0x81378434}, - {0x240F, 0x81378435}, - {0x2410, 0x81378436}, - {0x2411, 0x81378437}, - {0x2412, 0x81378438}, - {0x2413, 0x81378439}, - {0x2414, 0x81378530}, - {0x2415, 0x81378531}, - {0x2416, 0x81378532}, - {0x2417, 0x81378533}, - {0x2418, 0x81378534}, - {0x2419, 0x81378535}, - {0x241A, 0x81378536}, - {0x241B, 0x81378537}, - {0x241C, 0x81378538}, - {0x241D, 0x81378539}, - {0x241E, 0x81378630}, - {0x241F, 0x81378631}, - {0x2420, 0x81378632}, - {0x2421, 0x81378633}, - {0x2422, 0x81378634}, - {0x2423, 0x81378635}, - {0x2424, 0x81378636}, - {0x2425, 0x81378637}, - {0x2426, 0x81378638}, - {0x2427, 0x81378639}, - {0x2428, 0x81378730}, - {0x2429, 0x81378731}, - {0x242A, 0x81378732}, - {0x242B, 0x81378733}, - {0x242C, 0x81378734}, - {0x242D, 0x81378735}, - {0x242E, 0x81378736}, - {0x242F, 0x81378737}, - {0x2430, 0x81378738}, - {0x2431, 0x81378739}, - {0x2432, 0x81378830}, - {0x2433, 0x81378831}, - {0x2434, 0x81378832}, - {0x2435, 0x81378833}, - {0x2436, 0x81378834}, - {0x2437, 0x81378835}, - {0x2438, 0x81378836}, - {0x2439, 0x81378837}, - {0x243A, 0x81378838}, - {0x243B, 0x81378839}, - {0x243C, 0x81378930}, - {0x243D, 0x81378931}, - {0x243E, 0x81378932}, - {0x243F, 0x81378933}, - {0x2440, 0x81378934}, - {0x2441, 0x81378935}, - {0x2442, 0x81378936}, - {0x2443, 0x81378937}, - {0x2444, 0x81378938}, - {0x2445, 0x81378939}, - {0x2446, 0x81378A30}, - {0x2447, 0x81378A31}, - {0x2448, 0x81378A32}, - {0x2449, 0x81378A33}, - {0x244A, 0x81378A34}, - {0x244B, 0x81378A35}, - {0x244C, 0x81378A36}, - {0x244D, 0x81378A37}, - {0x244E, 0x81378A38}, - {0x244F, 0x81378A39}, - {0x2450, 0x81378B30}, - {0x2451, 0x81378B31}, - {0x2452, 0x81378B32}, - {0x2453, 0x81378B33}, - {0x2454, 0x81378B34}, - {0x2455, 0x81378B35}, - {0x2456, 0x81378B36}, - {0x2457, 0x81378B37}, - {0x2458, 0x81378B38}, - {0x2459, 0x81378B39}, - {0x245A, 0x81378C30}, - {0x245B, 0x81378C31}, - {0x245C, 0x81378C32}, - {0x245D, 0x81378C33}, - {0x245E, 0x81378C34}, - {0x245F, 0x81378C35}, - {0x246A, 0x81378C36}, - {0x246B, 0x81378C37}, - {0x246C, 0x81378C38}, - {0x246D, 0x81378C39}, - {0x246E, 0x81378D30}, - {0x246F, 0x81378D31}, - {0x2470, 0x81378D32}, - {0x2471, 0x81378D33}, - {0x2472, 0x81378D34}, - {0x2473, 0x81378D35}, - {0x249C, 0x81378D36}, - {0x249D, 0x81378D37}, - {0x249E, 0x81378D38}, - {0x249F, 0x81378D39}, - {0x24A0, 0x81378E30}, - {0x24A1, 0x81378E31}, - {0x24A2, 0x81378E32}, - {0x24A3, 0x81378E33}, - {0x24A4, 0x81378E34}, - {0x24A5, 0x81378E35}, - {0x24A6, 0x81378E36}, - {0x24A7, 0x81378E37}, - {0x24A8, 0x81378E38}, - {0x24A9, 0x81378E39}, - {0x24AA, 0x81378F30}, - {0x24AB, 0x81378F31}, - {0x24AC, 0x81378F32}, - {0x24AD, 0x81378F33}, - {0x24AE, 0x81378F34}, - {0x24AF, 0x81378F35}, - {0x24B0, 0x81378F36}, - {0x24B1, 0x81378F37}, - {0x24B2, 0x81378F38}, - {0x24B3, 0x81378F39}, - {0x24B4, 0x81379030}, - {0x24B5, 0x81379031}, - {0x24B6, 0x81379032}, - {0x24B7, 0x81379033}, - {0x24B8, 0x81379034}, - {0x24B9, 0x81379035}, - {0x24BA, 0x81379036}, - {0x24BB, 0x81379037}, - {0x24BC, 0x81379038}, - {0x24BD, 0x81379039}, - {0x24BE, 0x81379130}, - {0x24BF, 0x81379131}, - {0x24C0, 0x81379132}, - {0x24C1, 0x81379133}, - {0x24C2, 0x81379134}, - {0x24C3, 0x81379135}, - {0x24C4, 0x81379136}, - {0x24C5, 0x81379137}, - {0x24C6, 0x81379138}, - {0x24C7, 0x81379139}, - {0x24C8, 0x81379230}, - {0x24C9, 0x81379231}, - {0x24CA, 0x81379232}, - {0x24CB, 0x81379233}, - {0x24CC, 0x81379234}, - {0x24CD, 0x81379235}, - {0x24CE, 0x81379236}, - {0x24CF, 0x81379237}, - {0x24D0, 0x81379238}, - {0x24D1, 0x81379239}, - {0x24D2, 0x81379330}, - {0x24D3, 0x81379331}, - {0x24D4, 0x81379332}, - {0x24D5, 0x81379333}, - {0x24D6, 0x81379334}, - {0x24D7, 0x81379335}, - {0x24D8, 0x81379336}, - {0x24D9, 0x81379337}, - {0x24DA, 0x81379338}, - {0x24DB, 0x81379339}, - {0x24DC, 0x81379430}, - {0x24DD, 0x81379431}, - {0x24DE, 0x81379432}, - {0x24DF, 0x81379433}, - {0x24E0, 0x81379434}, - {0x24E1, 0x81379435}, - {0x24E2, 0x81379436}, - {0x24E3, 0x81379437}, - {0x24E4, 0x81379438}, - {0x24E5, 0x81379439}, - {0x24E6, 0x81379530}, - {0x24E7, 0x81379531}, - {0x24E8, 0x81379532}, - {0x24E9, 0x81379533}, - {0x24EA, 0x81379534}, - {0x24EB, 0x81379535}, - {0x24EC, 0x81379536}, - {0x24ED, 0x81379537}, - {0x24EE, 0x81379538}, - {0x24EF, 0x81379539}, - {0x24F0, 0x81379630}, - {0x24F1, 0x81379631}, - {0x24F2, 0x81379632}, - {0x24F3, 0x81379633}, - {0x24F4, 0x81379634}, - {0x24F5, 0x81379635}, - {0x24F6, 0x81379636}, - {0x24F7, 0x81379637}, - {0x24F8, 0x81379638}, - {0x24F9, 0x81379639}, - {0x24FA, 0x81379730}, - {0x24FB, 0x81379731}, - {0x24FC, 0x81379732}, - {0x24FD, 0x81379733}, - {0x24FE, 0x81379734}, - {0x24FF, 0x81379735}, - {0x254C, 0x81379736}, - {0x254D, 0x81379737}, - {0x254E, 0x81379738}, - {0x254F, 0x81379739}, - {0x2574, 0x81379830}, - {0x2575, 0x81379831}, - {0x2576, 0x81379832}, - {0x2577, 0x81379833}, - {0x2578, 0x81379834}, - {0x2579, 0x81379835}, - {0x257A, 0x81379836}, - {0x257B, 0x81379837}, - {0x257C, 0x81379838}, - {0x257D, 0x81379839}, - {0x257E, 0x81379930}, - {0x257F, 0x81379931}, - {0x2580, 0x81379932}, - {0x2590, 0x81379933}, - {0x2591, 0x81379934}, - {0x2592, 0x81379935}, - {0x2596, 0x81379936}, - {0x2597, 0x81379937}, - {0x2598, 0x81379938}, - {0x2599, 0x81379939}, - {0x259A, 0x81379A30}, - {0x259B, 0x81379A31}, - {0x259C, 0x81379A32}, - {0x259D, 0x81379A33}, - {0x259E, 0x81379A34}, - {0x259F, 0x81379A35}, - {0x25A2, 0x81379A36}, - {0x25A3, 0x81379A37}, - {0x25A4, 0x81379A38}, - {0x25A5, 0x81379A39}, - {0x25A6, 0x81379B30}, - {0x25A7, 0x81379B31}, - {0x25A8, 0x81379B32}, - {0x25A9, 0x81379B33}, - {0x25AA, 0x81379B34}, - {0x25AB, 0x81379B35}, - {0x25AC, 0x81379B36}, - {0x25AD, 0x81379B37}, - {0x25AE, 0x81379B38}, - {0x25AF, 0x81379B39}, - {0x25B0, 0x81379C30}, - {0x25B1, 0x81379C31}, - {0x25B4, 0x81379C32}, - {0x25B5, 0x81379C33}, - {0x25B6, 0x81379C34}, - {0x25B7, 0x81379C35}, - {0x25B8, 0x81379C36}, - {0x25B9, 0x81379C37}, - {0x25BA, 0x81379C38}, - {0x25BB, 0x81379C39}, - {0x25BE, 0x81379D30}, - {0x25BF, 0x81379D31}, - {0x25C0, 0x81379D32}, - {0x25C1, 0x81379D33}, - {0x25C2, 0x81379D34}, - {0x25C3, 0x81379D35}, - {0x25C4, 0x81379D36}, - {0x25C5, 0x81379D37}, - {0x25C8, 0x81379D38}, - {0x25C9, 0x81379D39}, - {0x25CA, 0x81379E30}, - {0x25CC, 0x81379E31}, - {0x25CD, 0x81379E32}, - {0x25D0, 0x81379E33}, - {0x25D1, 0x81379E34}, - {0x25D2, 0x81379E35}, - {0x25D3, 0x81379E36}, - {0x25D4, 0x81379E37}, - {0x25D5, 0x81379E38}, - {0x25D6, 0x81379E39}, - {0x25D7, 0x81379F30}, - {0x25D8, 0x81379F31}, - {0x25D9, 0x81379F32}, - {0x25DA, 0x81379F33}, - {0x25DB, 0x81379F34}, - {0x25DC, 0x81379F35}, - {0x25DD, 0x81379F36}, - {0x25DE, 0x81379F37}, - {0x25DF, 0x81379F38}, - {0x25E0, 0x81379F39}, - {0x25E1, 0x8137A030}, - {0x25E6, 0x8137A031}, - {0x25E7, 0x8137A032}, - {0x25E8, 0x8137A033}, - {0x25E9, 0x8137A034}, - {0x25EA, 0x8137A035}, - {0x25EB, 0x8137A036}, - {0x25EC, 0x8137A037}, - {0x25ED, 0x8137A038}, - {0x25EE, 0x8137A039}, - {0x25EF, 0x8137A130}, - {0x25F0, 0x8137A131}, - {0x25F1, 0x8137A132}, - {0x25F2, 0x8137A133}, - {0x25F3, 0x8137A134}, - {0x25F4, 0x8137A135}, - {0x25F5, 0x8137A136}, - {0x25F6, 0x8137A137}, - {0x25F7, 0x8137A138}, - {0x25F8, 0x8137A139}, - {0x25F9, 0x8137A230}, - {0x25FA, 0x8137A231}, - {0x25FB, 0x8137A232}, - {0x25FC, 0x8137A233}, - {0x25FD, 0x8137A234}, - {0x25FE, 0x8137A235}, - {0x25FF, 0x8137A236}, - {0x2600, 0x8137A237}, - {0x2601, 0x8137A238}, - {0x2602, 0x8137A239}, - {0x2603, 0x8137A330}, - {0x2604, 0x8137A331}, - {0x2607, 0x8137A332}, - {0x2608, 0x8137A333}, - {0x260A, 0x8137A334}, - {0x260B, 0x8137A335}, - {0x260C, 0x8137A336}, - {0x260D, 0x8137A337}, - {0x260E, 0x8137A338}, - {0x260F, 0x8137A339}, - {0x2610, 0x8137A430}, - {0x2611, 0x8137A431}, - {0x2612, 0x8137A432}, - {0x2613, 0x8137A433}, - {0x2614, 0x8137A434}, - {0x2615, 0x8137A435}, - {0x2616, 0x8137A436}, - {0x2617, 0x8137A437}, - {0x2618, 0x8137A438}, - {0x2619, 0x8137A439}, - {0x261A, 0x8137A530}, - {0x261B, 0x8137A531}, - {0x261C, 0x8137A532}, - {0x261D, 0x8137A533}, - {0x261E, 0x8137A534}, - {0x261F, 0x8137A535}, - {0x2620, 0x8137A536}, - {0x2621, 0x8137A537}, - {0x2622, 0x8137A538}, - {0x2623, 0x8137A539}, - {0x2624, 0x8137A630}, - {0x2625, 0x8137A631}, - {0x2626, 0x8137A632}, - {0x2627, 0x8137A633}, - {0x2628, 0x8137A634}, - {0x2629, 0x8137A635}, - {0x262A, 0x8137A636}, - {0x262B, 0x8137A637}, - {0x262C, 0x8137A638}, - {0x262D, 0x8137A639}, - {0x262E, 0x8137A730}, - {0x262F, 0x8137A731}, - {0x2630, 0x8137A732}, - {0x2631, 0x8137A733}, - {0x2632, 0x8137A734}, - {0x2633, 0x8137A735}, - {0x2634, 0x8137A736}, - {0x2635, 0x8137A737}, - {0x2636, 0x8137A738}, - {0x2637, 0x8137A739}, - {0x2638, 0x8137A830}, - {0x2639, 0x8137A831}, - {0x263A, 0x8137A832}, - {0x263B, 0x8137A833}, - {0x263C, 0x8137A834}, - {0x263D, 0x8137A835}, - {0x263E, 0x8137A836}, - {0x263F, 0x8137A837}, - {0x2641, 0x8137A838}, - {0x2E82, 0x8138FD39}, - {0x2E83, 0x8138FE30}, - {0x2E85, 0x8138FE31}, - {0x2E86, 0x8138FE32}, - {0x2E87, 0x8138FE33}, - {0x2E89, 0x8138FE34}, - {0x2E8A, 0x8138FE35}, - {0x2E8D, 0x8138FE36}, - {0x2E8E, 0x8138FE37}, - {0x2E8F, 0x8138FE38}, - {0x2E90, 0x8138FE39}, - {0x2E91, 0x81398130}, - {0x2E92, 0x81398131}, - {0x2E93, 0x81398132}, - {0x2E94, 0x81398133}, - {0x2E95, 0x81398134}, - {0x2E96, 0x81398135}, - {0x2E98, 0x81398136}, - {0x2E99, 0x81398137}, - {0x2E9A, 0x81398138}, - {0x2E9B, 0x81398139}, - {0x2E9C, 0x81398230}, - {0x2E9D, 0x81398231}, - {0x2E9E, 0x81398232}, - {0x2E9F, 0x81398233}, - {0x2EA0, 0x81398234}, - {0x2EA1, 0x81398235}, - {0x2EA2, 0x81398236}, - {0x2EA3, 0x81398237}, - {0x2EA4, 0x81398238}, - {0x2EA5, 0x81398239}, - {0x2EA6, 0x81398330}, - {0x2EA8, 0x81398331}, - {0x2EA9, 0x81398332}, - {0x2EAB, 0x81398333}, - {0x2EAC, 0x81398334}, - {0x2EAD, 0x81398335}, - {0x2EAF, 0x81398336}, - {0x2EB0, 0x81398337}, - {0x2EB1, 0x81398338}, - {0x2EB2, 0x81398339}, - {0x2EB4, 0x81398430}, - {0x2EB5, 0x81398431}, - {0x2EB8, 0x81398432}, - {0x2EB9, 0x81398433}, - {0x2EBA, 0x81398434}, - {0x2EBC, 0x81398435}, - {0x2EBD, 0x81398436}, - {0x2EBE, 0x81398437}, - {0x2EBF, 0x81398438}, - {0x2EC0, 0x81398439}, - {0x2EC1, 0x81398530}, - {0x2EC2, 0x81398531}, - {0x2EC3, 0x81398532}, - {0x2EC4, 0x81398533}, - {0x2EC5, 0x81398534}, - {0x2EC6, 0x81398535}, - {0x2EC7, 0x81398536}, - {0x2EC8, 0x81398537}, - {0x2EC9, 0x81398538}, - {0x2ECB, 0x81398539}, - {0x2ECC, 0x81398630}, - {0x2ECD, 0x81398631}, - {0x2ECE, 0x81398632}, - {0x2ECF, 0x81398633}, - {0x2ED0, 0x81398634}, - {0x2ED1, 0x81398635}, - {0x2ED2, 0x81398636}, - {0x2ED3, 0x81398637}, - {0x2ED4, 0x81398638}, - {0x2ED5, 0x81398639}, - {0x2ED6, 0x81398730}, - {0x2ED7, 0x81398731}, - {0x2ED8, 0x81398732}, - {0x2ED9, 0x81398733}, - {0x2EDA, 0x81398734}, - {0x2EDB, 0x81398735}, - {0x2EDC, 0x81398736}, - {0x2EDD, 0x81398737}, - {0x2EDE, 0x81398738}, - {0x2EDF, 0x81398739}, - {0x2EE0, 0x81398830}, - {0x2EE1, 0x81398831}, - {0x2EE2, 0x81398832}, - {0x2EE3, 0x81398833}, - {0x2EE4, 0x81398834}, - {0x2EE5, 0x81398835}, - {0x2EE6, 0x81398836}, - {0x2EE7, 0x81398837}, - {0x2EE8, 0x81398838}, - {0x2EE9, 0x81398839}, - {0x2EEA, 0x81398930}, - {0x2EEB, 0x81398931}, - {0x2EEC, 0x81398932}, - {0x2EED, 0x81398933}, - {0x2EEE, 0x81398934}, - {0x2EEF, 0x81398935}, - {0x2EF0, 0x81398936}, - {0x2EF1, 0x81398937}, - {0x2EF2, 0x81398938}, - {0x2EF3, 0x81398939}, - {0x2EF4, 0x81398A30}, - {0x2EF5, 0x81398A31}, - {0x2EF6, 0x81398A32}, - {0x2EF7, 0x81398A33}, - {0x2EF8, 0x81398A34}, - {0x2EF9, 0x81398A35}, - {0x2EFA, 0x81398A36}, - {0x2EFB, 0x81398A37}, - {0x2EFC, 0x81398A38}, - {0x2EFD, 0x81398A39}, - {0x2EFE, 0x81398B30}, - {0x2EFF, 0x81398B31}, - {0x2F00, 0x81398B32}, - {0x2F01, 0x81398B33}, - {0x2F02, 0x81398B34}, - {0x2F03, 0x81398B35}, - {0x2F04, 0x81398B36}, - {0x2F05, 0x81398B37}, - {0x2F06, 0x81398B38}, - {0x2F07, 0x81398B39}, - {0x2F08, 0x81398C30}, - {0x2F09, 0x81398C31}, - {0x2F0A, 0x81398C32}, - {0x2F0B, 0x81398C33}, - {0x2F0C, 0x81398C34}, - {0x2F0D, 0x81398C35}, - {0x2F0E, 0x81398C36}, - {0x2F0F, 0x81398C37}, - {0x2F10, 0x81398C38}, - {0x2F11, 0x81398C39}, - {0x2F12, 0x81398D30}, - {0x2F13, 0x81398D31}, - {0x2F14, 0x81398D32}, - {0x2F15, 0x81398D33}, - {0x2F16, 0x81398D34}, - {0x2F17, 0x81398D35}, - {0x2F18, 0x81398D36}, - {0x2F19, 0x81398D37}, - {0x2F1A, 0x81398D38}, - {0x2F1B, 0x81398D39}, - {0x2F1C, 0x81398E30}, - {0x2F1D, 0x81398E31}, - {0x2F1E, 0x81398E32}, - {0x2F1F, 0x81398E33}, - {0x2F20, 0x81398E34}, - {0x2F21, 0x81398E35}, - {0x2F22, 0x81398E36}, - {0x2F23, 0x81398E37}, - {0x2F24, 0x81398E38}, - {0x2F25, 0x81398E39}, - {0x2F26, 0x81398F30}, - {0x2F27, 0x81398F31}, - {0x2F28, 0x81398F32}, - {0x2F29, 0x81398F33}, - {0x2F2A, 0x81398F34}, - {0x2F2B, 0x81398F35}, - {0x2F2C, 0x81398F36}, - {0x2F2D, 0x81398F37}, - {0x2F2E, 0x81398F38}, - {0x2F2F, 0x81398F39}, - {0x2F30, 0x81399030}, - {0x2F31, 0x81399031}, - {0x2F32, 0x81399032}, - {0x2F33, 0x81399033}, - {0x2F34, 0x81399034}, - {0x2F35, 0x81399035}, - {0x2F36, 0x81399036}, - {0x2F37, 0x81399037}, - {0x2F38, 0x81399038}, - {0x2F39, 0x81399039}, - {0x2F3A, 0x81399130}, - {0x2F3B, 0x81399131}, - {0x2F3C, 0x81399132}, - {0x2F3D, 0x81399133}, - {0x2F3E, 0x81399134}, - {0x2F3F, 0x81399135}, - {0x2F40, 0x81399136}, - {0x2F41, 0x81399137}, - {0x2F42, 0x81399138}, - {0x2F43, 0x81399139}, - {0x2F44, 0x81399230}, - {0x2F45, 0x81399231}, - {0x2F46, 0x81399232}, - {0x2F47, 0x81399233}, - {0x2F48, 0x81399234}, - {0x2F49, 0x81399235}, - {0x2F4A, 0x81399236}, - {0x2F4B, 0x81399237}, - {0x2F4C, 0x81399238}, - {0x2F4D, 0x81399239}, - {0x2F4E, 0x81399330}, - {0x2F4F, 0x81399331}, - {0x2F50, 0x81399332}, - {0x2F51, 0x81399333}, - {0x2F52, 0x81399334}, - {0x2F53, 0x81399335}, - {0x2F54, 0x81399336}, - {0x2F55, 0x81399337}, - {0x2F56, 0x81399338}, - {0x2F57, 0x81399339}, - {0x2F58, 0x81399430}, - {0x2F59, 0x81399431}, - {0x2F5A, 0x81399432}, - {0x2F5B, 0x81399433}, - {0x2F5C, 0x81399434}, - {0x2F5D, 0x81399435}, - {0x2F5E, 0x81399436}, - {0x2F5F, 0x81399437}, - {0x2F60, 0x81399438}, - {0x2F61, 0x81399439}, - {0x2F62, 0x81399530}, - {0x2F63, 0x81399531}, - {0x2F64, 0x81399532}, - {0x2F65, 0x81399533}, - {0x2F66, 0x81399534}, - {0x2F67, 0x81399535}, - {0x2F68, 0x81399536}, - {0x2F69, 0x81399537}, - {0x2F6A, 0x81399538}, - {0x2F6B, 0x81399539}, - {0x2F6C, 0x81399630}, - {0x2F6D, 0x81399631}, - {0x2F6E, 0x81399632}, - {0x2F6F, 0x81399633}, - {0x2F70, 0x81399634}, - {0x2F71, 0x81399635}, - {0x2F72, 0x81399636}, - {0x2F73, 0x81399637}, - {0x2F74, 0x81399638}, - {0x2F75, 0x81399639}, - {0x2F76, 0x81399730}, - {0x2F77, 0x81399731}, - {0x2F78, 0x81399732}, - {0x2F79, 0x81399733}, - {0x2F7A, 0x81399734}, - {0x2F7B, 0x81399735}, - {0x2F7C, 0x81399736}, - {0x2F7D, 0x81399737}, - {0x2F7E, 0x81399738}, - {0x2F7F, 0x81399739}, - {0x2F80, 0x81399830}, - {0x2F81, 0x81399831}, - {0x2F82, 0x81399832}, - {0x2F83, 0x81399833}, - {0x2F84, 0x81399834}, - {0x2F85, 0x81399835}, - {0x2F86, 0x81399836}, - {0x2F87, 0x81399837}, - {0x2F88, 0x81399838}, - {0x2F89, 0x81399839}, - {0x2F8A, 0x81399930}, - {0x2F8B, 0x81399931}, - {0x2F8C, 0x81399932}, - {0x2F8D, 0x81399933}, - {0x2F8E, 0x81399934}, - {0x2F8F, 0x81399935}, - {0x2F90, 0x81399936}, - {0x2F91, 0x81399937}, - {0x2F92, 0x81399938}, - {0x2F93, 0x81399939}, - {0x2F94, 0x81399A30}, - {0x2F95, 0x81399A31}, - {0x2F96, 0x81399A32}, - {0x2F97, 0x81399A33}, - {0x2F98, 0x81399A34}, - {0x2F99, 0x81399A35}, - {0x2F9A, 0x81399A36}, - {0x2F9B, 0x81399A37}, - {0x2F9C, 0x81399A38}, - {0x2F9D, 0x81399A39}, - {0x2F9E, 0x81399B30}, - {0x2F9F, 0x81399B31}, - {0x2FA0, 0x81399B32}, - {0x2FA1, 0x81399B33}, - {0x2FA2, 0x81399B34}, - {0x2FA3, 0x81399B35}, - {0x2FA4, 0x81399B36}, - {0x2FA5, 0x81399B37}, - {0x2FA6, 0x81399B38}, - {0x2FA7, 0x81399B39}, - {0x2FA8, 0x81399C30}, - {0x2FA9, 0x81399C31}, - {0x2FAA, 0x81399C32}, - {0x2FAB, 0x81399C33}, - {0x2FAC, 0x81399C34}, - {0x2FAD, 0x81399C35}, - {0x2FAE, 0x81399C36}, - {0x2FAF, 0x81399C37}, - {0x2FB0, 0x81399C38}, - {0x2FB1, 0x81399C39}, - {0x2FB2, 0x81399D30}, - {0x2FB3, 0x81399D31}, - {0x2FB4, 0x81399D32}, - {0x2FB5, 0x81399D33}, - {0x2FB6, 0x81399D34}, - {0x2FB7, 0x81399D35}, - {0x2FB8, 0x81399D36}, - {0x2FB9, 0x81399D37}, - {0x2FBA, 0x81399D38}, - {0x2FBB, 0x81399D39}, - {0x2FBC, 0x81399E30}, - {0x2FBD, 0x81399E31}, - {0x2FBE, 0x81399E32}, - {0x2FBF, 0x81399E33}, - {0x2FC0, 0x81399E34}, - {0x2FC1, 0x81399E35}, - {0x2FC2, 0x81399E36}, - {0x2FC3, 0x81399E37}, - {0x2FC4, 0x81399E38}, - {0x2FC5, 0x81399E39}, - {0x2FC6, 0x81399F30}, - {0x2FC7, 0x81399F31}, - {0x2FC8, 0x81399F32}, - {0x2FC9, 0x81399F33}, - {0x2FCA, 0x81399F34}, - {0x2FCB, 0x81399F35}, - {0x2FCC, 0x81399F36}, - {0x2FCD, 0x81399F37}, - {0x2FCE, 0x81399F38}, - {0x2FCF, 0x81399F39}, - {0x2FD0, 0x8139A030}, - {0x2FD1, 0x8139A031}, - {0x2FD2, 0x8139A032}, - {0x2FD3, 0x8139A033}, - {0x2FD4, 0x8139A034}, - {0x2FD5, 0x8139A035}, - {0x2FD6, 0x8139A036}, - {0x2FD7, 0x8139A037}, - {0x2FD8, 0x8139A038}, - {0x2FD9, 0x8139A039}, - {0x2FDA, 0x8139A130}, - {0x2FDB, 0x8139A131}, - {0x2FDC, 0x8139A132}, - {0x2FDD, 0x8139A133}, - {0x2FDE, 0x8139A134}, - {0x2FDF, 0x8139A135}, - {0x2FE0, 0x8139A136}, - {0x2FE1, 0x8139A137}, - {0x2FE2, 0x8139A138}, - {0x2FE3, 0x8139A139}, - {0x2FE4, 0x8139A230}, - {0x2FE5, 0x8139A231}, - {0x2FE6, 0x8139A232}, - {0x2FE7, 0x8139A233}, - {0x2FE8, 0x8139A234}, - {0x2FE9, 0x8139A235}, - {0x2FEA, 0x8139A236}, - {0x2FEB, 0x8139A237}, - {0x2FEC, 0x8139A238}, - {0x2FED, 0x8139A239}, - {0x2FEE, 0x8139A330}, - {0x2FEF, 0x8139A331}, - {0x2FFC, 0x8139A332}, - {0x2FFD, 0x8139A333}, - {0x2FFE, 0x8139A334}, - {0x2FFF, 0x8139A335}, - {0x3004, 0x8139A336}, - {0x3018, 0x8139A337}, - {0x3019, 0x8139A338}, - {0x301A, 0x8139A339}, - {0x301B, 0x8139A430}, - {0x301C, 0x8139A431}, - {0x301F, 0x8139A432}, - {0x3020, 0x8139A433}, - {0x302A, 0x8139A434}, - {0x302B, 0x8139A435}, - {0x302C, 0x8139A436}, - {0x302D, 0x8139A437}, - {0x302E, 0x8139A438}, - {0x302F, 0x8139A439}, - {0x3030, 0x8139A530}, - {0x3031, 0x8139A531}, - {0x3032, 0x8139A532}, - {0x3033, 0x8139A533}, - {0x3034, 0x8139A534}, - {0x3035, 0x8139A535}, - {0x3036, 0x8139A536}, - {0x3037, 0x8139A537}, - {0x3038, 0x8139A538}, - {0x3039, 0x8139A539}, - {0x303A, 0x8139A630}, - {0x303B, 0x8139A631}, - {0x303C, 0x8139A632}, - {0x303D, 0x8139A633}, - {0x303F, 0x8139A634}, - {0x3040, 0x8139A635}, - {0x3094, 0x8139A636}, - {0x3095, 0x8139A637}, - {0x3096, 0x8139A638}, - {0x3097, 0x8139A639}, - {0x3098, 0x8139A730}, - {0x3099, 0x8139A731}, - {0x309A, 0x8139A732}, - {0x309F, 0x8139A733}, - {0x30A0, 0x8139A734}, - {0x30F7, 0x8139A735}, - {0x30F8, 0x8139A736}, - {0x30F9, 0x8139A737}, - {0x30FA, 0x8139A738}, - {0x30FB, 0x8139A739}, - {0x30FF, 0x8139A830}, - {0x3100, 0x8139A831}, - {0x3101, 0x8139A832}, - {0x3102, 0x8139A833}, - {0x3103, 0x8139A834}, - {0x3104, 0x8139A835}, - {0x312A, 0x8139A836}, - {0x312B, 0x8139A837}, - {0x312C, 0x8139A838}, - {0x312D, 0x8139A839}, - {0x312E, 0x8139A930}, - {0x312F, 0x8139A931}, - {0x3130, 0x8139A932}, - {0x3131, 0x8139A933}, - {0x3132, 0x8139A934}, - {0x3133, 0x8139A935}, - {0x3134, 0x8139A936}, - {0x3135, 0x8139A937}, - {0x3136, 0x8139A938}, - {0x3137, 0x8139A939}, - {0x3138, 0x8139AA30}, - {0x3139, 0x8139AA31}, - {0x313A, 0x8139AA32}, - {0x313B, 0x8139AA33}, - {0x313C, 0x8139AA34}, - {0x313D, 0x8139AA35}, - {0x313E, 0x8139AA36}, - {0x313F, 0x8139AA37}, - {0x3140, 0x8139AA38}, - {0x3141, 0x8139AA39}, - {0x3142, 0x8139AB30}, - {0x3143, 0x8139AB31}, - {0x3144, 0x8139AB32}, - {0x3145, 0x8139AB33}, - {0x3146, 0x8139AB34}, - {0x3147, 0x8139AB35}, - {0x3148, 0x8139AB36}, - {0x3149, 0x8139AB37}, - {0x314A, 0x8139AB38}, - {0x314B, 0x8139AB39}, - {0x314C, 0x8139AC30}, - {0x314D, 0x8139AC31}, - {0x314E, 0x8139AC32}, - {0x314F, 0x8139AC33}, - {0x3150, 0x8139AC34}, - {0x3151, 0x8139AC35}, - {0x3152, 0x8139AC36}, - {0x3153, 0x8139AC37}, - {0x3154, 0x8139AC38}, - {0x3155, 0x8139AC39}, - {0x3156, 0x8139AD30}, - {0x3157, 0x8139AD31}, - {0x3158, 0x8139AD32}, - {0x3159, 0x8139AD33}, - {0x315A, 0x8139AD34}, - {0x315B, 0x8139AD35}, - {0x315C, 0x8139AD36}, - {0x315D, 0x8139AD37}, - {0x315E, 0x8139AD38}, - {0x315F, 0x8139AD39}, - {0x3160, 0x8139AE30}, - {0x3161, 0x8139AE31}, - {0x3162, 0x8139AE32}, - {0x3163, 0x8139AE33}, - {0x3164, 0x8139AE34}, - {0x3165, 0x8139AE35}, - {0x3166, 0x8139AE36}, - {0x3167, 0x8139AE37}, - {0x3168, 0x8139AE38}, - {0x3169, 0x8139AE39}, - {0x316A, 0x8139AF30}, - {0x316B, 0x8139AF31}, - {0x316C, 0x8139AF32}, - {0x316D, 0x8139AF33}, - {0x316E, 0x8139AF34}, - {0x316F, 0x8139AF35}, - {0x3170, 0x8139AF36}, - {0x3171, 0x8139AF37}, - {0x3172, 0x8139AF38}, - {0x3173, 0x8139AF39}, - {0x3174, 0x8139B030}, - {0x3175, 0x8139B031}, - {0x3176, 0x8139B032}, - {0x3177, 0x8139B033}, - {0x3178, 0x8139B034}, - {0x3179, 0x8139B035}, - {0x317A, 0x8139B036}, - {0x317B, 0x8139B037}, - {0x317C, 0x8139B038}, - {0x317D, 0x8139B039}, - {0x317E, 0x8139B130}, - {0x317F, 0x8139B131}, - {0x3180, 0x8139B132}, - {0x3181, 0x8139B133}, - {0x3182, 0x8139B134}, - {0x3183, 0x8139B135}, - {0x3184, 0x8139B136}, - {0x3185, 0x8139B137}, - {0x3186, 0x8139B138}, - {0x3187, 0x8139B139}, - {0x3188, 0x8139B230}, - {0x3189, 0x8139B231}, - {0x318A, 0x8139B232}, - {0x318B, 0x8139B233}, - {0x318C, 0x8139B234}, - {0x318D, 0x8139B235}, - {0x318E, 0x8139B236}, - {0x318F, 0x8139B237}, - {0x3190, 0x8139B238}, - {0x3191, 0x8139B239}, - {0x3192, 0x8139B330}, - {0x3193, 0x8139B331}, - {0x3194, 0x8139B332}, - {0x3195, 0x8139B333}, - {0x3196, 0x8139B334}, - {0x3197, 0x8139B335}, - {0x3198, 0x8139B336}, - {0x3199, 0x8139B337}, - {0x319A, 0x8139B338}, - {0x319B, 0x8139B339}, - {0x319C, 0x8139B430}, - {0x319D, 0x8139B431}, - {0x319E, 0x8139B432}, - {0x319F, 0x8139B433}, - {0x31A0, 0x8139B434}, - {0x31A1, 0x8139B435}, - {0x31A2, 0x8139B436}, - {0x31A3, 0x8139B437}, - {0x31A4, 0x8139B438}, - {0x31A5, 0x8139B439}, - {0x31A6, 0x8139B530}, - {0x31A7, 0x8139B531}, - {0x31A8, 0x8139B532}, - {0x31A9, 0x8139B533}, - {0x31AA, 0x8139B534}, - {0x31AB, 0x8139B535}, - {0x31AC, 0x8139B536}, - {0x31AD, 0x8139B537}, - {0x31AE, 0x8139B538}, - {0x31AF, 0x8139B539}, - {0x31B0, 0x8139B630}, - {0x31B1, 0x8139B631}, - {0x31B2, 0x8139B632}, - {0x31B3, 0x8139B633}, - {0x31B4, 0x8139B634}, - {0x31B5, 0x8139B635}, - {0x31B6, 0x8139B636}, - {0x31B7, 0x8139B637}, - {0x31B8, 0x8139B638}, - {0x31B9, 0x8139B639}, - {0x31BA, 0x8139B730}, - {0x31BB, 0x8139B731}, - {0x31BC, 0x8139B732}, - {0x31BD, 0x8139B733}, - {0x31BE, 0x8139B734}, - {0x31BF, 0x8139B735}, - {0x31C0, 0x8139B736}, - {0x31C1, 0x8139B737}, - {0x31C2, 0x8139B738}, - {0x31C3, 0x8139B739}, - {0x31C4, 0x8139B830}, - {0x31C5, 0x8139B831}, - {0x31C6, 0x8139B832}, - {0x31C7, 0x8139B833}, - {0x31C8, 0x8139B834}, - {0x31C9, 0x8139B835}, - {0x31CA, 0x8139B836}, - {0x31CB, 0x8139B837}, - {0x31CC, 0x8139B838}, - {0x31CD, 0x8139B839}, - {0x31CE, 0x8139B930}, - {0x31CF, 0x8139B931}, - {0x31D0, 0x8139B932}, - {0x31D1, 0x8139B933}, - {0x31D2, 0x8139B934}, - {0x31D3, 0x8139B935}, - {0x31D4, 0x8139B936}, - {0x31D5, 0x8139B937}, - {0x31D6, 0x8139B938}, - {0x31D7, 0x8139B939}, - {0x31D8, 0x8139BA30}, - {0x31D9, 0x8139BA31}, - {0x31DA, 0x8139BA32}, - {0x31DB, 0x8139BA33}, - {0x31DC, 0x8139BA34}, - {0x31DD, 0x8139BA35}, - {0x31DE, 0x8139BA36}, - {0x31DF, 0x8139BA37}, - {0x31E0, 0x8139BA38}, - {0x31E1, 0x8139BA39}, - {0x31E2, 0x8139BB30}, - {0x31E3, 0x8139BB31}, - {0x31E4, 0x8139BB32}, - {0x31E5, 0x8139BB33}, - {0x31E6, 0x8139BB34}, - {0x31E7, 0x8139BB35}, - {0x31E8, 0x8139BB36}, - {0x31E9, 0x8139BB37}, - {0x31EA, 0x8139BB38}, - {0x31EB, 0x8139BB39}, - {0x31EC, 0x8139BC30}, - {0x31ED, 0x8139BC31}, - {0x31EE, 0x8139BC32}, - {0x31EF, 0x8139BC33}, - {0x31F0, 0x8139BC34}, - {0x31F1, 0x8139BC35}, - {0x31F2, 0x8139BC36}, - {0x31F3, 0x8139BC37}, - {0x31F4, 0x8139BC38}, - {0x31F5, 0x8139BC39}, - {0x31F6, 0x8139BD30}, - {0x31F7, 0x8139BD31}, - {0x31F8, 0x8139BD32}, - {0x31F9, 0x8139BD33}, - {0x31FA, 0x8139BD34}, - {0x31FB, 0x8139BD35}, - {0x31FC, 0x8139BD36}, - {0x31FD, 0x8139BD37}, - {0x31FE, 0x8139BD38}, - {0x31FF, 0x8139BD39}, - {0x3200, 0x8139BE30}, - {0x3201, 0x8139BE31}, - {0x3202, 0x8139BE32}, - {0x3203, 0x8139BE33}, - {0x3204, 0x8139BE34}, - {0x3205, 0x8139BE35}, - {0x3206, 0x8139BE36}, - {0x3207, 0x8139BE37}, - {0x3208, 0x8139BE38}, - {0x3209, 0x8139BE39}, - {0x320A, 0x8139BF30}, - {0x320B, 0x8139BF31}, - {0x320C, 0x8139BF32}, - {0x320D, 0x8139BF33}, - {0x320E, 0x8139BF34}, - {0x320F, 0x8139BF35}, - {0x3210, 0x8139BF36}, - {0x3211, 0x8139BF37}, - {0x3212, 0x8139BF38}, - {0x3213, 0x8139BF39}, - {0x3214, 0x8139C030}, - {0x3215, 0x8139C031}, - {0x3216, 0x8139C032}, - {0x3217, 0x8139C033}, - {0x3218, 0x8139C034}, - {0x3219, 0x8139C035}, - {0x321A, 0x8139C036}, - {0x321B, 0x8139C037}, - {0x321C, 0x8139C038}, - {0x321D, 0x8139C039}, - {0x321E, 0x8139C130}, - {0x321F, 0x8139C131}, - {0x322A, 0x8139C132}, - {0x322B, 0x8139C133}, - {0x322C, 0x8139C134}, - {0x322D, 0x8139C135}, - {0x322E, 0x8139C136}, - {0x322F, 0x8139C137}, - {0x3230, 0x8139C138}, - {0x3232, 0x8139C139}, - {0x3233, 0x8139C230}, - {0x3234, 0x8139C231}, - {0x3235, 0x8139C232}, - {0x3236, 0x8139C233}, - {0x3237, 0x8139C234}, - {0x3238, 0x8139C235}, - {0x3239, 0x8139C236}, - {0x323A, 0x8139C237}, - {0x323B, 0x8139C238}, - {0x323C, 0x8139C239}, - {0x323D, 0x8139C330}, - {0x323E, 0x8139C331}, - {0x323F, 0x8139C332}, - {0x3240, 0x8139C333}, - {0x3241, 0x8139C334}, - {0x3242, 0x8139C335}, - {0x3243, 0x8139C336}, - {0x3244, 0x8139C337}, - {0x3245, 0x8139C338}, - {0x3246, 0x8139C339}, - {0x3247, 0x8139C430}, - {0x3248, 0x8139C431}, - {0x3249, 0x8139C432}, - {0x324A, 0x8139C433}, - {0x324B, 0x8139C434}, - {0x324C, 0x8139C435}, - {0x324D, 0x8139C436}, - {0x324E, 0x8139C437}, - {0x324F, 0x8139C438}, - {0x3250, 0x8139C439}, - {0x3251, 0x8139C530}, - {0x3252, 0x8139C531}, - {0x3253, 0x8139C532}, - {0x3254, 0x8139C533}, - {0x3255, 0x8139C534}, - {0x3256, 0x8139C535}, - {0x3257, 0x8139C536}, - {0x3258, 0x8139C537}, - {0x3259, 0x8139C538}, - {0x325A, 0x8139C539}, - {0x325B, 0x8139C630}, - {0x325C, 0x8139C631}, - {0x325D, 0x8139C632}, - {0x325E, 0x8139C633}, - {0x325F, 0x8139C634}, - {0x3260, 0x8139C635}, - {0x3261, 0x8139C636}, - {0x3262, 0x8139C637}, - {0x3263, 0x8139C638}, - {0x3264, 0x8139C639}, - {0x3265, 0x8139C730}, - {0x3266, 0x8139C731}, - {0x3267, 0x8139C732}, - {0x3268, 0x8139C733}, - {0x3269, 0x8139C734}, - {0x326A, 0x8139C735}, - {0x326B, 0x8139C736}, - {0x326C, 0x8139C737}, - {0x326D, 0x8139C738}, - {0x326E, 0x8139C739}, - {0x326F, 0x8139C830}, - {0x3270, 0x8139C831}, - {0x3271, 0x8139C832}, - {0x3272, 0x8139C833}, - {0x3273, 0x8139C834}, - {0x3274, 0x8139C835}, - {0x3275, 0x8139C836}, - {0x3276, 0x8139C837}, - {0x3277, 0x8139C838}, - {0x3278, 0x8139C839}, - {0x3279, 0x8139C930}, - {0x327A, 0x8139C931}, - {0x327B, 0x8139C932}, - {0x327C, 0x8139C933}, - {0x327D, 0x8139C934}, - {0x327E, 0x8139C935}, - {0x327F, 0x8139C936}, - {0x3280, 0x8139C937}, - {0x3281, 0x8139C938}, - {0x3282, 0x8139C939}, - {0x3283, 0x8139CA30}, - {0x3284, 0x8139CA31}, - {0x3285, 0x8139CA32}, - {0x3286, 0x8139CA33}, - {0x3287, 0x8139CA34}, - {0x3288, 0x8139CA35}, - {0x3289, 0x8139CA36}, - {0x328A, 0x8139CA37}, - {0x328B, 0x8139CA38}, - {0x328C, 0x8139CA39}, - {0x328D, 0x8139CB30}, - {0x328E, 0x8139CB31}, - {0x328F, 0x8139CB32}, - {0x3290, 0x8139CB33}, - {0x3291, 0x8139CB34}, - {0x3292, 0x8139CB35}, - {0x3293, 0x8139CB36}, - {0x3294, 0x8139CB37}, - {0x3295, 0x8139CB38}, - {0x3296, 0x8139CB39}, - {0x3297, 0x8139CC30}, - {0x3298, 0x8139CC31}, - {0x3299, 0x8139CC32}, - {0x329A, 0x8139CC33}, - {0x329B, 0x8139CC34}, - {0x329C, 0x8139CC35}, - {0x329D, 0x8139CC36}, - {0x329E, 0x8139CC37}, - {0x329F, 0x8139CC38}, - {0x32A0, 0x8139CC39}, - {0x32A1, 0x8139CD30}, - {0x32A2, 0x8139CD31}, - {0x32A4, 0x8139CD32}, - {0x32A5, 0x8139CD33}, - {0x32A6, 0x8139CD34}, - {0x32A7, 0x8139CD35}, - {0x32A8, 0x8139CD36}, - {0x32A9, 0x8139CD37}, - {0x32AA, 0x8139CD38}, - {0x32AB, 0x8139CD39}, - {0x32AC, 0x8139CE30}, - {0x32AD, 0x8139CE31}, - {0x32AE, 0x8139CE32}, - {0x32AF, 0x8139CE33}, - {0x32B0, 0x8139CE34}, - {0x32B1, 0x8139CE35}, - {0x32B2, 0x8139CE36}, - {0x32B3, 0x8139CE37}, - {0x32B4, 0x8139CE38}, - {0x32B5, 0x8139CE39}, - {0x32B6, 0x8139CF30}, - {0x32B7, 0x8139CF31}, - {0x32B8, 0x8139CF32}, - {0x32B9, 0x8139CF33}, - {0x32BA, 0x8139CF34}, - {0x32BB, 0x8139CF35}, - {0x32BC, 0x8139CF36}, - {0x32BD, 0x8139CF37}, - {0x32BE, 0x8139CF38}, - {0x32BF, 0x8139CF39}, - {0x32C0, 0x8139D030}, - {0x32C1, 0x8139D031}, - {0x32C2, 0x8139D032}, - {0x32C3, 0x8139D033}, - {0x32C4, 0x8139D034}, - {0x32C5, 0x8139D035}, - {0x32C6, 0x8139D036}, - {0x32C7, 0x8139D037}, - {0x32C8, 0x8139D038}, - {0x32C9, 0x8139D039}, - {0x32CA, 0x8139D130}, - {0x32CB, 0x8139D131}, - {0x32CC, 0x8139D132}, - {0x32CD, 0x8139D133}, - {0x32CE, 0x8139D134}, - {0x32CF, 0x8139D135}, - {0x32D0, 0x8139D136}, - {0x32D1, 0x8139D137}, - {0x32D2, 0x8139D138}, - {0x32D3, 0x8139D139}, - {0x32D4, 0x8139D230}, - {0x32D5, 0x8139D231}, - {0x32D6, 0x8139D232}, - {0x32D7, 0x8139D233}, - {0x32D8, 0x8139D234}, - {0x32D9, 0x8139D235}, - {0x32DA, 0x8139D236}, - {0x32DB, 0x8139D237}, - {0x32DC, 0x8139D238}, - {0x32DD, 0x8139D239}, - {0x32DE, 0x8139D330}, - {0x32DF, 0x8139D331}, - {0x32E0, 0x8139D332}, - {0x32E1, 0x8139D333}, - {0x32E2, 0x8139D334}, - {0x32E3, 0x8139D335}, - {0x32E4, 0x8139D336}, - {0x32E5, 0x8139D337}, - {0x32E6, 0x8139D338}, - {0x32E7, 0x8139D339}, - {0x32E8, 0x8139D430}, - {0x32E9, 0x8139D431}, - {0x32EA, 0x8139D432}, - {0x32EB, 0x8139D433}, - {0x32EC, 0x8139D434}, - {0x32ED, 0x8139D435}, - {0x32EE, 0x8139D436}, - {0x32EF, 0x8139D437}, - {0x32F0, 0x8139D438}, - {0x32F1, 0x8139D439}, - {0x32F2, 0x8139D530}, - {0x32F3, 0x8139D531}, - {0x32F4, 0x8139D532}, - {0x32F5, 0x8139D533}, - {0x32F6, 0x8139D534}, - {0x32F7, 0x8139D535}, - {0x32F8, 0x8139D536}, - {0x32F9, 0x8139D537}, - {0x32FA, 0x8139D538}, - {0x32FB, 0x8139D539}, - {0x32FC, 0x8139D630}, - {0x32FD, 0x8139D631}, - {0x32FE, 0x8139D632}, - {0x32FF, 0x8139D633}, - {0x3300, 0x8139D634}, - {0x3301, 0x8139D635}, - {0x3302, 0x8139D636}, - {0x3303, 0x8139D637}, - {0x3304, 0x8139D638}, - {0x3305, 0x8139D639}, - {0x3306, 0x8139D730}, - {0x3307, 0x8139D731}, - {0x3308, 0x8139D732}, - {0x3309, 0x8139D733}, - {0x330A, 0x8139D734}, - {0x330B, 0x8139D735}, - {0x330C, 0x8139D736}, - {0x330D, 0x8139D737}, - {0x330E, 0x8139D738}, - {0x330F, 0x8139D739}, - {0x3310, 0x8139D830}, - {0x3311, 0x8139D831}, - {0x3312, 0x8139D832}, - {0x3313, 0x8139D833}, - {0x3314, 0x8139D834}, - {0x3315, 0x8139D835}, - {0x3316, 0x8139D836}, - {0x3317, 0x8139D837}, - {0x3318, 0x8139D838}, - {0x3319, 0x8139D839}, - {0x331A, 0x8139D930}, - {0x331B, 0x8139D931}, - {0x331C, 0x8139D932}, - {0x331D, 0x8139D933}, - {0x331E, 0x8139D934}, - {0x331F, 0x8139D935}, - {0x3320, 0x8139D936}, - {0x3321, 0x8139D937}, - {0x3322, 0x8139D938}, - {0x3323, 0x8139D939}, - {0x3324, 0x8139DA30}, - {0x3325, 0x8139DA31}, - {0x3326, 0x8139DA32}, - {0x3327, 0x8139DA33}, - {0x3328, 0x8139DA34}, - {0x3329, 0x8139DA35}, - {0x332A, 0x8139DA36}, - {0x332B, 0x8139DA37}, - {0x332C, 0x8139DA38}, - {0x332D, 0x8139DA39}, - {0x332E, 0x8139DB30}, - {0x332F, 0x8139DB31}, - {0x3330, 0x8139DB32}, - {0x3331, 0x8139DB33}, - {0x3332, 0x8139DB34}, - {0x3333, 0x8139DB35}, - {0x3334, 0x8139DB36}, - {0x3335, 0x8139DB37}, - {0x3336, 0x8139DB38}, - {0x3337, 0x8139DB39}, - {0x3338, 0x8139DC30}, - {0x3339, 0x8139DC31}, - {0x333A, 0x8139DC32}, - {0x333B, 0x8139DC33}, - {0x333C, 0x8139DC34}, - {0x333D, 0x8139DC35}, - {0x333E, 0x8139DC36}, - {0x333F, 0x8139DC37}, - {0x3340, 0x8139DC38}, - {0x3341, 0x8139DC39}, - {0x3342, 0x8139DD30}, - {0x3343, 0x8139DD31}, - {0x3344, 0x8139DD32}, - {0x3345, 0x8139DD33}, - {0x3346, 0x8139DD34}, - {0x3347, 0x8139DD35}, - {0x3348, 0x8139DD36}, - {0x3349, 0x8139DD37}, - {0x334A, 0x8139DD38}, - {0x334B, 0x8139DD39}, - {0x334C, 0x8139DE30}, - {0x334D, 0x8139DE31}, - {0x334E, 0x8139DE32}, - {0x334F, 0x8139DE33}, - {0x3350, 0x8139DE34}, - {0x3351, 0x8139DE35}, - {0x3352, 0x8139DE36}, - {0x3353, 0x8139DE37}, - {0x3354, 0x8139DE38}, - {0x3355, 0x8139DE39}, - {0x3356, 0x8139DF30}, - {0x3357, 0x8139DF31}, - {0x3358, 0x8139DF32}, - {0x3359, 0x8139DF33}, - {0x335A, 0x8139DF34}, - {0x335B, 0x8139DF35}, - {0x335C, 0x8139DF36}, - {0x335D, 0x8139DF37}, - {0x335E, 0x8139DF38}, - {0x335F, 0x8139DF39}, - {0x3360, 0x8139E030}, - {0x3361, 0x8139E031}, - {0x3362, 0x8139E032}, - {0x3363, 0x8139E033}, - {0x3364, 0x8139E034}, - {0x3365, 0x8139E035}, - {0x3366, 0x8139E036}, - {0x3367, 0x8139E037}, - {0x3368, 0x8139E038}, - {0x3369, 0x8139E039}, - {0x336A, 0x8139E130}, - {0x336B, 0x8139E131}, - {0x336C, 0x8139E132}, - {0x336D, 0x8139E133}, - {0x336E, 0x8139E134}, - {0x336F, 0x8139E135}, - {0x3370, 0x8139E136}, - {0x3371, 0x8139E137}, - {0x3372, 0x8139E138}, - {0x3373, 0x8139E139}, - {0x3374, 0x8139E230}, - {0x3375, 0x8139E231}, - {0x3376, 0x8139E232}, - {0x3377, 0x8139E233}, - {0x3378, 0x8139E234}, - {0x3379, 0x8139E235}, - {0x337A, 0x8139E236}, - {0x337B, 0x8139E237}, - {0x337C, 0x8139E238}, - {0x337D, 0x8139E239}, - {0x337E, 0x8139E330}, - {0x337F, 0x8139E331}, - {0x3380, 0x8139E332}, - {0x3381, 0x8139E333}, - {0x3382, 0x8139E334}, - {0x3383, 0x8139E335}, - {0x3384, 0x8139E336}, - {0x3385, 0x8139E337}, - {0x3386, 0x8139E338}, - {0x3387, 0x8139E339}, - {0x3388, 0x8139E430}, - {0x3389, 0x8139E431}, - {0x338A, 0x8139E432}, - {0x338B, 0x8139E433}, - {0x338C, 0x8139E434}, - {0x338D, 0x8139E435}, - {0x3390, 0x8139E436}, - {0x3391, 0x8139E437}, - {0x3392, 0x8139E438}, - {0x3393, 0x8139E439}, - {0x3394, 0x8139E530}, - {0x3395, 0x8139E531}, - {0x3396, 0x8139E532}, - {0x3397, 0x8139E533}, - {0x3398, 0x8139E534}, - {0x3399, 0x8139E535}, - {0x339A, 0x8139E536}, - {0x339B, 0x8139E537}, - {0x339F, 0x8139E538}, - {0x33A0, 0x8139E539}, - {0x33A2, 0x8139E630}, - {0x33A3, 0x8139E631}, - {0x33A4, 0x8139E632}, - {0x33A5, 0x8139E633}, - {0x33A6, 0x8139E634}, - {0x33A7, 0x8139E635}, - {0x33A8, 0x8139E636}, - {0x33A9, 0x8139E637}, - {0x33AA, 0x8139E638}, - {0x33AB, 0x8139E639}, - {0x33AC, 0x8139E730}, - {0x33AD, 0x8139E731}, - {0x33AE, 0x8139E732}, - {0x33AF, 0x8139E733}, - {0x33B0, 0x8139E734}, - {0x33B1, 0x8139E735}, - {0x33B2, 0x8139E736}, - {0x33B3, 0x8139E737}, - {0x33B4, 0x8139E738}, - {0x33B5, 0x8139E739}, - {0x33B6, 0x8139E830}, - {0x33B7, 0x8139E831}, - {0x33B8, 0x8139E832}, - {0x33B9, 0x8139E833}, - {0x33BA, 0x8139E834}, - {0x33BB, 0x8139E835}, - {0x33BC, 0x8139E836}, - {0x33BD, 0x8139E837}, - {0x33BE, 0x8139E838}, - {0x33BF, 0x8139E839}, - {0x33C0, 0x8139E930}, - {0x33C1, 0x8139E931}, - {0x33C2, 0x8139E932}, - {0x33C3, 0x8139E933}, - {0x33C5, 0x8139E934}, - {0x33C6, 0x8139E935}, - {0x33C7, 0x8139E936}, - {0x33C8, 0x8139E937}, - {0x33C9, 0x8139E938}, - {0x33CA, 0x8139E939}, - {0x33CB, 0x8139EA30}, - {0x33CC, 0x8139EA31}, - {0x33CD, 0x8139EA32}, - {0x33CF, 0x8139EA33}, - {0x33D0, 0x8139EA34}, - {0x33D3, 0x8139EA35}, - {0x33D4, 0x8139EA36}, - {0x33D6, 0x8139EA37}, - {0x33D7, 0x8139EA38}, - {0x33D8, 0x8139EA39}, - {0x33D9, 0x8139EB30}, - {0x33DA, 0x8139EB31}, - {0x33DB, 0x8139EB32}, - {0x33DC, 0x8139EB33}, - {0x33DD, 0x8139EB34}, - {0x33DE, 0x8139EB35}, - {0x33DF, 0x8139EB36}, - {0x33E0, 0x8139EB37}, - {0x33E1, 0x8139EB38}, - {0x33E2, 0x8139EB39}, - {0x33E3, 0x8139EC30}, - {0x33E4, 0x8139EC31}, - {0x33E5, 0x8139EC32}, - {0x33E6, 0x8139EC33}, - {0x33E7, 0x8139EC34}, - {0x33E8, 0x8139EC35}, - {0x33E9, 0x8139EC36}, - {0x33EA, 0x8139EC37}, - {0x33EB, 0x8139EC38}, - {0x33EC, 0x8139EC39}, - {0x33ED, 0x8139ED30}, - {0x33EE, 0x8139ED31}, - {0x33EF, 0x8139ED32}, - {0x33F0, 0x8139ED33}, - {0x33F1, 0x8139ED34}, - {0x33F2, 0x8139ED35}, - {0x33F3, 0x8139ED36}, - {0x33F4, 0x8139ED37}, - {0x33F5, 0x8139ED38}, - {0x33F6, 0x8139ED39}, - {0x33F7, 0x8139EE30}, - {0x33F8, 0x8139EE31}, - {0x33F9, 0x8139EE32}, - {0x33FA, 0x8139EE33}, - {0x33FB, 0x8139EE34}, - {0x33FC, 0x8139EE35}, - {0x33FD, 0x8139EE36}, - {0x33FE, 0x8139EE37}, - {0x33FF, 0x8139EE38}, - {0x3400, 0x8139EE39}, - {0x3401, 0x8139EF30}, - {0x3402, 0x8139EF31}, - {0x3403, 0x8139EF32}, - {0x3404, 0x8139EF33}, - {0x3405, 0x8139EF34}, - {0x3406, 0x8139EF35}, - {0x3407, 0x8139EF36}, - {0x3408, 0x8139EF37}, - {0x3409, 0x8139EF38}, - {0x340A, 0x8139EF39}, - {0x340B, 0x8139F030}, - {0x340C, 0x8139F031}, - {0x340D, 0x8139F032}, - {0x340E, 0x8139F033}, - {0x340F, 0x8139F034}, - {0x3410, 0x8139F035}, - {0x3411, 0x8139F036}, - {0x3412, 0x8139F037}, - {0x3413, 0x8139F038}, - {0x3414, 0x8139F039}, - {0x3415, 0x8139F130}, - {0x3416, 0x8139F131}, - {0x3417, 0x8139F132}, - {0x3418, 0x8139F133}, - {0x3419, 0x8139F134}, - {0x341A, 0x8139F135}, - {0x341B, 0x8139F136}, - {0x341C, 0x8139F137}, - {0x341D, 0x8139F138}, - {0x341E, 0x8139F139}, - {0x341F, 0x8139F230}, - {0x3420, 0x8139F231}, - {0x3421, 0x8139F232}, - {0x3422, 0x8139F233}, - {0x3423, 0x8139F234}, - {0x3424, 0x8139F235}, - {0x3425, 0x8139F236}, - {0x3426, 0x8139F237}, - {0x3427, 0x8139F238}, - {0x3428, 0x8139F239}, - {0x3429, 0x8139F330}, - {0x342A, 0x8139F331}, - {0x342B, 0x8139F332}, - {0x342C, 0x8139F333}, - {0x342D, 0x8139F334}, - {0x342E, 0x8139F335}, - {0x342F, 0x8139F336}, - {0x3430, 0x8139F337}, - {0x3431, 0x8139F338}, - {0x3432, 0x8139F339}, - {0x3433, 0x8139F430}, - {0x3434, 0x8139F431}, - {0x3435, 0x8139F432}, - {0x3436, 0x8139F433}, - {0x3437, 0x8139F434}, - {0x3438, 0x8139F435}, - {0x3439, 0x8139F436}, - {0x343A, 0x8139F437}, - {0x343B, 0x8139F438}, - {0x343C, 0x8139F439}, - {0x343D, 0x8139F530}, - {0x343E, 0x8139F531}, - {0x343F, 0x8139F532}, - {0x3440, 0x8139F533}, - {0x3441, 0x8139F534}, - {0x3442, 0x8139F535}, - {0x3443, 0x8139F536}, - {0x3444, 0x8139F537}, - {0x3445, 0x8139F538}, - {0x3446, 0x8139F539}, - {0x3448, 0x8139F630}, - {0x3449, 0x8139F631}, - {0x344A, 0x8139F632}, - {0x344B, 0x8139F633}, - {0x344C, 0x8139F634}, - {0x344D, 0x8139F635}, - {0x344E, 0x8139F636}, - {0x344F, 0x8139F637}, - {0x3450, 0x8139F638}, - {0x3451, 0x8139F639}, - {0x3452, 0x8139F730}, - {0x3453, 0x8139F731}, - {0x3454, 0x8139F732}, - {0x3455, 0x8139F733}, - {0x3456, 0x8139F734}, - {0x3457, 0x8139F735}, - {0x3458, 0x8139F736}, - {0x3459, 0x8139F737}, - {0x345A, 0x8139F738}, - {0x345B, 0x8139F739}, - {0x345C, 0x8139F830}, - {0x345D, 0x8139F831}, - {0x345E, 0x8139F832}, - {0x345F, 0x8139F833}, - {0x3460, 0x8139F834}, - {0x3461, 0x8139F835}, - {0x3462, 0x8139F836}, - {0x3463, 0x8139F837}, - {0x3464, 0x8139F838}, - {0x3465, 0x8139F839}, - {0x3466, 0x8139F930}, - {0x3467, 0x8139F931}, - {0x3468, 0x8139F932}, - {0x3469, 0x8139F933}, - {0x346A, 0x8139F934}, - {0x346B, 0x8139F935}, - {0x346C, 0x8139F936}, - {0x346D, 0x8139F937}, - {0x346E, 0x8139F938}, - {0x346F, 0x8139F939}, - {0x3470, 0x8139FA30}, - {0x3471, 0x8139FA31}, - {0x3472, 0x8139FA32}, - {0x3474, 0x8139FA33}, - {0x3475, 0x8139FA34}, - {0x3476, 0x8139FA35}, - {0x3477, 0x8139FA36}, - {0x3478, 0x8139FA37}, - {0x3479, 0x8139FA38}, - {0x347A, 0x8139FA39}, - {0x347B, 0x8139FB30}, - {0x347C, 0x8139FB31}, - {0x347D, 0x8139FB32}, - {0x347E, 0x8139FB33}, - {0x347F, 0x8139FB34}, - {0x3480, 0x8139FB35}, - {0x3481, 0x8139FB36}, - {0x3482, 0x8139FB37}, - {0x3483, 0x8139FB38}, - {0x3484, 0x8139FB39}, - {0x3485, 0x8139FC30}, - {0x3486, 0x8139FC31}, - {0x3487, 0x8139FC32}, - {0x3488, 0x8139FC33}, - {0x3489, 0x8139FC34}, - {0x348A, 0x8139FC35}, - {0x348B, 0x8139FC36}, - {0x348C, 0x8139FC37}, - {0x348D, 0x8139FC38}, - {0x348E, 0x8139FC39}, - {0x348F, 0x8139FD30}, - {0x3490, 0x8139FD31}, - {0x3491, 0x8139FD32}, - {0x3492, 0x8139FD33}, - {0x3493, 0x8139FD34}, - {0x3494, 0x8139FD35}, - {0x3495, 0x8139FD36}, - {0x3496, 0x8139FD37}, - {0x3497, 0x8139FD38}, - {0x3498, 0x8139FD39}, - {0x3499, 0x8139FE30}, - {0x349A, 0x8139FE31}, - {0x349B, 0x8139FE32}, - {0x349C, 0x8139FE33}, - {0x349D, 0x8139FE34}, - {0x349E, 0x8139FE35}, - {0x349F, 0x8139FE36}, - {0x34A0, 0x8139FE37}, - {0x34A1, 0x8139FE38}, - {0x34A2, 0x8139FE39}, - {0x34A3, 0x82308130}, - {0x34A4, 0x82308131}, - {0x34A5, 0x82308132}, - {0x34A6, 0x82308133}, - {0x34A7, 0x82308134}, - {0x34A8, 0x82308135}, - {0x34A9, 0x82308136}, - {0x34AA, 0x82308137}, - {0x34AB, 0x82308138}, - {0x34AC, 0x82308139}, - {0x34AD, 0x82308230}, - {0x34AE, 0x82308231}, - {0x34AF, 0x82308232}, - {0x34B0, 0x82308233}, - {0x34B1, 0x82308234}, - {0x34B2, 0x82308235}, - {0x34B3, 0x82308236}, - {0x34B4, 0x82308237}, - {0x34B5, 0x82308238}, - {0x34B6, 0x82308239}, - {0x34B7, 0x82308330}, - {0x34B8, 0x82308331}, - {0x34B9, 0x82308332}, - {0x34BA, 0x82308333}, - {0x34BB, 0x82308334}, - {0x34BC, 0x82308335}, - {0x34BD, 0x82308336}, - {0x34BE, 0x82308337}, - {0x34BF, 0x82308338}, - {0x34C0, 0x82308339}, - {0x34C1, 0x82308430}, - {0x34C2, 0x82308431}, - {0x34C3, 0x82308432}, - {0x34C4, 0x82308433}, - {0x34C5, 0x82308434}, - {0x34C6, 0x82308435}, - {0x34C7, 0x82308436}, - {0x34C8, 0x82308437}, - {0x34C9, 0x82308438}, - {0x34CA, 0x82308439}, - {0x34CB, 0x82308530}, - {0x34CC, 0x82308531}, - {0x34CD, 0x82308532}, - {0x34CE, 0x82308533}, - {0x34CF, 0x82308534}, - {0x34D0, 0x82308535}, - {0x34D1, 0x82308536}, - {0x34D2, 0x82308537}, - {0x34D3, 0x82308538}, - {0x34D4, 0x82308539}, - {0x34D5, 0x82308630}, - {0x34D6, 0x82308631}, - {0x34D7, 0x82308632}, - {0x34D8, 0x82308633}, - {0x34D9, 0x82308634}, - {0x34DA, 0x82308635}, - {0x34DB, 0x82308636}, - {0x34DC, 0x82308637}, - {0x34DD, 0x82308638}, - {0x34DE, 0x82308639}, - {0x34DF, 0x82308730}, - {0x34E0, 0x82308731}, - {0x34E1, 0x82308732}, - {0x34E2, 0x82308733}, - {0x34E3, 0x82308734}, - {0x34E4, 0x82308735}, - {0x34E5, 0x82308736}, - {0x34E6, 0x82308737}, - {0x34E7, 0x82308738}, - {0x34E8, 0x82308739}, - {0x34E9, 0x82308830}, - {0x34EA, 0x82308831}, - {0x34EB, 0x82308832}, - {0x34EC, 0x82308833}, - {0x34ED, 0x82308834}, - {0x34EE, 0x82308835}, - {0x34EF, 0x82308836}, - {0x34F0, 0x82308837}, - {0x34F1, 0x82308838}, - {0x34F2, 0x82308839}, - {0x34F3, 0x82308930}, - {0x34F4, 0x82308931}, - {0x34F5, 0x82308932}, - {0x34F6, 0x82308933}, - {0x34F7, 0x82308934}, - {0x34F8, 0x82308935}, - {0x34F9, 0x82308936}, - {0x34FA, 0x82308937}, - {0x34FB, 0x82308938}, - {0x34FC, 0x82308939}, - {0x34FD, 0x82308A30}, - {0x34FE, 0x82308A31}, - {0x34FF, 0x82308A32}, - {0x3500, 0x82308A33}, - {0x3501, 0x82308A34}, - {0x3502, 0x82308A35}, - {0x3503, 0x82308A36}, - {0x3504, 0x82308A37}, - {0x3505, 0x82308A38}, - {0x3506, 0x82308A39}, - {0x3507, 0x82308B30}, - {0x3508, 0x82308B31}, - {0x3509, 0x82308B32}, - {0x350A, 0x82308B33}, - {0x350B, 0x82308B34}, - {0x350C, 0x82308B35}, - {0x350D, 0x82308B36}, - {0x350E, 0x82308B37}, - {0x350F, 0x82308B38}, - {0x3510, 0x82308B39}, - {0x3511, 0x82308C30}, - {0x3512, 0x82308C31}, - {0x3513, 0x82308C32}, - {0x3514, 0x82308C33}, - {0x3515, 0x82308C34}, - {0x3516, 0x82308C35}, - {0x3517, 0x82308C36}, - {0x3518, 0x82308C37}, - {0x3519, 0x82308C38}, - {0x351A, 0x82308C39}, - {0x351B, 0x82308D30}, - {0x351C, 0x82308D31}, - {0x351D, 0x82308D32}, - {0x351E, 0x82308D33}, - {0x351F, 0x82308D34}, - {0x3520, 0x82308D35}, - {0x3521, 0x82308D36}, - {0x3522, 0x82308D37}, - {0x3523, 0x82308D38}, - {0x3524, 0x82308D39}, - {0x3525, 0x82308E30}, - {0x3526, 0x82308E31}, - {0x3527, 0x82308E32}, - {0x3528, 0x82308E33}, - {0x3529, 0x82308E34}, - {0x352A, 0x82308E35}, - {0x352B, 0x82308E36}, - {0x352C, 0x82308E37}, - {0x352D, 0x82308E38}, - {0x352E, 0x82308E39}, - {0x352F, 0x82308F30}, - {0x3530, 0x82308F31}, - {0x3531, 0x82308F32}, - {0x3532, 0x82308F33}, - {0x3533, 0x82308F34}, - {0x3534, 0x82308F35}, - {0x3535, 0x82308F36}, - {0x3536, 0x82308F37}, - {0x3537, 0x82308F38}, - {0x3538, 0x82308F39}, - {0x3539, 0x82309030}, - {0x353A, 0x82309031}, - {0x353B, 0x82309032}, - {0x353C, 0x82309033}, - {0x353D, 0x82309034}, - {0x353E, 0x82309035}, - {0x353F, 0x82309036}, - {0x3540, 0x82309037}, - {0x3541, 0x82309038}, - {0x3542, 0x82309039}, - {0x3543, 0x82309130}, - {0x3544, 0x82309131}, - {0x3545, 0x82309132}, - {0x3546, 0x82309133}, - {0x3547, 0x82309134}, - {0x3548, 0x82309135}, - {0x3549, 0x82309136}, - {0x354A, 0x82309137}, - {0x354B, 0x82309138}, - {0x354C, 0x82309139}, - {0x354D, 0x82309230}, - {0x354E, 0x82309231}, - {0x354F, 0x82309232}, - {0x3550, 0x82309233}, - {0x3551, 0x82309234}, - {0x3552, 0x82309235}, - {0x3553, 0x82309236}, - {0x3554, 0x82309237}, - {0x3555, 0x82309238}, - {0x3556, 0x82309239}, - {0x3557, 0x82309330}, - {0x3558, 0x82309331}, - {0x3559, 0x82309332}, - {0x355A, 0x82309333}, - {0x355B, 0x82309334}, - {0x355C, 0x82309335}, - {0x355D, 0x82309336}, - {0x355E, 0x82309337}, - {0x355F, 0x82309338}, - {0x3560, 0x82309339}, - {0x3561, 0x82309430}, - {0x3562, 0x82309431}, - {0x3563, 0x82309432}, - {0x3564, 0x82309433}, - {0x3565, 0x82309434}, - {0x3566, 0x82309435}, - {0x3567, 0x82309436}, - {0x3568, 0x82309437}, - {0x3569, 0x82309438}, - {0x356A, 0x82309439}, - {0x356B, 0x82309530}, - {0x356C, 0x82309531}, - {0x356D, 0x82309532}, - {0x356E, 0x82309533}, - {0x356F, 0x82309534}, - {0x3570, 0x82309535}, - {0x3571, 0x82309536}, - {0x3572, 0x82309537}, - {0x3573, 0x82309538}, - {0x3574, 0x82309539}, - {0x3575, 0x82309630}, - {0x3576, 0x82309631}, - {0x3577, 0x82309632}, - {0x3578, 0x82309633}, - {0x3579, 0x82309634}, - {0x357A, 0x82309635}, - {0x357B, 0x82309636}, - {0x357C, 0x82309637}, - {0x357D, 0x82309638}, - {0x357E, 0x82309639}, - {0x357F, 0x82309730}, - {0x3580, 0x82309731}, - {0x3581, 0x82309732}, - {0x3582, 0x82309733}, - {0x3583, 0x82309734}, - {0x3584, 0x82309735}, - {0x3585, 0x82309736}, - {0x3586, 0x82309737}, - {0x3587, 0x82309738}, - {0x3588, 0x82309739}, - {0x3589, 0x82309830}, - {0x358A, 0x82309831}, - {0x358B, 0x82309832}, - {0x358C, 0x82309833}, - {0x358D, 0x82309834}, - {0x358E, 0x82309835}, - {0x358F, 0x82309836}, - {0x3590, 0x82309837}, - {0x3591, 0x82309838}, - {0x3592, 0x82309839}, - {0x3593, 0x82309930}, - {0x3594, 0x82309931}, - {0x3595, 0x82309932}, - {0x3596, 0x82309933}, - {0x3597, 0x82309934}, - {0x3598, 0x82309935}, - {0x3599, 0x82309936}, - {0x359A, 0x82309937}, - {0x359B, 0x82309938}, - {0x359C, 0x82309939}, - {0x359D, 0x82309A30}, - {0x359F, 0x82309A31}, - {0x35A0, 0x82309A32}, - {0x35A1, 0x82309A33}, - {0x35A2, 0x82309A34}, - {0x35A3, 0x82309A35}, - {0x35A4, 0x82309A36}, - {0x35A5, 0x82309A37}, - {0x35A6, 0x82309A38}, - {0x35A7, 0x82309A39}, - {0x35A8, 0x82309B30}, - {0x35A9, 0x82309B31}, - {0x35AA, 0x82309B32}, - {0x35AB, 0x82309B33}, - {0x35AC, 0x82309B34}, - {0x35AD, 0x82309B35}, - {0x35AE, 0x82309B36}, - {0x35AF, 0x82309B37}, - {0x35B0, 0x82309B38}, - {0x35B1, 0x82309B39}, - {0x35B2, 0x82309C30}, - {0x35B3, 0x82309C31}, - {0x35B4, 0x82309C32}, - {0x35B5, 0x82309C33}, - {0x35B6, 0x82309C34}, - {0x35B7, 0x82309C35}, - {0x35B8, 0x82309C36}, - {0x35B9, 0x82309C37}, - {0x35BA, 0x82309C38}, - {0x35BB, 0x82309C39}, - {0x35BC, 0x82309D30}, - {0x35BD, 0x82309D31}, - {0x35BE, 0x82309D32}, - {0x35BF, 0x82309D33}, - {0x35C0, 0x82309D34}, - {0x35C1, 0x82309D35}, - {0x35C2, 0x82309D36}, - {0x35C3, 0x82309D37}, - {0x35C4, 0x82309D38}, - {0x35C5, 0x82309D39}, - {0x35C6, 0x82309E30}, - {0x35C7, 0x82309E31}, - {0x35C8, 0x82309E32}, - {0x35C9, 0x82309E33}, - {0x35CA, 0x82309E34}, - {0x35CB, 0x82309E35}, - {0x35CC, 0x82309E36}, - {0x35CD, 0x82309E37}, - {0x35CE, 0x82309E38}, - {0x35CF, 0x82309E39}, - {0x35D0, 0x82309F30}, - {0x35D1, 0x82309F31}, - {0x35D2, 0x82309F32}, - {0x35D3, 0x82309F33}, - {0x35D4, 0x82309F34}, - {0x35D5, 0x82309F35}, - {0x35D6, 0x82309F36}, - {0x35D7, 0x82309F37}, - {0x35D8, 0x82309F38}, - {0x35D9, 0x82309F39}, - {0x35DA, 0x8230A030}, - {0x35DB, 0x8230A031}, - {0x35DC, 0x8230A032}, - {0x35DD, 0x8230A033}, - {0x35DE, 0x8230A034}, - {0x35DF, 0x8230A035}, - {0x35E0, 0x8230A036}, - {0x35E1, 0x8230A037}, - {0x35E2, 0x8230A038}, - {0x35E3, 0x8230A039}, - {0x35E4, 0x8230A130}, - {0x35E5, 0x8230A131}, - {0x35E6, 0x8230A132}, - {0x35E7, 0x8230A133}, - {0x35E8, 0x8230A134}, - {0x35E9, 0x8230A135}, - {0x35EA, 0x8230A136}, - {0x35EB, 0x8230A137}, - {0x35EC, 0x8230A138}, - {0x35ED, 0x8230A139}, - {0x35EE, 0x8230A230}, - {0x35EF, 0x8230A231}, - {0x35F0, 0x8230A232}, - {0x35F1, 0x8230A233}, - {0x35F2, 0x8230A234}, - {0x35F3, 0x8230A235}, - {0x35F4, 0x8230A236}, - {0x35F5, 0x8230A237}, - {0x35F6, 0x8230A238}, - {0x35F7, 0x8230A239}, - {0x35F8, 0x8230A330}, - {0x35F9, 0x8230A331}, - {0x35FA, 0x8230A332}, - {0x35FB, 0x8230A333}, - {0x35FC, 0x8230A334}, - {0x35FD, 0x8230A335}, - {0x35FE, 0x8230A336}, - {0x35FF, 0x8230A337}, - {0x3600, 0x8230A338}, - {0x3601, 0x8230A339}, - {0x3602, 0x8230A430}, - {0x3603, 0x8230A431}, - {0x3604, 0x8230A432}, - {0x3605, 0x8230A433}, - {0x3606, 0x8230A434}, - {0x3607, 0x8230A435}, - {0x3608, 0x8230A436}, - {0x3609, 0x8230A437}, - {0x360A, 0x8230A438}, - {0x360B, 0x8230A439}, - {0x360C, 0x8230A530}, - {0x360D, 0x8230A531}, - {0x360F, 0x8230A532}, - {0x3610, 0x8230A533}, - {0x3611, 0x8230A534}, - {0x3612, 0x8230A535}, - {0x3613, 0x8230A536}, - {0x3614, 0x8230A537}, - {0x3615, 0x8230A538}, - {0x3616, 0x8230A539}, - {0x3617, 0x8230A630}, - {0x3618, 0x8230A631}, - {0x3619, 0x8230A632}, - {0x3919, 0x8230F238}, - {0x391A, 0x8230F239}, - {0x391B, 0x8230F330}, - {0x391C, 0x8230F331}, - {0x391D, 0x8230F332}, - {0x391E, 0x8230F333}, - {0x391F, 0x8230F334}, - {0x3920, 0x8230F335}, - {0x3921, 0x8230F336}, - {0x3922, 0x8230F337}, - {0x3923, 0x8230F338}, - {0x3924, 0x8230F339}, - {0x3925, 0x8230F430}, - {0x3926, 0x8230F431}, - {0x3927, 0x8230F432}, - {0x3928, 0x8230F433}, - {0x3929, 0x8230F434}, - {0x392A, 0x8230F435}, - {0x392B, 0x8230F436}, - {0x392C, 0x8230F437}, - {0x392D, 0x8230F438}, - {0x392E, 0x8230F439}, - {0x392F, 0x8230F530}, - {0x3930, 0x8230F531}, - {0x3931, 0x8230F532}, - {0x3932, 0x8230F533}, - {0x3933, 0x8230F534}, - {0x3934, 0x8230F535}, - {0x3935, 0x8230F536}, - {0x3936, 0x8230F537}, - {0x3937, 0x8230F538}, - {0x3938, 0x8230F539}, - {0x3939, 0x8230F630}, - {0x393A, 0x8230F631}, - {0x393B, 0x8230F632}, - {0x393C, 0x8230F633}, - {0x393D, 0x8230F634}, - {0x393E, 0x8230F635}, - {0x393F, 0x8230F636}, - {0x3940, 0x8230F637}, - {0x3941, 0x8230F638}, - {0x3942, 0x8230F639}, - {0x3943, 0x8230F730}, - {0x3944, 0x8230F731}, - {0x3945, 0x8230F732}, - {0x3946, 0x8230F733}, - {0x3947, 0x8230F734}, - {0x3948, 0x8230F735}, - {0x3949, 0x8230F736}, - {0x394A, 0x8230F737}, - {0x394B, 0x8230F738}, - {0x394C, 0x8230F739}, - {0x394D, 0x8230F830}, - {0x394E, 0x8230F831}, - {0x394F, 0x8230F832}, - {0x3950, 0x8230F833}, - {0x3951, 0x8230F834}, - {0x3952, 0x8230F835}, - {0x3953, 0x8230F836}, - {0x3954, 0x8230F837}, - {0x3955, 0x8230F838}, - {0x3956, 0x8230F839}, - {0x3957, 0x8230F930}, - {0x3958, 0x8230F931}, - {0x3959, 0x8230F932}, - {0x395A, 0x8230F933}, - {0x395B, 0x8230F934}, - {0x395C, 0x8230F935}, - {0x395D, 0x8230F936}, - {0x395E, 0x8230F937}, - {0x395F, 0x8230F938}, - {0x3960, 0x8230F939}, - {0x3961, 0x8230FA30}, - {0x3962, 0x8230FA31}, - {0x3963, 0x8230FA32}, - {0x3964, 0x8230FA33}, - {0x3965, 0x8230FA34}, - {0x3966, 0x8230FA35}, - {0x3967, 0x8230FA36}, - {0x3968, 0x8230FA37}, - {0x3969, 0x8230FA38}, - {0x396A, 0x8230FA39}, - {0x396B, 0x8230FB30}, - {0x396C, 0x8230FB31}, - {0x396D, 0x8230FB32}, - {0x396F, 0x8230FB33}, - {0x3970, 0x8230FB34}, - {0x3971, 0x8230FB35}, - {0x3972, 0x8230FB36}, - {0x3973, 0x8230FB37}, - {0x3974, 0x8230FB38}, - {0x3975, 0x8230FB39}, - {0x3976, 0x8230FC30}, - {0x3977, 0x8230FC31}, - {0x3978, 0x8230FC32}, - {0x3979, 0x8230FC33}, - {0x397A, 0x8230FC34}, - {0x397B, 0x8230FC35}, - {0x397C, 0x8230FC36}, - {0x397D, 0x8230FC37}, - {0x397E, 0x8230FC38}, - {0x397F, 0x8230FC39}, - {0x3980, 0x8230FD30}, - {0x3981, 0x8230FD31}, - {0x3982, 0x8230FD32}, - {0x3983, 0x8230FD33}, - {0x3984, 0x8230FD34}, - {0x3985, 0x8230FD35}, - {0x3986, 0x8230FD36}, - {0x3987, 0x8230FD37}, - {0x3988, 0x8230FD38}, - {0x3989, 0x8230FD39}, - {0x398A, 0x8230FE30}, - {0x398B, 0x8230FE31}, - {0x398C, 0x8230FE32}, - {0x398D, 0x8230FE33}, - {0x398E, 0x8230FE34}, - {0x398F, 0x8230FE35}, - {0x3990, 0x8230FE36}, - {0x3991, 0x8230FE37}, - {0x3992, 0x8230FE38}, - {0x3993, 0x8230FE39}, - {0x3994, 0x82318130}, - {0x3995, 0x82318131}, - {0x3996, 0x82318132}, - {0x3997, 0x82318133}, - {0x3998, 0x82318134}, - {0x3999, 0x82318135}, - {0x399A, 0x82318136}, - {0x399B, 0x82318137}, - {0x399C, 0x82318138}, - {0x399D, 0x82318139}, - {0x399E, 0x82318230}, - {0x399F, 0x82318231}, - {0x39A0, 0x82318232}, - {0x39A1, 0x82318233}, - {0x39A2, 0x82318234}, - {0x39A3, 0x82318235}, - {0x39A4, 0x82318236}, - {0x39A5, 0x82318237}, - {0x39A6, 0x82318238}, - {0x39A7, 0x82318239}, - {0x39A8, 0x82318330}, - {0x39A9, 0x82318331}, - {0x39AA, 0x82318332}, - {0x39AB, 0x82318333}, - {0x39AC, 0x82318334}, - {0x39AD, 0x82318335}, - {0x39AE, 0x82318336}, - {0x39AF, 0x82318337}, - {0x39B0, 0x82318338}, - {0x39B1, 0x82318339}, - {0x39B2, 0x82318430}, - {0x39B3, 0x82318431}, - {0x39B4, 0x82318432}, - {0x39B5, 0x82318433}, - {0x39B6, 0x82318434}, - {0x39B7, 0x82318435}, - {0x39B8, 0x82318436}, - {0x39B9, 0x82318437}, - {0x39BA, 0x82318438}, - {0x39BB, 0x82318439}, - {0x39BC, 0x82318530}, - {0x39BD, 0x82318531}, - {0x39BE, 0x82318532}, - {0x39BF, 0x82318533}, - {0x39C0, 0x82318534}, - {0x39C1, 0x82318535}, - {0x39C2, 0x82318536}, - {0x39C3, 0x82318537}, - {0x39C4, 0x82318538}, - {0x39C5, 0x82318539}, - {0x39C6, 0x82318630}, - {0x39C7, 0x82318631}, - {0x39C8, 0x82318632}, - {0x39C9, 0x82318633}, - {0x39CA, 0x82318634}, - {0x39CB, 0x82318635}, - {0x39CC, 0x82318636}, - {0x39CD, 0x82318637}, - {0x39CE, 0x82318638}, - {0x39D1, 0x82318639}, - {0x39D2, 0x82318730}, - {0x39D3, 0x82318731}, - {0x39D4, 0x82318732}, - {0x39D5, 0x82318733}, - {0x39D6, 0x82318734}, - {0x39D7, 0x82318735}, - {0x39D8, 0x82318736}, - {0x39D9, 0x82318737}, - {0x39DA, 0x82318738}, - {0x39DB, 0x82318739}, - {0x39DC, 0x82318830}, - {0x39DD, 0x82318831}, - {0x39DE, 0x82318832}, - {0x39E0, 0x82318833}, - {0x39E1, 0x82318834}, - {0x39E2, 0x82318835}, - {0x39E3, 0x82318836}, - {0x39E4, 0x82318837}, - {0x39E5, 0x82318838}, - {0x39E6, 0x82318839}, - {0x39E7, 0x82318930}, - {0x39E8, 0x82318931}, - {0x39E9, 0x82318932}, - {0x39EA, 0x82318933}, - {0x39EB, 0x82318934}, - {0x39EC, 0x82318935}, - {0x39ED, 0x82318936}, - {0x39EE, 0x82318937}, - {0x39EF, 0x82318938}, - {0x39F0, 0x82318939}, - {0x39F1, 0x82318A30}, - {0x39F2, 0x82318A31}, - {0x39F3, 0x82318A32}, - {0x39F4, 0x82318A33}, - {0x39F5, 0x82318A34}, - {0x39F6, 0x82318A35}, - {0x39F7, 0x82318A36}, - {0x39F8, 0x82318A37}, - {0x39F9, 0x82318A38}, - {0x39FA, 0x82318A39}, - {0x39FB, 0x82318B30}, - {0x39FC, 0x82318B31}, - {0x39FD, 0x82318B32}, - {0x39FE, 0x82318B33}, - {0x39FF, 0x82318B34}, - {0x3A00, 0x82318B35}, - {0x3A01, 0x82318B36}, - {0x3A02, 0x82318B37}, - {0x3A03, 0x82318B38}, - {0x3A04, 0x82318B39}, - {0x3A05, 0x82318C30}, - {0x3A06, 0x82318C31}, - {0x3A07, 0x82318C32}, - {0x3A08, 0x82318C33}, - {0x3A09, 0x82318C34}, - {0x3A0A, 0x82318C35}, - {0x3A0B, 0x82318C36}, - {0x3A0C, 0x82318C37}, - {0x3A0D, 0x82318C38}, - {0x3A0E, 0x82318C39}, - {0x3A0F, 0x82318D30}, - {0x3A10, 0x82318D31}, - {0x3A11, 0x82318D32}, - {0x3A12, 0x82318D33}, - {0x3A13, 0x82318D34}, - {0x3A14, 0x82318D35}, - {0x3A15, 0x82318D36}, - {0x3A16, 0x82318D37}, - {0x3A17, 0x82318D38}, - {0x3A18, 0x82318D39}, - {0x3A19, 0x82318E30}, - {0x3A1A, 0x82318E31}, - {0x3A1B, 0x82318E32}, - {0x3A1C, 0x82318E33}, - {0x3A1D, 0x82318E34}, - {0x3A1E, 0x82318E35}, - {0x3A1F, 0x82318E36}, - {0x3A20, 0x82318E37}, - {0x3A21, 0x82318E38}, - {0x3A22, 0x82318E39}, - {0x3A23, 0x82318F30}, - {0x3A24, 0x82318F31}, - {0x3A25, 0x82318F32}, - {0x3A26, 0x82318F33}, - {0x3A27, 0x82318F34}, - {0x3A28, 0x82318F35}, - {0x3A29, 0x82318F36}, - {0x3A2A, 0x82318F37}, - {0x3A2B, 0x82318F38}, - {0x3A2C, 0x82318F39}, - {0x3A2D, 0x82319030}, - {0x3A2E, 0x82319031}, - {0x3A2F, 0x82319032}, - {0x3A30, 0x82319033}, - {0x3A31, 0x82319034}, - {0x3A32, 0x82319035}, - {0x3A33, 0x82319036}, - {0x3A34, 0x82319037}, - {0x3A35, 0x82319038}, - {0x3A36, 0x82319039}, - {0x3A37, 0x82319130}, - {0x3A38, 0x82319131}, - {0x3A39, 0x82319132}, - {0x3A3A, 0x82319133}, - {0x3A3B, 0x82319134}, - {0x3A3C, 0x82319135}, - {0x3A3D, 0x82319136}, - {0x3A3E, 0x82319137}, - {0x3A3F, 0x82319138}, - {0x3A40, 0x82319139}, - {0x3A41, 0x82319230}, - {0x3A42, 0x82319231}, - {0x3A43, 0x82319232}, - {0x3A44, 0x82319233}, - {0x3A45, 0x82319234}, - {0x3A46, 0x82319235}, - {0x3A47, 0x82319236}, - {0x3A48, 0x82319237}, - {0x3A49, 0x82319238}, - {0x3A4A, 0x82319239}, - {0x3A4B, 0x82319330}, - {0x3A4C, 0x82319331}, - {0x3A4D, 0x82319332}, - {0x3A4E, 0x82319333}, - {0x3A4F, 0x82319334}, - {0x3A50, 0x82319335}, - {0x3A51, 0x82319336}, - {0x3A52, 0x82319337}, - {0x3A53, 0x82319338}, - {0x3A54, 0x82319339}, - {0x3A55, 0x82319430}, - {0x3A56, 0x82319431}, - {0x3A57, 0x82319432}, - {0x3A58, 0x82319433}, - {0x3A59, 0x82319434}, - {0x3A5A, 0x82319435}, - {0x3A5B, 0x82319436}, - {0x3A5C, 0x82319437}, - {0x3A5D, 0x82319438}, - {0x3A5E, 0x82319439}, - {0x3A5F, 0x82319530}, - {0x3A60, 0x82319531}, - {0x3A61, 0x82319532}, - {0x3A62, 0x82319533}, - {0x3A63, 0x82319534}, - {0x3A64, 0x82319535}, - {0x3A65, 0x82319536}, - {0x3A66, 0x82319537}, - {0x3A67, 0x82319538}, - {0x3A68, 0x82319539}, - {0x3A69, 0x82319630}, - {0x3A6A, 0x82319631}, - {0x3A6B, 0x82319632}, - {0x3A6C, 0x82319633}, - {0x3A6D, 0x82319634}, - {0x3A6E, 0x82319635}, - {0x3A6F, 0x82319636}, - {0x3A70, 0x82319637}, - {0x3A71, 0x82319638}, - {0x3A72, 0x82319639}, - {0x3A74, 0x82319730}, - {0x3A75, 0x82319731}, - {0x3A76, 0x82319732}, - {0x3A77, 0x82319733}, - {0x3A78, 0x82319734}, - {0x3A79, 0x82319735}, - {0x3A7A, 0x82319736}, - {0x3A7B, 0x82319737}, - {0x3A7C, 0x82319738}, - {0x3A7D, 0x82319739}, - {0x3A7E, 0x82319830}, - {0x3A7F, 0x82319831}, - {0x3A80, 0x82319832}, - {0x3A81, 0x82319833}, - {0x3A82, 0x82319834}, - {0x3A83, 0x82319835}, - {0x3A84, 0x82319836}, - {0x3A85, 0x82319837}, - {0x3A86, 0x82319838}, - {0x3A87, 0x82319839}, - {0x3A88, 0x82319930}, - {0x3A89, 0x82319931}, - {0x3A8A, 0x82319932}, - {0x3A8B, 0x82319933}, - {0x3A8C, 0x82319934}, - {0x3A8D, 0x82319935}, - {0x3A8E, 0x82319936}, - {0x3A8F, 0x82319937}, - {0x3A90, 0x82319938}, - {0x3A91, 0x82319939}, - {0x3A92, 0x82319A30}, - {0x3A93, 0x82319A31}, - {0x3A94, 0x82319A32}, - {0x3A95, 0x82319A33}, - {0x3A96, 0x82319A34}, - {0x3A97, 0x82319A35}, - {0x3A98, 0x82319A36}, - {0x3A99, 0x82319A37}, - {0x3A9A, 0x82319A38}, - {0x3A9B, 0x82319A39}, - {0x3A9C, 0x82319B30}, - {0x3A9D, 0x82319B31}, - {0x3A9E, 0x82319B32}, - {0x3A9F, 0x82319B33}, - {0x3AA0, 0x82319B34}, - {0x3AA1, 0x82319B35}, - {0x3AA2, 0x82319B36}, - {0x3AA3, 0x82319B37}, - {0x3AA4, 0x82319B38}, - {0x3AA5, 0x82319B39}, - {0x3AA6, 0x82319C30}, - {0x3AA7, 0x82319C31}, - {0x3AA8, 0x82319C32}, - {0x3AA9, 0x82319C33}, - {0x3AAA, 0x82319C34}, - {0x3AAB, 0x82319C35}, - {0x3AAC, 0x82319C36}, - {0x3AAD, 0x82319C37}, - {0x3AAE, 0x82319C38}, - {0x3AAF, 0x82319C39}, - {0x3AB0, 0x82319D30}, - {0x3AB1, 0x82319D31}, - {0x3AB2, 0x82319D32}, - {0x3AB3, 0x82319D33}, - {0x3AB4, 0x82319D34}, - {0x3AB5, 0x82319D35}, - {0x3AB6, 0x82319D36}, - {0x3AB7, 0x82319D37}, - {0x3AB8, 0x82319D38}, - {0x3AB9, 0x82319D39}, - {0x3ABA, 0x82319E30}, - {0x3ABB, 0x82319E31}, - {0x3ABC, 0x82319E32}, - {0x3ABD, 0x82319E33}, - {0x3ABE, 0x82319E34}, - {0x3ABF, 0x82319E35}, - {0x3AC0, 0x82319E36}, - {0x3AC1, 0x82319E37}, - {0x3AC2, 0x82319E38}, - {0x3AC3, 0x82319E39}, - {0x3AC4, 0x82319F30}, - {0x3AC5, 0x82319F31}, - {0x3AC6, 0x82319F32}, - {0x3AC7, 0x82319F33}, - {0x3AC8, 0x82319F34}, - {0x3AC9, 0x82319F35}, - {0x3ACA, 0x82319F36}, - {0x3ACB, 0x82319F37}, - {0x3ACC, 0x82319F38}, - {0x3ACD, 0x82319F39}, - {0x3ACE, 0x8231A030}, - {0x3ACF, 0x8231A031}, - {0x3AD0, 0x8231A032}, - {0x3AD1, 0x8231A033}, - {0x3AD2, 0x8231A034}, - {0x3AD3, 0x8231A035}, - {0x3AD4, 0x8231A036}, - {0x3AD5, 0x8231A037}, - {0x3AD6, 0x8231A038}, - {0x3AD7, 0x8231A039}, - {0x3AD8, 0x8231A130}, - {0x3AD9, 0x8231A131}, - {0x3ADA, 0x8231A132}, - {0x3ADB, 0x8231A133}, - {0x3ADC, 0x8231A134}, - {0x3ADD, 0x8231A135}, - {0x3ADE, 0x8231A136}, - {0x3ADF, 0x8231A137}, - {0x3AE0, 0x8231A138}, - {0x3AE1, 0x8231A139}, - {0x3AE2, 0x8231A230}, - {0x3AE3, 0x8231A231}, - {0x3AE4, 0x8231A232}, - {0x3AE5, 0x8231A233}, - {0x3AE6, 0x8231A234}, - {0x3AE7, 0x8231A235}, - {0x3AE8, 0x8231A236}, - {0x3AE9, 0x8231A237}, - {0x3AEA, 0x8231A238}, - {0x3AEB, 0x8231A239}, - {0x3AEC, 0x8231A330}, - {0x3AED, 0x8231A331}, - {0x3AEE, 0x8231A332}, - {0x3AEF, 0x8231A333}, - {0x3AF0, 0x8231A334}, - {0x3AF1, 0x8231A335}, - {0x3AF2, 0x8231A336}, - {0x3AF3, 0x8231A337}, - {0x3AF4, 0x8231A338}, - {0x3AF5, 0x8231A339}, - {0x3AF6, 0x8231A430}, - {0x3AF7, 0x8231A431}, - {0x3AF8, 0x8231A432}, - {0x3AF9, 0x8231A433}, - {0x3AFA, 0x8231A434}, - {0x3AFB, 0x8231A435}, - {0x3AFC, 0x8231A436}, - {0x3AFD, 0x8231A437}, - {0x3AFE, 0x8231A438}, - {0x3AFF, 0x8231A439}, - {0x3B00, 0x8231A530}, - {0x3B01, 0x8231A531}, - {0x3B02, 0x8231A532}, - {0x3B03, 0x8231A533}, - {0x3B04, 0x8231A534}, - {0x3B05, 0x8231A535}, - {0x3B06, 0x8231A536}, - {0x3B07, 0x8231A537}, - {0x3B08, 0x8231A538}, - {0x3B09, 0x8231A539}, - {0x3B0A, 0x8231A630}, - {0x3B0B, 0x8231A631}, - {0x3B0C, 0x8231A632}, - {0x3B0D, 0x8231A633}, - {0x3B0E, 0x8231A634}, - {0x3B0F, 0x8231A635}, - {0x3B10, 0x8231A636}, - {0x3B11, 0x8231A637}, - {0x3B12, 0x8231A638}, - {0x3B13, 0x8231A639}, - {0x3B14, 0x8231A730}, - {0x3B15, 0x8231A731}, - {0x3B16, 0x8231A732}, - {0x3B17, 0x8231A733}, - {0x3B18, 0x8231A734}, - {0x3B19, 0x8231A735}, - {0x3B1A, 0x8231A736}, - {0x3B1B, 0x8231A737}, - {0x3B1C, 0x8231A738}, - {0x3B1D, 0x8231A739}, - {0x3B1E, 0x8231A830}, - {0x3B1F, 0x8231A831}, - {0x3B20, 0x8231A832}, - {0x3B21, 0x8231A833}, - {0x3B22, 0x8231A834}, - {0x3B23, 0x8231A835}, - {0x3B24, 0x8231A836}, - {0x3B25, 0x8231A837}, - {0x3B26, 0x8231A838}, - {0x3B27, 0x8231A839}, - {0x3B28, 0x8231A930}, - {0x3B29, 0x8231A931}, - {0x3B2A, 0x8231A932}, - {0x3B2B, 0x8231A933}, - {0x3B2C, 0x8231A934}, - {0x3B2D, 0x8231A935}, - {0x3B2E, 0x8231A936}, - {0x3B2F, 0x8231A937}, - {0x3B30, 0x8231A938}, - {0x3B31, 0x8231A939}, - {0x3B32, 0x8231AA30}, - {0x3B33, 0x8231AA31}, - {0x3B34, 0x8231AA32}, - {0x3B35, 0x8231AA33}, - {0x3B36, 0x8231AA34}, - {0x3B37, 0x8231AA35}, - {0x3B38, 0x8231AA36}, - {0x3B39, 0x8231AA37}, - {0x3B3A, 0x8231AA38}, - {0x3B3B, 0x8231AA39}, - {0x3B3C, 0x8231AB30}, - {0x3B3D, 0x8231AB31}, - {0x3B3E, 0x8231AB32}, - {0x3B3F, 0x8231AB33}, - {0x3B40, 0x8231AB34}, - {0x3B41, 0x8231AB35}, - {0x3B42, 0x8231AB36}, - {0x3B43, 0x8231AB37}, - {0x3B44, 0x8231AB38}, - {0x3B45, 0x8231AB39}, - {0x3B46, 0x8231AC30}, - {0x3B47, 0x8231AC31}, - {0x3B48, 0x8231AC32}, - {0x3B49, 0x8231AC33}, - {0x3B4A, 0x8231AC34}, - {0x3B4B, 0x8231AC35}, - {0x3B4C, 0x8231AC36}, - {0x3B4D, 0x8231AC37}, - {0x3B4F, 0x8231AC38}, - {0x3B50, 0x8231AC39}, - {0x3B51, 0x8231AD30}, - {0x3B52, 0x8231AD31}, - {0x3B53, 0x8231AD32}, - {0x3B54, 0x8231AD33}, - {0x3B55, 0x8231AD34}, - {0x3B56, 0x8231AD35}, - {0x3B57, 0x8231AD36}, - {0x3B58, 0x8231AD37}, - {0x3B59, 0x8231AD38}, - {0x3B5A, 0x8231AD39}, - {0x3B5B, 0x8231AE30}, - {0x3B5C, 0x8231AE31}, - {0x3B5D, 0x8231AE32}, - {0x3B5E, 0x8231AE33}, - {0x3B5F, 0x8231AE34}, - {0x3B60, 0x8231AE35}, - {0x3B61, 0x8231AE36}, - {0x3B62, 0x8231AE37}, - {0x3B63, 0x8231AE38}, - {0x3B64, 0x8231AE39}, - {0x3B65, 0x8231AF30}, - {0x3B66, 0x8231AF31}, - {0x3B67, 0x8231AF32}, - {0x3B68, 0x8231AF33}, - {0x3B69, 0x8231AF34}, - {0x3B6A, 0x8231AF35}, - {0x3B6B, 0x8231AF36}, - {0x3B6C, 0x8231AF37}, - {0x3B6D, 0x8231AF38}, - {0x3B6E, 0x8231AF39}, - {0x3B6F, 0x8231B030}, - {0x3B70, 0x8231B031}, - {0x3B71, 0x8231B032}, - {0x3B72, 0x8231B033}, - {0x3B73, 0x8231B034}, - {0x3B74, 0x8231B035}, - {0x3B75, 0x8231B036}, - {0x3B76, 0x8231B037}, - {0x3B77, 0x8231B038}, - {0x3B78, 0x8231B039}, - {0x3B79, 0x8231B130}, - {0x3B7A, 0x8231B131}, - {0x3B7B, 0x8231B132}, - {0x3B7C, 0x8231B133}, - {0x3B7D, 0x8231B134}, - {0x3B7E, 0x8231B135}, - {0x3B7F, 0x8231B136}, - {0x3B80, 0x8231B137}, - {0x3B81, 0x8231B138}, - {0x3B82, 0x8231B139}, - {0x3B83, 0x8231B230}, - {0x3B84, 0x8231B231}, - {0x3B85, 0x8231B232}, - {0x3B86, 0x8231B233}, - {0x3B87, 0x8231B234}, - {0x3B88, 0x8231B235}, - {0x3B89, 0x8231B236}, - {0x3B8A, 0x8231B237}, - {0x3B8B, 0x8231B238}, - {0x3B8C, 0x8231B239}, - {0x3B8D, 0x8231B330}, - {0x3B8E, 0x8231B331}, - {0x3B8F, 0x8231B332}, - {0x3B90, 0x8231B333}, - {0x3B91, 0x8231B334}, - {0x3B92, 0x8231B335}, - {0x3B93, 0x8231B336}, - {0x3B94, 0x8231B337}, - {0x3B95, 0x8231B338}, - {0x3B96, 0x8231B339}, - {0x3B97, 0x8231B430}, - {0x3B98, 0x8231B431}, - {0x3B99, 0x8231B432}, - {0x3B9A, 0x8231B433}, - {0x3B9B, 0x8231B434}, - {0x3B9C, 0x8231B435}, - {0x3B9D, 0x8231B436}, - {0x3B9E, 0x8231B437}, - {0x3B9F, 0x8231B438}, - {0x3BA0, 0x8231B439}, - {0x3BA1, 0x8231B530}, - {0x3BA2, 0x8231B531}, - {0x3BA3, 0x8231B532}, - {0x3BA4, 0x8231B533}, - {0x3BA5, 0x8231B534}, - {0x3BA6, 0x8231B535}, - {0x3BA7, 0x8231B536}, - {0x3BA8, 0x8231B537}, - {0x3BA9, 0x8231B538}, - {0x3BAA, 0x8231B539}, - {0x3BAB, 0x8231B630}, - {0x3BAC, 0x8231B631}, - {0x3BAD, 0x8231B632}, - {0x3BAE, 0x8231B633}, - {0x3BAF, 0x8231B634}, - {0x3BB0, 0x8231B635}, - {0x3BB1, 0x8231B636}, - {0x3BB2, 0x8231B637}, - {0x3BB3, 0x8231B638}, - {0x3BB4, 0x8231B639}, - {0x3BB5, 0x8231B730}, - {0x3BB6, 0x8231B731}, - {0x3BB7, 0x8231B732}, - {0x3BB8, 0x8231B733}, - {0x3BB9, 0x8231B734}, - {0x3BBA, 0x8231B735}, - {0x3BBB, 0x8231B736}, - {0x3BBC, 0x8231B737}, - {0x3BBD, 0x8231B738}, - {0x3BBE, 0x8231B739}, - {0x3BBF, 0x8231B830}, - {0x3BC0, 0x8231B831}, - {0x3BC1, 0x8231B832}, - {0x3BC2, 0x8231B833}, - {0x3BC3, 0x8231B834}, - {0x3BC4, 0x8231B835}, - {0x3BC5, 0x8231B836}, - {0x3BC6, 0x8231B837}, - {0x3BC7, 0x8231B838}, - {0x3BC8, 0x8231B839}, - {0x3BC9, 0x8231B930}, - {0x3BCA, 0x8231B931}, - {0x3BCB, 0x8231B932}, - {0x3BCC, 0x8231B933}, - {0x3BCD, 0x8231B934}, - {0x3BCE, 0x8231B935}, - {0x3BCF, 0x8231B936}, - {0x3BD0, 0x8231B937}, - {0x3BD1, 0x8231B938}, - {0x3BD2, 0x8231B939}, - {0x3BD3, 0x8231BA30}, - {0x3BD4, 0x8231BA31}, - {0x3BD5, 0x8231BA32}, - {0x3BD6, 0x8231BA33}, - {0x3BD7, 0x8231BA34}, - {0x3BD8, 0x8231BA35}, - {0x3BD9, 0x8231BA36}, - {0x3BDA, 0x8231BA37}, - {0x3BDB, 0x8231BA38}, - {0x3BDC, 0x8231BA39}, - {0x3BDD, 0x8231BB30}, - {0x3BDE, 0x8231BB31}, - {0x3BDF, 0x8231BB32}, - {0x3BE0, 0x8231BB33}, - {0x3BE1, 0x8231BB34}, - {0x3BE2, 0x8231BB35}, - {0x3BE3, 0x8231BB36}, - {0x3BE4, 0x8231BB37}, - {0x3BE5, 0x8231BB38}, - {0x3BE6, 0x8231BB39}, - {0x3BE7, 0x8231BC30}, - {0x3BE8, 0x8231BC31}, - {0x3BE9, 0x8231BC32}, - {0x3BEA, 0x8231BC33}, - {0x3BEB, 0x8231BC34}, - {0x3BEC, 0x8231BC35}, - {0x3BED, 0x8231BC36}, - {0x3BEE, 0x8231BC37}, - {0x3BEF, 0x8231BC38}, - {0x3BF0, 0x8231BC39}, - {0x3BF1, 0x8231BD30}, - {0x3BF2, 0x8231BD31}, - {0x3BF3, 0x8231BD32}, - {0x3BF4, 0x8231BD33}, - {0x3BF5, 0x8231BD34}, - {0x3BF6, 0x8231BD35}, - {0x3BF7, 0x8231BD36}, - {0x3BF8, 0x8231BD37}, - {0x3BF9, 0x8231BD38}, - {0x3BFA, 0x8231BD39}, - {0x3BFB, 0x8231BE30}, - {0x3BFC, 0x8231BE31}, - {0x3BFD, 0x8231BE32}, - {0x3BFE, 0x8231BE33}, - {0x3BFF, 0x8231BE34}, - {0x3C00, 0x8231BE35}, - {0x3C01, 0x8231BE36}, - {0x3C02, 0x8231BE37}, - {0x3C03, 0x8231BE38}, - {0x3C04, 0x8231BE39}, - {0x3C05, 0x8231BF30}, - {0x3C06, 0x8231BF31}, - {0x3C07, 0x8231BF32}, - {0x3C08, 0x8231BF33}, - {0x3C09, 0x8231BF34}, - {0x3C0A, 0x8231BF35}, - {0x3C0B, 0x8231BF36}, - {0x3C0C, 0x8231BF37}, - {0x3C0D, 0x8231BF38}, - {0x3C0E, 0x8231BF39}, - {0x3C0F, 0x8231C030}, - {0x3C10, 0x8231C031}, - {0x3C11, 0x8231C032}, - {0x3C12, 0x8231C033}, - {0x3C13, 0x8231C034}, - {0x3C14, 0x8231C035}, - {0x3C15, 0x8231C036}, - {0x3C16, 0x8231C037}, - {0x3C17, 0x8231C038}, - {0x3C18, 0x8231C039}, - {0x3C19, 0x8231C130}, - {0x3C1A, 0x8231C131}, - {0x3C1B, 0x8231C132}, - {0x3C1C, 0x8231C133}, - {0x3C1D, 0x8231C134}, - {0x3C1E, 0x8231C135}, - {0x3C1F, 0x8231C136}, - {0x3C20, 0x8231C137}, - {0x3C21, 0x8231C138}, - {0x3C22, 0x8231C139}, - {0x3C23, 0x8231C230}, - {0x3C24, 0x8231C231}, - {0x3C25, 0x8231C232}, - {0x3C26, 0x8231C233}, - {0x3C27, 0x8231C234}, - {0x3C28, 0x8231C235}, - {0x3C29, 0x8231C236}, - {0x3C2A, 0x8231C237}, - {0x3C2B, 0x8231C238}, - {0x3C2C, 0x8231C239}, - {0x3C2D, 0x8231C330}, - {0x3C2E, 0x8231C331}, - {0x3C2F, 0x8231C332}, - {0x3C30, 0x8231C333}, - {0x3C31, 0x8231C334}, - {0x3C32, 0x8231C335}, - {0x3C33, 0x8231C336}, - {0x3C34, 0x8231C337}, - {0x3C35, 0x8231C338}, - {0x3C36, 0x8231C339}, - {0x3C37, 0x8231C430}, - {0x3C38, 0x8231C431}, - {0x3C39, 0x8231C432}, - {0x3C3A, 0x8231C433}, - {0x3C3B, 0x8231C434}, - {0x3C3C, 0x8231C435}, - {0x3C3D, 0x8231C436}, - {0x3C3E, 0x8231C437}, - {0x3C3F, 0x8231C438}, - {0x3C40, 0x8231C439}, - {0x3C41, 0x8231C530}, - {0x3C42, 0x8231C531}, - {0x3C43, 0x8231C532}, - {0x3C44, 0x8231C533}, - {0x3C45, 0x8231C534}, - {0x3C46, 0x8231C535}, - {0x3C47, 0x8231C536}, - {0x3C48, 0x8231C537}, - {0x3C49, 0x8231C538}, - {0x3C4A, 0x8231C539}, - {0x3C4B, 0x8231C630}, - {0x3C4C, 0x8231C631}, - {0x3C4D, 0x8231C632}, - {0x3C4E, 0x8231C633}, - {0x3C4F, 0x8231C634}, - {0x3C50, 0x8231C635}, - {0x3C51, 0x8231C636}, - {0x3C52, 0x8231C637}, - {0x3C53, 0x8231C638}, - {0x3C54, 0x8231C639}, - {0x3C55, 0x8231C730}, - {0x3C56, 0x8231C731}, - {0x3C57, 0x8231C732}, - {0x3C58, 0x8231C733}, - {0x3C59, 0x8231C734}, - {0x3C5A, 0x8231C735}, - {0x3C5B, 0x8231C736}, - {0x3C5C, 0x8231C737}, - {0x3C5D, 0x8231C738}, - {0x3C5E, 0x8231C739}, - {0x3C5F, 0x8231C830}, - {0x3C60, 0x8231C831}, - {0x3C61, 0x8231C832}, - {0x3C62, 0x8231C833}, - {0x3C63, 0x8231C834}, - {0x3C64, 0x8231C835}, - {0x3C65, 0x8231C836}, - {0x3C66, 0x8231C837}, - {0x3C67, 0x8231C838}, - {0x3C68, 0x8231C839}, - {0x3C69, 0x8231C930}, - {0x3C6A, 0x8231C931}, - {0x3C6B, 0x8231C932}, - {0x3C6C, 0x8231C933}, - {0x3C6D, 0x8231C934}, - {0x3C6F, 0x8231C935}, - {0x3C70, 0x8231C936}, - {0x3C71, 0x8231C937}, - {0x3C72, 0x8231C938}, - {0x3C73, 0x8231C939}, - {0x3C74, 0x8231CA30}, - {0x3C75, 0x8231CA31}, - {0x3C76, 0x8231CA32}, - {0x3C77, 0x8231CA33}, - {0x3C78, 0x8231CA34}, - {0x3C79, 0x8231CA35}, - {0x3C7A, 0x8231CA36}, - {0x3C7B, 0x8231CA37}, - {0x3C7C, 0x8231CA38}, - {0x3C7D, 0x8231CA39}, - {0x3C7E, 0x8231CB30}, - {0x3C7F, 0x8231CB31}, - {0x3C80, 0x8231CB32}, - {0x3C81, 0x8231CB33}, - {0x3C82, 0x8231CB34}, - {0x3C83, 0x8231CB35}, - {0x3C84, 0x8231CB36}, - {0x3C85, 0x8231CB37}, - {0x3C86, 0x8231CB38}, - {0x3C87, 0x8231CB39}, - {0x3C88, 0x8231CC30}, - {0x3C89, 0x8231CC31}, - {0x3C8A, 0x8231CC32}, - {0x3C8B, 0x8231CC33}, - {0x3C8C, 0x8231CC34}, - {0x3C8D, 0x8231CC35}, - {0x3C8E, 0x8231CC36}, - {0x3C8F, 0x8231CC37}, - {0x3C90, 0x8231CC38}, - {0x3C91, 0x8231CC39}, - {0x3C92, 0x8231CD30}, - {0x3C93, 0x8231CD31}, - {0x3C94, 0x8231CD32}, - {0x3C95, 0x8231CD33}, - {0x3C96, 0x8231CD34}, - {0x3C97, 0x8231CD35}, - {0x3C98, 0x8231CD36}, - {0x3C99, 0x8231CD37}, - {0x3C9A, 0x8231CD38}, - {0x3C9B, 0x8231CD39}, - {0x3C9C, 0x8231CE30}, - {0x3C9D, 0x8231CE31}, - {0x3C9E, 0x8231CE32}, - {0x3C9F, 0x8231CE33}, - {0x3CA0, 0x8231CE34}, - {0x3CA1, 0x8231CE35}, - {0x3CA2, 0x8231CE36}, - {0x3CA3, 0x8231CE37}, - {0x3CA4, 0x8231CE38}, - {0x3CA5, 0x8231CE39}, - {0x3CA6, 0x8231CF30}, - {0x3CA7, 0x8231CF31}, - {0x3CA8, 0x8231CF32}, - {0x3CA9, 0x8231CF33}, - {0x3CAA, 0x8231CF34}, - {0x3CAB, 0x8231CF35}, - {0x3CAC, 0x8231CF36}, - {0x3CAD, 0x8231CF37}, - {0x3CAE, 0x8231CF38}, - {0x3CAF, 0x8231CF39}, - {0x3CB0, 0x8231D030}, - {0x3CB1, 0x8231D031}, - {0x3CB2, 0x8231D032}, - {0x3CB3, 0x8231D033}, - {0x3CB4, 0x8231D034}, - {0x3CB5, 0x8231D035}, - {0x3CB6, 0x8231D036}, - {0x3CB7, 0x8231D037}, - {0x3CB8, 0x8231D038}, - {0x3CB9, 0x8231D039}, - {0x3CBA, 0x8231D130}, - {0x3CBB, 0x8231D131}, - {0x3CBC, 0x8231D132}, - {0x3CBD, 0x8231D133}, - {0x3CBE, 0x8231D134}, - {0x3CBF, 0x8231D135}, - {0x3CC0, 0x8231D136}, - {0x3CC1, 0x8231D137}, - {0x3CC2, 0x8231D138}, - {0x3CC3, 0x8231D139}, - {0x3CC4, 0x8231D230}, - {0x3CC5, 0x8231D231}, - {0x3CC6, 0x8231D232}, - {0x3CC7, 0x8231D233}, - {0x3CC8, 0x8231D234}, - {0x3CC9, 0x8231D235}, - {0x3CCA, 0x8231D236}, - {0x3CCB, 0x8231D237}, - {0x3CCC, 0x8231D238}, - {0x3CCD, 0x8231D239}, - {0x3CCE, 0x8231D330}, - {0x3CCF, 0x8231D331}, - {0x3CD0, 0x8231D332}, - {0x3CD1, 0x8231D333}, - {0x3CD2, 0x8231D334}, - {0x3CD3, 0x8231D335}, - {0x3CD4, 0x8231D336}, - {0x3CD5, 0x8231D337}, - {0x3CD6, 0x8231D338}, - {0x3CD7, 0x8231D339}, - {0x3CD8, 0x8231D430}, - {0x3CD9, 0x8231D431}, - {0x3CDA, 0x8231D432}, - {0x3CDB, 0x8231D433}, - {0x3CDC, 0x8231D434}, - {0x3CDD, 0x8231D435}, - {0x3CDE, 0x8231D436}, - {0x3CDF, 0x8231D437}, - {0x4057, 0x8232AF33}, - {0x4058, 0x8232AF34}, - {0x4059, 0x8232AF35}, - {0x405A, 0x8232AF36}, - {0x405B, 0x8232AF37}, - {0x405C, 0x8232AF38}, - {0x405D, 0x8232AF39}, - {0x405E, 0x8232B030}, - {0x405F, 0x8232B031}, - {0x4060, 0x8232B032}, - {0x4061, 0x8232B033}, - {0x4062, 0x8232B034}, - {0x4063, 0x8232B035}, - {0x4064, 0x8232B036}, - {0x4065, 0x8232B037}, - {0x4066, 0x8232B038}, - {0x4067, 0x8232B039}, - {0x4068, 0x8232B130}, - {0x4069, 0x8232B131}, - {0x406A, 0x8232B132}, - {0x406B, 0x8232B133}, - {0x406C, 0x8232B134}, - {0x406D, 0x8232B135}, - {0x406E, 0x8232B136}, - {0x406F, 0x8232B137}, - {0x4070, 0x8232B138}, - {0x4071, 0x8232B139}, - {0x4072, 0x8232B230}, - {0x4073, 0x8232B231}, - {0x4074, 0x8232B232}, - {0x4075, 0x8232B233}, - {0x4076, 0x8232B234}, - {0x4077, 0x8232B235}, - {0x4078, 0x8232B236}, - {0x4079, 0x8232B237}, - {0x407A, 0x8232B238}, - {0x407B, 0x8232B239}, - {0x407C, 0x8232B330}, - {0x407D, 0x8232B331}, - {0x407E, 0x8232B332}, - {0x407F, 0x8232B333}, - {0x4080, 0x8232B334}, - {0x4081, 0x8232B335}, - {0x4082, 0x8232B336}, - {0x4083, 0x8232B337}, - {0x4084, 0x8232B338}, - {0x4085, 0x8232B339}, - {0x4086, 0x8232B430}, - {0x4087, 0x8232B431}, - {0x4088, 0x8232B432}, - {0x4089, 0x8232B433}, - {0x408A, 0x8232B434}, - {0x408B, 0x8232B435}, - {0x408C, 0x8232B436}, - {0x408D, 0x8232B437}, - {0x408E, 0x8232B438}, - {0x408F, 0x8232B439}, - {0x4090, 0x8232B530}, - {0x4091, 0x8232B531}, - {0x4092, 0x8232B532}, - {0x4093, 0x8232B533}, - {0x4094, 0x8232B534}, - {0x4095, 0x8232B535}, - {0x4096, 0x8232B536}, - {0x4097, 0x8232B537}, - {0x4098, 0x8232B538}, - {0x4099, 0x8232B539}, - {0x409A, 0x8232B630}, - {0x409B, 0x8232B631}, - {0x409C, 0x8232B632}, - {0x409D, 0x8232B633}, - {0x409E, 0x8232B634}, - {0x409F, 0x8232B635}, - {0x40A0, 0x8232B636}, - {0x40A1, 0x8232B637}, - {0x40A2, 0x8232B638}, - {0x40A3, 0x8232B639}, - {0x40A4, 0x8232B730}, - {0x40A5, 0x8232B731}, - {0x40A6, 0x8232B732}, - {0x40A7, 0x8232B733}, - {0x40A8, 0x8232B734}, - {0x40A9, 0x8232B735}, - {0x40AA, 0x8232B736}, - {0x40AB, 0x8232B737}, - {0x40AC, 0x8232B738}, - {0x40AD, 0x8232B739}, - {0x40AE, 0x8232B830}, - {0x40AF, 0x8232B831}, - {0x40B0, 0x8232B832}, - {0x40B1, 0x8232B833}, - {0x40B2, 0x8232B834}, - {0x40B3, 0x8232B835}, - {0x40B4, 0x8232B836}, - {0x40B5, 0x8232B837}, - {0x40B6, 0x8232B838}, - {0x40B7, 0x8232B839}, - {0x40B8, 0x8232B930}, - {0x40B9, 0x8232B931}, - {0x40BA, 0x8232B932}, - {0x40BB, 0x8232B933}, - {0x40BC, 0x8232B934}, - {0x40BD, 0x8232B935}, - {0x40BE, 0x8232B936}, - {0x40BF, 0x8232B937}, - {0x40C0, 0x8232B938}, - {0x40C1, 0x8232B939}, - {0x40C2, 0x8232BA30}, - {0x40C3, 0x8232BA31}, - {0x40C4, 0x8232BA32}, - {0x40C5, 0x8232BA33}, - {0x40C6, 0x8232BA34}, - {0x40C7, 0x8232BA35}, - {0x40C8, 0x8232BA36}, - {0x40C9, 0x8232BA37}, - {0x40CA, 0x8232BA38}, - {0x40CB, 0x8232BA39}, - {0x40CC, 0x8232BB30}, - {0x40CD, 0x8232BB31}, - {0x40CE, 0x8232BB32}, - {0x40CF, 0x8232BB33}, - {0x40D0, 0x8232BB34}, - {0x40D1, 0x8232BB35}, - {0x40D2, 0x8232BB36}, - {0x40D3, 0x8232BB37}, - {0x40D4, 0x8232BB38}, - {0x40D5, 0x8232BB39}, - {0x40D6, 0x8232BC30}, - {0x40D7, 0x8232BC31}, - {0x40D8, 0x8232BC32}, - {0x40D9, 0x8232BC33}, - {0x40DA, 0x8232BC34}, - {0x40DB, 0x8232BC35}, - {0x40DC, 0x8232BC36}, - {0x40DD, 0x8232BC37}, - {0x40DE, 0x8232BC38}, - {0x40DF, 0x8232BC39}, - {0x40E0, 0x8232BD30}, - {0x40E1, 0x8232BD31}, - {0x40E2, 0x8232BD32}, - {0x40E3, 0x8232BD33}, - {0x40E4, 0x8232BD34}, - {0x40E5, 0x8232BD35}, - {0x40E6, 0x8232BD36}, - {0x40E7, 0x8232BD37}, - {0x40E8, 0x8232BD38}, - {0x40E9, 0x8232BD39}, - {0x40EA, 0x8232BE30}, - {0x40EB, 0x8232BE31}, - {0x40EC, 0x8232BE32}, - {0x40ED, 0x8232BE33}, - {0x40EE, 0x8232BE34}, - {0x40EF, 0x8232BE35}, - {0x40F0, 0x8232BE36}, - {0x40F1, 0x8232BE37}, - {0x40F2, 0x8232BE38}, - {0x40F3, 0x8232BE39}, - {0x40F4, 0x8232BF30}, - {0x40F5, 0x8232BF31}, - {0x40F6, 0x8232BF32}, - {0x40F7, 0x8232BF33}, - {0x40F8, 0x8232BF34}, - {0x40F9, 0x8232BF35}, - {0x40FA, 0x8232BF36}, - {0x40FB, 0x8232BF37}, - {0x40FC, 0x8232BF38}, - {0x40FD, 0x8232BF39}, - {0x40FE, 0x8232C030}, - {0x40FF, 0x8232C031}, - {0x4100, 0x8232C032}, - {0x4101, 0x8232C033}, - {0x4102, 0x8232C034}, - {0x4103, 0x8232C035}, - {0x4104, 0x8232C036}, - {0x4105, 0x8232C037}, - {0x4106, 0x8232C038}, - {0x4107, 0x8232C039}, - {0x4108, 0x8232C130}, - {0x4109, 0x8232C131}, - {0x410A, 0x8232C132}, - {0x410B, 0x8232C133}, - {0x410C, 0x8232C134}, - {0x410D, 0x8232C135}, - {0x410E, 0x8232C136}, - {0x410F, 0x8232C137}, - {0x4110, 0x8232C138}, - {0x4111, 0x8232C139}, - {0x4112, 0x8232C230}, - {0x4113, 0x8232C231}, - {0x4114, 0x8232C232}, - {0x4115, 0x8232C233}, - {0x4116, 0x8232C234}, - {0x4117, 0x8232C235}, - {0x4118, 0x8232C236}, - {0x4119, 0x8232C237}, - {0x411A, 0x8232C238}, - {0x411B, 0x8232C239}, - {0x411C, 0x8232C330}, - {0x411D, 0x8232C331}, - {0x411E, 0x8232C332}, - {0x411F, 0x8232C333}, - {0x4120, 0x8232C334}, - {0x4121, 0x8232C335}, - {0x4122, 0x8232C336}, - {0x4123, 0x8232C337}, - {0x4124, 0x8232C338}, - {0x4125, 0x8232C339}, - {0x4126, 0x8232C430}, - {0x4127, 0x8232C431}, - {0x4128, 0x8232C432}, - {0x4129, 0x8232C433}, - {0x412A, 0x8232C434}, - {0x412B, 0x8232C435}, - {0x412C, 0x8232C436}, - {0x412D, 0x8232C437}, - {0x412E, 0x8232C438}, - {0x412F, 0x8232C439}, - {0x4130, 0x8232C530}, - {0x4131, 0x8232C531}, - {0x4132, 0x8232C532}, - {0x4133, 0x8232C533}, - {0x4134, 0x8232C534}, - {0x4135, 0x8232C535}, - {0x4136, 0x8232C536}, - {0x4137, 0x8232C537}, - {0x4138, 0x8232C538}, - {0x4139, 0x8232C539}, - {0x413A, 0x8232C630}, - {0x413B, 0x8232C631}, - {0x413C, 0x8232C632}, - {0x413D, 0x8232C633}, - {0x413E, 0x8232C634}, - {0x413F, 0x8232C635}, - {0x4140, 0x8232C636}, - {0x4141, 0x8232C637}, - {0x4142, 0x8232C638}, - {0x4143, 0x8232C639}, - {0x4144, 0x8232C730}, - {0x4145, 0x8232C731}, - {0x4146, 0x8232C732}, - {0x4147, 0x8232C733}, - {0x4148, 0x8232C734}, - {0x4149, 0x8232C735}, - {0x414A, 0x8232C736}, - {0x414B, 0x8232C737}, - {0x414C, 0x8232C738}, - {0x414D, 0x8232C739}, - {0x414E, 0x8232C830}, - {0x414F, 0x8232C831}, - {0x4150, 0x8232C832}, - {0x4151, 0x8232C833}, - {0x4152, 0x8232C834}, - {0x4153, 0x8232C835}, - {0x4154, 0x8232C836}, - {0x4155, 0x8232C837}, - {0x4156, 0x8232C838}, - {0x4157, 0x8232C839}, - {0x4158, 0x8232C930}, - {0x4159, 0x8232C931}, - {0x415A, 0x8232C932}, - {0x415B, 0x8232C933}, - {0x415C, 0x8232C934}, - {0x415D, 0x8232C935}, - {0x415E, 0x8232C936}, - {0x4338, 0x8232F838}, - {0x4339, 0x8232F839}, - {0x433A, 0x8232F930}, - {0x433B, 0x8232F931}, - {0x433C, 0x8232F932}, - {0x433D, 0x8232F933}, - {0x433E, 0x8232F934}, - {0x433F, 0x8232F935}, - {0x4340, 0x8232F936}, - {0x4341, 0x8232F937}, - {0x4342, 0x8232F938}, - {0x4343, 0x8232F939}, - {0x4344, 0x8232FA30}, - {0x4345, 0x8232FA31}, - {0x4346, 0x8232FA32}, - {0x4347, 0x8232FA33}, - {0x4348, 0x8232FA34}, - {0x4349, 0x8232FA35}, - {0x434A, 0x8232FA36}, - {0x434B, 0x8232FA37}, - {0x434C, 0x8232FA38}, - {0x434D, 0x8232FA39}, - {0x434E, 0x8232FB30}, - {0x434F, 0x8232FB31}, - {0x4350, 0x8232FB32}, - {0x4351, 0x8232FB33}, - {0x4352, 0x8232FB34}, - {0x4353, 0x8232FB35}, - {0x4354, 0x8232FB36}, - {0x4355, 0x8232FB37}, - {0x4356, 0x8232FB38}, - {0x4357, 0x8232FB39}, - {0x4358, 0x8232FC30}, - {0x4359, 0x8232FC31}, - {0x435A, 0x8232FC32}, - {0x435B, 0x8232FC33}, - {0x435C, 0x8232FC34}, - {0x435D, 0x8232FC35}, - {0x435E, 0x8232FC36}, - {0x435F, 0x8232FC37}, - {0x4360, 0x8232FC38}, - {0x4361, 0x8232FC39}, - {0x4362, 0x8232FD30}, - {0x4363, 0x8232FD31}, - {0x4364, 0x8232FD32}, - {0x4365, 0x8232FD33}, - {0x4366, 0x8232FD34}, - {0x4367, 0x8232FD35}, - {0x4368, 0x8232FD36}, - {0x4369, 0x8232FD37}, - {0x436A, 0x8232FD38}, - {0x436B, 0x8232FD39}, - {0x436C, 0x8232FE30}, - {0x436D, 0x8232FE31}, - {0x436E, 0x8232FE32}, - {0x436F, 0x8232FE33}, - {0x4370, 0x8232FE34}, - {0x4371, 0x8232FE35}, - {0x4372, 0x8232FE36}, - {0x4373, 0x8232FE37}, - {0x4374, 0x8232FE38}, - {0x4375, 0x8232FE39}, - {0x4376, 0x82338130}, - {0x4377, 0x82338131}, - {0x4378, 0x82338132}, - {0x4379, 0x82338133}, - {0x437A, 0x82338134}, - {0x437B, 0x82338135}, - {0x437C, 0x82338136}, - {0x437D, 0x82338137}, - {0x437E, 0x82338138}, - {0x437F, 0x82338139}, - {0x4380, 0x82338230}, - {0x4381, 0x82338231}, - {0x4382, 0x82338232}, - {0x4383, 0x82338233}, - {0x4384, 0x82338234}, - {0x4385, 0x82338235}, - {0x4386, 0x82338236}, - {0x4387, 0x82338237}, - {0x4388, 0x82338238}, - {0x4389, 0x82338239}, - {0x438A, 0x82338330}, - {0x438B, 0x82338331}, - {0x438C, 0x82338332}, - {0x438D, 0x82338333}, - {0x438E, 0x82338334}, - {0x438F, 0x82338335}, - {0x4390, 0x82338336}, - {0x4391, 0x82338337}, - {0x4392, 0x82338338}, - {0x4393, 0x82338339}, - {0x4394, 0x82338430}, - {0x4395, 0x82338431}, - {0x4396, 0x82338432}, - {0x4397, 0x82338433}, - {0x4398, 0x82338434}, - {0x4399, 0x82338435}, - {0x439A, 0x82338436}, - {0x439B, 0x82338437}, - {0x439C, 0x82338438}, - {0x439D, 0x82338439}, - {0x439E, 0x82338530}, - {0x439F, 0x82338531}, - {0x43A0, 0x82338532}, - {0x43A1, 0x82338533}, - {0x43A2, 0x82338534}, - {0x43A3, 0x82338535}, - {0x43A4, 0x82338536}, - {0x43A5, 0x82338537}, - {0x43A6, 0x82338538}, - {0x43A7, 0x82338539}, - {0x43A8, 0x82338630}, - {0x43A9, 0x82338631}, - {0x43AA, 0x82338632}, - {0x43AB, 0x82338633}, - {0x43AD, 0x82338634}, - {0x43AE, 0x82338635}, - {0x43AF, 0x82338636}, - {0x43B0, 0x82338637}, - {0x43B2, 0x82338638}, - {0x43B3, 0x82338639}, - {0x43B4, 0x82338730}, - {0x43B5, 0x82338731}, - {0x43B6, 0x82338732}, - {0x43B7, 0x82338733}, - {0x43B8, 0x82338734}, - {0x43B9, 0x82338735}, - {0x43BA, 0x82338736}, - {0x43BB, 0x82338737}, - {0x43BC, 0x82338738}, - {0x43BD, 0x82338739}, - {0x43BE, 0x82338830}, - {0x43BF, 0x82338831}, - {0x43C0, 0x82338832}, - {0x43C1, 0x82338833}, - {0x43C2, 0x82338834}, - {0x43C3, 0x82338835}, - {0x43C4, 0x82338836}, - {0x43C5, 0x82338837}, - {0x43C6, 0x82338838}, - {0x43C7, 0x82338839}, - {0x43C8, 0x82338930}, - {0x43C9, 0x82338931}, - {0x43CA, 0x82338932}, - {0x43CB, 0x82338933}, - {0x43CC, 0x82338934}, - {0x43CD, 0x82338935}, - {0x43CE, 0x82338936}, - {0x43CF, 0x82338937}, - {0x43D0, 0x82338938}, - {0x43D1, 0x82338939}, - {0x43D2, 0x82338A30}, - {0x43D3, 0x82338A31}, - {0x43D4, 0x82338A32}, - {0x43D5, 0x82338A33}, - {0x43D6, 0x82338A34}, - {0x43D7, 0x82338A35}, - {0x43D8, 0x82338A36}, - {0x43D9, 0x82338A37}, - {0x43DA, 0x82338A38}, - {0x43DB, 0x82338A39}, - {0x43DC, 0x82338B30}, - {0x43DE, 0x82338B31}, - {0x43DF, 0x82338B32}, - {0x43E0, 0x82338B33}, - {0x43E1, 0x82338B34}, - {0x43E2, 0x82338B35}, - {0x43E3, 0x82338B36}, - {0x43E4, 0x82338B37}, - {0x43E5, 0x82338B38}, - {0x43E6, 0x82338B39}, - {0x43E7, 0x82338C30}, - {0x43E8, 0x82338C31}, - {0x43E9, 0x82338C32}, - {0x43EA, 0x82338C33}, - {0x43EB, 0x82338C34}, - {0x43EC, 0x82338C35}, - {0x43ED, 0x82338C36}, - {0x43EE, 0x82338C37}, - {0x43EF, 0x82338C38}, - {0x43F0, 0x82338C39}, - {0x43F1, 0x82338D30}, - {0x43F2, 0x82338D31}, - {0x43F3, 0x82338D32}, - {0x43F4, 0x82338D33}, - {0x43F5, 0x82338D34}, - {0x43F6, 0x82338D35}, - {0x43F7, 0x82338D36}, - {0x43F8, 0x82338D37}, - {0x43F9, 0x82338D38}, - {0x43FA, 0x82338D39}, - {0x43FB, 0x82338E30}, - {0x43FC, 0x82338E31}, - {0x43FD, 0x82338E32}, - {0x43FE, 0x82338E33}, - {0x43FF, 0x82338E34}, - {0x4400, 0x82338E35}, - {0x4401, 0x82338E36}, - {0x4402, 0x82338E37}, - {0x4403, 0x82338E38}, - {0x4404, 0x82338E39}, - {0x4405, 0x82338F30}, - {0x4406, 0x82338F31}, - {0x4407, 0x82338F32}, - {0x4408, 0x82338F33}, - {0x4409, 0x82338F34}, - {0x440A, 0x82338F35}, - {0x440B, 0x82338F36}, - {0x440C, 0x82338F37}, - {0x440D, 0x82338F38}, - {0x440E, 0x82338F39}, - {0x440F, 0x82339030}, - {0x4410, 0x82339031}, - {0x4411, 0x82339032}, - {0x4412, 0x82339033}, - {0x4413, 0x82339034}, - {0x4414, 0x82339035}, - {0x4415, 0x82339036}, - {0x4416, 0x82339037}, - {0x4417, 0x82339038}, - {0x4418, 0x82339039}, - {0x4419, 0x82339130}, - {0x441A, 0x82339131}, - {0x441B, 0x82339132}, - {0x441C, 0x82339133}, - {0x441D, 0x82339134}, - {0x441E, 0x82339135}, - {0x441F, 0x82339136}, - {0x4420, 0x82339137}, - {0x4421, 0x82339138}, - {0x4422, 0x82339139}, - {0x4423, 0x82339230}, - {0x4424, 0x82339231}, - {0x4425, 0x82339232}, - {0x4426, 0x82339233}, - {0x4427, 0x82339234}, - {0x4428, 0x82339235}, - {0x4429, 0x82339236}, - {0x442A, 0x82339237}, - {0x442B, 0x82339238}, - {0x442C, 0x82339239}, - {0x442D, 0x82339330}, - {0x442E, 0x82339331}, - {0x442F, 0x82339332}, - {0x4430, 0x82339333}, - {0x4431, 0x82339334}, - {0x4432, 0x82339335}, - {0x4433, 0x82339336}, - {0x4434, 0x82339337}, - {0x4435, 0x82339338}, - {0x4436, 0x82339339}, - {0x4437, 0x82339430}, - {0x4438, 0x82339431}, - {0x4439, 0x82339432}, - {0x443A, 0x82339433}, - {0x443B, 0x82339434}, - {0x443C, 0x82339435}, - {0x443D, 0x82339436}, - {0x443E, 0x82339437}, - {0x443F, 0x82339438}, - {0x4440, 0x82339439}, - {0x4441, 0x82339530}, - {0x4442, 0x82339531}, - {0x4443, 0x82339532}, - {0x4444, 0x82339533}, - {0x4445, 0x82339534}, - {0x4446, 0x82339535}, - {0x4447, 0x82339536}, - {0x4448, 0x82339537}, - {0x4449, 0x82339538}, - {0x444A, 0x82339539}, - {0x444B, 0x82339630}, - {0x444C, 0x82339631}, - {0x444D, 0x82339632}, - {0x444E, 0x82339633}, - {0x444F, 0x82339634}, - {0x4450, 0x82339635}, - {0x4451, 0x82339636}, - {0x4452, 0x82339637}, - {0x4453, 0x82339638}, - {0x4454, 0x82339639}, - {0x4455, 0x82339730}, - {0x4456, 0x82339731}, - {0x4457, 0x82339732}, - {0x4458, 0x82339733}, - {0x4459, 0x82339734}, - {0x445A, 0x82339735}, - {0x445B, 0x82339736}, - {0x445C, 0x82339737}, - {0x445D, 0x82339738}, - {0x445E, 0x82339739}, - {0x445F, 0x82339830}, - {0x4460, 0x82339831}, - {0x4461, 0x82339832}, - {0x4462, 0x82339833}, - {0x4463, 0x82339834}, - {0x4464, 0x82339835}, - {0x4465, 0x82339836}, - {0x4466, 0x82339837}, - {0x4467, 0x82339838}, - {0x4468, 0x82339839}, - {0x4469, 0x82339930}, - {0x446A, 0x82339931}, - {0x446B, 0x82339932}, - {0x446C, 0x82339933}, - {0x446D, 0x82339934}, - {0x446E, 0x82339935}, - {0x446F, 0x82339936}, - {0x4470, 0x82339937}, - {0x4471, 0x82339938}, - {0x4472, 0x82339939}, - {0x4473, 0x82339A30}, - {0x4474, 0x82339A31}, - {0x4475, 0x82339A32}, - {0x4476, 0x82339A33}, - {0x4477, 0x82339A34}, - {0x4478, 0x82339A35}, - {0x4479, 0x82339A36}, - {0x447A, 0x82339A37}, - {0x447B, 0x82339A38}, - {0x447C, 0x82339A39}, - {0x447D, 0x82339B30}, - {0x447E, 0x82339B31}, - {0x447F, 0x82339B32}, - {0x4480, 0x82339B33}, - {0x4481, 0x82339B34}, - {0x4482, 0x82339B35}, - {0x4483, 0x82339B36}, - {0x4484, 0x82339B37}, - {0x4485, 0x82339B38}, - {0x4486, 0x82339B39}, - {0x4487, 0x82339C30}, - {0x4488, 0x82339C31}, - {0x4489, 0x82339C32}, - {0x448A, 0x82339C33}, - {0x448B, 0x82339C34}, - {0x448C, 0x82339C35}, - {0x448D, 0x82339C36}, - {0x448E, 0x82339C37}, - {0x448F, 0x82339C38}, - {0x4490, 0x82339C39}, - {0x4491, 0x82339D30}, - {0x4492, 0x82339D31}, - {0x4493, 0x82339D32}, - {0x4494, 0x82339D33}, - {0x4495, 0x82339D34}, - {0x4496, 0x82339D35}, - {0x4497, 0x82339D36}, - {0x4498, 0x82339D37}, - {0x4499, 0x82339D38}, - {0x449A, 0x82339D39}, - {0x449B, 0x82339E30}, - {0x449C, 0x82339E31}, - {0x449D, 0x82339E32}, - {0x449E, 0x82339E33}, - {0x449F, 0x82339E34}, - {0x44A0, 0x82339E35}, - {0x44A1, 0x82339E36}, - {0x44A2, 0x82339E37}, - {0x44A3, 0x82339E38}, - {0x44A4, 0x82339E39}, - {0x44A5, 0x82339F30}, - {0x44A6, 0x82339F31}, - {0x44A7, 0x82339F32}, - {0x44A8, 0x82339F33}, - {0x44A9, 0x82339F34}, - {0x44AA, 0x82339F35}, - {0x44AB, 0x82339F36}, - {0x44AC, 0x82339F37}, - {0x44AD, 0x82339F38}, - {0x44AE, 0x82339F39}, - {0x44AF, 0x8233A030}, - {0x44B0, 0x8233A031}, - {0x44B1, 0x8233A032}, - {0x44B2, 0x8233A033}, - {0x44B3, 0x8233A034}, - {0x44B4, 0x8233A035}, - {0x44B5, 0x8233A036}, - {0x44B6, 0x8233A037}, - {0x44B7, 0x8233A038}, - {0x44B8, 0x8233A039}, - {0x44B9, 0x8233A130}, - {0x44BA, 0x8233A131}, - {0x44BB, 0x8233A132}, - {0x44BC, 0x8233A133}, - {0x44BD, 0x8233A134}, - {0x44BE, 0x8233A135}, - {0x44BF, 0x8233A136}, - {0x44C0, 0x8233A137}, - {0x44C1, 0x8233A138}, - {0x44C2, 0x8233A139}, - {0x44C3, 0x8233A230}, - {0x44C4, 0x8233A231}, - {0x44C5, 0x8233A232}, - {0x44C6, 0x8233A233}, - {0x44C7, 0x8233A234}, - {0x44C8, 0x8233A235}, - {0x44C9, 0x8233A236}, - {0x44CA, 0x8233A237}, - {0x44CB, 0x8233A238}, - {0x44CC, 0x8233A239}, - {0x44CD, 0x8233A330}, - {0x44CE, 0x8233A331}, - {0x44CF, 0x8233A332}, - {0x44D0, 0x8233A333}, - {0x44D1, 0x8233A334}, - {0x44D2, 0x8233A335}, - {0x44D3, 0x8233A336}, - {0x44D4, 0x8233A337}, - {0x44D5, 0x8233A338}, - {0x464D, 0x8233C932}, - {0x464E, 0x8233C933}, - {0x464F, 0x8233C934}, - {0x4650, 0x8233C935}, - {0x4651, 0x8233C936}, - {0x4652, 0x8233C937}, - {0x4653, 0x8233C938}, - {0x4654, 0x8233C939}, - {0x4655, 0x8233CA30}, - {0x4656, 0x8233CA31}, - {0x4657, 0x8233CA32}, - {0x4658, 0x8233CA33}, - {0x4659, 0x8233CA34}, - {0x465A, 0x8233CA35}, - {0x465B, 0x8233CA36}, - {0x465C, 0x8233CA37}, - {0x465D, 0x8233CA38}, - {0x465E, 0x8233CA39}, - {0x465F, 0x8233CB30}, - {0x4660, 0x8233CB31}, - {0x4662, 0x8233CB32}, - {0x4663, 0x8233CB33}, - {0x4664, 0x8233CB34}, - {0x4665, 0x8233CB35}, - {0x4666, 0x8233CB36}, - {0x4667, 0x8233CB37}, - {0x4668, 0x8233CB38}, - {0x4669, 0x8233CB39}, - {0x466A, 0x8233CC30}, - {0x466B, 0x8233CC31}, - {0x466C, 0x8233CC32}, - {0x466D, 0x8233CC33}, - {0x466E, 0x8233CC34}, - {0x466F, 0x8233CC35}, - {0x4670, 0x8233CC36}, - {0x4671, 0x8233CC37}, - {0x4672, 0x8233CC38}, - {0x4673, 0x8233CC39}, - {0x4674, 0x8233CD30}, - {0x4675, 0x8233CD31}, - {0x4676, 0x8233CD32}, - {0x4677, 0x8233CD33}, - {0x4678, 0x8233CD34}, - {0x4679, 0x8233CD35}, - {0x467A, 0x8233CD36}, - {0x467B, 0x8233CD37}, - {0x467C, 0x8233CD38}, - {0x467D, 0x8233CD39}, - {0x467E, 0x8233CE30}, - {0x467F, 0x8233CE31}, - {0x4680, 0x8233CE32}, - {0x4681, 0x8233CE33}, - {0x4682, 0x8233CE34}, - {0x4683, 0x8233CE35}, - {0x4684, 0x8233CE36}, - {0x4685, 0x8233CE37}, - {0x4686, 0x8233CE38}, - {0x4687, 0x8233CE39}, - {0x4688, 0x8233CF30}, - {0x4689, 0x8233CF31}, - {0x468A, 0x8233CF32}, - {0x468B, 0x8233CF33}, - {0x468C, 0x8233CF34}, - {0x468D, 0x8233CF35}, - {0x468E, 0x8233CF36}, - {0x468F, 0x8233CF37}, - {0x4690, 0x8233CF38}, - {0x4691, 0x8233CF39}, - {0x4692, 0x8233D030}, - {0x4693, 0x8233D031}, - {0x4694, 0x8233D032}, - {0x4695, 0x8233D033}, - {0x4696, 0x8233D034}, - {0x4697, 0x8233D035}, - {0x4698, 0x8233D036}, - {0x4699, 0x8233D037}, - {0x469A, 0x8233D038}, - {0x469B, 0x8233D039}, - {0x469C, 0x8233D130}, - {0x469D, 0x8233D131}, - {0x469E, 0x8233D132}, - {0x469F, 0x8233D133}, - {0x46A0, 0x8233D134}, - {0x46A1, 0x8233D135}, - {0x46A2, 0x8233D136}, - {0x46A3, 0x8233D137}, - {0x46A4, 0x8233D138}, - {0x46A5, 0x8233D139}, - {0x46A6, 0x8233D230}, - {0x46A7, 0x8233D231}, - {0x46A8, 0x8233D232}, - {0x46A9, 0x8233D233}, - {0x46AA, 0x8233D234}, - {0x46AB, 0x8233D235}, - {0x46AC, 0x8233D236}, - {0x46AD, 0x8233D237}, - {0x46AE, 0x8233D238}, - {0x46AF, 0x8233D239}, - {0x46B0, 0x8233D330}, - {0x46B1, 0x8233D331}, - {0x46B2, 0x8233D332}, - {0x46B3, 0x8233D333}, - {0x46B4, 0x8233D334}, - {0x46B5, 0x8233D335}, - {0x46B6, 0x8233D336}, - {0x46B7, 0x8233D337}, - {0x46B8, 0x8233D338}, - {0x46B9, 0x8233D339}, - {0x46BA, 0x8233D430}, - {0x46BB, 0x8233D431}, - {0x46BC, 0x8233D432}, - {0x46BD, 0x8233D433}, - {0x46BE, 0x8233D434}, - {0x46BF, 0x8233D435}, - {0x46C0, 0x8233D436}, - {0x46C1, 0x8233D437}, - {0x46C2, 0x8233D438}, - {0x46C3, 0x8233D439}, - {0x46C4, 0x8233D530}, - {0x46C5, 0x8233D531}, - {0x46C6, 0x8233D532}, - {0x46C7, 0x8233D533}, - {0x46C8, 0x8233D534}, - {0x46C9, 0x8233D535}, - {0x46CA, 0x8233D536}, - {0x46CB, 0x8233D537}, - {0x46CC, 0x8233D538}, - {0x46CD, 0x8233D539}, - {0x46CE, 0x8233D630}, - {0x46CF, 0x8233D631}, - {0x46D0, 0x8233D632}, - {0x46D1, 0x8233D633}, - {0x46D2, 0x8233D634}, - {0x46D3, 0x8233D635}, - {0x46D4, 0x8233D636}, - {0x46D5, 0x8233D637}, - {0x46D6, 0x8233D638}, - {0x46D7, 0x8233D639}, - {0x46D8, 0x8233D730}, - {0x46D9, 0x8233D731}, - {0x46DA, 0x8233D732}, - {0x46DB, 0x8233D733}, - {0x46DC, 0x8233D734}, - {0x46DD, 0x8233D735}, - {0x46DE, 0x8233D736}, - {0x46DF, 0x8233D737}, - {0x46E0, 0x8233D738}, - {0x46E1, 0x8233D739}, - {0x46E2, 0x8233D830}, - {0x46E3, 0x8233D831}, - {0x46E4, 0x8233D832}, - {0x46E5, 0x8233D833}, - {0x46E6, 0x8233D834}, - {0x46E7, 0x8233D835}, - {0x46E8, 0x8233D836}, - {0x46E9, 0x8233D837}, - {0x46EA, 0x8233D838}, - {0x46EB, 0x8233D839}, - {0x46EC, 0x8233D930}, - {0x46ED, 0x8233D931}, - {0x46EE, 0x8233D932}, - {0x46EF, 0x8233D933}, - {0x46F0, 0x8233D934}, - {0x46F1, 0x8233D935}, - {0x46F2, 0x8233D936}, - {0x46F3, 0x8233D937}, - {0x46F4, 0x8233D938}, - {0x46F5, 0x8233D939}, - {0x46F6, 0x8233DA30}, - {0x46F7, 0x8233DA31}, - {0x46F8, 0x8233DA32}, - {0x46F9, 0x8233DA33}, - {0x46FA, 0x8233DA34}, - {0x46FB, 0x8233DA35}, - {0x46FC, 0x8233DA36}, - {0x46FD, 0x8233DA37}, - {0x46FE, 0x8233DA38}, - {0x46FF, 0x8233DA39}, - {0x4700, 0x8233DB30}, - {0x4701, 0x8233DB31}, - {0x4702, 0x8233DB32}, - {0x4703, 0x8233DB33}, - {0x4704, 0x8233DB34}, - {0x4705, 0x8233DB35}, - {0x4706, 0x8233DB36}, - {0x4707, 0x8233DB37}, - {0x4708, 0x8233DB38}, - {0x4709, 0x8233DB39}, - {0x470A, 0x8233DC30}, - {0x470B, 0x8233DC31}, - {0x470C, 0x8233DC32}, - {0x470D, 0x8233DC33}, - {0x470E, 0x8233DC34}, - {0x470F, 0x8233DC35}, - {0x4710, 0x8233DC36}, - {0x4711, 0x8233DC37}, - {0x4712, 0x8233DC38}, - {0x4713, 0x8233DC39}, - {0x4714, 0x8233DD30}, - {0x4715, 0x8233DD31}, - {0x4716, 0x8233DD32}, - {0x4717, 0x8233DD33}, - {0x4718, 0x8233DD34}, - {0x4719, 0x8233DD35}, - {0x471A, 0x8233DD36}, - {0x471B, 0x8233DD37}, - {0x471C, 0x8233DD38}, - {0x471D, 0x8233DD39}, - {0x471E, 0x8233DE30}, - {0x471F, 0x8233DE31}, - {0x4720, 0x8233DE32}, - {0x4721, 0x8233DE33}, - {0x4722, 0x8233DE34}, - {0x4724, 0x8233DE35}, - {0x4725, 0x8233DE36}, - {0x4726, 0x8233DE37}, - {0x4727, 0x8233DE38}, - {0x4728, 0x8233DE39}, - {0x472A, 0x8233DF30}, - {0x472B, 0x8233DF31}, - {0x472C, 0x8233DF32}, - {0x472D, 0x8233DF33}, - {0x472E, 0x8233DF34}, - {0x472F, 0x8233DF35}, - {0x4730, 0x8233DF36}, - {0x4731, 0x8233DF37}, - {0x4732, 0x8233DF38}, - {0x4733, 0x8233DF39}, - {0x4734, 0x8233E030}, - {0x4735, 0x8233E031}, - {0x4736, 0x8233E032}, - {0x4737, 0x8233E033}, - {0x4738, 0x8233E034}, - {0x4739, 0x8233E035}, - {0x473A, 0x8233E036}, - {0x473B, 0x8233E037}, - {0x473C, 0x8233E038}, - {0x473D, 0x8233E039}, - {0x473E, 0x8233E130}, - {0x473F, 0x8233E131}, - {0x4740, 0x8233E132}, - {0x4741, 0x8233E133}, - {0x4742, 0x8233E134}, - {0x4743, 0x8233E135}, - {0x4744, 0x8233E136}, - {0x4745, 0x8233E137}, - {0x4746, 0x8233E138}, - {0x4747, 0x8233E139}, - {0x4748, 0x8233E230}, - {0x4749, 0x8233E231}, - {0x474A, 0x8233E232}, - {0x474B, 0x8233E233}, - {0x474C, 0x8233E234}, - {0x474D, 0x8233E235}, - {0x474E, 0x8233E236}, - {0x474F, 0x8233E237}, - {0x4750, 0x8233E238}, - {0x4751, 0x8233E239}, - {0x4752, 0x8233E330}, - {0x4753, 0x8233E331}, - {0x4754, 0x8233E332}, - {0x4755, 0x8233E333}, - {0x4756, 0x8233E334}, - {0x4757, 0x8233E335}, - {0x4758, 0x8233E336}, - {0x4759, 0x8233E337}, - {0x475A, 0x8233E338}, - {0x475B, 0x8233E339}, - {0x475C, 0x8233E430}, - {0x475D, 0x8233E431}, - {0x475E, 0x8233E432}, - {0x475F, 0x8233E433}, - {0x4760, 0x8233E434}, - {0x4761, 0x8233E435}, - {0x4762, 0x8233E436}, - {0x4763, 0x8233E437}, - {0x4764, 0x8233E438}, - {0x4765, 0x8233E439}, - {0x4766, 0x8233E530}, - {0x4767, 0x8233E531}, - {0x4768, 0x8233E532}, - {0x4769, 0x8233E533}, - {0x476A, 0x8233E534}, - {0x476B, 0x8233E535}, - {0x476C, 0x8233E536}, - {0x476D, 0x8233E537}, - {0x476E, 0x8233E538}, - {0x476F, 0x8233E539}, - {0x4770, 0x8233E630}, - {0x4771, 0x8233E631}, - {0x4772, 0x8233E632}, - {0x4773, 0x8233E633}, - {0x4774, 0x8233E634}, - {0x4775, 0x8233E635}, - {0x4776, 0x8233E636}, - {0x4777, 0x8233E637}, - {0x4778, 0x8233E638}, - {0x4779, 0x8233E639}, - {0x477A, 0x8233E730}, - {0x477B, 0x8233E731}, - {0x477D, 0x8233E732}, - {0x477E, 0x8233E733}, - {0x477F, 0x8233E734}, - {0x4780, 0x8233E735}, - {0x4781, 0x8233E736}, - {0x4782, 0x8233E737}, - {0x4783, 0x8233E738}, - {0x4784, 0x8233E739}, - {0x4785, 0x8233E830}, - {0x4786, 0x8233E831}, - {0x4787, 0x8233E832}, - {0x4788, 0x8233E833}, - {0x4789, 0x8233E834}, - {0x478A, 0x8233E835}, - {0x478B, 0x8233E836}, - {0x478C, 0x8233E837}, - {0x4948, 0x82349639}, - {0x4949, 0x82349730}, - {0x494A, 0x82349731}, - {0x494B, 0x82349732}, - {0x494C, 0x82349733}, - {0x494D, 0x82349734}, - {0x494E, 0x82349735}, - {0x494F, 0x82349736}, - {0x4950, 0x82349737}, - {0x4951, 0x82349738}, - {0x4952, 0x82349739}, - {0x4953, 0x82349830}, - {0x4954, 0x82349831}, - {0x4955, 0x82349832}, - {0x4956, 0x82349833}, - {0x4957, 0x82349834}, - {0x4958, 0x82349835}, - {0x4959, 0x82349836}, - {0x495A, 0x82349837}, - {0x495B, 0x82349838}, - {0x495C, 0x82349839}, - {0x495D, 0x82349930}, - {0x495E, 0x82349931}, - {0x495F, 0x82349932}, - {0x4960, 0x82349933}, - {0x4961, 0x82349934}, - {0x4962, 0x82349935}, - {0x4963, 0x82349936}, - {0x4964, 0x82349937}, - {0x4965, 0x82349938}, - {0x4966, 0x82349939}, - {0x4967, 0x82349A30}, - {0x4968, 0x82349A31}, - {0x4969, 0x82349A32}, - {0x496A, 0x82349A33}, - {0x496B, 0x82349A34}, - {0x496C, 0x82349A35}, - {0x496D, 0x82349A36}, - {0x496E, 0x82349A37}, - {0x496F, 0x82349A38}, - {0x4970, 0x82349A39}, - {0x4971, 0x82349B30}, - {0x4972, 0x82349B31}, - {0x4973, 0x82349B32}, - {0x4974, 0x82349B33}, - {0x4975, 0x82349B34}, - {0x4976, 0x82349B35}, - {0x4977, 0x82349B36}, - {0x4978, 0x82349B37}, - {0x4979, 0x82349B38}, - {0x497B, 0x82349B39}, - {0x497C, 0x82349C30}, - {0x497E, 0x82349C31}, - {0x497F, 0x82349C32}, - {0x4980, 0x82349C33}, - {0x4981, 0x82349C34}, - {0x4984, 0x82349C35}, - {0x4987, 0x82349C36}, - {0x4988, 0x82349C37}, - {0x4989, 0x82349C38}, - {0x498A, 0x82349C39}, - {0x498B, 0x82349D30}, - {0x498C, 0x82349D31}, - {0x498D, 0x82349D32}, - {0x498E, 0x82349D33}, - {0x498F, 0x82349D34}, - {0x4990, 0x82349D35}, - {0x4991, 0x82349D36}, - {0x4992, 0x82349D37}, - {0x4993, 0x82349D38}, - {0x4994, 0x82349D39}, - {0x4995, 0x82349E30}, - {0x4996, 0x82349E31}, - {0x4997, 0x82349E32}, - {0x4998, 0x82349E33}, - {0x4999, 0x82349E34}, - {0x499A, 0x82349E35}, - {0x499C, 0x82349E36}, - {0x499D, 0x82349E37}, - {0x499E, 0x82349E38}, - {0x49A0, 0x82349E39}, - {0x49A1, 0x82349F30}, - {0x49A2, 0x82349F31}, - {0x49A3, 0x82349F32}, - {0x49A4, 0x82349F33}, - {0x49A5, 0x82349F34}, - {0x49A6, 0x82349F35}, - {0x49A7, 0x82349F36}, - {0x49A8, 0x82349F37}, - {0x49A9, 0x82349F38}, - {0x49AA, 0x82349F39}, - {0x49AB, 0x8234A030}, - {0x49AC, 0x8234A031}, - {0x49AD, 0x8234A032}, - {0x49AE, 0x8234A033}, - {0x49AF, 0x8234A034}, - {0x49B0, 0x8234A035}, - {0x49B1, 0x8234A036}, - {0x49B2, 0x8234A037}, - {0x49B3, 0x8234A038}, - {0x49B4, 0x8234A039}, - {0x49B5, 0x8234A130}, - {0x4C78, 0x8234E734}, - {0x4C79, 0x8234E735}, - {0x4C7A, 0x8234E736}, - {0x4C7B, 0x8234E737}, - {0x4C7C, 0x8234E738}, - {0x4C7D, 0x8234E739}, - {0x4C7E, 0x8234E830}, - {0x4C7F, 0x8234E831}, - {0x4C80, 0x8234E832}, - {0x4C81, 0x8234E833}, - {0x4C82, 0x8234E834}, - {0x4C83, 0x8234E835}, - {0x4C84, 0x8234E836}, - {0x4C85, 0x8234E837}, - {0x4C86, 0x8234E838}, - {0x4C87, 0x8234E839}, - {0x4C88, 0x8234E930}, - {0x4C89, 0x8234E931}, - {0x4C8A, 0x8234E932}, - {0x4C8B, 0x8234E933}, - {0x4C8C, 0x8234E934}, - {0x4C8D, 0x8234E935}, - {0x4C8E, 0x8234E936}, - {0x4C8F, 0x8234E937}, - {0x4C90, 0x8234E938}, - {0x4C91, 0x8234E939}, - {0x4C92, 0x8234EA30}, - {0x4C93, 0x8234EA31}, - {0x4C94, 0x8234EA32}, - {0x4C95, 0x8234EA33}, - {0x4C96, 0x8234EA34}, - {0x4C97, 0x8234EA35}, - {0x4C98, 0x8234EA36}, - {0x4C99, 0x8234EA37}, - {0x4C9A, 0x8234EA38}, - {0x4C9B, 0x8234EA39}, - {0x4C9C, 0x8234EB30}, - {0x4C9D, 0x8234EB31}, - {0x4C9E, 0x8234EB32}, - {0x4CA4, 0x8234EB33}, - {0x4CA5, 0x8234EB34}, - {0x4CA6, 0x8234EB35}, - {0x4CA7, 0x8234EB36}, - {0x4CA8, 0x8234EB37}, - {0x4CA9, 0x8234EB38}, - {0x4CAA, 0x8234EB39}, - {0x4CAB, 0x8234EC30}, - {0x4CAC, 0x8234EC31}, - {0x4CAD, 0x8234EC32}, - {0x4CAE, 0x8234EC33}, - {0x4CAF, 0x8234EC34}, - {0x4CB0, 0x8234EC35}, - {0x4CB1, 0x8234EC36}, - {0x4CB2, 0x8234EC37}, - {0x4CB3, 0x8234EC38}, - {0x4CB4, 0x8234EC39}, - {0x4CB5, 0x8234ED30}, - {0x4CB6, 0x8234ED31}, - {0x4CB7, 0x8234ED32}, - {0x4CB8, 0x8234ED33}, - {0x4CB9, 0x8234ED34}, - {0x4CBA, 0x8234ED35}, - {0x4CBB, 0x8234ED36}, - {0x4CBC, 0x8234ED37}, - {0x4CBD, 0x8234ED38}, - {0x4CBE, 0x8234ED39}, - {0x4CBF, 0x8234EE30}, - {0x4CC0, 0x8234EE31}, - {0x4CC1, 0x8234EE32}, - {0x4CC2, 0x8234EE33}, - {0x4CC3, 0x8234EE34}, - {0x4CC4, 0x8234EE35}, - {0x4CC5, 0x8234EE36}, - {0x4CC6, 0x8234EE37}, - {0x4CC7, 0x8234EE38}, - {0x4CC8, 0x8234EE39}, - {0x4CC9, 0x8234EF30}, - {0x4CCA, 0x8234EF31}, - {0x4CCB, 0x8234EF32}, - {0x4CCC, 0x8234EF33}, - {0x4CCD, 0x8234EF34}, - {0x4CCE, 0x8234EF35}, - {0x4CCF, 0x8234EF36}, - {0x4CD0, 0x8234EF37}, - {0x4CD1, 0x8234EF38}, - {0x4CD2, 0x8234EF39}, - {0x4CD3, 0x8234F030}, - {0x4CD4, 0x8234F031}, - {0x4CD5, 0x8234F032}, - {0x4CD6, 0x8234F033}, - {0x4CD7, 0x8234F034}, - {0x4CD8, 0x8234F035}, - {0x4CD9, 0x8234F036}, - {0x4CDA, 0x8234F037}, - {0x4CDB, 0x8234F038}, - {0x4CDC, 0x8234F039}, - {0x4CDD, 0x8234F130}, - {0x4CDE, 0x8234F131}, - {0x4CDF, 0x8234F132}, - {0x4CE0, 0x8234F133}, - {0x4CE1, 0x8234F134}, - {0x4CE2, 0x8234F135}, - {0x4CE3, 0x8234F136}, - {0x4CE4, 0x8234F137}, - {0x4CE5, 0x8234F138}, - {0x4CE6, 0x8234F139}, - {0x4CE7, 0x8234F230}, - {0x4CE8, 0x8234F231}, - {0x4CE9, 0x8234F232}, - {0x4CEA, 0x8234F233}, - {0x4CEB, 0x8234F234}, - {0x4CEC, 0x8234F235}, - {0x4CED, 0x8234F236}, - {0x4CEE, 0x8234F237}, - {0x4CEF, 0x8234F238}, - {0x4CF0, 0x8234F239}, - {0x4CF1, 0x8234F330}, - {0x4CF2, 0x8234F331}, - {0x4CF3, 0x8234F332}, - {0x4CF4, 0x8234F333}, - {0x4CF5, 0x8234F334}, - {0x4CF6, 0x8234F335}, - {0x4CF7, 0x8234F336}, - {0x4CF8, 0x8234F337}, - {0x4CF9, 0x8234F338}, - {0x4CFA, 0x8234F339}, - {0x4CFB, 0x8234F430}, - {0x4CFC, 0x8234F431}, - {0x4CFD, 0x8234F432}, - {0x4CFE, 0x8234F433}, - {0x4CFF, 0x8234F434}, - {0x4D00, 0x8234F435}, - {0x4D01, 0x8234F436}, - {0x4D02, 0x8234F437}, - {0x4D03, 0x8234F438}, - {0x4D04, 0x8234F439}, - {0x4D05, 0x8234F530}, - {0x4D06, 0x8234F531}, - {0x4D07, 0x8234F532}, - {0x4D08, 0x8234F533}, - {0x4D09, 0x8234F534}, - {0x4D0A, 0x8234F535}, - {0x4D0B, 0x8234F536}, - {0x4D0C, 0x8234F537}, - {0x4D0D, 0x8234F538}, - {0x4D0E, 0x8234F539}, - {0x4D0F, 0x8234F630}, - {0x4D10, 0x8234F631}, - {0x4D11, 0x8234F632}, - {0x4D12, 0x8234F633}, - {0x4D1A, 0x8234F634}, - {0x4D1B, 0x8234F635}, - {0x4D1C, 0x8234F636}, - {0x4D1D, 0x8234F637}, - {0x4D1E, 0x8234F638}, - {0x4D1F, 0x8234F639}, - {0x4D20, 0x8234F730}, - {0x4D21, 0x8234F731}, - {0x4D22, 0x8234F732}, - {0x4D23, 0x8234F733}, - {0x4D24, 0x8234F734}, - {0x4D25, 0x8234F735}, - {0x4D26, 0x8234F736}, - {0x4D27, 0x8234F737}, - {0x4D28, 0x8234F738}, - {0x4D29, 0x8234F739}, - {0x4D2A, 0x8234F830}, - {0x4D2B, 0x8234F831}, - {0x4D2C, 0x8234F832}, - {0x4D2D, 0x8234F833}, - {0x4D2E, 0x8234F834}, - {0x4D2F, 0x8234F835}, - {0x4D30, 0x8234F836}, - {0x4D31, 0x8234F837}, - {0x4D32, 0x8234F838}, - {0x4D33, 0x8234F839}, - {0x4D34, 0x8234F930}, - {0x4D35, 0x8234F931}, - {0x4D36, 0x8234F932}, - {0x4D37, 0x8234F933}, - {0x4D38, 0x8234F934}, - {0x4D39, 0x8234F935}, - {0x4D3A, 0x8234F936}, - {0x4D3B, 0x8234F937}, - {0x4D3C, 0x8234F938}, - {0x4D3D, 0x8234F939}, - {0x4D3E, 0x8234FA30}, - {0x4D3F, 0x8234FA31}, - {0x4D40, 0x8234FA32}, - {0x4D41, 0x8234FA33}, - {0x4D42, 0x8234FA34}, - {0x4D43, 0x8234FA35}, - {0x4D44, 0x8234FA36}, - {0x4D45, 0x8234FA37}, - {0x4D46, 0x8234FA38}, - {0x4D47, 0x8234FA39}, - {0x4D48, 0x8234FB30}, - {0x4D49, 0x8234FB31}, - {0x4D4A, 0x8234FB32}, - {0x4D4B, 0x8234FB33}, - {0x4D4C, 0x8234FB34}, - {0x4D4D, 0x8234FB35}, - {0x4D4E, 0x8234FB36}, - {0x4D4F, 0x8234FB37}, - {0x4D50, 0x8234FB38}, - {0x4D51, 0x8234FB39}, - {0x4D52, 0x8234FC30}, - {0x4D53, 0x8234FC31}, - {0x4D54, 0x8234FC32}, - {0x4D55, 0x8234FC33}, - {0x4D56, 0x8234FC34}, - {0x4D57, 0x8234FC35}, - {0x4D58, 0x8234FC36}, - {0x4D59, 0x8234FC37}, - {0x4D5A, 0x8234FC38}, - {0x4D5B, 0x8234FC39}, - {0x4D5C, 0x8234FD30}, - {0x4D5D, 0x8234FD31}, - {0x4D5E, 0x8234FD32}, - {0x4D5F, 0x8234FD33}, - {0x4D60, 0x8234FD34}, - {0x4D61, 0x8234FD35}, - {0x4D62, 0x8234FD36}, - {0x4D63, 0x8234FD37}, - {0x4D64, 0x8234FD38}, - {0x4D65, 0x8234FD39}, - {0x4D66, 0x8234FE30}, - {0x4D67, 0x8234FE31}, - {0x4D68, 0x8234FE32}, - {0x4D69, 0x8234FE33}, - {0x4D6A, 0x8234FE34}, - {0x4D6B, 0x8234FE35}, - {0x4D6C, 0x8234FE36}, - {0x4D6D, 0x8234FE37}, - {0x4D6E, 0x8234FE38}, - {0x4D6F, 0x8234FE39}, - {0x4D70, 0x82358130}, - {0x4D71, 0x82358131}, - {0x4D72, 0x82358132}, - {0x4D73, 0x82358133}, - {0x4D74, 0x82358134}, - {0x4D75, 0x82358135}, - {0x4D76, 0x82358136}, - {0x4D77, 0x82358137}, - {0x4D78, 0x82358138}, - {0x4D79, 0x82358139}, - {0x4D7A, 0x82358230}, - {0x4D7B, 0x82358231}, - {0x4D7C, 0x82358232}, - {0x4D7D, 0x82358233}, - {0x4D7E, 0x82358234}, - {0x4D7F, 0x82358235}, - {0x4D80, 0x82358236}, - {0x4D81, 0x82358237}, - {0x4D82, 0x82358238}, - {0x4D83, 0x82358239}, - {0x4D84, 0x82358330}, - {0x4D85, 0x82358331}, - {0x4D86, 0x82358332}, - {0x4D87, 0x82358333}, - {0x4D88, 0x82358334}, - {0x4D89, 0x82358335}, - {0x4D8A, 0x82358336}, - {0x4D8B, 0x82358337}, - {0x4D8C, 0x82358338}, - {0x4D8D, 0x82358339}, - {0x4D8E, 0x82358430}, - {0x4D8F, 0x82358431}, - {0x4D90, 0x82358432}, - {0x4D91, 0x82358433}, - {0x4D92, 0x82358434}, - {0x4D93, 0x82358435}, - {0x4D94, 0x82358436}, - {0x4D95, 0x82358437}, - {0x4D96, 0x82358438}, - {0x4D97, 0x82358439}, - {0x4D98, 0x82358530}, - {0x4D99, 0x82358531}, - {0x4D9A, 0x82358532}, - {0x4D9B, 0x82358533}, - {0x4D9C, 0x82358534}, - {0x4D9D, 0x82358535}, - {0x4D9E, 0x82358536}, - {0x4D9F, 0x82358537}, - {0x4DA0, 0x82358538}, - {0x4DA1, 0x82358539}, - {0x4DA2, 0x82358630}, - {0x4DA3, 0x82358631}, - {0x4DA4, 0x82358632}, - {0x4DA5, 0x82358633}, - {0x4DA6, 0x82358634}, - {0x4DA7, 0x82358635}, - {0x4DA8, 0x82358636}, - {0x4DA9, 0x82358637}, - {0x4DAA, 0x82358638}, - {0x4DAB, 0x82358639}, - {0x4DAC, 0x82358730}, - {0x4DAD, 0x82358731}, - {0x4DAF, 0x82358732}, - {0x4DB0, 0x82358733}, - {0x4DB1, 0x82358734}, - {0x4DB2, 0x82358735}, - {0x4DB3, 0x82358736}, - {0x4DB4, 0x82358737}, - {0x4DB5, 0x82358738}, - {0x4DB6, 0x82358739}, - {0x4DB7, 0x82358830}, - {0x4DB8, 0x82358831}, - {0x4DB9, 0x82358832}, - {0x4DBA, 0x82358833}, - {0x4DBB, 0x82358834}, - {0x4DBC, 0x82358835}, - {0x4DBD, 0x82358836}, - {0x4DBE, 0x82358837}, - {0x4DBF, 0x82358838}, - {0x4DC0, 0x82358839}, - {0x4DC1, 0x82358930}, - {0x4DC2, 0x82358931}, - {0x4DC3, 0x82358932}, - {0x4DC4, 0x82358933}, - {0x4DC5, 0x82358934}, - {0x4DC6, 0x82358935}, - {0x4DC7, 0x82358936}, - {0x4DC8, 0x82358937}, - {0x4DC9, 0x82358938}, - {0x4DCA, 0x82358939}, - {0x4DCB, 0x82358A30}, - {0x4DCC, 0x82358A31}, - {0x4DCD, 0x82358A32}, - {0x4DCE, 0x82358A33}, - {0x4DCF, 0x82358A34}, - {0x4DD0, 0x82358A35}, - {0x4DD1, 0x82358A36}, - {0x4DD2, 0x82358A37}, - {0x4DD3, 0x82358A38}, - {0x4DD4, 0x82358A39}, - {0x4DD5, 0x82358B30}, - {0x4DD6, 0x82358B31}, - {0x4DD7, 0x82358B32}, - {0x4DD8, 0x82358B33}, - {0x4DD9, 0x82358B34}, - {0x4DDA, 0x82358B35}, - {0x4DDB, 0x82358B36}, - {0x4DDC, 0x82358B37}, - {0x4DDD, 0x82358B38}, - {0x4DDE, 0x82358B39}, - {0x4DDF, 0x82358C30}, - {0x4DE0, 0x82358C31}, - {0x4DE1, 0x82358C32}, - {0x4DE2, 0x82358C33}, - {0x4DE3, 0x82358C34}, - {0x4DE4, 0x82358C35}, - {0x4DE5, 0x82358C36}, - {0x4DE6, 0x82358C37}, - {0x4DE7, 0x82358C38}, - {0x4DE8, 0x82358C39}, - {0x4DE9, 0x82358D30}, - {0x4DEA, 0x82358D31}, - {0x4DEB, 0x82358D32}, - {0x4DEC, 0x82358D33}, - {0x4DED, 0x82358D34}, - {0x4DEE, 0x82358D35}, - {0x4DEF, 0x82358D36}, - {0x4DF0, 0x82358D37}, - {0x4DF1, 0x82358D38}, - {0x4DF2, 0x82358D39}, - {0x4DF3, 0x82358E30}, - {0x4DF4, 0x82358E31}, - {0x4DF5, 0x82358E32}, - {0x4DF6, 0x82358E33}, - {0x4DF7, 0x82358E34}, - {0x4DF8, 0x82358E35}, - {0x4DF9, 0x82358E36}, - {0x4DFA, 0x82358E37}, - {0x4DFB, 0x82358E38}, - {0x4DFC, 0x82358E39}, - {0x4DFD, 0x82358F30}, - {0x4DFE, 0x82358F31}, - {0x4DFF, 0x82358F32}, - {0xE76C, 0x8336C739}, - {0xE7C7, 0x8135F437}, - {0xE7C8, 0x8336C830}, - {0xE7E7, 0x8336C831}, - {0xE7E8, 0x8336C832}, - {0xE7E9, 0x8336C833}, - {0xE7EA, 0x8336C834}, - {0xE7EB, 0x8336C835}, - {0xE7EC, 0x8336C836}, - {0xE7ED, 0x8336C837}, - {0xE7EE, 0x8336C838}, - {0xE7EF, 0x8336C839}, - {0xE7F0, 0x8336C930}, - {0xE7F1, 0x8336C931}, - {0xE7F2, 0x8336C932}, - {0xE7F3, 0x8336C933}, - {0xE815, 0x8336C934}, - {0xE819, 0x8336C935}, - {0xE81A, 0x8336C936}, - {0xE81B, 0x8336C937}, - {0xE81C, 0x8336C938}, - {0xE81D, 0x8336C939}, - {0xE81F, 0x8336CA30}, - {0xE820, 0x8336CA31}, - {0xE821, 0x8336CA32}, - {0xE822, 0x8336CA33}, - {0xE823, 0x8336CA34}, - {0xE824, 0x8336CA35}, - {0xE825, 0x8336CA36}, - {0xE827, 0x8336CA37}, - {0xE828, 0x8336CA38}, - {0xE829, 0x8336CA39}, - {0xE82A, 0x8336CB30}, - {0xE82D, 0x8336CB31}, - {0xE82E, 0x8336CB32}, - {0xE82F, 0x8336CB33}, - {0xE830, 0x8336CB34}, - {0xE833, 0x8336CB35}, - {0xE834, 0x8336CB36}, - {0xE835, 0x8336CB37}, - {0xE836, 0x8336CB38}, - {0xE837, 0x8336CB39}, - {0xE838, 0x8336CC30}, - {0xE839, 0x8336CC31}, - {0xE83A, 0x8336CC32}, - {0xE83C, 0x8336CC33}, - {0xE83D, 0x8336CC34}, - {0xE83E, 0x8336CC35}, - {0xE83F, 0x8336CC36}, - {0xE840, 0x8336CC37}, - {0xE841, 0x8336CC38}, - {0xE842, 0x8336CC39}, - {0xE844, 0x8336CD30}, - {0xE845, 0x8336CD31}, - {0xE846, 0x8336CD32}, - {0xE847, 0x8336CD33}, - {0xE848, 0x8336CD34}, - {0xE849, 0x8336CD35}, - {0xE84A, 0x8336CD36}, - {0xE84B, 0x8336CD37}, - {0xE84C, 0x8336CD38}, - {0xE84D, 0x8336CD39}, - {0xE84E, 0x8336CE30}, - {0xE84F, 0x8336CE31}, - {0xE850, 0x8336CE32}, - {0xE851, 0x8336CE33}, - {0xE852, 0x8336CE34}, - {0xE853, 0x8336CE35}, - {0xE856, 0x8336CE36}, - {0xE857, 0x8336CE37}, - {0xE858, 0x8336CE38}, - {0xE859, 0x8336CE39}, - {0xE85A, 0x8336CF30}, - {0xE85B, 0x8336CF31}, - {0xE85C, 0x8336CF32}, - {0xE85D, 0x8336CF33}, - {0xE85E, 0x8336CF34}, - {0xE85F, 0x8336CF35}, - {0xE860, 0x8336CF36}, - {0xE861, 0x8336CF37}, - {0xE862, 0x8336CF38}, - {0xE863, 0x8336CF39}, - {0xF92D, 0x84308535}, - {0xF92E, 0x84308536}, - {0xF92F, 0x84308537}, - {0xF930, 0x84308538}, - {0xF931, 0x84308539}, - {0xF932, 0x84308630}, - {0xF933, 0x84308631}, - {0xF934, 0x84308632}, - {0xF935, 0x84308633}, - {0xF936, 0x84308634}, - {0xF937, 0x84308635}, - {0xF938, 0x84308636}, - {0xF939, 0x84308637}, - {0xF93A, 0x84308638}, - {0xF93B, 0x84308639}, - {0xF93C, 0x84308730}, - {0xF93D, 0x84308731}, - {0xF93E, 0x84308732}, - {0xF93F, 0x84308733}, - {0xF940, 0x84308734}, - {0xF941, 0x84308735}, - {0xF942, 0x84308736}, - {0xF943, 0x84308737}, - {0xF944, 0x84308738}, - {0xF945, 0x84308739}, - {0xF946, 0x84308830}, - {0xF947, 0x84308831}, - {0xF948, 0x84308832}, - {0xF949, 0x84308833}, - {0xF94A, 0x84308834}, - {0xF94B, 0x84308835}, - {0xF94C, 0x84308836}, - {0xF94D, 0x84308837}, - {0xF94E, 0x84308838}, - {0xF94F, 0x84308839}, - {0xF950, 0x84308930}, - {0xF951, 0x84308931}, - {0xF952, 0x84308932}, - {0xF953, 0x84308933}, - {0xF954, 0x84308934}, - {0xF955, 0x84308935}, - {0xF956, 0x84308936}, - {0xF957, 0x84308937}, - {0xF958, 0x84308938}, - {0xF959, 0x84308939}, - {0xF95A, 0x84308A30}, - {0xF95B, 0x84308A31}, - {0xF95C, 0x84308A32}, - {0xF95D, 0x84308A33}, - {0xF95E, 0x84308A34}, - {0xF95F, 0x84308A35}, - {0xF960, 0x84308A36}, - {0xF961, 0x84308A37}, - {0xF962, 0x84308A38}, - {0xF963, 0x84308A39}, - {0xF964, 0x84308B30}, - {0xF965, 0x84308B31}, - {0xF966, 0x84308B32}, - {0xF967, 0x84308B33}, - {0xF968, 0x84308B34}, - {0xF969, 0x84308B35}, - {0xF96A, 0x84308B36}, - {0xF96B, 0x84308B37}, - {0xF96C, 0x84308B38}, - {0xF96D, 0x84308B39}, - {0xF96E, 0x84308C30}, - {0xF96F, 0x84308C31}, - {0xF970, 0x84308C32}, - {0xF971, 0x84308C33}, - {0xF972, 0x84308C34}, - {0xF973, 0x84308C35}, - {0xF974, 0x84308C36}, - {0xF975, 0x84308C37}, - {0xF976, 0x84308C38}, - {0xF977, 0x84308C39}, - {0xF978, 0x84308D30}, - {0xF97A, 0x84308D31}, - {0xF97B, 0x84308D32}, - {0xF97C, 0x84308D33}, - {0xF97D, 0x84308D34}, - {0xF97E, 0x84308D35}, - {0xF97F, 0x84308D36}, - {0xF980, 0x84308D37}, - {0xF981, 0x84308D38}, - {0xF982, 0x84308D39}, - {0xF983, 0x84308E30}, - {0xF984, 0x84308E31}, - {0xF985, 0x84308E32}, - {0xF986, 0x84308E33}, - {0xF987, 0x84308E34}, - {0xF988, 0x84308E35}, - {0xF989, 0x84308E36}, - {0xF98A, 0x84308E37}, - {0xF98B, 0x84308E38}, - {0xF98C, 0x84308E39}, - {0xF98D, 0x84308F30}, - {0xF98E, 0x84308F31}, - {0xF98F, 0x84308F32}, - {0xF990, 0x84308F33}, - {0xF991, 0x84308F34}, - {0xF992, 0x84308F35}, - {0xF993, 0x84308F36}, - {0xF994, 0x84308F37}, - {0xF996, 0x84308F38}, - {0xF997, 0x84308F39}, - {0xF998, 0x84309030}, - {0xF999, 0x84309031}, - {0xF99A, 0x84309032}, - {0xF99B, 0x84309033}, - {0xF99C, 0x84309034}, - {0xF99D, 0x84309035}, - {0xF99E, 0x84309036}, - {0xF99F, 0x84309037}, - {0xF9A0, 0x84309038}, - {0xF9A1, 0x84309039}, - {0xF9A2, 0x84309130}, - {0xF9A3, 0x84309131}, - {0xF9A4, 0x84309132}, - {0xF9A5, 0x84309133}, - {0xF9A6, 0x84309134}, - {0xF9A7, 0x84309135}, - {0xF9A8, 0x84309136}, - {0xF9A9, 0x84309137}, - {0xF9AA, 0x84309138}, - {0xF9AB, 0x84309139}, - {0xF9AC, 0x84309230}, - {0xF9AD, 0x84309231}, - {0xF9AE, 0x84309232}, - {0xF9AF, 0x84309233}, - {0xF9B0, 0x84309234}, - {0xF9B1, 0x84309235}, - {0xF9B2, 0x84309236}, - {0xF9B3, 0x84309237}, - {0xF9B4, 0x84309238}, - {0xF9B5, 0x84309239}, - {0xF9B6, 0x84309330}, - {0xF9B7, 0x84309331}, - {0xF9B8, 0x84309332}, - {0xF9B9, 0x84309333}, - {0xF9BA, 0x84309334}, - {0xF9BB, 0x84309335}, - {0xF9BC, 0x84309336}, - {0xF9BD, 0x84309337}, - {0xF9BE, 0x84309338}, - {0xF9BF, 0x84309339}, - {0xF9C0, 0x84309430}, - {0xF9C1, 0x84309431}, - {0xF9C2, 0x84309432}, - {0xF9C3, 0x84309433}, - {0xF9C4, 0x84309434}, - {0xF9C5, 0x84309435}, - {0xF9C6, 0x84309436}, - {0xF9C7, 0x84309437}, - {0xF9C8, 0x84309438}, - {0xF9C9, 0x84309439}, - {0xF9CA, 0x84309530}, - {0xF9CB, 0x84309531}, - {0xF9CC, 0x84309532}, - {0xF9CD, 0x84309533}, - {0xF9CE, 0x84309534}, - {0xF9CF, 0x84309535}, - {0xF9D0, 0x84309536}, - {0xF9D1, 0x84309537}, - {0xF9D2, 0x84309538}, - {0xF9D3, 0x84309539}, - {0xF9D4, 0x84309630}, - {0xF9D5, 0x84309631}, - {0xF9D6, 0x84309632}, - {0xF9D7, 0x84309633}, - {0xF9D8, 0x84309634}, - {0xF9D9, 0x84309635}, - {0xF9DA, 0x84309636}, - {0xF9DB, 0x84309637}, - {0xF9DC, 0x84309638}, - {0xF9DD, 0x84309639}, - {0xF9DE, 0x84309730}, - {0xF9DF, 0x84309731}, - {0xF9E0, 0x84309732}, - {0xF9E1, 0x84309733}, - {0xF9E2, 0x84309734}, - {0xF9E3, 0x84309735}, - {0xF9E4, 0x84309736}, - {0xF9E5, 0x84309737}, - {0xF9E6, 0x84309738}, - {0xF9E8, 0x84309739}, - {0xF9E9, 0x84309830}, - {0xF9EA, 0x84309831}, - {0xF9EB, 0x84309832}, - {0xF9EC, 0x84309833}, - {0xF9ED, 0x84309834}, - {0xF9EE, 0x84309835}, - {0xF9EF, 0x84309836}, - {0xF9F0, 0x84309837}, - {0xF9F2, 0x84309838}, - {0xF9F3, 0x84309839}, - {0xF9F4, 0x84309930}, - {0xF9F5, 0x84309931}, - {0xF9F6, 0x84309932}, - {0xF9F7, 0x84309933}, - {0xF9F8, 0x84309934}, - {0xF9F9, 0x84309935}, - {0xF9FA, 0x84309936}, - {0xF9FB, 0x84309937}, - {0xF9FC, 0x84309938}, - {0xF9FD, 0x84309939}, - {0xF9FE, 0x84309A30}, - {0xF9FF, 0x84309A31}, - {0xFA00, 0x84309A32}, - {0xFA01, 0x84309A33}, - {0xFA02, 0x84309A34}, - {0xFA03, 0x84309A35}, - {0xFA04, 0x84309A36}, - {0xFA05, 0x84309A37}, - {0xFA06, 0x84309A38}, - {0xFA07, 0x84309A39}, - {0xFA08, 0x84309B30}, - {0xFA09, 0x84309B31}, - {0xFA0A, 0x84309B32}, - {0xFA0B, 0x84309B33}, - {0xFA10, 0x84309B34}, - {0xFA12, 0x84309B35}, - {0xFA15, 0x84309B36}, - {0xFA16, 0x84309B37}, - {0xFA17, 0x84309B38}, - {0xFA19, 0x84309B39}, - {0xFA1A, 0x84309C30}, - {0xFA1B, 0x84309C31}, - {0xFA1C, 0x84309C32}, - {0xFA1D, 0x84309C33}, - {0xFA1E, 0x84309C34}, - {0xFA22, 0x84309C35}, - {0xFA25, 0x84309C36}, - {0xFA26, 0x84309C37}, - {0xFE32, 0x84318538}, - {0xFE45, 0x84318539}, - {0xFE46, 0x84318630}, - {0xFE47, 0x84318631}, - {0xFE48, 0x84318632}, - {0xFE53, 0x84318633}, - {0xFE58, 0x84318634}, - {0xFE67, 0x84318635}, - {0xFE6C, 0x84318636}, - {0xFE6D, 0x84318637}, - {0xFE6E, 0x84318638}, - {0xFE6F, 0x84318639}, - {0xFE70, 0x84318730}, - {0xFE71, 0x84318731}, - {0xFE72, 0x84318732}, - {0xFE73, 0x84318733}, - {0xFE74, 0x84318734}, - {0xFE75, 0x84318735}, - {0xFE76, 0x84318736}, - {0xFE77, 0x84318737}, - {0xFE78, 0x84318738}, - {0xFE79, 0x84318739}, - {0xFE7A, 0x84318830}, - {0xFE7B, 0x84318831}, - {0xFE7C, 0x84318832}, - {0xFE7D, 0x84318833}, - {0xFE7E, 0x84318834}, - {0xFE7F, 0x84318835}, - {0xFE80, 0x84318836}, - {0xFE81, 0x84318837}, - {0xFE82, 0x84318838}, - {0xFE83, 0x84318839}, - {0xFE84, 0x84318930}, - {0xFE85, 0x84318931}, - {0xFE86, 0x84318932}, - {0xFE87, 0x84318933}, - {0xFE88, 0x84318934}, - {0xFE89, 0x84318935}, - {0xFE8A, 0x84318936}, - {0xFE8B, 0x84318937}, - {0xFE8C, 0x84318938}, - {0xFE8D, 0x84318939}, - {0xFE8E, 0x84318A30}, - {0xFE8F, 0x84318A31}, - {0xFE90, 0x84318A32}, - {0xFE91, 0x84318A33}, - {0xFE92, 0x84318A34}, - {0xFE93, 0x84318A35}, - {0xFE94, 0x84318A36}, - {0xFE95, 0x84318A37}, - {0xFE96, 0x84318A38}, - {0xFE97, 0x84318A39}, - {0xFE98, 0x84318B30}, - {0xFE99, 0x84318B31}, - {0xFE9A, 0x84318B32}, - {0xFE9B, 0x84318B33}, - {0xFE9C, 0x84318B34}, - {0xFE9D, 0x84318B35}, - {0xFE9E, 0x84318B36}, - {0xFE9F, 0x84318B37}, - {0xFEA0, 0x84318B38}, - {0xFEA1, 0x84318B39}, - {0xFEA2, 0x84318C30}, - {0xFEA3, 0x84318C31}, - {0xFEA4, 0x84318C32}, - {0xFEA5, 0x84318C33}, - {0xFEA6, 0x84318C34}, - {0xFEA7, 0x84318C35}, - {0xFEA8, 0x84318C36}, - {0xFEA9, 0x84318C37}, - {0xFEAA, 0x84318C38}, - {0xFEAB, 0x84318C39}, - {0xFEAC, 0x84318D30}, - {0xFEAD, 0x84318D31}, - {0xFEAE, 0x84318D32}, - {0xFEAF, 0x84318D33}, - {0xFEB0, 0x84318D34}, - {0xFEB1, 0x84318D35}, - {0xFEB2, 0x84318D36}, - {0xFEB3, 0x84318D37}, - {0xFEB4, 0x84318D38}, - {0xFEB5, 0x84318D39}, - {0xFEB6, 0x84318E30}, - {0xFEB7, 0x84318E31}, - {0xFEB8, 0x84318E32}, - {0xFEB9, 0x84318E33}, - {0xFEBA, 0x84318E34}, - {0xFEBB, 0x84318E35}, - {0xFEBC, 0x84318E36}, - {0xFEBD, 0x84318E37}, - {0xFEBE, 0x84318E38}, - {0xFEBF, 0x84318E39}, - {0xFEC0, 0x84318F30}, - {0xFEC1, 0x84318F31}, - {0xFEC2, 0x84318F32}, - {0xFEC3, 0x84318F33}, - {0xFEC4, 0x84318F34}, - {0xFEC5, 0x84318F35}, - {0xFEC6, 0x84318F36}, - {0xFEC7, 0x84318F37}, - {0xFEC8, 0x84318F38}, - {0xFEC9, 0x84318F39}, - {0xFECA, 0x84319030}, - {0xFECB, 0x84319031}, - {0xFECC, 0x84319032}, - {0xFECD, 0x84319033}, - {0xFECE, 0x84319034}, - {0xFECF, 0x84319035}, - {0xFED0, 0x84319036}, - {0xFED1, 0x84319037}, - {0xFED2, 0x84319038}, - {0xFED3, 0x84319039}, - {0xFED4, 0x84319130}, - {0xFED5, 0x84319131}, - {0xFED6, 0x84319132}, - {0xFED7, 0x84319133}, - {0xFED8, 0x84319134}, - {0xFED9, 0x84319135}, - {0xFEDA, 0x84319136}, - {0xFEDB, 0x84319137}, - {0xFEDC, 0x84319138}, - {0xFEDD, 0x84319139}, - {0xFEDE, 0x84319230}, - {0xFEDF, 0x84319231}, - {0xFEE0, 0x84319232}, - {0xFEE1, 0x84319233}, - {0xFEE2, 0x84319234}, - {0xFEE3, 0x84319235}, - {0xFEE4, 0x84319236}, - {0xFEE5, 0x84319237}, - {0xFEE6, 0x84319238}, - {0xFEE7, 0x84319239}, - {0xFEE8, 0x84319330}, - {0xFEE9, 0x84319331}, - {0xFEEA, 0x84319332}, - {0xFEEB, 0x84319333}, - {0xFEEC, 0x84319334}, - {0xFEED, 0x84319335}, - {0xFEEE, 0x84319336}, - {0xFEEF, 0x84319337}, - {0xFEF0, 0x84319338}, - {0xFEF1, 0x84319339}, - {0xFEF2, 0x84319430}, - {0xFEF3, 0x84319431}, - {0xFEF4, 0x84319432}, - {0xFEF5, 0x84319433}, - {0xFEF6, 0x84319434}, - {0xFEF7, 0x84319435}, - {0xFEF8, 0x84319436}, - {0xFEF9, 0x84319437}, - {0xFEFA, 0x84319438}, - {0xFEFB, 0x84319439}, - {0xFEFC, 0x84319530}, - {0xFEFD, 0x84319531}, - {0xFEFE, 0x84319532}, - {0xFEFF, 0x84319533}, - {0xFF00, 0x84319534}, - {0xFF5F, 0x84319535}, - {0xFF60, 0x84319536}, - {0xFF61, 0x84319537}, - {0xFF62, 0x84319538}, - {0xFF63, 0x84319539}, - {0xFF64, 0x84319630}, - {0xFF65, 0x84319631}, - {0xFF66, 0x84319632}, - {0xFF67, 0x84319633}, - {0xFF68, 0x84319634}, - {0xFF69, 0x84319635}, - {0xFF6A, 0x84319636}, - {0xFF6B, 0x84319637}, - {0xFF6C, 0x84319638}, - {0xFF6D, 0x84319639}, - {0xFF6E, 0x84319730}, - {0xFF6F, 0x84319731}, - {0xFF70, 0x84319732}, - {0xFF71, 0x84319733}, - {0xFF72, 0x84319734}, - {0xFF73, 0x84319735}, - {0xFF74, 0x84319736}, - {0xFF75, 0x84319737}, - {0xFF76, 0x84319738}, - {0xFF77, 0x84319739}, - {0xFF78, 0x84319830}, - {0xFF79, 0x84319831}, - {0xFF7A, 0x84319832}, - {0xFF7B, 0x84319833}, - {0xFF7C, 0x84319834}, - {0xFF7D, 0x84319835}, - {0xFF7E, 0x84319836}, - {0xFF7F, 0x84319837}, - {0xFF80, 0x84319838}, - {0xFF81, 0x84319839}, - {0xFF82, 0x84319930}, - {0xFF83, 0x84319931}, - {0xFF84, 0x84319932}, - {0xFF85, 0x84319933}, - {0xFF86, 0x84319934}, - {0xFF87, 0x84319935}, - {0xFF88, 0x84319936}, - {0xFF89, 0x84319937}, - {0xFF8A, 0x84319938}, - {0xFF8B, 0x84319939}, - {0xFF8C, 0x84319A30}, - {0xFF8D, 0x84319A31}, - {0xFF8E, 0x84319A32}, - {0xFF8F, 0x84319A33}, - {0xFF90, 0x84319A34}, - {0xFF91, 0x84319A35}, - {0xFF92, 0x84319A36}, - {0xFF93, 0x84319A37}, - {0xFF94, 0x84319A38}, - {0xFF95, 0x84319A39}, - {0xFF96, 0x84319B30}, - {0xFF97, 0x84319B31}, - {0xFF98, 0x84319B32}, - {0xFF99, 0x84319B33}, - {0xFF9A, 0x84319B34}, - {0xFF9B, 0x84319B35}, - {0xFF9C, 0x84319B36}, - {0xFF9D, 0x84319B37}, - {0xFF9E, 0x84319B38}, - {0xFF9F, 0x84319B39}, - {0xFFA0, 0x84319C30}, - {0xFFA1, 0x84319C31}, - {0xFFA2, 0x84319C32}, - {0xFFA3, 0x84319C33}, - {0xFFA4, 0x84319C34}, - {0xFFA5, 0x84319C35}, - {0xFFA6, 0x84319C36}, - {0xFFA7, 0x84319C37}, - {0xFFA8, 0x84319C38}, - {0xFFA9, 0x84319C39}, - {0xFFAA, 0x84319D30}, - {0xFFAB, 0x84319D31}, - {0xFFAC, 0x84319D32}, - {0xFFAD, 0x84319D33}, - {0xFFAE, 0x84319D34}, - {0xFFAF, 0x84319D35}, - {0xFFB0, 0x84319D36}, - {0xFFB1, 0x84319D37}, - {0xFFB2, 0x84319D38}, - {0xFFB3, 0x84319D39}, - {0xFFB4, 0x84319E30}, - {0xFFB5, 0x84319E31}, - {0xFFB6, 0x84319E32}, - {0xFFB7, 0x84319E33}, - {0xFFB8, 0x84319E34}, - {0xFFB9, 0x84319E35}, - {0xFFBA, 0x84319E36}, - {0xFFBB, 0x84319E37}, - {0xFFBC, 0x84319E38}, - {0xFFBD, 0x84319E39}, - {0xFFBE, 0x84319F30}, - {0xFFBF, 0x84319F31}, - {0xFFC0, 0x84319F32}, - {0xFFC1, 0x84319F33}, - {0xFFC2, 0x84319F34}, - {0xFFC3, 0x84319F35}, - {0xFFC4, 0x84319F36}, - {0xFFC5, 0x84319F37}, - {0xFFC6, 0x84319F38}, - {0xFFC7, 0x84319F39}, - {0xFFC8, 0x8431A030}, - {0xFFC9, 0x8431A031}, - {0xFFCA, 0x8431A032}, - {0xFFCB, 0x8431A033}, - {0xFFCC, 0x8431A034}, - {0xFFCD, 0x8431A035}, - {0xFFCE, 0x8431A036}, - {0xFFCF, 0x8431A037}, - {0xFFD0, 0x8431A038}, - {0xFFD1, 0x8431A039}, - {0xFFD2, 0x8431A130}, - {0xFFD3, 0x8431A131}, - {0xFFD4, 0x8431A132}, - {0xFFD5, 0x8431A133}, - {0xFFD6, 0x8431A134}, - {0xFFD7, 0x8431A135}, - {0xFFD8, 0x8431A136}, - {0xFFD9, 0x8431A137}, - {0xFFDA, 0x8431A138}, - {0xFFDB, 0x8431A139}, - {0xFFDC, 0x8431A230}, - {0xFFDD, 0x8431A231}, - {0xFFDE, 0x8431A232}, - {0xFFDF, 0x8431A233}, -} diff --git a/vendor/github.com/axgle/mahonia/gb18030.go b/vendor/github.com/axgle/mahonia/gb18030.go deleted file mode 100644 index d275925..0000000 --- a/vendor/github.com/axgle/mahonia/gb18030.go +++ /dev/null @@ -1,156 +0,0 @@ -package mahonia - -import ( - "sync" -) - -// Converters for GB18030 encoding. - -func init() { - RegisterCharset(&Charset{ - Name: "GB18030", - NewDecoder: func() Decoder { - gb18030Once.Do(buildGB18030Tables) - return decodeGB18030Rune - }, - NewEncoder: func() Encoder { - gb18030Once.Do(buildGB18030Tables) - return encodeGB18030Rune - }, - }) -} - -func decodeGB18030Rune(p []byte) (r rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b < 128 { - return rune(b), 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - if p[0] < 0x81 || p[0] > 0xfe { - return 0xfffd, 1, INVALID_CHAR - } - - if p[1] >= 0x40 { - // 2-byte character - c := uint16(p[0])<<8 + uint16(p[1]) - r = rune(gbkToUnicode[c]) - if r == 0 { - r = gbkToUnicodeExtra[c] - } - - if r != 0 { - return r, 2, SUCCESS - } - } else if p[1] >= 0x30 { - // 4-byte character - if len(p) < 4 { - return 0, 0, NO_ROOM - } - if p[2] < 0x81 || p[2] > 0xfe || p[3] < 0x30 || p[3] > 0x39 { - return 0xfffd, 1, INVALID_CHAR - } - - code := uint32(p[0])<<24 + uint32(p[1])<<16 + uint32(p[2])<<8 + uint32(p[3]) - lin := gb18030Linear(code) - - if lin <= maxGB18030Linear { - r = rune(gb18030LinearToUnicode[lin]) - if r != 0 { - return r, 4, SUCCESS - } - } - - for _, rng := range gb18030Ranges { - if lin >= rng.firstGB && lin <= rng.lastGB { - return rng.firstRune + rune(lin) - rune(rng.firstGB), 4, SUCCESS - } - } - } - - return 0xfffd, 1, INVALID_CHAR -} - -func encodeGB18030Rune(p []byte, r rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if r < 128 { - p[0] = byte(r) - return 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - var c uint16 - if r < 0x10000 { - c = unicodeToGBK[r] - } else { - c = unicodeToGBKExtra[r] - } - - if c != 0 { - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - - if len(p) < 4 { - return 0, NO_ROOM - } - - if r < 0x10000 { - f := unicodeToGB18030[r] - if f != 0 { - p[0] = byte(f >> 24) - p[1] = byte(f >> 16) - p[2] = byte(f >> 8) - p[3] = byte(f) - return 4, SUCCESS - } - } - - for _, rng := range gb18030Ranges { - if r >= rng.firstRune && r <= rng.lastRune { - lin := rng.firstGB + uint32(r) - uint32(rng.firstRune) - p[0] = byte(lin/(10*126*10)) + 0x81 - p[1] = byte(lin/(126*10)%10) + 0x30 - p[2] = byte(lin/10%126) + 0x81 - p[3] = byte(lin%10) + 0x30 - return 4, SUCCESS - } - } - - p[0] = 0x1a - return 1, INVALID_CHAR -} - -var gb18030Once sync.Once - -// Mapping from gb18039Linear values to Unicode. -var gb18030LinearToUnicode []uint16 - -var unicodeToGB18030 []uint32 - -func buildGB18030Tables() { - gb18030LinearToUnicode = make([]uint16, maxGB18030Linear+1) - unicodeToGB18030 = make([]uint32, 65536) - for _, data := range gb18030Data { - gb18030LinearToUnicode[gb18030Linear(data.gb18030)] = data.unicode - unicodeToGB18030[data.unicode] = data.gb18030 - } -} diff --git a/vendor/github.com/axgle/mahonia/gbk-data.go b/vendor/github.com/axgle/mahonia/gbk-data.go deleted file mode 100644 index e93023c..0000000 --- a/vendor/github.com/axgle/mahonia/gbk-data.go +++ /dev/null @@ -1,47922 +0,0 @@ -package mahonia - -// Data for GBK 2-byte codes. -// GBK codes are represented in big-endian order. -// Based on the 2-byte subset of http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/gb-18030-2005.ucm - -// Codes that aren't on the BMP. -var unicodeToGBKExtra = map[rune]uint16{ - 0x20087: 0xfe51, - 0x20089: 0xfe52, - 0x200cc: 0xfe53, - 0x215d7: 0xfe6c, - 0x2298f: 0xfe76, - 0x241fe: 0xfe91, -} - -var gbkToUnicodeExtra = map[uint16]rune{ - 0xfe51: 0x20087, - 0xfe52: 0x20089, - 0xfe53: 0x200cc, - 0xfe6c: 0x215d7, - 0xfe76: 0x2298f, - 0xfe91: 0x241fe, -} - -var unicodeToGBK = [65536]uint16{ - 0x00A4: 0xA1E8, - 0x00A7: 0xA1EC, - 0x00A8: 0xA1A7, - 0x00B0: 0xA1E3, - 0x00B1: 0xA1C0, - 0x00B7: 0xA1A4, - 0x00D7: 0xA1C1, - 0x00E0: 0xA8A4, - 0x00E1: 0xA8A2, - 0x00E8: 0xA8A8, - 0x00E9: 0xA8A6, - 0x00EA: 0xA8BA, - 0x00EC: 0xA8AC, - 0x00ED: 0xA8AA, - 0x00F2: 0xA8B0, - 0x00F3: 0xA8AE, - 0x00F7: 0xA1C2, - 0x00F9: 0xA8B4, - 0x00FA: 0xA8B2, - 0x00FC: 0xA8B9, - 0x0101: 0xA8A1, - 0x0113: 0xA8A5, - 0x011B: 0xA8A7, - 0x012B: 0xA8A9, - 0x0144: 0xA8BD, - 0x0148: 0xA8BE, - 0x014D: 0xA8AD, - 0x016B: 0xA8B1, - 0x01CE: 0xA8A3, - 0x01D0: 0xA8AB, - 0x01D2: 0xA8AF, - 0x01D4: 0xA8B3, - 0x01D6: 0xA8B5, - 0x01D8: 0xA8B6, - 0x01DA: 0xA8B7, - 0x01DC: 0xA8B8, - 0x01F9: 0xA8BF, - 0x0251: 0xA8BB, - 0x0261: 0xA8C0, - 0x02C7: 0xA1A6, - 0x02C9: 0xA1A5, - 0x02CA: 0xA840, - 0x02CB: 0xA841, - 0x02D9: 0xA842, - 0x0391: 0xA6A1, - 0x0392: 0xA6A2, - 0x0393: 0xA6A3, - 0x0394: 0xA6A4, - 0x0395: 0xA6A5, - 0x0396: 0xA6A6, - 0x0397: 0xA6A7, - 0x0398: 0xA6A8, - 0x0399: 0xA6A9, - 0x039A: 0xA6AA, - 0x039B: 0xA6AB, - 0x039C: 0xA6AC, - 0x039D: 0xA6AD, - 0x039E: 0xA6AE, - 0x039F: 0xA6AF, - 0x03A0: 0xA6B0, - 0x03A1: 0xA6B1, - 0x03A3: 0xA6B2, - 0x03A4: 0xA6B3, - 0x03A5: 0xA6B4, - 0x03A6: 0xA6B5, - 0x03A7: 0xA6B6, - 0x03A8: 0xA6B7, - 0x03A9: 0xA6B8, - 0x03B1: 0xA6C1, - 0x03B2: 0xA6C2, - 0x03B3: 0xA6C3, - 0x03B4: 0xA6C4, - 0x03B5: 0xA6C5, - 0x03B6: 0xA6C6, - 0x03B7: 0xA6C7, - 0x03B8: 0xA6C8, - 0x03B9: 0xA6C9, - 0x03BA: 0xA6CA, - 0x03BB: 0xA6CB, - 0x03BC: 0xA6CC, - 0x03BD: 0xA6CD, - 0x03BE: 0xA6CE, - 0x03BF: 0xA6CF, - 0x03C0: 0xA6D0, - 0x03C1: 0xA6D1, - 0x03C3: 0xA6D2, - 0x03C4: 0xA6D3, - 0x03C5: 0xA6D4, - 0x03C6: 0xA6D5, - 0x03C7: 0xA6D6, - 0x03C8: 0xA6D7, - 0x03C9: 0xA6D8, - 0x0401: 0xA7A7, - 0x0410: 0xA7A1, - 0x0411: 0xA7A2, - 0x0412: 0xA7A3, - 0x0413: 0xA7A4, - 0x0414: 0xA7A5, - 0x0415: 0xA7A6, - 0x0416: 0xA7A8, - 0x0417: 0xA7A9, - 0x0418: 0xA7AA, - 0x0419: 0xA7AB, - 0x041A: 0xA7AC, - 0x041B: 0xA7AD, - 0x041C: 0xA7AE, - 0x041D: 0xA7AF, - 0x041E: 0xA7B0, - 0x041F: 0xA7B1, - 0x0420: 0xA7B2, - 0x0421: 0xA7B3, - 0x0422: 0xA7B4, - 0x0423: 0xA7B5, - 0x0424: 0xA7B6, - 0x0425: 0xA7B7, - 0x0426: 0xA7B8, - 0x0427: 0xA7B9, - 0x0428: 0xA7BA, - 0x0429: 0xA7BB, - 0x042A: 0xA7BC, - 0x042B: 0xA7BD, - 0x042C: 0xA7BE, - 0x042D: 0xA7BF, - 0x042E: 0xA7C0, - 0x042F: 0xA7C1, - 0x0430: 0xA7D1, - 0x0431: 0xA7D2, - 0x0432: 0xA7D3, - 0x0433: 0xA7D4, - 0x0434: 0xA7D5, - 0x0435: 0xA7D6, - 0x0436: 0xA7D8, - 0x0437: 0xA7D9, - 0x0438: 0xA7DA, - 0x0439: 0xA7DB, - 0x043A: 0xA7DC, - 0x043B: 0xA7DD, - 0x043C: 0xA7DE, - 0x043D: 0xA7DF, - 0x043E: 0xA7E0, - 0x043F: 0xA7E1, - 0x0440: 0xA7E2, - 0x0441: 0xA7E3, - 0x0442: 0xA7E4, - 0x0443: 0xA7E5, - 0x0444: 0xA7E6, - 0x0445: 0xA7E7, - 0x0446: 0xA7E8, - 0x0447: 0xA7E9, - 0x0448: 0xA7EA, - 0x0449: 0xA7EB, - 0x044A: 0xA7EC, - 0x044B: 0xA7ED, - 0x044C: 0xA7EE, - 0x044D: 0xA7EF, - 0x044E: 0xA7F0, - 0x044F: 0xA7F1, - 0x0451: 0xA7D7, - 0x1E3F: 0xA8BC, - 0x2010: 0xA95C, - 0x2013: 0xA843, - 0x2014: 0xA1AA, - 0x2015: 0xA844, - 0x2016: 0xA1AC, - 0x2018: 0xA1AE, - 0x2019: 0xA1AF, - 0x201C: 0xA1B0, - 0x201D: 0xA1B1, - 0x2025: 0xA845, - 0x2026: 0xA1AD, - 0x2030: 0xA1EB, - 0x2032: 0xA1E4, - 0x2033: 0xA1E5, - 0x2035: 0xA846, - 0x203B: 0xA1F9, - 0x20AC: 0xA2E3, - 0x2103: 0xA1E6, - 0x2105: 0xA847, - 0x2109: 0xA848, - 0x2116: 0xA1ED, - 0x2121: 0xA959, - 0x2160: 0xA2F1, - 0x2161: 0xA2F2, - 0x2162: 0xA2F3, - 0x2163: 0xA2F4, - 0x2164: 0xA2F5, - 0x2165: 0xA2F6, - 0x2166: 0xA2F7, - 0x2167: 0xA2F8, - 0x2168: 0xA2F9, - 0x2169: 0xA2FA, - 0x216A: 0xA2FB, - 0x216B: 0xA2FC, - 0x2170: 0xA2A1, - 0x2171: 0xA2A2, - 0x2172: 0xA2A3, - 0x2173: 0xA2A4, - 0x2174: 0xA2A5, - 0x2175: 0xA2A6, - 0x2176: 0xA2A7, - 0x2177: 0xA2A8, - 0x2178: 0xA2A9, - 0x2179: 0xA2AA, - 0x2190: 0xA1FB, - 0x2191: 0xA1FC, - 0x2192: 0xA1FA, - 0x2193: 0xA1FD, - 0x2196: 0xA849, - 0x2197: 0xA84A, - 0x2198: 0xA84B, - 0x2199: 0xA84C, - 0x2208: 0xA1CA, - 0x220F: 0xA1C7, - 0x2211: 0xA1C6, - 0x2215: 0xA84D, - 0x221A: 0xA1CC, - 0x221D: 0xA1D8, - 0x221E: 0xA1DE, - 0x221F: 0xA84E, - 0x2220: 0xA1CF, - 0x2223: 0xA84F, - 0x2225: 0xA1CE, - 0x2227: 0xA1C4, - 0x2228: 0xA1C5, - 0x2229: 0xA1C9, - 0x222A: 0xA1C8, - 0x222B: 0xA1D2, - 0x222E: 0xA1D3, - 0x2234: 0xA1E0, - 0x2235: 0xA1DF, - 0x2236: 0xA1C3, - 0x2237: 0xA1CB, - 0x223D: 0xA1D7, - 0x2248: 0xA1D6, - 0x224C: 0xA1D5, - 0x2252: 0xA850, - 0x2260: 0xA1D9, - 0x2261: 0xA1D4, - 0x2264: 0xA1DC, - 0x2265: 0xA1DD, - 0x2266: 0xA851, - 0x2267: 0xA852, - 0x226E: 0xA1DA, - 0x226F: 0xA1DB, - 0x2295: 0xA892, - 0x2299: 0xA1D1, - 0x22A5: 0xA1CD, - 0x22BF: 0xA853, - 0x2312: 0xA1D0, - 0x2460: 0xA2D9, - 0x2461: 0xA2DA, - 0x2462: 0xA2DB, - 0x2463: 0xA2DC, - 0x2464: 0xA2DD, - 0x2465: 0xA2DE, - 0x2466: 0xA2DF, - 0x2467: 0xA2E0, - 0x2468: 0xA2E1, - 0x2469: 0xA2E2, - 0x2474: 0xA2C5, - 0x2475: 0xA2C6, - 0x2476: 0xA2C7, - 0x2477: 0xA2C8, - 0x2478: 0xA2C9, - 0x2479: 0xA2CA, - 0x247A: 0xA2CB, - 0x247B: 0xA2CC, - 0x247C: 0xA2CD, - 0x247D: 0xA2CE, - 0x247E: 0xA2CF, - 0x247F: 0xA2D0, - 0x2480: 0xA2D1, - 0x2481: 0xA2D2, - 0x2482: 0xA2D3, - 0x2483: 0xA2D4, - 0x2484: 0xA2D5, - 0x2485: 0xA2D6, - 0x2486: 0xA2D7, - 0x2487: 0xA2D8, - 0x2488: 0xA2B1, - 0x2489: 0xA2B2, - 0x248A: 0xA2B3, - 0x248B: 0xA2B4, - 0x248C: 0xA2B5, - 0x248D: 0xA2B6, - 0x248E: 0xA2B7, - 0x248F: 0xA2B8, - 0x2490: 0xA2B9, - 0x2491: 0xA2BA, - 0x2492: 0xA2BB, - 0x2493: 0xA2BC, - 0x2494: 0xA2BD, - 0x2495: 0xA2BE, - 0x2496: 0xA2BF, - 0x2497: 0xA2C0, - 0x2498: 0xA2C1, - 0x2499: 0xA2C2, - 0x249A: 0xA2C3, - 0x249B: 0xA2C4, - 0x2500: 0xA9A4, - 0x2501: 0xA9A5, - 0x2502: 0xA9A6, - 0x2503: 0xA9A7, - 0x2504: 0xA9A8, - 0x2505: 0xA9A9, - 0x2506: 0xA9AA, - 0x2507: 0xA9AB, - 0x2508: 0xA9AC, - 0x2509: 0xA9AD, - 0x250A: 0xA9AE, - 0x250B: 0xA9AF, - 0x250C: 0xA9B0, - 0x250D: 0xA9B1, - 0x250E: 0xA9B2, - 0x250F: 0xA9B3, - 0x2510: 0xA9B4, - 0x2511: 0xA9B5, - 0x2512: 0xA9B6, - 0x2513: 0xA9B7, - 0x2514: 0xA9B8, - 0x2515: 0xA9B9, - 0x2516: 0xA9BA, - 0x2517: 0xA9BB, - 0x2518: 0xA9BC, - 0x2519: 0xA9BD, - 0x251A: 0xA9BE, - 0x251B: 0xA9BF, - 0x251C: 0xA9C0, - 0x251D: 0xA9C1, - 0x251E: 0xA9C2, - 0x251F: 0xA9C3, - 0x2520: 0xA9C4, - 0x2521: 0xA9C5, - 0x2522: 0xA9C6, - 0x2523: 0xA9C7, - 0x2524: 0xA9C8, - 0x2525: 0xA9C9, - 0x2526: 0xA9CA, - 0x2527: 0xA9CB, - 0x2528: 0xA9CC, - 0x2529: 0xA9CD, - 0x252A: 0xA9CE, - 0x252B: 0xA9CF, - 0x252C: 0xA9D0, - 0x252D: 0xA9D1, - 0x252E: 0xA9D2, - 0x252F: 0xA9D3, - 0x2530: 0xA9D4, - 0x2531: 0xA9D5, - 0x2532: 0xA9D6, - 0x2533: 0xA9D7, - 0x2534: 0xA9D8, - 0x2535: 0xA9D9, - 0x2536: 0xA9DA, - 0x2537: 0xA9DB, - 0x2538: 0xA9DC, - 0x2539: 0xA9DD, - 0x253A: 0xA9DE, - 0x253B: 0xA9DF, - 0x253C: 0xA9E0, - 0x253D: 0xA9E1, - 0x253E: 0xA9E2, - 0x253F: 0xA9E3, - 0x2540: 0xA9E4, - 0x2541: 0xA9E5, - 0x2542: 0xA9E6, - 0x2543: 0xA9E7, - 0x2544: 0xA9E8, - 0x2545: 0xA9E9, - 0x2546: 0xA9EA, - 0x2547: 0xA9EB, - 0x2548: 0xA9EC, - 0x2549: 0xA9ED, - 0x254A: 0xA9EE, - 0x254B: 0xA9EF, - 0x2550: 0xA854, - 0x2551: 0xA855, - 0x2552: 0xA856, - 0x2553: 0xA857, - 0x2554: 0xA858, - 0x2555: 0xA859, - 0x2556: 0xA85A, - 0x2557: 0xA85B, - 0x2558: 0xA85C, - 0x2559: 0xA85D, - 0x255A: 0xA85E, - 0x255B: 0xA85F, - 0x255C: 0xA860, - 0x255D: 0xA861, - 0x255E: 0xA862, - 0x255F: 0xA863, - 0x2560: 0xA864, - 0x2561: 0xA865, - 0x2562: 0xA866, - 0x2563: 0xA867, - 0x2564: 0xA868, - 0x2565: 0xA869, - 0x2566: 0xA86A, - 0x2567: 0xA86B, - 0x2568: 0xA86C, - 0x2569: 0xA86D, - 0x256A: 0xA86E, - 0x256B: 0xA86F, - 0x256C: 0xA870, - 0x256D: 0xA871, - 0x256E: 0xA872, - 0x256F: 0xA873, - 0x2570: 0xA874, - 0x2571: 0xA875, - 0x2572: 0xA876, - 0x2573: 0xA877, - 0x2581: 0xA878, - 0x2582: 0xA879, - 0x2583: 0xA87A, - 0x2584: 0xA87B, - 0x2585: 0xA87C, - 0x2586: 0xA87D, - 0x2587: 0xA87E, - 0x2588: 0xA880, - 0x2589: 0xA881, - 0x258A: 0xA882, - 0x258B: 0xA883, - 0x258C: 0xA884, - 0x258D: 0xA885, - 0x258E: 0xA886, - 0x258F: 0xA887, - 0x2593: 0xA888, - 0x2594: 0xA889, - 0x2595: 0xA88A, - 0x25A0: 0xA1F6, - 0x25A1: 0xA1F5, - 0x25B2: 0xA1F8, - 0x25B3: 0xA1F7, - 0x25BC: 0xA88B, - 0x25BD: 0xA88C, - 0x25C6: 0xA1F4, - 0x25C7: 0xA1F3, - 0x25CB: 0xA1F0, - 0x25CE: 0xA1F2, - 0x25CF: 0xA1F1, - 0x25E2: 0xA88D, - 0x25E3: 0xA88E, - 0x25E4: 0xA88F, - 0x25E5: 0xA890, - 0x2605: 0xA1EF, - 0x2606: 0xA1EE, - 0x2609: 0xA891, - 0x2640: 0xA1E2, - 0x2642: 0xA1E1, - 0x2E81: 0xFE50, - 0x2E84: 0xFE54, - 0x2E88: 0xFE57, - 0x2E8B: 0xFE58, - 0x2E8C: 0xFE5D, - 0x2E97: 0xFE5E, - 0x2EA7: 0xFE6B, - 0x2EAA: 0xFE6E, - 0x2EAE: 0xFE71, - 0x2EB3: 0xFE73, - 0x2EB6: 0xFE74, - 0x2EB7: 0xFE75, - 0x2EBB: 0xFE79, - 0x2ECA: 0xFE84, - 0x2FF0: 0xA98A, - 0x2FF1: 0xA98B, - 0x2FF2: 0xA98C, - 0x2FF3: 0xA98D, - 0x2FF4: 0xA98E, - 0x2FF5: 0xA98F, - 0x2FF6: 0xA990, - 0x2FF7: 0xA991, - 0x2FF8: 0xA992, - 0x2FF9: 0xA993, - 0x2FFA: 0xA994, - 0x2FFB: 0xA995, - 0x3000: 0xA1A1, - 0x3001: 0xA1A2, - 0x3002: 0xA1A3, - 0x3003: 0xA1A8, - 0x3005: 0xA1A9, - 0x3006: 0xA965, - 0x3007: 0xA996, - 0x3008: 0xA1B4, - 0x3009: 0xA1B5, - 0x300A: 0xA1B6, - 0x300B: 0xA1B7, - 0x300C: 0xA1B8, - 0x300D: 0xA1B9, - 0x300E: 0xA1BA, - 0x300F: 0xA1BB, - 0x3010: 0xA1BE, - 0x3011: 0xA1BF, - 0x3012: 0xA893, - 0x3013: 0xA1FE, - 0x3014: 0xA1B2, - 0x3015: 0xA1B3, - 0x3016: 0xA1BC, - 0x3017: 0xA1BD, - 0x301D: 0xA894, - 0x301E: 0xA895, - 0x3021: 0xA940, - 0x3022: 0xA941, - 0x3023: 0xA942, - 0x3024: 0xA943, - 0x3025: 0xA944, - 0x3026: 0xA945, - 0x3027: 0xA946, - 0x3028: 0xA947, - 0x3029: 0xA948, - 0x303E: 0xA989, - 0x3041: 0xA4A1, - 0x3042: 0xA4A2, - 0x3043: 0xA4A3, - 0x3044: 0xA4A4, - 0x3045: 0xA4A5, - 0x3046: 0xA4A6, - 0x3047: 0xA4A7, - 0x3048: 0xA4A8, - 0x3049: 0xA4A9, - 0x304A: 0xA4AA, - 0x304B: 0xA4AB, - 0x304C: 0xA4AC, - 0x304D: 0xA4AD, - 0x304E: 0xA4AE, - 0x304F: 0xA4AF, - 0x3050: 0xA4B0, - 0x3051: 0xA4B1, - 0x3052: 0xA4B2, - 0x3053: 0xA4B3, - 0x3054: 0xA4B4, - 0x3055: 0xA4B5, - 0x3056: 0xA4B6, - 0x3057: 0xA4B7, - 0x3058: 0xA4B8, - 0x3059: 0xA4B9, - 0x305A: 0xA4BA, - 0x305B: 0xA4BB, - 0x305C: 0xA4BC, - 0x305D: 0xA4BD, - 0x305E: 0xA4BE, - 0x305F: 0xA4BF, - 0x3060: 0xA4C0, - 0x3061: 0xA4C1, - 0x3062: 0xA4C2, - 0x3063: 0xA4C3, - 0x3064: 0xA4C4, - 0x3065: 0xA4C5, - 0x3066: 0xA4C6, - 0x3067: 0xA4C7, - 0x3068: 0xA4C8, - 0x3069: 0xA4C9, - 0x306A: 0xA4CA, - 0x306B: 0xA4CB, - 0x306C: 0xA4CC, - 0x306D: 0xA4CD, - 0x306E: 0xA4CE, - 0x306F: 0xA4CF, - 0x3070: 0xA4D0, - 0x3071: 0xA4D1, - 0x3072: 0xA4D2, - 0x3073: 0xA4D3, - 0x3074: 0xA4D4, - 0x3075: 0xA4D5, - 0x3076: 0xA4D6, - 0x3077: 0xA4D7, - 0x3078: 0xA4D8, - 0x3079: 0xA4D9, - 0x307A: 0xA4DA, - 0x307B: 0xA4DB, - 0x307C: 0xA4DC, - 0x307D: 0xA4DD, - 0x307E: 0xA4DE, - 0x307F: 0xA4DF, - 0x3080: 0xA4E0, - 0x3081: 0xA4E1, - 0x3082: 0xA4E2, - 0x3083: 0xA4E3, - 0x3084: 0xA4E4, - 0x3085: 0xA4E5, - 0x3086: 0xA4E6, - 0x3087: 0xA4E7, - 0x3088: 0xA4E8, - 0x3089: 0xA4E9, - 0x308A: 0xA4EA, - 0x308B: 0xA4EB, - 0x308C: 0xA4EC, - 0x308D: 0xA4ED, - 0x308E: 0xA4EE, - 0x308F: 0xA4EF, - 0x3090: 0xA4F0, - 0x3091: 0xA4F1, - 0x3092: 0xA4F2, - 0x3093: 0xA4F3, - 0x309B: 0xA961, - 0x309C: 0xA962, - 0x309D: 0xA966, - 0x309E: 0xA967, - 0x30A1: 0xA5A1, - 0x30A2: 0xA5A2, - 0x30A3: 0xA5A3, - 0x30A4: 0xA5A4, - 0x30A5: 0xA5A5, - 0x30A6: 0xA5A6, - 0x30A7: 0xA5A7, - 0x30A8: 0xA5A8, - 0x30A9: 0xA5A9, - 0x30AA: 0xA5AA, - 0x30AB: 0xA5AB, - 0x30AC: 0xA5AC, - 0x30AD: 0xA5AD, - 0x30AE: 0xA5AE, - 0x30AF: 0xA5AF, - 0x30B0: 0xA5B0, - 0x30B1: 0xA5B1, - 0x30B2: 0xA5B2, - 0x30B3: 0xA5B3, - 0x30B4: 0xA5B4, - 0x30B5: 0xA5B5, - 0x30B6: 0xA5B6, - 0x30B7: 0xA5B7, - 0x30B8: 0xA5B8, - 0x30B9: 0xA5B9, - 0x30BA: 0xA5BA, - 0x30BB: 0xA5BB, - 0x30BC: 0xA5BC, - 0x30BD: 0xA5BD, - 0x30BE: 0xA5BE, - 0x30BF: 0xA5BF, - 0x30C0: 0xA5C0, - 0x30C1: 0xA5C1, - 0x30C2: 0xA5C2, - 0x30C3: 0xA5C3, - 0x30C4: 0xA5C4, - 0x30C5: 0xA5C5, - 0x30C6: 0xA5C6, - 0x30C7: 0xA5C7, - 0x30C8: 0xA5C8, - 0x30C9: 0xA5C9, - 0x30CA: 0xA5CA, - 0x30CB: 0xA5CB, - 0x30CC: 0xA5CC, - 0x30CD: 0xA5CD, - 0x30CE: 0xA5CE, - 0x30CF: 0xA5CF, - 0x30D0: 0xA5D0, - 0x30D1: 0xA5D1, - 0x30D2: 0xA5D2, - 0x30D3: 0xA5D3, - 0x30D4: 0xA5D4, - 0x30D5: 0xA5D5, - 0x30D6: 0xA5D6, - 0x30D7: 0xA5D7, - 0x30D8: 0xA5D8, - 0x30D9: 0xA5D9, - 0x30DA: 0xA5DA, - 0x30DB: 0xA5DB, - 0x30DC: 0xA5DC, - 0x30DD: 0xA5DD, - 0x30DE: 0xA5DE, - 0x30DF: 0xA5DF, - 0x30E0: 0xA5E0, - 0x30E1: 0xA5E1, - 0x30E2: 0xA5E2, - 0x30E3: 0xA5E3, - 0x30E4: 0xA5E4, - 0x30E5: 0xA5E5, - 0x30E6: 0xA5E6, - 0x30E7: 0xA5E7, - 0x30E8: 0xA5E8, - 0x30E9: 0xA5E9, - 0x30EA: 0xA5EA, - 0x30EB: 0xA5EB, - 0x30EC: 0xA5EC, - 0x30ED: 0xA5ED, - 0x30EE: 0xA5EE, - 0x30EF: 0xA5EF, - 0x30F0: 0xA5F0, - 0x30F1: 0xA5F1, - 0x30F2: 0xA5F2, - 0x30F3: 0xA5F3, - 0x30F4: 0xA5F4, - 0x30F5: 0xA5F5, - 0x30F6: 0xA5F6, - 0x30FC: 0xA960, - 0x30FD: 0xA963, - 0x30FE: 0xA964, - 0x3105: 0xA8C5, - 0x3106: 0xA8C6, - 0x3107: 0xA8C7, - 0x3108: 0xA8C8, - 0x3109: 0xA8C9, - 0x310A: 0xA8CA, - 0x310B: 0xA8CB, - 0x310C: 0xA8CC, - 0x310D: 0xA8CD, - 0x310E: 0xA8CE, - 0x310F: 0xA8CF, - 0x3110: 0xA8D0, - 0x3111: 0xA8D1, - 0x3112: 0xA8D2, - 0x3113: 0xA8D3, - 0x3114: 0xA8D4, - 0x3115: 0xA8D5, - 0x3116: 0xA8D6, - 0x3117: 0xA8D7, - 0x3118: 0xA8D8, - 0x3119: 0xA8D9, - 0x311A: 0xA8DA, - 0x311B: 0xA8DB, - 0x311C: 0xA8DC, - 0x311D: 0xA8DD, - 0x311E: 0xA8DE, - 0x311F: 0xA8DF, - 0x3120: 0xA8E0, - 0x3121: 0xA8E1, - 0x3122: 0xA8E2, - 0x3123: 0xA8E3, - 0x3124: 0xA8E4, - 0x3125: 0xA8E5, - 0x3126: 0xA8E6, - 0x3127: 0xA8E7, - 0x3128: 0xA8E8, - 0x3129: 0xA8E9, - 0x3220: 0xA2E5, - 0x3221: 0xA2E6, - 0x3222: 0xA2E7, - 0x3223: 0xA2E8, - 0x3224: 0xA2E9, - 0x3225: 0xA2EA, - 0x3226: 0xA2EB, - 0x3227: 0xA2EC, - 0x3228: 0xA2ED, - 0x3229: 0xA2EE, - 0x3231: 0xA95A, - 0x32A3: 0xA949, - 0x338E: 0xA94A, - 0x338F: 0xA94B, - 0x339C: 0xA94C, - 0x339D: 0xA94D, - 0x339E: 0xA94E, - 0x33A1: 0xA94F, - 0x33C4: 0xA950, - 0x33CE: 0xA951, - 0x33D1: 0xA952, - 0x33D2: 0xA953, - 0x33D5: 0xA954, - 0x3447: 0xFE56, - 0x3473: 0xFE55, - 0x359E: 0xFE5A, - 0x360E: 0xFE5C, - 0x361A: 0xFE5B, - 0x3918: 0xFE60, - 0x396E: 0xFE5F, - 0x39CF: 0xFE62, - 0x39D0: 0xFE65, - 0x39DF: 0xFE63, - 0x3A73: 0xFE64, - 0x3B4E: 0xFE68, - 0x3C6E: 0xFE69, - 0x3CE0: 0xFE6A, - 0x4056: 0xFE6F, - 0x415F: 0xFE70, - 0x4337: 0xFE72, - 0x43AC: 0xFE78, - 0x43B1: 0xFE77, - 0x43DD: 0xFE7A, - 0x44D6: 0xFE7B, - 0x464C: 0xFE7D, - 0x4661: 0xFE7C, - 0x4723: 0xFE80, - 0x4729: 0xFE81, - 0x477C: 0xFE82, - 0x478D: 0xFE83, - 0x4947: 0xFE85, - 0x497A: 0xFE86, - 0x497D: 0xFE87, - 0x4982: 0xFE88, - 0x4983: 0xFE89, - 0x4985: 0xFE8A, - 0x4986: 0xFE8B, - 0x499B: 0xFE8D, - 0x499F: 0xFE8C, - 0x49B6: 0xFE8F, - 0x49B7: 0xFE8E, - 0x4C77: 0xFE96, - 0x4C9F: 0xFE93, - 0x4CA0: 0xFE94, - 0x4CA1: 0xFE95, - 0x4CA2: 0xFE97, - 0x4CA3: 0xFE92, - 0x4D13: 0xFE98, - 0x4D14: 0xFE99, - 0x4D15: 0xFE9A, - 0x4D16: 0xFE9B, - 0x4D17: 0xFE9C, - 0x4D18: 0xFE9D, - 0x4D19: 0xFE9E, - 0x4DAE: 0xFE9F, - 0x4E00: 0xD2BB, - 0x4E01: 0xB6A1, - 0x4E02: 0x8140, - 0x4E03: 0xC6DF, - 0x4E04: 0x8141, - 0x4E05: 0x8142, - 0x4E06: 0x8143, - 0x4E07: 0xCDF2, - 0x4E08: 0xD5C9, - 0x4E09: 0xC8FD, - 0x4E0A: 0xC9CF, - 0x4E0B: 0xCFC2, - 0x4E0C: 0xD8A2, - 0x4E0D: 0xB2BB, - 0x4E0E: 0xD3EB, - 0x4E0F: 0x8144, - 0x4E10: 0xD8A4, - 0x4E11: 0xB3F3, - 0x4E12: 0x8145, - 0x4E13: 0xD7A8, - 0x4E14: 0xC7D2, - 0x4E15: 0xD8A7, - 0x4E16: 0xCAC0, - 0x4E17: 0x8146, - 0x4E18: 0xC7F0, - 0x4E19: 0xB1FB, - 0x4E1A: 0xD2B5, - 0x4E1B: 0xB4D4, - 0x4E1C: 0xB6AB, - 0x4E1D: 0xCBBF, - 0x4E1E: 0xD8A9, - 0x4E1F: 0x8147, - 0x4E20: 0x8148, - 0x4E21: 0x8149, - 0x4E22: 0xB6AA, - 0x4E23: 0x814A, - 0x4E24: 0xC1BD, - 0x4E25: 0xD1CF, - 0x4E26: 0x814B, - 0x4E27: 0xC9A5, - 0x4E28: 0xD8AD, - 0x4E29: 0x814C, - 0x4E2A: 0xB8F6, - 0x4E2B: 0xD1BE, - 0x4E2C: 0xE3DC, - 0x4E2D: 0xD6D0, - 0x4E2E: 0x814D, - 0x4E2F: 0x814E, - 0x4E30: 0xB7E1, - 0x4E31: 0x814F, - 0x4E32: 0xB4AE, - 0x4E33: 0x8150, - 0x4E34: 0xC1D9, - 0x4E35: 0x8151, - 0x4E36: 0xD8BC, - 0x4E37: 0x8152, - 0x4E38: 0xCDE8, - 0x4E39: 0xB5A4, - 0x4E3A: 0xCEAA, - 0x4E3B: 0xD6F7, - 0x4E3C: 0x8153, - 0x4E3D: 0xC0F6, - 0x4E3E: 0xBED9, - 0x4E3F: 0xD8AF, - 0x4E40: 0x8154, - 0x4E41: 0x8155, - 0x4E42: 0x8156, - 0x4E43: 0xC4CB, - 0x4E44: 0x8157, - 0x4E45: 0xBEC3, - 0x4E46: 0x8158, - 0x4E47: 0xD8B1, - 0x4E48: 0xC3B4, - 0x4E49: 0xD2E5, - 0x4E4A: 0x8159, - 0x4E4B: 0xD6AE, - 0x4E4C: 0xCEDA, - 0x4E4D: 0xD5A7, - 0x4E4E: 0xBAF5, - 0x4E4F: 0xB7A6, - 0x4E50: 0xC0D6, - 0x4E51: 0x815A, - 0x4E52: 0xC6B9, - 0x4E53: 0xC5D2, - 0x4E54: 0xC7C7, - 0x4E55: 0x815B, - 0x4E56: 0xB9D4, - 0x4E57: 0x815C, - 0x4E58: 0xB3CB, - 0x4E59: 0xD2D2, - 0x4E5A: 0x815D, - 0x4E5B: 0x815E, - 0x4E5C: 0xD8BF, - 0x4E5D: 0xBEC5, - 0x4E5E: 0xC6F2, - 0x4E5F: 0xD2B2, - 0x4E60: 0xCFB0, - 0x4E61: 0xCFE7, - 0x4E62: 0x815F, - 0x4E63: 0x8160, - 0x4E64: 0x8161, - 0x4E65: 0x8162, - 0x4E66: 0xCAE9, - 0x4E67: 0x8163, - 0x4E68: 0x8164, - 0x4E69: 0xD8C0, - 0x4E6A: 0x8165, - 0x4E6B: 0x8166, - 0x4E6C: 0x8167, - 0x4E6D: 0x8168, - 0x4E6E: 0x8169, - 0x4E6F: 0x816A, - 0x4E70: 0xC2F2, - 0x4E71: 0xC2D2, - 0x4E72: 0x816B, - 0x4E73: 0xC8E9, - 0x4E74: 0x816C, - 0x4E75: 0x816D, - 0x4E76: 0x816E, - 0x4E77: 0x816F, - 0x4E78: 0x8170, - 0x4E79: 0x8171, - 0x4E7A: 0x8172, - 0x4E7B: 0x8173, - 0x4E7C: 0x8174, - 0x4E7D: 0x8175, - 0x4E7E: 0xC7AC, - 0x4E7F: 0x8176, - 0x4E80: 0x8177, - 0x4E81: 0x8178, - 0x4E82: 0x8179, - 0x4E83: 0x817A, - 0x4E84: 0x817B, - 0x4E85: 0x817C, - 0x4E86: 0xC1CB, - 0x4E87: 0x817D, - 0x4E88: 0xD3E8, - 0x4E89: 0xD5F9, - 0x4E8A: 0x817E, - 0x4E8B: 0xCAC2, - 0x4E8C: 0xB6FE, - 0x4E8D: 0xD8A1, - 0x4E8E: 0xD3DA, - 0x4E8F: 0xBFF7, - 0x4E90: 0x8180, - 0x4E91: 0xD4C6, - 0x4E92: 0xBBA5, - 0x4E93: 0xD8C1, - 0x4E94: 0xCEE5, - 0x4E95: 0xBEAE, - 0x4E96: 0x8181, - 0x4E97: 0x8182, - 0x4E98: 0xD8A8, - 0x4E99: 0x8183, - 0x4E9A: 0xD1C7, - 0x4E9B: 0xD0A9, - 0x4E9C: 0x8184, - 0x4E9D: 0x8185, - 0x4E9E: 0x8186, - 0x4E9F: 0xD8BD, - 0x4EA0: 0xD9EF, - 0x4EA1: 0xCDF6, - 0x4EA2: 0xBFBA, - 0x4EA3: 0x8187, - 0x4EA4: 0xBDBB, - 0x4EA5: 0xBAA5, - 0x4EA6: 0xD2E0, - 0x4EA7: 0xB2FA, - 0x4EA8: 0xBAE0, - 0x4EA9: 0xC4B6, - 0x4EAA: 0x8188, - 0x4EAB: 0xCFED, - 0x4EAC: 0xBEA9, - 0x4EAD: 0xCDA4, - 0x4EAE: 0xC1C1, - 0x4EAF: 0x8189, - 0x4EB0: 0x818A, - 0x4EB1: 0x818B, - 0x4EB2: 0xC7D7, - 0x4EB3: 0xD9F1, - 0x4EB4: 0x818C, - 0x4EB5: 0xD9F4, - 0x4EB6: 0x818D, - 0x4EB7: 0x818E, - 0x4EB8: 0x818F, - 0x4EB9: 0x8190, - 0x4EBA: 0xC8CB, - 0x4EBB: 0xD8E9, - 0x4EBC: 0x8191, - 0x4EBD: 0x8192, - 0x4EBE: 0x8193, - 0x4EBF: 0xD2DA, - 0x4EC0: 0xCAB2, - 0x4EC1: 0xC8CA, - 0x4EC2: 0xD8EC, - 0x4EC3: 0xD8EA, - 0x4EC4: 0xD8C6, - 0x4EC5: 0xBDF6, - 0x4EC6: 0xC6CD, - 0x4EC7: 0xB3F0, - 0x4EC8: 0x8194, - 0x4EC9: 0xD8EB, - 0x4ECA: 0xBDF1, - 0x4ECB: 0xBDE9, - 0x4ECC: 0x8195, - 0x4ECD: 0xC8D4, - 0x4ECE: 0xB4D3, - 0x4ECF: 0x8196, - 0x4ED0: 0x8197, - 0x4ED1: 0xC2D8, - 0x4ED2: 0x8198, - 0x4ED3: 0xB2D6, - 0x4ED4: 0xD7D0, - 0x4ED5: 0xCACB, - 0x4ED6: 0xCBFB, - 0x4ED7: 0xD5CC, - 0x4ED8: 0xB8B6, - 0x4ED9: 0xCFC9, - 0x4EDA: 0x8199, - 0x4EDB: 0x819A, - 0x4EDC: 0x819B, - 0x4EDD: 0xD9DA, - 0x4EDE: 0xD8F0, - 0x4EDF: 0xC7AA, - 0x4EE0: 0x819C, - 0x4EE1: 0xD8EE, - 0x4EE2: 0x819D, - 0x4EE3: 0xB4FA, - 0x4EE4: 0xC1EE, - 0x4EE5: 0xD2D4, - 0x4EE6: 0x819E, - 0x4EE7: 0x819F, - 0x4EE8: 0xD8ED, - 0x4EE9: 0x81A0, - 0x4EEA: 0xD2C7, - 0x4EEB: 0xD8EF, - 0x4EEC: 0xC3C7, - 0x4EED: 0x81A1, - 0x4EEE: 0x81A2, - 0x4EEF: 0x81A3, - 0x4EF0: 0xD1F6, - 0x4EF1: 0x81A4, - 0x4EF2: 0xD6D9, - 0x4EF3: 0xD8F2, - 0x4EF4: 0x81A5, - 0x4EF5: 0xD8F5, - 0x4EF6: 0xBCFE, - 0x4EF7: 0xBCDB, - 0x4EF8: 0x81A6, - 0x4EF9: 0x81A7, - 0x4EFA: 0x81A8, - 0x4EFB: 0xC8CE, - 0x4EFC: 0x81A9, - 0x4EFD: 0xB7DD, - 0x4EFE: 0x81AA, - 0x4EFF: 0xB7C2, - 0x4F00: 0x81AB, - 0x4F01: 0xC6F3, - 0x4F02: 0x81AC, - 0x4F03: 0x81AD, - 0x4F04: 0x81AE, - 0x4F05: 0x81AF, - 0x4F06: 0x81B0, - 0x4F07: 0x81B1, - 0x4F08: 0x81B2, - 0x4F09: 0xD8F8, - 0x4F0A: 0xD2C1, - 0x4F0B: 0x81B3, - 0x4F0C: 0x81B4, - 0x4F0D: 0xCEE9, - 0x4F0E: 0xBCBF, - 0x4F0F: 0xB7FC, - 0x4F10: 0xB7A5, - 0x4F11: 0xD0DD, - 0x4F12: 0x81B5, - 0x4F13: 0x81B6, - 0x4F14: 0x81B7, - 0x4F15: 0x81B8, - 0x4F16: 0x81B9, - 0x4F17: 0xD6DA, - 0x4F18: 0xD3C5, - 0x4F19: 0xBBEF, - 0x4F1A: 0xBBE1, - 0x4F1B: 0xD8F1, - 0x4F1C: 0x81BA, - 0x4F1D: 0x81BB, - 0x4F1E: 0xC9A1, - 0x4F1F: 0xCEB0, - 0x4F20: 0xB4AB, - 0x4F21: 0x81BC, - 0x4F22: 0xD8F3, - 0x4F23: 0x81BD, - 0x4F24: 0xC9CB, - 0x4F25: 0xD8F6, - 0x4F26: 0xC2D7, - 0x4F27: 0xD8F7, - 0x4F28: 0x81BE, - 0x4F29: 0x81BF, - 0x4F2A: 0xCEB1, - 0x4F2B: 0xD8F9, - 0x4F2C: 0x81C0, - 0x4F2D: 0x81C1, - 0x4F2E: 0x81C2, - 0x4F2F: 0xB2AE, - 0x4F30: 0xB9C0, - 0x4F31: 0x81C3, - 0x4F32: 0xD9A3, - 0x4F33: 0x81C4, - 0x4F34: 0xB0E9, - 0x4F35: 0x81C5, - 0x4F36: 0xC1E6, - 0x4F37: 0x81C6, - 0x4F38: 0xC9EC, - 0x4F39: 0x81C7, - 0x4F3A: 0xCBC5, - 0x4F3B: 0x81C8, - 0x4F3C: 0xCBC6, - 0x4F3D: 0xD9A4, - 0x4F3E: 0x81C9, - 0x4F3F: 0x81CA, - 0x4F40: 0x81CB, - 0x4F41: 0x81CC, - 0x4F42: 0x81CD, - 0x4F43: 0xB5E8, - 0x4F44: 0x81CE, - 0x4F45: 0x81CF, - 0x4F46: 0xB5AB, - 0x4F47: 0x81D0, - 0x4F48: 0x81D1, - 0x4F49: 0x81D2, - 0x4F4A: 0x81D3, - 0x4F4B: 0x81D4, - 0x4F4C: 0x81D5, - 0x4F4D: 0xCEBB, - 0x4F4E: 0xB5CD, - 0x4F4F: 0xD7A1, - 0x4F50: 0xD7F4, - 0x4F51: 0xD3D3, - 0x4F52: 0x81D6, - 0x4F53: 0xCCE5, - 0x4F54: 0x81D7, - 0x4F55: 0xBACE, - 0x4F56: 0x81D8, - 0x4F57: 0xD9A2, - 0x4F58: 0xD9DC, - 0x4F59: 0xD3E0, - 0x4F5A: 0xD8FD, - 0x4F5B: 0xB7F0, - 0x4F5C: 0xD7F7, - 0x4F5D: 0xD8FE, - 0x4F5E: 0xD8FA, - 0x4F5F: 0xD9A1, - 0x4F60: 0xC4E3, - 0x4F61: 0x81D9, - 0x4F62: 0x81DA, - 0x4F63: 0xD3B6, - 0x4F64: 0xD8F4, - 0x4F65: 0xD9DD, - 0x4F66: 0x81DB, - 0x4F67: 0xD8FB, - 0x4F68: 0x81DC, - 0x4F69: 0xC5E5, - 0x4F6A: 0x81DD, - 0x4F6B: 0x81DE, - 0x4F6C: 0xC0D0, - 0x4F6D: 0x81DF, - 0x4F6E: 0x81E0, - 0x4F6F: 0xD1F0, - 0x4F70: 0xB0DB, - 0x4F71: 0x81E1, - 0x4F72: 0x81E2, - 0x4F73: 0xBCD1, - 0x4F74: 0xD9A6, - 0x4F75: 0x81E3, - 0x4F76: 0xD9A5, - 0x4F77: 0x81E4, - 0x4F78: 0x81E5, - 0x4F79: 0x81E6, - 0x4F7A: 0x81E7, - 0x4F7B: 0xD9AC, - 0x4F7C: 0xD9AE, - 0x4F7D: 0x81E8, - 0x4F7E: 0xD9AB, - 0x4F7F: 0xCAB9, - 0x4F80: 0x81E9, - 0x4F81: 0x81EA, - 0x4F82: 0x81EB, - 0x4F83: 0xD9A9, - 0x4F84: 0xD6B6, - 0x4F85: 0x81EC, - 0x4F86: 0x81ED, - 0x4F87: 0x81EE, - 0x4F88: 0xB3DE, - 0x4F89: 0xD9A8, - 0x4F8A: 0x81EF, - 0x4F8B: 0xC0FD, - 0x4F8C: 0x81F0, - 0x4F8D: 0xCACC, - 0x4F8E: 0x81F1, - 0x4F8F: 0xD9AA, - 0x4F90: 0x81F2, - 0x4F91: 0xD9A7, - 0x4F92: 0x81F3, - 0x4F93: 0x81F4, - 0x4F94: 0xD9B0, - 0x4F95: 0x81F5, - 0x4F96: 0x81F6, - 0x4F97: 0xB6B1, - 0x4F98: 0x81F7, - 0x4F99: 0x81F8, - 0x4F9A: 0x81F9, - 0x4F9B: 0xB9A9, - 0x4F9C: 0x81FA, - 0x4F9D: 0xD2C0, - 0x4F9E: 0x81FB, - 0x4F9F: 0x81FC, - 0x4FA0: 0xCFC0, - 0x4FA1: 0x81FD, - 0x4FA2: 0x81FE, - 0x4FA3: 0xC2C2, - 0x4FA4: 0x8240, - 0x4FA5: 0xBDC4, - 0x4FA6: 0xD5EC, - 0x4FA7: 0xB2E0, - 0x4FA8: 0xC7C8, - 0x4FA9: 0xBFEB, - 0x4FAA: 0xD9AD, - 0x4FAB: 0x8241, - 0x4FAC: 0xD9AF, - 0x4FAD: 0x8242, - 0x4FAE: 0xCEEA, - 0x4FAF: 0xBAEE, - 0x4FB0: 0x8243, - 0x4FB1: 0x8244, - 0x4FB2: 0x8245, - 0x4FB3: 0x8246, - 0x4FB4: 0x8247, - 0x4FB5: 0xC7D6, - 0x4FB6: 0x8248, - 0x4FB7: 0x8249, - 0x4FB8: 0x824A, - 0x4FB9: 0x824B, - 0x4FBA: 0x824C, - 0x4FBB: 0x824D, - 0x4FBC: 0x824E, - 0x4FBD: 0x824F, - 0x4FBE: 0x8250, - 0x4FBF: 0xB1E3, - 0x4FC0: 0x8251, - 0x4FC1: 0x8252, - 0x4FC2: 0x8253, - 0x4FC3: 0xB4D9, - 0x4FC4: 0xB6ED, - 0x4FC5: 0xD9B4, - 0x4FC6: 0x8254, - 0x4FC7: 0x8255, - 0x4FC8: 0x8256, - 0x4FC9: 0x8257, - 0x4FCA: 0xBFA1, - 0x4FCB: 0x8258, - 0x4FCC: 0x8259, - 0x4FCD: 0x825A, - 0x4FCE: 0xD9DE, - 0x4FCF: 0xC7CE, - 0x4FD0: 0xC0FE, - 0x4FD1: 0xD9B8, - 0x4FD2: 0x825B, - 0x4FD3: 0x825C, - 0x4FD4: 0x825D, - 0x4FD5: 0x825E, - 0x4FD6: 0x825F, - 0x4FD7: 0xCBD7, - 0x4FD8: 0xB7FD, - 0x4FD9: 0x8260, - 0x4FDA: 0xD9B5, - 0x4FDB: 0x8261, - 0x4FDC: 0xD9B7, - 0x4FDD: 0xB1A3, - 0x4FDE: 0xD3E1, - 0x4FDF: 0xD9B9, - 0x4FE0: 0x8262, - 0x4FE1: 0xD0C5, - 0x4FE2: 0x8263, - 0x4FE3: 0xD9B6, - 0x4FE4: 0x8264, - 0x4FE5: 0x8265, - 0x4FE6: 0xD9B1, - 0x4FE7: 0x8266, - 0x4FE8: 0xD9B2, - 0x4FE9: 0xC1A9, - 0x4FEA: 0xD9B3, - 0x4FEB: 0x8267, - 0x4FEC: 0x8268, - 0x4FED: 0xBCF3, - 0x4FEE: 0xD0DE, - 0x4FEF: 0xB8A9, - 0x4FF0: 0x8269, - 0x4FF1: 0xBEE3, - 0x4FF2: 0x826A, - 0x4FF3: 0xD9BD, - 0x4FF4: 0x826B, - 0x4FF5: 0x826C, - 0x4FF6: 0x826D, - 0x4FF7: 0x826E, - 0x4FF8: 0xD9BA, - 0x4FF9: 0x826F, - 0x4FFA: 0xB0B3, - 0x4FFB: 0x8270, - 0x4FFC: 0x8271, - 0x4FFD: 0x8272, - 0x4FFE: 0xD9C2, - 0x4FFF: 0x8273, - 0x5000: 0x8274, - 0x5001: 0x8275, - 0x5002: 0x8276, - 0x5003: 0x8277, - 0x5004: 0x8278, - 0x5005: 0x8279, - 0x5006: 0x827A, - 0x5007: 0x827B, - 0x5008: 0x827C, - 0x5009: 0x827D, - 0x500A: 0x827E, - 0x500B: 0x8280, - 0x500C: 0xD9C4, - 0x500D: 0xB1B6, - 0x500E: 0x8281, - 0x500F: 0xD9BF, - 0x5010: 0x8282, - 0x5011: 0x8283, - 0x5012: 0xB5B9, - 0x5013: 0x8284, - 0x5014: 0xBEF3, - 0x5015: 0x8285, - 0x5016: 0x8286, - 0x5017: 0x8287, - 0x5018: 0xCCC8, - 0x5019: 0xBAF2, - 0x501A: 0xD2D0, - 0x501B: 0x8288, - 0x501C: 0xD9C3, - 0x501D: 0x8289, - 0x501E: 0x828A, - 0x501F: 0xBDE8, - 0x5020: 0x828B, - 0x5021: 0xB3AB, - 0x5022: 0x828C, - 0x5023: 0x828D, - 0x5024: 0x828E, - 0x5025: 0xD9C5, - 0x5026: 0xBEEB, - 0x5027: 0x828F, - 0x5028: 0xD9C6, - 0x5029: 0xD9BB, - 0x502A: 0xC4DF, - 0x502B: 0x8290, - 0x502C: 0xD9BE, - 0x502D: 0xD9C1, - 0x502E: 0xD9C0, - 0x502F: 0x8291, - 0x5030: 0x8292, - 0x5031: 0x8293, - 0x5032: 0x8294, - 0x5033: 0x8295, - 0x5034: 0x8296, - 0x5035: 0x8297, - 0x5036: 0x8298, - 0x5037: 0x8299, - 0x5038: 0x829A, - 0x5039: 0x829B, - 0x503A: 0xD5AE, - 0x503B: 0x829C, - 0x503C: 0xD6B5, - 0x503D: 0x829D, - 0x503E: 0xC7E3, - 0x503F: 0x829E, - 0x5040: 0x829F, - 0x5041: 0x82A0, - 0x5042: 0x82A1, - 0x5043: 0xD9C8, - 0x5044: 0x82A2, - 0x5045: 0x82A3, - 0x5046: 0x82A4, - 0x5047: 0xBCD9, - 0x5048: 0xD9CA, - 0x5049: 0x82A5, - 0x504A: 0x82A6, - 0x504B: 0x82A7, - 0x504C: 0xD9BC, - 0x504D: 0x82A8, - 0x504E: 0xD9CB, - 0x504F: 0xC6AB, - 0x5050: 0x82A9, - 0x5051: 0x82AA, - 0x5052: 0x82AB, - 0x5053: 0x82AC, - 0x5054: 0x82AD, - 0x5055: 0xD9C9, - 0x5056: 0x82AE, - 0x5057: 0x82AF, - 0x5058: 0x82B0, - 0x5059: 0x82B1, - 0x505A: 0xD7F6, - 0x505B: 0x82B2, - 0x505C: 0xCDA3, - 0x505D: 0x82B3, - 0x505E: 0x82B4, - 0x505F: 0x82B5, - 0x5060: 0x82B6, - 0x5061: 0x82B7, - 0x5062: 0x82B8, - 0x5063: 0x82B9, - 0x5064: 0x82BA, - 0x5065: 0xBDA1, - 0x5066: 0x82BB, - 0x5067: 0x82BC, - 0x5068: 0x82BD, - 0x5069: 0x82BE, - 0x506A: 0x82BF, - 0x506B: 0x82C0, - 0x506C: 0xD9CC, - 0x506D: 0x82C1, - 0x506E: 0x82C2, - 0x506F: 0x82C3, - 0x5070: 0x82C4, - 0x5071: 0x82C5, - 0x5072: 0x82C6, - 0x5073: 0x82C7, - 0x5074: 0x82C8, - 0x5075: 0x82C9, - 0x5076: 0xC5BC, - 0x5077: 0xCDB5, - 0x5078: 0x82CA, - 0x5079: 0x82CB, - 0x507A: 0x82CC, - 0x507B: 0xD9CD, - 0x507C: 0x82CD, - 0x507D: 0x82CE, - 0x507E: 0xD9C7, - 0x507F: 0xB3A5, - 0x5080: 0xBFFE, - 0x5081: 0x82CF, - 0x5082: 0x82D0, - 0x5083: 0x82D1, - 0x5084: 0x82D2, - 0x5085: 0xB8B5, - 0x5086: 0x82D3, - 0x5087: 0x82D4, - 0x5088: 0xC0FC, - 0x5089: 0x82D5, - 0x508A: 0x82D6, - 0x508B: 0x82D7, - 0x508C: 0x82D8, - 0x508D: 0xB0F8, - 0x508E: 0x82D9, - 0x508F: 0x82DA, - 0x5090: 0x82DB, - 0x5091: 0x82DC, - 0x5092: 0x82DD, - 0x5093: 0x82DE, - 0x5094: 0x82DF, - 0x5095: 0x82E0, - 0x5096: 0x82E1, - 0x5097: 0x82E2, - 0x5098: 0x82E3, - 0x5099: 0x82E4, - 0x509A: 0x82E5, - 0x509B: 0x82E6, - 0x509C: 0x82E7, - 0x509D: 0x82E8, - 0x509E: 0x82E9, - 0x509F: 0x82EA, - 0x50A0: 0x82EB, - 0x50A1: 0x82EC, - 0x50A2: 0x82ED, - 0x50A3: 0xB4F6, - 0x50A4: 0x82EE, - 0x50A5: 0xD9CE, - 0x50A6: 0x82EF, - 0x50A7: 0xD9CF, - 0x50A8: 0xB4A2, - 0x50A9: 0xD9D0, - 0x50AA: 0x82F0, - 0x50AB: 0x82F1, - 0x50AC: 0xB4DF, - 0x50AD: 0x82F2, - 0x50AE: 0x82F3, - 0x50AF: 0x82F4, - 0x50B0: 0x82F5, - 0x50B1: 0x82F6, - 0x50B2: 0xB0C1, - 0x50B3: 0x82F7, - 0x50B4: 0x82F8, - 0x50B5: 0x82F9, - 0x50B6: 0x82FA, - 0x50B7: 0x82FB, - 0x50B8: 0x82FC, - 0x50B9: 0x82FD, - 0x50BA: 0xD9D1, - 0x50BB: 0xC9B5, - 0x50BC: 0x82FE, - 0x50BD: 0x8340, - 0x50BE: 0x8341, - 0x50BF: 0x8342, - 0x50C0: 0x8343, - 0x50C1: 0x8344, - 0x50C2: 0x8345, - 0x50C3: 0x8346, - 0x50C4: 0x8347, - 0x50C5: 0x8348, - 0x50C6: 0x8349, - 0x50C7: 0x834A, - 0x50C8: 0x834B, - 0x50C9: 0x834C, - 0x50CA: 0x834D, - 0x50CB: 0x834E, - 0x50CC: 0x834F, - 0x50CD: 0x8350, - 0x50CE: 0x8351, - 0x50CF: 0xCFF1, - 0x50D0: 0x8352, - 0x50D1: 0x8353, - 0x50D2: 0x8354, - 0x50D3: 0x8355, - 0x50D4: 0x8356, - 0x50D5: 0x8357, - 0x50D6: 0xD9D2, - 0x50D7: 0x8358, - 0x50D8: 0x8359, - 0x50D9: 0x835A, - 0x50DA: 0xC1C5, - 0x50DB: 0x835B, - 0x50DC: 0x835C, - 0x50DD: 0x835D, - 0x50DE: 0x835E, - 0x50DF: 0x835F, - 0x50E0: 0x8360, - 0x50E1: 0x8361, - 0x50E2: 0x8362, - 0x50E3: 0x8363, - 0x50E4: 0x8364, - 0x50E5: 0x8365, - 0x50E6: 0xD9D6, - 0x50E7: 0xC9AE, - 0x50E8: 0x8366, - 0x50E9: 0x8367, - 0x50EA: 0x8368, - 0x50EB: 0x8369, - 0x50EC: 0xD9D5, - 0x50ED: 0xD9D4, - 0x50EE: 0xD9D7, - 0x50EF: 0x836A, - 0x50F0: 0x836B, - 0x50F1: 0x836C, - 0x50F2: 0x836D, - 0x50F3: 0xCBDB, - 0x50F4: 0x836E, - 0x50F5: 0xBDA9, - 0x50F6: 0x836F, - 0x50F7: 0x8370, - 0x50F8: 0x8371, - 0x50F9: 0x8372, - 0x50FA: 0x8373, - 0x50FB: 0xC6A7, - 0x50FC: 0x8374, - 0x50FD: 0x8375, - 0x50FE: 0x8376, - 0x50FF: 0x8377, - 0x5100: 0x8378, - 0x5101: 0x8379, - 0x5102: 0x837A, - 0x5103: 0x837B, - 0x5104: 0x837C, - 0x5105: 0x837D, - 0x5106: 0xD9D3, - 0x5107: 0xD9D8, - 0x5108: 0x837E, - 0x5109: 0x8380, - 0x510A: 0x8381, - 0x510B: 0xD9D9, - 0x510C: 0x8382, - 0x510D: 0x8383, - 0x510E: 0x8384, - 0x510F: 0x8385, - 0x5110: 0x8386, - 0x5111: 0x8387, - 0x5112: 0xC8E5, - 0x5113: 0x8388, - 0x5114: 0x8389, - 0x5115: 0x838A, - 0x5116: 0x838B, - 0x5117: 0x838C, - 0x5118: 0x838D, - 0x5119: 0x838E, - 0x511A: 0x838F, - 0x511B: 0x8390, - 0x511C: 0x8391, - 0x511D: 0x8392, - 0x511E: 0x8393, - 0x511F: 0x8394, - 0x5120: 0x8395, - 0x5121: 0xC0DC, - 0x5122: 0x8396, - 0x5123: 0x8397, - 0x5124: 0x8398, - 0x5125: 0x8399, - 0x5126: 0x839A, - 0x5127: 0x839B, - 0x5128: 0x839C, - 0x5129: 0x839D, - 0x512A: 0x839E, - 0x512B: 0x839F, - 0x512C: 0x83A0, - 0x512D: 0x83A1, - 0x512E: 0x83A2, - 0x512F: 0x83A3, - 0x5130: 0x83A4, - 0x5131: 0x83A5, - 0x5132: 0x83A6, - 0x5133: 0x83A7, - 0x5134: 0x83A8, - 0x5135: 0x83A9, - 0x5136: 0x83AA, - 0x5137: 0x83AB, - 0x5138: 0x83AC, - 0x5139: 0x83AD, - 0x513A: 0x83AE, - 0x513B: 0x83AF, - 0x513C: 0x83B0, - 0x513D: 0x83B1, - 0x513E: 0x83B2, - 0x513F: 0xB6F9, - 0x5140: 0xD8A3, - 0x5141: 0xD4CA, - 0x5142: 0x83B3, - 0x5143: 0xD4AA, - 0x5144: 0xD0D6, - 0x5145: 0xB3E4, - 0x5146: 0xD5D7, - 0x5147: 0x83B4, - 0x5148: 0xCFC8, - 0x5149: 0xB9E2, - 0x514A: 0x83B5, - 0x514B: 0xBFCB, - 0x514C: 0x83B6, - 0x514D: 0xC3E2, - 0x514E: 0x83B7, - 0x514F: 0x83B8, - 0x5150: 0x83B9, - 0x5151: 0xB6D2, - 0x5152: 0x83BA, - 0x5153: 0x83BB, - 0x5154: 0xCDC3, - 0x5155: 0xD9EE, - 0x5156: 0xD9F0, - 0x5157: 0x83BC, - 0x5158: 0x83BD, - 0x5159: 0x83BE, - 0x515A: 0xB5B3, - 0x515B: 0x83BF, - 0x515C: 0xB6B5, - 0x515D: 0x83C0, - 0x515E: 0x83C1, - 0x515F: 0x83C2, - 0x5160: 0x83C3, - 0x5161: 0x83C4, - 0x5162: 0xBEA4, - 0x5163: 0x83C5, - 0x5164: 0x83C6, - 0x5165: 0xC8EB, - 0x5166: 0x83C7, - 0x5167: 0x83C8, - 0x5168: 0xC8AB, - 0x5169: 0x83C9, - 0x516A: 0x83CA, - 0x516B: 0xB0CB, - 0x516C: 0xB9AB, - 0x516D: 0xC1F9, - 0x516E: 0xD9E2, - 0x516F: 0x83CB, - 0x5170: 0xC0BC, - 0x5171: 0xB9B2, - 0x5172: 0x83CC, - 0x5173: 0xB9D8, - 0x5174: 0xD0CB, - 0x5175: 0xB1F8, - 0x5176: 0xC6E4, - 0x5177: 0xBEDF, - 0x5178: 0xB5E4, - 0x5179: 0xD7C8, - 0x517A: 0x83CD, - 0x517B: 0xD1F8, - 0x517C: 0xBCE6, - 0x517D: 0xCADE, - 0x517E: 0x83CE, - 0x517F: 0x83CF, - 0x5180: 0xBCBD, - 0x5181: 0xD9E6, - 0x5182: 0xD8E7, - 0x5183: 0x83D0, - 0x5184: 0x83D1, - 0x5185: 0xC4DA, - 0x5186: 0x83D2, - 0x5187: 0x83D3, - 0x5188: 0xB8D4, - 0x5189: 0xC8BD, - 0x518A: 0x83D4, - 0x518B: 0x83D5, - 0x518C: 0xB2E1, - 0x518D: 0xD4D9, - 0x518E: 0x83D6, - 0x518F: 0x83D7, - 0x5190: 0x83D8, - 0x5191: 0x83D9, - 0x5192: 0xC3B0, - 0x5193: 0x83DA, - 0x5194: 0x83DB, - 0x5195: 0xC3E1, - 0x5196: 0xDAA2, - 0x5197: 0xC8DF, - 0x5198: 0x83DC, - 0x5199: 0xD0B4, - 0x519A: 0x83DD, - 0x519B: 0xBEFC, - 0x519C: 0xC5A9, - 0x519D: 0x83DE, - 0x519E: 0x83DF, - 0x519F: 0x83E0, - 0x51A0: 0xB9DA, - 0x51A1: 0x83E1, - 0x51A2: 0xDAA3, - 0x51A3: 0x83E2, - 0x51A4: 0xD4A9, - 0x51A5: 0xDAA4, - 0x51A6: 0x83E3, - 0x51A7: 0x83E4, - 0x51A8: 0x83E5, - 0x51A9: 0x83E6, - 0x51AA: 0x83E7, - 0x51AB: 0xD9FB, - 0x51AC: 0xB6AC, - 0x51AD: 0x83E8, - 0x51AE: 0x83E9, - 0x51AF: 0xB7EB, - 0x51B0: 0xB1F9, - 0x51B1: 0xD9FC, - 0x51B2: 0xB3E5, - 0x51B3: 0xBEF6, - 0x51B4: 0x83EA, - 0x51B5: 0xBFF6, - 0x51B6: 0xD2B1, - 0x51B7: 0xC0E4, - 0x51B8: 0x83EB, - 0x51B9: 0x83EC, - 0x51BA: 0x83ED, - 0x51BB: 0xB6B3, - 0x51BC: 0xD9FE, - 0x51BD: 0xD9FD, - 0x51BE: 0x83EE, - 0x51BF: 0x83EF, - 0x51C0: 0xBEBB, - 0x51C1: 0x83F0, - 0x51C2: 0x83F1, - 0x51C3: 0x83F2, - 0x51C4: 0xC6E0, - 0x51C5: 0x83F3, - 0x51C6: 0xD7BC, - 0x51C7: 0xDAA1, - 0x51C8: 0x83F4, - 0x51C9: 0xC1B9, - 0x51CA: 0x83F5, - 0x51CB: 0xB5F2, - 0x51CC: 0xC1E8, - 0x51CD: 0x83F6, - 0x51CE: 0x83F7, - 0x51CF: 0xBCF5, - 0x51D0: 0x83F8, - 0x51D1: 0xB4D5, - 0x51D2: 0x83F9, - 0x51D3: 0x83FA, - 0x51D4: 0x83FB, - 0x51D5: 0x83FC, - 0x51D6: 0x83FD, - 0x51D7: 0x83FE, - 0x51D8: 0x8440, - 0x51D9: 0x8441, - 0x51DA: 0x8442, - 0x51DB: 0xC1DD, - 0x51DC: 0x8443, - 0x51DD: 0xC4FD, - 0x51DE: 0x8444, - 0x51DF: 0x8445, - 0x51E0: 0xBCB8, - 0x51E1: 0xB7B2, - 0x51E2: 0x8446, - 0x51E3: 0x8447, - 0x51E4: 0xB7EF, - 0x51E5: 0x8448, - 0x51E6: 0x8449, - 0x51E7: 0x844A, - 0x51E8: 0x844B, - 0x51E9: 0x844C, - 0x51EA: 0x844D, - 0x51EB: 0xD9EC, - 0x51EC: 0x844E, - 0x51ED: 0xC6BE, - 0x51EE: 0x844F, - 0x51EF: 0xBFAD, - 0x51F0: 0xBBCB, - 0x51F1: 0x8450, - 0x51F2: 0x8451, - 0x51F3: 0xB5CA, - 0x51F4: 0x8452, - 0x51F5: 0xDBC9, - 0x51F6: 0xD0D7, - 0x51F7: 0x8453, - 0x51F8: 0xCDB9, - 0x51F9: 0xB0BC, - 0x51FA: 0xB3F6, - 0x51FB: 0xBBF7, - 0x51FC: 0xDBCA, - 0x51FD: 0xBAAF, - 0x51FE: 0x8454, - 0x51FF: 0xD4E4, - 0x5200: 0xB5B6, - 0x5201: 0xB5F3, - 0x5202: 0xD8D6, - 0x5203: 0xC8D0, - 0x5204: 0x8455, - 0x5205: 0x8456, - 0x5206: 0xB7D6, - 0x5207: 0xC7D0, - 0x5208: 0xD8D7, - 0x5209: 0x8457, - 0x520A: 0xBFAF, - 0x520B: 0x8458, - 0x520C: 0x8459, - 0x520D: 0xDBBB, - 0x520E: 0xD8D8, - 0x520F: 0x845A, - 0x5210: 0x845B, - 0x5211: 0xD0CC, - 0x5212: 0xBBAE, - 0x5213: 0x845C, - 0x5214: 0x845D, - 0x5215: 0x845E, - 0x5216: 0xEBBE, - 0x5217: 0xC1D0, - 0x5218: 0xC1F5, - 0x5219: 0xD4F2, - 0x521A: 0xB8D5, - 0x521B: 0xB4B4, - 0x521C: 0x845F, - 0x521D: 0xB3F5, - 0x521E: 0x8460, - 0x521F: 0x8461, - 0x5220: 0xC9BE, - 0x5221: 0x8462, - 0x5222: 0x8463, - 0x5223: 0x8464, - 0x5224: 0xC5D0, - 0x5225: 0x8465, - 0x5226: 0x8466, - 0x5227: 0x8467, - 0x5228: 0xC5D9, - 0x5229: 0xC0FB, - 0x522A: 0x8468, - 0x522B: 0xB1F0, - 0x522C: 0x8469, - 0x522D: 0xD8D9, - 0x522E: 0xB9CE, - 0x522F: 0x846A, - 0x5230: 0xB5BD, - 0x5231: 0x846B, - 0x5232: 0x846C, - 0x5233: 0xD8DA, - 0x5234: 0x846D, - 0x5235: 0x846E, - 0x5236: 0xD6C6, - 0x5237: 0xCBA2, - 0x5238: 0xC8AF, - 0x5239: 0xC9B2, - 0x523A: 0xB4CC, - 0x523B: 0xBFCC, - 0x523C: 0x846F, - 0x523D: 0xB9F4, - 0x523E: 0x8470, - 0x523F: 0xD8DB, - 0x5240: 0xD8DC, - 0x5241: 0xB6E7, - 0x5242: 0xBCC1, - 0x5243: 0xCCEA, - 0x5244: 0x8471, - 0x5245: 0x8472, - 0x5246: 0x8473, - 0x5247: 0x8474, - 0x5248: 0x8475, - 0x5249: 0x8476, - 0x524A: 0xCFF7, - 0x524B: 0x8477, - 0x524C: 0xD8DD, - 0x524D: 0xC7B0, - 0x524E: 0x8478, - 0x524F: 0x8479, - 0x5250: 0xB9D0, - 0x5251: 0xBDA3, - 0x5252: 0x847A, - 0x5253: 0x847B, - 0x5254: 0xCCDE, - 0x5255: 0x847C, - 0x5256: 0xC6CA, - 0x5257: 0x847D, - 0x5258: 0x847E, - 0x5259: 0x8480, - 0x525A: 0x8481, - 0x525B: 0x8482, - 0x525C: 0xD8E0, - 0x525D: 0x8483, - 0x525E: 0xD8DE, - 0x525F: 0x8484, - 0x5260: 0x8485, - 0x5261: 0xD8DF, - 0x5262: 0x8486, - 0x5263: 0x8487, - 0x5264: 0x8488, - 0x5265: 0xB0FE, - 0x5266: 0x8489, - 0x5267: 0xBEE7, - 0x5268: 0x848A, - 0x5269: 0xCAA3, - 0x526A: 0xBCF4, - 0x526B: 0x848B, - 0x526C: 0x848C, - 0x526D: 0x848D, - 0x526E: 0x848E, - 0x526F: 0xB8B1, - 0x5270: 0x848F, - 0x5271: 0x8490, - 0x5272: 0xB8EE, - 0x5273: 0x8491, - 0x5274: 0x8492, - 0x5275: 0x8493, - 0x5276: 0x8494, - 0x5277: 0x8495, - 0x5278: 0x8496, - 0x5279: 0x8497, - 0x527A: 0x8498, - 0x527B: 0x8499, - 0x527C: 0x849A, - 0x527D: 0xD8E2, - 0x527E: 0x849B, - 0x527F: 0xBDCB, - 0x5280: 0x849C, - 0x5281: 0xD8E4, - 0x5282: 0xD8E3, - 0x5283: 0x849D, - 0x5284: 0x849E, - 0x5285: 0x849F, - 0x5286: 0x84A0, - 0x5287: 0x84A1, - 0x5288: 0xC5FC, - 0x5289: 0x84A2, - 0x528A: 0x84A3, - 0x528B: 0x84A4, - 0x528C: 0x84A5, - 0x528D: 0x84A6, - 0x528E: 0x84A7, - 0x528F: 0x84A8, - 0x5290: 0xD8E5, - 0x5291: 0x84A9, - 0x5292: 0x84AA, - 0x5293: 0xD8E6, - 0x5294: 0x84AB, - 0x5295: 0x84AC, - 0x5296: 0x84AD, - 0x5297: 0x84AE, - 0x5298: 0x84AF, - 0x5299: 0x84B0, - 0x529A: 0x84B1, - 0x529B: 0xC1A6, - 0x529C: 0x84B2, - 0x529D: 0xC8B0, - 0x529E: 0xB0EC, - 0x529F: 0xB9A6, - 0x52A0: 0xBCD3, - 0x52A1: 0xCEF1, - 0x52A2: 0xDBBD, - 0x52A3: 0xC1D3, - 0x52A4: 0x84B3, - 0x52A5: 0x84B4, - 0x52A6: 0x84B5, - 0x52A7: 0x84B6, - 0x52A8: 0xB6AF, - 0x52A9: 0xD6FA, - 0x52AA: 0xC5AC, - 0x52AB: 0xBDD9, - 0x52AC: 0xDBBE, - 0x52AD: 0xDBBF, - 0x52AE: 0x84B7, - 0x52AF: 0x84B8, - 0x52B0: 0x84B9, - 0x52B1: 0xC0F8, - 0x52B2: 0xBEA2, - 0x52B3: 0xC0CD, - 0x52B4: 0x84BA, - 0x52B5: 0x84BB, - 0x52B6: 0x84BC, - 0x52B7: 0x84BD, - 0x52B8: 0x84BE, - 0x52B9: 0x84BF, - 0x52BA: 0x84C0, - 0x52BB: 0x84C1, - 0x52BC: 0x84C2, - 0x52BD: 0x84C3, - 0x52BE: 0xDBC0, - 0x52BF: 0xCAC6, - 0x52C0: 0x84C4, - 0x52C1: 0x84C5, - 0x52C2: 0x84C6, - 0x52C3: 0xB2AA, - 0x52C4: 0x84C7, - 0x52C5: 0x84C8, - 0x52C6: 0x84C9, - 0x52C7: 0xD3C2, - 0x52C8: 0x84CA, - 0x52C9: 0xC3E3, - 0x52CA: 0x84CB, - 0x52CB: 0xD1AB, - 0x52CC: 0x84CC, - 0x52CD: 0x84CD, - 0x52CE: 0x84CE, - 0x52CF: 0x84CF, - 0x52D0: 0xDBC2, - 0x52D1: 0x84D0, - 0x52D2: 0xC0D5, - 0x52D3: 0x84D1, - 0x52D4: 0x84D2, - 0x52D5: 0x84D3, - 0x52D6: 0xDBC3, - 0x52D7: 0x84D4, - 0x52D8: 0xBFB1, - 0x52D9: 0x84D5, - 0x52DA: 0x84D6, - 0x52DB: 0x84D7, - 0x52DC: 0x84D8, - 0x52DD: 0x84D9, - 0x52DE: 0x84DA, - 0x52DF: 0xC4BC, - 0x52E0: 0x84DB, - 0x52E1: 0x84DC, - 0x52E2: 0x84DD, - 0x52E3: 0x84DE, - 0x52E4: 0xC7DA, - 0x52E5: 0x84DF, - 0x52E6: 0x84E0, - 0x52E7: 0x84E1, - 0x52E8: 0x84E2, - 0x52E9: 0x84E3, - 0x52EA: 0x84E4, - 0x52EB: 0x84E5, - 0x52EC: 0x84E6, - 0x52ED: 0x84E7, - 0x52EE: 0x84E8, - 0x52EF: 0x84E9, - 0x52F0: 0xDBC4, - 0x52F1: 0x84EA, - 0x52F2: 0x84EB, - 0x52F3: 0x84EC, - 0x52F4: 0x84ED, - 0x52F5: 0x84EE, - 0x52F6: 0x84EF, - 0x52F7: 0x84F0, - 0x52F8: 0x84F1, - 0x52F9: 0xD9E8, - 0x52FA: 0xC9D7, - 0x52FB: 0x84F2, - 0x52FC: 0x84F3, - 0x52FD: 0x84F4, - 0x52FE: 0xB9B4, - 0x52FF: 0xCEF0, - 0x5300: 0xD4C8, - 0x5301: 0x84F5, - 0x5302: 0x84F6, - 0x5303: 0x84F7, - 0x5304: 0x84F8, - 0x5305: 0xB0FC, - 0x5306: 0xB4D2, - 0x5307: 0x84F9, - 0x5308: 0xD0D9, - 0x5309: 0x84FA, - 0x530A: 0x84FB, - 0x530B: 0x84FC, - 0x530C: 0x84FD, - 0x530D: 0xD9E9, - 0x530E: 0x84FE, - 0x530F: 0xDECB, - 0x5310: 0xD9EB, - 0x5311: 0x8540, - 0x5312: 0x8541, - 0x5313: 0x8542, - 0x5314: 0x8543, - 0x5315: 0xD8B0, - 0x5316: 0xBBAF, - 0x5317: 0xB1B1, - 0x5318: 0x8544, - 0x5319: 0xB3D7, - 0x531A: 0xD8CE, - 0x531B: 0x8545, - 0x531C: 0x8546, - 0x531D: 0xD4D1, - 0x531E: 0x8547, - 0x531F: 0x8548, - 0x5320: 0xBDB3, - 0x5321: 0xBFEF, - 0x5322: 0x8549, - 0x5323: 0xCFBB, - 0x5324: 0x854A, - 0x5325: 0x854B, - 0x5326: 0xD8D0, - 0x5327: 0x854C, - 0x5328: 0x854D, - 0x5329: 0x854E, - 0x532A: 0xB7CB, - 0x532B: 0x854F, - 0x532C: 0x8550, - 0x532D: 0x8551, - 0x532E: 0xD8D1, - 0x532F: 0x8552, - 0x5330: 0x8553, - 0x5331: 0x8554, - 0x5332: 0x8555, - 0x5333: 0x8556, - 0x5334: 0x8557, - 0x5335: 0x8558, - 0x5336: 0x8559, - 0x5337: 0x855A, - 0x5338: 0x855B, - 0x5339: 0xC6A5, - 0x533A: 0xC7F8, - 0x533B: 0xD2BD, - 0x533C: 0x855C, - 0x533D: 0x855D, - 0x533E: 0xD8D2, - 0x533F: 0xC4E4, - 0x5340: 0x855E, - 0x5341: 0xCAAE, - 0x5342: 0x855F, - 0x5343: 0xC7A7, - 0x5344: 0x8560, - 0x5345: 0xD8A6, - 0x5346: 0x8561, - 0x5347: 0xC9FD, - 0x5348: 0xCEE7, - 0x5349: 0xBBDC, - 0x534A: 0xB0EB, - 0x534B: 0x8562, - 0x534C: 0x8563, - 0x534D: 0x8564, - 0x534E: 0xBBAA, - 0x534F: 0xD0AD, - 0x5350: 0x8565, - 0x5351: 0xB1B0, - 0x5352: 0xD7E4, - 0x5353: 0xD7BF, - 0x5354: 0x8566, - 0x5355: 0xB5A5, - 0x5356: 0xC2F4, - 0x5357: 0xC4CF, - 0x5358: 0x8567, - 0x5359: 0x8568, - 0x535A: 0xB2A9, - 0x535B: 0x8569, - 0x535C: 0xB2B7, - 0x535D: 0x856A, - 0x535E: 0xB1E5, - 0x535F: 0xDFB2, - 0x5360: 0xD5BC, - 0x5361: 0xBFA8, - 0x5362: 0xC2AC, - 0x5363: 0xD8D5, - 0x5364: 0xC2B1, - 0x5365: 0x856B, - 0x5366: 0xD8D4, - 0x5367: 0xCED4, - 0x5368: 0x856C, - 0x5369: 0xDAE0, - 0x536A: 0x856D, - 0x536B: 0xCEC0, - 0x536C: 0x856E, - 0x536D: 0x856F, - 0x536E: 0xD8B4, - 0x536F: 0xC3AE, - 0x5370: 0xD3A1, - 0x5371: 0xCEA3, - 0x5372: 0x8570, - 0x5373: 0xBCB4, - 0x5374: 0xC8B4, - 0x5375: 0xC2D1, - 0x5376: 0x8571, - 0x5377: 0xBEED, - 0x5378: 0xD0B6, - 0x5379: 0x8572, - 0x537A: 0xDAE1, - 0x537B: 0x8573, - 0x537C: 0x8574, - 0x537D: 0x8575, - 0x537E: 0x8576, - 0x537F: 0xC7E4, - 0x5380: 0x8577, - 0x5381: 0x8578, - 0x5382: 0xB3A7, - 0x5383: 0x8579, - 0x5384: 0xB6F2, - 0x5385: 0xCCFC, - 0x5386: 0xC0FA, - 0x5387: 0x857A, - 0x5388: 0x857B, - 0x5389: 0xC0F7, - 0x538A: 0x857C, - 0x538B: 0xD1B9, - 0x538C: 0xD1E1, - 0x538D: 0xD8C7, - 0x538E: 0x857D, - 0x538F: 0x857E, - 0x5390: 0x8580, - 0x5391: 0x8581, - 0x5392: 0x8582, - 0x5393: 0x8583, - 0x5394: 0x8584, - 0x5395: 0xB2DE, - 0x5396: 0x8585, - 0x5397: 0x8586, - 0x5398: 0xC0E5, - 0x5399: 0x8587, - 0x539A: 0xBAF1, - 0x539B: 0x8588, - 0x539C: 0x8589, - 0x539D: 0xD8C8, - 0x539E: 0x858A, - 0x539F: 0xD4AD, - 0x53A0: 0x858B, - 0x53A1: 0x858C, - 0x53A2: 0xCFE1, - 0x53A3: 0xD8C9, - 0x53A4: 0x858D, - 0x53A5: 0xD8CA, - 0x53A6: 0xCFC3, - 0x53A7: 0x858E, - 0x53A8: 0xB3F8, - 0x53A9: 0xBEC7, - 0x53AA: 0x858F, - 0x53AB: 0x8590, - 0x53AC: 0x8591, - 0x53AD: 0x8592, - 0x53AE: 0xD8CB, - 0x53AF: 0x8593, - 0x53B0: 0x8594, - 0x53B1: 0x8595, - 0x53B2: 0x8596, - 0x53B3: 0x8597, - 0x53B4: 0x8598, - 0x53B5: 0x8599, - 0x53B6: 0xDBCC, - 0x53B7: 0x859A, - 0x53B8: 0x859B, - 0x53B9: 0x859C, - 0x53BA: 0x859D, - 0x53BB: 0xC8A5, - 0x53BC: 0x859E, - 0x53BD: 0x859F, - 0x53BE: 0x85A0, - 0x53BF: 0xCFD8, - 0x53C0: 0x85A1, - 0x53C1: 0xC8FE, - 0x53C2: 0xB2CE, - 0x53C3: 0x85A2, - 0x53C4: 0x85A3, - 0x53C5: 0x85A4, - 0x53C6: 0x85A5, - 0x53C7: 0x85A6, - 0x53C8: 0xD3D6, - 0x53C9: 0xB2E6, - 0x53CA: 0xBCB0, - 0x53CB: 0xD3D1, - 0x53CC: 0xCBAB, - 0x53CD: 0xB7B4, - 0x53CE: 0x85A7, - 0x53CF: 0x85A8, - 0x53D0: 0x85A9, - 0x53D1: 0xB7A2, - 0x53D2: 0x85AA, - 0x53D3: 0x85AB, - 0x53D4: 0xCAE5, - 0x53D5: 0x85AC, - 0x53D6: 0xC8A1, - 0x53D7: 0xCADC, - 0x53D8: 0xB1E4, - 0x53D9: 0xD0F0, - 0x53DA: 0x85AD, - 0x53DB: 0xC5D1, - 0x53DC: 0x85AE, - 0x53DD: 0x85AF, - 0x53DE: 0x85B0, - 0x53DF: 0xDBC5, - 0x53E0: 0xB5FE, - 0x53E1: 0x85B1, - 0x53E2: 0x85B2, - 0x53E3: 0xBFDA, - 0x53E4: 0xB9C5, - 0x53E5: 0xBEE4, - 0x53E6: 0xC1ED, - 0x53E7: 0x85B3, - 0x53E8: 0xDFB6, - 0x53E9: 0xDFB5, - 0x53EA: 0xD6BB, - 0x53EB: 0xBDD0, - 0x53EC: 0xD5D9, - 0x53ED: 0xB0C8, - 0x53EE: 0xB6A3, - 0x53EF: 0xBFC9, - 0x53F0: 0xCCA8, - 0x53F1: 0xDFB3, - 0x53F2: 0xCAB7, - 0x53F3: 0xD3D2, - 0x53F4: 0x85B4, - 0x53F5: 0xD8CF, - 0x53F6: 0xD2B6, - 0x53F7: 0xBAC5, - 0x53F8: 0xCBBE, - 0x53F9: 0xCCBE, - 0x53FA: 0x85B5, - 0x53FB: 0xDFB7, - 0x53FC: 0xB5F0, - 0x53FD: 0xDFB4, - 0x53FE: 0x85B6, - 0x53FF: 0x85B7, - 0x5400: 0x85B8, - 0x5401: 0xD3F5, - 0x5402: 0x85B9, - 0x5403: 0xB3D4, - 0x5404: 0xB8F7, - 0x5405: 0x85BA, - 0x5406: 0xDFBA, - 0x5407: 0x85BB, - 0x5408: 0xBACF, - 0x5409: 0xBCAA, - 0x540A: 0xB5F5, - 0x540B: 0x85BC, - 0x540C: 0xCDAC, - 0x540D: 0xC3FB, - 0x540E: 0xBAF3, - 0x540F: 0xC0F4, - 0x5410: 0xCDC2, - 0x5411: 0xCFF2, - 0x5412: 0xDFB8, - 0x5413: 0xCFC5, - 0x5414: 0x85BD, - 0x5415: 0xC2C0, - 0x5416: 0xDFB9, - 0x5417: 0xC2F0, - 0x5418: 0x85BE, - 0x5419: 0x85BF, - 0x541A: 0x85C0, - 0x541B: 0xBEFD, - 0x541C: 0x85C1, - 0x541D: 0xC1DF, - 0x541E: 0xCDCC, - 0x541F: 0xD2F7, - 0x5420: 0xB7CD, - 0x5421: 0xDFC1, - 0x5422: 0x85C2, - 0x5423: 0xDFC4, - 0x5424: 0x85C3, - 0x5425: 0x85C4, - 0x5426: 0xB7F1, - 0x5427: 0xB0C9, - 0x5428: 0xB6D6, - 0x5429: 0xB7D4, - 0x542A: 0x85C5, - 0x542B: 0xBAAC, - 0x542C: 0xCCFD, - 0x542D: 0xBFD4, - 0x542E: 0xCBB1, - 0x542F: 0xC6F4, - 0x5430: 0x85C6, - 0x5431: 0xD6A8, - 0x5432: 0xDFC5, - 0x5433: 0x85C7, - 0x5434: 0xCEE2, - 0x5435: 0xB3B3, - 0x5436: 0x85C8, - 0x5437: 0x85C9, - 0x5438: 0xCEFC, - 0x5439: 0xB4B5, - 0x543A: 0x85CA, - 0x543B: 0xCEC7, - 0x543C: 0xBAF0, - 0x543D: 0x85CB, - 0x543E: 0xCEE1, - 0x543F: 0x85CC, - 0x5440: 0xD1BD, - 0x5441: 0x85CD, - 0x5442: 0x85CE, - 0x5443: 0xDFC0, - 0x5444: 0x85CF, - 0x5445: 0x85D0, - 0x5446: 0xB4F4, - 0x5447: 0x85D1, - 0x5448: 0xB3CA, - 0x5449: 0x85D2, - 0x544A: 0xB8E6, - 0x544B: 0xDFBB, - 0x544C: 0x85D3, - 0x544D: 0x85D4, - 0x544E: 0x85D5, - 0x544F: 0x85D6, - 0x5450: 0xC4C5, - 0x5451: 0x85D7, - 0x5452: 0xDFBC, - 0x5453: 0xDFBD, - 0x5454: 0xDFBE, - 0x5455: 0xC5BB, - 0x5456: 0xDFBF, - 0x5457: 0xDFC2, - 0x5458: 0xD4B1, - 0x5459: 0xDFC3, - 0x545A: 0x85D8, - 0x545B: 0xC7BA, - 0x545C: 0xCED8, - 0x545D: 0x85D9, - 0x545E: 0x85DA, - 0x545F: 0x85DB, - 0x5460: 0x85DC, - 0x5461: 0x85DD, - 0x5462: 0xC4D8, - 0x5463: 0x85DE, - 0x5464: 0xDFCA, - 0x5465: 0x85DF, - 0x5466: 0xDFCF, - 0x5467: 0x85E0, - 0x5468: 0xD6DC, - 0x5469: 0x85E1, - 0x546A: 0x85E2, - 0x546B: 0x85E3, - 0x546C: 0x85E4, - 0x546D: 0x85E5, - 0x546E: 0x85E6, - 0x546F: 0x85E7, - 0x5470: 0x85E8, - 0x5471: 0xDFC9, - 0x5472: 0xDFDA, - 0x5473: 0xCEB6, - 0x5474: 0x85E9, - 0x5475: 0xBAC7, - 0x5476: 0xDFCE, - 0x5477: 0xDFC8, - 0x5478: 0xC5DE, - 0x5479: 0x85EA, - 0x547A: 0x85EB, - 0x547B: 0xC9EB, - 0x547C: 0xBAF4, - 0x547D: 0xC3FC, - 0x547E: 0x85EC, - 0x547F: 0x85ED, - 0x5480: 0xBED7, - 0x5481: 0x85EE, - 0x5482: 0xDFC6, - 0x5483: 0x85EF, - 0x5484: 0xDFCD, - 0x5485: 0x85F0, - 0x5486: 0xC5D8, - 0x5487: 0x85F1, - 0x5488: 0x85F2, - 0x5489: 0x85F3, - 0x548A: 0x85F4, - 0x548B: 0xD5A6, - 0x548C: 0xBACD, - 0x548D: 0x85F5, - 0x548E: 0xBECC, - 0x548F: 0xD3BD, - 0x5490: 0xB8C0, - 0x5491: 0x85F6, - 0x5492: 0xD6E4, - 0x5493: 0x85F7, - 0x5494: 0xDFC7, - 0x5495: 0xB9BE, - 0x5496: 0xBFA7, - 0x5497: 0x85F8, - 0x5498: 0x85F9, - 0x5499: 0xC1FC, - 0x549A: 0xDFCB, - 0x549B: 0xDFCC, - 0x549C: 0x85FA, - 0x549D: 0xDFD0, - 0x549E: 0x85FB, - 0x549F: 0x85FC, - 0x54A0: 0x85FD, - 0x54A1: 0x85FE, - 0x54A2: 0x8640, - 0x54A3: 0xDFDB, - 0x54A4: 0xDFE5, - 0x54A5: 0x8641, - 0x54A6: 0xDFD7, - 0x54A7: 0xDFD6, - 0x54A8: 0xD7C9, - 0x54A9: 0xDFE3, - 0x54AA: 0xDFE4, - 0x54AB: 0xE5EB, - 0x54AC: 0xD2A7, - 0x54AD: 0xDFD2, - 0x54AE: 0x8642, - 0x54AF: 0xBFA9, - 0x54B0: 0x8643, - 0x54B1: 0xD4DB, - 0x54B2: 0x8644, - 0x54B3: 0xBFC8, - 0x54B4: 0xDFD4, - 0x54B5: 0x8645, - 0x54B6: 0x8646, - 0x54B7: 0x8647, - 0x54B8: 0xCFCC, - 0x54B9: 0x8648, - 0x54BA: 0x8649, - 0x54BB: 0xDFDD, - 0x54BC: 0x864A, - 0x54BD: 0xD1CA, - 0x54BE: 0x864B, - 0x54BF: 0xDFDE, - 0x54C0: 0xB0A7, - 0x54C1: 0xC6B7, - 0x54C2: 0xDFD3, - 0x54C3: 0x864C, - 0x54C4: 0xBAE5, - 0x54C5: 0x864D, - 0x54C6: 0xB6DF, - 0x54C7: 0xCDDB, - 0x54C8: 0xB9FE, - 0x54C9: 0xD4D5, - 0x54CA: 0x864E, - 0x54CB: 0x864F, - 0x54CC: 0xDFDF, - 0x54CD: 0xCFEC, - 0x54CE: 0xB0A5, - 0x54CF: 0xDFE7, - 0x54D0: 0xDFD1, - 0x54D1: 0xD1C6, - 0x54D2: 0xDFD5, - 0x54D3: 0xDFD8, - 0x54D4: 0xDFD9, - 0x54D5: 0xDFDC, - 0x54D6: 0x8650, - 0x54D7: 0xBBA9, - 0x54D8: 0x8651, - 0x54D9: 0xDFE0, - 0x54DA: 0xDFE1, - 0x54DB: 0x8652, - 0x54DC: 0xDFE2, - 0x54DD: 0xDFE6, - 0x54DE: 0xDFE8, - 0x54DF: 0xD3B4, - 0x54E0: 0x8653, - 0x54E1: 0x8654, - 0x54E2: 0x8655, - 0x54E3: 0x8656, - 0x54E4: 0x8657, - 0x54E5: 0xB8E7, - 0x54E6: 0xC5B6, - 0x54E7: 0xDFEA, - 0x54E8: 0xC9DA, - 0x54E9: 0xC1A8, - 0x54EA: 0xC4C4, - 0x54EB: 0x8658, - 0x54EC: 0x8659, - 0x54ED: 0xBFDE, - 0x54EE: 0xCFF8, - 0x54EF: 0x865A, - 0x54F0: 0x865B, - 0x54F1: 0x865C, - 0x54F2: 0xD5DC, - 0x54F3: 0xDFEE, - 0x54F4: 0x865D, - 0x54F5: 0x865E, - 0x54F6: 0x865F, - 0x54F7: 0x8660, - 0x54F8: 0x8661, - 0x54F9: 0x8662, - 0x54FA: 0xB2B8, - 0x54FB: 0x8663, - 0x54FC: 0xBADF, - 0x54FD: 0xDFEC, - 0x54FE: 0x8664, - 0x54FF: 0xDBC1, - 0x5500: 0x8665, - 0x5501: 0xD1E4, - 0x5502: 0x8666, - 0x5503: 0x8667, - 0x5504: 0x8668, - 0x5505: 0x8669, - 0x5506: 0xCBF4, - 0x5507: 0xB4BD, - 0x5508: 0x866A, - 0x5509: 0xB0A6, - 0x550A: 0x866B, - 0x550B: 0x866C, - 0x550C: 0x866D, - 0x550D: 0x866E, - 0x550E: 0x866F, - 0x550F: 0xDFF1, - 0x5510: 0xCCC6, - 0x5511: 0xDFF2, - 0x5512: 0x8670, - 0x5513: 0x8671, - 0x5514: 0xDFED, - 0x5515: 0x8672, - 0x5516: 0x8673, - 0x5517: 0x8674, - 0x5518: 0x8675, - 0x5519: 0x8676, - 0x551A: 0x8677, - 0x551B: 0xDFE9, - 0x551C: 0x8678, - 0x551D: 0x8679, - 0x551E: 0x867A, - 0x551F: 0x867B, - 0x5520: 0xDFEB, - 0x5521: 0x867C, - 0x5522: 0xDFEF, - 0x5523: 0xDFF0, - 0x5524: 0xBBBD, - 0x5525: 0x867D, - 0x5526: 0x867E, - 0x5527: 0xDFF3, - 0x5528: 0x8680, - 0x5529: 0x8681, - 0x552A: 0xDFF4, - 0x552B: 0x8682, - 0x552C: 0xBBA3, - 0x552D: 0x8683, - 0x552E: 0xCADB, - 0x552F: 0xCEA8, - 0x5530: 0xE0A7, - 0x5531: 0xB3AA, - 0x5532: 0x8684, - 0x5533: 0xE0A6, - 0x5534: 0x8685, - 0x5535: 0x8686, - 0x5536: 0x8687, - 0x5537: 0xE0A1, - 0x5538: 0x8688, - 0x5539: 0x8689, - 0x553A: 0x868A, - 0x553B: 0x868B, - 0x553C: 0xDFFE, - 0x553D: 0x868C, - 0x553E: 0xCDD9, - 0x553F: 0xDFFC, - 0x5540: 0x868D, - 0x5541: 0xDFFA, - 0x5542: 0x868E, - 0x5543: 0xBFD0, - 0x5544: 0xD7C4, - 0x5545: 0x868F, - 0x5546: 0xC9CC, - 0x5547: 0x8690, - 0x5548: 0x8691, - 0x5549: 0xDFF8, - 0x554A: 0xB0A1, - 0x554B: 0x8692, - 0x554C: 0x8693, - 0x554D: 0x8694, - 0x554E: 0x8695, - 0x554F: 0x8696, - 0x5550: 0xDFFD, - 0x5551: 0x8697, - 0x5552: 0x8698, - 0x5553: 0x8699, - 0x5554: 0x869A, - 0x5555: 0xDFFB, - 0x5556: 0xE0A2, - 0x5557: 0x869B, - 0x5558: 0x869C, - 0x5559: 0x869D, - 0x555A: 0x869E, - 0x555B: 0x869F, - 0x555C: 0xE0A8, - 0x555D: 0x86A0, - 0x555E: 0x86A1, - 0x555F: 0x86A2, - 0x5560: 0x86A3, - 0x5561: 0xB7C8, - 0x5562: 0x86A4, - 0x5563: 0x86A5, - 0x5564: 0xC6A1, - 0x5565: 0xC9B6, - 0x5566: 0xC0B2, - 0x5567: 0xDFF5, - 0x5568: 0x86A6, - 0x5569: 0x86A7, - 0x556A: 0xC5BE, - 0x556B: 0x86A8, - 0x556C: 0xD8C4, - 0x556D: 0xDFF9, - 0x556E: 0xC4F6, - 0x556F: 0x86A9, - 0x5570: 0x86AA, - 0x5571: 0x86AB, - 0x5572: 0x86AC, - 0x5573: 0x86AD, - 0x5574: 0x86AE, - 0x5575: 0xE0A3, - 0x5576: 0xE0A4, - 0x5577: 0xE0A5, - 0x5578: 0xD0A5, - 0x5579: 0x86AF, - 0x557A: 0x86B0, - 0x557B: 0xE0B4, - 0x557C: 0xCCE4, - 0x557D: 0x86B1, - 0x557E: 0xE0B1, - 0x557F: 0x86B2, - 0x5580: 0xBFA6, - 0x5581: 0xE0AF, - 0x5582: 0xCEB9, - 0x5583: 0xE0AB, - 0x5584: 0xC9C6, - 0x5585: 0x86B3, - 0x5586: 0x86B4, - 0x5587: 0xC0AE, - 0x5588: 0xE0AE, - 0x5589: 0xBAED, - 0x558A: 0xBAB0, - 0x558B: 0xE0A9, - 0x558C: 0x86B5, - 0x558D: 0x86B6, - 0x558E: 0x86B7, - 0x558F: 0xDFF6, - 0x5590: 0x86B8, - 0x5591: 0xE0B3, - 0x5592: 0x86B9, - 0x5593: 0x86BA, - 0x5594: 0xE0B8, - 0x5595: 0x86BB, - 0x5596: 0x86BC, - 0x5597: 0x86BD, - 0x5598: 0xB4AD, - 0x5599: 0xE0B9, - 0x559A: 0x86BE, - 0x559B: 0x86BF, - 0x559C: 0xCFB2, - 0x559D: 0xBAC8, - 0x559E: 0x86C0, - 0x559F: 0xE0B0, - 0x55A0: 0x86C1, - 0x55A1: 0x86C2, - 0x55A2: 0x86C3, - 0x55A3: 0x86C4, - 0x55A4: 0x86C5, - 0x55A5: 0x86C6, - 0x55A6: 0x86C7, - 0x55A7: 0xD0FA, - 0x55A8: 0x86C8, - 0x55A9: 0x86C9, - 0x55AA: 0x86CA, - 0x55AB: 0x86CB, - 0x55AC: 0x86CC, - 0x55AD: 0x86CD, - 0x55AE: 0x86CE, - 0x55AF: 0x86CF, - 0x55B0: 0x86D0, - 0x55B1: 0xE0AC, - 0x55B2: 0x86D1, - 0x55B3: 0xD4FB, - 0x55B4: 0x86D2, - 0x55B5: 0xDFF7, - 0x55B6: 0x86D3, - 0x55B7: 0xC5E7, - 0x55B8: 0x86D4, - 0x55B9: 0xE0AD, - 0x55BA: 0x86D5, - 0x55BB: 0xD3F7, - 0x55BC: 0x86D6, - 0x55BD: 0xE0B6, - 0x55BE: 0xE0B7, - 0x55BF: 0x86D7, - 0x55C0: 0x86D8, - 0x55C1: 0x86D9, - 0x55C2: 0x86DA, - 0x55C3: 0x86DB, - 0x55C4: 0xE0C4, - 0x55C5: 0xD0E1, - 0x55C6: 0x86DC, - 0x55C7: 0x86DD, - 0x55C8: 0x86DE, - 0x55C9: 0xE0BC, - 0x55CA: 0x86DF, - 0x55CB: 0x86E0, - 0x55CC: 0xE0C9, - 0x55CD: 0xE0CA, - 0x55CE: 0x86E1, - 0x55CF: 0x86E2, - 0x55D0: 0x86E3, - 0x55D1: 0xE0BE, - 0x55D2: 0xE0AA, - 0x55D3: 0xC9A4, - 0x55D4: 0xE0C1, - 0x55D5: 0x86E4, - 0x55D6: 0xE0B2, - 0x55D7: 0x86E5, - 0x55D8: 0x86E6, - 0x55D9: 0x86E7, - 0x55DA: 0x86E8, - 0x55DB: 0x86E9, - 0x55DC: 0xCAC8, - 0x55DD: 0xE0C3, - 0x55DE: 0x86EA, - 0x55DF: 0xE0B5, - 0x55E0: 0x86EB, - 0x55E1: 0xCECB, - 0x55E2: 0x86EC, - 0x55E3: 0xCBC3, - 0x55E4: 0xE0CD, - 0x55E5: 0xE0C6, - 0x55E6: 0xE0C2, - 0x55E7: 0x86ED, - 0x55E8: 0xE0CB, - 0x55E9: 0x86EE, - 0x55EA: 0xE0BA, - 0x55EB: 0xE0BF, - 0x55EC: 0xE0C0, - 0x55ED: 0x86EF, - 0x55EE: 0x86F0, - 0x55EF: 0xE0C5, - 0x55F0: 0x86F1, - 0x55F1: 0x86F2, - 0x55F2: 0xE0C7, - 0x55F3: 0xE0C8, - 0x55F4: 0x86F3, - 0x55F5: 0xE0CC, - 0x55F6: 0x86F4, - 0x55F7: 0xE0BB, - 0x55F8: 0x86F5, - 0x55F9: 0x86F6, - 0x55FA: 0x86F7, - 0x55FB: 0x86F8, - 0x55FC: 0x86F9, - 0x55FD: 0xCBD4, - 0x55FE: 0xE0D5, - 0x55FF: 0x86FA, - 0x5600: 0xE0D6, - 0x5601: 0xE0D2, - 0x5602: 0x86FB, - 0x5603: 0x86FC, - 0x5604: 0x86FD, - 0x5605: 0x86FE, - 0x5606: 0x8740, - 0x5607: 0x8741, - 0x5608: 0xE0D0, - 0x5609: 0xBCCE, - 0x560A: 0x8742, - 0x560B: 0x8743, - 0x560C: 0xE0D1, - 0x560D: 0x8744, - 0x560E: 0xB8C2, - 0x560F: 0xD8C5, - 0x5610: 0x8745, - 0x5611: 0x8746, - 0x5612: 0x8747, - 0x5613: 0x8748, - 0x5614: 0x8749, - 0x5615: 0x874A, - 0x5616: 0x874B, - 0x5617: 0x874C, - 0x5618: 0xD0EA, - 0x5619: 0x874D, - 0x561A: 0x874E, - 0x561B: 0xC2EF, - 0x561C: 0x874F, - 0x561D: 0x8750, - 0x561E: 0xE0CF, - 0x561F: 0xE0BD, - 0x5620: 0x8751, - 0x5621: 0x8752, - 0x5622: 0x8753, - 0x5623: 0xE0D4, - 0x5624: 0xE0D3, - 0x5625: 0x8754, - 0x5626: 0x8755, - 0x5627: 0xE0D7, - 0x5628: 0x8756, - 0x5629: 0x8757, - 0x562A: 0x8758, - 0x562B: 0x8759, - 0x562C: 0xE0DC, - 0x562D: 0xE0D8, - 0x562E: 0x875A, - 0x562F: 0x875B, - 0x5630: 0x875C, - 0x5631: 0xD6F6, - 0x5632: 0xB3B0, - 0x5633: 0x875D, - 0x5634: 0xD7EC, - 0x5635: 0x875E, - 0x5636: 0xCBBB, - 0x5637: 0x875F, - 0x5638: 0x8760, - 0x5639: 0xE0DA, - 0x563A: 0x8761, - 0x563B: 0xCEFB, - 0x563C: 0x8762, - 0x563D: 0x8763, - 0x563E: 0x8764, - 0x563F: 0xBAD9, - 0x5640: 0x8765, - 0x5641: 0x8766, - 0x5642: 0x8767, - 0x5643: 0x8768, - 0x5644: 0x8769, - 0x5645: 0x876A, - 0x5646: 0x876B, - 0x5647: 0x876C, - 0x5648: 0x876D, - 0x5649: 0x876E, - 0x564A: 0x876F, - 0x564B: 0x8770, - 0x564C: 0xE0E1, - 0x564D: 0xE0DD, - 0x564E: 0xD2AD, - 0x564F: 0x8771, - 0x5650: 0x8772, - 0x5651: 0x8773, - 0x5652: 0x8774, - 0x5653: 0x8775, - 0x5654: 0xE0E2, - 0x5655: 0x8776, - 0x5656: 0x8777, - 0x5657: 0xE0DB, - 0x5658: 0xE0D9, - 0x5659: 0xE0DF, - 0x565A: 0x8778, - 0x565B: 0x8779, - 0x565C: 0xE0E0, - 0x565D: 0x877A, - 0x565E: 0x877B, - 0x565F: 0x877C, - 0x5660: 0x877D, - 0x5661: 0x877E, - 0x5662: 0xE0DE, - 0x5663: 0x8780, - 0x5664: 0xE0E4, - 0x5665: 0x8781, - 0x5666: 0x8782, - 0x5667: 0x8783, - 0x5668: 0xC6F7, - 0x5669: 0xD8AC, - 0x566A: 0xD4EB, - 0x566B: 0xE0E6, - 0x566C: 0xCAC9, - 0x566D: 0x8784, - 0x566E: 0x8785, - 0x566F: 0x8786, - 0x5670: 0x8787, - 0x5671: 0xE0E5, - 0x5672: 0x8788, - 0x5673: 0x8789, - 0x5674: 0x878A, - 0x5675: 0x878B, - 0x5676: 0xB8C1, - 0x5677: 0x878C, - 0x5678: 0x878D, - 0x5679: 0x878E, - 0x567A: 0x878F, - 0x567B: 0xE0E7, - 0x567C: 0xE0E8, - 0x567D: 0x8790, - 0x567E: 0x8791, - 0x567F: 0x8792, - 0x5680: 0x8793, - 0x5681: 0x8794, - 0x5682: 0x8795, - 0x5683: 0x8796, - 0x5684: 0x8797, - 0x5685: 0xE0E9, - 0x5686: 0xE0E3, - 0x5687: 0x8798, - 0x5688: 0x8799, - 0x5689: 0x879A, - 0x568A: 0x879B, - 0x568B: 0x879C, - 0x568C: 0x879D, - 0x568D: 0x879E, - 0x568E: 0xBABF, - 0x568F: 0xCCE7, - 0x5690: 0x879F, - 0x5691: 0x87A0, - 0x5692: 0x87A1, - 0x5693: 0xE0EA, - 0x5694: 0x87A2, - 0x5695: 0x87A3, - 0x5696: 0x87A4, - 0x5697: 0x87A5, - 0x5698: 0x87A6, - 0x5699: 0x87A7, - 0x569A: 0x87A8, - 0x569B: 0x87A9, - 0x569C: 0x87AA, - 0x569D: 0x87AB, - 0x569E: 0x87AC, - 0x569F: 0x87AD, - 0x56A0: 0x87AE, - 0x56A1: 0x87AF, - 0x56A2: 0x87B0, - 0x56A3: 0xCFF9, - 0x56A4: 0x87B1, - 0x56A5: 0x87B2, - 0x56A6: 0x87B3, - 0x56A7: 0x87B4, - 0x56A8: 0x87B5, - 0x56A9: 0x87B6, - 0x56AA: 0x87B7, - 0x56AB: 0x87B8, - 0x56AC: 0x87B9, - 0x56AD: 0x87BA, - 0x56AE: 0x87BB, - 0x56AF: 0xE0EB, - 0x56B0: 0x87BC, - 0x56B1: 0x87BD, - 0x56B2: 0x87BE, - 0x56B3: 0x87BF, - 0x56B4: 0x87C0, - 0x56B5: 0x87C1, - 0x56B6: 0x87C2, - 0x56B7: 0xC8C2, - 0x56B8: 0x87C3, - 0x56B9: 0x87C4, - 0x56BA: 0x87C5, - 0x56BB: 0x87C6, - 0x56BC: 0xBDC0, - 0x56BD: 0x87C7, - 0x56BE: 0x87C8, - 0x56BF: 0x87C9, - 0x56C0: 0x87CA, - 0x56C1: 0x87CB, - 0x56C2: 0x87CC, - 0x56C3: 0x87CD, - 0x56C4: 0x87CE, - 0x56C5: 0x87CF, - 0x56C6: 0x87D0, - 0x56C7: 0x87D1, - 0x56C8: 0x87D2, - 0x56C9: 0x87D3, - 0x56CA: 0xC4D2, - 0x56CB: 0x87D4, - 0x56CC: 0x87D5, - 0x56CD: 0x87D6, - 0x56CE: 0x87D7, - 0x56CF: 0x87D8, - 0x56D0: 0x87D9, - 0x56D1: 0x87DA, - 0x56D2: 0x87DB, - 0x56D3: 0x87DC, - 0x56D4: 0xE0EC, - 0x56D5: 0x87DD, - 0x56D6: 0x87DE, - 0x56D7: 0xE0ED, - 0x56D8: 0x87DF, - 0x56D9: 0x87E0, - 0x56DA: 0xC7F4, - 0x56DB: 0xCBC4, - 0x56DC: 0x87E1, - 0x56DD: 0xE0EE, - 0x56DE: 0xBBD8, - 0x56DF: 0xD8B6, - 0x56E0: 0xD2F2, - 0x56E1: 0xE0EF, - 0x56E2: 0xCDC5, - 0x56E3: 0x87E2, - 0x56E4: 0xB6DA, - 0x56E5: 0x87E3, - 0x56E6: 0x87E4, - 0x56E7: 0x87E5, - 0x56E8: 0x87E6, - 0x56E9: 0x87E7, - 0x56EA: 0x87E8, - 0x56EB: 0xE0F1, - 0x56EC: 0x87E9, - 0x56ED: 0xD4B0, - 0x56EE: 0x87EA, - 0x56EF: 0x87EB, - 0x56F0: 0xC0A7, - 0x56F1: 0xB4D1, - 0x56F2: 0x87EC, - 0x56F3: 0x87ED, - 0x56F4: 0xCEA7, - 0x56F5: 0xE0F0, - 0x56F6: 0x87EE, - 0x56F7: 0x87EF, - 0x56F8: 0x87F0, - 0x56F9: 0xE0F2, - 0x56FA: 0xB9CC, - 0x56FB: 0x87F1, - 0x56FC: 0x87F2, - 0x56FD: 0xB9FA, - 0x56FE: 0xCDBC, - 0x56FF: 0xE0F3, - 0x5700: 0x87F3, - 0x5701: 0x87F4, - 0x5702: 0x87F5, - 0x5703: 0xC6D4, - 0x5704: 0xE0F4, - 0x5705: 0x87F6, - 0x5706: 0xD4B2, - 0x5707: 0x87F7, - 0x5708: 0xC8A6, - 0x5709: 0xE0F6, - 0x570A: 0xE0F5, - 0x570B: 0x87F8, - 0x570C: 0x87F9, - 0x570D: 0x87FA, - 0x570E: 0x87FB, - 0x570F: 0x87FC, - 0x5710: 0x87FD, - 0x5711: 0x87FE, - 0x5712: 0x8840, - 0x5713: 0x8841, - 0x5714: 0x8842, - 0x5715: 0x8843, - 0x5716: 0x8844, - 0x5717: 0x8845, - 0x5718: 0x8846, - 0x5719: 0x8847, - 0x571A: 0x8848, - 0x571B: 0x8849, - 0x571C: 0xE0F7, - 0x571D: 0x884A, - 0x571E: 0x884B, - 0x571F: 0xCDC1, - 0x5720: 0x884C, - 0x5721: 0x884D, - 0x5722: 0x884E, - 0x5723: 0xCAA5, - 0x5724: 0x884F, - 0x5725: 0x8850, - 0x5726: 0x8851, - 0x5727: 0x8852, - 0x5728: 0xD4DA, - 0x5729: 0xDBD7, - 0x572A: 0xDBD9, - 0x572B: 0x8853, - 0x572C: 0xDBD8, - 0x572D: 0xB9E7, - 0x572E: 0xDBDC, - 0x572F: 0xDBDD, - 0x5730: 0xB5D8, - 0x5731: 0x8854, - 0x5732: 0x8855, - 0x5733: 0xDBDA, - 0x5734: 0x8856, - 0x5735: 0x8857, - 0x5736: 0x8858, - 0x5737: 0x8859, - 0x5738: 0x885A, - 0x5739: 0xDBDB, - 0x573A: 0xB3A1, - 0x573B: 0xDBDF, - 0x573C: 0x885B, - 0x573D: 0x885C, - 0x573E: 0xBBF8, - 0x573F: 0x885D, - 0x5740: 0xD6B7, - 0x5741: 0x885E, - 0x5742: 0xDBE0, - 0x5743: 0x885F, - 0x5744: 0x8860, - 0x5745: 0x8861, - 0x5746: 0x8862, - 0x5747: 0xBEF9, - 0x5748: 0x8863, - 0x5749: 0x8864, - 0x574A: 0xB7BB, - 0x574B: 0x8865, - 0x574C: 0xDBD0, - 0x574D: 0xCCAE, - 0x574E: 0xBFB2, - 0x574F: 0xBBB5, - 0x5750: 0xD7F8, - 0x5751: 0xBFD3, - 0x5752: 0x8866, - 0x5753: 0x8867, - 0x5754: 0x8868, - 0x5755: 0x8869, - 0x5756: 0x886A, - 0x5757: 0xBFE9, - 0x5758: 0x886B, - 0x5759: 0x886C, - 0x575A: 0xBCE1, - 0x575B: 0xCCB3, - 0x575C: 0xDBDE, - 0x575D: 0xB0D3, - 0x575E: 0xCEEB, - 0x575F: 0xB7D8, - 0x5760: 0xD7B9, - 0x5761: 0xC6C2, - 0x5762: 0x886D, - 0x5763: 0x886E, - 0x5764: 0xC0A4, - 0x5765: 0x886F, - 0x5766: 0xCCB9, - 0x5767: 0x8870, - 0x5768: 0xDBE7, - 0x5769: 0xDBE1, - 0x576A: 0xC6BA, - 0x576B: 0xDBE3, - 0x576C: 0x8871, - 0x576D: 0xDBE8, - 0x576E: 0x8872, - 0x576F: 0xC5F7, - 0x5770: 0x8873, - 0x5771: 0x8874, - 0x5772: 0x8875, - 0x5773: 0xDBEA, - 0x5774: 0x8876, - 0x5775: 0x8877, - 0x5776: 0xDBE9, - 0x5777: 0xBFC0, - 0x5778: 0x8878, - 0x5779: 0x8879, - 0x577A: 0x887A, - 0x577B: 0xDBE6, - 0x577C: 0xDBE5, - 0x577D: 0x887B, - 0x577E: 0x887C, - 0x577F: 0x887D, - 0x5780: 0x887E, - 0x5781: 0x8880, - 0x5782: 0xB4B9, - 0x5783: 0xC0AC, - 0x5784: 0xC2A2, - 0x5785: 0xDBE2, - 0x5786: 0xDBE4, - 0x5787: 0x8881, - 0x5788: 0x8882, - 0x5789: 0x8883, - 0x578A: 0x8884, - 0x578B: 0xD0CD, - 0x578C: 0xDBED, - 0x578D: 0x8885, - 0x578E: 0x8886, - 0x578F: 0x8887, - 0x5790: 0x8888, - 0x5791: 0x8889, - 0x5792: 0xC0DD, - 0x5793: 0xDBF2, - 0x5794: 0x888A, - 0x5795: 0x888B, - 0x5796: 0x888C, - 0x5797: 0x888D, - 0x5798: 0x888E, - 0x5799: 0x888F, - 0x579A: 0x8890, - 0x579B: 0xB6E2, - 0x579C: 0x8891, - 0x579D: 0x8892, - 0x579E: 0x8893, - 0x579F: 0x8894, - 0x57A0: 0xDBF3, - 0x57A1: 0xDBD2, - 0x57A2: 0xB9B8, - 0x57A3: 0xD4AB, - 0x57A4: 0xDBEC, - 0x57A5: 0x8895, - 0x57A6: 0xBFD1, - 0x57A7: 0xDBF0, - 0x57A8: 0x8896, - 0x57A9: 0xDBD1, - 0x57AA: 0x8897, - 0x57AB: 0xB5E6, - 0x57AC: 0x8898, - 0x57AD: 0xDBEB, - 0x57AE: 0xBFE5, - 0x57AF: 0x8899, - 0x57B0: 0x889A, - 0x57B1: 0x889B, - 0x57B2: 0xDBEE, - 0x57B3: 0x889C, - 0x57B4: 0xDBF1, - 0x57B5: 0x889D, - 0x57B6: 0x889E, - 0x57B7: 0x889F, - 0x57B8: 0xDBF9, - 0x57B9: 0x88A0, - 0x57BA: 0x88A1, - 0x57BB: 0x88A2, - 0x57BC: 0x88A3, - 0x57BD: 0x88A4, - 0x57BE: 0x88A5, - 0x57BF: 0x88A6, - 0x57C0: 0x88A7, - 0x57C1: 0x88A8, - 0x57C2: 0xB9A1, - 0x57C3: 0xB0A3, - 0x57C4: 0x88A9, - 0x57C5: 0x88AA, - 0x57C6: 0x88AB, - 0x57C7: 0x88AC, - 0x57C8: 0x88AD, - 0x57C9: 0x88AE, - 0x57CA: 0x88AF, - 0x57CB: 0xC2F1, - 0x57CC: 0x88B0, - 0x57CD: 0x88B1, - 0x57CE: 0xB3C7, - 0x57CF: 0xDBEF, - 0x57D0: 0x88B2, - 0x57D1: 0x88B3, - 0x57D2: 0xDBF8, - 0x57D3: 0x88B4, - 0x57D4: 0xC6D2, - 0x57D5: 0xDBF4, - 0x57D6: 0x88B5, - 0x57D7: 0x88B6, - 0x57D8: 0xDBF5, - 0x57D9: 0xDBF7, - 0x57DA: 0xDBF6, - 0x57DB: 0x88B7, - 0x57DC: 0x88B8, - 0x57DD: 0xDBFE, - 0x57DE: 0x88B9, - 0x57DF: 0xD3F2, - 0x57E0: 0xB2BA, - 0x57E1: 0x88BA, - 0x57E2: 0x88BB, - 0x57E3: 0x88BC, - 0x57E4: 0xDBFD, - 0x57E5: 0x88BD, - 0x57E6: 0x88BE, - 0x57E7: 0x88BF, - 0x57E8: 0x88C0, - 0x57E9: 0x88C1, - 0x57EA: 0x88C2, - 0x57EB: 0x88C3, - 0x57EC: 0x88C4, - 0x57ED: 0xDCA4, - 0x57EE: 0x88C5, - 0x57EF: 0xDBFB, - 0x57F0: 0x88C6, - 0x57F1: 0x88C7, - 0x57F2: 0x88C8, - 0x57F3: 0x88C9, - 0x57F4: 0xDBFA, - 0x57F5: 0x88CA, - 0x57F6: 0x88CB, - 0x57F7: 0x88CC, - 0x57F8: 0xDBFC, - 0x57F9: 0xC5E0, - 0x57FA: 0xBBF9, - 0x57FB: 0x88CD, - 0x57FC: 0x88CE, - 0x57FD: 0xDCA3, - 0x57FE: 0x88CF, - 0x57FF: 0x88D0, - 0x5800: 0xDCA5, - 0x5801: 0x88D1, - 0x5802: 0xCCC3, - 0x5803: 0x88D2, - 0x5804: 0x88D3, - 0x5805: 0x88D4, - 0x5806: 0xB6D1, - 0x5807: 0xDDC0, - 0x5808: 0x88D5, - 0x5809: 0x88D6, - 0x580A: 0x88D7, - 0x580B: 0xDCA1, - 0x580C: 0x88D8, - 0x580D: 0xDCA2, - 0x580E: 0x88D9, - 0x580F: 0x88DA, - 0x5810: 0x88DB, - 0x5811: 0xC7B5, - 0x5812: 0x88DC, - 0x5813: 0x88DD, - 0x5814: 0x88DE, - 0x5815: 0xB6E9, - 0x5816: 0x88DF, - 0x5817: 0x88E0, - 0x5818: 0x88E1, - 0x5819: 0xDCA7, - 0x581A: 0x88E2, - 0x581B: 0x88E3, - 0x581C: 0x88E4, - 0x581D: 0x88E5, - 0x581E: 0xDCA6, - 0x581F: 0x88E6, - 0x5820: 0xDCA9, - 0x5821: 0xB1A4, - 0x5822: 0x88E7, - 0x5823: 0x88E8, - 0x5824: 0xB5CC, - 0x5825: 0x88E9, - 0x5826: 0x88EA, - 0x5827: 0x88EB, - 0x5828: 0x88EC, - 0x5829: 0x88ED, - 0x582A: 0xBFB0, - 0x582B: 0x88EE, - 0x582C: 0x88EF, - 0x582D: 0x88F0, - 0x582E: 0x88F1, - 0x582F: 0x88F2, - 0x5830: 0xD1DF, - 0x5831: 0x88F3, - 0x5832: 0x88F4, - 0x5833: 0x88F5, - 0x5834: 0x88F6, - 0x5835: 0xB6C2, - 0x5836: 0x88F7, - 0x5837: 0x88F8, - 0x5838: 0x88F9, - 0x5839: 0x88FA, - 0x583A: 0x88FB, - 0x583B: 0x88FC, - 0x583C: 0x88FD, - 0x583D: 0x88FE, - 0x583E: 0x8940, - 0x583F: 0x8941, - 0x5840: 0x8942, - 0x5841: 0x8943, - 0x5842: 0x8944, - 0x5843: 0x8945, - 0x5844: 0xDCA8, - 0x5845: 0x8946, - 0x5846: 0x8947, - 0x5847: 0x8948, - 0x5848: 0x8949, - 0x5849: 0x894A, - 0x584A: 0x894B, - 0x584B: 0x894C, - 0x584C: 0xCBFA, - 0x584D: 0xEBF3, - 0x584E: 0x894D, - 0x584F: 0x894E, - 0x5850: 0x894F, - 0x5851: 0xCBDC, - 0x5852: 0x8950, - 0x5853: 0x8951, - 0x5854: 0xCBFE, - 0x5855: 0x8952, - 0x5856: 0x8953, - 0x5857: 0x8954, - 0x5858: 0xCCC1, - 0x5859: 0x8955, - 0x585A: 0x8956, - 0x585B: 0x8957, - 0x585C: 0x8958, - 0x585D: 0x8959, - 0x585E: 0xC8FB, - 0x585F: 0x895A, - 0x5860: 0x895B, - 0x5861: 0x895C, - 0x5862: 0x895D, - 0x5863: 0x895E, - 0x5864: 0x895F, - 0x5865: 0xDCAA, - 0x5866: 0x8960, - 0x5867: 0x8961, - 0x5868: 0x8962, - 0x5869: 0x8963, - 0x586A: 0x8964, - 0x586B: 0xCCEE, - 0x586C: 0xDCAB, - 0x586D: 0x8965, - 0x586E: 0x8966, - 0x586F: 0x8967, - 0x5870: 0x8968, - 0x5871: 0x8969, - 0x5872: 0x896A, - 0x5873: 0x896B, - 0x5874: 0x896C, - 0x5875: 0x896D, - 0x5876: 0x896E, - 0x5877: 0x896F, - 0x5878: 0x8970, - 0x5879: 0x8971, - 0x587A: 0x8972, - 0x587B: 0x8973, - 0x587C: 0x8974, - 0x587D: 0x8975, - 0x587E: 0xDBD3, - 0x587F: 0x8976, - 0x5880: 0xDCAF, - 0x5881: 0xDCAC, - 0x5882: 0x8977, - 0x5883: 0xBEB3, - 0x5884: 0x8978, - 0x5885: 0xCAFB, - 0x5886: 0x8979, - 0x5887: 0x897A, - 0x5888: 0x897B, - 0x5889: 0xDCAD, - 0x588A: 0x897C, - 0x588B: 0x897D, - 0x588C: 0x897E, - 0x588D: 0x8980, - 0x588E: 0x8981, - 0x588F: 0x8982, - 0x5890: 0x8983, - 0x5891: 0x8984, - 0x5892: 0xC9CA, - 0x5893: 0xC4B9, - 0x5894: 0x8985, - 0x5895: 0x8986, - 0x5896: 0x8987, - 0x5897: 0x8988, - 0x5898: 0x8989, - 0x5899: 0xC7BD, - 0x589A: 0xDCAE, - 0x589B: 0x898A, - 0x589C: 0x898B, - 0x589D: 0x898C, - 0x589E: 0xD4F6, - 0x589F: 0xD0E6, - 0x58A0: 0x898D, - 0x58A1: 0x898E, - 0x58A2: 0x898F, - 0x58A3: 0x8990, - 0x58A4: 0x8991, - 0x58A5: 0x8992, - 0x58A6: 0x8993, - 0x58A7: 0x8994, - 0x58A8: 0xC4AB, - 0x58A9: 0xB6D5, - 0x58AA: 0x8995, - 0x58AB: 0x8996, - 0x58AC: 0x8997, - 0x58AD: 0x8998, - 0x58AE: 0x8999, - 0x58AF: 0x899A, - 0x58B0: 0x899B, - 0x58B1: 0x899C, - 0x58B2: 0x899D, - 0x58B3: 0x899E, - 0x58B4: 0x899F, - 0x58B5: 0x89A0, - 0x58B6: 0x89A1, - 0x58B7: 0x89A2, - 0x58B8: 0x89A3, - 0x58B9: 0x89A4, - 0x58BA: 0x89A5, - 0x58BB: 0x89A6, - 0x58BC: 0xDBD4, - 0x58BD: 0x89A7, - 0x58BE: 0x89A8, - 0x58BF: 0x89A9, - 0x58C0: 0x89AA, - 0x58C1: 0xB1DA, - 0x58C2: 0x89AB, - 0x58C3: 0x89AC, - 0x58C4: 0x89AD, - 0x58C5: 0xDBD5, - 0x58C6: 0x89AE, - 0x58C7: 0x89AF, - 0x58C8: 0x89B0, - 0x58C9: 0x89B1, - 0x58CA: 0x89B2, - 0x58CB: 0x89B3, - 0x58CC: 0x89B4, - 0x58CD: 0x89B5, - 0x58CE: 0x89B6, - 0x58CF: 0x89B7, - 0x58D0: 0x89B8, - 0x58D1: 0xDBD6, - 0x58D2: 0x89B9, - 0x58D3: 0x89BA, - 0x58D4: 0x89BB, - 0x58D5: 0xBABE, - 0x58D6: 0x89BC, - 0x58D7: 0x89BD, - 0x58D8: 0x89BE, - 0x58D9: 0x89BF, - 0x58DA: 0x89C0, - 0x58DB: 0x89C1, - 0x58DC: 0x89C2, - 0x58DD: 0x89C3, - 0x58DE: 0x89C4, - 0x58DF: 0x89C5, - 0x58E0: 0x89C6, - 0x58E1: 0x89C7, - 0x58E2: 0x89C8, - 0x58E3: 0x89C9, - 0x58E4: 0xC8C0, - 0x58E5: 0x89CA, - 0x58E6: 0x89CB, - 0x58E7: 0x89CC, - 0x58E8: 0x89CD, - 0x58E9: 0x89CE, - 0x58EA: 0x89CF, - 0x58EB: 0xCABF, - 0x58EC: 0xC8C9, - 0x58ED: 0x89D0, - 0x58EE: 0xD7B3, - 0x58EF: 0x89D1, - 0x58F0: 0xC9F9, - 0x58F1: 0x89D2, - 0x58F2: 0x89D3, - 0x58F3: 0xBFC7, - 0x58F4: 0x89D4, - 0x58F5: 0x89D5, - 0x58F6: 0xBAF8, - 0x58F7: 0x89D6, - 0x58F8: 0x89D7, - 0x58F9: 0xD2BC, - 0x58FA: 0x89D8, - 0x58FB: 0x89D9, - 0x58FC: 0x89DA, - 0x58FD: 0x89DB, - 0x58FE: 0x89DC, - 0x58FF: 0x89DD, - 0x5900: 0x89DE, - 0x5901: 0x89DF, - 0x5902: 0xE2BA, - 0x5903: 0x89E0, - 0x5904: 0xB4A6, - 0x5905: 0x89E1, - 0x5906: 0x89E2, - 0x5907: 0xB1B8, - 0x5908: 0x89E3, - 0x5909: 0x89E4, - 0x590A: 0x89E5, - 0x590B: 0x89E6, - 0x590C: 0x89E7, - 0x590D: 0xB8B4, - 0x590E: 0x89E8, - 0x590F: 0xCFC4, - 0x5910: 0x89E9, - 0x5911: 0x89EA, - 0x5912: 0x89EB, - 0x5913: 0x89EC, - 0x5914: 0xD9E7, - 0x5915: 0xCFA6, - 0x5916: 0xCDE2, - 0x5917: 0x89ED, - 0x5918: 0x89EE, - 0x5919: 0xD9ED, - 0x591A: 0xB6E0, - 0x591B: 0x89EF, - 0x591C: 0xD2B9, - 0x591D: 0x89F0, - 0x591E: 0x89F1, - 0x591F: 0xB9BB, - 0x5920: 0x89F2, - 0x5921: 0x89F3, - 0x5922: 0x89F4, - 0x5923: 0x89F5, - 0x5924: 0xE2B9, - 0x5925: 0xE2B7, - 0x5926: 0x89F6, - 0x5927: 0xB4F3, - 0x5928: 0x89F7, - 0x5929: 0xCCEC, - 0x592A: 0xCCAB, - 0x592B: 0xB7F2, - 0x592C: 0x89F8, - 0x592D: 0xD8B2, - 0x592E: 0xD1EB, - 0x592F: 0xBABB, - 0x5930: 0x89F9, - 0x5931: 0xCAA7, - 0x5932: 0x89FA, - 0x5933: 0x89FB, - 0x5934: 0xCDB7, - 0x5935: 0x89FC, - 0x5936: 0x89FD, - 0x5937: 0xD2C4, - 0x5938: 0xBFE4, - 0x5939: 0xBCD0, - 0x593A: 0xB6E1, - 0x593B: 0x89FE, - 0x593C: 0xDEC5, - 0x593D: 0x8A40, - 0x593E: 0x8A41, - 0x593F: 0x8A42, - 0x5940: 0x8A43, - 0x5941: 0xDEC6, - 0x5942: 0xDBBC, - 0x5943: 0x8A44, - 0x5944: 0xD1D9, - 0x5945: 0x8A45, - 0x5946: 0x8A46, - 0x5947: 0xC6E6, - 0x5948: 0xC4CE, - 0x5949: 0xB7EE, - 0x594A: 0x8A47, - 0x594B: 0xB7DC, - 0x594C: 0x8A48, - 0x594D: 0x8A49, - 0x594E: 0xBFFC, - 0x594F: 0xD7E0, - 0x5950: 0x8A4A, - 0x5951: 0xC6F5, - 0x5952: 0x8A4B, - 0x5953: 0x8A4C, - 0x5954: 0xB1BC, - 0x5955: 0xDEC8, - 0x5956: 0xBDB1, - 0x5957: 0xCCD7, - 0x5958: 0xDECA, - 0x5959: 0x8A4D, - 0x595A: 0xDEC9, - 0x595B: 0x8A4E, - 0x595C: 0x8A4F, - 0x595D: 0x8A50, - 0x595E: 0x8A51, - 0x595F: 0x8A52, - 0x5960: 0xB5EC, - 0x5961: 0x8A53, - 0x5962: 0xC9DD, - 0x5963: 0x8A54, - 0x5964: 0x8A55, - 0x5965: 0xB0C2, - 0x5966: 0x8A56, - 0x5967: 0x8A57, - 0x5968: 0x8A58, - 0x5969: 0x8A59, - 0x596A: 0x8A5A, - 0x596B: 0x8A5B, - 0x596C: 0x8A5C, - 0x596D: 0x8A5D, - 0x596E: 0x8A5E, - 0x596F: 0x8A5F, - 0x5970: 0x8A60, - 0x5971: 0x8A61, - 0x5972: 0x8A62, - 0x5973: 0xC5AE, - 0x5974: 0xC5AB, - 0x5975: 0x8A63, - 0x5976: 0xC4CC, - 0x5977: 0x8A64, - 0x5978: 0xBCE9, - 0x5979: 0xCBFD, - 0x597A: 0x8A65, - 0x597B: 0x8A66, - 0x597C: 0x8A67, - 0x597D: 0xBAC3, - 0x597E: 0x8A68, - 0x597F: 0x8A69, - 0x5980: 0x8A6A, - 0x5981: 0xE5F9, - 0x5982: 0xC8E7, - 0x5983: 0xE5FA, - 0x5984: 0xCDFD, - 0x5985: 0x8A6B, - 0x5986: 0xD7B1, - 0x5987: 0xB8BE, - 0x5988: 0xC2E8, - 0x5989: 0x8A6C, - 0x598A: 0xC8D1, - 0x598B: 0x8A6D, - 0x598C: 0x8A6E, - 0x598D: 0xE5FB, - 0x598E: 0x8A6F, - 0x598F: 0x8A70, - 0x5990: 0x8A71, - 0x5991: 0x8A72, - 0x5992: 0xB6CA, - 0x5993: 0xBCCB, - 0x5994: 0x8A73, - 0x5995: 0x8A74, - 0x5996: 0xD1FD, - 0x5997: 0xE6A1, - 0x5998: 0x8A75, - 0x5999: 0xC3EE, - 0x599A: 0x8A76, - 0x599B: 0x8A77, - 0x599C: 0x8A78, - 0x599D: 0x8A79, - 0x599E: 0xE6A4, - 0x599F: 0x8A7A, - 0x59A0: 0x8A7B, - 0x59A1: 0x8A7C, - 0x59A2: 0x8A7D, - 0x59A3: 0xE5FE, - 0x59A4: 0xE6A5, - 0x59A5: 0xCDD7, - 0x59A6: 0x8A7E, - 0x59A7: 0x8A80, - 0x59A8: 0xB7C1, - 0x59A9: 0xE5FC, - 0x59AA: 0xE5FD, - 0x59AB: 0xE6A3, - 0x59AC: 0x8A81, - 0x59AD: 0x8A82, - 0x59AE: 0xC4DD, - 0x59AF: 0xE6A8, - 0x59B0: 0x8A83, - 0x59B1: 0x8A84, - 0x59B2: 0xE6A7, - 0x59B3: 0x8A85, - 0x59B4: 0x8A86, - 0x59B5: 0x8A87, - 0x59B6: 0x8A88, - 0x59B7: 0x8A89, - 0x59B8: 0x8A8A, - 0x59B9: 0xC3C3, - 0x59BA: 0x8A8B, - 0x59BB: 0xC6DE, - 0x59BC: 0x8A8C, - 0x59BD: 0x8A8D, - 0x59BE: 0xE6AA, - 0x59BF: 0x8A8E, - 0x59C0: 0x8A8F, - 0x59C1: 0x8A90, - 0x59C2: 0x8A91, - 0x59C3: 0x8A92, - 0x59C4: 0x8A93, - 0x59C5: 0x8A94, - 0x59C6: 0xC4B7, - 0x59C7: 0x8A95, - 0x59C8: 0x8A96, - 0x59C9: 0x8A97, - 0x59CA: 0xE6A2, - 0x59CB: 0xCABC, - 0x59CC: 0x8A98, - 0x59CD: 0x8A99, - 0x59CE: 0x8A9A, - 0x59CF: 0x8A9B, - 0x59D0: 0xBDE3, - 0x59D1: 0xB9C3, - 0x59D2: 0xE6A6, - 0x59D3: 0xD0D5, - 0x59D4: 0xCEAF, - 0x59D5: 0x8A9C, - 0x59D6: 0x8A9D, - 0x59D7: 0xE6A9, - 0x59D8: 0xE6B0, - 0x59D9: 0x8A9E, - 0x59DA: 0xD2A6, - 0x59DB: 0x8A9F, - 0x59DC: 0xBDAA, - 0x59DD: 0xE6AD, - 0x59DE: 0x8AA0, - 0x59DF: 0x8AA1, - 0x59E0: 0x8AA2, - 0x59E1: 0x8AA3, - 0x59E2: 0x8AA4, - 0x59E3: 0xE6AF, - 0x59E4: 0x8AA5, - 0x59E5: 0xC0D1, - 0x59E6: 0x8AA6, - 0x59E7: 0x8AA7, - 0x59E8: 0xD2CC, - 0x59E9: 0x8AA8, - 0x59EA: 0x8AA9, - 0x59EB: 0x8AAA, - 0x59EC: 0xBCA7, - 0x59ED: 0x8AAB, - 0x59EE: 0x8AAC, - 0x59EF: 0x8AAD, - 0x59F0: 0x8AAE, - 0x59F1: 0x8AAF, - 0x59F2: 0x8AB0, - 0x59F3: 0x8AB1, - 0x59F4: 0x8AB2, - 0x59F5: 0x8AB3, - 0x59F6: 0x8AB4, - 0x59F7: 0x8AB5, - 0x59F8: 0x8AB6, - 0x59F9: 0xE6B1, - 0x59FA: 0x8AB7, - 0x59FB: 0xD2F6, - 0x59FC: 0x8AB8, - 0x59FD: 0x8AB9, - 0x59FE: 0x8ABA, - 0x59FF: 0xD7CB, - 0x5A00: 0x8ABB, - 0x5A01: 0xCDFE, - 0x5A02: 0x8ABC, - 0x5A03: 0xCDDE, - 0x5A04: 0xC2A6, - 0x5A05: 0xE6AB, - 0x5A06: 0xE6AC, - 0x5A07: 0xBDBF, - 0x5A08: 0xE6AE, - 0x5A09: 0xE6B3, - 0x5A0A: 0x8ABD, - 0x5A0B: 0x8ABE, - 0x5A0C: 0xE6B2, - 0x5A0D: 0x8ABF, - 0x5A0E: 0x8AC0, - 0x5A0F: 0x8AC1, - 0x5A10: 0x8AC2, - 0x5A11: 0xE6B6, - 0x5A12: 0x8AC3, - 0x5A13: 0xE6B8, - 0x5A14: 0x8AC4, - 0x5A15: 0x8AC5, - 0x5A16: 0x8AC6, - 0x5A17: 0x8AC7, - 0x5A18: 0xC4EF, - 0x5A19: 0x8AC8, - 0x5A1A: 0x8AC9, - 0x5A1B: 0x8ACA, - 0x5A1C: 0xC4C8, - 0x5A1D: 0x8ACB, - 0x5A1E: 0x8ACC, - 0x5A1F: 0xBEEA, - 0x5A20: 0xC9EF, - 0x5A21: 0x8ACD, - 0x5A22: 0x8ACE, - 0x5A23: 0xE6B7, - 0x5A24: 0x8ACF, - 0x5A25: 0xB6F0, - 0x5A26: 0x8AD0, - 0x5A27: 0x8AD1, - 0x5A28: 0x8AD2, - 0x5A29: 0xC3E4, - 0x5A2A: 0x8AD3, - 0x5A2B: 0x8AD4, - 0x5A2C: 0x8AD5, - 0x5A2D: 0x8AD6, - 0x5A2E: 0x8AD7, - 0x5A2F: 0x8AD8, - 0x5A30: 0x8AD9, - 0x5A31: 0xD3E9, - 0x5A32: 0xE6B4, - 0x5A33: 0x8ADA, - 0x5A34: 0xE6B5, - 0x5A35: 0x8ADB, - 0x5A36: 0xC8A2, - 0x5A37: 0x8ADC, - 0x5A38: 0x8ADD, - 0x5A39: 0x8ADE, - 0x5A3A: 0x8ADF, - 0x5A3B: 0x8AE0, - 0x5A3C: 0xE6BD, - 0x5A3D: 0x8AE1, - 0x5A3E: 0x8AE2, - 0x5A3F: 0x8AE3, - 0x5A40: 0xE6B9, - 0x5A41: 0x8AE4, - 0x5A42: 0x8AE5, - 0x5A43: 0x8AE6, - 0x5A44: 0x8AE7, - 0x5A45: 0x8AE8, - 0x5A46: 0xC6C5, - 0x5A47: 0x8AE9, - 0x5A48: 0x8AEA, - 0x5A49: 0xCDF1, - 0x5A4A: 0xE6BB, - 0x5A4B: 0x8AEB, - 0x5A4C: 0x8AEC, - 0x5A4D: 0x8AED, - 0x5A4E: 0x8AEE, - 0x5A4F: 0x8AEF, - 0x5A50: 0x8AF0, - 0x5A51: 0x8AF1, - 0x5A52: 0x8AF2, - 0x5A53: 0x8AF3, - 0x5A54: 0x8AF4, - 0x5A55: 0xE6BC, - 0x5A56: 0x8AF5, - 0x5A57: 0x8AF6, - 0x5A58: 0x8AF7, - 0x5A59: 0x8AF8, - 0x5A5A: 0xBBE9, - 0x5A5B: 0x8AF9, - 0x5A5C: 0x8AFA, - 0x5A5D: 0x8AFB, - 0x5A5E: 0x8AFC, - 0x5A5F: 0x8AFD, - 0x5A60: 0x8AFE, - 0x5A61: 0x8B40, - 0x5A62: 0xE6BE, - 0x5A63: 0x8B41, - 0x5A64: 0x8B42, - 0x5A65: 0x8B43, - 0x5A66: 0x8B44, - 0x5A67: 0xE6BA, - 0x5A68: 0x8B45, - 0x5A69: 0x8B46, - 0x5A6A: 0xC0B7, - 0x5A6B: 0x8B47, - 0x5A6C: 0x8B48, - 0x5A6D: 0x8B49, - 0x5A6E: 0x8B4A, - 0x5A6F: 0x8B4B, - 0x5A70: 0x8B4C, - 0x5A71: 0x8B4D, - 0x5A72: 0x8B4E, - 0x5A73: 0x8B4F, - 0x5A74: 0xD3A4, - 0x5A75: 0xE6BF, - 0x5A76: 0xC9F4, - 0x5A77: 0xE6C3, - 0x5A78: 0x8B50, - 0x5A79: 0x8B51, - 0x5A7A: 0xE6C4, - 0x5A7B: 0x8B52, - 0x5A7C: 0x8B53, - 0x5A7D: 0x8B54, - 0x5A7E: 0x8B55, - 0x5A7F: 0xD0F6, - 0x5A80: 0x8B56, - 0x5A81: 0x8B57, - 0x5A82: 0x8B58, - 0x5A83: 0x8B59, - 0x5A84: 0x8B5A, - 0x5A85: 0x8B5B, - 0x5A86: 0x8B5C, - 0x5A87: 0x8B5D, - 0x5A88: 0x8B5E, - 0x5A89: 0x8B5F, - 0x5A8A: 0x8B60, - 0x5A8B: 0x8B61, - 0x5A8C: 0x8B62, - 0x5A8D: 0x8B63, - 0x5A8E: 0x8B64, - 0x5A8F: 0x8B65, - 0x5A90: 0x8B66, - 0x5A91: 0x8B67, - 0x5A92: 0xC3BD, - 0x5A93: 0x8B68, - 0x5A94: 0x8B69, - 0x5A95: 0x8B6A, - 0x5A96: 0x8B6B, - 0x5A97: 0x8B6C, - 0x5A98: 0x8B6D, - 0x5A99: 0x8B6E, - 0x5A9A: 0xC3C4, - 0x5A9B: 0xE6C2, - 0x5A9C: 0x8B6F, - 0x5A9D: 0x8B70, - 0x5A9E: 0x8B71, - 0x5A9F: 0x8B72, - 0x5AA0: 0x8B73, - 0x5AA1: 0x8B74, - 0x5AA2: 0x8B75, - 0x5AA3: 0x8B76, - 0x5AA4: 0x8B77, - 0x5AA5: 0x8B78, - 0x5AA6: 0x8B79, - 0x5AA7: 0x8B7A, - 0x5AA8: 0x8B7B, - 0x5AA9: 0x8B7C, - 0x5AAA: 0xE6C1, - 0x5AAB: 0x8B7D, - 0x5AAC: 0x8B7E, - 0x5AAD: 0x8B80, - 0x5AAE: 0x8B81, - 0x5AAF: 0x8B82, - 0x5AB0: 0x8B83, - 0x5AB1: 0x8B84, - 0x5AB2: 0xE6C7, - 0x5AB3: 0xCFB1, - 0x5AB4: 0x8B85, - 0x5AB5: 0xEBF4, - 0x5AB6: 0x8B86, - 0x5AB7: 0x8B87, - 0x5AB8: 0xE6CA, - 0x5AB9: 0x8B88, - 0x5ABA: 0x8B89, - 0x5ABB: 0x8B8A, - 0x5ABC: 0x8B8B, - 0x5ABD: 0x8B8C, - 0x5ABE: 0xE6C5, - 0x5ABF: 0x8B8D, - 0x5AC0: 0x8B8E, - 0x5AC1: 0xBCDE, - 0x5AC2: 0xC9A9, - 0x5AC3: 0x8B8F, - 0x5AC4: 0x8B90, - 0x5AC5: 0x8B91, - 0x5AC6: 0x8B92, - 0x5AC7: 0x8B93, - 0x5AC8: 0x8B94, - 0x5AC9: 0xBCB5, - 0x5ACA: 0x8B95, - 0x5ACB: 0x8B96, - 0x5ACC: 0xCFD3, - 0x5ACD: 0x8B97, - 0x5ACE: 0x8B98, - 0x5ACF: 0x8B99, - 0x5AD0: 0x8B9A, - 0x5AD1: 0x8B9B, - 0x5AD2: 0xE6C8, - 0x5AD3: 0x8B9C, - 0x5AD4: 0xE6C9, - 0x5AD5: 0x8B9D, - 0x5AD6: 0xE6CE, - 0x5AD7: 0x8B9E, - 0x5AD8: 0xE6D0, - 0x5AD9: 0x8B9F, - 0x5ADA: 0x8BA0, - 0x5ADB: 0x8BA1, - 0x5ADC: 0xE6D1, - 0x5ADD: 0x8BA2, - 0x5ADE: 0x8BA3, - 0x5ADF: 0x8BA4, - 0x5AE0: 0xE6CB, - 0x5AE1: 0xB5D5, - 0x5AE2: 0x8BA5, - 0x5AE3: 0xE6CC, - 0x5AE4: 0x8BA6, - 0x5AE5: 0x8BA7, - 0x5AE6: 0xE6CF, - 0x5AE7: 0x8BA8, - 0x5AE8: 0x8BA9, - 0x5AE9: 0xC4DB, - 0x5AEA: 0x8BAA, - 0x5AEB: 0xE6C6, - 0x5AEC: 0x8BAB, - 0x5AED: 0x8BAC, - 0x5AEE: 0x8BAD, - 0x5AEF: 0x8BAE, - 0x5AF0: 0x8BAF, - 0x5AF1: 0xE6CD, - 0x5AF2: 0x8BB0, - 0x5AF3: 0x8BB1, - 0x5AF4: 0x8BB2, - 0x5AF5: 0x8BB3, - 0x5AF6: 0x8BB4, - 0x5AF7: 0x8BB5, - 0x5AF8: 0x8BB6, - 0x5AF9: 0x8BB7, - 0x5AFA: 0x8BB8, - 0x5AFB: 0x8BB9, - 0x5AFC: 0x8BBA, - 0x5AFD: 0x8BBB, - 0x5AFE: 0x8BBC, - 0x5AFF: 0x8BBD, - 0x5B00: 0x8BBE, - 0x5B01: 0x8BBF, - 0x5B02: 0x8BC0, - 0x5B03: 0x8BC1, - 0x5B04: 0x8BC2, - 0x5B05: 0x8BC3, - 0x5B06: 0x8BC4, - 0x5B07: 0x8BC5, - 0x5B08: 0x8BC6, - 0x5B09: 0xE6D2, - 0x5B0A: 0x8BC7, - 0x5B0B: 0x8BC8, - 0x5B0C: 0x8BC9, - 0x5B0D: 0x8BCA, - 0x5B0E: 0x8BCB, - 0x5B0F: 0x8BCC, - 0x5B10: 0x8BCD, - 0x5B11: 0x8BCE, - 0x5B12: 0x8BCF, - 0x5B13: 0x8BD0, - 0x5B14: 0x8BD1, - 0x5B15: 0x8BD2, - 0x5B16: 0xE6D4, - 0x5B17: 0xE6D3, - 0x5B18: 0x8BD3, - 0x5B19: 0x8BD4, - 0x5B1A: 0x8BD5, - 0x5B1B: 0x8BD6, - 0x5B1C: 0x8BD7, - 0x5B1D: 0x8BD8, - 0x5B1E: 0x8BD9, - 0x5B1F: 0x8BDA, - 0x5B20: 0x8BDB, - 0x5B21: 0x8BDC, - 0x5B22: 0x8BDD, - 0x5B23: 0x8BDE, - 0x5B24: 0x8BDF, - 0x5B25: 0x8BE0, - 0x5B26: 0x8BE1, - 0x5B27: 0x8BE2, - 0x5B28: 0x8BE3, - 0x5B29: 0x8BE4, - 0x5B2A: 0x8BE5, - 0x5B2B: 0x8BE6, - 0x5B2C: 0x8BE7, - 0x5B2D: 0x8BE8, - 0x5B2E: 0x8BE9, - 0x5B2F: 0x8BEA, - 0x5B30: 0x8BEB, - 0x5B31: 0x8BEC, - 0x5B32: 0xE6D5, - 0x5B33: 0x8BED, - 0x5B34: 0xD9F8, - 0x5B35: 0x8BEE, - 0x5B36: 0x8BEF, - 0x5B37: 0xE6D6, - 0x5B38: 0x8BF0, - 0x5B39: 0x8BF1, - 0x5B3A: 0x8BF2, - 0x5B3B: 0x8BF3, - 0x5B3C: 0x8BF4, - 0x5B3D: 0x8BF5, - 0x5B3E: 0x8BF6, - 0x5B3F: 0x8BF7, - 0x5B40: 0xE6D7, - 0x5B41: 0x8BF8, - 0x5B42: 0x8BF9, - 0x5B43: 0x8BFA, - 0x5B44: 0x8BFB, - 0x5B45: 0x8BFC, - 0x5B46: 0x8BFD, - 0x5B47: 0x8BFE, - 0x5B48: 0x8C40, - 0x5B49: 0x8C41, - 0x5B4A: 0x8C42, - 0x5B4B: 0x8C43, - 0x5B4C: 0x8C44, - 0x5B4D: 0x8C45, - 0x5B4E: 0x8C46, - 0x5B4F: 0x8C47, - 0x5B50: 0xD7D3, - 0x5B51: 0xE6DD, - 0x5B52: 0x8C48, - 0x5B53: 0xE6DE, - 0x5B54: 0xBFD7, - 0x5B55: 0xD4D0, - 0x5B56: 0x8C49, - 0x5B57: 0xD7D6, - 0x5B58: 0xB4E6, - 0x5B59: 0xCBEF, - 0x5B5A: 0xE6DA, - 0x5B5B: 0xD8C3, - 0x5B5C: 0xD7CE, - 0x5B5D: 0xD0A2, - 0x5B5E: 0x8C4A, - 0x5B5F: 0xC3CF, - 0x5B60: 0x8C4B, - 0x5B61: 0x8C4C, - 0x5B62: 0xE6DF, - 0x5B63: 0xBCBE, - 0x5B64: 0xB9C2, - 0x5B65: 0xE6DB, - 0x5B66: 0xD1A7, - 0x5B67: 0x8C4D, - 0x5B68: 0x8C4E, - 0x5B69: 0xBAA2, - 0x5B6A: 0xC2CF, - 0x5B6B: 0x8C4F, - 0x5B6C: 0xD8AB, - 0x5B6D: 0x8C50, - 0x5B6E: 0x8C51, - 0x5B6F: 0x8C52, - 0x5B70: 0xCAEB, - 0x5B71: 0xE5EE, - 0x5B72: 0x8C53, - 0x5B73: 0xE6DC, - 0x5B74: 0x8C54, - 0x5B75: 0xB7F5, - 0x5B76: 0x8C55, - 0x5B77: 0x8C56, - 0x5B78: 0x8C57, - 0x5B79: 0x8C58, - 0x5B7A: 0xC8E6, - 0x5B7B: 0x8C59, - 0x5B7C: 0x8C5A, - 0x5B7D: 0xC4F5, - 0x5B7E: 0x8C5B, - 0x5B7F: 0x8C5C, - 0x5B80: 0xE5B2, - 0x5B81: 0xC4FE, - 0x5B82: 0x8C5D, - 0x5B83: 0xCBFC, - 0x5B84: 0xE5B3, - 0x5B85: 0xD5AC, - 0x5B86: 0x8C5E, - 0x5B87: 0xD3EE, - 0x5B88: 0xCAD8, - 0x5B89: 0xB0B2, - 0x5B8A: 0x8C5F, - 0x5B8B: 0xCBCE, - 0x5B8C: 0xCDEA, - 0x5B8D: 0x8C60, - 0x5B8E: 0x8C61, - 0x5B8F: 0xBAEA, - 0x5B90: 0x8C62, - 0x5B91: 0x8C63, - 0x5B92: 0x8C64, - 0x5B93: 0xE5B5, - 0x5B94: 0x8C65, - 0x5B95: 0xE5B4, - 0x5B96: 0x8C66, - 0x5B97: 0xD7DA, - 0x5B98: 0xB9D9, - 0x5B99: 0xD6E6, - 0x5B9A: 0xB6A8, - 0x5B9B: 0xCDF0, - 0x5B9C: 0xD2CB, - 0x5B9D: 0xB1A6, - 0x5B9E: 0xCAB5, - 0x5B9F: 0x8C67, - 0x5BA0: 0xB3E8, - 0x5BA1: 0xC9F3, - 0x5BA2: 0xBFCD, - 0x5BA3: 0xD0FB, - 0x5BA4: 0xCAD2, - 0x5BA5: 0xE5B6, - 0x5BA6: 0xBBC2, - 0x5BA7: 0x8C68, - 0x5BA8: 0x8C69, - 0x5BA9: 0x8C6A, - 0x5BAA: 0xCFDC, - 0x5BAB: 0xB9AC, - 0x5BAC: 0x8C6B, - 0x5BAD: 0x8C6C, - 0x5BAE: 0x8C6D, - 0x5BAF: 0x8C6E, - 0x5BB0: 0xD4D7, - 0x5BB1: 0x8C6F, - 0x5BB2: 0x8C70, - 0x5BB3: 0xBAA6, - 0x5BB4: 0xD1E7, - 0x5BB5: 0xCFFC, - 0x5BB6: 0xBCD2, - 0x5BB7: 0x8C71, - 0x5BB8: 0xE5B7, - 0x5BB9: 0xC8DD, - 0x5BBA: 0x8C72, - 0x5BBB: 0x8C73, - 0x5BBC: 0x8C74, - 0x5BBD: 0xBFED, - 0x5BBE: 0xB1F6, - 0x5BBF: 0xCBDE, - 0x5BC0: 0x8C75, - 0x5BC1: 0x8C76, - 0x5BC2: 0xBCC5, - 0x5BC3: 0x8C77, - 0x5BC4: 0xBCC4, - 0x5BC5: 0xD2FA, - 0x5BC6: 0xC3DC, - 0x5BC7: 0xBFDC, - 0x5BC8: 0x8C78, - 0x5BC9: 0x8C79, - 0x5BCA: 0x8C7A, - 0x5BCB: 0x8C7B, - 0x5BCC: 0xB8BB, - 0x5BCD: 0x8C7C, - 0x5BCE: 0x8C7D, - 0x5BCF: 0x8C7E, - 0x5BD0: 0xC3C2, - 0x5BD1: 0x8C80, - 0x5BD2: 0xBAAE, - 0x5BD3: 0xD4A2, - 0x5BD4: 0x8C81, - 0x5BD5: 0x8C82, - 0x5BD6: 0x8C83, - 0x5BD7: 0x8C84, - 0x5BD8: 0x8C85, - 0x5BD9: 0x8C86, - 0x5BDA: 0x8C87, - 0x5BDB: 0x8C88, - 0x5BDC: 0x8C89, - 0x5BDD: 0xC7DE, - 0x5BDE: 0xC4AF, - 0x5BDF: 0xB2EC, - 0x5BE0: 0x8C8A, - 0x5BE1: 0xB9D1, - 0x5BE2: 0x8C8B, - 0x5BE3: 0x8C8C, - 0x5BE4: 0xE5BB, - 0x5BE5: 0xC1C8, - 0x5BE6: 0x8C8D, - 0x5BE7: 0x8C8E, - 0x5BE8: 0xD5AF, - 0x5BE9: 0x8C8F, - 0x5BEA: 0x8C90, - 0x5BEB: 0x8C91, - 0x5BEC: 0x8C92, - 0x5BED: 0x8C93, - 0x5BEE: 0xE5BC, - 0x5BEF: 0x8C94, - 0x5BF0: 0xE5BE, - 0x5BF1: 0x8C95, - 0x5BF2: 0x8C96, - 0x5BF3: 0x8C97, - 0x5BF4: 0x8C98, - 0x5BF5: 0x8C99, - 0x5BF6: 0x8C9A, - 0x5BF7: 0x8C9B, - 0x5BF8: 0xB4E7, - 0x5BF9: 0xB6D4, - 0x5BFA: 0xCBC2, - 0x5BFB: 0xD1B0, - 0x5BFC: 0xB5BC, - 0x5BFD: 0x8C9C, - 0x5BFE: 0x8C9D, - 0x5BFF: 0xCAD9, - 0x5C00: 0x8C9E, - 0x5C01: 0xB7E2, - 0x5C02: 0x8C9F, - 0x5C03: 0x8CA0, - 0x5C04: 0xC9E4, - 0x5C05: 0x8CA1, - 0x5C06: 0xBDAB, - 0x5C07: 0x8CA2, - 0x5C08: 0x8CA3, - 0x5C09: 0xCEBE, - 0x5C0A: 0xD7F0, - 0x5C0B: 0x8CA4, - 0x5C0C: 0x8CA5, - 0x5C0D: 0x8CA6, - 0x5C0E: 0x8CA7, - 0x5C0F: 0xD0A1, - 0x5C10: 0x8CA8, - 0x5C11: 0xC9D9, - 0x5C12: 0x8CA9, - 0x5C13: 0x8CAA, - 0x5C14: 0xB6FB, - 0x5C15: 0xE6D8, - 0x5C16: 0xBCE2, - 0x5C17: 0x8CAB, - 0x5C18: 0xB3BE, - 0x5C19: 0x8CAC, - 0x5C1A: 0xC9D0, - 0x5C1B: 0x8CAD, - 0x5C1C: 0xE6D9, - 0x5C1D: 0xB3A2, - 0x5C1E: 0x8CAE, - 0x5C1F: 0x8CAF, - 0x5C20: 0x8CB0, - 0x5C21: 0x8CB1, - 0x5C22: 0xDECC, - 0x5C23: 0x8CB2, - 0x5C24: 0xD3C8, - 0x5C25: 0xDECD, - 0x5C26: 0x8CB3, - 0x5C27: 0xD2A2, - 0x5C28: 0x8CB4, - 0x5C29: 0x8CB5, - 0x5C2A: 0x8CB6, - 0x5C2B: 0x8CB7, - 0x5C2C: 0xDECE, - 0x5C2D: 0x8CB8, - 0x5C2E: 0x8CB9, - 0x5C2F: 0x8CBA, - 0x5C30: 0x8CBB, - 0x5C31: 0xBECD, - 0x5C32: 0x8CBC, - 0x5C33: 0x8CBD, - 0x5C34: 0xDECF, - 0x5C35: 0x8CBE, - 0x5C36: 0x8CBF, - 0x5C37: 0x8CC0, - 0x5C38: 0xCAAC, - 0x5C39: 0xD2FC, - 0x5C3A: 0xB3DF, - 0x5C3B: 0xE5EA, - 0x5C3C: 0xC4E1, - 0x5C3D: 0xBEA1, - 0x5C3E: 0xCEB2, - 0x5C3F: 0xC4F2, - 0x5C40: 0xBED6, - 0x5C41: 0xC6A8, - 0x5C42: 0xB2E3, - 0x5C43: 0x8CC1, - 0x5C44: 0x8CC2, - 0x5C45: 0xBED3, - 0x5C46: 0x8CC3, - 0x5C47: 0x8CC4, - 0x5C48: 0xC7FC, - 0x5C49: 0xCCEB, - 0x5C4A: 0xBDEC, - 0x5C4B: 0xCEDD, - 0x5C4C: 0x8CC5, - 0x5C4D: 0x8CC6, - 0x5C4E: 0xCABA, - 0x5C4F: 0xC6C1, - 0x5C50: 0xE5EC, - 0x5C51: 0xD0BC, - 0x5C52: 0x8CC7, - 0x5C53: 0x8CC8, - 0x5C54: 0x8CC9, - 0x5C55: 0xD5B9, - 0x5C56: 0x8CCA, - 0x5C57: 0x8CCB, - 0x5C58: 0x8CCC, - 0x5C59: 0xE5ED, - 0x5C5A: 0x8CCD, - 0x5C5B: 0x8CCE, - 0x5C5C: 0x8CCF, - 0x5C5D: 0x8CD0, - 0x5C5E: 0xCAF4, - 0x5C5F: 0x8CD1, - 0x5C60: 0xCDC0, - 0x5C61: 0xC2C5, - 0x5C62: 0x8CD2, - 0x5C63: 0xE5EF, - 0x5C64: 0x8CD3, - 0x5C65: 0xC2C4, - 0x5C66: 0xE5F0, - 0x5C67: 0x8CD4, - 0x5C68: 0x8CD5, - 0x5C69: 0x8CD6, - 0x5C6A: 0x8CD7, - 0x5C6B: 0x8CD8, - 0x5C6C: 0x8CD9, - 0x5C6D: 0x8CDA, - 0x5C6E: 0xE5F8, - 0x5C6F: 0xCDCD, - 0x5C70: 0x8CDB, - 0x5C71: 0xC9BD, - 0x5C72: 0x8CDC, - 0x5C73: 0x8CDD, - 0x5C74: 0x8CDE, - 0x5C75: 0x8CDF, - 0x5C76: 0x8CE0, - 0x5C77: 0x8CE1, - 0x5C78: 0x8CE2, - 0x5C79: 0xD2D9, - 0x5C7A: 0xE1A8, - 0x5C7B: 0x8CE3, - 0x5C7C: 0x8CE4, - 0x5C7D: 0x8CE5, - 0x5C7E: 0x8CE6, - 0x5C7F: 0xD3EC, - 0x5C80: 0x8CE7, - 0x5C81: 0xCBEA, - 0x5C82: 0xC6F1, - 0x5C83: 0x8CE8, - 0x5C84: 0x8CE9, - 0x5C85: 0x8CEA, - 0x5C86: 0x8CEB, - 0x5C87: 0x8CEC, - 0x5C88: 0xE1AC, - 0x5C89: 0x8CED, - 0x5C8A: 0x8CEE, - 0x5C8B: 0x8CEF, - 0x5C8C: 0xE1A7, - 0x5C8D: 0xE1A9, - 0x5C8E: 0x8CF0, - 0x5C8F: 0x8CF1, - 0x5C90: 0xE1AA, - 0x5C91: 0xE1AF, - 0x5C92: 0x8CF2, - 0x5C93: 0x8CF3, - 0x5C94: 0xB2ED, - 0x5C95: 0x8CF4, - 0x5C96: 0xE1AB, - 0x5C97: 0xB8DA, - 0x5C98: 0xE1AD, - 0x5C99: 0xE1AE, - 0x5C9A: 0xE1B0, - 0x5C9B: 0xB5BA, - 0x5C9C: 0xE1B1, - 0x5C9D: 0x8CF5, - 0x5C9E: 0x8CF6, - 0x5C9F: 0x8CF7, - 0x5CA0: 0x8CF8, - 0x5CA1: 0x8CF9, - 0x5CA2: 0xE1B3, - 0x5CA3: 0xE1B8, - 0x5CA4: 0x8CFA, - 0x5CA5: 0x8CFB, - 0x5CA6: 0x8CFC, - 0x5CA7: 0x8CFD, - 0x5CA8: 0x8CFE, - 0x5CA9: 0xD1D2, - 0x5CAA: 0x8D40, - 0x5CAB: 0xE1B6, - 0x5CAC: 0xE1B5, - 0x5CAD: 0xC1EB, - 0x5CAE: 0x8D41, - 0x5CAF: 0x8D42, - 0x5CB0: 0x8D43, - 0x5CB1: 0xE1B7, - 0x5CB2: 0x8D44, - 0x5CB3: 0xD4C0, - 0x5CB4: 0x8D45, - 0x5CB5: 0xE1B2, - 0x5CB6: 0x8D46, - 0x5CB7: 0xE1BA, - 0x5CB8: 0xB0B6, - 0x5CB9: 0x8D47, - 0x5CBA: 0x8D48, - 0x5CBB: 0x8D49, - 0x5CBC: 0x8D4A, - 0x5CBD: 0xE1B4, - 0x5CBE: 0x8D4B, - 0x5CBF: 0xBFF9, - 0x5CC0: 0x8D4C, - 0x5CC1: 0xE1B9, - 0x5CC2: 0x8D4D, - 0x5CC3: 0x8D4E, - 0x5CC4: 0xE1BB, - 0x5CC5: 0x8D4F, - 0x5CC6: 0x8D50, - 0x5CC7: 0x8D51, - 0x5CC8: 0x8D52, - 0x5CC9: 0x8D53, - 0x5CCA: 0x8D54, - 0x5CCB: 0xE1BE, - 0x5CCC: 0x8D55, - 0x5CCD: 0x8D56, - 0x5CCE: 0x8D57, - 0x5CCF: 0x8D58, - 0x5CD0: 0x8D59, - 0x5CD1: 0x8D5A, - 0x5CD2: 0xE1BC, - 0x5CD3: 0x8D5B, - 0x5CD4: 0x8D5C, - 0x5CD5: 0x8D5D, - 0x5CD6: 0x8D5E, - 0x5CD7: 0x8D5F, - 0x5CD8: 0x8D60, - 0x5CD9: 0xD6C5, - 0x5CDA: 0x8D61, - 0x5CDB: 0x8D62, - 0x5CDC: 0x8D63, - 0x5CDD: 0x8D64, - 0x5CDE: 0x8D65, - 0x5CDF: 0x8D66, - 0x5CE0: 0x8D67, - 0x5CE1: 0xCFBF, - 0x5CE2: 0x8D68, - 0x5CE3: 0x8D69, - 0x5CE4: 0xE1BD, - 0x5CE5: 0xE1BF, - 0x5CE6: 0xC2CD, - 0x5CE7: 0x8D6A, - 0x5CE8: 0xB6EB, - 0x5CE9: 0x8D6B, - 0x5CEA: 0xD3F8, - 0x5CEB: 0x8D6C, - 0x5CEC: 0x8D6D, - 0x5CED: 0xC7CD, - 0x5CEE: 0x8D6E, - 0x5CEF: 0x8D6F, - 0x5CF0: 0xB7E5, - 0x5CF1: 0x8D70, - 0x5CF2: 0x8D71, - 0x5CF3: 0x8D72, - 0x5CF4: 0x8D73, - 0x5CF5: 0x8D74, - 0x5CF6: 0x8D75, - 0x5CF7: 0x8D76, - 0x5CF8: 0x8D77, - 0x5CF9: 0x8D78, - 0x5CFA: 0x8D79, - 0x5CFB: 0xBEFE, - 0x5CFC: 0x8D7A, - 0x5CFD: 0x8D7B, - 0x5CFE: 0x8D7C, - 0x5CFF: 0x8D7D, - 0x5D00: 0x8D7E, - 0x5D01: 0x8D80, - 0x5D02: 0xE1C0, - 0x5D03: 0xE1C1, - 0x5D04: 0x8D81, - 0x5D05: 0x8D82, - 0x5D06: 0xE1C7, - 0x5D07: 0xB3E7, - 0x5D08: 0x8D83, - 0x5D09: 0x8D84, - 0x5D0A: 0x8D85, - 0x5D0B: 0x8D86, - 0x5D0C: 0x8D87, - 0x5D0D: 0x8D88, - 0x5D0E: 0xC6E9, - 0x5D0F: 0x8D89, - 0x5D10: 0x8D8A, - 0x5D11: 0x8D8B, - 0x5D12: 0x8D8C, - 0x5D13: 0x8D8D, - 0x5D14: 0xB4DE, - 0x5D15: 0x8D8E, - 0x5D16: 0xD1C2, - 0x5D17: 0x8D8F, - 0x5D18: 0x8D90, - 0x5D19: 0x8D91, - 0x5D1A: 0x8D92, - 0x5D1B: 0xE1C8, - 0x5D1C: 0x8D93, - 0x5D1D: 0x8D94, - 0x5D1E: 0xE1C6, - 0x5D1F: 0x8D95, - 0x5D20: 0x8D96, - 0x5D21: 0x8D97, - 0x5D22: 0x8D98, - 0x5D23: 0x8D99, - 0x5D24: 0xE1C5, - 0x5D25: 0x8D9A, - 0x5D26: 0xE1C3, - 0x5D27: 0xE1C2, - 0x5D28: 0x8D9B, - 0x5D29: 0xB1C0, - 0x5D2A: 0x8D9C, - 0x5D2B: 0x8D9D, - 0x5D2C: 0x8D9E, - 0x5D2D: 0xD5B8, - 0x5D2E: 0xE1C4, - 0x5D2F: 0x8D9F, - 0x5D30: 0x8DA0, - 0x5D31: 0x8DA1, - 0x5D32: 0x8DA2, - 0x5D33: 0x8DA3, - 0x5D34: 0xE1CB, - 0x5D35: 0x8DA4, - 0x5D36: 0x8DA5, - 0x5D37: 0x8DA6, - 0x5D38: 0x8DA7, - 0x5D39: 0x8DA8, - 0x5D3A: 0x8DA9, - 0x5D3B: 0x8DAA, - 0x5D3C: 0x8DAB, - 0x5D3D: 0xE1CC, - 0x5D3E: 0xE1CA, - 0x5D3F: 0x8DAC, - 0x5D40: 0x8DAD, - 0x5D41: 0x8DAE, - 0x5D42: 0x8DAF, - 0x5D43: 0x8DB0, - 0x5D44: 0x8DB1, - 0x5D45: 0x8DB2, - 0x5D46: 0x8DB3, - 0x5D47: 0xEFFA, - 0x5D48: 0x8DB4, - 0x5D49: 0x8DB5, - 0x5D4A: 0xE1D3, - 0x5D4B: 0xE1D2, - 0x5D4C: 0xC7B6, - 0x5D4D: 0x8DB6, - 0x5D4E: 0x8DB7, - 0x5D4F: 0x8DB8, - 0x5D50: 0x8DB9, - 0x5D51: 0x8DBA, - 0x5D52: 0x8DBB, - 0x5D53: 0x8DBC, - 0x5D54: 0x8DBD, - 0x5D55: 0x8DBE, - 0x5D56: 0x8DBF, - 0x5D57: 0x8DC0, - 0x5D58: 0xE1C9, - 0x5D59: 0x8DC1, - 0x5D5A: 0x8DC2, - 0x5D5B: 0xE1CE, - 0x5D5C: 0x8DC3, - 0x5D5D: 0xE1D0, - 0x5D5E: 0x8DC4, - 0x5D5F: 0x8DC5, - 0x5D60: 0x8DC6, - 0x5D61: 0x8DC7, - 0x5D62: 0x8DC8, - 0x5D63: 0x8DC9, - 0x5D64: 0x8DCA, - 0x5D65: 0x8DCB, - 0x5D66: 0x8DCC, - 0x5D67: 0x8DCD, - 0x5D68: 0x8DCE, - 0x5D69: 0xE1D4, - 0x5D6A: 0x8DCF, - 0x5D6B: 0xE1D1, - 0x5D6C: 0xE1CD, - 0x5D6D: 0x8DD0, - 0x5D6E: 0x8DD1, - 0x5D6F: 0xE1CF, - 0x5D70: 0x8DD2, - 0x5D71: 0x8DD3, - 0x5D72: 0x8DD4, - 0x5D73: 0x8DD5, - 0x5D74: 0xE1D5, - 0x5D75: 0x8DD6, - 0x5D76: 0x8DD7, - 0x5D77: 0x8DD8, - 0x5D78: 0x8DD9, - 0x5D79: 0x8DDA, - 0x5D7A: 0x8DDB, - 0x5D7B: 0x8DDC, - 0x5D7C: 0x8DDD, - 0x5D7D: 0x8DDE, - 0x5D7E: 0x8DDF, - 0x5D7F: 0x8DE0, - 0x5D80: 0x8DE1, - 0x5D81: 0x8DE2, - 0x5D82: 0xE1D6, - 0x5D83: 0x8DE3, - 0x5D84: 0x8DE4, - 0x5D85: 0x8DE5, - 0x5D86: 0x8DE6, - 0x5D87: 0x8DE7, - 0x5D88: 0x8DE8, - 0x5D89: 0x8DE9, - 0x5D8A: 0x8DEA, - 0x5D8B: 0x8DEB, - 0x5D8C: 0x8DEC, - 0x5D8D: 0x8DED, - 0x5D8E: 0x8DEE, - 0x5D8F: 0x8DEF, - 0x5D90: 0x8DF0, - 0x5D91: 0x8DF1, - 0x5D92: 0x8DF2, - 0x5D93: 0x8DF3, - 0x5D94: 0x8DF4, - 0x5D95: 0x8DF5, - 0x5D96: 0x8DF6, - 0x5D97: 0x8DF7, - 0x5D98: 0x8DF8, - 0x5D99: 0xE1D7, - 0x5D9A: 0x8DF9, - 0x5D9B: 0x8DFA, - 0x5D9C: 0x8DFB, - 0x5D9D: 0xE1D8, - 0x5D9E: 0x8DFC, - 0x5D9F: 0x8DFD, - 0x5DA0: 0x8DFE, - 0x5DA1: 0x8E40, - 0x5DA2: 0x8E41, - 0x5DA3: 0x8E42, - 0x5DA4: 0x8E43, - 0x5DA5: 0x8E44, - 0x5DA6: 0x8E45, - 0x5DA7: 0x8E46, - 0x5DA8: 0x8E47, - 0x5DA9: 0x8E48, - 0x5DAA: 0x8E49, - 0x5DAB: 0x8E4A, - 0x5DAC: 0x8E4B, - 0x5DAD: 0x8E4C, - 0x5DAE: 0x8E4D, - 0x5DAF: 0x8E4E, - 0x5DB0: 0x8E4F, - 0x5DB1: 0x8E50, - 0x5DB2: 0x8E51, - 0x5DB3: 0x8E52, - 0x5DB4: 0x8E53, - 0x5DB5: 0x8E54, - 0x5DB6: 0x8E55, - 0x5DB7: 0xE1DA, - 0x5DB8: 0x8E56, - 0x5DB9: 0x8E57, - 0x5DBA: 0x8E58, - 0x5DBB: 0x8E59, - 0x5DBC: 0x8E5A, - 0x5DBD: 0x8E5B, - 0x5DBE: 0x8E5C, - 0x5DBF: 0x8E5D, - 0x5DC0: 0x8E5E, - 0x5DC1: 0x8E5F, - 0x5DC2: 0x8E60, - 0x5DC3: 0x8E61, - 0x5DC4: 0x8E62, - 0x5DC5: 0xE1DB, - 0x5DC6: 0x8E63, - 0x5DC7: 0x8E64, - 0x5DC8: 0x8E65, - 0x5DC9: 0x8E66, - 0x5DCA: 0x8E67, - 0x5DCB: 0x8E68, - 0x5DCC: 0x8E69, - 0x5DCD: 0xCEA1, - 0x5DCE: 0x8E6A, - 0x5DCF: 0x8E6B, - 0x5DD0: 0x8E6C, - 0x5DD1: 0x8E6D, - 0x5DD2: 0x8E6E, - 0x5DD3: 0x8E6F, - 0x5DD4: 0x8E70, - 0x5DD5: 0x8E71, - 0x5DD6: 0x8E72, - 0x5DD7: 0x8E73, - 0x5DD8: 0x8E74, - 0x5DD9: 0x8E75, - 0x5DDA: 0x8E76, - 0x5DDB: 0xE7DD, - 0x5DDC: 0x8E77, - 0x5DDD: 0xB4A8, - 0x5DDE: 0xD6DD, - 0x5DDF: 0x8E78, - 0x5DE0: 0x8E79, - 0x5DE1: 0xD1B2, - 0x5DE2: 0xB3B2, - 0x5DE3: 0x8E7A, - 0x5DE4: 0x8E7B, - 0x5DE5: 0xB9A4, - 0x5DE6: 0xD7F3, - 0x5DE7: 0xC7C9, - 0x5DE8: 0xBEDE, - 0x5DE9: 0xB9AE, - 0x5DEA: 0x8E7C, - 0x5DEB: 0xCED7, - 0x5DEC: 0x8E7D, - 0x5DED: 0x8E7E, - 0x5DEE: 0xB2EE, - 0x5DEF: 0xDBCF, - 0x5DF0: 0x8E80, - 0x5DF1: 0xBCBA, - 0x5DF2: 0xD2D1, - 0x5DF3: 0xCBC8, - 0x5DF4: 0xB0CD, - 0x5DF5: 0x8E81, - 0x5DF6: 0x8E82, - 0x5DF7: 0xCFEF, - 0x5DF8: 0x8E83, - 0x5DF9: 0x8E84, - 0x5DFA: 0x8E85, - 0x5DFB: 0x8E86, - 0x5DFC: 0x8E87, - 0x5DFD: 0xD9E3, - 0x5DFE: 0xBDED, - 0x5DFF: 0x8E88, - 0x5E00: 0x8E89, - 0x5E01: 0xB1D2, - 0x5E02: 0xCAD0, - 0x5E03: 0xB2BC, - 0x5E04: 0x8E8A, - 0x5E05: 0xCBA7, - 0x5E06: 0xB7AB, - 0x5E07: 0x8E8B, - 0x5E08: 0xCAA6, - 0x5E09: 0x8E8C, - 0x5E0A: 0x8E8D, - 0x5E0B: 0x8E8E, - 0x5E0C: 0xCFA3, - 0x5E0D: 0x8E8F, - 0x5E0E: 0x8E90, - 0x5E0F: 0xE0F8, - 0x5E10: 0xD5CA, - 0x5E11: 0xE0FB, - 0x5E12: 0x8E91, - 0x5E13: 0x8E92, - 0x5E14: 0xE0FA, - 0x5E15: 0xC5C1, - 0x5E16: 0xCCFB, - 0x5E17: 0x8E93, - 0x5E18: 0xC1B1, - 0x5E19: 0xE0F9, - 0x5E1A: 0xD6E3, - 0x5E1B: 0xB2AF, - 0x5E1C: 0xD6C4, - 0x5E1D: 0xB5DB, - 0x5E1E: 0x8E94, - 0x5E1F: 0x8E95, - 0x5E20: 0x8E96, - 0x5E21: 0x8E97, - 0x5E22: 0x8E98, - 0x5E23: 0x8E99, - 0x5E24: 0x8E9A, - 0x5E25: 0x8E9B, - 0x5E26: 0xB4F8, - 0x5E27: 0xD6A1, - 0x5E28: 0x8E9C, - 0x5E29: 0x8E9D, - 0x5E2A: 0x8E9E, - 0x5E2B: 0x8E9F, - 0x5E2C: 0x8EA0, - 0x5E2D: 0xCFAF, - 0x5E2E: 0xB0EF, - 0x5E2F: 0x8EA1, - 0x5E30: 0x8EA2, - 0x5E31: 0xE0FC, - 0x5E32: 0x8EA3, - 0x5E33: 0x8EA4, - 0x5E34: 0x8EA5, - 0x5E35: 0x8EA6, - 0x5E36: 0x8EA7, - 0x5E37: 0xE1A1, - 0x5E38: 0xB3A3, - 0x5E39: 0x8EA8, - 0x5E3A: 0x8EA9, - 0x5E3B: 0xE0FD, - 0x5E3C: 0xE0FE, - 0x5E3D: 0xC3B1, - 0x5E3E: 0x8EAA, - 0x5E3F: 0x8EAB, - 0x5E40: 0x8EAC, - 0x5E41: 0x8EAD, - 0x5E42: 0xC3DD, - 0x5E43: 0x8EAE, - 0x5E44: 0xE1A2, - 0x5E45: 0xB7F9, - 0x5E46: 0x8EAF, - 0x5E47: 0x8EB0, - 0x5E48: 0x8EB1, - 0x5E49: 0x8EB2, - 0x5E4A: 0x8EB3, - 0x5E4B: 0x8EB4, - 0x5E4C: 0xBBCF, - 0x5E4D: 0x8EB5, - 0x5E4E: 0x8EB6, - 0x5E4F: 0x8EB7, - 0x5E50: 0x8EB8, - 0x5E51: 0x8EB9, - 0x5E52: 0x8EBA, - 0x5E53: 0x8EBB, - 0x5E54: 0xE1A3, - 0x5E55: 0xC4BB, - 0x5E56: 0x8EBC, - 0x5E57: 0x8EBD, - 0x5E58: 0x8EBE, - 0x5E59: 0x8EBF, - 0x5E5A: 0x8EC0, - 0x5E5B: 0xE1A4, - 0x5E5C: 0x8EC1, - 0x5E5D: 0x8EC2, - 0x5E5E: 0xE1A5, - 0x5E5F: 0x8EC3, - 0x5E60: 0x8EC4, - 0x5E61: 0xE1A6, - 0x5E62: 0xB4B1, - 0x5E63: 0x8EC5, - 0x5E64: 0x8EC6, - 0x5E65: 0x8EC7, - 0x5E66: 0x8EC8, - 0x5E67: 0x8EC9, - 0x5E68: 0x8ECA, - 0x5E69: 0x8ECB, - 0x5E6A: 0x8ECC, - 0x5E6B: 0x8ECD, - 0x5E6C: 0x8ECE, - 0x5E6D: 0x8ECF, - 0x5E6E: 0x8ED0, - 0x5E6F: 0x8ED1, - 0x5E70: 0x8ED2, - 0x5E71: 0x8ED3, - 0x5E72: 0xB8C9, - 0x5E73: 0xC6BD, - 0x5E74: 0xC4EA, - 0x5E75: 0x8ED4, - 0x5E76: 0xB2A2, - 0x5E77: 0x8ED5, - 0x5E78: 0xD0D2, - 0x5E79: 0x8ED6, - 0x5E7A: 0xE7DB, - 0x5E7B: 0xBBC3, - 0x5E7C: 0xD3D7, - 0x5E7D: 0xD3C4, - 0x5E7E: 0x8ED7, - 0x5E7F: 0xB9E3, - 0x5E80: 0xE2CF, - 0x5E81: 0x8ED8, - 0x5E82: 0x8ED9, - 0x5E83: 0x8EDA, - 0x5E84: 0xD7AF, - 0x5E85: 0x8EDB, - 0x5E86: 0xC7EC, - 0x5E87: 0xB1D3, - 0x5E88: 0x8EDC, - 0x5E89: 0x8EDD, - 0x5E8A: 0xB4B2, - 0x5E8B: 0xE2D1, - 0x5E8C: 0x8EDE, - 0x5E8D: 0x8EDF, - 0x5E8E: 0x8EE0, - 0x5E8F: 0xD0F2, - 0x5E90: 0xC2AE, - 0x5E91: 0xE2D0, - 0x5E92: 0x8EE1, - 0x5E93: 0xBFE2, - 0x5E94: 0xD3A6, - 0x5E95: 0xB5D7, - 0x5E96: 0xE2D2, - 0x5E97: 0xB5EA, - 0x5E98: 0x8EE2, - 0x5E99: 0xC3ED, - 0x5E9A: 0xB8FD, - 0x5E9B: 0x8EE3, - 0x5E9C: 0xB8AE, - 0x5E9D: 0x8EE4, - 0x5E9E: 0xC5D3, - 0x5E9F: 0xB7CF, - 0x5EA0: 0xE2D4, - 0x5EA1: 0x8EE5, - 0x5EA2: 0x8EE6, - 0x5EA3: 0x8EE7, - 0x5EA4: 0x8EE8, - 0x5EA5: 0xE2D3, - 0x5EA6: 0xB6C8, - 0x5EA7: 0xD7F9, - 0x5EA8: 0x8EE9, - 0x5EA9: 0x8EEA, - 0x5EAA: 0x8EEB, - 0x5EAB: 0x8EEC, - 0x5EAC: 0x8EED, - 0x5EAD: 0xCDA5, - 0x5EAE: 0x8EEE, - 0x5EAF: 0x8EEF, - 0x5EB0: 0x8EF0, - 0x5EB1: 0x8EF1, - 0x5EB2: 0x8EF2, - 0x5EB3: 0xE2D8, - 0x5EB4: 0x8EF3, - 0x5EB5: 0xE2D6, - 0x5EB6: 0xCAFC, - 0x5EB7: 0xBFB5, - 0x5EB8: 0xD3B9, - 0x5EB9: 0xE2D5, - 0x5EBA: 0x8EF4, - 0x5EBB: 0x8EF5, - 0x5EBC: 0x8EF6, - 0x5EBD: 0x8EF7, - 0x5EBE: 0xE2D7, - 0x5EBF: 0x8EF8, - 0x5EC0: 0x8EF9, - 0x5EC1: 0x8EFA, - 0x5EC2: 0x8EFB, - 0x5EC3: 0x8EFC, - 0x5EC4: 0x8EFD, - 0x5EC5: 0x8EFE, - 0x5EC6: 0x8F40, - 0x5EC7: 0x8F41, - 0x5EC8: 0x8F42, - 0x5EC9: 0xC1AE, - 0x5ECA: 0xC0C8, - 0x5ECB: 0x8F43, - 0x5ECC: 0x8F44, - 0x5ECD: 0x8F45, - 0x5ECE: 0x8F46, - 0x5ECF: 0x8F47, - 0x5ED0: 0x8F48, - 0x5ED1: 0xE2DB, - 0x5ED2: 0xE2DA, - 0x5ED3: 0xC0AA, - 0x5ED4: 0x8F49, - 0x5ED5: 0x8F4A, - 0x5ED6: 0xC1CE, - 0x5ED7: 0x8F4B, - 0x5ED8: 0x8F4C, - 0x5ED9: 0x8F4D, - 0x5EDA: 0x8F4E, - 0x5EDB: 0xE2DC, - 0x5EDC: 0x8F4F, - 0x5EDD: 0x8F50, - 0x5EDE: 0x8F51, - 0x5EDF: 0x8F52, - 0x5EE0: 0x8F53, - 0x5EE1: 0x8F54, - 0x5EE2: 0x8F55, - 0x5EE3: 0x8F56, - 0x5EE4: 0x8F57, - 0x5EE5: 0x8F58, - 0x5EE6: 0x8F59, - 0x5EE7: 0x8F5A, - 0x5EE8: 0xE2DD, - 0x5EE9: 0x8F5B, - 0x5EEA: 0xE2DE, - 0x5EEB: 0x8F5C, - 0x5EEC: 0x8F5D, - 0x5EED: 0x8F5E, - 0x5EEE: 0x8F5F, - 0x5EEF: 0x8F60, - 0x5EF0: 0x8F61, - 0x5EF1: 0x8F62, - 0x5EF2: 0x8F63, - 0x5EF3: 0x8F64, - 0x5EF4: 0xDBC8, - 0x5EF5: 0x8F65, - 0x5EF6: 0xD1D3, - 0x5EF7: 0xCDA2, - 0x5EF8: 0x8F66, - 0x5EF9: 0x8F67, - 0x5EFA: 0xBDA8, - 0x5EFB: 0x8F68, - 0x5EFC: 0x8F69, - 0x5EFD: 0x8F6A, - 0x5EFE: 0xDEC3, - 0x5EFF: 0xD8A5, - 0x5F00: 0xBFAA, - 0x5F01: 0xDBCD, - 0x5F02: 0xD2EC, - 0x5F03: 0xC6FA, - 0x5F04: 0xC5AA, - 0x5F05: 0x8F6B, - 0x5F06: 0x8F6C, - 0x5F07: 0x8F6D, - 0x5F08: 0xDEC4, - 0x5F09: 0x8F6E, - 0x5F0A: 0xB1D7, - 0x5F0B: 0xDFAE, - 0x5F0C: 0x8F6F, - 0x5F0D: 0x8F70, - 0x5F0E: 0x8F71, - 0x5F0F: 0xCABD, - 0x5F10: 0x8F72, - 0x5F11: 0xDFB1, - 0x5F12: 0x8F73, - 0x5F13: 0xB9AD, - 0x5F14: 0x8F74, - 0x5F15: 0xD2FD, - 0x5F16: 0x8F75, - 0x5F17: 0xB8A5, - 0x5F18: 0xBAEB, - 0x5F19: 0x8F76, - 0x5F1A: 0x8F77, - 0x5F1B: 0xB3DA, - 0x5F1C: 0x8F78, - 0x5F1D: 0x8F79, - 0x5F1E: 0x8F7A, - 0x5F1F: 0xB5DC, - 0x5F20: 0xD5C5, - 0x5F21: 0x8F7B, - 0x5F22: 0x8F7C, - 0x5F23: 0x8F7D, - 0x5F24: 0x8F7E, - 0x5F25: 0xC3D6, - 0x5F26: 0xCFD2, - 0x5F27: 0xBBA1, - 0x5F28: 0x8F80, - 0x5F29: 0xE5F3, - 0x5F2A: 0xE5F2, - 0x5F2B: 0x8F81, - 0x5F2C: 0x8F82, - 0x5F2D: 0xE5F4, - 0x5F2E: 0x8F83, - 0x5F2F: 0xCDE4, - 0x5F30: 0x8F84, - 0x5F31: 0xC8F5, - 0x5F32: 0x8F85, - 0x5F33: 0x8F86, - 0x5F34: 0x8F87, - 0x5F35: 0x8F88, - 0x5F36: 0x8F89, - 0x5F37: 0x8F8A, - 0x5F38: 0x8F8B, - 0x5F39: 0xB5AF, - 0x5F3A: 0xC7BF, - 0x5F3B: 0x8F8C, - 0x5F3C: 0xE5F6, - 0x5F3D: 0x8F8D, - 0x5F3E: 0x8F8E, - 0x5F3F: 0x8F8F, - 0x5F40: 0xECB0, - 0x5F41: 0x8F90, - 0x5F42: 0x8F91, - 0x5F43: 0x8F92, - 0x5F44: 0x8F93, - 0x5F45: 0x8F94, - 0x5F46: 0x8F95, - 0x5F47: 0x8F96, - 0x5F48: 0x8F97, - 0x5F49: 0x8F98, - 0x5F4A: 0x8F99, - 0x5F4B: 0x8F9A, - 0x5F4C: 0x8F9B, - 0x5F4D: 0x8F9C, - 0x5F4E: 0x8F9D, - 0x5F4F: 0x8F9E, - 0x5F50: 0xE5E6, - 0x5F51: 0x8F9F, - 0x5F52: 0xB9E9, - 0x5F53: 0xB5B1, - 0x5F54: 0x8FA0, - 0x5F55: 0xC2BC, - 0x5F56: 0xE5E8, - 0x5F57: 0xE5E7, - 0x5F58: 0xE5E9, - 0x5F59: 0x8FA1, - 0x5F5A: 0x8FA2, - 0x5F5B: 0x8FA3, - 0x5F5C: 0x8FA4, - 0x5F5D: 0xD2CD, - 0x5F5E: 0x8FA5, - 0x5F5F: 0x8FA6, - 0x5F60: 0x8FA7, - 0x5F61: 0xE1EA, - 0x5F62: 0xD0CE, - 0x5F63: 0x8FA8, - 0x5F64: 0xCDAE, - 0x5F65: 0x8FA9, - 0x5F66: 0xD1E5, - 0x5F67: 0x8FAA, - 0x5F68: 0x8FAB, - 0x5F69: 0xB2CA, - 0x5F6A: 0xB1EB, - 0x5F6B: 0x8FAC, - 0x5F6C: 0xB1F2, - 0x5F6D: 0xC5ED, - 0x5F6E: 0x8FAD, - 0x5F6F: 0x8FAE, - 0x5F70: 0xD5C3, - 0x5F71: 0xD3B0, - 0x5F72: 0x8FAF, - 0x5F73: 0xE1DC, - 0x5F74: 0x8FB0, - 0x5F75: 0x8FB1, - 0x5F76: 0x8FB2, - 0x5F77: 0xE1DD, - 0x5F78: 0x8FB3, - 0x5F79: 0xD2DB, - 0x5F7A: 0x8FB4, - 0x5F7B: 0xB3B9, - 0x5F7C: 0xB1CB, - 0x5F7D: 0x8FB5, - 0x5F7E: 0x8FB6, - 0x5F7F: 0x8FB7, - 0x5F80: 0xCDF9, - 0x5F81: 0xD5F7, - 0x5F82: 0xE1DE, - 0x5F83: 0x8FB8, - 0x5F84: 0xBEB6, - 0x5F85: 0xB4FD, - 0x5F86: 0x8FB9, - 0x5F87: 0xE1DF, - 0x5F88: 0xBADC, - 0x5F89: 0xE1E0, - 0x5F8A: 0xBBB2, - 0x5F8B: 0xC2C9, - 0x5F8C: 0xE1E1, - 0x5F8D: 0x8FBA, - 0x5F8E: 0x8FBB, - 0x5F8F: 0x8FBC, - 0x5F90: 0xD0EC, - 0x5F91: 0x8FBD, - 0x5F92: 0xCDBD, - 0x5F93: 0x8FBE, - 0x5F94: 0x8FBF, - 0x5F95: 0xE1E2, - 0x5F96: 0x8FC0, - 0x5F97: 0xB5C3, - 0x5F98: 0xC5C7, - 0x5F99: 0xE1E3, - 0x5F9A: 0x8FC1, - 0x5F9B: 0x8FC2, - 0x5F9C: 0xE1E4, - 0x5F9D: 0x8FC3, - 0x5F9E: 0x8FC4, - 0x5F9F: 0x8FC5, - 0x5FA0: 0x8FC6, - 0x5FA1: 0xD3F9, - 0x5FA2: 0x8FC7, - 0x5FA3: 0x8FC8, - 0x5FA4: 0x8FC9, - 0x5FA5: 0x8FCA, - 0x5FA6: 0x8FCB, - 0x5FA7: 0x8FCC, - 0x5FA8: 0xE1E5, - 0x5FA9: 0x8FCD, - 0x5FAA: 0xD1AD, - 0x5FAB: 0x8FCE, - 0x5FAC: 0x8FCF, - 0x5FAD: 0xE1E6, - 0x5FAE: 0xCEA2, - 0x5FAF: 0x8FD0, - 0x5FB0: 0x8FD1, - 0x5FB1: 0x8FD2, - 0x5FB2: 0x8FD3, - 0x5FB3: 0x8FD4, - 0x5FB4: 0x8FD5, - 0x5FB5: 0xE1E7, - 0x5FB6: 0x8FD6, - 0x5FB7: 0xB5C2, - 0x5FB8: 0x8FD7, - 0x5FB9: 0x8FD8, - 0x5FBA: 0x8FD9, - 0x5FBB: 0x8FDA, - 0x5FBC: 0xE1E8, - 0x5FBD: 0xBBD5, - 0x5FBE: 0x8FDB, - 0x5FBF: 0x8FDC, - 0x5FC0: 0x8FDD, - 0x5FC1: 0x8FDE, - 0x5FC2: 0x8FDF, - 0x5FC3: 0xD0C4, - 0x5FC4: 0xE2E0, - 0x5FC5: 0xB1D8, - 0x5FC6: 0xD2E4, - 0x5FC7: 0x8FE0, - 0x5FC8: 0x8FE1, - 0x5FC9: 0xE2E1, - 0x5FCA: 0x8FE2, - 0x5FCB: 0x8FE3, - 0x5FCC: 0xBCC9, - 0x5FCD: 0xC8CC, - 0x5FCE: 0x8FE4, - 0x5FCF: 0xE2E3, - 0x5FD0: 0xECFE, - 0x5FD1: 0xECFD, - 0x5FD2: 0xDFAF, - 0x5FD3: 0x8FE5, - 0x5FD4: 0x8FE6, - 0x5FD5: 0x8FE7, - 0x5FD6: 0xE2E2, - 0x5FD7: 0xD6BE, - 0x5FD8: 0xCDFC, - 0x5FD9: 0xC3A6, - 0x5FDA: 0x8FE8, - 0x5FDB: 0x8FE9, - 0x5FDC: 0x8FEA, - 0x5FDD: 0xE3C3, - 0x5FDE: 0x8FEB, - 0x5FDF: 0x8FEC, - 0x5FE0: 0xD6D2, - 0x5FE1: 0xE2E7, - 0x5FE2: 0x8FED, - 0x5FE3: 0x8FEE, - 0x5FE4: 0xE2E8, - 0x5FE5: 0x8FEF, - 0x5FE6: 0x8FF0, - 0x5FE7: 0xD3C7, - 0x5FE8: 0x8FF1, - 0x5FE9: 0x8FF2, - 0x5FEA: 0xE2EC, - 0x5FEB: 0xBFEC, - 0x5FEC: 0x8FF3, - 0x5FED: 0xE2ED, - 0x5FEE: 0xE2E5, - 0x5FEF: 0x8FF4, - 0x5FF0: 0x8FF5, - 0x5FF1: 0xB3C0, - 0x5FF2: 0x8FF6, - 0x5FF3: 0x8FF7, - 0x5FF4: 0x8FF8, - 0x5FF5: 0xC4EE, - 0x5FF6: 0x8FF9, - 0x5FF7: 0x8FFA, - 0x5FF8: 0xE2EE, - 0x5FF9: 0x8FFB, - 0x5FFA: 0x8FFC, - 0x5FFB: 0xD0C3, - 0x5FFC: 0x8FFD, - 0x5FFD: 0xBAF6, - 0x5FFE: 0xE2E9, - 0x5FFF: 0xB7DE, - 0x6000: 0xBBB3, - 0x6001: 0xCCAC, - 0x6002: 0xCBCB, - 0x6003: 0xE2E4, - 0x6004: 0xE2E6, - 0x6005: 0xE2EA, - 0x6006: 0xE2EB, - 0x6007: 0x8FFE, - 0x6008: 0x9040, - 0x6009: 0x9041, - 0x600A: 0xE2F7, - 0x600B: 0x9042, - 0x600C: 0x9043, - 0x600D: 0xE2F4, - 0x600E: 0xD4F5, - 0x600F: 0xE2F3, - 0x6010: 0x9044, - 0x6011: 0x9045, - 0x6012: 0xC5AD, - 0x6013: 0x9046, - 0x6014: 0xD5FA, - 0x6015: 0xC5C2, - 0x6016: 0xB2C0, - 0x6017: 0x9047, - 0x6018: 0x9048, - 0x6019: 0xE2EF, - 0x601A: 0x9049, - 0x601B: 0xE2F2, - 0x601C: 0xC1AF, - 0x601D: 0xCBBC, - 0x601E: 0x904A, - 0x601F: 0x904B, - 0x6020: 0xB5A1, - 0x6021: 0xE2F9, - 0x6022: 0x904C, - 0x6023: 0x904D, - 0x6024: 0x904E, - 0x6025: 0xBCB1, - 0x6026: 0xE2F1, - 0x6027: 0xD0D4, - 0x6028: 0xD4B9, - 0x6029: 0xE2F5, - 0x602A: 0xB9D6, - 0x602B: 0xE2F6, - 0x602C: 0x904F, - 0x602D: 0x9050, - 0x602E: 0x9051, - 0x602F: 0xC7D3, - 0x6030: 0x9052, - 0x6031: 0x9053, - 0x6032: 0x9054, - 0x6033: 0x9055, - 0x6034: 0x9056, - 0x6035: 0xE2F0, - 0x6036: 0x9057, - 0x6037: 0x9058, - 0x6038: 0x9059, - 0x6039: 0x905A, - 0x603A: 0x905B, - 0x603B: 0xD7DC, - 0x603C: 0xEDA1, - 0x603D: 0x905C, - 0x603E: 0x905D, - 0x603F: 0xE2F8, - 0x6040: 0x905E, - 0x6041: 0xEDA5, - 0x6042: 0xE2FE, - 0x6043: 0xCAD1, - 0x6044: 0x905F, - 0x6045: 0x9060, - 0x6046: 0x9061, - 0x6047: 0x9062, - 0x6048: 0x9063, - 0x6049: 0x9064, - 0x604A: 0x9065, - 0x604B: 0xC1B5, - 0x604C: 0x9066, - 0x604D: 0xBBD0, - 0x604E: 0x9067, - 0x604F: 0x9068, - 0x6050: 0xBFD6, - 0x6051: 0x9069, - 0x6052: 0xBAE3, - 0x6053: 0x906A, - 0x6054: 0x906B, - 0x6055: 0xCBA1, - 0x6056: 0x906C, - 0x6057: 0x906D, - 0x6058: 0x906E, - 0x6059: 0xEDA6, - 0x605A: 0xEDA3, - 0x605B: 0x906F, - 0x605C: 0x9070, - 0x605D: 0xEDA2, - 0x605E: 0x9071, - 0x605F: 0x9072, - 0x6060: 0x9073, - 0x6061: 0x9074, - 0x6062: 0xBBD6, - 0x6063: 0xEDA7, - 0x6064: 0xD0F4, - 0x6065: 0x9075, - 0x6066: 0x9076, - 0x6067: 0xEDA4, - 0x6068: 0xBADE, - 0x6069: 0xB6F7, - 0x606A: 0xE3A1, - 0x606B: 0xB6B2, - 0x606C: 0xCCF1, - 0x606D: 0xB9A7, - 0x606E: 0x9077, - 0x606F: 0xCFA2, - 0x6070: 0xC7A1, - 0x6071: 0x9078, - 0x6072: 0x9079, - 0x6073: 0xBFD2, - 0x6074: 0x907A, - 0x6075: 0x907B, - 0x6076: 0xB6F1, - 0x6077: 0x907C, - 0x6078: 0xE2FA, - 0x6079: 0xE2FB, - 0x607A: 0xE2FD, - 0x607B: 0xE2FC, - 0x607C: 0xC4D5, - 0x607D: 0xE3A2, - 0x607E: 0x907D, - 0x607F: 0xD3C1, - 0x6080: 0x907E, - 0x6081: 0x9080, - 0x6082: 0x9081, - 0x6083: 0xE3A7, - 0x6084: 0xC7C4, - 0x6085: 0x9082, - 0x6086: 0x9083, - 0x6087: 0x9084, - 0x6088: 0x9085, - 0x6089: 0xCFA4, - 0x608A: 0x9086, - 0x608B: 0x9087, - 0x608C: 0xE3A9, - 0x608D: 0xBAB7, - 0x608E: 0x9088, - 0x608F: 0x9089, - 0x6090: 0x908A, - 0x6091: 0x908B, - 0x6092: 0xE3A8, - 0x6093: 0x908C, - 0x6094: 0xBBDA, - 0x6095: 0x908D, - 0x6096: 0xE3A3, - 0x6097: 0x908E, - 0x6098: 0x908F, - 0x6099: 0x9090, - 0x609A: 0xE3A4, - 0x609B: 0xE3AA, - 0x609C: 0x9091, - 0x609D: 0xE3A6, - 0x609E: 0x9092, - 0x609F: 0xCEF2, - 0x60A0: 0xD3C6, - 0x60A1: 0x9093, - 0x60A2: 0x9094, - 0x60A3: 0xBBBC, - 0x60A4: 0x9095, - 0x60A5: 0x9096, - 0x60A6: 0xD4C3, - 0x60A7: 0x9097, - 0x60A8: 0xC4FA, - 0x60A9: 0x9098, - 0x60AA: 0x9099, - 0x60AB: 0xEDA8, - 0x60AC: 0xD0FC, - 0x60AD: 0xE3A5, - 0x60AE: 0x909A, - 0x60AF: 0xC3F5, - 0x60B0: 0x909B, - 0x60B1: 0xE3AD, - 0x60B2: 0xB1AF, - 0x60B3: 0x909C, - 0x60B4: 0xE3B2, - 0x60B5: 0x909D, - 0x60B6: 0x909E, - 0x60B7: 0x909F, - 0x60B8: 0xBCC2, - 0x60B9: 0x90A0, - 0x60BA: 0x90A1, - 0x60BB: 0xE3AC, - 0x60BC: 0xB5BF, - 0x60BD: 0x90A2, - 0x60BE: 0x90A3, - 0x60BF: 0x90A4, - 0x60C0: 0x90A5, - 0x60C1: 0x90A6, - 0x60C2: 0x90A7, - 0x60C3: 0x90A8, - 0x60C4: 0x90A9, - 0x60C5: 0xC7E9, - 0x60C6: 0xE3B0, - 0x60C7: 0x90AA, - 0x60C8: 0x90AB, - 0x60C9: 0x90AC, - 0x60CA: 0xBEAA, - 0x60CB: 0xCDEF, - 0x60CC: 0x90AD, - 0x60CD: 0x90AE, - 0x60CE: 0x90AF, - 0x60CF: 0x90B0, - 0x60D0: 0x90B1, - 0x60D1: 0xBBF3, - 0x60D2: 0x90B2, - 0x60D3: 0x90B3, - 0x60D4: 0x90B4, - 0x60D5: 0xCCE8, - 0x60D6: 0x90B5, - 0x60D7: 0x90B6, - 0x60D8: 0xE3AF, - 0x60D9: 0x90B7, - 0x60DA: 0xE3B1, - 0x60DB: 0x90B8, - 0x60DC: 0xCFA7, - 0x60DD: 0xE3AE, - 0x60DE: 0x90B9, - 0x60DF: 0xCEA9, - 0x60E0: 0xBBDD, - 0x60E1: 0x90BA, - 0x60E2: 0x90BB, - 0x60E3: 0x90BC, - 0x60E4: 0x90BD, - 0x60E5: 0x90BE, - 0x60E6: 0xB5EB, - 0x60E7: 0xBEE5, - 0x60E8: 0xB2D2, - 0x60E9: 0xB3CD, - 0x60EA: 0x90BF, - 0x60EB: 0xB1B9, - 0x60EC: 0xE3AB, - 0x60ED: 0xB2D1, - 0x60EE: 0xB5AC, - 0x60EF: 0xB9DF, - 0x60F0: 0xB6E8, - 0x60F1: 0x90C0, - 0x60F2: 0x90C1, - 0x60F3: 0xCFEB, - 0x60F4: 0xE3B7, - 0x60F5: 0x90C2, - 0x60F6: 0xBBCC, - 0x60F7: 0x90C3, - 0x60F8: 0x90C4, - 0x60F9: 0xC8C7, - 0x60FA: 0xD0CA, - 0x60FB: 0x90C5, - 0x60FC: 0x90C6, - 0x60FD: 0x90C7, - 0x60FE: 0x90C8, - 0x60FF: 0x90C9, - 0x6100: 0xE3B8, - 0x6101: 0xB3EE, - 0x6102: 0x90CA, - 0x6103: 0x90CB, - 0x6104: 0x90CC, - 0x6105: 0x90CD, - 0x6106: 0xEDA9, - 0x6107: 0x90CE, - 0x6108: 0xD3FA, - 0x6109: 0xD3E4, - 0x610A: 0x90CF, - 0x610B: 0x90D0, - 0x610C: 0x90D1, - 0x610D: 0xEDAA, - 0x610E: 0xE3B9, - 0x610F: 0xD2E2, - 0x6110: 0x90D2, - 0x6111: 0x90D3, - 0x6112: 0x90D4, - 0x6113: 0x90D5, - 0x6114: 0x90D6, - 0x6115: 0xE3B5, - 0x6116: 0x90D7, - 0x6117: 0x90D8, - 0x6118: 0x90D9, - 0x6119: 0x90DA, - 0x611A: 0xD3DE, - 0x611B: 0x90DB, - 0x611C: 0x90DC, - 0x611D: 0x90DD, - 0x611E: 0x90DE, - 0x611F: 0xB8D0, - 0x6120: 0xE3B3, - 0x6121: 0x90DF, - 0x6122: 0x90E0, - 0x6123: 0xE3B6, - 0x6124: 0xB7DF, - 0x6125: 0x90E1, - 0x6126: 0xE3B4, - 0x6127: 0xC0A2, - 0x6128: 0x90E2, - 0x6129: 0x90E3, - 0x612A: 0x90E4, - 0x612B: 0xE3BA, - 0x612C: 0x90E5, - 0x612D: 0x90E6, - 0x612E: 0x90E7, - 0x612F: 0x90E8, - 0x6130: 0x90E9, - 0x6131: 0x90EA, - 0x6132: 0x90EB, - 0x6133: 0x90EC, - 0x6134: 0x90ED, - 0x6135: 0x90EE, - 0x6136: 0x90EF, - 0x6137: 0x90F0, - 0x6138: 0x90F1, - 0x6139: 0x90F2, - 0x613A: 0x90F3, - 0x613B: 0x90F4, - 0x613C: 0x90F5, - 0x613D: 0x90F6, - 0x613E: 0x90F7, - 0x613F: 0xD4B8, - 0x6140: 0x90F8, - 0x6141: 0x90F9, - 0x6142: 0x90FA, - 0x6143: 0x90FB, - 0x6144: 0x90FC, - 0x6145: 0x90FD, - 0x6146: 0x90FE, - 0x6147: 0x9140, - 0x6148: 0xB4C8, - 0x6149: 0x9141, - 0x614A: 0xE3BB, - 0x614B: 0x9142, - 0x614C: 0xBBC5, - 0x614D: 0x9143, - 0x614E: 0xC9F7, - 0x614F: 0x9144, - 0x6150: 0x9145, - 0x6151: 0xC9E5, - 0x6152: 0x9146, - 0x6153: 0x9147, - 0x6154: 0x9148, - 0x6155: 0xC4BD, - 0x6156: 0x9149, - 0x6157: 0x914A, - 0x6158: 0x914B, - 0x6159: 0x914C, - 0x615A: 0x914D, - 0x615B: 0x914E, - 0x615C: 0x914F, - 0x615D: 0xEDAB, - 0x615E: 0x9150, - 0x615F: 0x9151, - 0x6160: 0x9152, - 0x6161: 0x9153, - 0x6162: 0xC2FD, - 0x6163: 0x9154, - 0x6164: 0x9155, - 0x6165: 0x9156, - 0x6166: 0x9157, - 0x6167: 0xBBDB, - 0x6168: 0xBFAE, - 0x6169: 0x9158, - 0x616A: 0x9159, - 0x616B: 0x915A, - 0x616C: 0x915B, - 0x616D: 0x915C, - 0x616E: 0x915D, - 0x616F: 0x915E, - 0x6170: 0xCEBF, - 0x6171: 0x915F, - 0x6172: 0x9160, - 0x6173: 0x9161, - 0x6174: 0x9162, - 0x6175: 0xE3BC, - 0x6176: 0x9163, - 0x6177: 0xBFB6, - 0x6178: 0x9164, - 0x6179: 0x9165, - 0x617A: 0x9166, - 0x617B: 0x9167, - 0x617C: 0x9168, - 0x617D: 0x9169, - 0x617E: 0x916A, - 0x617F: 0x916B, - 0x6180: 0x916C, - 0x6181: 0x916D, - 0x6182: 0x916E, - 0x6183: 0x916F, - 0x6184: 0x9170, - 0x6185: 0x9171, - 0x6186: 0x9172, - 0x6187: 0x9173, - 0x6188: 0x9174, - 0x6189: 0x9175, - 0x618A: 0x9176, - 0x618B: 0xB1EF, - 0x618C: 0x9177, - 0x618D: 0x9178, - 0x618E: 0xD4F7, - 0x618F: 0x9179, - 0x6190: 0x917A, - 0x6191: 0x917B, - 0x6192: 0x917C, - 0x6193: 0x917D, - 0x6194: 0xE3BE, - 0x6195: 0x917E, - 0x6196: 0x9180, - 0x6197: 0x9181, - 0x6198: 0x9182, - 0x6199: 0x9183, - 0x619A: 0x9184, - 0x619B: 0x9185, - 0x619C: 0x9186, - 0x619D: 0xEDAD, - 0x619E: 0x9187, - 0x619F: 0x9188, - 0x61A0: 0x9189, - 0x61A1: 0x918A, - 0x61A2: 0x918B, - 0x61A3: 0x918C, - 0x61A4: 0x918D, - 0x61A5: 0x918E, - 0x61A6: 0x918F, - 0x61A7: 0xE3BF, - 0x61A8: 0xBAA9, - 0x61A9: 0xEDAC, - 0x61AA: 0x9190, - 0x61AB: 0x9191, - 0x61AC: 0xE3BD, - 0x61AD: 0x9192, - 0x61AE: 0x9193, - 0x61AF: 0x9194, - 0x61B0: 0x9195, - 0x61B1: 0x9196, - 0x61B2: 0x9197, - 0x61B3: 0x9198, - 0x61B4: 0x9199, - 0x61B5: 0x919A, - 0x61B6: 0x919B, - 0x61B7: 0xE3C0, - 0x61B8: 0x919C, - 0x61B9: 0x919D, - 0x61BA: 0x919E, - 0x61BB: 0x919F, - 0x61BC: 0x91A0, - 0x61BD: 0x91A1, - 0x61BE: 0xBAB6, - 0x61BF: 0x91A2, - 0x61C0: 0x91A3, - 0x61C1: 0x91A4, - 0x61C2: 0xB6AE, - 0x61C3: 0x91A5, - 0x61C4: 0x91A6, - 0x61C5: 0x91A7, - 0x61C6: 0x91A8, - 0x61C7: 0x91A9, - 0x61C8: 0xD0B8, - 0x61C9: 0x91AA, - 0x61CA: 0xB0C3, - 0x61CB: 0xEDAE, - 0x61CC: 0x91AB, - 0x61CD: 0x91AC, - 0x61CE: 0x91AD, - 0x61CF: 0x91AE, - 0x61D0: 0x91AF, - 0x61D1: 0xEDAF, - 0x61D2: 0xC0C1, - 0x61D3: 0x91B0, - 0x61D4: 0xE3C1, - 0x61D5: 0x91B1, - 0x61D6: 0x91B2, - 0x61D7: 0x91B3, - 0x61D8: 0x91B4, - 0x61D9: 0x91B5, - 0x61DA: 0x91B6, - 0x61DB: 0x91B7, - 0x61DC: 0x91B8, - 0x61DD: 0x91B9, - 0x61DE: 0x91BA, - 0x61DF: 0x91BB, - 0x61E0: 0x91BC, - 0x61E1: 0x91BD, - 0x61E2: 0x91BE, - 0x61E3: 0x91BF, - 0x61E4: 0x91C0, - 0x61E5: 0x91C1, - 0x61E6: 0xC5B3, - 0x61E7: 0x91C2, - 0x61E8: 0x91C3, - 0x61E9: 0x91C4, - 0x61EA: 0x91C5, - 0x61EB: 0x91C6, - 0x61EC: 0x91C7, - 0x61ED: 0x91C8, - 0x61EE: 0x91C9, - 0x61EF: 0x91CA, - 0x61F0: 0x91CB, - 0x61F1: 0x91CC, - 0x61F2: 0x91CD, - 0x61F3: 0x91CE, - 0x61F4: 0x91CF, - 0x61F5: 0xE3C2, - 0x61F6: 0x91D0, - 0x61F7: 0x91D1, - 0x61F8: 0x91D2, - 0x61F9: 0x91D3, - 0x61FA: 0x91D4, - 0x61FB: 0x91D5, - 0x61FC: 0x91D6, - 0x61FD: 0x91D7, - 0x61FE: 0x91D8, - 0x61FF: 0xDCB2, - 0x6200: 0x91D9, - 0x6201: 0x91DA, - 0x6202: 0x91DB, - 0x6203: 0x91DC, - 0x6204: 0x91DD, - 0x6205: 0x91DE, - 0x6206: 0xEDB0, - 0x6207: 0x91DF, - 0x6208: 0xB8EA, - 0x6209: 0x91E0, - 0x620A: 0xCEEC, - 0x620B: 0xEAA7, - 0x620C: 0xD0E7, - 0x620D: 0xCAF9, - 0x620E: 0xC8D6, - 0x620F: 0xCFB7, - 0x6210: 0xB3C9, - 0x6211: 0xCED2, - 0x6212: 0xBDE4, - 0x6213: 0x91E1, - 0x6214: 0x91E2, - 0x6215: 0xE3DE, - 0x6216: 0xBBF2, - 0x6217: 0xEAA8, - 0x6218: 0xD5BD, - 0x6219: 0x91E3, - 0x621A: 0xC6DD, - 0x621B: 0xEAA9, - 0x621C: 0x91E4, - 0x621D: 0x91E5, - 0x621E: 0x91E6, - 0x621F: 0xEAAA, - 0x6220: 0x91E7, - 0x6221: 0xEAAC, - 0x6222: 0xEAAB, - 0x6223: 0x91E8, - 0x6224: 0xEAAE, - 0x6225: 0xEAAD, - 0x6226: 0x91E9, - 0x6227: 0x91EA, - 0x6228: 0x91EB, - 0x6229: 0x91EC, - 0x622A: 0xBDD8, - 0x622B: 0x91ED, - 0x622C: 0xEAAF, - 0x622D: 0x91EE, - 0x622E: 0xC2BE, - 0x622F: 0x91EF, - 0x6230: 0x91F0, - 0x6231: 0x91F1, - 0x6232: 0x91F2, - 0x6233: 0xB4C1, - 0x6234: 0xB4F7, - 0x6235: 0x91F3, - 0x6236: 0x91F4, - 0x6237: 0xBBA7, - 0x6238: 0x91F5, - 0x6239: 0x91F6, - 0x623A: 0x91F7, - 0x623B: 0x91F8, - 0x623C: 0x91F9, - 0x623D: 0xECE6, - 0x623E: 0xECE5, - 0x623F: 0xB7BF, - 0x6240: 0xCBF9, - 0x6241: 0xB1E2, - 0x6242: 0x91FA, - 0x6243: 0xECE7, - 0x6244: 0x91FB, - 0x6245: 0x91FC, - 0x6246: 0x91FD, - 0x6247: 0xC9C8, - 0x6248: 0xECE8, - 0x6249: 0xECE9, - 0x624A: 0x91FE, - 0x624B: 0xCAD6, - 0x624C: 0xDED0, - 0x624D: 0xB2C5, - 0x624E: 0xD4FA, - 0x624F: 0x9240, - 0x6250: 0x9241, - 0x6251: 0xC6CB, - 0x6252: 0xB0C7, - 0x6253: 0xB4F2, - 0x6254: 0xC8D3, - 0x6255: 0x9242, - 0x6256: 0x9243, - 0x6257: 0x9244, - 0x6258: 0xCDD0, - 0x6259: 0x9245, - 0x625A: 0x9246, - 0x625B: 0xBFB8, - 0x625C: 0x9247, - 0x625D: 0x9248, - 0x625E: 0x9249, - 0x625F: 0x924A, - 0x6260: 0x924B, - 0x6261: 0x924C, - 0x6262: 0x924D, - 0x6263: 0xBFDB, - 0x6264: 0x924E, - 0x6265: 0x924F, - 0x6266: 0xC7A4, - 0x6267: 0xD6B4, - 0x6268: 0x9250, - 0x6269: 0xC0A9, - 0x626A: 0xDED1, - 0x626B: 0xC9A8, - 0x626C: 0xD1EF, - 0x626D: 0xC5A4, - 0x626E: 0xB0E7, - 0x626F: 0xB3B6, - 0x6270: 0xC8C5, - 0x6271: 0x9251, - 0x6272: 0x9252, - 0x6273: 0xB0E2, - 0x6274: 0x9253, - 0x6275: 0x9254, - 0x6276: 0xB7F6, - 0x6277: 0x9255, - 0x6278: 0x9256, - 0x6279: 0xC5FA, - 0x627A: 0x9257, - 0x627B: 0x9258, - 0x627C: 0xB6F3, - 0x627D: 0x9259, - 0x627E: 0xD5D2, - 0x627F: 0xB3D0, - 0x6280: 0xBCBC, - 0x6281: 0x925A, - 0x6282: 0x925B, - 0x6283: 0x925C, - 0x6284: 0xB3AD, - 0x6285: 0x925D, - 0x6286: 0x925E, - 0x6287: 0x925F, - 0x6288: 0x9260, - 0x6289: 0xBEF1, - 0x628A: 0xB0D1, - 0x628B: 0x9261, - 0x628C: 0x9262, - 0x628D: 0x9263, - 0x628E: 0x9264, - 0x628F: 0x9265, - 0x6290: 0x9266, - 0x6291: 0xD2D6, - 0x6292: 0xCAE3, - 0x6293: 0xD7A5, - 0x6294: 0x9267, - 0x6295: 0xCDB6, - 0x6296: 0xB6B6, - 0x6297: 0xBFB9, - 0x6298: 0xD5DB, - 0x6299: 0x9268, - 0x629A: 0xB8A7, - 0x629B: 0xC5D7, - 0x629C: 0x9269, - 0x629D: 0x926A, - 0x629E: 0x926B, - 0x629F: 0xDED2, - 0x62A0: 0xBFD9, - 0x62A1: 0xC2D5, - 0x62A2: 0xC7C0, - 0x62A3: 0x926C, - 0x62A4: 0xBBA4, - 0x62A5: 0xB1A8, - 0x62A6: 0x926D, - 0x62A7: 0x926E, - 0x62A8: 0xC5EA, - 0x62A9: 0x926F, - 0x62AA: 0x9270, - 0x62AB: 0xC5FB, - 0x62AC: 0xCCA7, - 0x62AD: 0x9271, - 0x62AE: 0x9272, - 0x62AF: 0x9273, - 0x62B0: 0x9274, - 0x62B1: 0xB1A7, - 0x62B2: 0x9275, - 0x62B3: 0x9276, - 0x62B4: 0x9277, - 0x62B5: 0xB5D6, - 0x62B6: 0x9278, - 0x62B7: 0x9279, - 0x62B8: 0x927A, - 0x62B9: 0xC4A8, - 0x62BA: 0x927B, - 0x62BB: 0xDED3, - 0x62BC: 0xD1BA, - 0x62BD: 0xB3E9, - 0x62BE: 0x927C, - 0x62BF: 0xC3F2, - 0x62C0: 0x927D, - 0x62C1: 0x927E, - 0x62C2: 0xB7F7, - 0x62C3: 0x9280, - 0x62C4: 0xD6F4, - 0x62C5: 0xB5A3, - 0x62C6: 0xB2F0, - 0x62C7: 0xC4B4, - 0x62C8: 0xC4E9, - 0x62C9: 0xC0AD, - 0x62CA: 0xDED4, - 0x62CB: 0x9281, - 0x62CC: 0xB0E8, - 0x62CD: 0xC5C4, - 0x62CE: 0xC1E0, - 0x62CF: 0x9282, - 0x62D0: 0xB9D5, - 0x62D1: 0x9283, - 0x62D2: 0xBEDC, - 0x62D3: 0xCDD8, - 0x62D4: 0xB0CE, - 0x62D5: 0x9284, - 0x62D6: 0xCDCF, - 0x62D7: 0xDED6, - 0x62D8: 0xBED0, - 0x62D9: 0xD7BE, - 0x62DA: 0xDED5, - 0x62DB: 0xD5D0, - 0x62DC: 0xB0DD, - 0x62DD: 0x9285, - 0x62DE: 0x9286, - 0x62DF: 0xC4E2, - 0x62E0: 0x9287, - 0x62E1: 0x9288, - 0x62E2: 0xC2A3, - 0x62E3: 0xBCF0, - 0x62E4: 0x9289, - 0x62E5: 0xD3B5, - 0x62E6: 0xC0B9, - 0x62E7: 0xC5A1, - 0x62E8: 0xB2A6, - 0x62E9: 0xD4F1, - 0x62EA: 0x928A, - 0x62EB: 0x928B, - 0x62EC: 0xC0A8, - 0x62ED: 0xCAC3, - 0x62EE: 0xDED7, - 0x62EF: 0xD5FC, - 0x62F0: 0x928C, - 0x62F1: 0xB9B0, - 0x62F2: 0x928D, - 0x62F3: 0xC8AD, - 0x62F4: 0xCBA9, - 0x62F5: 0x928E, - 0x62F6: 0xDED9, - 0x62F7: 0xBFBD, - 0x62F8: 0x928F, - 0x62F9: 0x9290, - 0x62FA: 0x9291, - 0x62FB: 0x9292, - 0x62FC: 0xC6B4, - 0x62FD: 0xD7A7, - 0x62FE: 0xCAB0, - 0x62FF: 0xC4C3, - 0x6300: 0x9293, - 0x6301: 0xB3D6, - 0x6302: 0xB9D2, - 0x6303: 0x9294, - 0x6304: 0x9295, - 0x6305: 0x9296, - 0x6306: 0x9297, - 0x6307: 0xD6B8, - 0x6308: 0xEAFC, - 0x6309: 0xB0B4, - 0x630A: 0x9298, - 0x630B: 0x9299, - 0x630C: 0x929A, - 0x630D: 0x929B, - 0x630E: 0xBFE6, - 0x630F: 0x929C, - 0x6310: 0x929D, - 0x6311: 0xCCF4, - 0x6312: 0x929E, - 0x6313: 0x929F, - 0x6314: 0x92A0, - 0x6315: 0x92A1, - 0x6316: 0xCDDA, - 0x6317: 0x92A2, - 0x6318: 0x92A3, - 0x6319: 0x92A4, - 0x631A: 0xD6BF, - 0x631B: 0xC2CE, - 0x631C: 0x92A5, - 0x631D: 0xCECE, - 0x631E: 0xCCA2, - 0x631F: 0xD0AE, - 0x6320: 0xC4D3, - 0x6321: 0xB5B2, - 0x6322: 0xDED8, - 0x6323: 0xD5F5, - 0x6324: 0xBCB7, - 0x6325: 0xBBD3, - 0x6326: 0x92A6, - 0x6327: 0x92A7, - 0x6328: 0xB0A4, - 0x6329: 0x92A8, - 0x632A: 0xC5B2, - 0x632B: 0xB4EC, - 0x632C: 0x92A9, - 0x632D: 0x92AA, - 0x632E: 0x92AB, - 0x632F: 0xD5F1, - 0x6330: 0x92AC, - 0x6331: 0x92AD, - 0x6332: 0xEAFD, - 0x6333: 0x92AE, - 0x6334: 0x92AF, - 0x6335: 0x92B0, - 0x6336: 0x92B1, - 0x6337: 0x92B2, - 0x6338: 0x92B3, - 0x6339: 0xDEDA, - 0x633A: 0xCDA6, - 0x633B: 0x92B4, - 0x633C: 0x92B5, - 0x633D: 0xCDEC, - 0x633E: 0x92B6, - 0x633F: 0x92B7, - 0x6340: 0x92B8, - 0x6341: 0x92B9, - 0x6342: 0xCEE6, - 0x6343: 0xDEDC, - 0x6344: 0x92BA, - 0x6345: 0xCDB1, - 0x6346: 0xC0A6, - 0x6347: 0x92BB, - 0x6348: 0x92BC, - 0x6349: 0xD7BD, - 0x634A: 0x92BD, - 0x634B: 0xDEDB, - 0x634C: 0xB0C6, - 0x634D: 0xBAB4, - 0x634E: 0xC9D3, - 0x634F: 0xC4F3, - 0x6350: 0xBEE8, - 0x6351: 0x92BE, - 0x6352: 0x92BF, - 0x6353: 0x92C0, - 0x6354: 0x92C1, - 0x6355: 0xB2B6, - 0x6356: 0x92C2, - 0x6357: 0x92C3, - 0x6358: 0x92C4, - 0x6359: 0x92C5, - 0x635A: 0x92C6, - 0x635B: 0x92C7, - 0x635C: 0x92C8, - 0x635D: 0x92C9, - 0x635E: 0xC0CC, - 0x635F: 0xCBF0, - 0x6360: 0x92CA, - 0x6361: 0xBCF1, - 0x6362: 0xBBBB, - 0x6363: 0xB5B7, - 0x6364: 0x92CB, - 0x6365: 0x92CC, - 0x6366: 0x92CD, - 0x6367: 0xC5F5, - 0x6368: 0x92CE, - 0x6369: 0xDEE6, - 0x636A: 0x92CF, - 0x636B: 0x92D0, - 0x636C: 0x92D1, - 0x636D: 0xDEE3, - 0x636E: 0xBEDD, - 0x636F: 0x92D2, - 0x6370: 0x92D3, - 0x6371: 0xDEDF, - 0x6372: 0x92D4, - 0x6373: 0x92D5, - 0x6374: 0x92D6, - 0x6375: 0x92D7, - 0x6376: 0xB4B7, - 0x6377: 0xBDDD, - 0x6378: 0x92D8, - 0x6379: 0x92D9, - 0x637A: 0xDEE0, - 0x637B: 0xC4ED, - 0x637C: 0x92DA, - 0x637D: 0x92DB, - 0x637E: 0x92DC, - 0x637F: 0x92DD, - 0x6380: 0xCFC6, - 0x6381: 0x92DE, - 0x6382: 0xB5E0, - 0x6383: 0x92DF, - 0x6384: 0x92E0, - 0x6385: 0x92E1, - 0x6386: 0x92E2, - 0x6387: 0xB6DE, - 0x6388: 0xCADA, - 0x6389: 0xB5F4, - 0x638A: 0xDEE5, - 0x638B: 0x92E3, - 0x638C: 0xD5C6, - 0x638D: 0x92E4, - 0x638E: 0xDEE1, - 0x638F: 0xCCCD, - 0x6390: 0xC6FE, - 0x6391: 0x92E5, - 0x6392: 0xC5C5, - 0x6393: 0x92E6, - 0x6394: 0x92E7, - 0x6395: 0x92E8, - 0x6396: 0xD2B4, - 0x6397: 0x92E9, - 0x6398: 0xBEF2, - 0x6399: 0x92EA, - 0x639A: 0x92EB, - 0x639B: 0x92EC, - 0x639C: 0x92ED, - 0x639D: 0x92EE, - 0x639E: 0x92EF, - 0x639F: 0x92F0, - 0x63A0: 0xC2D3, - 0x63A1: 0x92F1, - 0x63A2: 0xCCBD, - 0x63A3: 0xB3B8, - 0x63A4: 0x92F2, - 0x63A5: 0xBDD3, - 0x63A6: 0x92F3, - 0x63A7: 0xBFD8, - 0x63A8: 0xCDC6, - 0x63A9: 0xD1DA, - 0x63AA: 0xB4EB, - 0x63AB: 0x92F4, - 0x63AC: 0xDEE4, - 0x63AD: 0xDEDD, - 0x63AE: 0xDEE7, - 0x63AF: 0x92F5, - 0x63B0: 0xEAFE, - 0x63B1: 0x92F6, - 0x63B2: 0x92F7, - 0x63B3: 0xC2B0, - 0x63B4: 0xDEE2, - 0x63B5: 0x92F8, - 0x63B6: 0x92F9, - 0x63B7: 0xD6C0, - 0x63B8: 0xB5A7, - 0x63B9: 0x92FA, - 0x63BA: 0xB2F4, - 0x63BB: 0x92FB, - 0x63BC: 0xDEE8, - 0x63BD: 0x92FC, - 0x63BE: 0xDEF2, - 0x63BF: 0x92FD, - 0x63C0: 0x92FE, - 0x63C1: 0x9340, - 0x63C2: 0x9341, - 0x63C3: 0x9342, - 0x63C4: 0xDEED, - 0x63C5: 0x9343, - 0x63C6: 0xDEF1, - 0x63C7: 0x9344, - 0x63C8: 0x9345, - 0x63C9: 0xC8E0, - 0x63CA: 0x9346, - 0x63CB: 0x9347, - 0x63CC: 0x9348, - 0x63CD: 0xD7E1, - 0x63CE: 0xDEEF, - 0x63CF: 0xC3E8, - 0x63D0: 0xCCE1, - 0x63D1: 0x9349, - 0x63D2: 0xB2E5, - 0x63D3: 0x934A, - 0x63D4: 0x934B, - 0x63D5: 0x934C, - 0x63D6: 0xD2BE, - 0x63D7: 0x934D, - 0x63D8: 0x934E, - 0x63D9: 0x934F, - 0x63DA: 0x9350, - 0x63DB: 0x9351, - 0x63DC: 0x9352, - 0x63DD: 0x9353, - 0x63DE: 0xDEEE, - 0x63DF: 0x9354, - 0x63E0: 0xDEEB, - 0x63E1: 0xCED5, - 0x63E2: 0x9355, - 0x63E3: 0xB4A7, - 0x63E4: 0x9356, - 0x63E5: 0x9357, - 0x63E6: 0x9358, - 0x63E7: 0x9359, - 0x63E8: 0x935A, - 0x63E9: 0xBFAB, - 0x63EA: 0xBEBE, - 0x63EB: 0x935B, - 0x63EC: 0x935C, - 0x63ED: 0xBDD2, - 0x63EE: 0x935D, - 0x63EF: 0x935E, - 0x63F0: 0x935F, - 0x63F1: 0x9360, - 0x63F2: 0xDEE9, - 0x63F3: 0x9361, - 0x63F4: 0xD4AE, - 0x63F5: 0x9362, - 0x63F6: 0xDEDE, - 0x63F7: 0x9363, - 0x63F8: 0xDEEA, - 0x63F9: 0x9364, - 0x63FA: 0x9365, - 0x63FB: 0x9366, - 0x63FC: 0x9367, - 0x63FD: 0xC0BF, - 0x63FE: 0x9368, - 0x63FF: 0xDEEC, - 0x6400: 0xB2F3, - 0x6401: 0xB8E9, - 0x6402: 0xC2A7, - 0x6403: 0x9369, - 0x6404: 0x936A, - 0x6405: 0xBDC1, - 0x6406: 0x936B, - 0x6407: 0x936C, - 0x6408: 0x936D, - 0x6409: 0x936E, - 0x640A: 0x936F, - 0x640B: 0xDEF5, - 0x640C: 0xDEF8, - 0x640D: 0x9370, - 0x640E: 0x9371, - 0x640F: 0xB2AB, - 0x6410: 0xB4A4, - 0x6411: 0x9372, - 0x6412: 0x9373, - 0x6413: 0xB4EA, - 0x6414: 0xC9A6, - 0x6415: 0x9374, - 0x6416: 0x9375, - 0x6417: 0x9376, - 0x6418: 0x9377, - 0x6419: 0x9378, - 0x641A: 0x9379, - 0x641B: 0xDEF6, - 0x641C: 0xCBD1, - 0x641D: 0x937A, - 0x641E: 0xB8E3, - 0x641F: 0x937B, - 0x6420: 0xDEF7, - 0x6421: 0xDEFA, - 0x6422: 0x937C, - 0x6423: 0x937D, - 0x6424: 0x937E, - 0x6425: 0x9380, - 0x6426: 0xDEF9, - 0x6427: 0x9381, - 0x6428: 0x9382, - 0x6429: 0x9383, - 0x642A: 0xCCC2, - 0x642B: 0x9384, - 0x642C: 0xB0E1, - 0x642D: 0xB4EE, - 0x642E: 0x9385, - 0x642F: 0x9386, - 0x6430: 0x9387, - 0x6431: 0x9388, - 0x6432: 0x9389, - 0x6433: 0x938A, - 0x6434: 0xE5BA, - 0x6435: 0x938B, - 0x6436: 0x938C, - 0x6437: 0x938D, - 0x6438: 0x938E, - 0x6439: 0x938F, - 0x643A: 0xD0AF, - 0x643B: 0x9390, - 0x643C: 0x9391, - 0x643D: 0xB2EB, - 0x643E: 0x9392, - 0x643F: 0xEBA1, - 0x6440: 0x9393, - 0x6441: 0xDEF4, - 0x6442: 0x9394, - 0x6443: 0x9395, - 0x6444: 0xC9E3, - 0x6445: 0xDEF3, - 0x6446: 0xB0DA, - 0x6447: 0xD2A1, - 0x6448: 0xB1F7, - 0x6449: 0x9396, - 0x644A: 0xCCAF, - 0x644B: 0x9397, - 0x644C: 0x9398, - 0x644D: 0x9399, - 0x644E: 0x939A, - 0x644F: 0x939B, - 0x6450: 0x939C, - 0x6451: 0x939D, - 0x6452: 0xDEF0, - 0x6453: 0x939E, - 0x6454: 0xCBA4, - 0x6455: 0x939F, - 0x6456: 0x93A0, - 0x6457: 0x93A1, - 0x6458: 0xD5AA, - 0x6459: 0x93A2, - 0x645A: 0x93A3, - 0x645B: 0x93A4, - 0x645C: 0x93A5, - 0x645D: 0x93A6, - 0x645E: 0xDEFB, - 0x645F: 0x93A7, - 0x6460: 0x93A8, - 0x6461: 0x93A9, - 0x6462: 0x93AA, - 0x6463: 0x93AB, - 0x6464: 0x93AC, - 0x6465: 0x93AD, - 0x6466: 0x93AE, - 0x6467: 0xB4DD, - 0x6468: 0x93AF, - 0x6469: 0xC4A6, - 0x646A: 0x93B0, - 0x646B: 0x93B1, - 0x646C: 0x93B2, - 0x646D: 0xDEFD, - 0x646E: 0x93B3, - 0x646F: 0x93B4, - 0x6470: 0x93B5, - 0x6471: 0x93B6, - 0x6472: 0x93B7, - 0x6473: 0x93B8, - 0x6474: 0x93B9, - 0x6475: 0x93BA, - 0x6476: 0x93BB, - 0x6477: 0x93BC, - 0x6478: 0xC3FE, - 0x6479: 0xC4A1, - 0x647A: 0xDFA1, - 0x647B: 0x93BD, - 0x647C: 0x93BE, - 0x647D: 0x93BF, - 0x647E: 0x93C0, - 0x647F: 0x93C1, - 0x6480: 0x93C2, - 0x6481: 0x93C3, - 0x6482: 0xC1CC, - 0x6483: 0x93C4, - 0x6484: 0xDEFC, - 0x6485: 0xBEEF, - 0x6486: 0x93C5, - 0x6487: 0xC6B2, - 0x6488: 0x93C6, - 0x6489: 0x93C7, - 0x648A: 0x93C8, - 0x648B: 0x93C9, - 0x648C: 0x93CA, - 0x648D: 0x93CB, - 0x648E: 0x93CC, - 0x648F: 0x93CD, - 0x6490: 0x93CE, - 0x6491: 0xB3C5, - 0x6492: 0xC8F6, - 0x6493: 0x93CF, - 0x6494: 0x93D0, - 0x6495: 0xCBBA, - 0x6496: 0xDEFE, - 0x6497: 0x93D1, - 0x6498: 0x93D2, - 0x6499: 0xDFA4, - 0x649A: 0x93D3, - 0x649B: 0x93D4, - 0x649C: 0x93D5, - 0x649D: 0x93D6, - 0x649E: 0xD7B2, - 0x649F: 0x93D7, - 0x64A0: 0x93D8, - 0x64A1: 0x93D9, - 0x64A2: 0x93DA, - 0x64A3: 0x93DB, - 0x64A4: 0xB3B7, - 0x64A5: 0x93DC, - 0x64A6: 0x93DD, - 0x64A7: 0x93DE, - 0x64A8: 0x93DF, - 0x64A9: 0xC1C3, - 0x64AA: 0x93E0, - 0x64AB: 0x93E1, - 0x64AC: 0xC7CB, - 0x64AD: 0xB2A5, - 0x64AE: 0xB4E9, - 0x64AF: 0x93E2, - 0x64B0: 0xD7AB, - 0x64B1: 0x93E3, - 0x64B2: 0x93E4, - 0x64B3: 0x93E5, - 0x64B4: 0x93E6, - 0x64B5: 0xC4EC, - 0x64B6: 0x93E7, - 0x64B7: 0xDFA2, - 0x64B8: 0xDFA3, - 0x64B9: 0x93E8, - 0x64BA: 0xDFA5, - 0x64BB: 0x93E9, - 0x64BC: 0xBAB3, - 0x64BD: 0x93EA, - 0x64BE: 0x93EB, - 0x64BF: 0x93EC, - 0x64C0: 0xDFA6, - 0x64C1: 0x93ED, - 0x64C2: 0xC0DE, - 0x64C3: 0x93EE, - 0x64C4: 0x93EF, - 0x64C5: 0xC9C3, - 0x64C6: 0x93F0, - 0x64C7: 0x93F1, - 0x64C8: 0x93F2, - 0x64C9: 0x93F3, - 0x64CA: 0x93F4, - 0x64CB: 0x93F5, - 0x64CC: 0x93F6, - 0x64CD: 0xB2D9, - 0x64CE: 0xC7E6, - 0x64CF: 0x93F7, - 0x64D0: 0xDFA7, - 0x64D1: 0x93F8, - 0x64D2: 0xC7DC, - 0x64D3: 0x93F9, - 0x64D4: 0x93FA, - 0x64D5: 0x93FB, - 0x64D6: 0x93FC, - 0x64D7: 0xDFA8, - 0x64D8: 0xEBA2, - 0x64D9: 0x93FD, - 0x64DA: 0x93FE, - 0x64DB: 0x9440, - 0x64DC: 0x9441, - 0x64DD: 0x9442, - 0x64DE: 0xCBD3, - 0x64DF: 0x9443, - 0x64E0: 0x9444, - 0x64E1: 0x9445, - 0x64E2: 0xDFAA, - 0x64E3: 0x9446, - 0x64E4: 0xDFA9, - 0x64E5: 0x9447, - 0x64E6: 0xB2C1, - 0x64E7: 0x9448, - 0x64E8: 0x9449, - 0x64E9: 0x944A, - 0x64EA: 0x944B, - 0x64EB: 0x944C, - 0x64EC: 0x944D, - 0x64ED: 0x944E, - 0x64EE: 0x944F, - 0x64EF: 0x9450, - 0x64F0: 0x9451, - 0x64F1: 0x9452, - 0x64F2: 0x9453, - 0x64F3: 0x9454, - 0x64F4: 0x9455, - 0x64F5: 0x9456, - 0x64F6: 0x9457, - 0x64F7: 0x9458, - 0x64F8: 0x9459, - 0x64F9: 0x945A, - 0x64FA: 0x945B, - 0x64FB: 0x945C, - 0x64FC: 0x945D, - 0x64FD: 0x945E, - 0x64FE: 0x945F, - 0x64FF: 0x9460, - 0x6500: 0xC5CA, - 0x6501: 0x9461, - 0x6502: 0x9462, - 0x6503: 0x9463, - 0x6504: 0x9464, - 0x6505: 0x9465, - 0x6506: 0x9466, - 0x6507: 0x9467, - 0x6508: 0x9468, - 0x6509: 0xDFAB, - 0x650A: 0x9469, - 0x650B: 0x946A, - 0x650C: 0x946B, - 0x650D: 0x946C, - 0x650E: 0x946D, - 0x650F: 0x946E, - 0x6510: 0x946F, - 0x6511: 0x9470, - 0x6512: 0xD4DC, - 0x6513: 0x9471, - 0x6514: 0x9472, - 0x6515: 0x9473, - 0x6516: 0x9474, - 0x6517: 0x9475, - 0x6518: 0xC8C1, - 0x6519: 0x9476, - 0x651A: 0x9477, - 0x651B: 0x9478, - 0x651C: 0x9479, - 0x651D: 0x947A, - 0x651E: 0x947B, - 0x651F: 0x947C, - 0x6520: 0x947D, - 0x6521: 0x947E, - 0x6522: 0x9480, - 0x6523: 0x9481, - 0x6524: 0x9482, - 0x6525: 0xDFAC, - 0x6526: 0x9483, - 0x6527: 0x9484, - 0x6528: 0x9485, - 0x6529: 0x9486, - 0x652A: 0x9487, - 0x652B: 0xBEF0, - 0x652C: 0x9488, - 0x652D: 0x9489, - 0x652E: 0xDFAD, - 0x652F: 0xD6A7, - 0x6530: 0x948A, - 0x6531: 0x948B, - 0x6532: 0x948C, - 0x6533: 0x948D, - 0x6534: 0xEAB7, - 0x6535: 0xEBB6, - 0x6536: 0xCAD5, - 0x6537: 0x948E, - 0x6538: 0xD8FC, - 0x6539: 0xB8C4, - 0x653A: 0x948F, - 0x653B: 0xB9A5, - 0x653C: 0x9490, - 0x653D: 0x9491, - 0x653E: 0xB7C5, - 0x653F: 0xD5FE, - 0x6540: 0x9492, - 0x6541: 0x9493, - 0x6542: 0x9494, - 0x6543: 0x9495, - 0x6544: 0x9496, - 0x6545: 0xB9CA, - 0x6546: 0x9497, - 0x6547: 0x9498, - 0x6548: 0xD0A7, - 0x6549: 0xF4CD, - 0x654A: 0x9499, - 0x654B: 0x949A, - 0x654C: 0xB5D0, - 0x654D: 0x949B, - 0x654E: 0x949C, - 0x654F: 0xC3F4, - 0x6550: 0x949D, - 0x6551: 0xBEC8, - 0x6552: 0x949E, - 0x6553: 0x949F, - 0x6554: 0x94A0, - 0x6555: 0xEBB7, - 0x6556: 0xB0BD, - 0x6557: 0x94A1, - 0x6558: 0x94A2, - 0x6559: 0xBDCC, - 0x655A: 0x94A3, - 0x655B: 0xC1B2, - 0x655C: 0x94A4, - 0x655D: 0xB1D6, - 0x655E: 0xB3A8, - 0x655F: 0x94A5, - 0x6560: 0x94A6, - 0x6561: 0x94A7, - 0x6562: 0xB8D2, - 0x6563: 0xC9A2, - 0x6564: 0x94A8, - 0x6565: 0x94A9, - 0x6566: 0xB6D8, - 0x6567: 0x94AA, - 0x6568: 0x94AB, - 0x6569: 0x94AC, - 0x656A: 0x94AD, - 0x656B: 0xEBB8, - 0x656C: 0xBEB4, - 0x656D: 0x94AE, - 0x656E: 0x94AF, - 0x656F: 0x94B0, - 0x6570: 0xCAFD, - 0x6571: 0x94B1, - 0x6572: 0xC7C3, - 0x6573: 0x94B2, - 0x6574: 0xD5FB, - 0x6575: 0x94B3, - 0x6576: 0x94B4, - 0x6577: 0xB7F3, - 0x6578: 0x94B5, - 0x6579: 0x94B6, - 0x657A: 0x94B7, - 0x657B: 0x94B8, - 0x657C: 0x94B9, - 0x657D: 0x94BA, - 0x657E: 0x94BB, - 0x657F: 0x94BC, - 0x6580: 0x94BD, - 0x6581: 0x94BE, - 0x6582: 0x94BF, - 0x6583: 0x94C0, - 0x6584: 0x94C1, - 0x6585: 0x94C2, - 0x6586: 0x94C3, - 0x6587: 0xCEC4, - 0x6588: 0x94C4, - 0x6589: 0x94C5, - 0x658A: 0x94C6, - 0x658B: 0xD5AB, - 0x658C: 0xB1F3, - 0x658D: 0x94C7, - 0x658E: 0x94C8, - 0x658F: 0x94C9, - 0x6590: 0xECB3, - 0x6591: 0xB0DF, - 0x6592: 0x94CA, - 0x6593: 0xECB5, - 0x6594: 0x94CB, - 0x6595: 0x94CC, - 0x6596: 0x94CD, - 0x6597: 0xB6B7, - 0x6598: 0x94CE, - 0x6599: 0xC1CF, - 0x659A: 0x94CF, - 0x659B: 0xF5FA, - 0x659C: 0xD0B1, - 0x659D: 0x94D0, - 0x659E: 0x94D1, - 0x659F: 0xD5E5, - 0x65A0: 0x94D2, - 0x65A1: 0xCED3, - 0x65A2: 0x94D3, - 0x65A3: 0x94D4, - 0x65A4: 0xBDEF, - 0x65A5: 0xB3E2, - 0x65A6: 0x94D5, - 0x65A7: 0xB8AB, - 0x65A8: 0x94D6, - 0x65A9: 0xD5B6, - 0x65AA: 0x94D7, - 0x65AB: 0xEDBD, - 0x65AC: 0x94D8, - 0x65AD: 0xB6CF, - 0x65AE: 0x94D9, - 0x65AF: 0xCBB9, - 0x65B0: 0xD0C2, - 0x65B1: 0x94DA, - 0x65B2: 0x94DB, - 0x65B3: 0x94DC, - 0x65B4: 0x94DD, - 0x65B5: 0x94DE, - 0x65B6: 0x94DF, - 0x65B7: 0x94E0, - 0x65B8: 0x94E1, - 0x65B9: 0xB7BD, - 0x65BA: 0x94E2, - 0x65BB: 0x94E3, - 0x65BC: 0xECB6, - 0x65BD: 0xCAA9, - 0x65BE: 0x94E4, - 0x65BF: 0x94E5, - 0x65C0: 0x94E6, - 0x65C1: 0xC5D4, - 0x65C2: 0x94E7, - 0x65C3: 0xECB9, - 0x65C4: 0xECB8, - 0x65C5: 0xC2C3, - 0x65C6: 0xECB7, - 0x65C7: 0x94E8, - 0x65C8: 0x94E9, - 0x65C9: 0x94EA, - 0x65CA: 0x94EB, - 0x65CB: 0xD0FD, - 0x65CC: 0xECBA, - 0x65CD: 0x94EC, - 0x65CE: 0xECBB, - 0x65CF: 0xD7E5, - 0x65D0: 0x94ED, - 0x65D1: 0x94EE, - 0x65D2: 0xECBC, - 0x65D3: 0x94EF, - 0x65D4: 0x94F0, - 0x65D5: 0x94F1, - 0x65D6: 0xECBD, - 0x65D7: 0xC6EC, - 0x65D8: 0x94F2, - 0x65D9: 0x94F3, - 0x65DA: 0x94F4, - 0x65DB: 0x94F5, - 0x65DC: 0x94F6, - 0x65DD: 0x94F7, - 0x65DE: 0x94F8, - 0x65DF: 0x94F9, - 0x65E0: 0xCEDE, - 0x65E1: 0x94FA, - 0x65E2: 0xBCC8, - 0x65E3: 0x94FB, - 0x65E4: 0x94FC, - 0x65E5: 0xC8D5, - 0x65E6: 0xB5A9, - 0x65E7: 0xBEC9, - 0x65E8: 0xD6BC, - 0x65E9: 0xD4E7, - 0x65EA: 0x94FD, - 0x65EB: 0x94FE, - 0x65EC: 0xD1AE, - 0x65ED: 0xD0F1, - 0x65EE: 0xEAB8, - 0x65EF: 0xEAB9, - 0x65F0: 0xEABA, - 0x65F1: 0xBAB5, - 0x65F2: 0x9540, - 0x65F3: 0x9541, - 0x65F4: 0x9542, - 0x65F5: 0x9543, - 0x65F6: 0xCAB1, - 0x65F7: 0xBFF5, - 0x65F8: 0x9544, - 0x65F9: 0x9545, - 0x65FA: 0xCDFA, - 0x65FB: 0x9546, - 0x65FC: 0x9547, - 0x65FD: 0x9548, - 0x65FE: 0x9549, - 0x65FF: 0x954A, - 0x6600: 0xEAC0, - 0x6601: 0x954B, - 0x6602: 0xB0BA, - 0x6603: 0xEABE, - 0x6604: 0x954C, - 0x6605: 0x954D, - 0x6606: 0xC0A5, - 0x6607: 0x954E, - 0x6608: 0x954F, - 0x6609: 0x9550, - 0x660A: 0xEABB, - 0x660B: 0x9551, - 0x660C: 0xB2FD, - 0x660D: 0x9552, - 0x660E: 0xC3F7, - 0x660F: 0xBBE8, - 0x6610: 0x9553, - 0x6611: 0x9554, - 0x6612: 0x9555, - 0x6613: 0xD2D7, - 0x6614: 0xCEF4, - 0x6615: 0xEABF, - 0x6616: 0x9556, - 0x6617: 0x9557, - 0x6618: 0x9558, - 0x6619: 0xEABC, - 0x661A: 0x9559, - 0x661B: 0x955A, - 0x661C: 0x955B, - 0x661D: 0xEAC3, - 0x661E: 0x955C, - 0x661F: 0xD0C7, - 0x6620: 0xD3B3, - 0x6621: 0x955D, - 0x6622: 0x955E, - 0x6623: 0x955F, - 0x6624: 0x9560, - 0x6625: 0xB4BA, - 0x6626: 0x9561, - 0x6627: 0xC3C1, - 0x6628: 0xD7F2, - 0x6629: 0x9562, - 0x662A: 0x9563, - 0x662B: 0x9564, - 0x662C: 0x9565, - 0x662D: 0xD5D1, - 0x662E: 0x9566, - 0x662F: 0xCAC7, - 0x6630: 0x9567, - 0x6631: 0xEAC5, - 0x6632: 0x9568, - 0x6633: 0x9569, - 0x6634: 0xEAC4, - 0x6635: 0xEAC7, - 0x6636: 0xEAC6, - 0x6637: 0x956A, - 0x6638: 0x956B, - 0x6639: 0x956C, - 0x663A: 0x956D, - 0x663B: 0x956E, - 0x663C: 0xD6E7, - 0x663D: 0x956F, - 0x663E: 0xCFD4, - 0x663F: 0x9570, - 0x6640: 0x9571, - 0x6641: 0xEACB, - 0x6642: 0x9572, - 0x6643: 0xBBCE, - 0x6644: 0x9573, - 0x6645: 0x9574, - 0x6646: 0x9575, - 0x6647: 0x9576, - 0x6648: 0x9577, - 0x6649: 0x9578, - 0x664A: 0x9579, - 0x664B: 0xBDFA, - 0x664C: 0xC9CE, - 0x664D: 0x957A, - 0x664E: 0x957B, - 0x664F: 0xEACC, - 0x6650: 0x957C, - 0x6651: 0x957D, - 0x6652: 0xC9B9, - 0x6653: 0xCFFE, - 0x6654: 0xEACA, - 0x6655: 0xD4CE, - 0x6656: 0xEACD, - 0x6657: 0xEACF, - 0x6658: 0x957E, - 0x6659: 0x9580, - 0x665A: 0xCDED, - 0x665B: 0x9581, - 0x665C: 0x9582, - 0x665D: 0x9583, - 0x665E: 0x9584, - 0x665F: 0xEAC9, - 0x6660: 0x9585, - 0x6661: 0xEACE, - 0x6662: 0x9586, - 0x6663: 0x9587, - 0x6664: 0xCEEE, - 0x6665: 0x9588, - 0x6666: 0xBBDE, - 0x6667: 0x9589, - 0x6668: 0xB3BF, - 0x6669: 0x958A, - 0x666A: 0x958B, - 0x666B: 0x958C, - 0x666C: 0x958D, - 0x666D: 0x958E, - 0x666E: 0xC6D5, - 0x666F: 0xBEB0, - 0x6670: 0xCEFA, - 0x6671: 0x958F, - 0x6672: 0x9590, - 0x6673: 0x9591, - 0x6674: 0xC7E7, - 0x6675: 0x9592, - 0x6676: 0xBEA7, - 0x6677: 0xEAD0, - 0x6678: 0x9593, - 0x6679: 0x9594, - 0x667A: 0xD6C7, - 0x667B: 0x9595, - 0x667C: 0x9596, - 0x667D: 0x9597, - 0x667E: 0xC1C0, - 0x667F: 0x9598, - 0x6680: 0x9599, - 0x6681: 0x959A, - 0x6682: 0xD4DD, - 0x6683: 0x959B, - 0x6684: 0xEAD1, - 0x6685: 0x959C, - 0x6686: 0x959D, - 0x6687: 0xCFBE, - 0x6688: 0x959E, - 0x6689: 0x959F, - 0x668A: 0x95A0, - 0x668B: 0x95A1, - 0x668C: 0xEAD2, - 0x668D: 0x95A2, - 0x668E: 0x95A3, - 0x668F: 0x95A4, - 0x6690: 0x95A5, - 0x6691: 0xCAEE, - 0x6692: 0x95A6, - 0x6693: 0x95A7, - 0x6694: 0x95A8, - 0x6695: 0x95A9, - 0x6696: 0xC5AF, - 0x6697: 0xB0B5, - 0x6698: 0x95AA, - 0x6699: 0x95AB, - 0x669A: 0x95AC, - 0x669B: 0x95AD, - 0x669C: 0x95AE, - 0x669D: 0xEAD4, - 0x669E: 0x95AF, - 0x669F: 0x95B0, - 0x66A0: 0x95B1, - 0x66A1: 0x95B2, - 0x66A2: 0x95B3, - 0x66A3: 0x95B4, - 0x66A4: 0x95B5, - 0x66A5: 0x95B6, - 0x66A6: 0x95B7, - 0x66A7: 0xEAD3, - 0x66A8: 0xF4DF, - 0x66A9: 0x95B8, - 0x66AA: 0x95B9, - 0x66AB: 0x95BA, - 0x66AC: 0x95BB, - 0x66AD: 0x95BC, - 0x66AE: 0xC4BA, - 0x66AF: 0x95BD, - 0x66B0: 0x95BE, - 0x66B1: 0x95BF, - 0x66B2: 0x95C0, - 0x66B3: 0x95C1, - 0x66B4: 0xB1A9, - 0x66B5: 0x95C2, - 0x66B6: 0x95C3, - 0x66B7: 0x95C4, - 0x66B8: 0x95C5, - 0x66B9: 0xE5DF, - 0x66BA: 0x95C6, - 0x66BB: 0x95C7, - 0x66BC: 0x95C8, - 0x66BD: 0x95C9, - 0x66BE: 0xEAD5, - 0x66BF: 0x95CA, - 0x66C0: 0x95CB, - 0x66C1: 0x95CC, - 0x66C2: 0x95CD, - 0x66C3: 0x95CE, - 0x66C4: 0x95CF, - 0x66C5: 0x95D0, - 0x66C6: 0x95D1, - 0x66C7: 0x95D2, - 0x66C8: 0x95D3, - 0x66C9: 0x95D4, - 0x66CA: 0x95D5, - 0x66CB: 0x95D6, - 0x66CC: 0x95D7, - 0x66CD: 0x95D8, - 0x66CE: 0x95D9, - 0x66CF: 0x95DA, - 0x66D0: 0x95DB, - 0x66D1: 0x95DC, - 0x66D2: 0x95DD, - 0x66D3: 0x95DE, - 0x66D4: 0x95DF, - 0x66D5: 0x95E0, - 0x66D6: 0x95E1, - 0x66D7: 0x95E2, - 0x66D8: 0x95E3, - 0x66D9: 0xCAEF, - 0x66DA: 0x95E4, - 0x66DB: 0xEAD6, - 0x66DC: 0xEAD7, - 0x66DD: 0xC6D8, - 0x66DE: 0x95E5, - 0x66DF: 0x95E6, - 0x66E0: 0x95E7, - 0x66E1: 0x95E8, - 0x66E2: 0x95E9, - 0x66E3: 0x95EA, - 0x66E4: 0x95EB, - 0x66E5: 0x95EC, - 0x66E6: 0xEAD8, - 0x66E7: 0x95ED, - 0x66E8: 0x95EE, - 0x66E9: 0xEAD9, - 0x66EA: 0x95EF, - 0x66EB: 0x95F0, - 0x66EC: 0x95F1, - 0x66ED: 0x95F2, - 0x66EE: 0x95F3, - 0x66EF: 0x95F4, - 0x66F0: 0xD4BB, - 0x66F1: 0x95F5, - 0x66F2: 0xC7FA, - 0x66F3: 0xD2B7, - 0x66F4: 0xB8FC, - 0x66F5: 0x95F6, - 0x66F6: 0x95F7, - 0x66F7: 0xEAC2, - 0x66F8: 0x95F8, - 0x66F9: 0xB2DC, - 0x66FA: 0x95F9, - 0x66FB: 0x95FA, - 0x66FC: 0xC2FC, - 0x66FD: 0x95FB, - 0x66FE: 0xD4F8, - 0x66FF: 0xCCE6, - 0x6700: 0xD7EE, - 0x6701: 0x95FC, - 0x6702: 0x95FD, - 0x6703: 0x95FE, - 0x6704: 0x9640, - 0x6705: 0x9641, - 0x6706: 0x9642, - 0x6707: 0x9643, - 0x6708: 0xD4C2, - 0x6709: 0xD3D0, - 0x670A: 0xEBC3, - 0x670B: 0xC5F3, - 0x670C: 0x9644, - 0x670D: 0xB7FE, - 0x670E: 0x9645, - 0x670F: 0x9646, - 0x6710: 0xEBD4, - 0x6711: 0x9647, - 0x6712: 0x9648, - 0x6713: 0x9649, - 0x6714: 0xCBB7, - 0x6715: 0xEBDE, - 0x6716: 0x964A, - 0x6717: 0xC0CA, - 0x6718: 0x964B, - 0x6719: 0x964C, - 0x671A: 0x964D, - 0x671B: 0xCDFB, - 0x671C: 0x964E, - 0x671D: 0xB3AF, - 0x671E: 0x964F, - 0x671F: 0xC6DA, - 0x6720: 0x9650, - 0x6721: 0x9651, - 0x6722: 0x9652, - 0x6723: 0x9653, - 0x6724: 0x9654, - 0x6725: 0x9655, - 0x6726: 0xEBFC, - 0x6727: 0x9656, - 0x6728: 0xC4BE, - 0x6729: 0x9657, - 0x672A: 0xCEB4, - 0x672B: 0xC4A9, - 0x672C: 0xB1BE, - 0x672D: 0xD4FD, - 0x672E: 0x9658, - 0x672F: 0xCAF5, - 0x6730: 0x9659, - 0x6731: 0xD6EC, - 0x6732: 0x965A, - 0x6733: 0x965B, - 0x6734: 0xC6D3, - 0x6735: 0xB6E4, - 0x6736: 0x965C, - 0x6737: 0x965D, - 0x6738: 0x965E, - 0x6739: 0x965F, - 0x673A: 0xBBFA, - 0x673B: 0x9660, - 0x673C: 0x9661, - 0x673D: 0xD0E0, - 0x673E: 0x9662, - 0x673F: 0x9663, - 0x6740: 0xC9B1, - 0x6741: 0x9664, - 0x6742: 0xD4D3, - 0x6743: 0xC8A8, - 0x6744: 0x9665, - 0x6745: 0x9666, - 0x6746: 0xB8CB, - 0x6747: 0x9667, - 0x6748: 0xE8BE, - 0x6749: 0xC9BC, - 0x674A: 0x9668, - 0x674B: 0x9669, - 0x674C: 0xE8BB, - 0x674D: 0x966A, - 0x674E: 0xC0EE, - 0x674F: 0xD0D3, - 0x6750: 0xB2C4, - 0x6751: 0xB4E5, - 0x6752: 0x966B, - 0x6753: 0xE8BC, - 0x6754: 0x966C, - 0x6755: 0x966D, - 0x6756: 0xD5C8, - 0x6757: 0x966E, - 0x6758: 0x966F, - 0x6759: 0x9670, - 0x675A: 0x9671, - 0x675B: 0x9672, - 0x675C: 0xB6C5, - 0x675D: 0x9673, - 0x675E: 0xE8BD, - 0x675F: 0xCAF8, - 0x6760: 0xB8DC, - 0x6761: 0xCCF5, - 0x6762: 0x9674, - 0x6763: 0x9675, - 0x6764: 0x9676, - 0x6765: 0xC0B4, - 0x6766: 0x9677, - 0x6767: 0x9678, - 0x6768: 0xD1EE, - 0x6769: 0xE8BF, - 0x676A: 0xE8C2, - 0x676B: 0x9679, - 0x676C: 0x967A, - 0x676D: 0xBABC, - 0x676E: 0x967B, - 0x676F: 0xB1AD, - 0x6770: 0xBDDC, - 0x6771: 0x967C, - 0x6772: 0xEABD, - 0x6773: 0xE8C3, - 0x6774: 0x967D, - 0x6775: 0xE8C6, - 0x6776: 0x967E, - 0x6777: 0xE8CB, - 0x6778: 0x9680, - 0x6779: 0x9681, - 0x677A: 0x9682, - 0x677B: 0x9683, - 0x677C: 0xE8CC, - 0x677D: 0x9684, - 0x677E: 0xCBC9, - 0x677F: 0xB0E5, - 0x6780: 0x9685, - 0x6781: 0xBCAB, - 0x6782: 0x9686, - 0x6783: 0x9687, - 0x6784: 0xB9B9, - 0x6785: 0x9688, - 0x6786: 0x9689, - 0x6787: 0xE8C1, - 0x6788: 0x968A, - 0x6789: 0xCDF7, - 0x678A: 0x968B, - 0x678B: 0xE8CA, - 0x678C: 0x968C, - 0x678D: 0x968D, - 0x678E: 0x968E, - 0x678F: 0x968F, - 0x6790: 0xCEF6, - 0x6791: 0x9690, - 0x6792: 0x9691, - 0x6793: 0x9692, - 0x6794: 0x9693, - 0x6795: 0xD5ED, - 0x6796: 0x9694, - 0x6797: 0xC1D6, - 0x6798: 0xE8C4, - 0x6799: 0x9695, - 0x679A: 0xC3B6, - 0x679B: 0x9696, - 0x679C: 0xB9FB, - 0x679D: 0xD6A6, - 0x679E: 0xE8C8, - 0x679F: 0x9697, - 0x67A0: 0x9698, - 0x67A1: 0x9699, - 0x67A2: 0xCAE0, - 0x67A3: 0xD4E6, - 0x67A4: 0x969A, - 0x67A5: 0xE8C0, - 0x67A6: 0x969B, - 0x67A7: 0xE8C5, - 0x67A8: 0xE8C7, - 0x67A9: 0x969C, - 0x67AA: 0xC7B9, - 0x67AB: 0xB7E3, - 0x67AC: 0x969D, - 0x67AD: 0xE8C9, - 0x67AE: 0x969E, - 0x67AF: 0xBFDD, - 0x67B0: 0xE8D2, - 0x67B1: 0x969F, - 0x67B2: 0x96A0, - 0x67B3: 0xE8D7, - 0x67B4: 0x96A1, - 0x67B5: 0xE8D5, - 0x67B6: 0xBCDC, - 0x67B7: 0xBCCF, - 0x67B8: 0xE8DB, - 0x67B9: 0x96A2, - 0x67BA: 0x96A3, - 0x67BB: 0x96A4, - 0x67BC: 0x96A5, - 0x67BD: 0x96A6, - 0x67BE: 0x96A7, - 0x67BF: 0x96A8, - 0x67C0: 0x96A9, - 0x67C1: 0xE8DE, - 0x67C2: 0x96AA, - 0x67C3: 0xE8DA, - 0x67C4: 0xB1FA, - 0x67C5: 0x96AB, - 0x67C6: 0x96AC, - 0x67C7: 0x96AD, - 0x67C8: 0x96AE, - 0x67C9: 0x96AF, - 0x67CA: 0x96B0, - 0x67CB: 0x96B1, - 0x67CC: 0x96B2, - 0x67CD: 0x96B3, - 0x67CE: 0x96B4, - 0x67CF: 0xB0D8, - 0x67D0: 0xC4B3, - 0x67D1: 0xB8CC, - 0x67D2: 0xC6E2, - 0x67D3: 0xC8BE, - 0x67D4: 0xC8E1, - 0x67D5: 0x96B5, - 0x67D6: 0x96B6, - 0x67D7: 0x96B7, - 0x67D8: 0xE8CF, - 0x67D9: 0xE8D4, - 0x67DA: 0xE8D6, - 0x67DB: 0x96B8, - 0x67DC: 0xB9F1, - 0x67DD: 0xE8D8, - 0x67DE: 0xD7F5, - 0x67DF: 0x96B9, - 0x67E0: 0xC4FB, - 0x67E1: 0x96BA, - 0x67E2: 0xE8DC, - 0x67E3: 0x96BB, - 0x67E4: 0x96BC, - 0x67E5: 0xB2E9, - 0x67E6: 0x96BD, - 0x67E7: 0x96BE, - 0x67E8: 0x96BF, - 0x67E9: 0xE8D1, - 0x67EA: 0x96C0, - 0x67EB: 0x96C1, - 0x67EC: 0xBCED, - 0x67ED: 0x96C2, - 0x67EE: 0x96C3, - 0x67EF: 0xBFC2, - 0x67F0: 0xE8CD, - 0x67F1: 0xD6F9, - 0x67F2: 0x96C4, - 0x67F3: 0xC1F8, - 0x67F4: 0xB2F1, - 0x67F5: 0x96C5, - 0x67F6: 0x96C6, - 0x67F7: 0x96C7, - 0x67F8: 0x96C8, - 0x67F9: 0x96C9, - 0x67FA: 0x96CA, - 0x67FB: 0x96CB, - 0x67FC: 0x96CC, - 0x67FD: 0xE8DF, - 0x67FE: 0x96CD, - 0x67FF: 0xCAC1, - 0x6800: 0xE8D9, - 0x6801: 0x96CE, - 0x6802: 0x96CF, - 0x6803: 0x96D0, - 0x6804: 0x96D1, - 0x6805: 0xD5A4, - 0x6806: 0x96D2, - 0x6807: 0xB1EA, - 0x6808: 0xD5BB, - 0x6809: 0xE8CE, - 0x680A: 0xE8D0, - 0x680B: 0xB6B0, - 0x680C: 0xE8D3, - 0x680D: 0x96D3, - 0x680E: 0xE8DD, - 0x680F: 0xC0B8, - 0x6810: 0x96D4, - 0x6811: 0xCAF7, - 0x6812: 0x96D5, - 0x6813: 0xCBA8, - 0x6814: 0x96D6, - 0x6815: 0x96D7, - 0x6816: 0xC6DC, - 0x6817: 0xC0F5, - 0x6818: 0x96D8, - 0x6819: 0x96D9, - 0x681A: 0x96DA, - 0x681B: 0x96DB, - 0x681C: 0x96DC, - 0x681D: 0xE8E9, - 0x681E: 0x96DD, - 0x681F: 0x96DE, - 0x6820: 0x96DF, - 0x6821: 0xD0A3, - 0x6822: 0x96E0, - 0x6823: 0x96E1, - 0x6824: 0x96E2, - 0x6825: 0x96E3, - 0x6826: 0x96E4, - 0x6827: 0x96E5, - 0x6828: 0x96E6, - 0x6829: 0xE8F2, - 0x682A: 0xD6EA, - 0x682B: 0x96E7, - 0x682C: 0x96E8, - 0x682D: 0x96E9, - 0x682E: 0x96EA, - 0x682F: 0x96EB, - 0x6830: 0x96EC, - 0x6831: 0x96ED, - 0x6832: 0xE8E0, - 0x6833: 0xE8E1, - 0x6834: 0x96EE, - 0x6835: 0x96EF, - 0x6836: 0x96F0, - 0x6837: 0xD1F9, - 0x6838: 0xBACB, - 0x6839: 0xB8F9, - 0x683A: 0x96F1, - 0x683B: 0x96F2, - 0x683C: 0xB8F1, - 0x683D: 0xD4D4, - 0x683E: 0xE8EF, - 0x683F: 0x96F3, - 0x6840: 0xE8EE, - 0x6841: 0xE8EC, - 0x6842: 0xB9F0, - 0x6843: 0xCCD2, - 0x6844: 0xE8E6, - 0x6845: 0xCEA6, - 0x6846: 0xBFF2, - 0x6847: 0x96F4, - 0x6848: 0xB0B8, - 0x6849: 0xE8F1, - 0x684A: 0xE8F0, - 0x684B: 0x96F5, - 0x684C: 0xD7C0, - 0x684D: 0x96F6, - 0x684E: 0xE8E4, - 0x684F: 0x96F7, - 0x6850: 0xCDA9, - 0x6851: 0xC9A3, - 0x6852: 0x96F8, - 0x6853: 0xBBB8, - 0x6854: 0xBDDB, - 0x6855: 0xE8EA, - 0x6856: 0x96F9, - 0x6857: 0x96FA, - 0x6858: 0x96FB, - 0x6859: 0x96FC, - 0x685A: 0x96FD, - 0x685B: 0x96FE, - 0x685C: 0x9740, - 0x685D: 0x9741, - 0x685E: 0x9742, - 0x685F: 0x9743, - 0x6860: 0xE8E2, - 0x6861: 0xE8E3, - 0x6862: 0xE8E5, - 0x6863: 0xB5B5, - 0x6864: 0xE8E7, - 0x6865: 0xC7C5, - 0x6866: 0xE8EB, - 0x6867: 0xE8ED, - 0x6868: 0xBDB0, - 0x6869: 0xD7AE, - 0x686A: 0x9744, - 0x686B: 0xE8F8, - 0x686C: 0x9745, - 0x686D: 0x9746, - 0x686E: 0x9747, - 0x686F: 0x9748, - 0x6870: 0x9749, - 0x6871: 0x974A, - 0x6872: 0x974B, - 0x6873: 0x974C, - 0x6874: 0xE8F5, - 0x6875: 0x974D, - 0x6876: 0xCDB0, - 0x6877: 0xE8F6, - 0x6878: 0x974E, - 0x6879: 0x974F, - 0x687A: 0x9750, - 0x687B: 0x9751, - 0x687C: 0x9752, - 0x687D: 0x9753, - 0x687E: 0x9754, - 0x687F: 0x9755, - 0x6880: 0x9756, - 0x6881: 0xC1BA, - 0x6882: 0x9757, - 0x6883: 0xE8E8, - 0x6884: 0x9758, - 0x6885: 0xC3B7, - 0x6886: 0xB0F0, - 0x6887: 0x9759, - 0x6888: 0x975A, - 0x6889: 0x975B, - 0x688A: 0x975C, - 0x688B: 0x975D, - 0x688C: 0x975E, - 0x688D: 0x975F, - 0x688E: 0x9760, - 0x688F: 0xE8F4, - 0x6890: 0x9761, - 0x6891: 0x9762, - 0x6892: 0x9763, - 0x6893: 0xE8F7, - 0x6894: 0x9764, - 0x6895: 0x9765, - 0x6896: 0x9766, - 0x6897: 0xB9A3, - 0x6898: 0x9767, - 0x6899: 0x9768, - 0x689A: 0x9769, - 0x689B: 0x976A, - 0x689C: 0x976B, - 0x689D: 0x976C, - 0x689E: 0x976D, - 0x689F: 0x976E, - 0x68A0: 0x976F, - 0x68A1: 0x9770, - 0x68A2: 0xC9D2, - 0x68A3: 0x9771, - 0x68A4: 0x9772, - 0x68A5: 0x9773, - 0x68A6: 0xC3CE, - 0x68A7: 0xCEE0, - 0x68A8: 0xC0E6, - 0x68A9: 0x9774, - 0x68AA: 0x9775, - 0x68AB: 0x9776, - 0x68AC: 0x9777, - 0x68AD: 0xCBF3, - 0x68AE: 0x9778, - 0x68AF: 0xCCDD, - 0x68B0: 0xD0B5, - 0x68B1: 0x9779, - 0x68B2: 0x977A, - 0x68B3: 0xCAE1, - 0x68B4: 0x977B, - 0x68B5: 0xE8F3, - 0x68B6: 0x977C, - 0x68B7: 0x977D, - 0x68B8: 0x977E, - 0x68B9: 0x9780, - 0x68BA: 0x9781, - 0x68BB: 0x9782, - 0x68BC: 0x9783, - 0x68BD: 0x9784, - 0x68BE: 0x9785, - 0x68BF: 0x9786, - 0x68C0: 0xBCEC, - 0x68C1: 0x9787, - 0x68C2: 0xE8F9, - 0x68C3: 0x9788, - 0x68C4: 0x9789, - 0x68C5: 0x978A, - 0x68C6: 0x978B, - 0x68C7: 0x978C, - 0x68C8: 0x978D, - 0x68C9: 0xC3DE, - 0x68CA: 0x978E, - 0x68CB: 0xC6E5, - 0x68CC: 0x978F, - 0x68CD: 0xB9F7, - 0x68CE: 0x9790, - 0x68CF: 0x9791, - 0x68D0: 0x9792, - 0x68D1: 0x9793, - 0x68D2: 0xB0F4, - 0x68D3: 0x9794, - 0x68D4: 0x9795, - 0x68D5: 0xD7D8, - 0x68D6: 0x9796, - 0x68D7: 0x9797, - 0x68D8: 0xBCAC, - 0x68D9: 0x9798, - 0x68DA: 0xC5EF, - 0x68DB: 0x9799, - 0x68DC: 0x979A, - 0x68DD: 0x979B, - 0x68DE: 0x979C, - 0x68DF: 0x979D, - 0x68E0: 0xCCC4, - 0x68E1: 0x979E, - 0x68E2: 0x979F, - 0x68E3: 0xE9A6, - 0x68E4: 0x97A0, - 0x68E5: 0x97A1, - 0x68E6: 0x97A2, - 0x68E7: 0x97A3, - 0x68E8: 0x97A4, - 0x68E9: 0x97A5, - 0x68EA: 0x97A6, - 0x68EB: 0x97A7, - 0x68EC: 0x97A8, - 0x68ED: 0x97A9, - 0x68EE: 0xC9AD, - 0x68EF: 0x97AA, - 0x68F0: 0xE9A2, - 0x68F1: 0xC0E2, - 0x68F2: 0x97AB, - 0x68F3: 0x97AC, - 0x68F4: 0x97AD, - 0x68F5: 0xBFC3, - 0x68F6: 0x97AE, - 0x68F7: 0x97AF, - 0x68F8: 0x97B0, - 0x68F9: 0xE8FE, - 0x68FA: 0xB9D7, - 0x68FB: 0x97B1, - 0x68FC: 0xE8FB, - 0x68FD: 0x97B2, - 0x68FE: 0x97B3, - 0x68FF: 0x97B4, - 0x6900: 0x97B5, - 0x6901: 0xE9A4, - 0x6902: 0x97B6, - 0x6903: 0x97B7, - 0x6904: 0x97B8, - 0x6905: 0xD2CE, - 0x6906: 0x97B9, - 0x6907: 0x97BA, - 0x6908: 0x97BB, - 0x6909: 0x97BC, - 0x690A: 0x97BD, - 0x690B: 0xE9A3, - 0x690C: 0x97BE, - 0x690D: 0xD6B2, - 0x690E: 0xD7B5, - 0x690F: 0x97BF, - 0x6910: 0xE9A7, - 0x6911: 0x97C0, - 0x6912: 0xBDB7, - 0x6913: 0x97C1, - 0x6914: 0x97C2, - 0x6915: 0x97C3, - 0x6916: 0x97C4, - 0x6917: 0x97C5, - 0x6918: 0x97C6, - 0x6919: 0x97C7, - 0x691A: 0x97C8, - 0x691B: 0x97C9, - 0x691C: 0x97CA, - 0x691D: 0x97CB, - 0x691E: 0x97CC, - 0x691F: 0xE8FC, - 0x6920: 0xE8FD, - 0x6921: 0x97CD, - 0x6922: 0x97CE, - 0x6923: 0x97CF, - 0x6924: 0xE9A1, - 0x6925: 0x97D0, - 0x6926: 0x97D1, - 0x6927: 0x97D2, - 0x6928: 0x97D3, - 0x6929: 0x97D4, - 0x692A: 0x97D5, - 0x692B: 0x97D6, - 0x692C: 0x97D7, - 0x692D: 0xCDD6, - 0x692E: 0x97D8, - 0x692F: 0x97D9, - 0x6930: 0xD2AC, - 0x6931: 0x97DA, - 0x6932: 0x97DB, - 0x6933: 0x97DC, - 0x6934: 0xE9B2, - 0x6935: 0x97DD, - 0x6936: 0x97DE, - 0x6937: 0x97DF, - 0x6938: 0x97E0, - 0x6939: 0xE9A9, - 0x693A: 0x97E1, - 0x693B: 0x97E2, - 0x693C: 0x97E3, - 0x693D: 0xB4AA, - 0x693E: 0x97E4, - 0x693F: 0xB4BB, - 0x6940: 0x97E5, - 0x6941: 0x97E6, - 0x6942: 0xE9AB, - 0x6943: 0x97E7, - 0x6944: 0x97E8, - 0x6945: 0x97E9, - 0x6946: 0x97EA, - 0x6947: 0x97EB, - 0x6948: 0x97EC, - 0x6949: 0x97ED, - 0x694A: 0x97EE, - 0x694B: 0x97EF, - 0x694C: 0x97F0, - 0x694D: 0x97F1, - 0x694E: 0x97F2, - 0x694F: 0x97F3, - 0x6950: 0x97F4, - 0x6951: 0x97F5, - 0x6952: 0x97F6, - 0x6953: 0x97F7, - 0x6954: 0xD0A8, - 0x6955: 0x97F8, - 0x6956: 0x97F9, - 0x6957: 0xE9A5, - 0x6958: 0x97FA, - 0x6959: 0x97FB, - 0x695A: 0xB3FE, - 0x695B: 0x97FC, - 0x695C: 0x97FD, - 0x695D: 0xE9AC, - 0x695E: 0xC0E3, - 0x695F: 0x97FE, - 0x6960: 0xE9AA, - 0x6961: 0x9840, - 0x6962: 0x9841, - 0x6963: 0xE9B9, - 0x6964: 0x9842, - 0x6965: 0x9843, - 0x6966: 0xE9B8, - 0x6967: 0x9844, - 0x6968: 0x9845, - 0x6969: 0x9846, - 0x696A: 0x9847, - 0x696B: 0xE9AE, - 0x696C: 0x9848, - 0x696D: 0x9849, - 0x696E: 0xE8FA, - 0x696F: 0x984A, - 0x6970: 0x984B, - 0x6971: 0xE9A8, - 0x6972: 0x984C, - 0x6973: 0x984D, - 0x6974: 0x984E, - 0x6975: 0x984F, - 0x6976: 0x9850, - 0x6977: 0xBFAC, - 0x6978: 0xE9B1, - 0x6979: 0xE9BA, - 0x697A: 0x9851, - 0x697B: 0x9852, - 0x697C: 0xC2A5, - 0x697D: 0x9853, - 0x697E: 0x9854, - 0x697F: 0x9855, - 0x6980: 0xE9AF, - 0x6981: 0x9856, - 0x6982: 0xB8C5, - 0x6983: 0x9857, - 0x6984: 0xE9AD, - 0x6985: 0x9858, - 0x6986: 0xD3DC, - 0x6987: 0xE9B4, - 0x6988: 0xE9B5, - 0x6989: 0xE9B7, - 0x698A: 0x9859, - 0x698B: 0x985A, - 0x698C: 0x985B, - 0x698D: 0xE9C7, - 0x698E: 0x985C, - 0x698F: 0x985D, - 0x6990: 0x985E, - 0x6991: 0x985F, - 0x6992: 0x9860, - 0x6993: 0x9861, - 0x6994: 0xC0C6, - 0x6995: 0xE9C5, - 0x6996: 0x9862, - 0x6997: 0x9863, - 0x6998: 0xE9B0, - 0x6999: 0x9864, - 0x699A: 0x9865, - 0x699B: 0xE9BB, - 0x699C: 0xB0F1, - 0x699D: 0x9866, - 0x699E: 0x9867, - 0x699F: 0x9868, - 0x69A0: 0x9869, - 0x69A1: 0x986A, - 0x69A2: 0x986B, - 0x69A3: 0x986C, - 0x69A4: 0x986D, - 0x69A5: 0x986E, - 0x69A6: 0x986F, - 0x69A7: 0xE9BC, - 0x69A8: 0xD5A5, - 0x69A9: 0x9870, - 0x69AA: 0x9871, - 0x69AB: 0xE9BE, - 0x69AC: 0x9872, - 0x69AD: 0xE9BF, - 0x69AE: 0x9873, - 0x69AF: 0x9874, - 0x69B0: 0x9875, - 0x69B1: 0xE9C1, - 0x69B2: 0x9876, - 0x69B3: 0x9877, - 0x69B4: 0xC1F1, - 0x69B5: 0x9878, - 0x69B6: 0x9879, - 0x69B7: 0xC8B6, - 0x69B8: 0x987A, - 0x69B9: 0x987B, - 0x69BA: 0x987C, - 0x69BB: 0xE9BD, - 0x69BC: 0x987D, - 0x69BD: 0x987E, - 0x69BE: 0x9880, - 0x69BF: 0x9881, - 0x69C0: 0x9882, - 0x69C1: 0xE9C2, - 0x69C2: 0x9883, - 0x69C3: 0x9884, - 0x69C4: 0x9885, - 0x69C5: 0x9886, - 0x69C6: 0x9887, - 0x69C7: 0x9888, - 0x69C8: 0x9889, - 0x69C9: 0x988A, - 0x69CA: 0xE9C3, - 0x69CB: 0x988B, - 0x69CC: 0xE9B3, - 0x69CD: 0x988C, - 0x69CE: 0xE9B6, - 0x69CF: 0x988D, - 0x69D0: 0xBBB1, - 0x69D1: 0x988E, - 0x69D2: 0x988F, - 0x69D3: 0x9890, - 0x69D4: 0xE9C0, - 0x69D5: 0x9891, - 0x69D6: 0x9892, - 0x69D7: 0x9893, - 0x69D8: 0x9894, - 0x69D9: 0x9895, - 0x69DA: 0x9896, - 0x69DB: 0xBCF7, - 0x69DC: 0x9897, - 0x69DD: 0x9898, - 0x69DE: 0x9899, - 0x69DF: 0xE9C4, - 0x69E0: 0xE9C6, - 0x69E1: 0x989A, - 0x69E2: 0x989B, - 0x69E3: 0x989C, - 0x69E4: 0x989D, - 0x69E5: 0x989E, - 0x69E6: 0x989F, - 0x69E7: 0x98A0, - 0x69E8: 0x98A1, - 0x69E9: 0x98A2, - 0x69EA: 0x98A3, - 0x69EB: 0x98A4, - 0x69EC: 0x98A5, - 0x69ED: 0xE9CA, - 0x69EE: 0x98A6, - 0x69EF: 0x98A7, - 0x69F0: 0x98A8, - 0x69F1: 0x98A9, - 0x69F2: 0xE9CE, - 0x69F3: 0x98AA, - 0x69F4: 0x98AB, - 0x69F5: 0x98AC, - 0x69F6: 0x98AD, - 0x69F7: 0x98AE, - 0x69F8: 0x98AF, - 0x69F9: 0x98B0, - 0x69FA: 0x98B1, - 0x69FB: 0x98B2, - 0x69FC: 0x98B3, - 0x69FD: 0xB2DB, - 0x69FE: 0x98B4, - 0x69FF: 0xE9C8, - 0x6A00: 0x98B5, - 0x6A01: 0x98B6, - 0x6A02: 0x98B7, - 0x6A03: 0x98B8, - 0x6A04: 0x98B9, - 0x6A05: 0x98BA, - 0x6A06: 0x98BB, - 0x6A07: 0x98BC, - 0x6A08: 0x98BD, - 0x6A09: 0x98BE, - 0x6A0A: 0xB7AE, - 0x6A0B: 0x98BF, - 0x6A0C: 0x98C0, - 0x6A0D: 0x98C1, - 0x6A0E: 0x98C2, - 0x6A0F: 0x98C3, - 0x6A10: 0x98C4, - 0x6A11: 0x98C5, - 0x6A12: 0x98C6, - 0x6A13: 0x98C7, - 0x6A14: 0x98C8, - 0x6A15: 0x98C9, - 0x6A16: 0x98CA, - 0x6A17: 0xE9CB, - 0x6A18: 0xE9CC, - 0x6A19: 0x98CB, - 0x6A1A: 0x98CC, - 0x6A1B: 0x98CD, - 0x6A1C: 0x98CE, - 0x6A1D: 0x98CF, - 0x6A1E: 0x98D0, - 0x6A1F: 0xD5C1, - 0x6A20: 0x98D1, - 0x6A21: 0xC4A3, - 0x6A22: 0x98D2, - 0x6A23: 0x98D3, - 0x6A24: 0x98D4, - 0x6A25: 0x98D5, - 0x6A26: 0x98D6, - 0x6A27: 0x98D7, - 0x6A28: 0xE9D8, - 0x6A29: 0x98D8, - 0x6A2A: 0xBAE1, - 0x6A2B: 0x98D9, - 0x6A2C: 0x98DA, - 0x6A2D: 0x98DB, - 0x6A2E: 0x98DC, - 0x6A2F: 0xE9C9, - 0x6A30: 0x98DD, - 0x6A31: 0xD3A3, - 0x6A32: 0x98DE, - 0x6A33: 0x98DF, - 0x6A34: 0x98E0, - 0x6A35: 0xE9D4, - 0x6A36: 0x98E1, - 0x6A37: 0x98E2, - 0x6A38: 0x98E3, - 0x6A39: 0x98E4, - 0x6A3A: 0x98E5, - 0x6A3B: 0x98E6, - 0x6A3C: 0x98E7, - 0x6A3D: 0xE9D7, - 0x6A3E: 0xE9D0, - 0x6A3F: 0x98E8, - 0x6A40: 0x98E9, - 0x6A41: 0x98EA, - 0x6A42: 0x98EB, - 0x6A43: 0x98EC, - 0x6A44: 0xE9CF, - 0x6A45: 0x98ED, - 0x6A46: 0x98EE, - 0x6A47: 0xC7C1, - 0x6A48: 0x98EF, - 0x6A49: 0x98F0, - 0x6A4A: 0x98F1, - 0x6A4B: 0x98F2, - 0x6A4C: 0x98F3, - 0x6A4D: 0x98F4, - 0x6A4E: 0x98F5, - 0x6A4F: 0x98F6, - 0x6A50: 0xE9D2, - 0x6A51: 0x98F7, - 0x6A52: 0x98F8, - 0x6A53: 0x98F9, - 0x6A54: 0x98FA, - 0x6A55: 0x98FB, - 0x6A56: 0x98FC, - 0x6A57: 0x98FD, - 0x6A58: 0xE9D9, - 0x6A59: 0xB3C8, - 0x6A5A: 0x98FE, - 0x6A5B: 0xE9D3, - 0x6A5C: 0x9940, - 0x6A5D: 0x9941, - 0x6A5E: 0x9942, - 0x6A5F: 0x9943, - 0x6A60: 0x9944, - 0x6A61: 0xCFF0, - 0x6A62: 0x9945, - 0x6A63: 0x9946, - 0x6A64: 0x9947, - 0x6A65: 0xE9CD, - 0x6A66: 0x9948, - 0x6A67: 0x9949, - 0x6A68: 0x994A, - 0x6A69: 0x994B, - 0x6A6A: 0x994C, - 0x6A6B: 0x994D, - 0x6A6C: 0x994E, - 0x6A6D: 0x994F, - 0x6A6E: 0x9950, - 0x6A6F: 0x9951, - 0x6A70: 0x9952, - 0x6A71: 0xB3F7, - 0x6A72: 0x9953, - 0x6A73: 0x9954, - 0x6A74: 0x9955, - 0x6A75: 0x9956, - 0x6A76: 0x9957, - 0x6A77: 0x9958, - 0x6A78: 0x9959, - 0x6A79: 0xE9D6, - 0x6A7A: 0x995A, - 0x6A7B: 0x995B, - 0x6A7C: 0xE9DA, - 0x6A7D: 0x995C, - 0x6A7E: 0x995D, - 0x6A7F: 0x995E, - 0x6A80: 0xCCB4, - 0x6A81: 0x995F, - 0x6A82: 0x9960, - 0x6A83: 0x9961, - 0x6A84: 0xCFAD, - 0x6A85: 0x9962, - 0x6A86: 0x9963, - 0x6A87: 0x9964, - 0x6A88: 0x9965, - 0x6A89: 0x9966, - 0x6A8A: 0x9967, - 0x6A8B: 0x9968, - 0x6A8C: 0x9969, - 0x6A8D: 0x996A, - 0x6A8E: 0xE9D5, - 0x6A8F: 0x996B, - 0x6A90: 0xE9DC, - 0x6A91: 0xE9DB, - 0x6A92: 0x996C, - 0x6A93: 0x996D, - 0x6A94: 0x996E, - 0x6A95: 0x996F, - 0x6A96: 0x9970, - 0x6A97: 0xE9DE, - 0x6A98: 0x9971, - 0x6A99: 0x9972, - 0x6A9A: 0x9973, - 0x6A9B: 0x9974, - 0x6A9C: 0x9975, - 0x6A9D: 0x9976, - 0x6A9E: 0x9977, - 0x6A9F: 0x9978, - 0x6AA0: 0xE9D1, - 0x6AA1: 0x9979, - 0x6AA2: 0x997A, - 0x6AA3: 0x997B, - 0x6AA4: 0x997C, - 0x6AA5: 0x997D, - 0x6AA6: 0x997E, - 0x6AA7: 0x9980, - 0x6AA8: 0x9981, - 0x6AA9: 0xE9DD, - 0x6AAA: 0x9982, - 0x6AAB: 0xE9DF, - 0x6AAC: 0xC3CA, - 0x6AAD: 0x9983, - 0x6AAE: 0x9984, - 0x6AAF: 0x9985, - 0x6AB0: 0x9986, - 0x6AB1: 0x9987, - 0x6AB2: 0x9988, - 0x6AB3: 0x9989, - 0x6AB4: 0x998A, - 0x6AB5: 0x998B, - 0x6AB6: 0x998C, - 0x6AB7: 0x998D, - 0x6AB8: 0x998E, - 0x6AB9: 0x998F, - 0x6ABA: 0x9990, - 0x6ABB: 0x9991, - 0x6ABC: 0x9992, - 0x6ABD: 0x9993, - 0x6ABE: 0x9994, - 0x6ABF: 0x9995, - 0x6AC0: 0x9996, - 0x6AC1: 0x9997, - 0x6AC2: 0x9998, - 0x6AC3: 0x9999, - 0x6AC4: 0x999A, - 0x6AC5: 0x999B, - 0x6AC6: 0x999C, - 0x6AC7: 0x999D, - 0x6AC8: 0x999E, - 0x6AC9: 0x999F, - 0x6ACA: 0x99A0, - 0x6ACB: 0x99A1, - 0x6ACC: 0x99A2, - 0x6ACD: 0x99A3, - 0x6ACE: 0x99A4, - 0x6ACF: 0x99A5, - 0x6AD0: 0x99A6, - 0x6AD1: 0x99A7, - 0x6AD2: 0x99A8, - 0x6AD3: 0x99A9, - 0x6AD4: 0x99AA, - 0x6AD5: 0x99AB, - 0x6AD6: 0x99AC, - 0x6AD7: 0x99AD, - 0x6AD8: 0x99AE, - 0x6AD9: 0x99AF, - 0x6ADA: 0x99B0, - 0x6ADB: 0x99B1, - 0x6ADC: 0x99B2, - 0x6ADD: 0x99B3, - 0x6ADE: 0x99B4, - 0x6ADF: 0x99B5, - 0x6AE0: 0x99B6, - 0x6AE1: 0x99B7, - 0x6AE2: 0x99B8, - 0x6AE3: 0x99B9, - 0x6AE4: 0x99BA, - 0x6AE5: 0x99BB, - 0x6AE6: 0x99BC, - 0x6AE7: 0x99BD, - 0x6AE8: 0x99BE, - 0x6AE9: 0x99BF, - 0x6AEA: 0x99C0, - 0x6AEB: 0x99C1, - 0x6AEC: 0x99C2, - 0x6AED: 0x99C3, - 0x6AEE: 0x99C4, - 0x6AEF: 0x99C5, - 0x6AF0: 0x99C6, - 0x6AF1: 0x99C7, - 0x6AF2: 0x99C8, - 0x6AF3: 0x99C9, - 0x6AF4: 0x99CA, - 0x6AF5: 0x99CB, - 0x6AF6: 0x99CC, - 0x6AF7: 0x99CD, - 0x6AF8: 0x99CE, - 0x6AF9: 0x99CF, - 0x6AFA: 0x99D0, - 0x6AFB: 0x99D1, - 0x6AFC: 0x99D2, - 0x6AFD: 0x99D3, - 0x6AFE: 0x99D4, - 0x6AFF: 0x99D5, - 0x6B00: 0x99D6, - 0x6B01: 0x99D7, - 0x6B02: 0x99D8, - 0x6B03: 0x99D9, - 0x6B04: 0x99DA, - 0x6B05: 0x99DB, - 0x6B06: 0x99DC, - 0x6B07: 0x99DD, - 0x6B08: 0x99DE, - 0x6B09: 0x99DF, - 0x6B0A: 0x99E0, - 0x6B0B: 0x99E1, - 0x6B0C: 0x99E2, - 0x6B0D: 0x99E3, - 0x6B0E: 0x99E4, - 0x6B0F: 0x99E5, - 0x6B10: 0x99E6, - 0x6B11: 0x99E7, - 0x6B12: 0x99E8, - 0x6B13: 0x99E9, - 0x6B14: 0x99EA, - 0x6B15: 0x99EB, - 0x6B16: 0x99EC, - 0x6B17: 0x99ED, - 0x6B18: 0x99EE, - 0x6B19: 0x99EF, - 0x6B1A: 0x99F0, - 0x6B1B: 0x99F1, - 0x6B1C: 0x99F2, - 0x6B1D: 0x99F3, - 0x6B1E: 0x99F4, - 0x6B1F: 0x99F5, - 0x6B20: 0xC7B7, - 0x6B21: 0xB4CE, - 0x6B22: 0xBBB6, - 0x6B23: 0xD0C0, - 0x6B24: 0xECA3, - 0x6B25: 0x99F6, - 0x6B26: 0x99F7, - 0x6B27: 0xC5B7, - 0x6B28: 0x99F8, - 0x6B29: 0x99F9, - 0x6B2A: 0x99FA, - 0x6B2B: 0x99FB, - 0x6B2C: 0x99FC, - 0x6B2D: 0x99FD, - 0x6B2E: 0x99FE, - 0x6B2F: 0x9A40, - 0x6B30: 0x9A41, - 0x6B31: 0x9A42, - 0x6B32: 0xD3FB, - 0x6B33: 0x9A43, - 0x6B34: 0x9A44, - 0x6B35: 0x9A45, - 0x6B36: 0x9A46, - 0x6B37: 0xECA4, - 0x6B38: 0x9A47, - 0x6B39: 0xECA5, - 0x6B3A: 0xC6DB, - 0x6B3B: 0x9A48, - 0x6B3C: 0x9A49, - 0x6B3D: 0x9A4A, - 0x6B3E: 0xBFEE, - 0x6B3F: 0x9A4B, - 0x6B40: 0x9A4C, - 0x6B41: 0x9A4D, - 0x6B42: 0x9A4E, - 0x6B43: 0xECA6, - 0x6B44: 0x9A4F, - 0x6B45: 0x9A50, - 0x6B46: 0xECA7, - 0x6B47: 0xD0AA, - 0x6B48: 0x9A51, - 0x6B49: 0xC7B8, - 0x6B4A: 0x9A52, - 0x6B4B: 0x9A53, - 0x6B4C: 0xB8E8, - 0x6B4D: 0x9A54, - 0x6B4E: 0x9A55, - 0x6B4F: 0x9A56, - 0x6B50: 0x9A57, - 0x6B51: 0x9A58, - 0x6B52: 0x9A59, - 0x6B53: 0x9A5A, - 0x6B54: 0x9A5B, - 0x6B55: 0x9A5C, - 0x6B56: 0x9A5D, - 0x6B57: 0x9A5E, - 0x6B58: 0x9A5F, - 0x6B59: 0xECA8, - 0x6B5A: 0x9A60, - 0x6B5B: 0x9A61, - 0x6B5C: 0x9A62, - 0x6B5D: 0x9A63, - 0x6B5E: 0x9A64, - 0x6B5F: 0x9A65, - 0x6B60: 0x9A66, - 0x6B61: 0x9A67, - 0x6B62: 0xD6B9, - 0x6B63: 0xD5FD, - 0x6B64: 0xB4CB, - 0x6B65: 0xB2BD, - 0x6B66: 0xCEE4, - 0x6B67: 0xC6E7, - 0x6B68: 0x9A68, - 0x6B69: 0x9A69, - 0x6B6A: 0xCDE1, - 0x6B6B: 0x9A6A, - 0x6B6C: 0x9A6B, - 0x6B6D: 0x9A6C, - 0x6B6E: 0x9A6D, - 0x6B6F: 0x9A6E, - 0x6B70: 0x9A6F, - 0x6B71: 0x9A70, - 0x6B72: 0x9A71, - 0x6B73: 0x9A72, - 0x6B74: 0x9A73, - 0x6B75: 0x9A74, - 0x6B76: 0x9A75, - 0x6B77: 0x9A76, - 0x6B78: 0x9A77, - 0x6B79: 0xB4F5, - 0x6B7A: 0x9A78, - 0x6B7B: 0xCBC0, - 0x6B7C: 0xBCDF, - 0x6B7D: 0x9A79, - 0x6B7E: 0x9A7A, - 0x6B7F: 0x9A7B, - 0x6B80: 0x9A7C, - 0x6B81: 0xE9E2, - 0x6B82: 0xE9E3, - 0x6B83: 0xD1EA, - 0x6B84: 0xE9E5, - 0x6B85: 0x9A7D, - 0x6B86: 0xB4F9, - 0x6B87: 0xE9E4, - 0x6B88: 0x9A7E, - 0x6B89: 0xD1B3, - 0x6B8A: 0xCAE2, - 0x6B8B: 0xB2D0, - 0x6B8C: 0x9A80, - 0x6B8D: 0xE9E8, - 0x6B8E: 0x9A81, - 0x6B8F: 0x9A82, - 0x6B90: 0x9A83, - 0x6B91: 0x9A84, - 0x6B92: 0xE9E6, - 0x6B93: 0xE9E7, - 0x6B94: 0x9A85, - 0x6B95: 0x9A86, - 0x6B96: 0xD6B3, - 0x6B97: 0x9A87, - 0x6B98: 0x9A88, - 0x6B99: 0x9A89, - 0x6B9A: 0xE9E9, - 0x6B9B: 0xE9EA, - 0x6B9C: 0x9A8A, - 0x6B9D: 0x9A8B, - 0x6B9E: 0x9A8C, - 0x6B9F: 0x9A8D, - 0x6BA0: 0x9A8E, - 0x6BA1: 0xE9EB, - 0x6BA2: 0x9A8F, - 0x6BA3: 0x9A90, - 0x6BA4: 0x9A91, - 0x6BA5: 0x9A92, - 0x6BA6: 0x9A93, - 0x6BA7: 0x9A94, - 0x6BA8: 0x9A95, - 0x6BA9: 0x9A96, - 0x6BAA: 0xE9EC, - 0x6BAB: 0x9A97, - 0x6BAC: 0x9A98, - 0x6BAD: 0x9A99, - 0x6BAE: 0x9A9A, - 0x6BAF: 0x9A9B, - 0x6BB0: 0x9A9C, - 0x6BB1: 0x9A9D, - 0x6BB2: 0x9A9E, - 0x6BB3: 0xECAF, - 0x6BB4: 0xC5B9, - 0x6BB5: 0xB6CE, - 0x6BB6: 0x9A9F, - 0x6BB7: 0xD2F3, - 0x6BB8: 0x9AA0, - 0x6BB9: 0x9AA1, - 0x6BBA: 0x9AA2, - 0x6BBB: 0x9AA3, - 0x6BBC: 0x9AA4, - 0x6BBD: 0x9AA5, - 0x6BBE: 0x9AA6, - 0x6BBF: 0xB5EE, - 0x6BC0: 0x9AA7, - 0x6BC1: 0xBBD9, - 0x6BC2: 0xECB1, - 0x6BC3: 0x9AA8, - 0x6BC4: 0x9AA9, - 0x6BC5: 0xD2E3, - 0x6BC6: 0x9AAA, - 0x6BC7: 0x9AAB, - 0x6BC8: 0x9AAC, - 0x6BC9: 0x9AAD, - 0x6BCA: 0x9AAE, - 0x6BCB: 0xCEE3, - 0x6BCC: 0x9AAF, - 0x6BCD: 0xC4B8, - 0x6BCE: 0x9AB0, - 0x6BCF: 0xC3BF, - 0x6BD0: 0x9AB1, - 0x6BD1: 0x9AB2, - 0x6BD2: 0xB6BE, - 0x6BD3: 0xD8B9, - 0x6BD4: 0xB1C8, - 0x6BD5: 0xB1CF, - 0x6BD6: 0xB1D1, - 0x6BD7: 0xC5FE, - 0x6BD8: 0x9AB3, - 0x6BD9: 0xB1D0, - 0x6BDA: 0x9AB4, - 0x6BDB: 0xC3AB, - 0x6BDC: 0x9AB5, - 0x6BDD: 0x9AB6, - 0x6BDE: 0x9AB7, - 0x6BDF: 0x9AB8, - 0x6BE0: 0x9AB9, - 0x6BE1: 0xD5B1, - 0x6BE2: 0x9ABA, - 0x6BE3: 0x9ABB, - 0x6BE4: 0x9ABC, - 0x6BE5: 0x9ABD, - 0x6BE6: 0x9ABE, - 0x6BE7: 0x9ABF, - 0x6BE8: 0x9AC0, - 0x6BE9: 0x9AC1, - 0x6BEA: 0xEBA4, - 0x6BEB: 0xBAC1, - 0x6BEC: 0x9AC2, - 0x6BED: 0x9AC3, - 0x6BEE: 0x9AC4, - 0x6BEF: 0xCCBA, - 0x6BF0: 0x9AC5, - 0x6BF1: 0x9AC6, - 0x6BF2: 0x9AC7, - 0x6BF3: 0xEBA5, - 0x6BF4: 0x9AC8, - 0x6BF5: 0xEBA7, - 0x6BF6: 0x9AC9, - 0x6BF7: 0x9ACA, - 0x6BF8: 0x9ACB, - 0x6BF9: 0xEBA8, - 0x6BFA: 0x9ACC, - 0x6BFB: 0x9ACD, - 0x6BFC: 0x9ACE, - 0x6BFD: 0xEBA6, - 0x6BFE: 0x9ACF, - 0x6BFF: 0x9AD0, - 0x6C00: 0x9AD1, - 0x6C01: 0x9AD2, - 0x6C02: 0x9AD3, - 0x6C03: 0x9AD4, - 0x6C04: 0x9AD5, - 0x6C05: 0xEBA9, - 0x6C06: 0xEBAB, - 0x6C07: 0xEBAA, - 0x6C08: 0x9AD6, - 0x6C09: 0x9AD7, - 0x6C0A: 0x9AD8, - 0x6C0B: 0x9AD9, - 0x6C0C: 0x9ADA, - 0x6C0D: 0xEBAC, - 0x6C0E: 0x9ADB, - 0x6C0F: 0xCACF, - 0x6C10: 0xD8B5, - 0x6C11: 0xC3F1, - 0x6C12: 0x9ADC, - 0x6C13: 0xC3A5, - 0x6C14: 0xC6F8, - 0x6C15: 0xEBAD, - 0x6C16: 0xC4CA, - 0x6C17: 0x9ADD, - 0x6C18: 0xEBAE, - 0x6C19: 0xEBAF, - 0x6C1A: 0xEBB0, - 0x6C1B: 0xB7D5, - 0x6C1C: 0x9ADE, - 0x6C1D: 0x9ADF, - 0x6C1E: 0x9AE0, - 0x6C1F: 0xB7FA, - 0x6C20: 0x9AE1, - 0x6C21: 0xEBB1, - 0x6C22: 0xC7E2, - 0x6C23: 0x9AE2, - 0x6C24: 0xEBB3, - 0x6C25: 0x9AE3, - 0x6C26: 0xBAA4, - 0x6C27: 0xD1F5, - 0x6C28: 0xB0B1, - 0x6C29: 0xEBB2, - 0x6C2A: 0xEBB4, - 0x6C2B: 0x9AE4, - 0x6C2C: 0x9AE5, - 0x6C2D: 0x9AE6, - 0x6C2E: 0xB5AA, - 0x6C2F: 0xC2C8, - 0x6C30: 0xC7E8, - 0x6C31: 0x9AE7, - 0x6C32: 0xEBB5, - 0x6C33: 0x9AE8, - 0x6C34: 0xCBAE, - 0x6C35: 0xE3DF, - 0x6C36: 0x9AE9, - 0x6C37: 0x9AEA, - 0x6C38: 0xD3C0, - 0x6C39: 0x9AEB, - 0x6C3A: 0x9AEC, - 0x6C3B: 0x9AED, - 0x6C3C: 0x9AEE, - 0x6C3D: 0xD9DB, - 0x6C3E: 0x9AEF, - 0x6C3F: 0x9AF0, - 0x6C40: 0xCDA1, - 0x6C41: 0xD6AD, - 0x6C42: 0xC7F3, - 0x6C43: 0x9AF1, - 0x6C44: 0x9AF2, - 0x6C45: 0x9AF3, - 0x6C46: 0xD9E0, - 0x6C47: 0xBBE3, - 0x6C48: 0x9AF4, - 0x6C49: 0xBABA, - 0x6C4A: 0xE3E2, - 0x6C4B: 0x9AF5, - 0x6C4C: 0x9AF6, - 0x6C4D: 0x9AF7, - 0x6C4E: 0x9AF8, - 0x6C4F: 0x9AF9, - 0x6C50: 0xCFAB, - 0x6C51: 0x9AFA, - 0x6C52: 0x9AFB, - 0x6C53: 0x9AFC, - 0x6C54: 0xE3E0, - 0x6C55: 0xC9C7, - 0x6C56: 0x9AFD, - 0x6C57: 0xBAB9, - 0x6C58: 0x9AFE, - 0x6C59: 0x9B40, - 0x6C5A: 0x9B41, - 0x6C5B: 0xD1B4, - 0x6C5C: 0xE3E1, - 0x6C5D: 0xC8EA, - 0x6C5E: 0xB9AF, - 0x6C5F: 0xBDAD, - 0x6C60: 0xB3D8, - 0x6C61: 0xCEDB, - 0x6C62: 0x9B42, - 0x6C63: 0x9B43, - 0x6C64: 0xCCC0, - 0x6C65: 0x9B44, - 0x6C66: 0x9B45, - 0x6C67: 0x9B46, - 0x6C68: 0xE3E8, - 0x6C69: 0xE3E9, - 0x6C6A: 0xCDF4, - 0x6C6B: 0x9B47, - 0x6C6C: 0x9B48, - 0x6C6D: 0x9B49, - 0x6C6E: 0x9B4A, - 0x6C6F: 0x9B4B, - 0x6C70: 0xCCAD, - 0x6C71: 0x9B4C, - 0x6C72: 0xBCB3, - 0x6C73: 0x9B4D, - 0x6C74: 0xE3EA, - 0x6C75: 0x9B4E, - 0x6C76: 0xE3EB, - 0x6C77: 0x9B4F, - 0x6C78: 0x9B50, - 0x6C79: 0xD0DA, - 0x6C7A: 0x9B51, - 0x6C7B: 0x9B52, - 0x6C7C: 0x9B53, - 0x6C7D: 0xC6FB, - 0x6C7E: 0xB7DA, - 0x6C7F: 0x9B54, - 0x6C80: 0x9B55, - 0x6C81: 0xC7DF, - 0x6C82: 0xD2CA, - 0x6C83: 0xCED6, - 0x6C84: 0x9B56, - 0x6C85: 0xE3E4, - 0x6C86: 0xE3EC, - 0x6C87: 0x9B57, - 0x6C88: 0xC9F2, - 0x6C89: 0xB3C1, - 0x6C8A: 0x9B58, - 0x6C8B: 0x9B59, - 0x6C8C: 0xE3E7, - 0x6C8D: 0x9B5A, - 0x6C8E: 0x9B5B, - 0x6C8F: 0xC6E3, - 0x6C90: 0xE3E5, - 0x6C91: 0x9B5C, - 0x6C92: 0x9B5D, - 0x6C93: 0xEDB3, - 0x6C94: 0xE3E6, - 0x6C95: 0x9B5E, - 0x6C96: 0x9B5F, - 0x6C97: 0x9B60, - 0x6C98: 0x9B61, - 0x6C99: 0xC9B3, - 0x6C9A: 0x9B62, - 0x6C9B: 0xC5E6, - 0x6C9C: 0x9B63, - 0x6C9D: 0x9B64, - 0x6C9E: 0x9B65, - 0x6C9F: 0xB9B5, - 0x6CA0: 0x9B66, - 0x6CA1: 0xC3BB, - 0x6CA2: 0x9B67, - 0x6CA3: 0xE3E3, - 0x6CA4: 0xC5BD, - 0x6CA5: 0xC1A4, - 0x6CA6: 0xC2D9, - 0x6CA7: 0xB2D7, - 0x6CA8: 0x9B68, - 0x6CA9: 0xE3ED, - 0x6CAA: 0xBBA6, - 0x6CAB: 0xC4AD, - 0x6CAC: 0x9B69, - 0x6CAD: 0xE3F0, - 0x6CAE: 0xBEDA, - 0x6CAF: 0x9B6A, - 0x6CB0: 0x9B6B, - 0x6CB1: 0xE3FB, - 0x6CB2: 0xE3F5, - 0x6CB3: 0xBAD3, - 0x6CB4: 0x9B6C, - 0x6CB5: 0x9B6D, - 0x6CB6: 0x9B6E, - 0x6CB7: 0x9B6F, - 0x6CB8: 0xB7D0, - 0x6CB9: 0xD3CD, - 0x6CBA: 0x9B70, - 0x6CBB: 0xD6CE, - 0x6CBC: 0xD5D3, - 0x6CBD: 0xB9C1, - 0x6CBE: 0xD5B4, - 0x6CBF: 0xD1D8, - 0x6CC0: 0x9B71, - 0x6CC1: 0x9B72, - 0x6CC2: 0x9B73, - 0x6CC3: 0x9B74, - 0x6CC4: 0xD0B9, - 0x6CC5: 0xC7F6, - 0x6CC6: 0x9B75, - 0x6CC7: 0x9B76, - 0x6CC8: 0x9B77, - 0x6CC9: 0xC8AA, - 0x6CCA: 0xB2B4, - 0x6CCB: 0x9B78, - 0x6CCC: 0xC3DA, - 0x6CCD: 0x9B79, - 0x6CCE: 0x9B7A, - 0x6CCF: 0x9B7B, - 0x6CD0: 0xE3EE, - 0x6CD1: 0x9B7C, - 0x6CD2: 0x9B7D, - 0x6CD3: 0xE3FC, - 0x6CD4: 0xE3EF, - 0x6CD5: 0xB7A8, - 0x6CD6: 0xE3F7, - 0x6CD7: 0xE3F4, - 0x6CD8: 0x9B7E, - 0x6CD9: 0x9B80, - 0x6CDA: 0x9B81, - 0x6CDB: 0xB7BA, - 0x6CDC: 0x9B82, - 0x6CDD: 0x9B83, - 0x6CDE: 0xC5A2, - 0x6CDF: 0x9B84, - 0x6CE0: 0xE3F6, - 0x6CE1: 0xC5DD, - 0x6CE2: 0xB2A8, - 0x6CE3: 0xC6FC, - 0x6CE4: 0x9B85, - 0x6CE5: 0xC4E0, - 0x6CE6: 0x9B86, - 0x6CE7: 0x9B87, - 0x6CE8: 0xD7A2, - 0x6CE9: 0x9B88, - 0x6CEA: 0xC0E1, - 0x6CEB: 0xE3F9, - 0x6CEC: 0x9B89, - 0x6CED: 0x9B8A, - 0x6CEE: 0xE3FA, - 0x6CEF: 0xE3FD, - 0x6CF0: 0xCCA9, - 0x6CF1: 0xE3F3, - 0x6CF2: 0x9B8B, - 0x6CF3: 0xD3BE, - 0x6CF4: 0x9B8C, - 0x6CF5: 0xB1C3, - 0x6CF6: 0xEDB4, - 0x6CF7: 0xE3F1, - 0x6CF8: 0xE3F2, - 0x6CF9: 0x9B8D, - 0x6CFA: 0xE3F8, - 0x6CFB: 0xD0BA, - 0x6CFC: 0xC6C3, - 0x6CFD: 0xD4F3, - 0x6CFE: 0xE3FE, - 0x6CFF: 0x9B8E, - 0x6D00: 0x9B8F, - 0x6D01: 0xBDE0, - 0x6D02: 0x9B90, - 0x6D03: 0x9B91, - 0x6D04: 0xE4A7, - 0x6D05: 0x9B92, - 0x6D06: 0x9B93, - 0x6D07: 0xE4A6, - 0x6D08: 0x9B94, - 0x6D09: 0x9B95, - 0x6D0A: 0x9B96, - 0x6D0B: 0xD1F3, - 0x6D0C: 0xE4A3, - 0x6D0D: 0x9B97, - 0x6D0E: 0xE4A9, - 0x6D0F: 0x9B98, - 0x6D10: 0x9B99, - 0x6D11: 0x9B9A, - 0x6D12: 0xC8F7, - 0x6D13: 0x9B9B, - 0x6D14: 0x9B9C, - 0x6D15: 0x9B9D, - 0x6D16: 0x9B9E, - 0x6D17: 0xCFB4, - 0x6D18: 0x9B9F, - 0x6D19: 0xE4A8, - 0x6D1A: 0xE4AE, - 0x6D1B: 0xC2E5, - 0x6D1C: 0x9BA0, - 0x6D1D: 0x9BA1, - 0x6D1E: 0xB6B4, - 0x6D1F: 0x9BA2, - 0x6D20: 0x9BA3, - 0x6D21: 0x9BA4, - 0x6D22: 0x9BA5, - 0x6D23: 0x9BA6, - 0x6D24: 0x9BA7, - 0x6D25: 0xBDF2, - 0x6D26: 0x9BA8, - 0x6D27: 0xE4A2, - 0x6D28: 0x9BA9, - 0x6D29: 0x9BAA, - 0x6D2A: 0xBAE9, - 0x6D2B: 0xE4AA, - 0x6D2C: 0x9BAB, - 0x6D2D: 0x9BAC, - 0x6D2E: 0xE4AC, - 0x6D2F: 0x9BAD, - 0x6D30: 0x9BAE, - 0x6D31: 0xB6FD, - 0x6D32: 0xD6DE, - 0x6D33: 0xE4B2, - 0x6D34: 0x9BAF, - 0x6D35: 0xE4AD, - 0x6D36: 0x9BB0, - 0x6D37: 0x9BB1, - 0x6D38: 0x9BB2, - 0x6D39: 0xE4A1, - 0x6D3A: 0x9BB3, - 0x6D3B: 0xBBEE, - 0x6D3C: 0xCDDD, - 0x6D3D: 0xC7A2, - 0x6D3E: 0xC5C9, - 0x6D3F: 0x9BB4, - 0x6D40: 0x9BB5, - 0x6D41: 0xC1F7, - 0x6D42: 0x9BB6, - 0x6D43: 0xE4A4, - 0x6D44: 0x9BB7, - 0x6D45: 0xC7B3, - 0x6D46: 0xBDAC, - 0x6D47: 0xBDBD, - 0x6D48: 0xE4A5, - 0x6D49: 0x9BB8, - 0x6D4A: 0xD7C7, - 0x6D4B: 0xB2E2, - 0x6D4C: 0x9BB9, - 0x6D4D: 0xE4AB, - 0x6D4E: 0xBCC3, - 0x6D4F: 0xE4AF, - 0x6D50: 0x9BBA, - 0x6D51: 0xBBEB, - 0x6D52: 0xE4B0, - 0x6D53: 0xC5A8, - 0x6D54: 0xE4B1, - 0x6D55: 0x9BBB, - 0x6D56: 0x9BBC, - 0x6D57: 0x9BBD, - 0x6D58: 0x9BBE, - 0x6D59: 0xD5E3, - 0x6D5A: 0xBFA3, - 0x6D5B: 0x9BBF, - 0x6D5C: 0xE4BA, - 0x6D5D: 0x9BC0, - 0x6D5E: 0xE4B7, - 0x6D5F: 0x9BC1, - 0x6D60: 0xE4BB, - 0x6D61: 0x9BC2, - 0x6D62: 0x9BC3, - 0x6D63: 0xE4BD, - 0x6D64: 0x9BC4, - 0x6D65: 0x9BC5, - 0x6D66: 0xC6D6, - 0x6D67: 0x9BC6, - 0x6D68: 0x9BC7, - 0x6D69: 0xBAC6, - 0x6D6A: 0xC0CB, - 0x6D6B: 0x9BC8, - 0x6D6C: 0x9BC9, - 0x6D6D: 0x9BCA, - 0x6D6E: 0xB8A1, - 0x6D6F: 0xE4B4, - 0x6D70: 0x9BCB, - 0x6D71: 0x9BCC, - 0x6D72: 0x9BCD, - 0x6D73: 0x9BCE, - 0x6D74: 0xD4A1, - 0x6D75: 0x9BCF, - 0x6D76: 0x9BD0, - 0x6D77: 0xBAA3, - 0x6D78: 0xBDFE, - 0x6D79: 0x9BD1, - 0x6D7A: 0x9BD2, - 0x6D7B: 0x9BD3, - 0x6D7C: 0xE4BC, - 0x6D7D: 0x9BD4, - 0x6D7E: 0x9BD5, - 0x6D7F: 0x9BD6, - 0x6D80: 0x9BD7, - 0x6D81: 0x9BD8, - 0x6D82: 0xCDBF, - 0x6D83: 0x9BD9, - 0x6D84: 0x9BDA, - 0x6D85: 0xC4F9, - 0x6D86: 0x9BDB, - 0x6D87: 0x9BDC, - 0x6D88: 0xCFFB, - 0x6D89: 0xC9E6, - 0x6D8A: 0x9BDD, - 0x6D8B: 0x9BDE, - 0x6D8C: 0xD3BF, - 0x6D8D: 0x9BDF, - 0x6D8E: 0xCFD1, - 0x6D8F: 0x9BE0, - 0x6D90: 0x9BE1, - 0x6D91: 0xE4B3, - 0x6D92: 0x9BE2, - 0x6D93: 0xE4B8, - 0x6D94: 0xE4B9, - 0x6D95: 0xCCE9, - 0x6D96: 0x9BE3, - 0x6D97: 0x9BE4, - 0x6D98: 0x9BE5, - 0x6D99: 0x9BE6, - 0x6D9A: 0x9BE7, - 0x6D9B: 0xCCCE, - 0x6D9C: 0x9BE8, - 0x6D9D: 0xC0D4, - 0x6D9E: 0xE4B5, - 0x6D9F: 0xC1B0, - 0x6DA0: 0xE4B6, - 0x6DA1: 0xCED0, - 0x6DA2: 0x9BE9, - 0x6DA3: 0xBBC1, - 0x6DA4: 0xB5D3, - 0x6DA5: 0x9BEA, - 0x6DA6: 0xC8F3, - 0x6DA7: 0xBDA7, - 0x6DA8: 0xD5C7, - 0x6DA9: 0xC9AC, - 0x6DAA: 0xB8A2, - 0x6DAB: 0xE4CA, - 0x6DAC: 0x9BEB, - 0x6DAD: 0x9BEC, - 0x6DAE: 0xE4CC, - 0x6DAF: 0xD1C4, - 0x6DB0: 0x9BED, - 0x6DB1: 0x9BEE, - 0x6DB2: 0xD2BA, - 0x6DB3: 0x9BEF, - 0x6DB4: 0x9BF0, - 0x6DB5: 0xBAAD, - 0x6DB6: 0x9BF1, - 0x6DB7: 0x9BF2, - 0x6DB8: 0xBAD4, - 0x6DB9: 0x9BF3, - 0x6DBA: 0x9BF4, - 0x6DBB: 0x9BF5, - 0x6DBC: 0x9BF6, - 0x6DBD: 0x9BF7, - 0x6DBE: 0x9BF8, - 0x6DBF: 0xE4C3, - 0x6DC0: 0xB5ED, - 0x6DC1: 0x9BF9, - 0x6DC2: 0x9BFA, - 0x6DC3: 0x9BFB, - 0x6DC4: 0xD7CD, - 0x6DC5: 0xE4C0, - 0x6DC6: 0xCFFD, - 0x6DC7: 0xE4BF, - 0x6DC8: 0x9BFC, - 0x6DC9: 0x9BFD, - 0x6DCA: 0x9BFE, - 0x6DCB: 0xC1DC, - 0x6DCC: 0xCCCA, - 0x6DCD: 0x9C40, - 0x6DCE: 0x9C41, - 0x6DCF: 0x9C42, - 0x6DD0: 0x9C43, - 0x6DD1: 0xCAE7, - 0x6DD2: 0x9C44, - 0x6DD3: 0x9C45, - 0x6DD4: 0x9C46, - 0x6DD5: 0x9C47, - 0x6DD6: 0xC4D7, - 0x6DD7: 0x9C48, - 0x6DD8: 0xCCD4, - 0x6DD9: 0xE4C8, - 0x6DDA: 0x9C49, - 0x6DDB: 0x9C4A, - 0x6DDC: 0x9C4B, - 0x6DDD: 0xE4C7, - 0x6DDE: 0xE4C1, - 0x6DDF: 0x9C4C, - 0x6DE0: 0xE4C4, - 0x6DE1: 0xB5AD, - 0x6DE2: 0x9C4D, - 0x6DE3: 0x9C4E, - 0x6DE4: 0xD3D9, - 0x6DE5: 0x9C4F, - 0x6DE6: 0xE4C6, - 0x6DE7: 0x9C50, - 0x6DE8: 0x9C51, - 0x6DE9: 0x9C52, - 0x6DEA: 0x9C53, - 0x6DEB: 0xD2F9, - 0x6DEC: 0xB4E3, - 0x6DED: 0x9C54, - 0x6DEE: 0xBBB4, - 0x6DEF: 0x9C55, - 0x6DF0: 0x9C56, - 0x6DF1: 0xC9EE, - 0x6DF2: 0x9C57, - 0x6DF3: 0xB4BE, - 0x6DF4: 0x9C58, - 0x6DF5: 0x9C59, - 0x6DF6: 0x9C5A, - 0x6DF7: 0xBBEC, - 0x6DF8: 0x9C5B, - 0x6DF9: 0xD1CD, - 0x6DFA: 0x9C5C, - 0x6DFB: 0xCCED, - 0x6DFC: 0xEDB5, - 0x6DFD: 0x9C5D, - 0x6DFE: 0x9C5E, - 0x6DFF: 0x9C5F, - 0x6E00: 0x9C60, - 0x6E01: 0x9C61, - 0x6E02: 0x9C62, - 0x6E03: 0x9C63, - 0x6E04: 0x9C64, - 0x6E05: 0xC7E5, - 0x6E06: 0x9C65, - 0x6E07: 0x9C66, - 0x6E08: 0x9C67, - 0x6E09: 0x9C68, - 0x6E0A: 0xD4A8, - 0x6E0B: 0x9C69, - 0x6E0C: 0xE4CB, - 0x6E0D: 0xD7D5, - 0x6E0E: 0xE4C2, - 0x6E0F: 0x9C6A, - 0x6E10: 0xBDA5, - 0x6E11: 0xE4C5, - 0x6E12: 0x9C6B, - 0x6E13: 0x9C6C, - 0x6E14: 0xD3E6, - 0x6E15: 0x9C6D, - 0x6E16: 0xE4C9, - 0x6E17: 0xC9F8, - 0x6E18: 0x9C6E, - 0x6E19: 0x9C6F, - 0x6E1A: 0xE4BE, - 0x6E1B: 0x9C70, - 0x6E1C: 0x9C71, - 0x6E1D: 0xD3E5, - 0x6E1E: 0x9C72, - 0x6E1F: 0x9C73, - 0x6E20: 0xC7FE, - 0x6E21: 0xB6C9, - 0x6E22: 0x9C74, - 0x6E23: 0xD4FC, - 0x6E24: 0xB2B3, - 0x6E25: 0xE4D7, - 0x6E26: 0x9C75, - 0x6E27: 0x9C76, - 0x6E28: 0x9C77, - 0x6E29: 0xCEC2, - 0x6E2A: 0x9C78, - 0x6E2B: 0xE4CD, - 0x6E2C: 0x9C79, - 0x6E2D: 0xCEBC, - 0x6E2E: 0x9C7A, - 0x6E2F: 0xB8DB, - 0x6E30: 0x9C7B, - 0x6E31: 0x9C7C, - 0x6E32: 0xE4D6, - 0x6E33: 0x9C7D, - 0x6E34: 0xBFCA, - 0x6E35: 0x9C7E, - 0x6E36: 0x9C80, - 0x6E37: 0x9C81, - 0x6E38: 0xD3CE, - 0x6E39: 0x9C82, - 0x6E3A: 0xC3EC, - 0x6E3B: 0x9C83, - 0x6E3C: 0x9C84, - 0x6E3D: 0x9C85, - 0x6E3E: 0x9C86, - 0x6E3F: 0x9C87, - 0x6E40: 0x9C88, - 0x6E41: 0x9C89, - 0x6E42: 0x9C8A, - 0x6E43: 0xC5C8, - 0x6E44: 0xE4D8, - 0x6E45: 0x9C8B, - 0x6E46: 0x9C8C, - 0x6E47: 0x9C8D, - 0x6E48: 0x9C8E, - 0x6E49: 0x9C8F, - 0x6E4A: 0x9C90, - 0x6E4B: 0x9C91, - 0x6E4C: 0x9C92, - 0x6E4D: 0xCDC4, - 0x6E4E: 0xE4CF, - 0x6E4F: 0x9C93, - 0x6E50: 0x9C94, - 0x6E51: 0x9C95, - 0x6E52: 0x9C96, - 0x6E53: 0xE4D4, - 0x6E54: 0xE4D5, - 0x6E55: 0x9C97, - 0x6E56: 0xBAFE, - 0x6E57: 0x9C98, - 0x6E58: 0xCFE6, - 0x6E59: 0x9C99, - 0x6E5A: 0x9C9A, - 0x6E5B: 0xD5BF, - 0x6E5C: 0x9C9B, - 0x6E5D: 0x9C9C, - 0x6E5E: 0x9C9D, - 0x6E5F: 0xE4D2, - 0x6E60: 0x9C9E, - 0x6E61: 0x9C9F, - 0x6E62: 0x9CA0, - 0x6E63: 0x9CA1, - 0x6E64: 0x9CA2, - 0x6E65: 0x9CA3, - 0x6E66: 0x9CA4, - 0x6E67: 0x9CA5, - 0x6E68: 0x9CA6, - 0x6E69: 0x9CA7, - 0x6E6A: 0x9CA8, - 0x6E6B: 0xE4D0, - 0x6E6C: 0x9CA9, - 0x6E6D: 0x9CAA, - 0x6E6E: 0xE4CE, - 0x6E6F: 0x9CAB, - 0x6E70: 0x9CAC, - 0x6E71: 0x9CAD, - 0x6E72: 0x9CAE, - 0x6E73: 0x9CAF, - 0x6E74: 0x9CB0, - 0x6E75: 0x9CB1, - 0x6E76: 0x9CB2, - 0x6E77: 0x9CB3, - 0x6E78: 0x9CB4, - 0x6E79: 0x9CB5, - 0x6E7A: 0x9CB6, - 0x6E7B: 0x9CB7, - 0x6E7C: 0x9CB8, - 0x6E7D: 0x9CB9, - 0x6E7E: 0xCDE5, - 0x6E7F: 0xCAAA, - 0x6E80: 0x9CBA, - 0x6E81: 0x9CBB, - 0x6E82: 0x9CBC, - 0x6E83: 0xC0A3, - 0x6E84: 0x9CBD, - 0x6E85: 0xBDA6, - 0x6E86: 0xE4D3, - 0x6E87: 0x9CBE, - 0x6E88: 0x9CBF, - 0x6E89: 0xB8C8, - 0x6E8A: 0x9CC0, - 0x6E8B: 0x9CC1, - 0x6E8C: 0x9CC2, - 0x6E8D: 0x9CC3, - 0x6E8E: 0x9CC4, - 0x6E8F: 0xE4E7, - 0x6E90: 0xD4B4, - 0x6E91: 0x9CC5, - 0x6E92: 0x9CC6, - 0x6E93: 0x9CC7, - 0x6E94: 0x9CC8, - 0x6E95: 0x9CC9, - 0x6E96: 0x9CCA, - 0x6E97: 0x9CCB, - 0x6E98: 0xE4DB, - 0x6E99: 0x9CCC, - 0x6E9A: 0x9CCD, - 0x6E9B: 0x9CCE, - 0x6E9C: 0xC1EF, - 0x6E9D: 0x9CCF, - 0x6E9E: 0x9CD0, - 0x6E9F: 0xE4E9, - 0x6EA0: 0x9CD1, - 0x6EA1: 0x9CD2, - 0x6EA2: 0xD2E7, - 0x6EA3: 0x9CD3, - 0x6EA4: 0x9CD4, - 0x6EA5: 0xE4DF, - 0x6EA6: 0x9CD5, - 0x6EA7: 0xE4E0, - 0x6EA8: 0x9CD6, - 0x6EA9: 0x9CD7, - 0x6EAA: 0xCFAA, - 0x6EAB: 0x9CD8, - 0x6EAC: 0x9CD9, - 0x6EAD: 0x9CDA, - 0x6EAE: 0x9CDB, - 0x6EAF: 0xCBDD, - 0x6EB0: 0x9CDC, - 0x6EB1: 0xE4DA, - 0x6EB2: 0xE4D1, - 0x6EB3: 0x9CDD, - 0x6EB4: 0xE4E5, - 0x6EB5: 0x9CDE, - 0x6EB6: 0xC8DC, - 0x6EB7: 0xE4E3, - 0x6EB8: 0x9CDF, - 0x6EB9: 0x9CE0, - 0x6EBA: 0xC4E7, - 0x6EBB: 0xE4E2, - 0x6EBC: 0x9CE1, - 0x6EBD: 0xE4E1, - 0x6EBE: 0x9CE2, - 0x6EBF: 0x9CE3, - 0x6EC0: 0x9CE4, - 0x6EC1: 0xB3FC, - 0x6EC2: 0xE4E8, - 0x6EC3: 0x9CE5, - 0x6EC4: 0x9CE6, - 0x6EC5: 0x9CE7, - 0x6EC6: 0x9CE8, - 0x6EC7: 0xB5E1, - 0x6EC8: 0x9CE9, - 0x6EC9: 0x9CEA, - 0x6ECA: 0x9CEB, - 0x6ECB: 0xD7CC, - 0x6ECC: 0x9CEC, - 0x6ECD: 0x9CED, - 0x6ECE: 0x9CEE, - 0x6ECF: 0xE4E6, - 0x6ED0: 0x9CEF, - 0x6ED1: 0xBBAC, - 0x6ED2: 0x9CF0, - 0x6ED3: 0xD7D2, - 0x6ED4: 0xCCCF, - 0x6ED5: 0xEBF8, - 0x6ED6: 0x9CF1, - 0x6ED7: 0xE4E4, - 0x6ED8: 0x9CF2, - 0x6ED9: 0x9CF3, - 0x6EDA: 0xB9F6, - 0x6EDB: 0x9CF4, - 0x6EDC: 0x9CF5, - 0x6EDD: 0x9CF6, - 0x6EDE: 0xD6CD, - 0x6EDF: 0xE4D9, - 0x6EE0: 0xE4DC, - 0x6EE1: 0xC2FA, - 0x6EE2: 0xE4DE, - 0x6EE3: 0x9CF7, - 0x6EE4: 0xC2CB, - 0x6EE5: 0xC0C4, - 0x6EE6: 0xC2D0, - 0x6EE7: 0x9CF8, - 0x6EE8: 0xB1F5, - 0x6EE9: 0xCCB2, - 0x6EEA: 0x9CF9, - 0x6EEB: 0x9CFA, - 0x6EEC: 0x9CFB, - 0x6EED: 0x9CFC, - 0x6EEE: 0x9CFD, - 0x6EEF: 0x9CFE, - 0x6EF0: 0x9D40, - 0x6EF1: 0x9D41, - 0x6EF2: 0x9D42, - 0x6EF3: 0x9D43, - 0x6EF4: 0xB5CE, - 0x6EF5: 0x9D44, - 0x6EF6: 0x9D45, - 0x6EF7: 0x9D46, - 0x6EF8: 0x9D47, - 0x6EF9: 0xE4EF, - 0x6EFA: 0x9D48, - 0x6EFB: 0x9D49, - 0x6EFC: 0x9D4A, - 0x6EFD: 0x9D4B, - 0x6EFE: 0x9D4C, - 0x6EFF: 0x9D4D, - 0x6F00: 0x9D4E, - 0x6F01: 0x9D4F, - 0x6F02: 0xC6AF, - 0x6F03: 0x9D50, - 0x6F04: 0x9D51, - 0x6F05: 0x9D52, - 0x6F06: 0xC6E1, - 0x6F07: 0x9D53, - 0x6F08: 0x9D54, - 0x6F09: 0xE4F5, - 0x6F0A: 0x9D55, - 0x6F0B: 0x9D56, - 0x6F0C: 0x9D57, - 0x6F0D: 0x9D58, - 0x6F0E: 0x9D59, - 0x6F0F: 0xC2A9, - 0x6F10: 0x9D5A, - 0x6F11: 0x9D5B, - 0x6F12: 0x9D5C, - 0x6F13: 0xC0EC, - 0x6F14: 0xD1DD, - 0x6F15: 0xE4EE, - 0x6F16: 0x9D5D, - 0x6F17: 0x9D5E, - 0x6F18: 0x9D5F, - 0x6F19: 0x9D60, - 0x6F1A: 0x9D61, - 0x6F1B: 0x9D62, - 0x6F1C: 0x9D63, - 0x6F1D: 0x9D64, - 0x6F1E: 0x9D65, - 0x6F1F: 0x9D66, - 0x6F20: 0xC4AE, - 0x6F21: 0x9D67, - 0x6F22: 0x9D68, - 0x6F23: 0x9D69, - 0x6F24: 0xE4ED, - 0x6F25: 0x9D6A, - 0x6F26: 0x9D6B, - 0x6F27: 0x9D6C, - 0x6F28: 0x9D6D, - 0x6F29: 0xE4F6, - 0x6F2A: 0xE4F4, - 0x6F2B: 0xC2FE, - 0x6F2C: 0x9D6E, - 0x6F2D: 0xE4DD, - 0x6F2E: 0x9D6F, - 0x6F2F: 0xE4F0, - 0x6F30: 0x9D70, - 0x6F31: 0xCAFE, - 0x6F32: 0x9D71, - 0x6F33: 0xD5C4, - 0x6F34: 0x9D72, - 0x6F35: 0x9D73, - 0x6F36: 0xE4F1, - 0x6F37: 0x9D74, - 0x6F38: 0x9D75, - 0x6F39: 0x9D76, - 0x6F3A: 0x9D77, - 0x6F3B: 0x9D78, - 0x6F3C: 0x9D79, - 0x6F3D: 0x9D7A, - 0x6F3E: 0xD1FA, - 0x6F3F: 0x9D7B, - 0x6F40: 0x9D7C, - 0x6F41: 0x9D7D, - 0x6F42: 0x9D7E, - 0x6F43: 0x9D80, - 0x6F44: 0x9D81, - 0x6F45: 0x9D82, - 0x6F46: 0xE4EB, - 0x6F47: 0xE4EC, - 0x6F48: 0x9D83, - 0x6F49: 0x9D84, - 0x6F4A: 0x9D85, - 0x6F4B: 0xE4F2, - 0x6F4C: 0x9D86, - 0x6F4D: 0xCEAB, - 0x6F4E: 0x9D87, - 0x6F4F: 0x9D88, - 0x6F50: 0x9D89, - 0x6F51: 0x9D8A, - 0x6F52: 0x9D8B, - 0x6F53: 0x9D8C, - 0x6F54: 0x9D8D, - 0x6F55: 0x9D8E, - 0x6F56: 0x9D8F, - 0x6F57: 0x9D90, - 0x6F58: 0xC5CB, - 0x6F59: 0x9D91, - 0x6F5A: 0x9D92, - 0x6F5B: 0x9D93, - 0x6F5C: 0xC7B1, - 0x6F5D: 0x9D94, - 0x6F5E: 0xC2BA, - 0x6F5F: 0x9D95, - 0x6F60: 0x9D96, - 0x6F61: 0x9D97, - 0x6F62: 0xE4EA, - 0x6F63: 0x9D98, - 0x6F64: 0x9D99, - 0x6F65: 0x9D9A, - 0x6F66: 0xC1CA, - 0x6F67: 0x9D9B, - 0x6F68: 0x9D9C, - 0x6F69: 0x9D9D, - 0x6F6A: 0x9D9E, - 0x6F6B: 0x9D9F, - 0x6F6C: 0x9DA0, - 0x6F6D: 0xCCB6, - 0x6F6E: 0xB3B1, - 0x6F6F: 0x9DA1, - 0x6F70: 0x9DA2, - 0x6F71: 0x9DA3, - 0x6F72: 0xE4FB, - 0x6F73: 0x9DA4, - 0x6F74: 0xE4F3, - 0x6F75: 0x9DA5, - 0x6F76: 0x9DA6, - 0x6F77: 0x9DA7, - 0x6F78: 0xE4FA, - 0x6F79: 0x9DA8, - 0x6F7A: 0xE4FD, - 0x6F7B: 0x9DA9, - 0x6F7C: 0xE4FC, - 0x6F7D: 0x9DAA, - 0x6F7E: 0x9DAB, - 0x6F7F: 0x9DAC, - 0x6F80: 0x9DAD, - 0x6F81: 0x9DAE, - 0x6F82: 0x9DAF, - 0x6F83: 0x9DB0, - 0x6F84: 0xB3CE, - 0x6F85: 0x9DB1, - 0x6F86: 0x9DB2, - 0x6F87: 0x9DB3, - 0x6F88: 0xB3BA, - 0x6F89: 0xE4F7, - 0x6F8A: 0x9DB4, - 0x6F8B: 0x9DB5, - 0x6F8C: 0xE4F9, - 0x6F8D: 0xE4F8, - 0x6F8E: 0xC5EC, - 0x6F8F: 0x9DB6, - 0x6F90: 0x9DB7, - 0x6F91: 0x9DB8, - 0x6F92: 0x9DB9, - 0x6F93: 0x9DBA, - 0x6F94: 0x9DBB, - 0x6F95: 0x9DBC, - 0x6F96: 0x9DBD, - 0x6F97: 0x9DBE, - 0x6F98: 0x9DBF, - 0x6F99: 0x9DC0, - 0x6F9A: 0x9DC1, - 0x6F9B: 0x9DC2, - 0x6F9C: 0xC0BD, - 0x6F9D: 0x9DC3, - 0x6F9E: 0x9DC4, - 0x6F9F: 0x9DC5, - 0x6FA0: 0x9DC6, - 0x6FA1: 0xD4E8, - 0x6FA2: 0x9DC7, - 0x6FA3: 0x9DC8, - 0x6FA4: 0x9DC9, - 0x6FA5: 0x9DCA, - 0x6FA6: 0x9DCB, - 0x6FA7: 0xE5A2, - 0x6FA8: 0x9DCC, - 0x6FA9: 0x9DCD, - 0x6FAA: 0x9DCE, - 0x6FAB: 0x9DCF, - 0x6FAC: 0x9DD0, - 0x6FAD: 0x9DD1, - 0x6FAE: 0x9DD2, - 0x6FAF: 0x9DD3, - 0x6FB0: 0x9DD4, - 0x6FB1: 0x9DD5, - 0x6FB2: 0x9DD6, - 0x6FB3: 0xB0C4, - 0x6FB4: 0x9DD7, - 0x6FB5: 0x9DD8, - 0x6FB6: 0xE5A4, - 0x6FB7: 0x9DD9, - 0x6FB8: 0x9DDA, - 0x6FB9: 0xE5A3, - 0x6FBA: 0x9DDB, - 0x6FBB: 0x9DDC, - 0x6FBC: 0x9DDD, - 0x6FBD: 0x9DDE, - 0x6FBE: 0x9DDF, - 0x6FBF: 0x9DE0, - 0x6FC0: 0xBCA4, - 0x6FC1: 0x9DE1, - 0x6FC2: 0xE5A5, - 0x6FC3: 0x9DE2, - 0x6FC4: 0x9DE3, - 0x6FC5: 0x9DE4, - 0x6FC6: 0x9DE5, - 0x6FC7: 0x9DE6, - 0x6FC8: 0x9DE7, - 0x6FC9: 0xE5A1, - 0x6FCA: 0x9DE8, - 0x6FCB: 0x9DE9, - 0x6FCC: 0x9DEA, - 0x6FCD: 0x9DEB, - 0x6FCE: 0x9DEC, - 0x6FCF: 0x9DED, - 0x6FD0: 0x9DEE, - 0x6FD1: 0xE4FE, - 0x6FD2: 0xB1F4, - 0x6FD3: 0x9DEF, - 0x6FD4: 0x9DF0, - 0x6FD5: 0x9DF1, - 0x6FD6: 0x9DF2, - 0x6FD7: 0x9DF3, - 0x6FD8: 0x9DF4, - 0x6FD9: 0x9DF5, - 0x6FDA: 0x9DF6, - 0x6FDB: 0x9DF7, - 0x6FDC: 0x9DF8, - 0x6FDD: 0x9DF9, - 0x6FDE: 0xE5A8, - 0x6FDF: 0x9DFA, - 0x6FE0: 0xE5A9, - 0x6FE1: 0xE5A6, - 0x6FE2: 0x9DFB, - 0x6FE3: 0x9DFC, - 0x6FE4: 0x9DFD, - 0x6FE5: 0x9DFE, - 0x6FE6: 0x9E40, - 0x6FE7: 0x9E41, - 0x6FE8: 0x9E42, - 0x6FE9: 0x9E43, - 0x6FEA: 0x9E44, - 0x6FEB: 0x9E45, - 0x6FEC: 0x9E46, - 0x6FED: 0x9E47, - 0x6FEE: 0xE5A7, - 0x6FEF: 0xE5AA, - 0x6FF0: 0x9E48, - 0x6FF1: 0x9E49, - 0x6FF2: 0x9E4A, - 0x6FF3: 0x9E4B, - 0x6FF4: 0x9E4C, - 0x6FF5: 0x9E4D, - 0x6FF6: 0x9E4E, - 0x6FF7: 0x9E4F, - 0x6FF8: 0x9E50, - 0x6FF9: 0x9E51, - 0x6FFA: 0x9E52, - 0x6FFB: 0x9E53, - 0x6FFC: 0x9E54, - 0x6FFD: 0x9E55, - 0x6FFE: 0x9E56, - 0x6FFF: 0x9E57, - 0x7000: 0x9E58, - 0x7001: 0x9E59, - 0x7002: 0x9E5A, - 0x7003: 0x9E5B, - 0x7004: 0x9E5C, - 0x7005: 0x9E5D, - 0x7006: 0x9E5E, - 0x7007: 0x9E5F, - 0x7008: 0x9E60, - 0x7009: 0x9E61, - 0x700A: 0x9E62, - 0x700B: 0x9E63, - 0x700C: 0x9E64, - 0x700D: 0x9E65, - 0x700E: 0x9E66, - 0x700F: 0x9E67, - 0x7010: 0x9E68, - 0x7011: 0xC6D9, - 0x7012: 0x9E69, - 0x7013: 0x9E6A, - 0x7014: 0x9E6B, - 0x7015: 0x9E6C, - 0x7016: 0x9E6D, - 0x7017: 0x9E6E, - 0x7018: 0x9E6F, - 0x7019: 0x9E70, - 0x701A: 0xE5AB, - 0x701B: 0xE5AD, - 0x701C: 0x9E71, - 0x701D: 0x9E72, - 0x701E: 0x9E73, - 0x701F: 0x9E74, - 0x7020: 0x9E75, - 0x7021: 0x9E76, - 0x7022: 0x9E77, - 0x7023: 0xE5AC, - 0x7024: 0x9E78, - 0x7025: 0x9E79, - 0x7026: 0x9E7A, - 0x7027: 0x9E7B, - 0x7028: 0x9E7C, - 0x7029: 0x9E7D, - 0x702A: 0x9E7E, - 0x702B: 0x9E80, - 0x702C: 0x9E81, - 0x702D: 0x9E82, - 0x702E: 0x9E83, - 0x702F: 0x9E84, - 0x7030: 0x9E85, - 0x7031: 0x9E86, - 0x7032: 0x9E87, - 0x7033: 0x9E88, - 0x7034: 0x9E89, - 0x7035: 0xE5AF, - 0x7036: 0x9E8A, - 0x7037: 0x9E8B, - 0x7038: 0x9E8C, - 0x7039: 0xE5AE, - 0x703A: 0x9E8D, - 0x703B: 0x9E8E, - 0x703C: 0x9E8F, - 0x703D: 0x9E90, - 0x703E: 0x9E91, - 0x703F: 0x9E92, - 0x7040: 0x9E93, - 0x7041: 0x9E94, - 0x7042: 0x9E95, - 0x7043: 0x9E96, - 0x7044: 0x9E97, - 0x7045: 0x9E98, - 0x7046: 0x9E99, - 0x7047: 0x9E9A, - 0x7048: 0x9E9B, - 0x7049: 0x9E9C, - 0x704A: 0x9E9D, - 0x704B: 0x9E9E, - 0x704C: 0xB9E0, - 0x704D: 0x9E9F, - 0x704E: 0x9EA0, - 0x704F: 0xE5B0, - 0x7050: 0x9EA1, - 0x7051: 0x9EA2, - 0x7052: 0x9EA3, - 0x7053: 0x9EA4, - 0x7054: 0x9EA5, - 0x7055: 0x9EA6, - 0x7056: 0x9EA7, - 0x7057: 0x9EA8, - 0x7058: 0x9EA9, - 0x7059: 0x9EAA, - 0x705A: 0x9EAB, - 0x705B: 0x9EAC, - 0x705C: 0x9EAD, - 0x705D: 0x9EAE, - 0x705E: 0xE5B1, - 0x705F: 0x9EAF, - 0x7060: 0x9EB0, - 0x7061: 0x9EB1, - 0x7062: 0x9EB2, - 0x7063: 0x9EB3, - 0x7064: 0x9EB4, - 0x7065: 0x9EB5, - 0x7066: 0x9EB6, - 0x7067: 0x9EB7, - 0x7068: 0x9EB8, - 0x7069: 0x9EB9, - 0x706A: 0x9EBA, - 0x706B: 0xBBF0, - 0x706C: 0xECE1, - 0x706D: 0xC3F0, - 0x706E: 0x9EBB, - 0x706F: 0xB5C6, - 0x7070: 0xBBD2, - 0x7071: 0x9EBC, - 0x7072: 0x9EBD, - 0x7073: 0x9EBE, - 0x7074: 0x9EBF, - 0x7075: 0xC1E9, - 0x7076: 0xD4EE, - 0x7077: 0x9EC0, - 0x7078: 0xBEC4, - 0x7079: 0x9EC1, - 0x707A: 0x9EC2, - 0x707B: 0x9EC3, - 0x707C: 0xD7C6, - 0x707D: 0x9EC4, - 0x707E: 0xD4D6, - 0x707F: 0xB2D3, - 0x7080: 0xECBE, - 0x7081: 0x9EC5, - 0x7082: 0x9EC6, - 0x7083: 0x9EC7, - 0x7084: 0x9EC8, - 0x7085: 0xEAC1, - 0x7086: 0x9EC9, - 0x7087: 0x9ECA, - 0x7088: 0x9ECB, - 0x7089: 0xC2AF, - 0x708A: 0xB4B6, - 0x708B: 0x9ECC, - 0x708C: 0x9ECD, - 0x708D: 0x9ECE, - 0x708E: 0xD1D7, - 0x708F: 0x9ECF, - 0x7090: 0x9ED0, - 0x7091: 0x9ED1, - 0x7092: 0xB3B4, - 0x7093: 0x9ED2, - 0x7094: 0xC8B2, - 0x7095: 0xBFBB, - 0x7096: 0xECC0, - 0x7097: 0x9ED3, - 0x7098: 0x9ED4, - 0x7099: 0xD6CB, - 0x709A: 0x9ED5, - 0x709B: 0x9ED6, - 0x709C: 0xECBF, - 0x709D: 0xECC1, - 0x709E: 0x9ED7, - 0x709F: 0x9ED8, - 0x70A0: 0x9ED9, - 0x70A1: 0x9EDA, - 0x70A2: 0x9EDB, - 0x70A3: 0x9EDC, - 0x70A4: 0x9EDD, - 0x70A5: 0x9EDE, - 0x70A6: 0x9EDF, - 0x70A7: 0x9EE0, - 0x70A8: 0x9EE1, - 0x70A9: 0x9EE2, - 0x70AA: 0x9EE3, - 0x70AB: 0xECC5, - 0x70AC: 0xBEE6, - 0x70AD: 0xCCBF, - 0x70AE: 0xC5DA, - 0x70AF: 0xBEBC, - 0x70B0: 0x9EE4, - 0x70B1: 0xECC6, - 0x70B2: 0x9EE5, - 0x70B3: 0xB1FE, - 0x70B4: 0x9EE6, - 0x70B5: 0x9EE7, - 0x70B6: 0x9EE8, - 0x70B7: 0xECC4, - 0x70B8: 0xD5A8, - 0x70B9: 0xB5E3, - 0x70BA: 0x9EE9, - 0x70BB: 0xECC2, - 0x70BC: 0xC1B6, - 0x70BD: 0xB3E3, - 0x70BE: 0x9EEA, - 0x70BF: 0x9EEB, - 0x70C0: 0xECC3, - 0x70C1: 0xCBB8, - 0x70C2: 0xC0C3, - 0x70C3: 0xCCFE, - 0x70C4: 0x9EEC, - 0x70C5: 0x9EED, - 0x70C6: 0x9EEE, - 0x70C7: 0x9EEF, - 0x70C8: 0xC1D2, - 0x70C9: 0x9EF0, - 0x70CA: 0xECC8, - 0x70CB: 0x9EF1, - 0x70CC: 0x9EF2, - 0x70CD: 0x9EF3, - 0x70CE: 0x9EF4, - 0x70CF: 0x9EF5, - 0x70D0: 0x9EF6, - 0x70D1: 0x9EF7, - 0x70D2: 0x9EF8, - 0x70D3: 0x9EF9, - 0x70D4: 0x9EFA, - 0x70D5: 0x9EFB, - 0x70D6: 0x9EFC, - 0x70D7: 0x9EFD, - 0x70D8: 0xBAE6, - 0x70D9: 0xC0D3, - 0x70DA: 0x9EFE, - 0x70DB: 0xD6F2, - 0x70DC: 0x9F40, - 0x70DD: 0x9F41, - 0x70DE: 0x9F42, - 0x70DF: 0xD1CC, - 0x70E0: 0x9F43, - 0x70E1: 0x9F44, - 0x70E2: 0x9F45, - 0x70E3: 0x9F46, - 0x70E4: 0xBFBE, - 0x70E5: 0x9F47, - 0x70E6: 0xB7B3, - 0x70E7: 0xC9D5, - 0x70E8: 0xECC7, - 0x70E9: 0xBBE2, - 0x70EA: 0x9F48, - 0x70EB: 0xCCCC, - 0x70EC: 0xBDFD, - 0x70ED: 0xC8C8, - 0x70EE: 0x9F49, - 0x70EF: 0xCFA9, - 0x70F0: 0x9F4A, - 0x70F1: 0x9F4B, - 0x70F2: 0x9F4C, - 0x70F3: 0x9F4D, - 0x70F4: 0x9F4E, - 0x70F5: 0x9F4F, - 0x70F6: 0x9F50, - 0x70F7: 0xCDE9, - 0x70F8: 0x9F51, - 0x70F9: 0xC5EB, - 0x70FA: 0x9F52, - 0x70FB: 0x9F53, - 0x70FC: 0x9F54, - 0x70FD: 0xB7E9, - 0x70FE: 0x9F55, - 0x70FF: 0x9F56, - 0x7100: 0x9F57, - 0x7101: 0x9F58, - 0x7102: 0x9F59, - 0x7103: 0x9F5A, - 0x7104: 0x9F5B, - 0x7105: 0x9F5C, - 0x7106: 0x9F5D, - 0x7107: 0x9F5E, - 0x7108: 0x9F5F, - 0x7109: 0xD1C9, - 0x710A: 0xBAB8, - 0x710B: 0x9F60, - 0x710C: 0x9F61, - 0x710D: 0x9F62, - 0x710E: 0x9F63, - 0x710F: 0x9F64, - 0x7110: 0xECC9, - 0x7111: 0x9F65, - 0x7112: 0x9F66, - 0x7113: 0xECCA, - 0x7114: 0x9F67, - 0x7115: 0xBBC0, - 0x7116: 0xECCB, - 0x7117: 0x9F68, - 0x7118: 0xECE2, - 0x7119: 0xB1BA, - 0x711A: 0xB7D9, - 0x711B: 0x9F69, - 0x711C: 0x9F6A, - 0x711D: 0x9F6B, - 0x711E: 0x9F6C, - 0x711F: 0x9F6D, - 0x7120: 0x9F6E, - 0x7121: 0x9F6F, - 0x7122: 0x9F70, - 0x7123: 0x9F71, - 0x7124: 0x9F72, - 0x7125: 0x9F73, - 0x7126: 0xBDB9, - 0x7127: 0x9F74, - 0x7128: 0x9F75, - 0x7129: 0x9F76, - 0x712A: 0x9F77, - 0x712B: 0x9F78, - 0x712C: 0x9F79, - 0x712D: 0x9F7A, - 0x712E: 0x9F7B, - 0x712F: 0xECCC, - 0x7130: 0xD1E6, - 0x7131: 0xECCD, - 0x7132: 0x9F7C, - 0x7133: 0x9F7D, - 0x7134: 0x9F7E, - 0x7135: 0x9F80, - 0x7136: 0xC8BB, - 0x7137: 0x9F81, - 0x7138: 0x9F82, - 0x7139: 0x9F83, - 0x713A: 0x9F84, - 0x713B: 0x9F85, - 0x713C: 0x9F86, - 0x713D: 0x9F87, - 0x713E: 0x9F88, - 0x713F: 0x9F89, - 0x7140: 0x9F8A, - 0x7141: 0x9F8B, - 0x7142: 0x9F8C, - 0x7143: 0x9F8D, - 0x7144: 0x9F8E, - 0x7145: 0xECD1, - 0x7146: 0x9F8F, - 0x7147: 0x9F90, - 0x7148: 0x9F91, - 0x7149: 0x9F92, - 0x714A: 0xECD3, - 0x714B: 0x9F93, - 0x714C: 0xBBCD, - 0x714D: 0x9F94, - 0x714E: 0xBCE5, - 0x714F: 0x9F95, - 0x7150: 0x9F96, - 0x7151: 0x9F97, - 0x7152: 0x9F98, - 0x7153: 0x9F99, - 0x7154: 0x9F9A, - 0x7155: 0x9F9B, - 0x7156: 0x9F9C, - 0x7157: 0x9F9D, - 0x7158: 0x9F9E, - 0x7159: 0x9F9F, - 0x715A: 0x9FA0, - 0x715B: 0x9FA1, - 0x715C: 0xECCF, - 0x715D: 0x9FA2, - 0x715E: 0xC9B7, - 0x715F: 0x9FA3, - 0x7160: 0x9FA4, - 0x7161: 0x9FA5, - 0x7162: 0x9FA6, - 0x7163: 0x9FA7, - 0x7164: 0xC3BA, - 0x7165: 0x9FA8, - 0x7166: 0xECE3, - 0x7167: 0xD5D5, - 0x7168: 0xECD0, - 0x7169: 0x9FA9, - 0x716A: 0x9FAA, - 0x716B: 0x9FAB, - 0x716C: 0x9FAC, - 0x716D: 0x9FAD, - 0x716E: 0xD6F3, - 0x716F: 0x9FAE, - 0x7170: 0x9FAF, - 0x7171: 0x9FB0, - 0x7172: 0xECD2, - 0x7173: 0xECCE, - 0x7174: 0x9FB1, - 0x7175: 0x9FB2, - 0x7176: 0x9FB3, - 0x7177: 0x9FB4, - 0x7178: 0xECD4, - 0x7179: 0x9FB5, - 0x717A: 0xECD5, - 0x717B: 0x9FB6, - 0x717C: 0x9FB7, - 0x717D: 0xC9BF, - 0x717E: 0x9FB8, - 0x717F: 0x9FB9, - 0x7180: 0x9FBA, - 0x7181: 0x9FBB, - 0x7182: 0x9FBC, - 0x7183: 0x9FBD, - 0x7184: 0xCFA8, - 0x7185: 0x9FBE, - 0x7186: 0x9FBF, - 0x7187: 0x9FC0, - 0x7188: 0x9FC1, - 0x7189: 0x9FC2, - 0x718A: 0xD0DC, - 0x718B: 0x9FC3, - 0x718C: 0x9FC4, - 0x718D: 0x9FC5, - 0x718E: 0x9FC6, - 0x718F: 0xD1AC, - 0x7190: 0x9FC7, - 0x7191: 0x9FC8, - 0x7192: 0x9FC9, - 0x7193: 0x9FCA, - 0x7194: 0xC8DB, - 0x7195: 0x9FCB, - 0x7196: 0x9FCC, - 0x7197: 0x9FCD, - 0x7198: 0xECD6, - 0x7199: 0xCEF5, - 0x719A: 0x9FCE, - 0x719B: 0x9FCF, - 0x719C: 0x9FD0, - 0x719D: 0x9FD1, - 0x719E: 0x9FD2, - 0x719F: 0xCAEC, - 0x71A0: 0xECDA, - 0x71A1: 0x9FD3, - 0x71A2: 0x9FD4, - 0x71A3: 0x9FD5, - 0x71A4: 0x9FD6, - 0x71A5: 0x9FD7, - 0x71A6: 0x9FD8, - 0x71A7: 0x9FD9, - 0x71A8: 0xECD9, - 0x71A9: 0x9FDA, - 0x71AA: 0x9FDB, - 0x71AB: 0x9FDC, - 0x71AC: 0xB0BE, - 0x71AD: 0x9FDD, - 0x71AE: 0x9FDE, - 0x71AF: 0x9FDF, - 0x71B0: 0x9FE0, - 0x71B1: 0x9FE1, - 0x71B2: 0x9FE2, - 0x71B3: 0xECD7, - 0x71B4: 0x9FE3, - 0x71B5: 0xECD8, - 0x71B6: 0x9FE4, - 0x71B7: 0x9FE5, - 0x71B8: 0x9FE6, - 0x71B9: 0xECE4, - 0x71BA: 0x9FE7, - 0x71BB: 0x9FE8, - 0x71BC: 0x9FE9, - 0x71BD: 0x9FEA, - 0x71BE: 0x9FEB, - 0x71BF: 0x9FEC, - 0x71C0: 0x9FED, - 0x71C1: 0x9FEE, - 0x71C2: 0x9FEF, - 0x71C3: 0xC8BC, - 0x71C4: 0x9FF0, - 0x71C5: 0x9FF1, - 0x71C6: 0x9FF2, - 0x71C7: 0x9FF3, - 0x71C8: 0x9FF4, - 0x71C9: 0x9FF5, - 0x71CA: 0x9FF6, - 0x71CB: 0x9FF7, - 0x71CC: 0x9FF8, - 0x71CD: 0x9FF9, - 0x71CE: 0xC1C7, - 0x71CF: 0x9FFA, - 0x71D0: 0x9FFB, - 0x71D1: 0x9FFC, - 0x71D2: 0x9FFD, - 0x71D3: 0x9FFE, - 0x71D4: 0xECDC, - 0x71D5: 0xD1E0, - 0x71D6: 0xA040, - 0x71D7: 0xA041, - 0x71D8: 0xA042, - 0x71D9: 0xA043, - 0x71DA: 0xA044, - 0x71DB: 0xA045, - 0x71DC: 0xA046, - 0x71DD: 0xA047, - 0x71DE: 0xA048, - 0x71DF: 0xA049, - 0x71E0: 0xECDB, - 0x71E1: 0xA04A, - 0x71E2: 0xA04B, - 0x71E3: 0xA04C, - 0x71E4: 0xA04D, - 0x71E5: 0xD4EF, - 0x71E6: 0xA04E, - 0x71E7: 0xECDD, - 0x71E8: 0xA04F, - 0x71E9: 0xA050, - 0x71EA: 0xA051, - 0x71EB: 0xA052, - 0x71EC: 0xA053, - 0x71ED: 0xA054, - 0x71EE: 0xDBC6, - 0x71EF: 0xA055, - 0x71F0: 0xA056, - 0x71F1: 0xA057, - 0x71F2: 0xA058, - 0x71F3: 0xA059, - 0x71F4: 0xA05A, - 0x71F5: 0xA05B, - 0x71F6: 0xA05C, - 0x71F7: 0xA05D, - 0x71F8: 0xA05E, - 0x71F9: 0xECDE, - 0x71FA: 0xA05F, - 0x71FB: 0xA060, - 0x71FC: 0xA061, - 0x71FD: 0xA062, - 0x71FE: 0xA063, - 0x71FF: 0xA064, - 0x7200: 0xA065, - 0x7201: 0xA066, - 0x7202: 0xA067, - 0x7203: 0xA068, - 0x7204: 0xA069, - 0x7205: 0xA06A, - 0x7206: 0xB1AC, - 0x7207: 0xA06B, - 0x7208: 0xA06C, - 0x7209: 0xA06D, - 0x720A: 0xA06E, - 0x720B: 0xA06F, - 0x720C: 0xA070, - 0x720D: 0xA071, - 0x720E: 0xA072, - 0x720F: 0xA073, - 0x7210: 0xA074, - 0x7211: 0xA075, - 0x7212: 0xA076, - 0x7213: 0xA077, - 0x7214: 0xA078, - 0x7215: 0xA079, - 0x7216: 0xA07A, - 0x7217: 0xA07B, - 0x7218: 0xA07C, - 0x7219: 0xA07D, - 0x721A: 0xA07E, - 0x721B: 0xA080, - 0x721C: 0xA081, - 0x721D: 0xECDF, - 0x721E: 0xA082, - 0x721F: 0xA083, - 0x7220: 0xA084, - 0x7221: 0xA085, - 0x7222: 0xA086, - 0x7223: 0xA087, - 0x7224: 0xA088, - 0x7225: 0xA089, - 0x7226: 0xA08A, - 0x7227: 0xA08B, - 0x7228: 0xECE0, - 0x7229: 0xA08C, - 0x722A: 0xD7A6, - 0x722B: 0xA08D, - 0x722C: 0xC5C0, - 0x722D: 0xA08E, - 0x722E: 0xA08F, - 0x722F: 0xA090, - 0x7230: 0xEBBC, - 0x7231: 0xB0AE, - 0x7232: 0xA091, - 0x7233: 0xA092, - 0x7234: 0xA093, - 0x7235: 0xBEF4, - 0x7236: 0xB8B8, - 0x7237: 0xD2AF, - 0x7238: 0xB0D6, - 0x7239: 0xB5F9, - 0x723A: 0xA094, - 0x723B: 0xD8B3, - 0x723C: 0xA095, - 0x723D: 0xCBAC, - 0x723E: 0xA096, - 0x723F: 0xE3DD, - 0x7240: 0xA097, - 0x7241: 0xA098, - 0x7242: 0xA099, - 0x7243: 0xA09A, - 0x7244: 0xA09B, - 0x7245: 0xA09C, - 0x7246: 0xA09D, - 0x7247: 0xC6AC, - 0x7248: 0xB0E6, - 0x7249: 0xA09E, - 0x724A: 0xA09F, - 0x724B: 0xA0A0, - 0x724C: 0xC5C6, - 0x724D: 0xEBB9, - 0x724E: 0xA0A1, - 0x724F: 0xA0A2, - 0x7250: 0xA0A3, - 0x7251: 0xA0A4, - 0x7252: 0xEBBA, - 0x7253: 0xA0A5, - 0x7254: 0xA0A6, - 0x7255: 0xA0A7, - 0x7256: 0xEBBB, - 0x7257: 0xA0A8, - 0x7258: 0xA0A9, - 0x7259: 0xD1C0, - 0x725A: 0xA0AA, - 0x725B: 0xC5A3, - 0x725C: 0xA0AB, - 0x725D: 0xEAF2, - 0x725E: 0xA0AC, - 0x725F: 0xC4B2, - 0x7260: 0xA0AD, - 0x7261: 0xC4B5, - 0x7262: 0xC0CE, - 0x7263: 0xA0AE, - 0x7264: 0xA0AF, - 0x7265: 0xA0B0, - 0x7266: 0xEAF3, - 0x7267: 0xC4C1, - 0x7268: 0xA0B1, - 0x7269: 0xCEEF, - 0x726A: 0xA0B2, - 0x726B: 0xA0B3, - 0x726C: 0xA0B4, - 0x726D: 0xA0B5, - 0x726E: 0xEAF0, - 0x726F: 0xEAF4, - 0x7270: 0xA0B6, - 0x7271: 0xA0B7, - 0x7272: 0xC9FC, - 0x7273: 0xA0B8, - 0x7274: 0xA0B9, - 0x7275: 0xC7A3, - 0x7276: 0xA0BA, - 0x7277: 0xA0BB, - 0x7278: 0xA0BC, - 0x7279: 0xCCD8, - 0x727A: 0xCEFE, - 0x727B: 0xA0BD, - 0x727C: 0xA0BE, - 0x727D: 0xA0BF, - 0x727E: 0xEAF5, - 0x727F: 0xEAF6, - 0x7280: 0xCFAC, - 0x7281: 0xC0E7, - 0x7282: 0xA0C0, - 0x7283: 0xA0C1, - 0x7284: 0xEAF7, - 0x7285: 0xA0C2, - 0x7286: 0xA0C3, - 0x7287: 0xA0C4, - 0x7288: 0xA0C5, - 0x7289: 0xA0C6, - 0x728A: 0xB6BF, - 0x728B: 0xEAF8, - 0x728C: 0xA0C7, - 0x728D: 0xEAF9, - 0x728E: 0xA0C8, - 0x728F: 0xEAFA, - 0x7290: 0xA0C9, - 0x7291: 0xA0CA, - 0x7292: 0xEAFB, - 0x7293: 0xA0CB, - 0x7294: 0xA0CC, - 0x7295: 0xA0CD, - 0x7296: 0xA0CE, - 0x7297: 0xA0CF, - 0x7298: 0xA0D0, - 0x7299: 0xA0D1, - 0x729A: 0xA0D2, - 0x729B: 0xA0D3, - 0x729C: 0xA0D4, - 0x729D: 0xA0D5, - 0x729E: 0xA0D6, - 0x729F: 0xEAF1, - 0x72A0: 0xA0D7, - 0x72A1: 0xA0D8, - 0x72A2: 0xA0D9, - 0x72A3: 0xA0DA, - 0x72A4: 0xA0DB, - 0x72A5: 0xA0DC, - 0x72A6: 0xA0DD, - 0x72A7: 0xA0DE, - 0x72A8: 0xA0DF, - 0x72A9: 0xA0E0, - 0x72AA: 0xA0E1, - 0x72AB: 0xA0E2, - 0x72AC: 0xC8AE, - 0x72AD: 0xE1EB, - 0x72AE: 0xA0E3, - 0x72AF: 0xB7B8, - 0x72B0: 0xE1EC, - 0x72B1: 0xA0E4, - 0x72B2: 0xA0E5, - 0x72B3: 0xA0E6, - 0x72B4: 0xE1ED, - 0x72B5: 0xA0E7, - 0x72B6: 0xD7B4, - 0x72B7: 0xE1EE, - 0x72B8: 0xE1EF, - 0x72B9: 0xD3CC, - 0x72BA: 0xA0E8, - 0x72BB: 0xA0E9, - 0x72BC: 0xA0EA, - 0x72BD: 0xA0EB, - 0x72BE: 0xA0EC, - 0x72BF: 0xA0ED, - 0x72C0: 0xA0EE, - 0x72C1: 0xE1F1, - 0x72C2: 0xBFF1, - 0x72C3: 0xE1F0, - 0x72C4: 0xB5D2, - 0x72C5: 0xA0EF, - 0x72C6: 0xA0F0, - 0x72C7: 0xA0F1, - 0x72C8: 0xB1B7, - 0x72C9: 0xA0F2, - 0x72CA: 0xA0F3, - 0x72CB: 0xA0F4, - 0x72CC: 0xA0F5, - 0x72CD: 0xE1F3, - 0x72CE: 0xE1F2, - 0x72CF: 0xA0F6, - 0x72D0: 0xBAFC, - 0x72D1: 0xA0F7, - 0x72D2: 0xE1F4, - 0x72D3: 0xA0F8, - 0x72D4: 0xA0F9, - 0x72D5: 0xA0FA, - 0x72D6: 0xA0FB, - 0x72D7: 0xB9B7, - 0x72D8: 0xA0FC, - 0x72D9: 0xBED1, - 0x72DA: 0xA0FD, - 0x72DB: 0xA0FE, - 0x72DC: 0xAA40, - 0x72DD: 0xAA41, - 0x72DE: 0xC4FC, - 0x72DF: 0xAA42, - 0x72E0: 0xBADD, - 0x72E1: 0xBDC6, - 0x72E2: 0xAA43, - 0x72E3: 0xAA44, - 0x72E4: 0xAA45, - 0x72E5: 0xAA46, - 0x72E6: 0xAA47, - 0x72E7: 0xAA48, - 0x72E8: 0xE1F5, - 0x72E9: 0xE1F7, - 0x72EA: 0xAA49, - 0x72EB: 0xAA4A, - 0x72EC: 0xB6C0, - 0x72ED: 0xCFC1, - 0x72EE: 0xCAA8, - 0x72EF: 0xE1F6, - 0x72F0: 0xD5F8, - 0x72F1: 0xD3FC, - 0x72F2: 0xE1F8, - 0x72F3: 0xE1FC, - 0x72F4: 0xE1F9, - 0x72F5: 0xAA4B, - 0x72F6: 0xAA4C, - 0x72F7: 0xE1FA, - 0x72F8: 0xC0EA, - 0x72F9: 0xAA4D, - 0x72FA: 0xE1FE, - 0x72FB: 0xE2A1, - 0x72FC: 0xC0C7, - 0x72FD: 0xAA4E, - 0x72FE: 0xAA4F, - 0x72FF: 0xAA50, - 0x7300: 0xAA51, - 0x7301: 0xE1FB, - 0x7302: 0xAA52, - 0x7303: 0xE1FD, - 0x7304: 0xAA53, - 0x7305: 0xAA54, - 0x7306: 0xAA55, - 0x7307: 0xAA56, - 0x7308: 0xAA57, - 0x7309: 0xAA58, - 0x730A: 0xE2A5, - 0x730B: 0xAA59, - 0x730C: 0xAA5A, - 0x730D: 0xAA5B, - 0x730E: 0xC1D4, - 0x730F: 0xAA5C, - 0x7310: 0xAA5D, - 0x7311: 0xAA5E, - 0x7312: 0xAA5F, - 0x7313: 0xE2A3, - 0x7314: 0xAA60, - 0x7315: 0xE2A8, - 0x7316: 0xB2FE, - 0x7317: 0xE2A2, - 0x7318: 0xAA61, - 0x7319: 0xAA62, - 0x731A: 0xAA63, - 0x731B: 0xC3CD, - 0x731C: 0xB2C2, - 0x731D: 0xE2A7, - 0x731E: 0xE2A6, - 0x731F: 0xAA64, - 0x7320: 0xAA65, - 0x7321: 0xE2A4, - 0x7322: 0xE2A9, - 0x7323: 0xAA66, - 0x7324: 0xAA67, - 0x7325: 0xE2AB, - 0x7326: 0xAA68, - 0x7327: 0xAA69, - 0x7328: 0xAA6A, - 0x7329: 0xD0C9, - 0x732A: 0xD6ED, - 0x732B: 0xC3A8, - 0x732C: 0xE2AC, - 0x732D: 0xAA6B, - 0x732E: 0xCFD7, - 0x732F: 0xAA6C, - 0x7330: 0xAA6D, - 0x7331: 0xE2AE, - 0x7332: 0xAA6E, - 0x7333: 0xAA6F, - 0x7334: 0xBAEF, - 0x7335: 0xAA70, - 0x7336: 0xAA71, - 0x7337: 0xE9E0, - 0x7338: 0xE2AD, - 0x7339: 0xE2AA, - 0x733A: 0xAA72, - 0x733B: 0xAA73, - 0x733C: 0xAA74, - 0x733D: 0xAA75, - 0x733E: 0xBBAB, - 0x733F: 0xD4B3, - 0x7340: 0xAA76, - 0x7341: 0xAA77, - 0x7342: 0xAA78, - 0x7343: 0xAA79, - 0x7344: 0xAA7A, - 0x7345: 0xAA7B, - 0x7346: 0xAA7C, - 0x7347: 0xAA7D, - 0x7348: 0xAA7E, - 0x7349: 0xAA80, - 0x734A: 0xAA81, - 0x734B: 0xAA82, - 0x734C: 0xAA83, - 0x734D: 0xE2B0, - 0x734E: 0xAA84, - 0x734F: 0xAA85, - 0x7350: 0xE2AF, - 0x7351: 0xAA86, - 0x7352: 0xE9E1, - 0x7353: 0xAA87, - 0x7354: 0xAA88, - 0x7355: 0xAA89, - 0x7356: 0xAA8A, - 0x7357: 0xE2B1, - 0x7358: 0xAA8B, - 0x7359: 0xAA8C, - 0x735A: 0xAA8D, - 0x735B: 0xAA8E, - 0x735C: 0xAA8F, - 0x735D: 0xAA90, - 0x735E: 0xAA91, - 0x735F: 0xAA92, - 0x7360: 0xE2B2, - 0x7361: 0xAA93, - 0x7362: 0xAA94, - 0x7363: 0xAA95, - 0x7364: 0xAA96, - 0x7365: 0xAA97, - 0x7366: 0xAA98, - 0x7367: 0xAA99, - 0x7368: 0xAA9A, - 0x7369: 0xAA9B, - 0x736A: 0xAA9C, - 0x736B: 0xAA9D, - 0x736C: 0xE2B3, - 0x736D: 0xCCA1, - 0x736E: 0xAA9E, - 0x736F: 0xE2B4, - 0x7370: 0xAA9F, - 0x7371: 0xAAA0, - 0x7372: 0xAB40, - 0x7373: 0xAB41, - 0x7374: 0xAB42, - 0x7375: 0xAB43, - 0x7376: 0xAB44, - 0x7377: 0xAB45, - 0x7378: 0xAB46, - 0x7379: 0xAB47, - 0x737A: 0xAB48, - 0x737B: 0xAB49, - 0x737C: 0xAB4A, - 0x737D: 0xAB4B, - 0x737E: 0xE2B5, - 0x737F: 0xAB4C, - 0x7380: 0xAB4D, - 0x7381: 0xAB4E, - 0x7382: 0xAB4F, - 0x7383: 0xAB50, - 0x7384: 0xD0FE, - 0x7385: 0xAB51, - 0x7386: 0xAB52, - 0x7387: 0xC2CA, - 0x7388: 0xAB53, - 0x7389: 0xD3F1, - 0x738A: 0xAB54, - 0x738B: 0xCDF5, - 0x738C: 0xAB55, - 0x738D: 0xAB56, - 0x738E: 0xE7E0, - 0x738F: 0xAB57, - 0x7390: 0xAB58, - 0x7391: 0xE7E1, - 0x7392: 0xAB59, - 0x7393: 0xAB5A, - 0x7394: 0xAB5B, - 0x7395: 0xAB5C, - 0x7396: 0xBEC1, - 0x7397: 0xAB5D, - 0x7398: 0xAB5E, - 0x7399: 0xAB5F, - 0x739A: 0xAB60, - 0x739B: 0xC2EA, - 0x739C: 0xAB61, - 0x739D: 0xAB62, - 0x739E: 0xAB63, - 0x739F: 0xE7E4, - 0x73A0: 0xAB64, - 0x73A1: 0xAB65, - 0x73A2: 0xE7E3, - 0x73A3: 0xAB66, - 0x73A4: 0xAB67, - 0x73A5: 0xAB68, - 0x73A6: 0xAB69, - 0x73A7: 0xAB6A, - 0x73A8: 0xAB6B, - 0x73A9: 0xCDE6, - 0x73AA: 0xAB6C, - 0x73AB: 0xC3B5, - 0x73AC: 0xAB6D, - 0x73AD: 0xAB6E, - 0x73AE: 0xE7E2, - 0x73AF: 0xBBB7, - 0x73B0: 0xCFD6, - 0x73B1: 0xAB6F, - 0x73B2: 0xC1E1, - 0x73B3: 0xE7E9, - 0x73B4: 0xAB70, - 0x73B5: 0xAB71, - 0x73B6: 0xAB72, - 0x73B7: 0xE7E8, - 0x73B8: 0xAB73, - 0x73B9: 0xAB74, - 0x73BA: 0xE7F4, - 0x73BB: 0xB2A3, - 0x73BC: 0xAB75, - 0x73BD: 0xAB76, - 0x73BE: 0xAB77, - 0x73BF: 0xAB78, - 0x73C0: 0xE7EA, - 0x73C1: 0xAB79, - 0x73C2: 0xE7E6, - 0x73C3: 0xAB7A, - 0x73C4: 0xAB7B, - 0x73C5: 0xAB7C, - 0x73C6: 0xAB7D, - 0x73C7: 0xAB7E, - 0x73C8: 0xE7EC, - 0x73C9: 0xE7EB, - 0x73CA: 0xC9BA, - 0x73CB: 0xAB80, - 0x73CC: 0xAB81, - 0x73CD: 0xD5E4, - 0x73CE: 0xAB82, - 0x73CF: 0xE7E5, - 0x73D0: 0xB7A9, - 0x73D1: 0xE7E7, - 0x73D2: 0xAB83, - 0x73D3: 0xAB84, - 0x73D4: 0xAB85, - 0x73D5: 0xAB86, - 0x73D6: 0xAB87, - 0x73D7: 0xAB88, - 0x73D8: 0xAB89, - 0x73D9: 0xE7EE, - 0x73DA: 0xAB8A, - 0x73DB: 0xAB8B, - 0x73DC: 0xAB8C, - 0x73DD: 0xAB8D, - 0x73DE: 0xE7F3, - 0x73DF: 0xAB8E, - 0x73E0: 0xD6E9, - 0x73E1: 0xAB8F, - 0x73E2: 0xAB90, - 0x73E3: 0xAB91, - 0x73E4: 0xAB92, - 0x73E5: 0xE7ED, - 0x73E6: 0xAB93, - 0x73E7: 0xE7F2, - 0x73E8: 0xAB94, - 0x73E9: 0xE7F1, - 0x73EA: 0xAB95, - 0x73EB: 0xAB96, - 0x73EC: 0xAB97, - 0x73ED: 0xB0E0, - 0x73EE: 0xAB98, - 0x73EF: 0xAB99, - 0x73F0: 0xAB9A, - 0x73F1: 0xAB9B, - 0x73F2: 0xE7F5, - 0x73F3: 0xAB9C, - 0x73F4: 0xAB9D, - 0x73F5: 0xAB9E, - 0x73F6: 0xAB9F, - 0x73F7: 0xABA0, - 0x73F8: 0xAC40, - 0x73F9: 0xAC41, - 0x73FA: 0xAC42, - 0x73FB: 0xAC43, - 0x73FC: 0xAC44, - 0x73FD: 0xAC45, - 0x73FE: 0xAC46, - 0x73FF: 0xAC47, - 0x7400: 0xAC48, - 0x7401: 0xAC49, - 0x7402: 0xAC4A, - 0x7403: 0xC7F2, - 0x7404: 0xAC4B, - 0x7405: 0xC0C5, - 0x7406: 0xC0ED, - 0x7407: 0xAC4C, - 0x7408: 0xAC4D, - 0x7409: 0xC1F0, - 0x740A: 0xE7F0, - 0x740B: 0xAC4E, - 0x740C: 0xAC4F, - 0x740D: 0xAC50, - 0x740E: 0xAC51, - 0x740F: 0xE7F6, - 0x7410: 0xCBF6, - 0x7411: 0xAC52, - 0x7412: 0xAC53, - 0x7413: 0xAC54, - 0x7414: 0xAC55, - 0x7415: 0xAC56, - 0x7416: 0xAC57, - 0x7417: 0xAC58, - 0x7418: 0xAC59, - 0x7419: 0xAC5A, - 0x741A: 0xE8A2, - 0x741B: 0xE8A1, - 0x741C: 0xAC5B, - 0x741D: 0xAC5C, - 0x741E: 0xAC5D, - 0x741F: 0xAC5E, - 0x7420: 0xAC5F, - 0x7421: 0xAC60, - 0x7422: 0xD7C1, - 0x7423: 0xAC61, - 0x7424: 0xAC62, - 0x7425: 0xE7FA, - 0x7426: 0xE7F9, - 0x7427: 0xAC63, - 0x7428: 0xE7FB, - 0x7429: 0xAC64, - 0x742A: 0xE7F7, - 0x742B: 0xAC65, - 0x742C: 0xE7FE, - 0x742D: 0xAC66, - 0x742E: 0xE7FD, - 0x742F: 0xAC67, - 0x7430: 0xE7FC, - 0x7431: 0xAC68, - 0x7432: 0xAC69, - 0x7433: 0xC1D5, - 0x7434: 0xC7D9, - 0x7435: 0xC5FD, - 0x7436: 0xC5C3, - 0x7437: 0xAC6A, - 0x7438: 0xAC6B, - 0x7439: 0xAC6C, - 0x743A: 0xAC6D, - 0x743B: 0xAC6E, - 0x743C: 0xC7ED, - 0x743D: 0xAC6F, - 0x743E: 0xAC70, - 0x743F: 0xAC71, - 0x7440: 0xAC72, - 0x7441: 0xE8A3, - 0x7442: 0xAC73, - 0x7443: 0xAC74, - 0x7444: 0xAC75, - 0x7445: 0xAC76, - 0x7446: 0xAC77, - 0x7447: 0xAC78, - 0x7448: 0xAC79, - 0x7449: 0xAC7A, - 0x744A: 0xAC7B, - 0x744B: 0xAC7C, - 0x744C: 0xAC7D, - 0x744D: 0xAC7E, - 0x744E: 0xAC80, - 0x744F: 0xAC81, - 0x7450: 0xAC82, - 0x7451: 0xAC83, - 0x7452: 0xAC84, - 0x7453: 0xAC85, - 0x7454: 0xAC86, - 0x7455: 0xE8A6, - 0x7456: 0xAC87, - 0x7457: 0xE8A5, - 0x7458: 0xAC88, - 0x7459: 0xE8A7, - 0x745A: 0xBAF7, - 0x745B: 0xE7F8, - 0x745C: 0xE8A4, - 0x745D: 0xAC89, - 0x745E: 0xC8F0, - 0x745F: 0xC9AA, - 0x7460: 0xAC8A, - 0x7461: 0xAC8B, - 0x7462: 0xAC8C, - 0x7463: 0xAC8D, - 0x7464: 0xAC8E, - 0x7465: 0xAC8F, - 0x7466: 0xAC90, - 0x7467: 0xAC91, - 0x7468: 0xAC92, - 0x7469: 0xAC93, - 0x746A: 0xAC94, - 0x746B: 0xAC95, - 0x746C: 0xAC96, - 0x746D: 0xE8A9, - 0x746E: 0xAC97, - 0x746F: 0xAC98, - 0x7470: 0xB9E5, - 0x7471: 0xAC99, - 0x7472: 0xAC9A, - 0x7473: 0xAC9B, - 0x7474: 0xAC9C, - 0x7475: 0xAC9D, - 0x7476: 0xD1FE, - 0x7477: 0xE8A8, - 0x7478: 0xAC9E, - 0x7479: 0xAC9F, - 0x747A: 0xACA0, - 0x747B: 0xAD40, - 0x747C: 0xAD41, - 0x747D: 0xAD42, - 0x747E: 0xE8AA, - 0x747F: 0xAD43, - 0x7480: 0xE8AD, - 0x7481: 0xE8AE, - 0x7482: 0xAD44, - 0x7483: 0xC1A7, - 0x7484: 0xAD45, - 0x7485: 0xAD46, - 0x7486: 0xAD47, - 0x7487: 0xE8AF, - 0x7488: 0xAD48, - 0x7489: 0xAD49, - 0x748A: 0xAD4A, - 0x748B: 0xE8B0, - 0x748C: 0xAD4B, - 0x748D: 0xAD4C, - 0x748E: 0xE8AC, - 0x748F: 0xAD4D, - 0x7490: 0xE8B4, - 0x7491: 0xAD4E, - 0x7492: 0xAD4F, - 0x7493: 0xAD50, - 0x7494: 0xAD51, - 0x7495: 0xAD52, - 0x7496: 0xAD53, - 0x7497: 0xAD54, - 0x7498: 0xAD55, - 0x7499: 0xAD56, - 0x749A: 0xAD57, - 0x749B: 0xAD58, - 0x749C: 0xE8AB, - 0x749D: 0xAD59, - 0x749E: 0xE8B1, - 0x749F: 0xAD5A, - 0x74A0: 0xAD5B, - 0x74A1: 0xAD5C, - 0x74A2: 0xAD5D, - 0x74A3: 0xAD5E, - 0x74A4: 0xAD5F, - 0x74A5: 0xAD60, - 0x74A6: 0xAD61, - 0x74A7: 0xE8B5, - 0x74A8: 0xE8B2, - 0x74A9: 0xE8B3, - 0x74AA: 0xAD62, - 0x74AB: 0xAD63, - 0x74AC: 0xAD64, - 0x74AD: 0xAD65, - 0x74AE: 0xAD66, - 0x74AF: 0xAD67, - 0x74B0: 0xAD68, - 0x74B1: 0xAD69, - 0x74B2: 0xAD6A, - 0x74B3: 0xAD6B, - 0x74B4: 0xAD6C, - 0x74B5: 0xAD6D, - 0x74B6: 0xAD6E, - 0x74B7: 0xAD6F, - 0x74B8: 0xAD70, - 0x74B9: 0xAD71, - 0x74BA: 0xE8B7, - 0x74BB: 0xAD72, - 0x74BC: 0xAD73, - 0x74BD: 0xAD74, - 0x74BE: 0xAD75, - 0x74BF: 0xAD76, - 0x74C0: 0xAD77, - 0x74C1: 0xAD78, - 0x74C2: 0xAD79, - 0x74C3: 0xAD7A, - 0x74C4: 0xAD7B, - 0x74C5: 0xAD7C, - 0x74C6: 0xAD7D, - 0x74C7: 0xAD7E, - 0x74C8: 0xAD80, - 0x74C9: 0xAD81, - 0x74CA: 0xAD82, - 0x74CB: 0xAD83, - 0x74CC: 0xAD84, - 0x74CD: 0xAD85, - 0x74CE: 0xAD86, - 0x74CF: 0xAD87, - 0x74D0: 0xAD88, - 0x74D1: 0xAD89, - 0x74D2: 0xE8B6, - 0x74D3: 0xAD8A, - 0x74D4: 0xAD8B, - 0x74D5: 0xAD8C, - 0x74D6: 0xAD8D, - 0x74D7: 0xAD8E, - 0x74D8: 0xAD8F, - 0x74D9: 0xAD90, - 0x74DA: 0xAD91, - 0x74DB: 0xAD92, - 0x74DC: 0xB9CF, - 0x74DD: 0xAD93, - 0x74DE: 0xF0AC, - 0x74DF: 0xAD94, - 0x74E0: 0xF0AD, - 0x74E1: 0xAD95, - 0x74E2: 0xC6B0, - 0x74E3: 0xB0EA, - 0x74E4: 0xC8BF, - 0x74E5: 0xAD96, - 0x74E6: 0xCDDF, - 0x74E7: 0xAD97, - 0x74E8: 0xAD98, - 0x74E9: 0xAD99, - 0x74EA: 0xAD9A, - 0x74EB: 0xAD9B, - 0x74EC: 0xAD9C, - 0x74ED: 0xAD9D, - 0x74EE: 0xCECD, - 0x74EF: 0xEAB1, - 0x74F0: 0xAD9E, - 0x74F1: 0xAD9F, - 0x74F2: 0xADA0, - 0x74F3: 0xAE40, - 0x74F4: 0xEAB2, - 0x74F5: 0xAE41, - 0x74F6: 0xC6BF, - 0x74F7: 0xB4C9, - 0x74F8: 0xAE42, - 0x74F9: 0xAE43, - 0x74FA: 0xAE44, - 0x74FB: 0xAE45, - 0x74FC: 0xAE46, - 0x74FD: 0xAE47, - 0x74FE: 0xAE48, - 0x74FF: 0xEAB3, - 0x7500: 0xAE49, - 0x7501: 0xAE4A, - 0x7502: 0xAE4B, - 0x7503: 0xAE4C, - 0x7504: 0xD5E7, - 0x7505: 0xAE4D, - 0x7506: 0xAE4E, - 0x7507: 0xAE4F, - 0x7508: 0xAE50, - 0x7509: 0xAE51, - 0x750A: 0xAE52, - 0x750B: 0xAE53, - 0x750C: 0xAE54, - 0x750D: 0xDDF9, - 0x750E: 0xAE55, - 0x750F: 0xEAB4, - 0x7510: 0xAE56, - 0x7511: 0xEAB5, - 0x7512: 0xAE57, - 0x7513: 0xEAB6, - 0x7514: 0xAE58, - 0x7515: 0xAE59, - 0x7516: 0xAE5A, - 0x7517: 0xAE5B, - 0x7518: 0xB8CA, - 0x7519: 0xDFB0, - 0x751A: 0xC9F5, - 0x751B: 0xAE5C, - 0x751C: 0xCCF0, - 0x751D: 0xAE5D, - 0x751E: 0xAE5E, - 0x751F: 0xC9FA, - 0x7520: 0xAE5F, - 0x7521: 0xAE60, - 0x7522: 0xAE61, - 0x7523: 0xAE62, - 0x7524: 0xAE63, - 0x7525: 0xC9FB, - 0x7526: 0xAE64, - 0x7527: 0xAE65, - 0x7528: 0xD3C3, - 0x7529: 0xCBA6, - 0x752A: 0xAE66, - 0x752B: 0xB8A6, - 0x752C: 0xF0AE, - 0x752D: 0xB1C2, - 0x752E: 0xAE67, - 0x752F: 0xE5B8, - 0x7530: 0xCCEF, - 0x7531: 0xD3C9, - 0x7532: 0xBCD7, - 0x7533: 0xC9EA, - 0x7534: 0xAE68, - 0x7535: 0xB5E7, - 0x7536: 0xAE69, - 0x7537: 0xC4D0, - 0x7538: 0xB5E9, - 0x7539: 0xAE6A, - 0x753A: 0xEEAE, - 0x753B: 0xBBAD, - 0x753C: 0xAE6B, - 0x753D: 0xAE6C, - 0x753E: 0xE7DE, - 0x753F: 0xAE6D, - 0x7540: 0xEEAF, - 0x7541: 0xAE6E, - 0x7542: 0xAE6F, - 0x7543: 0xAE70, - 0x7544: 0xAE71, - 0x7545: 0xB3A9, - 0x7546: 0xAE72, - 0x7547: 0xAE73, - 0x7548: 0xEEB2, - 0x7549: 0xAE74, - 0x754A: 0xAE75, - 0x754B: 0xEEB1, - 0x754C: 0xBDE7, - 0x754D: 0xAE76, - 0x754E: 0xEEB0, - 0x754F: 0xCEB7, - 0x7550: 0xAE77, - 0x7551: 0xAE78, - 0x7552: 0xAE79, - 0x7553: 0xAE7A, - 0x7554: 0xC5CF, - 0x7555: 0xAE7B, - 0x7556: 0xAE7C, - 0x7557: 0xAE7D, - 0x7558: 0xAE7E, - 0x7559: 0xC1F4, - 0x755A: 0xDBCE, - 0x755B: 0xEEB3, - 0x755C: 0xD0F3, - 0x755D: 0xAE80, - 0x755E: 0xAE81, - 0x755F: 0xAE82, - 0x7560: 0xAE83, - 0x7561: 0xAE84, - 0x7562: 0xAE85, - 0x7563: 0xAE86, - 0x7564: 0xAE87, - 0x7565: 0xC2D4, - 0x7566: 0xC6E8, - 0x7567: 0xAE88, - 0x7568: 0xAE89, - 0x7569: 0xAE8A, - 0x756A: 0xB7AC, - 0x756B: 0xAE8B, - 0x756C: 0xAE8C, - 0x756D: 0xAE8D, - 0x756E: 0xAE8E, - 0x756F: 0xAE8F, - 0x7570: 0xAE90, - 0x7571: 0xAE91, - 0x7572: 0xEEB4, - 0x7573: 0xAE92, - 0x7574: 0xB3EB, - 0x7575: 0xAE93, - 0x7576: 0xAE94, - 0x7577: 0xAE95, - 0x7578: 0xBBFB, - 0x7579: 0xEEB5, - 0x757A: 0xAE96, - 0x757B: 0xAE97, - 0x757C: 0xAE98, - 0x757D: 0xAE99, - 0x757E: 0xAE9A, - 0x757F: 0xE7DC, - 0x7580: 0xAE9B, - 0x7581: 0xAE9C, - 0x7582: 0xAE9D, - 0x7583: 0xEEB6, - 0x7584: 0xAE9E, - 0x7585: 0xAE9F, - 0x7586: 0xBDAE, - 0x7587: 0xAEA0, - 0x7588: 0xAF40, - 0x7589: 0xAF41, - 0x758A: 0xAF42, - 0x758B: 0xF1E2, - 0x758C: 0xAF43, - 0x758D: 0xAF44, - 0x758E: 0xAF45, - 0x758F: 0xCAE8, - 0x7590: 0xAF46, - 0x7591: 0xD2C9, - 0x7592: 0xF0DA, - 0x7593: 0xAF47, - 0x7594: 0xF0DB, - 0x7595: 0xAF48, - 0x7596: 0xF0DC, - 0x7597: 0xC1C6, - 0x7598: 0xAF49, - 0x7599: 0xB8ED, - 0x759A: 0xBECE, - 0x759B: 0xAF4A, - 0x759C: 0xAF4B, - 0x759D: 0xF0DE, - 0x759E: 0xAF4C, - 0x759F: 0xC5B1, - 0x75A0: 0xF0DD, - 0x75A1: 0xD1F1, - 0x75A2: 0xAF4D, - 0x75A3: 0xF0E0, - 0x75A4: 0xB0CC, - 0x75A5: 0xBDEA, - 0x75A6: 0xAF4E, - 0x75A7: 0xAF4F, - 0x75A8: 0xAF50, - 0x75A9: 0xAF51, - 0x75AA: 0xAF52, - 0x75AB: 0xD2DF, - 0x75AC: 0xF0DF, - 0x75AD: 0xAF53, - 0x75AE: 0xB4AF, - 0x75AF: 0xB7E8, - 0x75B0: 0xF0E6, - 0x75B1: 0xF0E5, - 0x75B2: 0xC6A3, - 0x75B3: 0xF0E1, - 0x75B4: 0xF0E2, - 0x75B5: 0xB4C3, - 0x75B6: 0xAF54, - 0x75B7: 0xAF55, - 0x75B8: 0xF0E3, - 0x75B9: 0xD5EE, - 0x75BA: 0xAF56, - 0x75BB: 0xAF57, - 0x75BC: 0xCCDB, - 0x75BD: 0xBED2, - 0x75BE: 0xBCB2, - 0x75BF: 0xAF58, - 0x75C0: 0xAF59, - 0x75C1: 0xAF5A, - 0x75C2: 0xF0E8, - 0x75C3: 0xF0E7, - 0x75C4: 0xF0E4, - 0x75C5: 0xB2A1, - 0x75C6: 0xAF5B, - 0x75C7: 0xD6A2, - 0x75C8: 0xD3B8, - 0x75C9: 0xBEB7, - 0x75CA: 0xC8AC, - 0x75CB: 0xAF5C, - 0x75CC: 0xAF5D, - 0x75CD: 0xF0EA, - 0x75CE: 0xAF5E, - 0x75CF: 0xAF5F, - 0x75D0: 0xAF60, - 0x75D1: 0xAF61, - 0x75D2: 0xD1F7, - 0x75D3: 0xAF62, - 0x75D4: 0xD6CC, - 0x75D5: 0xBADB, - 0x75D6: 0xF0E9, - 0x75D7: 0xAF63, - 0x75D8: 0xB6BB, - 0x75D9: 0xAF64, - 0x75DA: 0xAF65, - 0x75DB: 0xCDB4, - 0x75DC: 0xAF66, - 0x75DD: 0xAF67, - 0x75DE: 0xC6A6, - 0x75DF: 0xAF68, - 0x75E0: 0xAF69, - 0x75E1: 0xAF6A, - 0x75E2: 0xC1A1, - 0x75E3: 0xF0EB, - 0x75E4: 0xF0EE, - 0x75E5: 0xAF6B, - 0x75E6: 0xF0ED, - 0x75E7: 0xF0F0, - 0x75E8: 0xF0EC, - 0x75E9: 0xAF6C, - 0x75EA: 0xBBBE, - 0x75EB: 0xF0EF, - 0x75EC: 0xAF6D, - 0x75ED: 0xAF6E, - 0x75EE: 0xAF6F, - 0x75EF: 0xAF70, - 0x75F0: 0xCCB5, - 0x75F1: 0xF0F2, - 0x75F2: 0xAF71, - 0x75F3: 0xAF72, - 0x75F4: 0xB3D5, - 0x75F5: 0xAF73, - 0x75F6: 0xAF74, - 0x75F7: 0xAF75, - 0x75F8: 0xAF76, - 0x75F9: 0xB1D4, - 0x75FA: 0xAF77, - 0x75FB: 0xAF78, - 0x75FC: 0xF0F3, - 0x75FD: 0xAF79, - 0x75FE: 0xAF7A, - 0x75FF: 0xF0F4, - 0x7600: 0xF0F6, - 0x7601: 0xB4E1, - 0x7602: 0xAF7B, - 0x7603: 0xF0F1, - 0x7604: 0xAF7C, - 0x7605: 0xF0F7, - 0x7606: 0xAF7D, - 0x7607: 0xAF7E, - 0x7608: 0xAF80, - 0x7609: 0xAF81, - 0x760A: 0xF0FA, - 0x760B: 0xAF82, - 0x760C: 0xF0F8, - 0x760D: 0xAF83, - 0x760E: 0xAF84, - 0x760F: 0xAF85, - 0x7610: 0xF0F5, - 0x7611: 0xAF86, - 0x7612: 0xAF87, - 0x7613: 0xAF88, - 0x7614: 0xAF89, - 0x7615: 0xF0FD, - 0x7616: 0xAF8A, - 0x7617: 0xF0F9, - 0x7618: 0xF0FC, - 0x7619: 0xF0FE, - 0x761A: 0xAF8B, - 0x761B: 0xF1A1, - 0x761C: 0xAF8C, - 0x761D: 0xAF8D, - 0x761E: 0xAF8E, - 0x761F: 0xCEC1, - 0x7620: 0xF1A4, - 0x7621: 0xAF8F, - 0x7622: 0xF1A3, - 0x7623: 0xAF90, - 0x7624: 0xC1F6, - 0x7625: 0xF0FB, - 0x7626: 0xCADD, - 0x7627: 0xAF91, - 0x7628: 0xAF92, - 0x7629: 0xB4F1, - 0x762A: 0xB1F1, - 0x762B: 0xCCB1, - 0x762C: 0xAF93, - 0x762D: 0xF1A6, - 0x762E: 0xAF94, - 0x762F: 0xAF95, - 0x7630: 0xF1A7, - 0x7631: 0xAF96, - 0x7632: 0xAF97, - 0x7633: 0xF1AC, - 0x7634: 0xD5CE, - 0x7635: 0xF1A9, - 0x7636: 0xAF98, - 0x7637: 0xAF99, - 0x7638: 0xC8B3, - 0x7639: 0xAF9A, - 0x763A: 0xAF9B, - 0x763B: 0xAF9C, - 0x763C: 0xF1A2, - 0x763D: 0xAF9D, - 0x763E: 0xF1AB, - 0x763F: 0xF1A8, - 0x7640: 0xF1A5, - 0x7641: 0xAF9E, - 0x7642: 0xAF9F, - 0x7643: 0xF1AA, - 0x7644: 0xAFA0, - 0x7645: 0xB040, - 0x7646: 0xB041, - 0x7647: 0xB042, - 0x7648: 0xB043, - 0x7649: 0xB044, - 0x764A: 0xB045, - 0x764B: 0xB046, - 0x764C: 0xB0A9, - 0x764D: 0xF1AD, - 0x764E: 0xB047, - 0x764F: 0xB048, - 0x7650: 0xB049, - 0x7651: 0xB04A, - 0x7652: 0xB04B, - 0x7653: 0xB04C, - 0x7654: 0xF1AF, - 0x7655: 0xB04D, - 0x7656: 0xF1B1, - 0x7657: 0xB04E, - 0x7658: 0xB04F, - 0x7659: 0xB050, - 0x765A: 0xB051, - 0x765B: 0xB052, - 0x765C: 0xF1B0, - 0x765D: 0xB053, - 0x765E: 0xF1AE, - 0x765F: 0xB054, - 0x7660: 0xB055, - 0x7661: 0xB056, - 0x7662: 0xB057, - 0x7663: 0xD1A2, - 0x7664: 0xB058, - 0x7665: 0xB059, - 0x7666: 0xB05A, - 0x7667: 0xB05B, - 0x7668: 0xB05C, - 0x7669: 0xB05D, - 0x766A: 0xB05E, - 0x766B: 0xF1B2, - 0x766C: 0xB05F, - 0x766D: 0xB060, - 0x766E: 0xB061, - 0x766F: 0xF1B3, - 0x7670: 0xB062, - 0x7671: 0xB063, - 0x7672: 0xB064, - 0x7673: 0xB065, - 0x7674: 0xB066, - 0x7675: 0xB067, - 0x7676: 0xB068, - 0x7677: 0xB069, - 0x7678: 0xB9EF, - 0x7679: 0xB06A, - 0x767A: 0xB06B, - 0x767B: 0xB5C7, - 0x767C: 0xB06C, - 0x767D: 0xB0D7, - 0x767E: 0xB0D9, - 0x767F: 0xB06D, - 0x7680: 0xB06E, - 0x7681: 0xB06F, - 0x7682: 0xD4ED, - 0x7683: 0xB070, - 0x7684: 0xB5C4, - 0x7685: 0xB071, - 0x7686: 0xBDD4, - 0x7687: 0xBBCA, - 0x7688: 0xF0A7, - 0x7689: 0xB072, - 0x768A: 0xB073, - 0x768B: 0xB8DE, - 0x768C: 0xB074, - 0x768D: 0xB075, - 0x768E: 0xF0A8, - 0x768F: 0xB076, - 0x7690: 0xB077, - 0x7691: 0xB0A8, - 0x7692: 0xB078, - 0x7693: 0xF0A9, - 0x7694: 0xB079, - 0x7695: 0xB07A, - 0x7696: 0xCDEE, - 0x7697: 0xB07B, - 0x7698: 0xB07C, - 0x7699: 0xF0AA, - 0x769A: 0xB07D, - 0x769B: 0xB07E, - 0x769C: 0xB080, - 0x769D: 0xB081, - 0x769E: 0xB082, - 0x769F: 0xB083, - 0x76A0: 0xB084, - 0x76A1: 0xB085, - 0x76A2: 0xB086, - 0x76A3: 0xB087, - 0x76A4: 0xF0AB, - 0x76A5: 0xB088, - 0x76A6: 0xB089, - 0x76A7: 0xB08A, - 0x76A8: 0xB08B, - 0x76A9: 0xB08C, - 0x76AA: 0xB08D, - 0x76AB: 0xB08E, - 0x76AC: 0xB08F, - 0x76AD: 0xB090, - 0x76AE: 0xC6A4, - 0x76AF: 0xB091, - 0x76B0: 0xB092, - 0x76B1: 0xD6E5, - 0x76B2: 0xF1E4, - 0x76B3: 0xB093, - 0x76B4: 0xF1E5, - 0x76B5: 0xB094, - 0x76B6: 0xB095, - 0x76B7: 0xB096, - 0x76B8: 0xB097, - 0x76B9: 0xB098, - 0x76BA: 0xB099, - 0x76BB: 0xB09A, - 0x76BC: 0xB09B, - 0x76BD: 0xB09C, - 0x76BE: 0xB09D, - 0x76BF: 0xC3F3, - 0x76C0: 0xB09E, - 0x76C1: 0xB09F, - 0x76C2: 0xD3DB, - 0x76C3: 0xB0A0, - 0x76C4: 0xB140, - 0x76C5: 0xD6D1, - 0x76C6: 0xC5E8, - 0x76C7: 0xB141, - 0x76C8: 0xD3AF, - 0x76C9: 0xB142, - 0x76CA: 0xD2E6, - 0x76CB: 0xB143, - 0x76CC: 0xB144, - 0x76CD: 0xEEC1, - 0x76CE: 0xB0BB, - 0x76CF: 0xD5B5, - 0x76D0: 0xD1CE, - 0x76D1: 0xBCE0, - 0x76D2: 0xBAD0, - 0x76D3: 0xB145, - 0x76D4: 0xBFF8, - 0x76D5: 0xB146, - 0x76D6: 0xB8C7, - 0x76D7: 0xB5C1, - 0x76D8: 0xC5CC, - 0x76D9: 0xB147, - 0x76DA: 0xB148, - 0x76DB: 0xCAA2, - 0x76DC: 0xB149, - 0x76DD: 0xB14A, - 0x76DE: 0xB14B, - 0x76DF: 0xC3CB, - 0x76E0: 0xB14C, - 0x76E1: 0xB14D, - 0x76E2: 0xB14E, - 0x76E3: 0xB14F, - 0x76E4: 0xB150, - 0x76E5: 0xEEC2, - 0x76E6: 0xB151, - 0x76E7: 0xB152, - 0x76E8: 0xB153, - 0x76E9: 0xB154, - 0x76EA: 0xB155, - 0x76EB: 0xB156, - 0x76EC: 0xB157, - 0x76ED: 0xB158, - 0x76EE: 0xC4BF, - 0x76EF: 0xB6A2, - 0x76F0: 0xB159, - 0x76F1: 0xEDEC, - 0x76F2: 0xC3A4, - 0x76F3: 0xB15A, - 0x76F4: 0xD6B1, - 0x76F5: 0xB15B, - 0x76F6: 0xB15C, - 0x76F7: 0xB15D, - 0x76F8: 0xCFE0, - 0x76F9: 0xEDEF, - 0x76FA: 0xB15E, - 0x76FB: 0xB15F, - 0x76FC: 0xC5CE, - 0x76FD: 0xB160, - 0x76FE: 0xB6DC, - 0x76FF: 0xB161, - 0x7700: 0xB162, - 0x7701: 0xCAA1, - 0x7702: 0xB163, - 0x7703: 0xB164, - 0x7704: 0xEDED, - 0x7705: 0xB165, - 0x7706: 0xB166, - 0x7707: 0xEDF0, - 0x7708: 0xEDF1, - 0x7709: 0xC3BC, - 0x770A: 0xB167, - 0x770B: 0xBFB4, - 0x770C: 0xB168, - 0x770D: 0xEDEE, - 0x770E: 0xB169, - 0x770F: 0xB16A, - 0x7710: 0xB16B, - 0x7711: 0xB16C, - 0x7712: 0xB16D, - 0x7713: 0xB16E, - 0x7714: 0xB16F, - 0x7715: 0xB170, - 0x7716: 0xB171, - 0x7717: 0xB172, - 0x7718: 0xB173, - 0x7719: 0xEDF4, - 0x771A: 0xEDF2, - 0x771B: 0xB174, - 0x771C: 0xB175, - 0x771D: 0xB176, - 0x771E: 0xB177, - 0x771F: 0xD5E6, - 0x7720: 0xC3DF, - 0x7721: 0xB178, - 0x7722: 0xEDF3, - 0x7723: 0xB179, - 0x7724: 0xB17A, - 0x7725: 0xB17B, - 0x7726: 0xEDF6, - 0x7727: 0xB17C, - 0x7728: 0xD5A3, - 0x7729: 0xD1A3, - 0x772A: 0xB17D, - 0x772B: 0xB17E, - 0x772C: 0xB180, - 0x772D: 0xEDF5, - 0x772E: 0xB181, - 0x772F: 0xC3D0, - 0x7730: 0xB182, - 0x7731: 0xB183, - 0x7732: 0xB184, - 0x7733: 0xB185, - 0x7734: 0xB186, - 0x7735: 0xEDF7, - 0x7736: 0xBFF4, - 0x7737: 0xBEEC, - 0x7738: 0xEDF8, - 0x7739: 0xB187, - 0x773A: 0xCCF7, - 0x773B: 0xB188, - 0x773C: 0xD1DB, - 0x773D: 0xB189, - 0x773E: 0xB18A, - 0x773F: 0xB18B, - 0x7740: 0xD7C5, - 0x7741: 0xD5F6, - 0x7742: 0xB18C, - 0x7743: 0xEDFC, - 0x7744: 0xB18D, - 0x7745: 0xB18E, - 0x7746: 0xB18F, - 0x7747: 0xEDFB, - 0x7748: 0xB190, - 0x7749: 0xB191, - 0x774A: 0xB192, - 0x774B: 0xB193, - 0x774C: 0xB194, - 0x774D: 0xB195, - 0x774E: 0xB196, - 0x774F: 0xB197, - 0x7750: 0xEDF9, - 0x7751: 0xEDFA, - 0x7752: 0xB198, - 0x7753: 0xB199, - 0x7754: 0xB19A, - 0x7755: 0xB19B, - 0x7756: 0xB19C, - 0x7757: 0xB19D, - 0x7758: 0xB19E, - 0x7759: 0xB19F, - 0x775A: 0xEDFD, - 0x775B: 0xBEA6, - 0x775C: 0xB1A0, - 0x775D: 0xB240, - 0x775E: 0xB241, - 0x775F: 0xB242, - 0x7760: 0xB243, - 0x7761: 0xCBAF, - 0x7762: 0xEEA1, - 0x7763: 0xB6BD, - 0x7764: 0xB244, - 0x7765: 0xEEA2, - 0x7766: 0xC4C0, - 0x7767: 0xB245, - 0x7768: 0xEDFE, - 0x7769: 0xB246, - 0x776A: 0xB247, - 0x776B: 0xBDDE, - 0x776C: 0xB2C7, - 0x776D: 0xB248, - 0x776E: 0xB249, - 0x776F: 0xB24A, - 0x7770: 0xB24B, - 0x7771: 0xB24C, - 0x7772: 0xB24D, - 0x7773: 0xB24E, - 0x7774: 0xB24F, - 0x7775: 0xB250, - 0x7776: 0xB251, - 0x7777: 0xB252, - 0x7778: 0xB253, - 0x7779: 0xB6C3, - 0x777A: 0xB254, - 0x777B: 0xB255, - 0x777C: 0xB256, - 0x777D: 0xEEA5, - 0x777E: 0xD8BA, - 0x777F: 0xEEA3, - 0x7780: 0xEEA6, - 0x7781: 0xB257, - 0x7782: 0xB258, - 0x7783: 0xB259, - 0x7784: 0xC3E9, - 0x7785: 0xB3F2, - 0x7786: 0xB25A, - 0x7787: 0xB25B, - 0x7788: 0xB25C, - 0x7789: 0xB25D, - 0x778A: 0xB25E, - 0x778B: 0xB25F, - 0x778C: 0xEEA7, - 0x778D: 0xEEA4, - 0x778E: 0xCFB9, - 0x778F: 0xB260, - 0x7790: 0xB261, - 0x7791: 0xEEA8, - 0x7792: 0xC2F7, - 0x7793: 0xB262, - 0x7794: 0xB263, - 0x7795: 0xB264, - 0x7796: 0xB265, - 0x7797: 0xB266, - 0x7798: 0xB267, - 0x7799: 0xB268, - 0x779A: 0xB269, - 0x779B: 0xB26A, - 0x779C: 0xB26B, - 0x779D: 0xB26C, - 0x779E: 0xB26D, - 0x779F: 0xEEA9, - 0x77A0: 0xEEAA, - 0x77A1: 0xB26E, - 0x77A2: 0xDEAB, - 0x77A3: 0xB26F, - 0x77A4: 0xB270, - 0x77A5: 0xC6B3, - 0x77A6: 0xB271, - 0x77A7: 0xC7C6, - 0x77A8: 0xB272, - 0x77A9: 0xD6F5, - 0x77AA: 0xB5C9, - 0x77AB: 0xB273, - 0x77AC: 0xCBB2, - 0x77AD: 0xB274, - 0x77AE: 0xB275, - 0x77AF: 0xB276, - 0x77B0: 0xEEAB, - 0x77B1: 0xB277, - 0x77B2: 0xB278, - 0x77B3: 0xCDAB, - 0x77B4: 0xB279, - 0x77B5: 0xEEAC, - 0x77B6: 0xB27A, - 0x77B7: 0xB27B, - 0x77B8: 0xB27C, - 0x77B9: 0xB27D, - 0x77BA: 0xB27E, - 0x77BB: 0xD5B0, - 0x77BC: 0xB280, - 0x77BD: 0xEEAD, - 0x77BE: 0xB281, - 0x77BF: 0xF6C4, - 0x77C0: 0xB282, - 0x77C1: 0xB283, - 0x77C2: 0xB284, - 0x77C3: 0xB285, - 0x77C4: 0xB286, - 0x77C5: 0xB287, - 0x77C6: 0xB288, - 0x77C7: 0xB289, - 0x77C8: 0xB28A, - 0x77C9: 0xB28B, - 0x77CA: 0xB28C, - 0x77CB: 0xB28D, - 0x77CC: 0xB28E, - 0x77CD: 0xDBC7, - 0x77CE: 0xB28F, - 0x77CF: 0xB290, - 0x77D0: 0xB291, - 0x77D1: 0xB292, - 0x77D2: 0xB293, - 0x77D3: 0xB294, - 0x77D4: 0xB295, - 0x77D5: 0xB296, - 0x77D6: 0xB297, - 0x77D7: 0xB4A3, - 0x77D8: 0xB298, - 0x77D9: 0xB299, - 0x77DA: 0xB29A, - 0x77DB: 0xC3AC, - 0x77DC: 0xF1E6, - 0x77DD: 0xB29B, - 0x77DE: 0xB29C, - 0x77DF: 0xB29D, - 0x77E0: 0xB29E, - 0x77E1: 0xB29F, - 0x77E2: 0xCAB8, - 0x77E3: 0xD2D3, - 0x77E4: 0xB2A0, - 0x77E5: 0xD6AA, - 0x77E6: 0xB340, - 0x77E7: 0xEFF2, - 0x77E8: 0xB341, - 0x77E9: 0xBED8, - 0x77EA: 0xB342, - 0x77EB: 0xBDC3, - 0x77EC: 0xEFF3, - 0x77ED: 0xB6CC, - 0x77EE: 0xB0AB, - 0x77EF: 0xB343, - 0x77F0: 0xB344, - 0x77F1: 0xB345, - 0x77F2: 0xB346, - 0x77F3: 0xCAAF, - 0x77F4: 0xB347, - 0x77F5: 0xB348, - 0x77F6: 0xEDB6, - 0x77F7: 0xB349, - 0x77F8: 0xEDB7, - 0x77F9: 0xB34A, - 0x77FA: 0xB34B, - 0x77FB: 0xB34C, - 0x77FC: 0xB34D, - 0x77FD: 0xCEF9, - 0x77FE: 0xB7AF, - 0x77FF: 0xBFF3, - 0x7800: 0xEDB8, - 0x7801: 0xC2EB, - 0x7802: 0xC9B0, - 0x7803: 0xB34E, - 0x7804: 0xB34F, - 0x7805: 0xB350, - 0x7806: 0xB351, - 0x7807: 0xB352, - 0x7808: 0xB353, - 0x7809: 0xEDB9, - 0x780A: 0xB354, - 0x780B: 0xB355, - 0x780C: 0xC6F6, - 0x780D: 0xBFB3, - 0x780E: 0xB356, - 0x780F: 0xB357, - 0x7810: 0xB358, - 0x7811: 0xEDBC, - 0x7812: 0xC5F8, - 0x7813: 0xB359, - 0x7814: 0xD1D0, - 0x7815: 0xB35A, - 0x7816: 0xD7A9, - 0x7817: 0xEDBA, - 0x7818: 0xEDBB, - 0x7819: 0xB35B, - 0x781A: 0xD1E2, - 0x781B: 0xB35C, - 0x781C: 0xEDBF, - 0x781D: 0xEDC0, - 0x781E: 0xB35D, - 0x781F: 0xEDC4, - 0x7820: 0xB35E, - 0x7821: 0xB35F, - 0x7822: 0xB360, - 0x7823: 0xEDC8, - 0x7824: 0xB361, - 0x7825: 0xEDC6, - 0x7826: 0xEDCE, - 0x7827: 0xD5E8, - 0x7828: 0xB362, - 0x7829: 0xEDC9, - 0x782A: 0xB363, - 0x782B: 0xB364, - 0x782C: 0xEDC7, - 0x782D: 0xEDBE, - 0x782E: 0xB365, - 0x782F: 0xB366, - 0x7830: 0xC5E9, - 0x7831: 0xB367, - 0x7832: 0xB368, - 0x7833: 0xB369, - 0x7834: 0xC6C6, - 0x7835: 0xB36A, - 0x7836: 0xB36B, - 0x7837: 0xC9E9, - 0x7838: 0xD4D2, - 0x7839: 0xEDC1, - 0x783A: 0xEDC2, - 0x783B: 0xEDC3, - 0x783C: 0xEDC5, - 0x783D: 0xB36C, - 0x783E: 0xC0F9, - 0x783F: 0xB36D, - 0x7840: 0xB4A1, - 0x7841: 0xB36E, - 0x7842: 0xB36F, - 0x7843: 0xB370, - 0x7844: 0xB371, - 0x7845: 0xB9E8, - 0x7846: 0xB372, - 0x7847: 0xEDD0, - 0x7848: 0xB373, - 0x7849: 0xB374, - 0x784A: 0xB375, - 0x784B: 0xB376, - 0x784C: 0xEDD1, - 0x784D: 0xB377, - 0x784E: 0xEDCA, - 0x784F: 0xB378, - 0x7850: 0xEDCF, - 0x7851: 0xB379, - 0x7852: 0xCEF8, - 0x7853: 0xB37A, - 0x7854: 0xB37B, - 0x7855: 0xCBB6, - 0x7856: 0xEDCC, - 0x7857: 0xEDCD, - 0x7858: 0xB37C, - 0x7859: 0xB37D, - 0x785A: 0xB37E, - 0x785B: 0xB380, - 0x785C: 0xB381, - 0x785D: 0xCFF5, - 0x785E: 0xB382, - 0x785F: 0xB383, - 0x7860: 0xB384, - 0x7861: 0xB385, - 0x7862: 0xB386, - 0x7863: 0xB387, - 0x7864: 0xB388, - 0x7865: 0xB389, - 0x7866: 0xB38A, - 0x7867: 0xB38B, - 0x7868: 0xB38C, - 0x7869: 0xB38D, - 0x786A: 0xEDD2, - 0x786B: 0xC1F2, - 0x786C: 0xD3B2, - 0x786D: 0xEDCB, - 0x786E: 0xC8B7, - 0x786F: 0xB38E, - 0x7870: 0xB38F, - 0x7871: 0xB390, - 0x7872: 0xB391, - 0x7873: 0xB392, - 0x7874: 0xB393, - 0x7875: 0xB394, - 0x7876: 0xB395, - 0x7877: 0xBCEF, - 0x7878: 0xB396, - 0x7879: 0xB397, - 0x787A: 0xB398, - 0x787B: 0xB399, - 0x787C: 0xC5F0, - 0x787D: 0xB39A, - 0x787E: 0xB39B, - 0x787F: 0xB39C, - 0x7880: 0xB39D, - 0x7881: 0xB39E, - 0x7882: 0xB39F, - 0x7883: 0xB3A0, - 0x7884: 0xB440, - 0x7885: 0xB441, - 0x7886: 0xB442, - 0x7887: 0xEDD6, - 0x7888: 0xB443, - 0x7889: 0xB5EF, - 0x788A: 0xB444, - 0x788B: 0xB445, - 0x788C: 0xC2B5, - 0x788D: 0xB0AD, - 0x788E: 0xCBE9, - 0x788F: 0xB446, - 0x7890: 0xB447, - 0x7891: 0xB1AE, - 0x7892: 0xB448, - 0x7893: 0xEDD4, - 0x7894: 0xB449, - 0x7895: 0xB44A, - 0x7896: 0xB44B, - 0x7897: 0xCDEB, - 0x7898: 0xB5E2, - 0x7899: 0xB44C, - 0x789A: 0xEDD5, - 0x789B: 0xEDD3, - 0x789C: 0xEDD7, - 0x789D: 0xB44D, - 0x789E: 0xB44E, - 0x789F: 0xB5FA, - 0x78A0: 0xB44F, - 0x78A1: 0xEDD8, - 0x78A2: 0xB450, - 0x78A3: 0xEDD9, - 0x78A4: 0xB451, - 0x78A5: 0xEDDC, - 0x78A6: 0xB452, - 0x78A7: 0xB1CC, - 0x78A8: 0xB453, - 0x78A9: 0xB454, - 0x78AA: 0xB455, - 0x78AB: 0xB456, - 0x78AC: 0xB457, - 0x78AD: 0xB458, - 0x78AE: 0xB459, - 0x78AF: 0xB45A, - 0x78B0: 0xC5F6, - 0x78B1: 0xBCEE, - 0x78B2: 0xEDDA, - 0x78B3: 0xCCBC, - 0x78B4: 0xB2EA, - 0x78B5: 0xB45B, - 0x78B6: 0xB45C, - 0x78B7: 0xB45D, - 0x78B8: 0xB45E, - 0x78B9: 0xEDDB, - 0x78BA: 0xB45F, - 0x78BB: 0xB460, - 0x78BC: 0xB461, - 0x78BD: 0xB462, - 0x78BE: 0xC4EB, - 0x78BF: 0xB463, - 0x78C0: 0xB464, - 0x78C1: 0xB4C5, - 0x78C2: 0xB465, - 0x78C3: 0xB466, - 0x78C4: 0xB467, - 0x78C5: 0xB0F5, - 0x78C6: 0xB468, - 0x78C7: 0xB469, - 0x78C8: 0xB46A, - 0x78C9: 0xEDDF, - 0x78CA: 0xC0DA, - 0x78CB: 0xB4E8, - 0x78CC: 0xB46B, - 0x78CD: 0xB46C, - 0x78CE: 0xB46D, - 0x78CF: 0xB46E, - 0x78D0: 0xC5CD, - 0x78D1: 0xB46F, - 0x78D2: 0xB470, - 0x78D3: 0xB471, - 0x78D4: 0xEDDD, - 0x78D5: 0xBFC4, - 0x78D6: 0xB472, - 0x78D7: 0xB473, - 0x78D8: 0xB474, - 0x78D9: 0xEDDE, - 0x78DA: 0xB475, - 0x78DB: 0xB476, - 0x78DC: 0xB477, - 0x78DD: 0xB478, - 0x78DE: 0xB479, - 0x78DF: 0xB47A, - 0x78E0: 0xB47B, - 0x78E1: 0xB47C, - 0x78E2: 0xB47D, - 0x78E3: 0xB47E, - 0x78E4: 0xB480, - 0x78E5: 0xB481, - 0x78E6: 0xB482, - 0x78E7: 0xB483, - 0x78E8: 0xC4A5, - 0x78E9: 0xB484, - 0x78EA: 0xB485, - 0x78EB: 0xB486, - 0x78EC: 0xEDE0, - 0x78ED: 0xB487, - 0x78EE: 0xB488, - 0x78EF: 0xB489, - 0x78F0: 0xB48A, - 0x78F1: 0xB48B, - 0x78F2: 0xEDE1, - 0x78F3: 0xB48C, - 0x78F4: 0xEDE3, - 0x78F5: 0xB48D, - 0x78F6: 0xB48E, - 0x78F7: 0xC1D7, - 0x78F8: 0xB48F, - 0x78F9: 0xB490, - 0x78FA: 0xBBC7, - 0x78FB: 0xB491, - 0x78FC: 0xB492, - 0x78FD: 0xB493, - 0x78FE: 0xB494, - 0x78FF: 0xB495, - 0x7900: 0xB496, - 0x7901: 0xBDB8, - 0x7902: 0xB497, - 0x7903: 0xB498, - 0x7904: 0xB499, - 0x7905: 0xEDE2, - 0x7906: 0xB49A, - 0x7907: 0xB49B, - 0x7908: 0xB49C, - 0x7909: 0xB49D, - 0x790A: 0xB49E, - 0x790B: 0xB49F, - 0x790C: 0xB4A0, - 0x790D: 0xB540, - 0x790E: 0xB541, - 0x790F: 0xB542, - 0x7910: 0xB543, - 0x7911: 0xB544, - 0x7912: 0xB545, - 0x7913: 0xEDE4, - 0x7914: 0xB546, - 0x7915: 0xB547, - 0x7916: 0xB548, - 0x7917: 0xB549, - 0x7918: 0xB54A, - 0x7919: 0xB54B, - 0x791A: 0xB54C, - 0x791B: 0xB54D, - 0x791C: 0xB54E, - 0x791D: 0xB54F, - 0x791E: 0xEDE6, - 0x791F: 0xB550, - 0x7920: 0xB551, - 0x7921: 0xB552, - 0x7922: 0xB553, - 0x7923: 0xB554, - 0x7924: 0xEDE5, - 0x7925: 0xB555, - 0x7926: 0xB556, - 0x7927: 0xB557, - 0x7928: 0xB558, - 0x7929: 0xB559, - 0x792A: 0xB55A, - 0x792B: 0xB55B, - 0x792C: 0xB55C, - 0x792D: 0xB55D, - 0x792E: 0xB55E, - 0x792F: 0xB55F, - 0x7930: 0xB560, - 0x7931: 0xB561, - 0x7932: 0xB562, - 0x7933: 0xB563, - 0x7934: 0xEDE7, - 0x7935: 0xB564, - 0x7936: 0xB565, - 0x7937: 0xB566, - 0x7938: 0xB567, - 0x7939: 0xB568, - 0x793A: 0xCABE, - 0x793B: 0xECEA, - 0x793C: 0xC0F1, - 0x793D: 0xB569, - 0x793E: 0xC9E7, - 0x793F: 0xB56A, - 0x7940: 0xECEB, - 0x7941: 0xC6EE, - 0x7942: 0xB56B, - 0x7943: 0xB56C, - 0x7944: 0xB56D, - 0x7945: 0xB56E, - 0x7946: 0xECEC, - 0x7947: 0xB56F, - 0x7948: 0xC6ED, - 0x7949: 0xECED, - 0x794A: 0xB570, - 0x794B: 0xB571, - 0x794C: 0xB572, - 0x794D: 0xB573, - 0x794E: 0xB574, - 0x794F: 0xB575, - 0x7950: 0xB576, - 0x7951: 0xB577, - 0x7952: 0xB578, - 0x7953: 0xECF0, - 0x7954: 0xB579, - 0x7955: 0xB57A, - 0x7956: 0xD7E6, - 0x7957: 0xECF3, - 0x7958: 0xB57B, - 0x7959: 0xB57C, - 0x795A: 0xECF1, - 0x795B: 0xECEE, - 0x795C: 0xECEF, - 0x795D: 0xD7A3, - 0x795E: 0xC9F1, - 0x795F: 0xCBEE, - 0x7960: 0xECF4, - 0x7961: 0xB57D, - 0x7962: 0xECF2, - 0x7963: 0xB57E, - 0x7964: 0xB580, - 0x7965: 0xCFE9, - 0x7966: 0xB581, - 0x7967: 0xECF6, - 0x7968: 0xC6B1, - 0x7969: 0xB582, - 0x796A: 0xB583, - 0x796B: 0xB584, - 0x796C: 0xB585, - 0x796D: 0xBCC0, - 0x796E: 0xB586, - 0x796F: 0xECF5, - 0x7970: 0xB587, - 0x7971: 0xB588, - 0x7972: 0xB589, - 0x7973: 0xB58A, - 0x7974: 0xB58B, - 0x7975: 0xB58C, - 0x7976: 0xB58D, - 0x7977: 0xB5BB, - 0x7978: 0xBBF6, - 0x7979: 0xB58E, - 0x797A: 0xECF7, - 0x797B: 0xB58F, - 0x797C: 0xB590, - 0x797D: 0xB591, - 0x797E: 0xB592, - 0x797F: 0xB593, - 0x7980: 0xD9F7, - 0x7981: 0xBDFB, - 0x7982: 0xB594, - 0x7983: 0xB595, - 0x7984: 0xC2BB, - 0x7985: 0xECF8, - 0x7986: 0xB596, - 0x7987: 0xB597, - 0x7988: 0xB598, - 0x7989: 0xB599, - 0x798A: 0xECF9, - 0x798B: 0xB59A, - 0x798C: 0xB59B, - 0x798D: 0xB59C, - 0x798E: 0xB59D, - 0x798F: 0xB8A3, - 0x7990: 0xB59E, - 0x7991: 0xB59F, - 0x7992: 0xB5A0, - 0x7993: 0xB640, - 0x7994: 0xB641, - 0x7995: 0xB642, - 0x7996: 0xB643, - 0x7997: 0xB644, - 0x7998: 0xB645, - 0x7999: 0xB646, - 0x799A: 0xECFA, - 0x799B: 0xB647, - 0x799C: 0xB648, - 0x799D: 0xB649, - 0x799E: 0xB64A, - 0x799F: 0xB64B, - 0x79A0: 0xB64C, - 0x79A1: 0xB64D, - 0x79A2: 0xB64E, - 0x79A3: 0xB64F, - 0x79A4: 0xB650, - 0x79A5: 0xB651, - 0x79A6: 0xB652, - 0x79A7: 0xECFB, - 0x79A8: 0xB653, - 0x79A9: 0xB654, - 0x79AA: 0xB655, - 0x79AB: 0xB656, - 0x79AC: 0xB657, - 0x79AD: 0xB658, - 0x79AE: 0xB659, - 0x79AF: 0xB65A, - 0x79B0: 0xB65B, - 0x79B1: 0xB65C, - 0x79B2: 0xB65D, - 0x79B3: 0xECFC, - 0x79B4: 0xB65E, - 0x79B5: 0xB65F, - 0x79B6: 0xB660, - 0x79B7: 0xB661, - 0x79B8: 0xB662, - 0x79B9: 0xD3ED, - 0x79BA: 0xD8AE, - 0x79BB: 0xC0EB, - 0x79BC: 0xB663, - 0x79BD: 0xC7DD, - 0x79BE: 0xBACC, - 0x79BF: 0xB664, - 0x79C0: 0xD0E3, - 0x79C1: 0xCBBD, - 0x79C2: 0xB665, - 0x79C3: 0xCDBA, - 0x79C4: 0xB666, - 0x79C5: 0xB667, - 0x79C6: 0xB8D1, - 0x79C7: 0xB668, - 0x79C8: 0xB669, - 0x79C9: 0xB1FC, - 0x79CA: 0xB66A, - 0x79CB: 0xC7EF, - 0x79CC: 0xB66B, - 0x79CD: 0xD6D6, - 0x79CE: 0xB66C, - 0x79CF: 0xB66D, - 0x79D0: 0xB66E, - 0x79D1: 0xBFC6, - 0x79D2: 0xC3EB, - 0x79D3: 0xB66F, - 0x79D4: 0xB670, - 0x79D5: 0xEFF5, - 0x79D6: 0xB671, - 0x79D7: 0xB672, - 0x79D8: 0xC3D8, - 0x79D9: 0xB673, - 0x79DA: 0xB674, - 0x79DB: 0xB675, - 0x79DC: 0xB676, - 0x79DD: 0xB677, - 0x79DE: 0xB678, - 0x79DF: 0xD7E2, - 0x79E0: 0xB679, - 0x79E1: 0xB67A, - 0x79E2: 0xB67B, - 0x79E3: 0xEFF7, - 0x79E4: 0xB3D3, - 0x79E5: 0xB67C, - 0x79E6: 0xC7D8, - 0x79E7: 0xD1ED, - 0x79E8: 0xB67D, - 0x79E9: 0xD6C8, - 0x79EA: 0xB67E, - 0x79EB: 0xEFF8, - 0x79EC: 0xB680, - 0x79ED: 0xEFF6, - 0x79EE: 0xB681, - 0x79EF: 0xBBFD, - 0x79F0: 0xB3C6, - 0x79F1: 0xB682, - 0x79F2: 0xB683, - 0x79F3: 0xB684, - 0x79F4: 0xB685, - 0x79F5: 0xB686, - 0x79F6: 0xB687, - 0x79F7: 0xB688, - 0x79F8: 0xBDD5, - 0x79F9: 0xB689, - 0x79FA: 0xB68A, - 0x79FB: 0xD2C6, - 0x79FC: 0xB68B, - 0x79FD: 0xBBE0, - 0x79FE: 0xB68C, - 0x79FF: 0xB68D, - 0x7A00: 0xCFA1, - 0x7A01: 0xB68E, - 0x7A02: 0xEFFC, - 0x7A03: 0xEFFB, - 0x7A04: 0xB68F, - 0x7A05: 0xB690, - 0x7A06: 0xEFF9, - 0x7A07: 0xB691, - 0x7A08: 0xB692, - 0x7A09: 0xB693, - 0x7A0A: 0xB694, - 0x7A0B: 0xB3CC, - 0x7A0C: 0xB695, - 0x7A0D: 0xC9D4, - 0x7A0E: 0xCBB0, - 0x7A0F: 0xB696, - 0x7A10: 0xB697, - 0x7A11: 0xB698, - 0x7A12: 0xB699, - 0x7A13: 0xB69A, - 0x7A14: 0xEFFE, - 0x7A15: 0xB69B, - 0x7A16: 0xB69C, - 0x7A17: 0xB0DE, - 0x7A18: 0xB69D, - 0x7A19: 0xB69E, - 0x7A1A: 0xD6C9, - 0x7A1B: 0xB69F, - 0x7A1C: 0xB6A0, - 0x7A1D: 0xB740, - 0x7A1E: 0xEFFD, - 0x7A1F: 0xB741, - 0x7A20: 0xB3ED, - 0x7A21: 0xB742, - 0x7A22: 0xB743, - 0x7A23: 0xF6D5, - 0x7A24: 0xB744, - 0x7A25: 0xB745, - 0x7A26: 0xB746, - 0x7A27: 0xB747, - 0x7A28: 0xB748, - 0x7A29: 0xB749, - 0x7A2A: 0xB74A, - 0x7A2B: 0xB74B, - 0x7A2C: 0xB74C, - 0x7A2D: 0xB74D, - 0x7A2E: 0xB74E, - 0x7A2F: 0xB74F, - 0x7A30: 0xB750, - 0x7A31: 0xB751, - 0x7A32: 0xB752, - 0x7A33: 0xCEC8, - 0x7A34: 0xB753, - 0x7A35: 0xB754, - 0x7A36: 0xB755, - 0x7A37: 0xF0A2, - 0x7A38: 0xB756, - 0x7A39: 0xF0A1, - 0x7A3A: 0xB757, - 0x7A3B: 0xB5BE, - 0x7A3C: 0xBCDA, - 0x7A3D: 0xBBFC, - 0x7A3E: 0xB758, - 0x7A3F: 0xB8E5, - 0x7A40: 0xB759, - 0x7A41: 0xB75A, - 0x7A42: 0xB75B, - 0x7A43: 0xB75C, - 0x7A44: 0xB75D, - 0x7A45: 0xB75E, - 0x7A46: 0xC4C2, - 0x7A47: 0xB75F, - 0x7A48: 0xB760, - 0x7A49: 0xB761, - 0x7A4A: 0xB762, - 0x7A4B: 0xB763, - 0x7A4C: 0xB764, - 0x7A4D: 0xB765, - 0x7A4E: 0xB766, - 0x7A4F: 0xB767, - 0x7A50: 0xB768, - 0x7A51: 0xF0A3, - 0x7A52: 0xB769, - 0x7A53: 0xB76A, - 0x7A54: 0xB76B, - 0x7A55: 0xB76C, - 0x7A56: 0xB76D, - 0x7A57: 0xCBEB, - 0x7A58: 0xB76E, - 0x7A59: 0xB76F, - 0x7A5A: 0xB770, - 0x7A5B: 0xB771, - 0x7A5C: 0xB772, - 0x7A5D: 0xB773, - 0x7A5E: 0xB774, - 0x7A5F: 0xB775, - 0x7A60: 0xB776, - 0x7A61: 0xB777, - 0x7A62: 0xB778, - 0x7A63: 0xB779, - 0x7A64: 0xB77A, - 0x7A65: 0xB77B, - 0x7A66: 0xB77C, - 0x7A67: 0xB77D, - 0x7A68: 0xB77E, - 0x7A69: 0xB780, - 0x7A6A: 0xB781, - 0x7A6B: 0xB782, - 0x7A6C: 0xB783, - 0x7A6D: 0xB784, - 0x7A6E: 0xB785, - 0x7A6F: 0xB786, - 0x7A70: 0xF0A6, - 0x7A71: 0xB787, - 0x7A72: 0xB788, - 0x7A73: 0xB789, - 0x7A74: 0xD1A8, - 0x7A75: 0xB78A, - 0x7A76: 0xBEBF, - 0x7A77: 0xC7EE, - 0x7A78: 0xF1B6, - 0x7A79: 0xF1B7, - 0x7A7A: 0xBFD5, - 0x7A7B: 0xB78B, - 0x7A7C: 0xB78C, - 0x7A7D: 0xB78D, - 0x7A7E: 0xB78E, - 0x7A7F: 0xB4A9, - 0x7A80: 0xF1B8, - 0x7A81: 0xCDBB, - 0x7A82: 0xB78F, - 0x7A83: 0xC7D4, - 0x7A84: 0xD5AD, - 0x7A85: 0xB790, - 0x7A86: 0xF1B9, - 0x7A87: 0xB791, - 0x7A88: 0xF1BA, - 0x7A89: 0xB792, - 0x7A8A: 0xB793, - 0x7A8B: 0xB794, - 0x7A8C: 0xB795, - 0x7A8D: 0xC7CF, - 0x7A8E: 0xB796, - 0x7A8F: 0xB797, - 0x7A90: 0xB798, - 0x7A91: 0xD2A4, - 0x7A92: 0xD6CF, - 0x7A93: 0xB799, - 0x7A94: 0xB79A, - 0x7A95: 0xF1BB, - 0x7A96: 0xBDD1, - 0x7A97: 0xB4B0, - 0x7A98: 0xBEBD, - 0x7A99: 0xB79B, - 0x7A9A: 0xB79C, - 0x7A9B: 0xB79D, - 0x7A9C: 0xB4DC, - 0x7A9D: 0xCED1, - 0x7A9E: 0xB79E, - 0x7A9F: 0xBFDF, - 0x7AA0: 0xF1BD, - 0x7AA1: 0xB79F, - 0x7AA2: 0xB7A0, - 0x7AA3: 0xB840, - 0x7AA4: 0xB841, - 0x7AA5: 0xBFFA, - 0x7AA6: 0xF1BC, - 0x7AA7: 0xB842, - 0x7AA8: 0xF1BF, - 0x7AA9: 0xB843, - 0x7AAA: 0xB844, - 0x7AAB: 0xB845, - 0x7AAC: 0xF1BE, - 0x7AAD: 0xF1C0, - 0x7AAE: 0xB846, - 0x7AAF: 0xB847, - 0x7AB0: 0xB848, - 0x7AB1: 0xB849, - 0x7AB2: 0xB84A, - 0x7AB3: 0xF1C1, - 0x7AB4: 0xB84B, - 0x7AB5: 0xB84C, - 0x7AB6: 0xB84D, - 0x7AB7: 0xB84E, - 0x7AB8: 0xB84F, - 0x7AB9: 0xB850, - 0x7ABA: 0xB851, - 0x7ABB: 0xB852, - 0x7ABC: 0xB853, - 0x7ABD: 0xB854, - 0x7ABE: 0xB855, - 0x7ABF: 0xC1FE, - 0x7AC0: 0xB856, - 0x7AC1: 0xB857, - 0x7AC2: 0xB858, - 0x7AC3: 0xB859, - 0x7AC4: 0xB85A, - 0x7AC5: 0xB85B, - 0x7AC6: 0xB85C, - 0x7AC7: 0xB85D, - 0x7AC8: 0xB85E, - 0x7AC9: 0xB85F, - 0x7ACA: 0xB860, - 0x7ACB: 0xC1A2, - 0x7ACC: 0xB861, - 0x7ACD: 0xB862, - 0x7ACE: 0xB863, - 0x7ACF: 0xB864, - 0x7AD0: 0xB865, - 0x7AD1: 0xB866, - 0x7AD2: 0xB867, - 0x7AD3: 0xB868, - 0x7AD4: 0xB869, - 0x7AD5: 0xB86A, - 0x7AD6: 0xCAFA, - 0x7AD7: 0xB86B, - 0x7AD8: 0xB86C, - 0x7AD9: 0xD5BE, - 0x7ADA: 0xB86D, - 0x7ADB: 0xB86E, - 0x7ADC: 0xB86F, - 0x7ADD: 0xB870, - 0x7ADE: 0xBEBA, - 0x7ADF: 0xBEB9, - 0x7AE0: 0xD5C2, - 0x7AE1: 0xB871, - 0x7AE2: 0xB872, - 0x7AE3: 0xBFA2, - 0x7AE4: 0xB873, - 0x7AE5: 0xCDAF, - 0x7AE6: 0xF1B5, - 0x7AE7: 0xB874, - 0x7AE8: 0xB875, - 0x7AE9: 0xB876, - 0x7AEA: 0xB877, - 0x7AEB: 0xB878, - 0x7AEC: 0xB879, - 0x7AED: 0xBDDF, - 0x7AEE: 0xB87A, - 0x7AEF: 0xB6CB, - 0x7AF0: 0xB87B, - 0x7AF1: 0xB87C, - 0x7AF2: 0xB87D, - 0x7AF3: 0xB87E, - 0x7AF4: 0xB880, - 0x7AF5: 0xB881, - 0x7AF6: 0xB882, - 0x7AF7: 0xB883, - 0x7AF8: 0xB884, - 0x7AF9: 0xD6F1, - 0x7AFA: 0xF3C3, - 0x7AFB: 0xB885, - 0x7AFC: 0xB886, - 0x7AFD: 0xF3C4, - 0x7AFE: 0xB887, - 0x7AFF: 0xB8CD, - 0x7B00: 0xB888, - 0x7B01: 0xB889, - 0x7B02: 0xB88A, - 0x7B03: 0xF3C6, - 0x7B04: 0xF3C7, - 0x7B05: 0xB88B, - 0x7B06: 0xB0CA, - 0x7B07: 0xB88C, - 0x7B08: 0xF3C5, - 0x7B09: 0xB88D, - 0x7B0A: 0xF3C9, - 0x7B0B: 0xCBF1, - 0x7B0C: 0xB88E, - 0x7B0D: 0xB88F, - 0x7B0E: 0xB890, - 0x7B0F: 0xF3CB, - 0x7B10: 0xB891, - 0x7B11: 0xD0A6, - 0x7B12: 0xB892, - 0x7B13: 0xB893, - 0x7B14: 0xB1CA, - 0x7B15: 0xF3C8, - 0x7B16: 0xB894, - 0x7B17: 0xB895, - 0x7B18: 0xB896, - 0x7B19: 0xF3CF, - 0x7B1A: 0xB897, - 0x7B1B: 0xB5D1, - 0x7B1C: 0xB898, - 0x7B1D: 0xB899, - 0x7B1E: 0xF3D7, - 0x7B1F: 0xB89A, - 0x7B20: 0xF3D2, - 0x7B21: 0xB89B, - 0x7B22: 0xB89C, - 0x7B23: 0xB89D, - 0x7B24: 0xF3D4, - 0x7B25: 0xF3D3, - 0x7B26: 0xB7FB, - 0x7B27: 0xB89E, - 0x7B28: 0xB1BF, - 0x7B29: 0xB89F, - 0x7B2A: 0xF3CE, - 0x7B2B: 0xF3CA, - 0x7B2C: 0xB5DA, - 0x7B2D: 0xB8A0, - 0x7B2E: 0xF3D0, - 0x7B2F: 0xB940, - 0x7B30: 0xB941, - 0x7B31: 0xF3D1, - 0x7B32: 0xB942, - 0x7B33: 0xF3D5, - 0x7B34: 0xB943, - 0x7B35: 0xB944, - 0x7B36: 0xB945, - 0x7B37: 0xB946, - 0x7B38: 0xF3CD, - 0x7B39: 0xB947, - 0x7B3A: 0xBCE3, - 0x7B3B: 0xB948, - 0x7B3C: 0xC1FD, - 0x7B3D: 0xB949, - 0x7B3E: 0xF3D6, - 0x7B3F: 0xB94A, - 0x7B40: 0xB94B, - 0x7B41: 0xB94C, - 0x7B42: 0xB94D, - 0x7B43: 0xB94E, - 0x7B44: 0xB94F, - 0x7B45: 0xF3DA, - 0x7B46: 0xB950, - 0x7B47: 0xF3CC, - 0x7B48: 0xB951, - 0x7B49: 0xB5C8, - 0x7B4A: 0xB952, - 0x7B4B: 0xBDEE, - 0x7B4C: 0xF3DC, - 0x7B4D: 0xB953, - 0x7B4E: 0xB954, - 0x7B4F: 0xB7A4, - 0x7B50: 0xBFF0, - 0x7B51: 0xD6FE, - 0x7B52: 0xCDB2, - 0x7B53: 0xB955, - 0x7B54: 0xB4F0, - 0x7B55: 0xB956, - 0x7B56: 0xB2DF, - 0x7B57: 0xB957, - 0x7B58: 0xF3D8, - 0x7B59: 0xB958, - 0x7B5A: 0xF3D9, - 0x7B5B: 0xC9B8, - 0x7B5C: 0xB959, - 0x7B5D: 0xF3DD, - 0x7B5E: 0xB95A, - 0x7B5F: 0xB95B, - 0x7B60: 0xF3DE, - 0x7B61: 0xB95C, - 0x7B62: 0xF3E1, - 0x7B63: 0xB95D, - 0x7B64: 0xB95E, - 0x7B65: 0xB95F, - 0x7B66: 0xB960, - 0x7B67: 0xB961, - 0x7B68: 0xB962, - 0x7B69: 0xB963, - 0x7B6A: 0xB964, - 0x7B6B: 0xB965, - 0x7B6C: 0xB966, - 0x7B6D: 0xB967, - 0x7B6E: 0xF3DF, - 0x7B6F: 0xB968, - 0x7B70: 0xB969, - 0x7B71: 0xF3E3, - 0x7B72: 0xF3E2, - 0x7B73: 0xB96A, - 0x7B74: 0xB96B, - 0x7B75: 0xF3DB, - 0x7B76: 0xB96C, - 0x7B77: 0xBFEA, - 0x7B78: 0xB96D, - 0x7B79: 0xB3EF, - 0x7B7A: 0xB96E, - 0x7B7B: 0xF3E0, - 0x7B7C: 0xB96F, - 0x7B7D: 0xB970, - 0x7B7E: 0xC7A9, - 0x7B7F: 0xB971, - 0x7B80: 0xBCF2, - 0x7B81: 0xB972, - 0x7B82: 0xB973, - 0x7B83: 0xB974, - 0x7B84: 0xB975, - 0x7B85: 0xF3EB, - 0x7B86: 0xB976, - 0x7B87: 0xB977, - 0x7B88: 0xB978, - 0x7B89: 0xB979, - 0x7B8A: 0xB97A, - 0x7B8B: 0xB97B, - 0x7B8C: 0xB97C, - 0x7B8D: 0xB9BF, - 0x7B8E: 0xB97D, - 0x7B8F: 0xB97E, - 0x7B90: 0xF3E4, - 0x7B91: 0xB980, - 0x7B92: 0xB981, - 0x7B93: 0xB982, - 0x7B94: 0xB2AD, - 0x7B95: 0xBBFE, - 0x7B96: 0xB983, - 0x7B97: 0xCBE3, - 0x7B98: 0xB984, - 0x7B99: 0xB985, - 0x7B9A: 0xB986, - 0x7B9B: 0xB987, - 0x7B9C: 0xF3ED, - 0x7B9D: 0xF3E9, - 0x7B9E: 0xB988, - 0x7B9F: 0xB989, - 0x7BA0: 0xB98A, - 0x7BA1: 0xB9DC, - 0x7BA2: 0xF3EE, - 0x7BA3: 0xB98B, - 0x7BA4: 0xB98C, - 0x7BA5: 0xB98D, - 0x7BA6: 0xF3E5, - 0x7BA7: 0xF3E6, - 0x7BA8: 0xF3EA, - 0x7BA9: 0xC2E1, - 0x7BAA: 0xF3EC, - 0x7BAB: 0xF3EF, - 0x7BAC: 0xF3E8, - 0x7BAD: 0xBCFD, - 0x7BAE: 0xB98E, - 0x7BAF: 0xB98F, - 0x7BB0: 0xB990, - 0x7BB1: 0xCFE4, - 0x7BB2: 0xB991, - 0x7BB3: 0xB992, - 0x7BB4: 0xF3F0, - 0x7BB5: 0xB993, - 0x7BB6: 0xB994, - 0x7BB7: 0xB995, - 0x7BB8: 0xF3E7, - 0x7BB9: 0xB996, - 0x7BBA: 0xB997, - 0x7BBB: 0xB998, - 0x7BBC: 0xB999, - 0x7BBD: 0xB99A, - 0x7BBE: 0xB99B, - 0x7BBF: 0xB99C, - 0x7BC0: 0xB99D, - 0x7BC1: 0xF3F2, - 0x7BC2: 0xB99E, - 0x7BC3: 0xB99F, - 0x7BC4: 0xB9A0, - 0x7BC5: 0xBA40, - 0x7BC6: 0xD7AD, - 0x7BC7: 0xC6AA, - 0x7BC8: 0xBA41, - 0x7BC9: 0xBA42, - 0x7BCA: 0xBA43, - 0x7BCB: 0xBA44, - 0x7BCC: 0xF3F3, - 0x7BCD: 0xBA45, - 0x7BCE: 0xBA46, - 0x7BCF: 0xBA47, - 0x7BD0: 0xBA48, - 0x7BD1: 0xF3F1, - 0x7BD2: 0xBA49, - 0x7BD3: 0xC2A8, - 0x7BD4: 0xBA4A, - 0x7BD5: 0xBA4B, - 0x7BD6: 0xBA4C, - 0x7BD7: 0xBA4D, - 0x7BD8: 0xBA4E, - 0x7BD9: 0xB8DD, - 0x7BDA: 0xF3F5, - 0x7BDB: 0xBA4F, - 0x7BDC: 0xBA50, - 0x7BDD: 0xF3F4, - 0x7BDE: 0xBA51, - 0x7BDF: 0xBA52, - 0x7BE0: 0xBA53, - 0x7BE1: 0xB4DB, - 0x7BE2: 0xBA54, - 0x7BE3: 0xBA55, - 0x7BE4: 0xBA56, - 0x7BE5: 0xF3F6, - 0x7BE6: 0xF3F7, - 0x7BE7: 0xBA57, - 0x7BE8: 0xBA58, - 0x7BE9: 0xBA59, - 0x7BEA: 0xF3F8, - 0x7BEB: 0xBA5A, - 0x7BEC: 0xBA5B, - 0x7BED: 0xBA5C, - 0x7BEE: 0xC0BA, - 0x7BEF: 0xBA5D, - 0x7BF0: 0xBA5E, - 0x7BF1: 0xC0E9, - 0x7BF2: 0xBA5F, - 0x7BF3: 0xBA60, - 0x7BF4: 0xBA61, - 0x7BF5: 0xBA62, - 0x7BF6: 0xBA63, - 0x7BF7: 0xC5F1, - 0x7BF8: 0xBA64, - 0x7BF9: 0xBA65, - 0x7BFA: 0xBA66, - 0x7BFB: 0xBA67, - 0x7BFC: 0xF3FB, - 0x7BFD: 0xBA68, - 0x7BFE: 0xF3FA, - 0x7BFF: 0xBA69, - 0x7C00: 0xBA6A, - 0x7C01: 0xBA6B, - 0x7C02: 0xBA6C, - 0x7C03: 0xBA6D, - 0x7C04: 0xBA6E, - 0x7C05: 0xBA6F, - 0x7C06: 0xBA70, - 0x7C07: 0xB4D8, - 0x7C08: 0xBA71, - 0x7C09: 0xBA72, - 0x7C0A: 0xBA73, - 0x7C0B: 0xF3FE, - 0x7C0C: 0xF3F9, - 0x7C0D: 0xBA74, - 0x7C0E: 0xBA75, - 0x7C0F: 0xF3FC, - 0x7C10: 0xBA76, - 0x7C11: 0xBA77, - 0x7C12: 0xBA78, - 0x7C13: 0xBA79, - 0x7C14: 0xBA7A, - 0x7C15: 0xBA7B, - 0x7C16: 0xF3FD, - 0x7C17: 0xBA7C, - 0x7C18: 0xBA7D, - 0x7C19: 0xBA7E, - 0x7C1A: 0xBA80, - 0x7C1B: 0xBA81, - 0x7C1C: 0xBA82, - 0x7C1D: 0xBA83, - 0x7C1E: 0xBA84, - 0x7C1F: 0xF4A1, - 0x7C20: 0xBA85, - 0x7C21: 0xBA86, - 0x7C22: 0xBA87, - 0x7C23: 0xBA88, - 0x7C24: 0xBA89, - 0x7C25: 0xBA8A, - 0x7C26: 0xF4A3, - 0x7C27: 0xBBC9, - 0x7C28: 0xBA8B, - 0x7C29: 0xBA8C, - 0x7C2A: 0xF4A2, - 0x7C2B: 0xBA8D, - 0x7C2C: 0xBA8E, - 0x7C2D: 0xBA8F, - 0x7C2E: 0xBA90, - 0x7C2F: 0xBA91, - 0x7C30: 0xBA92, - 0x7C31: 0xBA93, - 0x7C32: 0xBA94, - 0x7C33: 0xBA95, - 0x7C34: 0xBA96, - 0x7C35: 0xBA97, - 0x7C36: 0xBA98, - 0x7C37: 0xBA99, - 0x7C38: 0xF4A4, - 0x7C39: 0xBA9A, - 0x7C3A: 0xBA9B, - 0x7C3B: 0xBA9C, - 0x7C3C: 0xBA9D, - 0x7C3D: 0xBA9E, - 0x7C3E: 0xBA9F, - 0x7C3F: 0xB2BE, - 0x7C40: 0xF4A6, - 0x7C41: 0xF4A5, - 0x7C42: 0xBAA0, - 0x7C43: 0xBB40, - 0x7C44: 0xBB41, - 0x7C45: 0xBB42, - 0x7C46: 0xBB43, - 0x7C47: 0xBB44, - 0x7C48: 0xBB45, - 0x7C49: 0xBB46, - 0x7C4A: 0xBB47, - 0x7C4B: 0xBB48, - 0x7C4C: 0xBB49, - 0x7C4D: 0xBCAE, - 0x7C4E: 0xBB4A, - 0x7C4F: 0xBB4B, - 0x7C50: 0xBB4C, - 0x7C51: 0xBB4D, - 0x7C52: 0xBB4E, - 0x7C53: 0xBB4F, - 0x7C54: 0xBB50, - 0x7C55: 0xBB51, - 0x7C56: 0xBB52, - 0x7C57: 0xBB53, - 0x7C58: 0xBB54, - 0x7C59: 0xBB55, - 0x7C5A: 0xBB56, - 0x7C5B: 0xBB57, - 0x7C5C: 0xBB58, - 0x7C5D: 0xBB59, - 0x7C5E: 0xBB5A, - 0x7C5F: 0xBB5B, - 0x7C60: 0xBB5C, - 0x7C61: 0xBB5D, - 0x7C62: 0xBB5E, - 0x7C63: 0xBB5F, - 0x7C64: 0xBB60, - 0x7C65: 0xBB61, - 0x7C66: 0xBB62, - 0x7C67: 0xBB63, - 0x7C68: 0xBB64, - 0x7C69: 0xBB65, - 0x7C6A: 0xBB66, - 0x7C6B: 0xBB67, - 0x7C6C: 0xBB68, - 0x7C6D: 0xBB69, - 0x7C6E: 0xBB6A, - 0x7C6F: 0xBB6B, - 0x7C70: 0xBB6C, - 0x7C71: 0xBB6D, - 0x7C72: 0xBB6E, - 0x7C73: 0xC3D7, - 0x7C74: 0xD9E1, - 0x7C75: 0xBB6F, - 0x7C76: 0xBB70, - 0x7C77: 0xBB71, - 0x7C78: 0xBB72, - 0x7C79: 0xBB73, - 0x7C7A: 0xBB74, - 0x7C7B: 0xC0E0, - 0x7C7C: 0xF4CC, - 0x7C7D: 0xD7D1, - 0x7C7E: 0xBB75, - 0x7C7F: 0xBB76, - 0x7C80: 0xBB77, - 0x7C81: 0xBB78, - 0x7C82: 0xBB79, - 0x7C83: 0xBB7A, - 0x7C84: 0xBB7B, - 0x7C85: 0xBB7C, - 0x7C86: 0xBB7D, - 0x7C87: 0xBB7E, - 0x7C88: 0xBB80, - 0x7C89: 0xB7DB, - 0x7C8A: 0xBB81, - 0x7C8B: 0xBB82, - 0x7C8C: 0xBB83, - 0x7C8D: 0xBB84, - 0x7C8E: 0xBB85, - 0x7C8F: 0xBB86, - 0x7C90: 0xBB87, - 0x7C91: 0xF4CE, - 0x7C92: 0xC1A3, - 0x7C93: 0xBB88, - 0x7C94: 0xBB89, - 0x7C95: 0xC6C9, - 0x7C96: 0xBB8A, - 0x7C97: 0xB4D6, - 0x7C98: 0xD5B3, - 0x7C99: 0xBB8B, - 0x7C9A: 0xBB8C, - 0x7C9B: 0xBB8D, - 0x7C9C: 0xF4D0, - 0x7C9D: 0xF4CF, - 0x7C9E: 0xF4D1, - 0x7C9F: 0xCBDA, - 0x7CA0: 0xBB8E, - 0x7CA1: 0xBB8F, - 0x7CA2: 0xF4D2, - 0x7CA3: 0xBB90, - 0x7CA4: 0xD4C1, - 0x7CA5: 0xD6E0, - 0x7CA6: 0xBB91, - 0x7CA7: 0xBB92, - 0x7CA8: 0xBB93, - 0x7CA9: 0xBB94, - 0x7CAA: 0xB7E0, - 0x7CAB: 0xBB95, - 0x7CAC: 0xBB96, - 0x7CAD: 0xBB97, - 0x7CAE: 0xC1B8, - 0x7CAF: 0xBB98, - 0x7CB0: 0xBB99, - 0x7CB1: 0xC1BB, - 0x7CB2: 0xF4D3, - 0x7CB3: 0xBEAC, - 0x7CB4: 0xBB9A, - 0x7CB5: 0xBB9B, - 0x7CB6: 0xBB9C, - 0x7CB7: 0xBB9D, - 0x7CB8: 0xBB9E, - 0x7CB9: 0xB4E2, - 0x7CBA: 0xBB9F, - 0x7CBB: 0xBBA0, - 0x7CBC: 0xF4D4, - 0x7CBD: 0xF4D5, - 0x7CBE: 0xBEAB, - 0x7CBF: 0xBC40, - 0x7CC0: 0xBC41, - 0x7CC1: 0xF4D6, - 0x7CC2: 0xBC42, - 0x7CC3: 0xBC43, - 0x7CC4: 0xBC44, - 0x7CC5: 0xF4DB, - 0x7CC6: 0xBC45, - 0x7CC7: 0xF4D7, - 0x7CC8: 0xF4DA, - 0x7CC9: 0xBC46, - 0x7CCA: 0xBAFD, - 0x7CCB: 0xBC47, - 0x7CCC: 0xF4D8, - 0x7CCD: 0xF4D9, - 0x7CCE: 0xBC48, - 0x7CCF: 0xBC49, - 0x7CD0: 0xBC4A, - 0x7CD1: 0xBC4B, - 0x7CD2: 0xBC4C, - 0x7CD3: 0xBC4D, - 0x7CD4: 0xBC4E, - 0x7CD5: 0xB8E2, - 0x7CD6: 0xCCC7, - 0x7CD7: 0xF4DC, - 0x7CD8: 0xBC4F, - 0x7CD9: 0xB2DA, - 0x7CDA: 0xBC50, - 0x7CDB: 0xBC51, - 0x7CDC: 0xC3D3, - 0x7CDD: 0xBC52, - 0x7CDE: 0xBC53, - 0x7CDF: 0xD4E3, - 0x7CE0: 0xBFB7, - 0x7CE1: 0xBC54, - 0x7CE2: 0xBC55, - 0x7CE3: 0xBC56, - 0x7CE4: 0xBC57, - 0x7CE5: 0xBC58, - 0x7CE6: 0xBC59, - 0x7CE7: 0xBC5A, - 0x7CE8: 0xF4DD, - 0x7CE9: 0xBC5B, - 0x7CEA: 0xBC5C, - 0x7CEB: 0xBC5D, - 0x7CEC: 0xBC5E, - 0x7CED: 0xBC5F, - 0x7CEE: 0xBC60, - 0x7CEF: 0xC5B4, - 0x7CF0: 0xBC61, - 0x7CF1: 0xBC62, - 0x7CF2: 0xBC63, - 0x7CF3: 0xBC64, - 0x7CF4: 0xBC65, - 0x7CF5: 0xBC66, - 0x7CF6: 0xBC67, - 0x7CF7: 0xBC68, - 0x7CF8: 0xF4E9, - 0x7CF9: 0xBC69, - 0x7CFA: 0xBC6A, - 0x7CFB: 0xCFB5, - 0x7CFC: 0xBC6B, - 0x7CFD: 0xBC6C, - 0x7CFE: 0xBC6D, - 0x7CFF: 0xBC6E, - 0x7D00: 0xBC6F, - 0x7D01: 0xBC70, - 0x7D02: 0xBC71, - 0x7D03: 0xBC72, - 0x7D04: 0xBC73, - 0x7D05: 0xBC74, - 0x7D06: 0xBC75, - 0x7D07: 0xBC76, - 0x7D08: 0xBC77, - 0x7D09: 0xBC78, - 0x7D0A: 0xCEC9, - 0x7D0B: 0xBC79, - 0x7D0C: 0xBC7A, - 0x7D0D: 0xBC7B, - 0x7D0E: 0xBC7C, - 0x7D0F: 0xBC7D, - 0x7D10: 0xBC7E, - 0x7D11: 0xBC80, - 0x7D12: 0xBC81, - 0x7D13: 0xBC82, - 0x7D14: 0xBC83, - 0x7D15: 0xBC84, - 0x7D16: 0xBC85, - 0x7D17: 0xBC86, - 0x7D18: 0xBC87, - 0x7D19: 0xBC88, - 0x7D1A: 0xBC89, - 0x7D1B: 0xBC8A, - 0x7D1C: 0xBC8B, - 0x7D1D: 0xBC8C, - 0x7D1E: 0xBC8D, - 0x7D1F: 0xBC8E, - 0x7D20: 0xCBD8, - 0x7D21: 0xBC8F, - 0x7D22: 0xCBF7, - 0x7D23: 0xBC90, - 0x7D24: 0xBC91, - 0x7D25: 0xBC92, - 0x7D26: 0xBC93, - 0x7D27: 0xBDF4, - 0x7D28: 0xBC94, - 0x7D29: 0xBC95, - 0x7D2A: 0xBC96, - 0x7D2B: 0xD7CF, - 0x7D2C: 0xBC97, - 0x7D2D: 0xBC98, - 0x7D2E: 0xBC99, - 0x7D2F: 0xC0DB, - 0x7D30: 0xBC9A, - 0x7D31: 0xBC9B, - 0x7D32: 0xBC9C, - 0x7D33: 0xBC9D, - 0x7D34: 0xBC9E, - 0x7D35: 0xBC9F, - 0x7D36: 0xBCA0, - 0x7D37: 0xBD40, - 0x7D38: 0xBD41, - 0x7D39: 0xBD42, - 0x7D3A: 0xBD43, - 0x7D3B: 0xBD44, - 0x7D3C: 0xBD45, - 0x7D3D: 0xBD46, - 0x7D3E: 0xBD47, - 0x7D3F: 0xBD48, - 0x7D40: 0xBD49, - 0x7D41: 0xBD4A, - 0x7D42: 0xBD4B, - 0x7D43: 0xBD4C, - 0x7D44: 0xBD4D, - 0x7D45: 0xBD4E, - 0x7D46: 0xBD4F, - 0x7D47: 0xBD50, - 0x7D48: 0xBD51, - 0x7D49: 0xBD52, - 0x7D4A: 0xBD53, - 0x7D4B: 0xBD54, - 0x7D4C: 0xBD55, - 0x7D4D: 0xBD56, - 0x7D4E: 0xBD57, - 0x7D4F: 0xBD58, - 0x7D50: 0xBD59, - 0x7D51: 0xBD5A, - 0x7D52: 0xBD5B, - 0x7D53: 0xBD5C, - 0x7D54: 0xBD5D, - 0x7D55: 0xBD5E, - 0x7D56: 0xBD5F, - 0x7D57: 0xBD60, - 0x7D58: 0xBD61, - 0x7D59: 0xBD62, - 0x7D5A: 0xBD63, - 0x7D5B: 0xBD64, - 0x7D5C: 0xBD65, - 0x7D5D: 0xBD66, - 0x7D5E: 0xBD67, - 0x7D5F: 0xBD68, - 0x7D60: 0xBD69, - 0x7D61: 0xBD6A, - 0x7D62: 0xBD6B, - 0x7D63: 0xBD6C, - 0x7D64: 0xBD6D, - 0x7D65: 0xBD6E, - 0x7D66: 0xBD6F, - 0x7D67: 0xBD70, - 0x7D68: 0xBD71, - 0x7D69: 0xBD72, - 0x7D6A: 0xBD73, - 0x7D6B: 0xBD74, - 0x7D6C: 0xBD75, - 0x7D6D: 0xBD76, - 0x7D6E: 0xD0F5, - 0x7D6F: 0xBD77, - 0x7D70: 0xBD78, - 0x7D71: 0xBD79, - 0x7D72: 0xBD7A, - 0x7D73: 0xBD7B, - 0x7D74: 0xBD7C, - 0x7D75: 0xBD7D, - 0x7D76: 0xBD7E, - 0x7D77: 0xF4EA, - 0x7D78: 0xBD80, - 0x7D79: 0xBD81, - 0x7D7A: 0xBD82, - 0x7D7B: 0xBD83, - 0x7D7C: 0xBD84, - 0x7D7D: 0xBD85, - 0x7D7E: 0xBD86, - 0x7D7F: 0xBD87, - 0x7D80: 0xBD88, - 0x7D81: 0xBD89, - 0x7D82: 0xBD8A, - 0x7D83: 0xBD8B, - 0x7D84: 0xBD8C, - 0x7D85: 0xBD8D, - 0x7D86: 0xBD8E, - 0x7D87: 0xBD8F, - 0x7D88: 0xBD90, - 0x7D89: 0xBD91, - 0x7D8A: 0xBD92, - 0x7D8B: 0xBD93, - 0x7D8C: 0xBD94, - 0x7D8D: 0xBD95, - 0x7D8E: 0xBD96, - 0x7D8F: 0xBD97, - 0x7D90: 0xBD98, - 0x7D91: 0xBD99, - 0x7D92: 0xBD9A, - 0x7D93: 0xBD9B, - 0x7D94: 0xBD9C, - 0x7D95: 0xBD9D, - 0x7D96: 0xBD9E, - 0x7D97: 0xBD9F, - 0x7D98: 0xBDA0, - 0x7D99: 0xBE40, - 0x7D9A: 0xBE41, - 0x7D9B: 0xBE42, - 0x7D9C: 0xBE43, - 0x7D9D: 0xBE44, - 0x7D9E: 0xBE45, - 0x7D9F: 0xBE46, - 0x7DA0: 0xBE47, - 0x7DA1: 0xBE48, - 0x7DA2: 0xBE49, - 0x7DA3: 0xBE4A, - 0x7DA4: 0xBE4B, - 0x7DA5: 0xBE4C, - 0x7DA6: 0xF4EB, - 0x7DA7: 0xBE4D, - 0x7DA8: 0xBE4E, - 0x7DA9: 0xBE4F, - 0x7DAA: 0xBE50, - 0x7DAB: 0xBE51, - 0x7DAC: 0xBE52, - 0x7DAD: 0xBE53, - 0x7DAE: 0xF4EC, - 0x7DAF: 0xBE54, - 0x7DB0: 0xBE55, - 0x7DB1: 0xBE56, - 0x7DB2: 0xBE57, - 0x7DB3: 0xBE58, - 0x7DB4: 0xBE59, - 0x7DB5: 0xBE5A, - 0x7DB6: 0xBE5B, - 0x7DB7: 0xBE5C, - 0x7DB8: 0xBE5D, - 0x7DB9: 0xBE5E, - 0x7DBA: 0xBE5F, - 0x7DBB: 0xBE60, - 0x7DBC: 0xBE61, - 0x7DBD: 0xBE62, - 0x7DBE: 0xBE63, - 0x7DBF: 0xBE64, - 0x7DC0: 0xBE65, - 0x7DC1: 0xBE66, - 0x7DC2: 0xBE67, - 0x7DC3: 0xBE68, - 0x7DC4: 0xBE69, - 0x7DC5: 0xBE6A, - 0x7DC6: 0xBE6B, - 0x7DC7: 0xBE6C, - 0x7DC8: 0xBE6D, - 0x7DC9: 0xBE6E, - 0x7DCA: 0xBE6F, - 0x7DCB: 0xBE70, - 0x7DCC: 0xBE71, - 0x7DCD: 0xBE72, - 0x7DCE: 0xBE73, - 0x7DCF: 0xBE74, - 0x7DD0: 0xBE75, - 0x7DD1: 0xBE76, - 0x7DD2: 0xBE77, - 0x7DD3: 0xBE78, - 0x7DD4: 0xBE79, - 0x7DD5: 0xBE7A, - 0x7DD6: 0xBE7B, - 0x7DD7: 0xBE7C, - 0x7DD8: 0xBE7D, - 0x7DD9: 0xBE7E, - 0x7DDA: 0xBE80, - 0x7DDB: 0xBE81, - 0x7DDC: 0xBE82, - 0x7DDD: 0xBE83, - 0x7DDE: 0xBE84, - 0x7DDF: 0xBE85, - 0x7DE0: 0xBE86, - 0x7DE1: 0xBE87, - 0x7DE2: 0xBE88, - 0x7DE3: 0xBE89, - 0x7DE4: 0xBE8A, - 0x7DE5: 0xBE8B, - 0x7DE6: 0xBE8C, - 0x7DE7: 0xBE8D, - 0x7DE8: 0xBE8E, - 0x7DE9: 0xBE8F, - 0x7DEA: 0xBE90, - 0x7DEB: 0xBE91, - 0x7DEC: 0xBE92, - 0x7DED: 0xBE93, - 0x7DEE: 0xBE94, - 0x7DEF: 0xBE95, - 0x7DF0: 0xBE96, - 0x7DF1: 0xBE97, - 0x7DF2: 0xBE98, - 0x7DF3: 0xBE99, - 0x7DF4: 0xBE9A, - 0x7DF5: 0xBE9B, - 0x7DF6: 0xBE9C, - 0x7DF7: 0xBE9D, - 0x7DF8: 0xBE9E, - 0x7DF9: 0xBE9F, - 0x7DFA: 0xBEA0, - 0x7DFB: 0xBF40, - 0x7DFC: 0xBF41, - 0x7DFD: 0xBF42, - 0x7DFE: 0xBF43, - 0x7DFF: 0xBF44, - 0x7E00: 0xBF45, - 0x7E01: 0xBF46, - 0x7E02: 0xBF47, - 0x7E03: 0xBF48, - 0x7E04: 0xBF49, - 0x7E05: 0xBF4A, - 0x7E06: 0xBF4B, - 0x7E07: 0xBF4C, - 0x7E08: 0xBF4D, - 0x7E09: 0xBF4E, - 0x7E0A: 0xBF4F, - 0x7E0B: 0xBF50, - 0x7E0C: 0xBF51, - 0x7E0D: 0xBF52, - 0x7E0E: 0xBF53, - 0x7E0F: 0xBF54, - 0x7E10: 0xBF55, - 0x7E11: 0xBF56, - 0x7E12: 0xBF57, - 0x7E13: 0xBF58, - 0x7E14: 0xBF59, - 0x7E15: 0xBF5A, - 0x7E16: 0xBF5B, - 0x7E17: 0xBF5C, - 0x7E18: 0xBF5D, - 0x7E19: 0xBF5E, - 0x7E1A: 0xBF5F, - 0x7E1B: 0xBF60, - 0x7E1C: 0xBF61, - 0x7E1D: 0xBF62, - 0x7E1E: 0xBF63, - 0x7E1F: 0xBF64, - 0x7E20: 0xBF65, - 0x7E21: 0xBF66, - 0x7E22: 0xBF67, - 0x7E23: 0xBF68, - 0x7E24: 0xBF69, - 0x7E25: 0xBF6A, - 0x7E26: 0xBF6B, - 0x7E27: 0xBF6C, - 0x7E28: 0xBF6D, - 0x7E29: 0xBF6E, - 0x7E2A: 0xBF6F, - 0x7E2B: 0xBF70, - 0x7E2C: 0xBF71, - 0x7E2D: 0xBF72, - 0x7E2E: 0xBF73, - 0x7E2F: 0xBF74, - 0x7E30: 0xBF75, - 0x7E31: 0xBF76, - 0x7E32: 0xBF77, - 0x7E33: 0xBF78, - 0x7E34: 0xBF79, - 0x7E35: 0xBF7A, - 0x7E36: 0xBF7B, - 0x7E37: 0xBF7C, - 0x7E38: 0xBF7D, - 0x7E39: 0xBF7E, - 0x7E3A: 0xBF80, - 0x7E3B: 0xF7E3, - 0x7E3C: 0xBF81, - 0x7E3D: 0xBF82, - 0x7E3E: 0xBF83, - 0x7E3F: 0xBF84, - 0x7E40: 0xBF85, - 0x7E41: 0xB7B1, - 0x7E42: 0xBF86, - 0x7E43: 0xBF87, - 0x7E44: 0xBF88, - 0x7E45: 0xBF89, - 0x7E46: 0xBF8A, - 0x7E47: 0xF4ED, - 0x7E48: 0xBF8B, - 0x7E49: 0xBF8C, - 0x7E4A: 0xBF8D, - 0x7E4B: 0xBF8E, - 0x7E4C: 0xBF8F, - 0x7E4D: 0xBF90, - 0x7E4E: 0xBF91, - 0x7E4F: 0xBF92, - 0x7E50: 0xBF93, - 0x7E51: 0xBF94, - 0x7E52: 0xBF95, - 0x7E53: 0xBF96, - 0x7E54: 0xBF97, - 0x7E55: 0xBF98, - 0x7E56: 0xBF99, - 0x7E57: 0xBF9A, - 0x7E58: 0xBF9B, - 0x7E59: 0xBF9C, - 0x7E5A: 0xBF9D, - 0x7E5B: 0xBF9E, - 0x7E5C: 0xBF9F, - 0x7E5D: 0xBFA0, - 0x7E5E: 0xC040, - 0x7E5F: 0xC041, - 0x7E60: 0xC042, - 0x7E61: 0xC043, - 0x7E62: 0xC044, - 0x7E63: 0xC045, - 0x7E64: 0xC046, - 0x7E65: 0xC047, - 0x7E66: 0xC048, - 0x7E67: 0xC049, - 0x7E68: 0xC04A, - 0x7E69: 0xC04B, - 0x7E6A: 0xC04C, - 0x7E6B: 0xC04D, - 0x7E6C: 0xC04E, - 0x7E6D: 0xC04F, - 0x7E6E: 0xC050, - 0x7E6F: 0xC051, - 0x7E70: 0xC052, - 0x7E71: 0xC053, - 0x7E72: 0xC054, - 0x7E73: 0xC055, - 0x7E74: 0xC056, - 0x7E75: 0xC057, - 0x7E76: 0xC058, - 0x7E77: 0xC059, - 0x7E78: 0xC05A, - 0x7E79: 0xC05B, - 0x7E7A: 0xC05C, - 0x7E7B: 0xC05D, - 0x7E7C: 0xC05E, - 0x7E7D: 0xC05F, - 0x7E7E: 0xC060, - 0x7E7F: 0xC061, - 0x7E80: 0xC062, - 0x7E81: 0xC063, - 0x7E82: 0xD7EB, - 0x7E83: 0xC064, - 0x7E84: 0xC065, - 0x7E85: 0xC066, - 0x7E86: 0xC067, - 0x7E87: 0xC068, - 0x7E88: 0xC069, - 0x7E89: 0xC06A, - 0x7E8A: 0xC06B, - 0x7E8B: 0xC06C, - 0x7E8C: 0xC06D, - 0x7E8D: 0xC06E, - 0x7E8E: 0xC06F, - 0x7E8F: 0xC070, - 0x7E90: 0xC071, - 0x7E91: 0xC072, - 0x7E92: 0xC073, - 0x7E93: 0xC074, - 0x7E94: 0xC075, - 0x7E95: 0xC076, - 0x7E96: 0xC077, - 0x7E97: 0xC078, - 0x7E98: 0xC079, - 0x7E99: 0xC07A, - 0x7E9A: 0xC07B, - 0x7E9B: 0xF4EE, - 0x7E9C: 0xC07C, - 0x7E9D: 0xC07D, - 0x7E9E: 0xC07E, - 0x7E9F: 0xE6F9, - 0x7EA0: 0xBEC0, - 0x7EA1: 0xE6FA, - 0x7EA2: 0xBAEC, - 0x7EA3: 0xE6FB, - 0x7EA4: 0xCFCB, - 0x7EA5: 0xE6FC, - 0x7EA6: 0xD4BC, - 0x7EA7: 0xBCB6, - 0x7EA8: 0xE6FD, - 0x7EA9: 0xE6FE, - 0x7EAA: 0xBCCD, - 0x7EAB: 0xC8D2, - 0x7EAC: 0xCEB3, - 0x7EAD: 0xE7A1, - 0x7EAE: 0xC080, - 0x7EAF: 0xB4BF, - 0x7EB0: 0xE7A2, - 0x7EB1: 0xC9B4, - 0x7EB2: 0xB8D9, - 0x7EB3: 0xC4C9, - 0x7EB4: 0xC081, - 0x7EB5: 0xD7DD, - 0x7EB6: 0xC2DA, - 0x7EB7: 0xB7D7, - 0x7EB8: 0xD6BD, - 0x7EB9: 0xCEC6, - 0x7EBA: 0xB7C4, - 0x7EBB: 0xC082, - 0x7EBC: 0xC083, - 0x7EBD: 0xC5A6, - 0x7EBE: 0xE7A3, - 0x7EBF: 0xCFDF, - 0x7EC0: 0xE7A4, - 0x7EC1: 0xE7A5, - 0x7EC2: 0xE7A6, - 0x7EC3: 0xC1B7, - 0x7EC4: 0xD7E9, - 0x7EC5: 0xC9F0, - 0x7EC6: 0xCFB8, - 0x7EC7: 0xD6AF, - 0x7EC8: 0xD6D5, - 0x7EC9: 0xE7A7, - 0x7ECA: 0xB0ED, - 0x7ECB: 0xE7A8, - 0x7ECC: 0xE7A9, - 0x7ECD: 0xC9DC, - 0x7ECE: 0xD2EF, - 0x7ECF: 0xBEAD, - 0x7ED0: 0xE7AA, - 0x7ED1: 0xB0F3, - 0x7ED2: 0xC8DE, - 0x7ED3: 0xBDE1, - 0x7ED4: 0xE7AB, - 0x7ED5: 0xC8C6, - 0x7ED6: 0xC084, - 0x7ED7: 0xE7AC, - 0x7ED8: 0xBBE6, - 0x7ED9: 0xB8F8, - 0x7EDA: 0xD1A4, - 0x7EDB: 0xE7AD, - 0x7EDC: 0xC2E7, - 0x7EDD: 0xBEF8, - 0x7EDE: 0xBDCA, - 0x7EDF: 0xCDB3, - 0x7EE0: 0xE7AE, - 0x7EE1: 0xE7AF, - 0x7EE2: 0xBEEE, - 0x7EE3: 0xD0E5, - 0x7EE4: 0xC085, - 0x7EE5: 0xCBE7, - 0x7EE6: 0xCCD0, - 0x7EE7: 0xBCCC, - 0x7EE8: 0xE7B0, - 0x7EE9: 0xBCA8, - 0x7EEA: 0xD0F7, - 0x7EEB: 0xE7B1, - 0x7EEC: 0xC086, - 0x7EED: 0xD0F8, - 0x7EEE: 0xE7B2, - 0x7EEF: 0xE7B3, - 0x7EF0: 0xB4C2, - 0x7EF1: 0xE7B4, - 0x7EF2: 0xE7B5, - 0x7EF3: 0xC9FE, - 0x7EF4: 0xCEAC, - 0x7EF5: 0xC3E0, - 0x7EF6: 0xE7B7, - 0x7EF7: 0xB1C1, - 0x7EF8: 0xB3F1, - 0x7EF9: 0xC087, - 0x7EFA: 0xE7B8, - 0x7EFB: 0xE7B9, - 0x7EFC: 0xD7DB, - 0x7EFD: 0xD5C0, - 0x7EFE: 0xE7BA, - 0x7EFF: 0xC2CC, - 0x7F00: 0xD7BA, - 0x7F01: 0xE7BB, - 0x7F02: 0xE7BC, - 0x7F03: 0xE7BD, - 0x7F04: 0xBCEA, - 0x7F05: 0xC3E5, - 0x7F06: 0xC0C2, - 0x7F07: 0xE7BE, - 0x7F08: 0xE7BF, - 0x7F09: 0xBCA9, - 0x7F0A: 0xC088, - 0x7F0B: 0xE7C0, - 0x7F0C: 0xE7C1, - 0x7F0D: 0xE7B6, - 0x7F0E: 0xB6D0, - 0x7F0F: 0xE7C2, - 0x7F10: 0xC089, - 0x7F11: 0xE7C3, - 0x7F12: 0xE7C4, - 0x7F13: 0xBBBA, - 0x7F14: 0xB5DE, - 0x7F15: 0xC2C6, - 0x7F16: 0xB1E0, - 0x7F17: 0xE7C5, - 0x7F18: 0xD4B5, - 0x7F19: 0xE7C6, - 0x7F1A: 0xB8BF, - 0x7F1B: 0xE7C8, - 0x7F1C: 0xE7C7, - 0x7F1D: 0xB7EC, - 0x7F1E: 0xC08A, - 0x7F1F: 0xE7C9, - 0x7F20: 0xB2F8, - 0x7F21: 0xE7CA, - 0x7F22: 0xE7CB, - 0x7F23: 0xE7CC, - 0x7F24: 0xE7CD, - 0x7F25: 0xE7CE, - 0x7F26: 0xE7CF, - 0x7F27: 0xE7D0, - 0x7F28: 0xD3A7, - 0x7F29: 0xCBF5, - 0x7F2A: 0xE7D1, - 0x7F2B: 0xE7D2, - 0x7F2C: 0xE7D3, - 0x7F2D: 0xE7D4, - 0x7F2E: 0xC9C9, - 0x7F2F: 0xE7D5, - 0x7F30: 0xE7D6, - 0x7F31: 0xE7D7, - 0x7F32: 0xE7D8, - 0x7F33: 0xE7D9, - 0x7F34: 0xBDC9, - 0x7F35: 0xE7DA, - 0x7F36: 0xF3BE, - 0x7F37: 0xC08B, - 0x7F38: 0xB8D7, - 0x7F39: 0xC08C, - 0x7F3A: 0xC8B1, - 0x7F3B: 0xC08D, - 0x7F3C: 0xC08E, - 0x7F3D: 0xC08F, - 0x7F3E: 0xC090, - 0x7F3F: 0xC091, - 0x7F40: 0xC092, - 0x7F41: 0xC093, - 0x7F42: 0xF3BF, - 0x7F43: 0xC094, - 0x7F44: 0xF3C0, - 0x7F45: 0xF3C1, - 0x7F46: 0xC095, - 0x7F47: 0xC096, - 0x7F48: 0xC097, - 0x7F49: 0xC098, - 0x7F4A: 0xC099, - 0x7F4B: 0xC09A, - 0x7F4C: 0xC09B, - 0x7F4D: 0xC09C, - 0x7F4E: 0xC09D, - 0x7F4F: 0xC09E, - 0x7F50: 0xB9DE, - 0x7F51: 0xCDF8, - 0x7F52: 0xC09F, - 0x7F53: 0xC0A0, - 0x7F54: 0xD8E8, - 0x7F55: 0xBAB1, - 0x7F56: 0xC140, - 0x7F57: 0xC2DE, - 0x7F58: 0xEEB7, - 0x7F59: 0xC141, - 0x7F5A: 0xB7A3, - 0x7F5B: 0xC142, - 0x7F5C: 0xC143, - 0x7F5D: 0xC144, - 0x7F5E: 0xC145, - 0x7F5F: 0xEEB9, - 0x7F60: 0xC146, - 0x7F61: 0xEEB8, - 0x7F62: 0xB0D5, - 0x7F63: 0xC147, - 0x7F64: 0xC148, - 0x7F65: 0xC149, - 0x7F66: 0xC14A, - 0x7F67: 0xC14B, - 0x7F68: 0xEEBB, - 0x7F69: 0xD5D6, - 0x7F6A: 0xD7EF, - 0x7F6B: 0xC14C, - 0x7F6C: 0xC14D, - 0x7F6D: 0xC14E, - 0x7F6E: 0xD6C3, - 0x7F6F: 0xC14F, - 0x7F70: 0xC150, - 0x7F71: 0xEEBD, - 0x7F72: 0xCAF0, - 0x7F73: 0xC151, - 0x7F74: 0xEEBC, - 0x7F75: 0xC152, - 0x7F76: 0xC153, - 0x7F77: 0xC154, - 0x7F78: 0xC155, - 0x7F79: 0xEEBE, - 0x7F7A: 0xC156, - 0x7F7B: 0xC157, - 0x7F7C: 0xC158, - 0x7F7D: 0xC159, - 0x7F7E: 0xEEC0, - 0x7F7F: 0xC15A, - 0x7F80: 0xC15B, - 0x7F81: 0xEEBF, - 0x7F82: 0xC15C, - 0x7F83: 0xC15D, - 0x7F84: 0xC15E, - 0x7F85: 0xC15F, - 0x7F86: 0xC160, - 0x7F87: 0xC161, - 0x7F88: 0xC162, - 0x7F89: 0xC163, - 0x7F8A: 0xD1F2, - 0x7F8B: 0xC164, - 0x7F8C: 0xC7BC, - 0x7F8D: 0xC165, - 0x7F8E: 0xC3C0, - 0x7F8F: 0xC166, - 0x7F90: 0xC167, - 0x7F91: 0xC168, - 0x7F92: 0xC169, - 0x7F93: 0xC16A, - 0x7F94: 0xB8E1, - 0x7F95: 0xC16B, - 0x7F96: 0xC16C, - 0x7F97: 0xC16D, - 0x7F98: 0xC16E, - 0x7F99: 0xC16F, - 0x7F9A: 0xC1E7, - 0x7F9B: 0xC170, - 0x7F9C: 0xC171, - 0x7F9D: 0xF4C6, - 0x7F9E: 0xD0DF, - 0x7F9F: 0xF4C7, - 0x7FA0: 0xC172, - 0x7FA1: 0xCFDB, - 0x7FA2: 0xC173, - 0x7FA3: 0xC174, - 0x7FA4: 0xC8BA, - 0x7FA5: 0xC175, - 0x7FA6: 0xC176, - 0x7FA7: 0xF4C8, - 0x7FA8: 0xC177, - 0x7FA9: 0xC178, - 0x7FAA: 0xC179, - 0x7FAB: 0xC17A, - 0x7FAC: 0xC17B, - 0x7FAD: 0xC17C, - 0x7FAE: 0xC17D, - 0x7FAF: 0xF4C9, - 0x7FB0: 0xF4CA, - 0x7FB1: 0xC17E, - 0x7FB2: 0xF4CB, - 0x7FB3: 0xC180, - 0x7FB4: 0xC181, - 0x7FB5: 0xC182, - 0x7FB6: 0xC183, - 0x7FB7: 0xC184, - 0x7FB8: 0xD9FA, - 0x7FB9: 0xB8FE, - 0x7FBA: 0xC185, - 0x7FBB: 0xC186, - 0x7FBC: 0xE5F1, - 0x7FBD: 0xD3F0, - 0x7FBE: 0xC187, - 0x7FBF: 0xF4E0, - 0x7FC0: 0xC188, - 0x7FC1: 0xCECC, - 0x7FC2: 0xC189, - 0x7FC3: 0xC18A, - 0x7FC4: 0xC18B, - 0x7FC5: 0xB3E1, - 0x7FC6: 0xC18C, - 0x7FC7: 0xC18D, - 0x7FC8: 0xC18E, - 0x7FC9: 0xC18F, - 0x7FCA: 0xF1B4, - 0x7FCB: 0xC190, - 0x7FCC: 0xD2EE, - 0x7FCD: 0xC191, - 0x7FCE: 0xF4E1, - 0x7FCF: 0xC192, - 0x7FD0: 0xC193, - 0x7FD1: 0xC194, - 0x7FD2: 0xC195, - 0x7FD3: 0xC196, - 0x7FD4: 0xCFE8, - 0x7FD5: 0xF4E2, - 0x7FD6: 0xC197, - 0x7FD7: 0xC198, - 0x7FD8: 0xC7CC, - 0x7FD9: 0xC199, - 0x7FDA: 0xC19A, - 0x7FDB: 0xC19B, - 0x7FDC: 0xC19C, - 0x7FDD: 0xC19D, - 0x7FDE: 0xC19E, - 0x7FDF: 0xB5D4, - 0x7FE0: 0xB4E4, - 0x7FE1: 0xF4E4, - 0x7FE2: 0xC19F, - 0x7FE3: 0xC1A0, - 0x7FE4: 0xC240, - 0x7FE5: 0xF4E3, - 0x7FE6: 0xF4E5, - 0x7FE7: 0xC241, - 0x7FE8: 0xC242, - 0x7FE9: 0xF4E6, - 0x7FEA: 0xC243, - 0x7FEB: 0xC244, - 0x7FEC: 0xC245, - 0x7FED: 0xC246, - 0x7FEE: 0xF4E7, - 0x7FEF: 0xC247, - 0x7FF0: 0xBAB2, - 0x7FF1: 0xB0BF, - 0x7FF2: 0xC248, - 0x7FF3: 0xF4E8, - 0x7FF4: 0xC249, - 0x7FF5: 0xC24A, - 0x7FF6: 0xC24B, - 0x7FF7: 0xC24C, - 0x7FF8: 0xC24D, - 0x7FF9: 0xC24E, - 0x7FFA: 0xC24F, - 0x7FFB: 0xB7AD, - 0x7FFC: 0xD2ED, - 0x7FFD: 0xC250, - 0x7FFE: 0xC251, - 0x7FFF: 0xC252, - 0x8000: 0xD2AB, - 0x8001: 0xC0CF, - 0x8002: 0xC253, - 0x8003: 0xBFBC, - 0x8004: 0xEBA3, - 0x8005: 0xD5DF, - 0x8006: 0xEAC8, - 0x8007: 0xC254, - 0x8008: 0xC255, - 0x8009: 0xC256, - 0x800A: 0xC257, - 0x800B: 0xF1F3, - 0x800C: 0xB6F8, - 0x800D: 0xCBA3, - 0x800E: 0xC258, - 0x800F: 0xC259, - 0x8010: 0xC4CD, - 0x8011: 0xC25A, - 0x8012: 0xF1E7, - 0x8013: 0xC25B, - 0x8014: 0xF1E8, - 0x8015: 0xB8FB, - 0x8016: 0xF1E9, - 0x8017: 0xBAC4, - 0x8018: 0xD4C5, - 0x8019: 0xB0D2, - 0x801A: 0xC25C, - 0x801B: 0xC25D, - 0x801C: 0xF1EA, - 0x801D: 0xC25E, - 0x801E: 0xC25F, - 0x801F: 0xC260, - 0x8020: 0xF1EB, - 0x8021: 0xC261, - 0x8022: 0xF1EC, - 0x8023: 0xC262, - 0x8024: 0xC263, - 0x8025: 0xF1ED, - 0x8026: 0xF1EE, - 0x8027: 0xF1EF, - 0x8028: 0xF1F1, - 0x8029: 0xF1F0, - 0x802A: 0xC5D5, - 0x802B: 0xC264, - 0x802C: 0xC265, - 0x802D: 0xC266, - 0x802E: 0xC267, - 0x802F: 0xC268, - 0x8030: 0xC269, - 0x8031: 0xF1F2, - 0x8032: 0xC26A, - 0x8033: 0xB6FA, - 0x8034: 0xC26B, - 0x8035: 0xF1F4, - 0x8036: 0xD2AE, - 0x8037: 0xDEC7, - 0x8038: 0xCBCA, - 0x8039: 0xC26C, - 0x803A: 0xC26D, - 0x803B: 0xB3DC, - 0x803C: 0xC26E, - 0x803D: 0xB5A2, - 0x803E: 0xC26F, - 0x803F: 0xB9A2, - 0x8040: 0xC270, - 0x8041: 0xC271, - 0x8042: 0xC4F4, - 0x8043: 0xF1F5, - 0x8044: 0xC272, - 0x8045: 0xC273, - 0x8046: 0xF1F6, - 0x8047: 0xC274, - 0x8048: 0xC275, - 0x8049: 0xC276, - 0x804A: 0xC1C4, - 0x804B: 0xC1FB, - 0x804C: 0xD6B0, - 0x804D: 0xF1F7, - 0x804E: 0xC277, - 0x804F: 0xC278, - 0x8050: 0xC279, - 0x8051: 0xC27A, - 0x8052: 0xF1F8, - 0x8053: 0xC27B, - 0x8054: 0xC1AA, - 0x8055: 0xC27C, - 0x8056: 0xC27D, - 0x8057: 0xC27E, - 0x8058: 0xC6B8, - 0x8059: 0xC280, - 0x805A: 0xBEDB, - 0x805B: 0xC281, - 0x805C: 0xC282, - 0x805D: 0xC283, - 0x805E: 0xC284, - 0x805F: 0xC285, - 0x8060: 0xC286, - 0x8061: 0xC287, - 0x8062: 0xC288, - 0x8063: 0xC289, - 0x8064: 0xC28A, - 0x8065: 0xC28B, - 0x8066: 0xC28C, - 0x8067: 0xC28D, - 0x8068: 0xC28E, - 0x8069: 0xF1F9, - 0x806A: 0xB4CF, - 0x806B: 0xC28F, - 0x806C: 0xC290, - 0x806D: 0xC291, - 0x806E: 0xC292, - 0x806F: 0xC293, - 0x8070: 0xC294, - 0x8071: 0xF1FA, - 0x8072: 0xC295, - 0x8073: 0xC296, - 0x8074: 0xC297, - 0x8075: 0xC298, - 0x8076: 0xC299, - 0x8077: 0xC29A, - 0x8078: 0xC29B, - 0x8079: 0xC29C, - 0x807A: 0xC29D, - 0x807B: 0xC29E, - 0x807C: 0xC29F, - 0x807D: 0xC2A0, - 0x807E: 0xC340, - 0x807F: 0xEDB2, - 0x8080: 0xEDB1, - 0x8081: 0xC341, - 0x8082: 0xC342, - 0x8083: 0xCBE0, - 0x8084: 0xD2DE, - 0x8085: 0xC343, - 0x8086: 0xCBC1, - 0x8087: 0xD5D8, - 0x8088: 0xC344, - 0x8089: 0xC8E2, - 0x808A: 0xC345, - 0x808B: 0xC0DF, - 0x808C: 0xBCA1, - 0x808D: 0xC346, - 0x808E: 0xC347, - 0x808F: 0xC348, - 0x8090: 0xC349, - 0x8091: 0xC34A, - 0x8092: 0xC34B, - 0x8093: 0xEBC1, - 0x8094: 0xC34C, - 0x8095: 0xC34D, - 0x8096: 0xD0A4, - 0x8097: 0xC34E, - 0x8098: 0xD6E2, - 0x8099: 0xC34F, - 0x809A: 0xB6C7, - 0x809B: 0xB8D8, - 0x809C: 0xEBC0, - 0x809D: 0xB8CE, - 0x809E: 0xC350, - 0x809F: 0xEBBF, - 0x80A0: 0xB3A6, - 0x80A1: 0xB9C9, - 0x80A2: 0xD6AB, - 0x80A3: 0xC351, - 0x80A4: 0xB7F4, - 0x80A5: 0xB7CA, - 0x80A6: 0xC352, - 0x80A7: 0xC353, - 0x80A8: 0xC354, - 0x80A9: 0xBCE7, - 0x80AA: 0xB7BE, - 0x80AB: 0xEBC6, - 0x80AC: 0xC355, - 0x80AD: 0xEBC7, - 0x80AE: 0xB0B9, - 0x80AF: 0xBFCF, - 0x80B0: 0xC356, - 0x80B1: 0xEBC5, - 0x80B2: 0xD3FD, - 0x80B3: 0xC357, - 0x80B4: 0xEBC8, - 0x80B5: 0xC358, - 0x80B6: 0xC359, - 0x80B7: 0xEBC9, - 0x80B8: 0xC35A, - 0x80B9: 0xC35B, - 0x80BA: 0xB7CE, - 0x80BB: 0xC35C, - 0x80BC: 0xEBC2, - 0x80BD: 0xEBC4, - 0x80BE: 0xC9F6, - 0x80BF: 0xD6D7, - 0x80C0: 0xD5CD, - 0x80C1: 0xD0B2, - 0x80C2: 0xEBCF, - 0x80C3: 0xCEB8, - 0x80C4: 0xEBD0, - 0x80C5: 0xC35D, - 0x80C6: 0xB5A8, - 0x80C7: 0xC35E, - 0x80C8: 0xC35F, - 0x80C9: 0xC360, - 0x80CA: 0xC361, - 0x80CB: 0xC362, - 0x80CC: 0xB1B3, - 0x80CD: 0xEBD2, - 0x80CE: 0xCCA5, - 0x80CF: 0xC363, - 0x80D0: 0xC364, - 0x80D1: 0xC365, - 0x80D2: 0xC366, - 0x80D3: 0xC367, - 0x80D4: 0xC368, - 0x80D5: 0xC369, - 0x80D6: 0xC5D6, - 0x80D7: 0xEBD3, - 0x80D8: 0xC36A, - 0x80D9: 0xEBD1, - 0x80DA: 0xC5DF, - 0x80DB: 0xEBCE, - 0x80DC: 0xCAA4, - 0x80DD: 0xEBD5, - 0x80DE: 0xB0FB, - 0x80DF: 0xC36B, - 0x80E0: 0xC36C, - 0x80E1: 0xBAFA, - 0x80E2: 0xC36D, - 0x80E3: 0xC36E, - 0x80E4: 0xD8B7, - 0x80E5: 0xF1E3, - 0x80E6: 0xC36F, - 0x80E7: 0xEBCA, - 0x80E8: 0xEBCB, - 0x80E9: 0xEBCC, - 0x80EA: 0xEBCD, - 0x80EB: 0xEBD6, - 0x80EC: 0xE6C0, - 0x80ED: 0xEBD9, - 0x80EE: 0xC370, - 0x80EF: 0xBFE8, - 0x80F0: 0xD2C8, - 0x80F1: 0xEBD7, - 0x80F2: 0xEBDC, - 0x80F3: 0xB8EC, - 0x80F4: 0xEBD8, - 0x80F5: 0xC371, - 0x80F6: 0xBDBA, - 0x80F7: 0xC372, - 0x80F8: 0xD0D8, - 0x80F9: 0xC373, - 0x80FA: 0xB0B7, - 0x80FB: 0xC374, - 0x80FC: 0xEBDD, - 0x80FD: 0xC4DC, - 0x80FE: 0xC375, - 0x80FF: 0xC376, - 0x8100: 0xC377, - 0x8101: 0xC378, - 0x8102: 0xD6AC, - 0x8103: 0xC379, - 0x8104: 0xC37A, - 0x8105: 0xC37B, - 0x8106: 0xB4E0, - 0x8107: 0xC37C, - 0x8108: 0xC37D, - 0x8109: 0xC2F6, - 0x810A: 0xBCB9, - 0x810B: 0xC37E, - 0x810C: 0xC380, - 0x810D: 0xEBDA, - 0x810E: 0xEBDB, - 0x810F: 0xD4E0, - 0x8110: 0xC6EA, - 0x8111: 0xC4D4, - 0x8112: 0xEBDF, - 0x8113: 0xC5A7, - 0x8114: 0xD9F5, - 0x8115: 0xC381, - 0x8116: 0xB2B1, - 0x8117: 0xC382, - 0x8118: 0xEBE4, - 0x8119: 0xC383, - 0x811A: 0xBDC5, - 0x811B: 0xC384, - 0x811C: 0xC385, - 0x811D: 0xC386, - 0x811E: 0xEBE2, - 0x811F: 0xC387, - 0x8120: 0xC388, - 0x8121: 0xC389, - 0x8122: 0xC38A, - 0x8123: 0xC38B, - 0x8124: 0xC38C, - 0x8125: 0xC38D, - 0x8126: 0xC38E, - 0x8127: 0xC38F, - 0x8128: 0xC390, - 0x8129: 0xC391, - 0x812A: 0xC392, - 0x812B: 0xC393, - 0x812C: 0xEBE3, - 0x812D: 0xC394, - 0x812E: 0xC395, - 0x812F: 0xB8AC, - 0x8130: 0xC396, - 0x8131: 0xCDD1, - 0x8132: 0xEBE5, - 0x8133: 0xC397, - 0x8134: 0xC398, - 0x8135: 0xC399, - 0x8136: 0xEBE1, - 0x8137: 0xC39A, - 0x8138: 0xC1B3, - 0x8139: 0xC39B, - 0x813A: 0xC39C, - 0x813B: 0xC39D, - 0x813C: 0xC39E, - 0x813D: 0xC39F, - 0x813E: 0xC6A2, - 0x813F: 0xC3A0, - 0x8140: 0xC440, - 0x8141: 0xC441, - 0x8142: 0xC442, - 0x8143: 0xC443, - 0x8144: 0xC444, - 0x8145: 0xC445, - 0x8146: 0xCCF3, - 0x8147: 0xC446, - 0x8148: 0xEBE6, - 0x8149: 0xC447, - 0x814A: 0xC0B0, - 0x814B: 0xD2B8, - 0x814C: 0xEBE7, - 0x814D: 0xC448, - 0x814E: 0xC449, - 0x814F: 0xC44A, - 0x8150: 0xB8AF, - 0x8151: 0xB8AD, - 0x8152: 0xC44B, - 0x8153: 0xEBE8, - 0x8154: 0xC7BB, - 0x8155: 0xCDF3, - 0x8156: 0xC44C, - 0x8157: 0xC44D, - 0x8158: 0xC44E, - 0x8159: 0xEBEA, - 0x815A: 0xEBEB, - 0x815B: 0xC44F, - 0x815C: 0xC450, - 0x815D: 0xC451, - 0x815E: 0xC452, - 0x815F: 0xC453, - 0x8160: 0xEBED, - 0x8161: 0xC454, - 0x8162: 0xC455, - 0x8163: 0xC456, - 0x8164: 0xC457, - 0x8165: 0xD0C8, - 0x8166: 0xC458, - 0x8167: 0xEBF2, - 0x8168: 0xC459, - 0x8169: 0xEBEE, - 0x816A: 0xC45A, - 0x816B: 0xC45B, - 0x816C: 0xC45C, - 0x816D: 0xEBF1, - 0x816E: 0xC8F9, - 0x816F: 0xC45D, - 0x8170: 0xD1FC, - 0x8171: 0xEBEC, - 0x8172: 0xC45E, - 0x8173: 0xC45F, - 0x8174: 0xEBE9, - 0x8175: 0xC460, - 0x8176: 0xC461, - 0x8177: 0xC462, - 0x8178: 0xC463, - 0x8179: 0xB8B9, - 0x817A: 0xCFD9, - 0x817B: 0xC4E5, - 0x817C: 0xEBEF, - 0x817D: 0xEBF0, - 0x817E: 0xCCDA, - 0x817F: 0xCDC8, - 0x8180: 0xB0F2, - 0x8181: 0xC464, - 0x8182: 0xEBF6, - 0x8183: 0xC465, - 0x8184: 0xC466, - 0x8185: 0xC467, - 0x8186: 0xC468, - 0x8187: 0xC469, - 0x8188: 0xEBF5, - 0x8189: 0xC46A, - 0x818A: 0xB2B2, - 0x818B: 0xC46B, - 0x818C: 0xC46C, - 0x818D: 0xC46D, - 0x818E: 0xC46E, - 0x818F: 0xB8E0, - 0x8190: 0xC46F, - 0x8191: 0xEBF7, - 0x8192: 0xC470, - 0x8193: 0xC471, - 0x8194: 0xC472, - 0x8195: 0xC473, - 0x8196: 0xC474, - 0x8197: 0xC475, - 0x8198: 0xB1EC, - 0x8199: 0xC476, - 0x819A: 0xC477, - 0x819B: 0xCCC5, - 0x819C: 0xC4A4, - 0x819D: 0xCFA5, - 0x819E: 0xC478, - 0x819F: 0xC479, - 0x81A0: 0xC47A, - 0x81A1: 0xC47B, - 0x81A2: 0xC47C, - 0x81A3: 0xEBF9, - 0x81A4: 0xC47D, - 0x81A5: 0xC47E, - 0x81A6: 0xECA2, - 0x81A7: 0xC480, - 0x81A8: 0xC5F2, - 0x81A9: 0xC481, - 0x81AA: 0xEBFA, - 0x81AB: 0xC482, - 0x81AC: 0xC483, - 0x81AD: 0xC484, - 0x81AE: 0xC485, - 0x81AF: 0xC486, - 0x81B0: 0xC487, - 0x81B1: 0xC488, - 0x81B2: 0xC489, - 0x81B3: 0xC9C5, - 0x81B4: 0xC48A, - 0x81B5: 0xC48B, - 0x81B6: 0xC48C, - 0x81B7: 0xC48D, - 0x81B8: 0xC48E, - 0x81B9: 0xC48F, - 0x81BA: 0xE2DF, - 0x81BB: 0xEBFE, - 0x81BC: 0xC490, - 0x81BD: 0xC491, - 0x81BE: 0xC492, - 0x81BF: 0xC493, - 0x81C0: 0xCDCE, - 0x81C1: 0xECA1, - 0x81C2: 0xB1DB, - 0x81C3: 0xD3B7, - 0x81C4: 0xC494, - 0x81C5: 0xC495, - 0x81C6: 0xD2DC, - 0x81C7: 0xC496, - 0x81C8: 0xC497, - 0x81C9: 0xC498, - 0x81CA: 0xEBFD, - 0x81CB: 0xC499, - 0x81CC: 0xEBFB, - 0x81CD: 0xC49A, - 0x81CE: 0xC49B, - 0x81CF: 0xC49C, - 0x81D0: 0xC49D, - 0x81D1: 0xC49E, - 0x81D2: 0xC49F, - 0x81D3: 0xC4A0, - 0x81D4: 0xC540, - 0x81D5: 0xC541, - 0x81D6: 0xC542, - 0x81D7: 0xC543, - 0x81D8: 0xC544, - 0x81D9: 0xC545, - 0x81DA: 0xC546, - 0x81DB: 0xC547, - 0x81DC: 0xC548, - 0x81DD: 0xC549, - 0x81DE: 0xC54A, - 0x81DF: 0xC54B, - 0x81E0: 0xC54C, - 0x81E1: 0xC54D, - 0x81E2: 0xC54E, - 0x81E3: 0xB3BC, - 0x81E4: 0xC54F, - 0x81E5: 0xC550, - 0x81E6: 0xC551, - 0x81E7: 0xEAB0, - 0x81E8: 0xC552, - 0x81E9: 0xC553, - 0x81EA: 0xD7D4, - 0x81EB: 0xC554, - 0x81EC: 0xF4AB, - 0x81ED: 0xB3F4, - 0x81EE: 0xC555, - 0x81EF: 0xC556, - 0x81F0: 0xC557, - 0x81F1: 0xC558, - 0x81F2: 0xC559, - 0x81F3: 0xD6C1, - 0x81F4: 0xD6C2, - 0x81F5: 0xC55A, - 0x81F6: 0xC55B, - 0x81F7: 0xC55C, - 0x81F8: 0xC55D, - 0x81F9: 0xC55E, - 0x81FA: 0xC55F, - 0x81FB: 0xD5E9, - 0x81FC: 0xBECA, - 0x81FD: 0xC560, - 0x81FE: 0xF4A7, - 0x81FF: 0xC561, - 0x8200: 0xD2A8, - 0x8201: 0xF4A8, - 0x8202: 0xF4A9, - 0x8203: 0xC562, - 0x8204: 0xF4AA, - 0x8205: 0xBECB, - 0x8206: 0xD3DF, - 0x8207: 0xC563, - 0x8208: 0xC564, - 0x8209: 0xC565, - 0x820A: 0xC566, - 0x820B: 0xC567, - 0x820C: 0xC9E0, - 0x820D: 0xC9E1, - 0x820E: 0xC568, - 0x820F: 0xC569, - 0x8210: 0xF3C2, - 0x8211: 0xC56A, - 0x8212: 0xCAE6, - 0x8213: 0xC56B, - 0x8214: 0xCCF2, - 0x8215: 0xC56C, - 0x8216: 0xC56D, - 0x8217: 0xC56E, - 0x8218: 0xC56F, - 0x8219: 0xC570, - 0x821A: 0xC571, - 0x821B: 0xE2B6, - 0x821C: 0xCBB4, - 0x821D: 0xC572, - 0x821E: 0xCEE8, - 0x821F: 0xD6DB, - 0x8220: 0xC573, - 0x8221: 0xF4AD, - 0x8222: 0xF4AE, - 0x8223: 0xF4AF, - 0x8224: 0xC574, - 0x8225: 0xC575, - 0x8226: 0xC576, - 0x8227: 0xC577, - 0x8228: 0xF4B2, - 0x8229: 0xC578, - 0x822A: 0xBABD, - 0x822B: 0xF4B3, - 0x822C: 0xB0E3, - 0x822D: 0xF4B0, - 0x822E: 0xC579, - 0x822F: 0xF4B1, - 0x8230: 0xBDA2, - 0x8231: 0xB2D5, - 0x8232: 0xC57A, - 0x8233: 0xF4B6, - 0x8234: 0xF4B7, - 0x8235: 0xB6E6, - 0x8236: 0xB2B0, - 0x8237: 0xCFCF, - 0x8238: 0xF4B4, - 0x8239: 0xB4AC, - 0x823A: 0xC57B, - 0x823B: 0xF4B5, - 0x823C: 0xC57C, - 0x823D: 0xC57D, - 0x823E: 0xF4B8, - 0x823F: 0xC57E, - 0x8240: 0xC580, - 0x8241: 0xC581, - 0x8242: 0xC582, - 0x8243: 0xC583, - 0x8244: 0xF4B9, - 0x8245: 0xC584, - 0x8246: 0xC585, - 0x8247: 0xCDA7, - 0x8248: 0xC586, - 0x8249: 0xF4BA, - 0x824A: 0xC587, - 0x824B: 0xF4BB, - 0x824C: 0xC588, - 0x824D: 0xC589, - 0x824E: 0xC58A, - 0x824F: 0xF4BC, - 0x8250: 0xC58B, - 0x8251: 0xC58C, - 0x8252: 0xC58D, - 0x8253: 0xC58E, - 0x8254: 0xC58F, - 0x8255: 0xC590, - 0x8256: 0xC591, - 0x8257: 0xC592, - 0x8258: 0xCBD2, - 0x8259: 0xC593, - 0x825A: 0xF4BD, - 0x825B: 0xC594, - 0x825C: 0xC595, - 0x825D: 0xC596, - 0x825E: 0xC597, - 0x825F: 0xF4BE, - 0x8260: 0xC598, - 0x8261: 0xC599, - 0x8262: 0xC59A, - 0x8263: 0xC59B, - 0x8264: 0xC59C, - 0x8265: 0xC59D, - 0x8266: 0xC59E, - 0x8267: 0xC59F, - 0x8268: 0xF4BF, - 0x8269: 0xC5A0, - 0x826A: 0xC640, - 0x826B: 0xC641, - 0x826C: 0xC642, - 0x826D: 0xC643, - 0x826E: 0xF4DE, - 0x826F: 0xC1BC, - 0x8270: 0xBCE8, - 0x8271: 0xC644, - 0x8272: 0xC9AB, - 0x8273: 0xD1DE, - 0x8274: 0xE5F5, - 0x8275: 0xC645, - 0x8276: 0xC646, - 0x8277: 0xC647, - 0x8278: 0xC648, - 0x8279: 0xDCB3, - 0x827A: 0xD2D5, - 0x827B: 0xC649, - 0x827C: 0xC64A, - 0x827D: 0xDCB4, - 0x827E: 0xB0AC, - 0x827F: 0xDCB5, - 0x8280: 0xC64B, - 0x8281: 0xC64C, - 0x8282: 0xBDDA, - 0x8283: 0xC64D, - 0x8284: 0xDCB9, - 0x8285: 0xC64E, - 0x8286: 0xC64F, - 0x8287: 0xC650, - 0x8288: 0xD8C2, - 0x8289: 0xC651, - 0x828A: 0xDCB7, - 0x828B: 0xD3F3, - 0x828C: 0xC652, - 0x828D: 0xC9D6, - 0x828E: 0xDCBA, - 0x828F: 0xDCB6, - 0x8290: 0xC653, - 0x8291: 0xDCBB, - 0x8292: 0xC3A2, - 0x8293: 0xC654, - 0x8294: 0xC655, - 0x8295: 0xC656, - 0x8296: 0xC657, - 0x8297: 0xDCBC, - 0x8298: 0xDCC5, - 0x8299: 0xDCBD, - 0x829A: 0xC658, - 0x829B: 0xC659, - 0x829C: 0xCEDF, - 0x829D: 0xD6A5, - 0x829E: 0xC65A, - 0x829F: 0xDCCF, - 0x82A0: 0xC65B, - 0x82A1: 0xDCCD, - 0x82A2: 0xC65C, - 0x82A3: 0xC65D, - 0x82A4: 0xDCD2, - 0x82A5: 0xBDE6, - 0x82A6: 0xC2AB, - 0x82A7: 0xC65E, - 0x82A8: 0xDCB8, - 0x82A9: 0xDCCB, - 0x82AA: 0xDCCE, - 0x82AB: 0xDCBE, - 0x82AC: 0xB7D2, - 0x82AD: 0xB0C5, - 0x82AE: 0xDCC7, - 0x82AF: 0xD0BE, - 0x82B0: 0xDCC1, - 0x82B1: 0xBBA8, - 0x82B2: 0xC65F, - 0x82B3: 0xB7BC, - 0x82B4: 0xDCCC, - 0x82B5: 0xC660, - 0x82B6: 0xC661, - 0x82B7: 0xDCC6, - 0x82B8: 0xDCBF, - 0x82B9: 0xC7DB, - 0x82BA: 0xC662, - 0x82BB: 0xC663, - 0x82BC: 0xC664, - 0x82BD: 0xD1BF, - 0x82BE: 0xDCC0, - 0x82BF: 0xC665, - 0x82C0: 0xC666, - 0x82C1: 0xDCCA, - 0x82C2: 0xC667, - 0x82C3: 0xC668, - 0x82C4: 0xDCD0, - 0x82C5: 0xC669, - 0x82C6: 0xC66A, - 0x82C7: 0xCEAD, - 0x82C8: 0xDCC2, - 0x82C9: 0xC66B, - 0x82CA: 0xDCC3, - 0x82CB: 0xDCC8, - 0x82CC: 0xDCC9, - 0x82CD: 0xB2D4, - 0x82CE: 0xDCD1, - 0x82CF: 0xCBD5, - 0x82D0: 0xC66C, - 0x82D1: 0xD4B7, - 0x82D2: 0xDCDB, - 0x82D3: 0xDCDF, - 0x82D4: 0xCCA6, - 0x82D5: 0xDCE6, - 0x82D6: 0xC66D, - 0x82D7: 0xC3E7, - 0x82D8: 0xDCDC, - 0x82D9: 0xC66E, - 0x82DA: 0xC66F, - 0x82DB: 0xBFC1, - 0x82DC: 0xDCD9, - 0x82DD: 0xC670, - 0x82DE: 0xB0FA, - 0x82DF: 0xB9B6, - 0x82E0: 0xDCE5, - 0x82E1: 0xDCD3, - 0x82E2: 0xC671, - 0x82E3: 0xDCC4, - 0x82E4: 0xDCD6, - 0x82E5: 0xC8F4, - 0x82E6: 0xBFE0, - 0x82E7: 0xC672, - 0x82E8: 0xC673, - 0x82E9: 0xC674, - 0x82EA: 0xC675, - 0x82EB: 0xC9BB, - 0x82EC: 0xC676, - 0x82ED: 0xC677, - 0x82EE: 0xC678, - 0x82EF: 0xB1BD, - 0x82F0: 0xC679, - 0x82F1: 0xD3A2, - 0x82F2: 0xC67A, - 0x82F3: 0xC67B, - 0x82F4: 0xDCDA, - 0x82F5: 0xC67C, - 0x82F6: 0xC67D, - 0x82F7: 0xDCD5, - 0x82F8: 0xC67E, - 0x82F9: 0xC6BB, - 0x82FA: 0xC680, - 0x82FB: 0xDCDE, - 0x82FC: 0xC681, - 0x82FD: 0xC682, - 0x82FE: 0xC683, - 0x82FF: 0xC684, - 0x8300: 0xC685, - 0x8301: 0xD7C2, - 0x8302: 0xC3AF, - 0x8303: 0xB7B6, - 0x8304: 0xC7D1, - 0x8305: 0xC3A9, - 0x8306: 0xDCE2, - 0x8307: 0xDCD8, - 0x8308: 0xDCEB, - 0x8309: 0xDCD4, - 0x830A: 0xC686, - 0x830B: 0xC687, - 0x830C: 0xDCDD, - 0x830D: 0xC688, - 0x830E: 0xBEA5, - 0x830F: 0xDCD7, - 0x8310: 0xC689, - 0x8311: 0xDCE0, - 0x8312: 0xC68A, - 0x8313: 0xC68B, - 0x8314: 0xDCE3, - 0x8315: 0xDCE4, - 0x8316: 0xC68C, - 0x8317: 0xDCF8, - 0x8318: 0xC68D, - 0x8319: 0xC68E, - 0x831A: 0xDCE1, - 0x831B: 0xDDA2, - 0x831C: 0xDCE7, - 0x831D: 0xC68F, - 0x831E: 0xC690, - 0x831F: 0xC691, - 0x8320: 0xC692, - 0x8321: 0xC693, - 0x8322: 0xC694, - 0x8323: 0xC695, - 0x8324: 0xC696, - 0x8325: 0xC697, - 0x8326: 0xC698, - 0x8327: 0xBCEB, - 0x8328: 0xB4C4, - 0x8329: 0xC699, - 0x832A: 0xC69A, - 0x832B: 0xC3A3, - 0x832C: 0xB2E7, - 0x832D: 0xDCFA, - 0x832E: 0xC69B, - 0x832F: 0xDCF2, - 0x8330: 0xC69C, - 0x8331: 0xDCEF, - 0x8332: 0xC69D, - 0x8333: 0xDCFC, - 0x8334: 0xDCEE, - 0x8335: 0xD2F0, - 0x8336: 0xB2E8, - 0x8337: 0xC69E, - 0x8338: 0xC8D7, - 0x8339: 0xC8E3, - 0x833A: 0xDCFB, - 0x833B: 0xC69F, - 0x833C: 0xDCED, - 0x833D: 0xC6A0, - 0x833E: 0xC740, - 0x833F: 0xC741, - 0x8340: 0xDCF7, - 0x8341: 0xC742, - 0x8342: 0xC743, - 0x8343: 0xDCF5, - 0x8344: 0xC744, - 0x8345: 0xC745, - 0x8346: 0xBEA3, - 0x8347: 0xDCF4, - 0x8348: 0xC746, - 0x8349: 0xB2DD, - 0x834A: 0xC747, - 0x834B: 0xC748, - 0x834C: 0xC749, - 0x834D: 0xC74A, - 0x834E: 0xC74B, - 0x834F: 0xDCF3, - 0x8350: 0xBCF6, - 0x8351: 0xDCE8, - 0x8352: 0xBBC4, - 0x8353: 0xC74C, - 0x8354: 0xC0F3, - 0x8355: 0xC74D, - 0x8356: 0xC74E, - 0x8357: 0xC74F, - 0x8358: 0xC750, - 0x8359: 0xC751, - 0x835A: 0xBCD4, - 0x835B: 0xDCE9, - 0x835C: 0xDCEA, - 0x835D: 0xC752, - 0x835E: 0xDCF1, - 0x835F: 0xDCF6, - 0x8360: 0xDCF9, - 0x8361: 0xB5B4, - 0x8362: 0xC753, - 0x8363: 0xC8D9, - 0x8364: 0xBBE7, - 0x8365: 0xDCFE, - 0x8366: 0xDCFD, - 0x8367: 0xD3AB, - 0x8368: 0xDDA1, - 0x8369: 0xDDA3, - 0x836A: 0xDDA5, - 0x836B: 0xD2F1, - 0x836C: 0xDDA4, - 0x836D: 0xDDA6, - 0x836E: 0xDDA7, - 0x836F: 0xD2A9, - 0x8370: 0xC754, - 0x8371: 0xC755, - 0x8372: 0xC756, - 0x8373: 0xC757, - 0x8374: 0xC758, - 0x8375: 0xC759, - 0x8376: 0xC75A, - 0x8377: 0xBAC9, - 0x8378: 0xDDA9, - 0x8379: 0xC75B, - 0x837A: 0xC75C, - 0x837B: 0xDDB6, - 0x837C: 0xDDB1, - 0x837D: 0xDDB4, - 0x837E: 0xC75D, - 0x837F: 0xC75E, - 0x8380: 0xC75F, - 0x8381: 0xC760, - 0x8382: 0xC761, - 0x8383: 0xC762, - 0x8384: 0xC763, - 0x8385: 0xDDB0, - 0x8386: 0xC6CE, - 0x8387: 0xC764, - 0x8388: 0xC765, - 0x8389: 0xC0F2, - 0x838A: 0xC766, - 0x838B: 0xC767, - 0x838C: 0xC768, - 0x838D: 0xC769, - 0x838E: 0xC9AF, - 0x838F: 0xC76A, - 0x8390: 0xC76B, - 0x8391: 0xC76C, - 0x8392: 0xDCEC, - 0x8393: 0xDDAE, - 0x8394: 0xC76D, - 0x8395: 0xC76E, - 0x8396: 0xC76F, - 0x8397: 0xC770, - 0x8398: 0xDDB7, - 0x8399: 0xC771, - 0x839A: 0xC772, - 0x839B: 0xDCF0, - 0x839C: 0xDDAF, - 0x839D: 0xC773, - 0x839E: 0xDDB8, - 0x839F: 0xC774, - 0x83A0: 0xDDAC, - 0x83A1: 0xC775, - 0x83A2: 0xC776, - 0x83A3: 0xC777, - 0x83A4: 0xC778, - 0x83A5: 0xC779, - 0x83A6: 0xC77A, - 0x83A7: 0xC77B, - 0x83A8: 0xDDB9, - 0x83A9: 0xDDB3, - 0x83AA: 0xDDAD, - 0x83AB: 0xC4AA, - 0x83AC: 0xC77C, - 0x83AD: 0xC77D, - 0x83AE: 0xC77E, - 0x83AF: 0xC780, - 0x83B0: 0xDDA8, - 0x83B1: 0xC0B3, - 0x83B2: 0xC1AB, - 0x83B3: 0xDDAA, - 0x83B4: 0xDDAB, - 0x83B5: 0xC781, - 0x83B6: 0xDDB2, - 0x83B7: 0xBBF1, - 0x83B8: 0xDDB5, - 0x83B9: 0xD3A8, - 0x83BA: 0xDDBA, - 0x83BB: 0xC782, - 0x83BC: 0xDDBB, - 0x83BD: 0xC3A7, - 0x83BE: 0xC783, - 0x83BF: 0xC784, - 0x83C0: 0xDDD2, - 0x83C1: 0xDDBC, - 0x83C2: 0xC785, - 0x83C3: 0xC786, - 0x83C4: 0xC787, - 0x83C5: 0xDDD1, - 0x83C6: 0xC788, - 0x83C7: 0xB9BD, - 0x83C8: 0xC789, - 0x83C9: 0xC78A, - 0x83CA: 0xBED5, - 0x83CB: 0xC78B, - 0x83CC: 0xBEFA, - 0x83CD: 0xC78C, - 0x83CE: 0xC78D, - 0x83CF: 0xBACA, - 0x83D0: 0xC78E, - 0x83D1: 0xC78F, - 0x83D2: 0xC790, - 0x83D3: 0xC791, - 0x83D4: 0xDDCA, - 0x83D5: 0xC792, - 0x83D6: 0xDDC5, - 0x83D7: 0xC793, - 0x83D8: 0xDDBF, - 0x83D9: 0xC794, - 0x83DA: 0xC795, - 0x83DB: 0xC796, - 0x83DC: 0xB2CB, - 0x83DD: 0xDDC3, - 0x83DE: 0xC797, - 0x83DF: 0xDDCB, - 0x83E0: 0xB2A4, - 0x83E1: 0xDDD5, - 0x83E2: 0xC798, - 0x83E3: 0xC799, - 0x83E4: 0xC79A, - 0x83E5: 0xDDBE, - 0x83E6: 0xC79B, - 0x83E7: 0xC79C, - 0x83E8: 0xC79D, - 0x83E9: 0xC6D0, - 0x83EA: 0xDDD0, - 0x83EB: 0xC79E, - 0x83EC: 0xC79F, - 0x83ED: 0xC7A0, - 0x83EE: 0xC840, - 0x83EF: 0xC841, - 0x83F0: 0xDDD4, - 0x83F1: 0xC1E2, - 0x83F2: 0xB7C6, - 0x83F3: 0xC842, - 0x83F4: 0xC843, - 0x83F5: 0xC844, - 0x83F6: 0xC845, - 0x83F7: 0xC846, - 0x83F8: 0xDDCE, - 0x83F9: 0xDDCF, - 0x83FA: 0xC847, - 0x83FB: 0xC848, - 0x83FC: 0xC849, - 0x83FD: 0xDDC4, - 0x83FE: 0xC84A, - 0x83FF: 0xC84B, - 0x8400: 0xC84C, - 0x8401: 0xDDBD, - 0x8402: 0xC84D, - 0x8403: 0xDDCD, - 0x8404: 0xCCD1, - 0x8405: 0xC84E, - 0x8406: 0xDDC9, - 0x8407: 0xC84F, - 0x8408: 0xC850, - 0x8409: 0xC851, - 0x840A: 0xC852, - 0x840B: 0xDDC2, - 0x840C: 0xC3C8, - 0x840D: 0xC6BC, - 0x840E: 0xCEAE, - 0x840F: 0xDDCC, - 0x8410: 0xC853, - 0x8411: 0xDDC8, - 0x8412: 0xC854, - 0x8413: 0xC855, - 0x8414: 0xC856, - 0x8415: 0xC857, - 0x8416: 0xC858, - 0x8417: 0xC859, - 0x8418: 0xDDC1, - 0x8419: 0xC85A, - 0x841A: 0xC85B, - 0x841B: 0xC85C, - 0x841C: 0xDDC6, - 0x841D: 0xC2DC, - 0x841E: 0xC85D, - 0x841F: 0xC85E, - 0x8420: 0xC85F, - 0x8421: 0xC860, - 0x8422: 0xC861, - 0x8423: 0xC862, - 0x8424: 0xD3A9, - 0x8425: 0xD3AA, - 0x8426: 0xDDD3, - 0x8427: 0xCFF4, - 0x8428: 0xC8F8, - 0x8429: 0xC863, - 0x842A: 0xC864, - 0x842B: 0xC865, - 0x842C: 0xC866, - 0x842D: 0xC867, - 0x842E: 0xC868, - 0x842F: 0xC869, - 0x8430: 0xC86A, - 0x8431: 0xDDE6, - 0x8432: 0xC86B, - 0x8433: 0xC86C, - 0x8434: 0xC86D, - 0x8435: 0xC86E, - 0x8436: 0xC86F, - 0x8437: 0xC870, - 0x8438: 0xDDC7, - 0x8439: 0xC871, - 0x843A: 0xC872, - 0x843B: 0xC873, - 0x843C: 0xDDE0, - 0x843D: 0xC2E4, - 0x843E: 0xC874, - 0x843F: 0xC875, - 0x8440: 0xC876, - 0x8441: 0xC877, - 0x8442: 0xC878, - 0x8443: 0xC879, - 0x8444: 0xC87A, - 0x8445: 0xC87B, - 0x8446: 0xDDE1, - 0x8447: 0xC87C, - 0x8448: 0xC87D, - 0x8449: 0xC87E, - 0x844A: 0xC880, - 0x844B: 0xC881, - 0x844C: 0xC882, - 0x844D: 0xC883, - 0x844E: 0xC884, - 0x844F: 0xC885, - 0x8450: 0xC886, - 0x8451: 0xDDD7, - 0x8452: 0xC887, - 0x8453: 0xC888, - 0x8454: 0xC889, - 0x8455: 0xC88A, - 0x8456: 0xC88B, - 0x8457: 0xD6F8, - 0x8458: 0xC88C, - 0x8459: 0xDDD9, - 0x845A: 0xDDD8, - 0x845B: 0xB8F0, - 0x845C: 0xDDD6, - 0x845D: 0xC88D, - 0x845E: 0xC88E, - 0x845F: 0xC88F, - 0x8460: 0xC890, - 0x8461: 0xC6CF, - 0x8462: 0xC891, - 0x8463: 0xB6AD, - 0x8464: 0xC892, - 0x8465: 0xC893, - 0x8466: 0xC894, - 0x8467: 0xC895, - 0x8468: 0xC896, - 0x8469: 0xDDE2, - 0x846A: 0xC897, - 0x846B: 0xBAF9, - 0x846C: 0xD4E1, - 0x846D: 0xDDE7, - 0x846E: 0xC898, - 0x846F: 0xC899, - 0x8470: 0xC89A, - 0x8471: 0xB4D0, - 0x8472: 0xC89B, - 0x8473: 0xDDDA, - 0x8474: 0xC89C, - 0x8475: 0xBFFB, - 0x8476: 0xDDE3, - 0x8477: 0xC89D, - 0x8478: 0xDDDF, - 0x8479: 0xC89E, - 0x847A: 0xDDDD, - 0x847B: 0xC89F, - 0x847C: 0xC8A0, - 0x847D: 0xC940, - 0x847E: 0xC941, - 0x847F: 0xC942, - 0x8480: 0xC943, - 0x8481: 0xC944, - 0x8482: 0xB5D9, - 0x8483: 0xC945, - 0x8484: 0xC946, - 0x8485: 0xC947, - 0x8486: 0xC948, - 0x8487: 0xDDDB, - 0x8488: 0xDDDC, - 0x8489: 0xDDDE, - 0x848A: 0xC949, - 0x848B: 0xBDAF, - 0x848C: 0xDDE4, - 0x848D: 0xC94A, - 0x848E: 0xDDE5, - 0x848F: 0xC94B, - 0x8490: 0xC94C, - 0x8491: 0xC94D, - 0x8492: 0xC94E, - 0x8493: 0xC94F, - 0x8494: 0xC950, - 0x8495: 0xC951, - 0x8496: 0xC952, - 0x8497: 0xDDF5, - 0x8498: 0xC953, - 0x8499: 0xC3C9, - 0x849A: 0xC954, - 0x849B: 0xC955, - 0x849C: 0xCBE2, - 0x849D: 0xC956, - 0x849E: 0xC957, - 0x849F: 0xC958, - 0x84A0: 0xC959, - 0x84A1: 0xDDF2, - 0x84A2: 0xC95A, - 0x84A3: 0xC95B, - 0x84A4: 0xC95C, - 0x84A5: 0xC95D, - 0x84A6: 0xC95E, - 0x84A7: 0xC95F, - 0x84A8: 0xC960, - 0x84A9: 0xC961, - 0x84AA: 0xC962, - 0x84AB: 0xC963, - 0x84AC: 0xC964, - 0x84AD: 0xC965, - 0x84AE: 0xC966, - 0x84AF: 0xD8E1, - 0x84B0: 0xC967, - 0x84B1: 0xC968, - 0x84B2: 0xC6D1, - 0x84B3: 0xC969, - 0x84B4: 0xDDF4, - 0x84B5: 0xC96A, - 0x84B6: 0xC96B, - 0x84B7: 0xC96C, - 0x84B8: 0xD5F4, - 0x84B9: 0xDDF3, - 0x84BA: 0xDDF0, - 0x84BB: 0xC96D, - 0x84BC: 0xC96E, - 0x84BD: 0xDDEC, - 0x84BE: 0xC96F, - 0x84BF: 0xDDEF, - 0x84C0: 0xC970, - 0x84C1: 0xDDE8, - 0x84C2: 0xC971, - 0x84C3: 0xC972, - 0x84C4: 0xD0EE, - 0x84C5: 0xC973, - 0x84C6: 0xC974, - 0x84C7: 0xC975, - 0x84C8: 0xC976, - 0x84C9: 0xC8D8, - 0x84CA: 0xDDEE, - 0x84CB: 0xC977, - 0x84CC: 0xC978, - 0x84CD: 0xDDE9, - 0x84CE: 0xC979, - 0x84CF: 0xC97A, - 0x84D0: 0xDDEA, - 0x84D1: 0xCBF2, - 0x84D2: 0xC97B, - 0x84D3: 0xDDED, - 0x84D4: 0xC97C, - 0x84D5: 0xC97D, - 0x84D6: 0xB1CD, - 0x84D7: 0xC97E, - 0x84D8: 0xC980, - 0x84D9: 0xC981, - 0x84DA: 0xC982, - 0x84DB: 0xC983, - 0x84DC: 0xC984, - 0x84DD: 0xC0B6, - 0x84DE: 0xC985, - 0x84DF: 0xBCBB, - 0x84E0: 0xDDF1, - 0x84E1: 0xC986, - 0x84E2: 0xC987, - 0x84E3: 0xDDF7, - 0x84E4: 0xC988, - 0x84E5: 0xDDF6, - 0x84E6: 0xDDEB, - 0x84E7: 0xC989, - 0x84E8: 0xC98A, - 0x84E9: 0xC98B, - 0x84EA: 0xC98C, - 0x84EB: 0xC98D, - 0x84EC: 0xC5EE, - 0x84ED: 0xC98E, - 0x84EE: 0xC98F, - 0x84EF: 0xC990, - 0x84F0: 0xDDFB, - 0x84F1: 0xC991, - 0x84F2: 0xC992, - 0x84F3: 0xC993, - 0x84F4: 0xC994, - 0x84F5: 0xC995, - 0x84F6: 0xC996, - 0x84F7: 0xC997, - 0x84F8: 0xC998, - 0x84F9: 0xC999, - 0x84FA: 0xC99A, - 0x84FB: 0xC99B, - 0x84FC: 0xDEA4, - 0x84FD: 0xC99C, - 0x84FE: 0xC99D, - 0x84FF: 0xDEA3, - 0x8500: 0xC99E, - 0x8501: 0xC99F, - 0x8502: 0xC9A0, - 0x8503: 0xCA40, - 0x8504: 0xCA41, - 0x8505: 0xCA42, - 0x8506: 0xCA43, - 0x8507: 0xCA44, - 0x8508: 0xCA45, - 0x8509: 0xCA46, - 0x850A: 0xCA47, - 0x850B: 0xCA48, - 0x850C: 0xDDF8, - 0x850D: 0xCA49, - 0x850E: 0xCA4A, - 0x850F: 0xCA4B, - 0x8510: 0xCA4C, - 0x8511: 0xC3EF, - 0x8512: 0xCA4D, - 0x8513: 0xC2FB, - 0x8514: 0xCA4E, - 0x8515: 0xCA4F, - 0x8516: 0xCA50, - 0x8517: 0xD5E1, - 0x8518: 0xCA51, - 0x8519: 0xCA52, - 0x851A: 0xCEB5, - 0x851B: 0xCA53, - 0x851C: 0xCA54, - 0x851D: 0xCA55, - 0x851E: 0xCA56, - 0x851F: 0xDDFD, - 0x8520: 0xCA57, - 0x8521: 0xB2CC, - 0x8522: 0xCA58, - 0x8523: 0xCA59, - 0x8524: 0xCA5A, - 0x8525: 0xCA5B, - 0x8526: 0xCA5C, - 0x8527: 0xCA5D, - 0x8528: 0xCA5E, - 0x8529: 0xCA5F, - 0x852A: 0xCA60, - 0x852B: 0xC4E8, - 0x852C: 0xCADF, - 0x852D: 0xCA61, - 0x852E: 0xCA62, - 0x852F: 0xCA63, - 0x8530: 0xCA64, - 0x8531: 0xCA65, - 0x8532: 0xCA66, - 0x8533: 0xCA67, - 0x8534: 0xCA68, - 0x8535: 0xCA69, - 0x8536: 0xCA6A, - 0x8537: 0xC7BE, - 0x8538: 0xDDFA, - 0x8539: 0xDDFC, - 0x853A: 0xDDFE, - 0x853B: 0xDEA2, - 0x853C: 0xB0AA, - 0x853D: 0xB1CE, - 0x853E: 0xCA6B, - 0x853F: 0xCA6C, - 0x8540: 0xCA6D, - 0x8541: 0xCA6E, - 0x8542: 0xCA6F, - 0x8543: 0xDEAC, - 0x8544: 0xCA70, - 0x8545: 0xCA71, - 0x8546: 0xCA72, - 0x8547: 0xCA73, - 0x8548: 0xDEA6, - 0x8549: 0xBDB6, - 0x854A: 0xC8EF, - 0x854B: 0xCA74, - 0x854C: 0xCA75, - 0x854D: 0xCA76, - 0x854E: 0xCA77, - 0x854F: 0xCA78, - 0x8550: 0xCA79, - 0x8551: 0xCA7A, - 0x8552: 0xCA7B, - 0x8553: 0xCA7C, - 0x8554: 0xCA7D, - 0x8555: 0xCA7E, - 0x8556: 0xDEA1, - 0x8557: 0xCA80, - 0x8558: 0xCA81, - 0x8559: 0xDEA5, - 0x855A: 0xCA82, - 0x855B: 0xCA83, - 0x855C: 0xCA84, - 0x855D: 0xCA85, - 0x855E: 0xDEA9, - 0x855F: 0xCA86, - 0x8560: 0xCA87, - 0x8561: 0xCA88, - 0x8562: 0xCA89, - 0x8563: 0xCA8A, - 0x8564: 0xDEA8, - 0x8565: 0xCA8B, - 0x8566: 0xCA8C, - 0x8567: 0xCA8D, - 0x8568: 0xDEA7, - 0x8569: 0xCA8E, - 0x856A: 0xCA8F, - 0x856B: 0xCA90, - 0x856C: 0xCA91, - 0x856D: 0xCA92, - 0x856E: 0xCA93, - 0x856F: 0xCA94, - 0x8570: 0xCA95, - 0x8571: 0xCA96, - 0x8572: 0xDEAD, - 0x8573: 0xCA97, - 0x8574: 0xD4CC, - 0x8575: 0xCA98, - 0x8576: 0xCA99, - 0x8577: 0xCA9A, - 0x8578: 0xCA9B, - 0x8579: 0xDEB3, - 0x857A: 0xDEAA, - 0x857B: 0xDEAE, - 0x857C: 0xCA9C, - 0x857D: 0xCA9D, - 0x857E: 0xC0D9, - 0x857F: 0xCA9E, - 0x8580: 0xCA9F, - 0x8581: 0xCAA0, - 0x8582: 0xCB40, - 0x8583: 0xCB41, - 0x8584: 0xB1A1, - 0x8585: 0xDEB6, - 0x8586: 0xCB42, - 0x8587: 0xDEB1, - 0x8588: 0xCB43, - 0x8589: 0xCB44, - 0x858A: 0xCB45, - 0x858B: 0xCB46, - 0x858C: 0xCB47, - 0x858D: 0xCB48, - 0x858E: 0xCB49, - 0x858F: 0xDEB2, - 0x8590: 0xCB4A, - 0x8591: 0xCB4B, - 0x8592: 0xCB4C, - 0x8593: 0xCB4D, - 0x8594: 0xCB4E, - 0x8595: 0xCB4F, - 0x8596: 0xCB50, - 0x8597: 0xCB51, - 0x8598: 0xCB52, - 0x8599: 0xCB53, - 0x859A: 0xCB54, - 0x859B: 0xD1A6, - 0x859C: 0xDEB5, - 0x859D: 0xCB55, - 0x859E: 0xCB56, - 0x859F: 0xCB57, - 0x85A0: 0xCB58, - 0x85A1: 0xCB59, - 0x85A2: 0xCB5A, - 0x85A3: 0xCB5B, - 0x85A4: 0xDEAF, - 0x85A5: 0xCB5C, - 0x85A6: 0xCB5D, - 0x85A7: 0xCB5E, - 0x85A8: 0xDEB0, - 0x85A9: 0xCB5F, - 0x85AA: 0xD0BD, - 0x85AB: 0xCB60, - 0x85AC: 0xCB61, - 0x85AD: 0xCB62, - 0x85AE: 0xDEB4, - 0x85AF: 0xCAED, - 0x85B0: 0xDEB9, - 0x85B1: 0xCB63, - 0x85B2: 0xCB64, - 0x85B3: 0xCB65, - 0x85B4: 0xCB66, - 0x85B5: 0xCB67, - 0x85B6: 0xCB68, - 0x85B7: 0xDEB8, - 0x85B8: 0xCB69, - 0x85B9: 0xDEB7, - 0x85BA: 0xCB6A, - 0x85BB: 0xCB6B, - 0x85BC: 0xCB6C, - 0x85BD: 0xCB6D, - 0x85BE: 0xCB6E, - 0x85BF: 0xCB6F, - 0x85C0: 0xCB70, - 0x85C1: 0xDEBB, - 0x85C2: 0xCB71, - 0x85C3: 0xCB72, - 0x85C4: 0xCB73, - 0x85C5: 0xCB74, - 0x85C6: 0xCB75, - 0x85C7: 0xCB76, - 0x85C8: 0xCB77, - 0x85C9: 0xBDE5, - 0x85CA: 0xCB78, - 0x85CB: 0xCB79, - 0x85CC: 0xCB7A, - 0x85CD: 0xCB7B, - 0x85CE: 0xCB7C, - 0x85CF: 0xB2D8, - 0x85D0: 0xC3EA, - 0x85D1: 0xCB7D, - 0x85D2: 0xCB7E, - 0x85D3: 0xDEBA, - 0x85D4: 0xCB80, - 0x85D5: 0xC5BA, - 0x85D6: 0xCB81, - 0x85D7: 0xCB82, - 0x85D8: 0xCB83, - 0x85D9: 0xCB84, - 0x85DA: 0xCB85, - 0x85DB: 0xCB86, - 0x85DC: 0xDEBC, - 0x85DD: 0xCB87, - 0x85DE: 0xCB88, - 0x85DF: 0xCB89, - 0x85E0: 0xCB8A, - 0x85E1: 0xCB8B, - 0x85E2: 0xCB8C, - 0x85E3: 0xCB8D, - 0x85E4: 0xCCD9, - 0x85E5: 0xCB8E, - 0x85E6: 0xCB8F, - 0x85E7: 0xCB90, - 0x85E8: 0xCB91, - 0x85E9: 0xB7AA, - 0x85EA: 0xCB92, - 0x85EB: 0xCB93, - 0x85EC: 0xCB94, - 0x85ED: 0xCB95, - 0x85EE: 0xCB96, - 0x85EF: 0xCB97, - 0x85F0: 0xCB98, - 0x85F1: 0xCB99, - 0x85F2: 0xCB9A, - 0x85F3: 0xCB9B, - 0x85F4: 0xCB9C, - 0x85F5: 0xCB9D, - 0x85F6: 0xCB9E, - 0x85F7: 0xCB9F, - 0x85F8: 0xCBA0, - 0x85F9: 0xCC40, - 0x85FA: 0xCC41, - 0x85FB: 0xD4E5, - 0x85FC: 0xCC42, - 0x85FD: 0xCC43, - 0x85FE: 0xCC44, - 0x85FF: 0xDEBD, - 0x8600: 0xCC45, - 0x8601: 0xCC46, - 0x8602: 0xCC47, - 0x8603: 0xCC48, - 0x8604: 0xCC49, - 0x8605: 0xDEBF, - 0x8606: 0xCC4A, - 0x8607: 0xCC4B, - 0x8608: 0xCC4C, - 0x8609: 0xCC4D, - 0x860A: 0xCC4E, - 0x860B: 0xCC4F, - 0x860C: 0xCC50, - 0x860D: 0xCC51, - 0x860E: 0xCC52, - 0x860F: 0xCC53, - 0x8610: 0xCC54, - 0x8611: 0xC4A2, - 0x8612: 0xCC55, - 0x8613: 0xCC56, - 0x8614: 0xCC57, - 0x8615: 0xCC58, - 0x8616: 0xDEC1, - 0x8617: 0xCC59, - 0x8618: 0xCC5A, - 0x8619: 0xCC5B, - 0x861A: 0xCC5C, - 0x861B: 0xCC5D, - 0x861C: 0xCC5E, - 0x861D: 0xCC5F, - 0x861E: 0xCC60, - 0x861F: 0xCC61, - 0x8620: 0xCC62, - 0x8621: 0xCC63, - 0x8622: 0xCC64, - 0x8623: 0xCC65, - 0x8624: 0xCC66, - 0x8625: 0xCC67, - 0x8626: 0xCC68, - 0x8627: 0xDEBE, - 0x8628: 0xCC69, - 0x8629: 0xDEC0, - 0x862A: 0xCC6A, - 0x862B: 0xCC6B, - 0x862C: 0xCC6C, - 0x862D: 0xCC6D, - 0x862E: 0xCC6E, - 0x862F: 0xCC6F, - 0x8630: 0xCC70, - 0x8631: 0xCC71, - 0x8632: 0xCC72, - 0x8633: 0xCC73, - 0x8634: 0xCC74, - 0x8635: 0xCC75, - 0x8636: 0xCC76, - 0x8637: 0xCC77, - 0x8638: 0xD5BA, - 0x8639: 0xCC78, - 0x863A: 0xCC79, - 0x863B: 0xCC7A, - 0x863C: 0xDEC2, - 0x863D: 0xCC7B, - 0x863E: 0xCC7C, - 0x863F: 0xCC7D, - 0x8640: 0xCC7E, - 0x8641: 0xCC80, - 0x8642: 0xCC81, - 0x8643: 0xCC82, - 0x8644: 0xCC83, - 0x8645: 0xCC84, - 0x8646: 0xCC85, - 0x8647: 0xCC86, - 0x8648: 0xCC87, - 0x8649: 0xCC88, - 0x864A: 0xCC89, - 0x864B: 0xCC8A, - 0x864C: 0xCC8B, - 0x864D: 0xF2AE, - 0x864E: 0xBBA2, - 0x864F: 0xC2B2, - 0x8650: 0xC5B0, - 0x8651: 0xC2C7, - 0x8652: 0xCC8C, - 0x8653: 0xCC8D, - 0x8654: 0xF2AF, - 0x8655: 0xCC8E, - 0x8656: 0xCC8F, - 0x8657: 0xCC90, - 0x8658: 0xCC91, - 0x8659: 0xCC92, - 0x865A: 0xD0E9, - 0x865B: 0xCC93, - 0x865C: 0xCC94, - 0x865D: 0xCC95, - 0x865E: 0xD3DD, - 0x865F: 0xCC96, - 0x8660: 0xCC97, - 0x8661: 0xCC98, - 0x8662: 0xEBBD, - 0x8663: 0xCC99, - 0x8664: 0xCC9A, - 0x8665: 0xCC9B, - 0x8666: 0xCC9C, - 0x8667: 0xCC9D, - 0x8668: 0xCC9E, - 0x8669: 0xCC9F, - 0x866A: 0xCCA0, - 0x866B: 0xB3E6, - 0x866C: 0xF2B0, - 0x866D: 0xCD40, - 0x866E: 0xF2B1, - 0x866F: 0xCD41, - 0x8670: 0xCD42, - 0x8671: 0xCAAD, - 0x8672: 0xCD43, - 0x8673: 0xCD44, - 0x8674: 0xCD45, - 0x8675: 0xCD46, - 0x8676: 0xCD47, - 0x8677: 0xCD48, - 0x8678: 0xCD49, - 0x8679: 0xBAE7, - 0x867A: 0xF2B3, - 0x867B: 0xF2B5, - 0x867C: 0xF2B4, - 0x867D: 0xCBE4, - 0x867E: 0xCFBA, - 0x867F: 0xF2B2, - 0x8680: 0xCAB4, - 0x8681: 0xD2CF, - 0x8682: 0xC2EC, - 0x8683: 0xCD4A, - 0x8684: 0xCD4B, - 0x8685: 0xCD4C, - 0x8686: 0xCD4D, - 0x8687: 0xCD4E, - 0x8688: 0xCD4F, - 0x8689: 0xCD50, - 0x868A: 0xCEC3, - 0x868B: 0xF2B8, - 0x868C: 0xB0F6, - 0x868D: 0xF2B7, - 0x868E: 0xCD51, - 0x868F: 0xCD52, - 0x8690: 0xCD53, - 0x8691: 0xCD54, - 0x8692: 0xCD55, - 0x8693: 0xF2BE, - 0x8694: 0xCD56, - 0x8695: 0xB2CF, - 0x8696: 0xCD57, - 0x8697: 0xCD58, - 0x8698: 0xCD59, - 0x8699: 0xCD5A, - 0x869A: 0xCD5B, - 0x869B: 0xCD5C, - 0x869C: 0xD1C1, - 0x869D: 0xF2BA, - 0x869E: 0xCD5D, - 0x869F: 0xCD5E, - 0x86A0: 0xCD5F, - 0x86A1: 0xCD60, - 0x86A2: 0xCD61, - 0x86A3: 0xF2BC, - 0x86A4: 0xD4E9, - 0x86A5: 0xCD62, - 0x86A6: 0xCD63, - 0x86A7: 0xF2BB, - 0x86A8: 0xF2B6, - 0x86A9: 0xF2BF, - 0x86AA: 0xF2BD, - 0x86AB: 0xCD64, - 0x86AC: 0xF2B9, - 0x86AD: 0xCD65, - 0x86AE: 0xCD66, - 0x86AF: 0xF2C7, - 0x86B0: 0xF2C4, - 0x86B1: 0xF2C6, - 0x86B2: 0xCD67, - 0x86B3: 0xCD68, - 0x86B4: 0xF2CA, - 0x86B5: 0xF2C2, - 0x86B6: 0xF2C0, - 0x86B7: 0xCD69, - 0x86B8: 0xCD6A, - 0x86B9: 0xCD6B, - 0x86BA: 0xF2C5, - 0x86BB: 0xCD6C, - 0x86BC: 0xCD6D, - 0x86BD: 0xCD6E, - 0x86BE: 0xCD6F, - 0x86BF: 0xCD70, - 0x86C0: 0xD6FB, - 0x86C1: 0xCD71, - 0x86C2: 0xCD72, - 0x86C3: 0xCD73, - 0x86C4: 0xF2C1, - 0x86C5: 0xCD74, - 0x86C6: 0xC7F9, - 0x86C7: 0xC9DF, - 0x86C8: 0xCD75, - 0x86C9: 0xF2C8, - 0x86CA: 0xB9C6, - 0x86CB: 0xB5B0, - 0x86CC: 0xCD76, - 0x86CD: 0xCD77, - 0x86CE: 0xF2C3, - 0x86CF: 0xF2C9, - 0x86D0: 0xF2D0, - 0x86D1: 0xF2D6, - 0x86D2: 0xCD78, - 0x86D3: 0xCD79, - 0x86D4: 0xBBD7, - 0x86D5: 0xCD7A, - 0x86D6: 0xCD7B, - 0x86D7: 0xCD7C, - 0x86D8: 0xF2D5, - 0x86D9: 0xCDDC, - 0x86DA: 0xCD7D, - 0x86DB: 0xD6EB, - 0x86DC: 0xCD7E, - 0x86DD: 0xCD80, - 0x86DE: 0xF2D2, - 0x86DF: 0xF2D4, - 0x86E0: 0xCD81, - 0x86E1: 0xCD82, - 0x86E2: 0xCD83, - 0x86E3: 0xCD84, - 0x86E4: 0xB8F2, - 0x86E5: 0xCD85, - 0x86E6: 0xCD86, - 0x86E7: 0xCD87, - 0x86E8: 0xCD88, - 0x86E9: 0xF2CB, - 0x86EA: 0xCD89, - 0x86EB: 0xCD8A, - 0x86EC: 0xCD8B, - 0x86ED: 0xF2CE, - 0x86EE: 0xC2F9, - 0x86EF: 0xCD8C, - 0x86F0: 0xD5DD, - 0x86F1: 0xF2CC, - 0x86F2: 0xF2CD, - 0x86F3: 0xF2CF, - 0x86F4: 0xF2D3, - 0x86F5: 0xCD8D, - 0x86F6: 0xCD8E, - 0x86F7: 0xCD8F, - 0x86F8: 0xF2D9, - 0x86F9: 0xD3BC, - 0x86FA: 0xCD90, - 0x86FB: 0xCD91, - 0x86FC: 0xCD92, - 0x86FD: 0xCD93, - 0x86FE: 0xB6EA, - 0x86FF: 0xCD94, - 0x8700: 0xCAF1, - 0x8701: 0xCD95, - 0x8702: 0xB7E4, - 0x8703: 0xF2D7, - 0x8704: 0xCD96, - 0x8705: 0xCD97, - 0x8706: 0xCD98, - 0x8707: 0xF2D8, - 0x8708: 0xF2DA, - 0x8709: 0xF2DD, - 0x870A: 0xF2DB, - 0x870B: 0xCD99, - 0x870C: 0xCD9A, - 0x870D: 0xF2DC, - 0x870E: 0xCD9B, - 0x870F: 0xCD9C, - 0x8710: 0xCD9D, - 0x8711: 0xCD9E, - 0x8712: 0xD1D1, - 0x8713: 0xF2D1, - 0x8714: 0xCD9F, - 0x8715: 0xCDC9, - 0x8716: 0xCDA0, - 0x8717: 0xCECF, - 0x8718: 0xD6A9, - 0x8719: 0xCE40, - 0x871A: 0xF2E3, - 0x871B: 0xCE41, - 0x871C: 0xC3DB, - 0x871D: 0xCE42, - 0x871E: 0xF2E0, - 0x871F: 0xCE43, - 0x8720: 0xCE44, - 0x8721: 0xC0AF, - 0x8722: 0xF2EC, - 0x8723: 0xF2DE, - 0x8724: 0xCE45, - 0x8725: 0xF2E1, - 0x8726: 0xCE46, - 0x8727: 0xCE47, - 0x8728: 0xCE48, - 0x8729: 0xF2E8, - 0x872A: 0xCE49, - 0x872B: 0xCE4A, - 0x872C: 0xCE4B, - 0x872D: 0xCE4C, - 0x872E: 0xF2E2, - 0x872F: 0xCE4D, - 0x8730: 0xCE4E, - 0x8731: 0xF2E7, - 0x8732: 0xCE4F, - 0x8733: 0xCE50, - 0x8734: 0xF2E6, - 0x8735: 0xCE51, - 0x8736: 0xCE52, - 0x8737: 0xF2E9, - 0x8738: 0xCE53, - 0x8739: 0xCE54, - 0x873A: 0xCE55, - 0x873B: 0xF2DF, - 0x873C: 0xCE56, - 0x873D: 0xCE57, - 0x873E: 0xF2E4, - 0x873F: 0xF2EA, - 0x8740: 0xCE58, - 0x8741: 0xCE59, - 0x8742: 0xCE5A, - 0x8743: 0xCE5B, - 0x8744: 0xCE5C, - 0x8745: 0xCE5D, - 0x8746: 0xCE5E, - 0x8747: 0xD3AC, - 0x8748: 0xF2E5, - 0x8749: 0xB2F5, - 0x874A: 0xCE5F, - 0x874B: 0xCE60, - 0x874C: 0xF2F2, - 0x874D: 0xCE61, - 0x874E: 0xD0AB, - 0x874F: 0xCE62, - 0x8750: 0xCE63, - 0x8751: 0xCE64, - 0x8752: 0xCE65, - 0x8753: 0xF2F5, - 0x8754: 0xCE66, - 0x8755: 0xCE67, - 0x8756: 0xCE68, - 0x8757: 0xBBC8, - 0x8758: 0xCE69, - 0x8759: 0xF2F9, - 0x875A: 0xCE6A, - 0x875B: 0xCE6B, - 0x875C: 0xCE6C, - 0x875D: 0xCE6D, - 0x875E: 0xCE6E, - 0x875F: 0xCE6F, - 0x8760: 0xF2F0, - 0x8761: 0xCE70, - 0x8762: 0xCE71, - 0x8763: 0xF2F6, - 0x8764: 0xF2F8, - 0x8765: 0xF2FA, - 0x8766: 0xCE72, - 0x8767: 0xCE73, - 0x8768: 0xCE74, - 0x8769: 0xCE75, - 0x876A: 0xCE76, - 0x876B: 0xCE77, - 0x876C: 0xCE78, - 0x876D: 0xCE79, - 0x876E: 0xF2F3, - 0x876F: 0xCE7A, - 0x8770: 0xF2F1, - 0x8771: 0xCE7B, - 0x8772: 0xCE7C, - 0x8773: 0xCE7D, - 0x8774: 0xBAFB, - 0x8775: 0xCE7E, - 0x8776: 0xB5FB, - 0x8777: 0xCE80, - 0x8778: 0xCE81, - 0x8779: 0xCE82, - 0x877A: 0xCE83, - 0x877B: 0xF2EF, - 0x877C: 0xF2F7, - 0x877D: 0xF2ED, - 0x877E: 0xF2EE, - 0x877F: 0xCE84, - 0x8780: 0xCE85, - 0x8781: 0xCE86, - 0x8782: 0xF2EB, - 0x8783: 0xF3A6, - 0x8784: 0xCE87, - 0x8785: 0xF3A3, - 0x8786: 0xCE88, - 0x8787: 0xCE89, - 0x8788: 0xF3A2, - 0x8789: 0xCE8A, - 0x878A: 0xCE8B, - 0x878B: 0xF2F4, - 0x878C: 0xCE8C, - 0x878D: 0xC8DA, - 0x878E: 0xCE8D, - 0x878F: 0xCE8E, - 0x8790: 0xCE8F, - 0x8791: 0xCE90, - 0x8792: 0xCE91, - 0x8793: 0xF2FB, - 0x8794: 0xCE92, - 0x8795: 0xCE93, - 0x8796: 0xCE94, - 0x8797: 0xF3A5, - 0x8798: 0xCE95, - 0x8799: 0xCE96, - 0x879A: 0xCE97, - 0x879B: 0xCE98, - 0x879C: 0xCE99, - 0x879D: 0xCE9A, - 0x879E: 0xCE9B, - 0x879F: 0xC3F8, - 0x87A0: 0xCE9C, - 0x87A1: 0xCE9D, - 0x87A2: 0xCE9E, - 0x87A3: 0xCE9F, - 0x87A4: 0xCEA0, - 0x87A5: 0xCF40, - 0x87A6: 0xCF41, - 0x87A7: 0xCF42, - 0x87A8: 0xF2FD, - 0x87A9: 0xCF43, - 0x87AA: 0xCF44, - 0x87AB: 0xF3A7, - 0x87AC: 0xF3A9, - 0x87AD: 0xF3A4, - 0x87AE: 0xCF45, - 0x87AF: 0xF2FC, - 0x87B0: 0xCF46, - 0x87B1: 0xCF47, - 0x87B2: 0xCF48, - 0x87B3: 0xF3AB, - 0x87B4: 0xCF49, - 0x87B5: 0xF3AA, - 0x87B6: 0xCF4A, - 0x87B7: 0xCF4B, - 0x87B8: 0xCF4C, - 0x87B9: 0xCF4D, - 0x87BA: 0xC2DD, - 0x87BB: 0xCF4E, - 0x87BC: 0xCF4F, - 0x87BD: 0xF3AE, - 0x87BE: 0xCF50, - 0x87BF: 0xCF51, - 0x87C0: 0xF3B0, - 0x87C1: 0xCF52, - 0x87C2: 0xCF53, - 0x87C3: 0xCF54, - 0x87C4: 0xCF55, - 0x87C5: 0xCF56, - 0x87C6: 0xF3A1, - 0x87C7: 0xCF57, - 0x87C8: 0xCF58, - 0x87C9: 0xCF59, - 0x87CA: 0xF3B1, - 0x87CB: 0xF3AC, - 0x87CC: 0xCF5A, - 0x87CD: 0xCF5B, - 0x87CE: 0xCF5C, - 0x87CF: 0xCF5D, - 0x87D0: 0xCF5E, - 0x87D1: 0xF3AF, - 0x87D2: 0xF2FE, - 0x87D3: 0xF3AD, - 0x87D4: 0xCF5F, - 0x87D5: 0xCF60, - 0x87D6: 0xCF61, - 0x87D7: 0xCF62, - 0x87D8: 0xCF63, - 0x87D9: 0xCF64, - 0x87DA: 0xCF65, - 0x87DB: 0xF3B2, - 0x87DC: 0xCF66, - 0x87DD: 0xCF67, - 0x87DE: 0xCF68, - 0x87DF: 0xCF69, - 0x87E0: 0xF3B4, - 0x87E1: 0xCF6A, - 0x87E2: 0xCF6B, - 0x87E3: 0xCF6C, - 0x87E4: 0xCF6D, - 0x87E5: 0xF3A8, - 0x87E6: 0xCF6E, - 0x87E7: 0xCF6F, - 0x87E8: 0xCF70, - 0x87E9: 0xCF71, - 0x87EA: 0xF3B3, - 0x87EB: 0xCF72, - 0x87EC: 0xCF73, - 0x87ED: 0xCF74, - 0x87EE: 0xF3B5, - 0x87EF: 0xCF75, - 0x87F0: 0xCF76, - 0x87F1: 0xCF77, - 0x87F2: 0xCF78, - 0x87F3: 0xCF79, - 0x87F4: 0xCF7A, - 0x87F5: 0xCF7B, - 0x87F6: 0xCF7C, - 0x87F7: 0xCF7D, - 0x87F8: 0xCF7E, - 0x87F9: 0xD0B7, - 0x87FA: 0xCF80, - 0x87FB: 0xCF81, - 0x87FC: 0xCF82, - 0x87FD: 0xCF83, - 0x87FE: 0xF3B8, - 0x87FF: 0xCF84, - 0x8800: 0xCF85, - 0x8801: 0xCF86, - 0x8802: 0xCF87, - 0x8803: 0xD9F9, - 0x8804: 0xCF88, - 0x8805: 0xCF89, - 0x8806: 0xCF8A, - 0x8807: 0xCF8B, - 0x8808: 0xCF8C, - 0x8809: 0xCF8D, - 0x880A: 0xF3B9, - 0x880B: 0xCF8E, - 0x880C: 0xCF8F, - 0x880D: 0xCF90, - 0x880E: 0xCF91, - 0x880F: 0xCF92, - 0x8810: 0xCF93, - 0x8811: 0xCF94, - 0x8812: 0xCF95, - 0x8813: 0xF3B7, - 0x8814: 0xCF96, - 0x8815: 0xC8E4, - 0x8816: 0xF3B6, - 0x8817: 0xCF97, - 0x8818: 0xCF98, - 0x8819: 0xCF99, - 0x881A: 0xCF9A, - 0x881B: 0xF3BA, - 0x881C: 0xCF9B, - 0x881D: 0xCF9C, - 0x881E: 0xCF9D, - 0x881F: 0xCF9E, - 0x8820: 0xCF9F, - 0x8821: 0xF3BB, - 0x8822: 0xB4C0, - 0x8823: 0xCFA0, - 0x8824: 0xD040, - 0x8825: 0xD041, - 0x8826: 0xD042, - 0x8827: 0xD043, - 0x8828: 0xD044, - 0x8829: 0xD045, - 0x882A: 0xD046, - 0x882B: 0xD047, - 0x882C: 0xD048, - 0x882D: 0xD049, - 0x882E: 0xD04A, - 0x882F: 0xD04B, - 0x8830: 0xD04C, - 0x8831: 0xD04D, - 0x8832: 0xEEC3, - 0x8833: 0xD04E, - 0x8834: 0xD04F, - 0x8835: 0xD050, - 0x8836: 0xD051, - 0x8837: 0xD052, - 0x8838: 0xD053, - 0x8839: 0xF3BC, - 0x883A: 0xD054, - 0x883B: 0xD055, - 0x883C: 0xF3BD, - 0x883D: 0xD056, - 0x883E: 0xD057, - 0x883F: 0xD058, - 0x8840: 0xD1AA, - 0x8841: 0xD059, - 0x8842: 0xD05A, - 0x8843: 0xD05B, - 0x8844: 0xF4AC, - 0x8845: 0xD0C6, - 0x8846: 0xD05C, - 0x8847: 0xD05D, - 0x8848: 0xD05E, - 0x8849: 0xD05F, - 0x884A: 0xD060, - 0x884B: 0xD061, - 0x884C: 0xD0D0, - 0x884D: 0xD1DC, - 0x884E: 0xD062, - 0x884F: 0xD063, - 0x8850: 0xD064, - 0x8851: 0xD065, - 0x8852: 0xD066, - 0x8853: 0xD067, - 0x8854: 0xCFCE, - 0x8855: 0xD068, - 0x8856: 0xD069, - 0x8857: 0xBDD6, - 0x8858: 0xD06A, - 0x8859: 0xD1C3, - 0x885A: 0xD06B, - 0x885B: 0xD06C, - 0x885C: 0xD06D, - 0x885D: 0xD06E, - 0x885E: 0xD06F, - 0x885F: 0xD070, - 0x8860: 0xD071, - 0x8861: 0xBAE2, - 0x8862: 0xE1E9, - 0x8863: 0xD2C2, - 0x8864: 0xF1C2, - 0x8865: 0xB2B9, - 0x8866: 0xD072, - 0x8867: 0xD073, - 0x8868: 0xB1ED, - 0x8869: 0xF1C3, - 0x886A: 0xD074, - 0x886B: 0xC9C0, - 0x886C: 0xB3C4, - 0x886D: 0xD075, - 0x886E: 0xD9F2, - 0x886F: 0xD076, - 0x8870: 0xCBA5, - 0x8871: 0xD077, - 0x8872: 0xF1C4, - 0x8873: 0xD078, - 0x8874: 0xD079, - 0x8875: 0xD07A, - 0x8876: 0xD07B, - 0x8877: 0xD6D4, - 0x8878: 0xD07C, - 0x8879: 0xD07D, - 0x887A: 0xD07E, - 0x887B: 0xD080, - 0x887C: 0xD081, - 0x887D: 0xF1C5, - 0x887E: 0xF4C0, - 0x887F: 0xF1C6, - 0x8880: 0xD082, - 0x8881: 0xD4AC, - 0x8882: 0xF1C7, - 0x8883: 0xD083, - 0x8884: 0xB0C0, - 0x8885: 0xF4C1, - 0x8886: 0xD084, - 0x8887: 0xD085, - 0x8888: 0xF4C2, - 0x8889: 0xD086, - 0x888A: 0xD087, - 0x888B: 0xB4FC, - 0x888C: 0xD088, - 0x888D: 0xC5DB, - 0x888E: 0xD089, - 0x888F: 0xD08A, - 0x8890: 0xD08B, - 0x8891: 0xD08C, - 0x8892: 0xCCBB, - 0x8893: 0xD08D, - 0x8894: 0xD08E, - 0x8895: 0xD08F, - 0x8896: 0xD0E4, - 0x8897: 0xD090, - 0x8898: 0xD091, - 0x8899: 0xD092, - 0x889A: 0xD093, - 0x889B: 0xD094, - 0x889C: 0xCDE0, - 0x889D: 0xD095, - 0x889E: 0xD096, - 0x889F: 0xD097, - 0x88A0: 0xD098, - 0x88A1: 0xD099, - 0x88A2: 0xF1C8, - 0x88A3: 0xD09A, - 0x88A4: 0xD9F3, - 0x88A5: 0xD09B, - 0x88A6: 0xD09C, - 0x88A7: 0xD09D, - 0x88A8: 0xD09E, - 0x88A9: 0xD09F, - 0x88AA: 0xD0A0, - 0x88AB: 0xB1BB, - 0x88AC: 0xD140, - 0x88AD: 0xCFAE, - 0x88AE: 0xD141, - 0x88AF: 0xD142, - 0x88B0: 0xD143, - 0x88B1: 0xB8A4, - 0x88B2: 0xD144, - 0x88B3: 0xD145, - 0x88B4: 0xD146, - 0x88B5: 0xD147, - 0x88B6: 0xD148, - 0x88B7: 0xF1CA, - 0x88B8: 0xD149, - 0x88B9: 0xD14A, - 0x88BA: 0xD14B, - 0x88BB: 0xD14C, - 0x88BC: 0xF1CB, - 0x88BD: 0xD14D, - 0x88BE: 0xD14E, - 0x88BF: 0xD14F, - 0x88C0: 0xD150, - 0x88C1: 0xB2C3, - 0x88C2: 0xC1D1, - 0x88C3: 0xD151, - 0x88C4: 0xD152, - 0x88C5: 0xD7B0, - 0x88C6: 0xF1C9, - 0x88C7: 0xD153, - 0x88C8: 0xD154, - 0x88C9: 0xF1CC, - 0x88CA: 0xD155, - 0x88CB: 0xD156, - 0x88CC: 0xD157, - 0x88CD: 0xD158, - 0x88CE: 0xF1CE, - 0x88CF: 0xD159, - 0x88D0: 0xD15A, - 0x88D1: 0xD15B, - 0x88D2: 0xD9F6, - 0x88D3: 0xD15C, - 0x88D4: 0xD2E1, - 0x88D5: 0xD4A3, - 0x88D6: 0xD15D, - 0x88D7: 0xD15E, - 0x88D8: 0xF4C3, - 0x88D9: 0xC8B9, - 0x88DA: 0xD15F, - 0x88DB: 0xD160, - 0x88DC: 0xD161, - 0x88DD: 0xD162, - 0x88DE: 0xD163, - 0x88DF: 0xF4C4, - 0x88E0: 0xD164, - 0x88E1: 0xD165, - 0x88E2: 0xF1CD, - 0x88E3: 0xF1CF, - 0x88E4: 0xBFE3, - 0x88E5: 0xF1D0, - 0x88E6: 0xD166, - 0x88E7: 0xD167, - 0x88E8: 0xF1D4, - 0x88E9: 0xD168, - 0x88EA: 0xD169, - 0x88EB: 0xD16A, - 0x88EC: 0xD16B, - 0x88ED: 0xD16C, - 0x88EE: 0xD16D, - 0x88EF: 0xD16E, - 0x88F0: 0xF1D6, - 0x88F1: 0xF1D1, - 0x88F2: 0xD16F, - 0x88F3: 0xC9D1, - 0x88F4: 0xC5E1, - 0x88F5: 0xD170, - 0x88F6: 0xD171, - 0x88F7: 0xD172, - 0x88F8: 0xC2E3, - 0x88F9: 0xB9FC, - 0x88FA: 0xD173, - 0x88FB: 0xD174, - 0x88FC: 0xF1D3, - 0x88FD: 0xD175, - 0x88FE: 0xF1D5, - 0x88FF: 0xD176, - 0x8900: 0xD177, - 0x8901: 0xD178, - 0x8902: 0xB9D3, - 0x8903: 0xD179, - 0x8904: 0xD17A, - 0x8905: 0xD17B, - 0x8906: 0xD17C, - 0x8907: 0xD17D, - 0x8908: 0xD17E, - 0x8909: 0xD180, - 0x890A: 0xF1DB, - 0x890B: 0xD181, - 0x890C: 0xD182, - 0x890D: 0xD183, - 0x890E: 0xD184, - 0x890F: 0xD185, - 0x8910: 0xBAD6, - 0x8911: 0xD186, - 0x8912: 0xB0FD, - 0x8913: 0xF1D9, - 0x8914: 0xD187, - 0x8915: 0xD188, - 0x8916: 0xD189, - 0x8917: 0xD18A, - 0x8918: 0xD18B, - 0x8919: 0xF1D8, - 0x891A: 0xF1D2, - 0x891B: 0xF1DA, - 0x891C: 0xD18C, - 0x891D: 0xD18D, - 0x891E: 0xD18E, - 0x891F: 0xD18F, - 0x8920: 0xD190, - 0x8921: 0xF1D7, - 0x8922: 0xD191, - 0x8923: 0xD192, - 0x8924: 0xD193, - 0x8925: 0xC8EC, - 0x8926: 0xD194, - 0x8927: 0xD195, - 0x8928: 0xD196, - 0x8929: 0xD197, - 0x892A: 0xCDCA, - 0x892B: 0xF1DD, - 0x892C: 0xD198, - 0x892D: 0xD199, - 0x892E: 0xD19A, - 0x892F: 0xD19B, - 0x8930: 0xE5BD, - 0x8931: 0xD19C, - 0x8932: 0xD19D, - 0x8933: 0xD19E, - 0x8934: 0xF1DC, - 0x8935: 0xD19F, - 0x8936: 0xF1DE, - 0x8937: 0xD1A0, - 0x8938: 0xD240, - 0x8939: 0xD241, - 0x893A: 0xD242, - 0x893B: 0xD243, - 0x893C: 0xD244, - 0x893D: 0xD245, - 0x893E: 0xD246, - 0x893F: 0xD247, - 0x8940: 0xD248, - 0x8941: 0xF1DF, - 0x8942: 0xD249, - 0x8943: 0xD24A, - 0x8944: 0xCFE5, - 0x8945: 0xD24B, - 0x8946: 0xD24C, - 0x8947: 0xD24D, - 0x8948: 0xD24E, - 0x8949: 0xD24F, - 0x894A: 0xD250, - 0x894B: 0xD251, - 0x894C: 0xD252, - 0x894D: 0xD253, - 0x894E: 0xD254, - 0x894F: 0xD255, - 0x8950: 0xD256, - 0x8951: 0xD257, - 0x8952: 0xD258, - 0x8953: 0xD259, - 0x8954: 0xD25A, - 0x8955: 0xD25B, - 0x8956: 0xD25C, - 0x8957: 0xD25D, - 0x8958: 0xD25E, - 0x8959: 0xD25F, - 0x895A: 0xD260, - 0x895B: 0xD261, - 0x895C: 0xD262, - 0x895D: 0xD263, - 0x895E: 0xF4C5, - 0x895F: 0xBDF3, - 0x8960: 0xD264, - 0x8961: 0xD265, - 0x8962: 0xD266, - 0x8963: 0xD267, - 0x8964: 0xD268, - 0x8965: 0xD269, - 0x8966: 0xF1E0, - 0x8967: 0xD26A, - 0x8968: 0xD26B, - 0x8969: 0xD26C, - 0x896A: 0xD26D, - 0x896B: 0xD26E, - 0x896C: 0xD26F, - 0x896D: 0xD270, - 0x896E: 0xD271, - 0x896F: 0xD272, - 0x8970: 0xD273, - 0x8971: 0xD274, - 0x8972: 0xD275, - 0x8973: 0xD276, - 0x8974: 0xD277, - 0x8975: 0xD278, - 0x8976: 0xD279, - 0x8977: 0xD27A, - 0x8978: 0xD27B, - 0x8979: 0xD27C, - 0x897A: 0xD27D, - 0x897B: 0xF1E1, - 0x897C: 0xD27E, - 0x897D: 0xD280, - 0x897E: 0xD281, - 0x897F: 0xCEF7, - 0x8980: 0xD282, - 0x8981: 0xD2AA, - 0x8982: 0xD283, - 0x8983: 0xF1FB, - 0x8984: 0xD284, - 0x8985: 0xD285, - 0x8986: 0xB8B2, - 0x8987: 0xD286, - 0x8988: 0xD287, - 0x8989: 0xD288, - 0x898A: 0xD289, - 0x898B: 0xD28A, - 0x898C: 0xD28B, - 0x898D: 0xD28C, - 0x898E: 0xD28D, - 0x898F: 0xD28E, - 0x8990: 0xD28F, - 0x8991: 0xD290, - 0x8992: 0xD291, - 0x8993: 0xD292, - 0x8994: 0xD293, - 0x8995: 0xD294, - 0x8996: 0xD295, - 0x8997: 0xD296, - 0x8998: 0xD297, - 0x8999: 0xD298, - 0x899A: 0xD299, - 0x899B: 0xD29A, - 0x899C: 0xD29B, - 0x899D: 0xD29C, - 0x899E: 0xD29D, - 0x899F: 0xD29E, - 0x89A0: 0xD29F, - 0x89A1: 0xD2A0, - 0x89A2: 0xD340, - 0x89A3: 0xD341, - 0x89A4: 0xD342, - 0x89A5: 0xD343, - 0x89A6: 0xD344, - 0x89A7: 0xD345, - 0x89A8: 0xD346, - 0x89A9: 0xD347, - 0x89AA: 0xD348, - 0x89AB: 0xD349, - 0x89AC: 0xD34A, - 0x89AD: 0xD34B, - 0x89AE: 0xD34C, - 0x89AF: 0xD34D, - 0x89B0: 0xD34E, - 0x89B1: 0xD34F, - 0x89B2: 0xD350, - 0x89B3: 0xD351, - 0x89B4: 0xD352, - 0x89B5: 0xD353, - 0x89B6: 0xD354, - 0x89B7: 0xD355, - 0x89B8: 0xD356, - 0x89B9: 0xD357, - 0x89BA: 0xD358, - 0x89BB: 0xD359, - 0x89BC: 0xD35A, - 0x89BD: 0xD35B, - 0x89BE: 0xD35C, - 0x89BF: 0xD35D, - 0x89C0: 0xD35E, - 0x89C1: 0xBCFB, - 0x89C2: 0xB9DB, - 0x89C3: 0xD35F, - 0x89C4: 0xB9E6, - 0x89C5: 0xC3D9, - 0x89C6: 0xCAD3, - 0x89C7: 0xEAE8, - 0x89C8: 0xC0C0, - 0x89C9: 0xBEF5, - 0x89CA: 0xEAE9, - 0x89CB: 0xEAEA, - 0x89CC: 0xEAEB, - 0x89CD: 0xD360, - 0x89CE: 0xEAEC, - 0x89CF: 0xEAED, - 0x89D0: 0xEAEE, - 0x89D1: 0xEAEF, - 0x89D2: 0xBDC7, - 0x89D3: 0xD361, - 0x89D4: 0xD362, - 0x89D5: 0xD363, - 0x89D6: 0xF5FB, - 0x89D7: 0xD364, - 0x89D8: 0xD365, - 0x89D9: 0xD366, - 0x89DA: 0xF5FD, - 0x89DB: 0xD367, - 0x89DC: 0xF5FE, - 0x89DD: 0xD368, - 0x89DE: 0xF5FC, - 0x89DF: 0xD369, - 0x89E0: 0xD36A, - 0x89E1: 0xD36B, - 0x89E2: 0xD36C, - 0x89E3: 0xBDE2, - 0x89E4: 0xD36D, - 0x89E5: 0xF6A1, - 0x89E6: 0xB4A5, - 0x89E7: 0xD36E, - 0x89E8: 0xD36F, - 0x89E9: 0xD370, - 0x89EA: 0xD371, - 0x89EB: 0xF6A2, - 0x89EC: 0xD372, - 0x89ED: 0xD373, - 0x89EE: 0xD374, - 0x89EF: 0xF6A3, - 0x89F0: 0xD375, - 0x89F1: 0xD376, - 0x89F2: 0xD377, - 0x89F3: 0xECB2, - 0x89F4: 0xD378, - 0x89F5: 0xD379, - 0x89F6: 0xD37A, - 0x89F7: 0xD37B, - 0x89F8: 0xD37C, - 0x89F9: 0xD37D, - 0x89FA: 0xD37E, - 0x89FB: 0xD380, - 0x89FC: 0xD381, - 0x89FD: 0xD382, - 0x89FE: 0xD383, - 0x89FF: 0xD384, - 0x8A00: 0xD1D4, - 0x8A01: 0xD385, - 0x8A02: 0xD386, - 0x8A03: 0xD387, - 0x8A04: 0xD388, - 0x8A05: 0xD389, - 0x8A06: 0xD38A, - 0x8A07: 0xD9EA, - 0x8A08: 0xD38B, - 0x8A09: 0xD38C, - 0x8A0A: 0xD38D, - 0x8A0B: 0xD38E, - 0x8A0C: 0xD38F, - 0x8A0D: 0xD390, - 0x8A0E: 0xD391, - 0x8A0F: 0xD392, - 0x8A10: 0xD393, - 0x8A11: 0xD394, - 0x8A12: 0xD395, - 0x8A13: 0xD396, - 0x8A14: 0xD397, - 0x8A15: 0xD398, - 0x8A16: 0xD399, - 0x8A17: 0xD39A, - 0x8A18: 0xD39B, - 0x8A19: 0xD39C, - 0x8A1A: 0xD39D, - 0x8A1B: 0xD39E, - 0x8A1C: 0xD39F, - 0x8A1D: 0xD3A0, - 0x8A1E: 0xD440, - 0x8A1F: 0xD441, - 0x8A20: 0xD442, - 0x8A21: 0xD443, - 0x8A22: 0xD444, - 0x8A23: 0xD445, - 0x8A24: 0xD446, - 0x8A25: 0xD447, - 0x8A26: 0xD448, - 0x8A27: 0xD449, - 0x8A28: 0xD44A, - 0x8A29: 0xD44B, - 0x8A2A: 0xD44C, - 0x8A2B: 0xD44D, - 0x8A2C: 0xD44E, - 0x8A2D: 0xD44F, - 0x8A2E: 0xD450, - 0x8A2F: 0xD451, - 0x8A30: 0xD452, - 0x8A31: 0xD453, - 0x8A32: 0xD454, - 0x8A33: 0xD455, - 0x8A34: 0xD456, - 0x8A35: 0xD457, - 0x8A36: 0xD458, - 0x8A37: 0xD459, - 0x8A38: 0xD45A, - 0x8A39: 0xD45B, - 0x8A3A: 0xD45C, - 0x8A3B: 0xD45D, - 0x8A3C: 0xD45E, - 0x8A3D: 0xD45F, - 0x8A3E: 0xF6A4, - 0x8A3F: 0xD460, - 0x8A40: 0xD461, - 0x8A41: 0xD462, - 0x8A42: 0xD463, - 0x8A43: 0xD464, - 0x8A44: 0xD465, - 0x8A45: 0xD466, - 0x8A46: 0xD467, - 0x8A47: 0xD468, - 0x8A48: 0xEEBA, - 0x8A49: 0xD469, - 0x8A4A: 0xD46A, - 0x8A4B: 0xD46B, - 0x8A4C: 0xD46C, - 0x8A4D: 0xD46D, - 0x8A4E: 0xD46E, - 0x8A4F: 0xD46F, - 0x8A50: 0xD470, - 0x8A51: 0xD471, - 0x8A52: 0xD472, - 0x8A53: 0xD473, - 0x8A54: 0xD474, - 0x8A55: 0xD475, - 0x8A56: 0xD476, - 0x8A57: 0xD477, - 0x8A58: 0xD478, - 0x8A59: 0xD479, - 0x8A5A: 0xD47A, - 0x8A5B: 0xD47B, - 0x8A5C: 0xD47C, - 0x8A5D: 0xD47D, - 0x8A5E: 0xD47E, - 0x8A5F: 0xD480, - 0x8A60: 0xD481, - 0x8A61: 0xD482, - 0x8A62: 0xD483, - 0x8A63: 0xD484, - 0x8A64: 0xD485, - 0x8A65: 0xD486, - 0x8A66: 0xD487, - 0x8A67: 0xD488, - 0x8A68: 0xD489, - 0x8A69: 0xD48A, - 0x8A6A: 0xD48B, - 0x8A6B: 0xD48C, - 0x8A6C: 0xD48D, - 0x8A6D: 0xD48E, - 0x8A6E: 0xD48F, - 0x8A6F: 0xD490, - 0x8A70: 0xD491, - 0x8A71: 0xD492, - 0x8A72: 0xD493, - 0x8A73: 0xD494, - 0x8A74: 0xD495, - 0x8A75: 0xD496, - 0x8A76: 0xD497, - 0x8A77: 0xD498, - 0x8A78: 0xD499, - 0x8A79: 0xD5B2, - 0x8A7A: 0xD49A, - 0x8A7B: 0xD49B, - 0x8A7C: 0xD49C, - 0x8A7D: 0xD49D, - 0x8A7E: 0xD49E, - 0x8A7F: 0xD49F, - 0x8A80: 0xD4A0, - 0x8A81: 0xD540, - 0x8A82: 0xD541, - 0x8A83: 0xD542, - 0x8A84: 0xD543, - 0x8A85: 0xD544, - 0x8A86: 0xD545, - 0x8A87: 0xD546, - 0x8A88: 0xD547, - 0x8A89: 0xD3FE, - 0x8A8A: 0xCCDC, - 0x8A8B: 0xD548, - 0x8A8C: 0xD549, - 0x8A8D: 0xD54A, - 0x8A8E: 0xD54B, - 0x8A8F: 0xD54C, - 0x8A90: 0xD54D, - 0x8A91: 0xD54E, - 0x8A92: 0xD54F, - 0x8A93: 0xCAC4, - 0x8A94: 0xD550, - 0x8A95: 0xD551, - 0x8A96: 0xD552, - 0x8A97: 0xD553, - 0x8A98: 0xD554, - 0x8A99: 0xD555, - 0x8A9A: 0xD556, - 0x8A9B: 0xD557, - 0x8A9C: 0xD558, - 0x8A9D: 0xD559, - 0x8A9E: 0xD55A, - 0x8A9F: 0xD55B, - 0x8AA0: 0xD55C, - 0x8AA1: 0xD55D, - 0x8AA2: 0xD55E, - 0x8AA3: 0xD55F, - 0x8AA4: 0xD560, - 0x8AA5: 0xD561, - 0x8AA6: 0xD562, - 0x8AA7: 0xD563, - 0x8AA8: 0xD564, - 0x8AA9: 0xD565, - 0x8AAA: 0xD566, - 0x8AAB: 0xD567, - 0x8AAC: 0xD568, - 0x8AAD: 0xD569, - 0x8AAE: 0xD56A, - 0x8AAF: 0xD56B, - 0x8AB0: 0xD56C, - 0x8AB1: 0xD56D, - 0x8AB2: 0xD56E, - 0x8AB3: 0xD56F, - 0x8AB4: 0xD570, - 0x8AB5: 0xD571, - 0x8AB6: 0xD572, - 0x8AB7: 0xD573, - 0x8AB8: 0xD574, - 0x8AB9: 0xD575, - 0x8ABA: 0xD576, - 0x8ABB: 0xD577, - 0x8ABC: 0xD578, - 0x8ABD: 0xD579, - 0x8ABE: 0xD57A, - 0x8ABF: 0xD57B, - 0x8AC0: 0xD57C, - 0x8AC1: 0xD57D, - 0x8AC2: 0xD57E, - 0x8AC3: 0xD580, - 0x8AC4: 0xD581, - 0x8AC5: 0xD582, - 0x8AC6: 0xD583, - 0x8AC7: 0xD584, - 0x8AC8: 0xD585, - 0x8AC9: 0xD586, - 0x8ACA: 0xD587, - 0x8ACB: 0xD588, - 0x8ACC: 0xD589, - 0x8ACD: 0xD58A, - 0x8ACE: 0xD58B, - 0x8ACF: 0xD58C, - 0x8AD0: 0xD58D, - 0x8AD1: 0xD58E, - 0x8AD2: 0xD58F, - 0x8AD3: 0xD590, - 0x8AD4: 0xD591, - 0x8AD5: 0xD592, - 0x8AD6: 0xD593, - 0x8AD7: 0xD594, - 0x8AD8: 0xD595, - 0x8AD9: 0xD596, - 0x8ADA: 0xD597, - 0x8ADB: 0xD598, - 0x8ADC: 0xD599, - 0x8ADD: 0xD59A, - 0x8ADE: 0xD59B, - 0x8ADF: 0xD59C, - 0x8AE0: 0xD59D, - 0x8AE1: 0xD59E, - 0x8AE2: 0xD59F, - 0x8AE3: 0xD5A0, - 0x8AE4: 0xD640, - 0x8AE5: 0xD641, - 0x8AE6: 0xD642, - 0x8AE7: 0xD643, - 0x8AE8: 0xD644, - 0x8AE9: 0xD645, - 0x8AEA: 0xD646, - 0x8AEB: 0xD647, - 0x8AEC: 0xD648, - 0x8AED: 0xD649, - 0x8AEE: 0xD64A, - 0x8AEF: 0xD64B, - 0x8AF0: 0xD64C, - 0x8AF1: 0xD64D, - 0x8AF2: 0xD64E, - 0x8AF3: 0xD64F, - 0x8AF4: 0xD650, - 0x8AF5: 0xD651, - 0x8AF6: 0xD652, - 0x8AF7: 0xD653, - 0x8AF8: 0xD654, - 0x8AF9: 0xD655, - 0x8AFA: 0xD656, - 0x8AFB: 0xD657, - 0x8AFC: 0xD658, - 0x8AFD: 0xD659, - 0x8AFE: 0xD65A, - 0x8AFF: 0xD65B, - 0x8B00: 0xD65C, - 0x8B01: 0xD65D, - 0x8B02: 0xD65E, - 0x8B03: 0xD65F, - 0x8B04: 0xD660, - 0x8B05: 0xD661, - 0x8B06: 0xD662, - 0x8B07: 0xE5C0, - 0x8B08: 0xD663, - 0x8B09: 0xD664, - 0x8B0A: 0xD665, - 0x8B0B: 0xD666, - 0x8B0C: 0xD667, - 0x8B0D: 0xD668, - 0x8B0E: 0xD669, - 0x8B0F: 0xD66A, - 0x8B10: 0xD66B, - 0x8B11: 0xD66C, - 0x8B12: 0xD66D, - 0x8B13: 0xD66E, - 0x8B14: 0xD66F, - 0x8B15: 0xD670, - 0x8B16: 0xD671, - 0x8B17: 0xD672, - 0x8B18: 0xD673, - 0x8B19: 0xD674, - 0x8B1A: 0xD675, - 0x8B1B: 0xD676, - 0x8B1C: 0xD677, - 0x8B1D: 0xD678, - 0x8B1E: 0xD679, - 0x8B1F: 0xD67A, - 0x8B20: 0xD67B, - 0x8B21: 0xD67C, - 0x8B22: 0xD67D, - 0x8B23: 0xD67E, - 0x8B24: 0xD680, - 0x8B25: 0xD681, - 0x8B26: 0xF6A5, - 0x8B27: 0xD682, - 0x8B28: 0xD683, - 0x8B29: 0xD684, - 0x8B2A: 0xD685, - 0x8B2B: 0xD686, - 0x8B2C: 0xD687, - 0x8B2D: 0xD688, - 0x8B2E: 0xD689, - 0x8B2F: 0xD68A, - 0x8B30: 0xD68B, - 0x8B31: 0xD68C, - 0x8B32: 0xD68D, - 0x8B33: 0xD68E, - 0x8B34: 0xD68F, - 0x8B35: 0xD690, - 0x8B36: 0xD691, - 0x8B37: 0xD692, - 0x8B38: 0xD693, - 0x8B39: 0xD694, - 0x8B3A: 0xD695, - 0x8B3B: 0xD696, - 0x8B3C: 0xD697, - 0x8B3D: 0xD698, - 0x8B3E: 0xD699, - 0x8B3F: 0xD69A, - 0x8B40: 0xD69B, - 0x8B41: 0xD69C, - 0x8B42: 0xD69D, - 0x8B43: 0xD69E, - 0x8B44: 0xD69F, - 0x8B45: 0xD6A0, - 0x8B46: 0xD740, - 0x8B47: 0xD741, - 0x8B48: 0xD742, - 0x8B49: 0xD743, - 0x8B4A: 0xD744, - 0x8B4B: 0xD745, - 0x8B4C: 0xD746, - 0x8B4D: 0xD747, - 0x8B4E: 0xD748, - 0x8B4F: 0xD749, - 0x8B50: 0xD74A, - 0x8B51: 0xD74B, - 0x8B52: 0xD74C, - 0x8B53: 0xD74D, - 0x8B54: 0xD74E, - 0x8B55: 0xD74F, - 0x8B56: 0xD750, - 0x8B57: 0xD751, - 0x8B58: 0xD752, - 0x8B59: 0xD753, - 0x8B5A: 0xD754, - 0x8B5B: 0xD755, - 0x8B5C: 0xD756, - 0x8B5D: 0xD757, - 0x8B5E: 0xD758, - 0x8B5F: 0xD759, - 0x8B60: 0xD75A, - 0x8B61: 0xD75B, - 0x8B62: 0xD75C, - 0x8B63: 0xD75D, - 0x8B64: 0xD75E, - 0x8B65: 0xD75F, - 0x8B66: 0xBEAF, - 0x8B67: 0xD760, - 0x8B68: 0xD761, - 0x8B69: 0xD762, - 0x8B6A: 0xD763, - 0x8B6B: 0xD764, - 0x8B6C: 0xC6A9, - 0x8B6D: 0xD765, - 0x8B6E: 0xD766, - 0x8B6F: 0xD767, - 0x8B70: 0xD768, - 0x8B71: 0xD769, - 0x8B72: 0xD76A, - 0x8B73: 0xD76B, - 0x8B74: 0xD76C, - 0x8B75: 0xD76D, - 0x8B76: 0xD76E, - 0x8B77: 0xD76F, - 0x8B78: 0xD770, - 0x8B79: 0xD771, - 0x8B7A: 0xD772, - 0x8B7B: 0xD773, - 0x8B7C: 0xD774, - 0x8B7D: 0xD775, - 0x8B7E: 0xD776, - 0x8B7F: 0xD777, - 0x8B80: 0xD778, - 0x8B81: 0xD779, - 0x8B82: 0xD77A, - 0x8B83: 0xD77B, - 0x8B84: 0xD77C, - 0x8B85: 0xD77D, - 0x8B86: 0xD77E, - 0x8B87: 0xD780, - 0x8B88: 0xD781, - 0x8B89: 0xD782, - 0x8B8A: 0xD783, - 0x8B8B: 0xD784, - 0x8B8C: 0xD785, - 0x8B8D: 0xD786, - 0x8B8E: 0xD787, - 0x8B8F: 0xD788, - 0x8B90: 0xD789, - 0x8B91: 0xD78A, - 0x8B92: 0xD78B, - 0x8B93: 0xD78C, - 0x8B94: 0xD78D, - 0x8B95: 0xD78E, - 0x8B96: 0xD78F, - 0x8B97: 0xD790, - 0x8B98: 0xD791, - 0x8B99: 0xD792, - 0x8B9A: 0xD793, - 0x8B9B: 0xD794, - 0x8B9C: 0xD795, - 0x8B9D: 0xD796, - 0x8B9E: 0xD797, - 0x8B9F: 0xD798, - 0x8BA0: 0xDAA5, - 0x8BA1: 0xBCC6, - 0x8BA2: 0xB6A9, - 0x8BA3: 0xB8BC, - 0x8BA4: 0xC8CF, - 0x8BA5: 0xBCA5, - 0x8BA6: 0xDAA6, - 0x8BA7: 0xDAA7, - 0x8BA8: 0xCCD6, - 0x8BA9: 0xC8C3, - 0x8BAA: 0xDAA8, - 0x8BAB: 0xC6FD, - 0x8BAC: 0xD799, - 0x8BAD: 0xD1B5, - 0x8BAE: 0xD2E9, - 0x8BAF: 0xD1B6, - 0x8BB0: 0xBCC7, - 0x8BB1: 0xD79A, - 0x8BB2: 0xBDB2, - 0x8BB3: 0xBBE4, - 0x8BB4: 0xDAA9, - 0x8BB5: 0xDAAA, - 0x8BB6: 0xD1C8, - 0x8BB7: 0xDAAB, - 0x8BB8: 0xD0ED, - 0x8BB9: 0xB6EF, - 0x8BBA: 0xC2DB, - 0x8BBB: 0xD79B, - 0x8BBC: 0xCBCF, - 0x8BBD: 0xB7ED, - 0x8BBE: 0xC9E8, - 0x8BBF: 0xB7C3, - 0x8BC0: 0xBEF7, - 0x8BC1: 0xD6A4, - 0x8BC2: 0xDAAC, - 0x8BC3: 0xDAAD, - 0x8BC4: 0xC6C0, - 0x8BC5: 0xD7E7, - 0x8BC6: 0xCAB6, - 0x8BC7: 0xD79C, - 0x8BC8: 0xD5A9, - 0x8BC9: 0xCBDF, - 0x8BCA: 0xD5EF, - 0x8BCB: 0xDAAE, - 0x8BCC: 0xD6DF, - 0x8BCD: 0xB4CA, - 0x8BCE: 0xDAB0, - 0x8BCF: 0xDAAF, - 0x8BD0: 0xD79D, - 0x8BD1: 0xD2EB, - 0x8BD2: 0xDAB1, - 0x8BD3: 0xDAB2, - 0x8BD4: 0xDAB3, - 0x8BD5: 0xCAD4, - 0x8BD6: 0xDAB4, - 0x8BD7: 0xCAAB, - 0x8BD8: 0xDAB5, - 0x8BD9: 0xDAB6, - 0x8BDA: 0xB3CF, - 0x8BDB: 0xD6EF, - 0x8BDC: 0xDAB7, - 0x8BDD: 0xBBB0, - 0x8BDE: 0xB5AE, - 0x8BDF: 0xDAB8, - 0x8BE0: 0xDAB9, - 0x8BE1: 0xB9EE, - 0x8BE2: 0xD1AF, - 0x8BE3: 0xD2E8, - 0x8BE4: 0xDABA, - 0x8BE5: 0xB8C3, - 0x8BE6: 0xCFEA, - 0x8BE7: 0xB2EF, - 0x8BE8: 0xDABB, - 0x8BE9: 0xDABC, - 0x8BEA: 0xD79E, - 0x8BEB: 0xBDEB, - 0x8BEC: 0xCEDC, - 0x8BED: 0xD3EF, - 0x8BEE: 0xDABD, - 0x8BEF: 0xCEF3, - 0x8BF0: 0xDABE, - 0x8BF1: 0xD3D5, - 0x8BF2: 0xBBE5, - 0x8BF3: 0xDABF, - 0x8BF4: 0xCBB5, - 0x8BF5: 0xCBD0, - 0x8BF6: 0xDAC0, - 0x8BF7: 0xC7EB, - 0x8BF8: 0xD6EE, - 0x8BF9: 0xDAC1, - 0x8BFA: 0xC5B5, - 0x8BFB: 0xB6C1, - 0x8BFC: 0xDAC2, - 0x8BFD: 0xB7CC, - 0x8BFE: 0xBFCE, - 0x8BFF: 0xDAC3, - 0x8C00: 0xDAC4, - 0x8C01: 0xCBAD, - 0x8C02: 0xDAC5, - 0x8C03: 0xB5F7, - 0x8C04: 0xDAC6, - 0x8C05: 0xC1C2, - 0x8C06: 0xD7BB, - 0x8C07: 0xDAC7, - 0x8C08: 0xCCB8, - 0x8C09: 0xD79F, - 0x8C0A: 0xD2EA, - 0x8C0B: 0xC4B1, - 0x8C0C: 0xDAC8, - 0x8C0D: 0xB5FD, - 0x8C0E: 0xBBD1, - 0x8C0F: 0xDAC9, - 0x8C10: 0xD0B3, - 0x8C11: 0xDACA, - 0x8C12: 0xDACB, - 0x8C13: 0xCEBD, - 0x8C14: 0xDACC, - 0x8C15: 0xDACD, - 0x8C16: 0xDACE, - 0x8C17: 0xB2F7, - 0x8C18: 0xDAD1, - 0x8C19: 0xDACF, - 0x8C1A: 0xD1E8, - 0x8C1B: 0xDAD0, - 0x8C1C: 0xC3D5, - 0x8C1D: 0xDAD2, - 0x8C1E: 0xD7A0, - 0x8C1F: 0xDAD3, - 0x8C20: 0xDAD4, - 0x8C21: 0xDAD5, - 0x8C22: 0xD0BB, - 0x8C23: 0xD2A5, - 0x8C24: 0xB0F9, - 0x8C25: 0xDAD6, - 0x8C26: 0xC7AB, - 0x8C27: 0xDAD7, - 0x8C28: 0xBDF7, - 0x8C29: 0xC3A1, - 0x8C2A: 0xDAD8, - 0x8C2B: 0xDAD9, - 0x8C2C: 0xC3FD, - 0x8C2D: 0xCCB7, - 0x8C2E: 0xDADA, - 0x8C2F: 0xDADB, - 0x8C30: 0xC0BE, - 0x8C31: 0xC6D7, - 0x8C32: 0xDADC, - 0x8C33: 0xDADD, - 0x8C34: 0xC7B4, - 0x8C35: 0xDADE, - 0x8C36: 0xDADF, - 0x8C37: 0xB9C8, - 0x8C38: 0xD840, - 0x8C39: 0xD841, - 0x8C3A: 0xD842, - 0x8C3B: 0xD843, - 0x8C3C: 0xD844, - 0x8C3D: 0xD845, - 0x8C3E: 0xD846, - 0x8C3F: 0xD847, - 0x8C40: 0xD848, - 0x8C41: 0xBBED, - 0x8C42: 0xD849, - 0x8C43: 0xD84A, - 0x8C44: 0xD84B, - 0x8C45: 0xD84C, - 0x8C46: 0xB6B9, - 0x8C47: 0xF4F8, - 0x8C48: 0xD84D, - 0x8C49: 0xF4F9, - 0x8C4A: 0xD84E, - 0x8C4B: 0xD84F, - 0x8C4C: 0xCDE3, - 0x8C4D: 0xD850, - 0x8C4E: 0xD851, - 0x8C4F: 0xD852, - 0x8C50: 0xD853, - 0x8C51: 0xD854, - 0x8C52: 0xD855, - 0x8C53: 0xD856, - 0x8C54: 0xD857, - 0x8C55: 0xF5B9, - 0x8C56: 0xD858, - 0x8C57: 0xD859, - 0x8C58: 0xD85A, - 0x8C59: 0xD85B, - 0x8C5A: 0xEBE0, - 0x8C5B: 0xD85C, - 0x8C5C: 0xD85D, - 0x8C5D: 0xD85E, - 0x8C5E: 0xD85F, - 0x8C5F: 0xD860, - 0x8C60: 0xD861, - 0x8C61: 0xCFF3, - 0x8C62: 0xBBBF, - 0x8C63: 0xD862, - 0x8C64: 0xD863, - 0x8C65: 0xD864, - 0x8C66: 0xD865, - 0x8C67: 0xD866, - 0x8C68: 0xD867, - 0x8C69: 0xD868, - 0x8C6A: 0xBAC0, - 0x8C6B: 0xD4A5, - 0x8C6C: 0xD869, - 0x8C6D: 0xD86A, - 0x8C6E: 0xD86B, - 0x8C6F: 0xD86C, - 0x8C70: 0xD86D, - 0x8C71: 0xD86E, - 0x8C72: 0xD86F, - 0x8C73: 0xE1D9, - 0x8C74: 0xD870, - 0x8C75: 0xD871, - 0x8C76: 0xD872, - 0x8C77: 0xD873, - 0x8C78: 0xF5F4, - 0x8C79: 0xB1AA, - 0x8C7A: 0xB2F2, - 0x8C7B: 0xD874, - 0x8C7C: 0xD875, - 0x8C7D: 0xD876, - 0x8C7E: 0xD877, - 0x8C7F: 0xD878, - 0x8C80: 0xD879, - 0x8C81: 0xD87A, - 0x8C82: 0xF5F5, - 0x8C83: 0xD87B, - 0x8C84: 0xD87C, - 0x8C85: 0xF5F7, - 0x8C86: 0xD87D, - 0x8C87: 0xD87E, - 0x8C88: 0xD880, - 0x8C89: 0xBAD1, - 0x8C8A: 0xF5F6, - 0x8C8B: 0xD881, - 0x8C8C: 0xC3B2, - 0x8C8D: 0xD882, - 0x8C8E: 0xD883, - 0x8C8F: 0xD884, - 0x8C90: 0xD885, - 0x8C91: 0xD886, - 0x8C92: 0xD887, - 0x8C93: 0xD888, - 0x8C94: 0xF5F9, - 0x8C95: 0xD889, - 0x8C96: 0xD88A, - 0x8C97: 0xD88B, - 0x8C98: 0xF5F8, - 0x8C99: 0xD88C, - 0x8C9A: 0xD88D, - 0x8C9B: 0xD88E, - 0x8C9C: 0xD88F, - 0x8C9D: 0xD890, - 0x8C9E: 0xD891, - 0x8C9F: 0xD892, - 0x8CA0: 0xD893, - 0x8CA1: 0xD894, - 0x8CA2: 0xD895, - 0x8CA3: 0xD896, - 0x8CA4: 0xD897, - 0x8CA5: 0xD898, - 0x8CA6: 0xD899, - 0x8CA7: 0xD89A, - 0x8CA8: 0xD89B, - 0x8CA9: 0xD89C, - 0x8CAA: 0xD89D, - 0x8CAB: 0xD89E, - 0x8CAC: 0xD89F, - 0x8CAD: 0xD8A0, - 0x8CAE: 0xD940, - 0x8CAF: 0xD941, - 0x8CB0: 0xD942, - 0x8CB1: 0xD943, - 0x8CB2: 0xD944, - 0x8CB3: 0xD945, - 0x8CB4: 0xD946, - 0x8CB5: 0xD947, - 0x8CB6: 0xD948, - 0x8CB7: 0xD949, - 0x8CB8: 0xD94A, - 0x8CB9: 0xD94B, - 0x8CBA: 0xD94C, - 0x8CBB: 0xD94D, - 0x8CBC: 0xD94E, - 0x8CBD: 0xD94F, - 0x8CBE: 0xD950, - 0x8CBF: 0xD951, - 0x8CC0: 0xD952, - 0x8CC1: 0xD953, - 0x8CC2: 0xD954, - 0x8CC3: 0xD955, - 0x8CC4: 0xD956, - 0x8CC5: 0xD957, - 0x8CC6: 0xD958, - 0x8CC7: 0xD959, - 0x8CC8: 0xD95A, - 0x8CC9: 0xD95B, - 0x8CCA: 0xD95C, - 0x8CCB: 0xD95D, - 0x8CCC: 0xD95E, - 0x8CCD: 0xD95F, - 0x8CCE: 0xD960, - 0x8CCF: 0xD961, - 0x8CD0: 0xD962, - 0x8CD1: 0xD963, - 0x8CD2: 0xD964, - 0x8CD3: 0xD965, - 0x8CD4: 0xD966, - 0x8CD5: 0xD967, - 0x8CD6: 0xD968, - 0x8CD7: 0xD969, - 0x8CD8: 0xD96A, - 0x8CD9: 0xD96B, - 0x8CDA: 0xD96C, - 0x8CDB: 0xD96D, - 0x8CDC: 0xD96E, - 0x8CDD: 0xD96F, - 0x8CDE: 0xD970, - 0x8CDF: 0xD971, - 0x8CE0: 0xD972, - 0x8CE1: 0xD973, - 0x8CE2: 0xD974, - 0x8CE3: 0xD975, - 0x8CE4: 0xD976, - 0x8CE5: 0xD977, - 0x8CE6: 0xD978, - 0x8CE7: 0xD979, - 0x8CE8: 0xD97A, - 0x8CE9: 0xD97B, - 0x8CEA: 0xD97C, - 0x8CEB: 0xD97D, - 0x8CEC: 0xD97E, - 0x8CED: 0xD980, - 0x8CEE: 0xD981, - 0x8CEF: 0xD982, - 0x8CF0: 0xD983, - 0x8CF1: 0xD984, - 0x8CF2: 0xD985, - 0x8CF3: 0xD986, - 0x8CF4: 0xD987, - 0x8CF5: 0xD988, - 0x8CF6: 0xD989, - 0x8CF7: 0xD98A, - 0x8CF8: 0xD98B, - 0x8CF9: 0xD98C, - 0x8CFA: 0xD98D, - 0x8CFB: 0xD98E, - 0x8CFC: 0xD98F, - 0x8CFD: 0xD990, - 0x8CFE: 0xD991, - 0x8CFF: 0xD992, - 0x8D00: 0xD993, - 0x8D01: 0xD994, - 0x8D02: 0xD995, - 0x8D03: 0xD996, - 0x8D04: 0xD997, - 0x8D05: 0xD998, - 0x8D06: 0xD999, - 0x8D07: 0xD99A, - 0x8D08: 0xD99B, - 0x8D09: 0xD99C, - 0x8D0A: 0xD99D, - 0x8D0B: 0xD99E, - 0x8D0C: 0xD99F, - 0x8D0D: 0xD9A0, - 0x8D0E: 0xDA40, - 0x8D0F: 0xDA41, - 0x8D10: 0xDA42, - 0x8D11: 0xDA43, - 0x8D12: 0xDA44, - 0x8D13: 0xDA45, - 0x8D14: 0xDA46, - 0x8D15: 0xDA47, - 0x8D16: 0xDA48, - 0x8D17: 0xDA49, - 0x8D18: 0xDA4A, - 0x8D19: 0xDA4B, - 0x8D1A: 0xDA4C, - 0x8D1B: 0xDA4D, - 0x8D1C: 0xDA4E, - 0x8D1D: 0xB1B4, - 0x8D1E: 0xD5EA, - 0x8D1F: 0xB8BA, - 0x8D20: 0xDA4F, - 0x8D21: 0xB9B1, - 0x8D22: 0xB2C6, - 0x8D23: 0xD4F0, - 0x8D24: 0xCFCD, - 0x8D25: 0xB0DC, - 0x8D26: 0xD5CB, - 0x8D27: 0xBBF5, - 0x8D28: 0xD6CA, - 0x8D29: 0xB7B7, - 0x8D2A: 0xCCB0, - 0x8D2B: 0xC6B6, - 0x8D2C: 0xB1E1, - 0x8D2D: 0xB9BA, - 0x8D2E: 0xD6FC, - 0x8D2F: 0xB9E1, - 0x8D30: 0xB7A1, - 0x8D31: 0xBCFA, - 0x8D32: 0xEADA, - 0x8D33: 0xEADB, - 0x8D34: 0xCCF9, - 0x8D35: 0xB9F3, - 0x8D36: 0xEADC, - 0x8D37: 0xB4FB, - 0x8D38: 0xC3B3, - 0x8D39: 0xB7D1, - 0x8D3A: 0xBAD8, - 0x8D3B: 0xEADD, - 0x8D3C: 0xD4F4, - 0x8D3D: 0xEADE, - 0x8D3E: 0xBCD6, - 0x8D3F: 0xBBDF, - 0x8D40: 0xEADF, - 0x8D41: 0xC1DE, - 0x8D42: 0xC2B8, - 0x8D43: 0xD4DF, - 0x8D44: 0xD7CA, - 0x8D45: 0xEAE0, - 0x8D46: 0xEAE1, - 0x8D47: 0xEAE4, - 0x8D48: 0xEAE2, - 0x8D49: 0xEAE3, - 0x8D4A: 0xC9DE, - 0x8D4B: 0xB8B3, - 0x8D4C: 0xB6C4, - 0x8D4D: 0xEAE5, - 0x8D4E: 0xCAEA, - 0x8D4F: 0xC9CD, - 0x8D50: 0xB4CD, - 0x8D51: 0xDA50, - 0x8D52: 0xDA51, - 0x8D53: 0xE2D9, - 0x8D54: 0xC5E2, - 0x8D55: 0xEAE6, - 0x8D56: 0xC0B5, - 0x8D57: 0xDA52, - 0x8D58: 0xD7B8, - 0x8D59: 0xEAE7, - 0x8D5A: 0xD7AC, - 0x8D5B: 0xC8FC, - 0x8D5C: 0xD8D3, - 0x8D5D: 0xD8CD, - 0x8D5E: 0xD4DE, - 0x8D5F: 0xDA53, - 0x8D60: 0xD4F9, - 0x8D61: 0xC9C4, - 0x8D62: 0xD3AE, - 0x8D63: 0xB8D3, - 0x8D64: 0xB3E0, - 0x8D65: 0xDA54, - 0x8D66: 0xC9E2, - 0x8D67: 0xF4F6, - 0x8D68: 0xDA55, - 0x8D69: 0xDA56, - 0x8D6A: 0xDA57, - 0x8D6B: 0xBAD5, - 0x8D6C: 0xDA58, - 0x8D6D: 0xF4F7, - 0x8D6E: 0xDA59, - 0x8D6F: 0xDA5A, - 0x8D70: 0xD7DF, - 0x8D71: 0xDA5B, - 0x8D72: 0xDA5C, - 0x8D73: 0xF4F1, - 0x8D74: 0xB8B0, - 0x8D75: 0xD5D4, - 0x8D76: 0xB8CF, - 0x8D77: 0xC6F0, - 0x8D78: 0xDA5D, - 0x8D79: 0xDA5E, - 0x8D7A: 0xDA5F, - 0x8D7B: 0xDA60, - 0x8D7C: 0xDA61, - 0x8D7D: 0xDA62, - 0x8D7E: 0xDA63, - 0x8D7F: 0xDA64, - 0x8D80: 0xDA65, - 0x8D81: 0xB3C3, - 0x8D82: 0xDA66, - 0x8D83: 0xDA67, - 0x8D84: 0xF4F2, - 0x8D85: 0xB3AC, - 0x8D86: 0xDA68, - 0x8D87: 0xDA69, - 0x8D88: 0xDA6A, - 0x8D89: 0xDA6B, - 0x8D8A: 0xD4BD, - 0x8D8B: 0xC7F7, - 0x8D8C: 0xDA6C, - 0x8D8D: 0xDA6D, - 0x8D8E: 0xDA6E, - 0x8D8F: 0xDA6F, - 0x8D90: 0xDA70, - 0x8D91: 0xF4F4, - 0x8D92: 0xDA71, - 0x8D93: 0xDA72, - 0x8D94: 0xF4F3, - 0x8D95: 0xDA73, - 0x8D96: 0xDA74, - 0x8D97: 0xDA75, - 0x8D98: 0xDA76, - 0x8D99: 0xDA77, - 0x8D9A: 0xDA78, - 0x8D9B: 0xDA79, - 0x8D9C: 0xDA7A, - 0x8D9D: 0xDA7B, - 0x8D9E: 0xDA7C, - 0x8D9F: 0xCCCB, - 0x8DA0: 0xDA7D, - 0x8DA1: 0xDA7E, - 0x8DA2: 0xDA80, - 0x8DA3: 0xC8A4, - 0x8DA4: 0xDA81, - 0x8DA5: 0xDA82, - 0x8DA6: 0xDA83, - 0x8DA7: 0xDA84, - 0x8DA8: 0xDA85, - 0x8DA9: 0xDA86, - 0x8DAA: 0xDA87, - 0x8DAB: 0xDA88, - 0x8DAC: 0xDA89, - 0x8DAD: 0xDA8A, - 0x8DAE: 0xDA8B, - 0x8DAF: 0xDA8C, - 0x8DB0: 0xDA8D, - 0x8DB1: 0xF4F5, - 0x8DB2: 0xDA8E, - 0x8DB3: 0xD7E3, - 0x8DB4: 0xC5BF, - 0x8DB5: 0xF5C0, - 0x8DB6: 0xDA8F, - 0x8DB7: 0xDA90, - 0x8DB8: 0xF5BB, - 0x8DB9: 0xDA91, - 0x8DBA: 0xF5C3, - 0x8DBB: 0xDA92, - 0x8DBC: 0xF5C2, - 0x8DBD: 0xDA93, - 0x8DBE: 0xD6BA, - 0x8DBF: 0xF5C1, - 0x8DC0: 0xDA94, - 0x8DC1: 0xDA95, - 0x8DC2: 0xDA96, - 0x8DC3: 0xD4BE, - 0x8DC4: 0xF5C4, - 0x8DC5: 0xDA97, - 0x8DC6: 0xF5CC, - 0x8DC7: 0xDA98, - 0x8DC8: 0xDA99, - 0x8DC9: 0xDA9A, - 0x8DCA: 0xDA9B, - 0x8DCB: 0xB0CF, - 0x8DCC: 0xB5F8, - 0x8DCD: 0xDA9C, - 0x8DCE: 0xF5C9, - 0x8DCF: 0xF5CA, - 0x8DD0: 0xDA9D, - 0x8DD1: 0xC5DC, - 0x8DD2: 0xDA9E, - 0x8DD3: 0xDA9F, - 0x8DD4: 0xDAA0, - 0x8DD5: 0xDB40, - 0x8DD6: 0xF5C5, - 0x8DD7: 0xF5C6, - 0x8DD8: 0xDB41, - 0x8DD9: 0xDB42, - 0x8DDA: 0xF5C7, - 0x8DDB: 0xF5CB, - 0x8DDC: 0xDB43, - 0x8DDD: 0xBEE0, - 0x8DDE: 0xF5C8, - 0x8DDF: 0xB8FA, - 0x8DE0: 0xDB44, - 0x8DE1: 0xDB45, - 0x8DE2: 0xDB46, - 0x8DE3: 0xF5D0, - 0x8DE4: 0xF5D3, - 0x8DE5: 0xDB47, - 0x8DE6: 0xDB48, - 0x8DE7: 0xDB49, - 0x8DE8: 0xBFE7, - 0x8DE9: 0xDB4A, - 0x8DEA: 0xB9F2, - 0x8DEB: 0xF5BC, - 0x8DEC: 0xF5CD, - 0x8DED: 0xDB4B, - 0x8DEE: 0xDB4C, - 0x8DEF: 0xC2B7, - 0x8DF0: 0xDB4D, - 0x8DF1: 0xDB4E, - 0x8DF2: 0xDB4F, - 0x8DF3: 0xCCF8, - 0x8DF4: 0xDB50, - 0x8DF5: 0xBCF9, - 0x8DF6: 0xDB51, - 0x8DF7: 0xF5CE, - 0x8DF8: 0xF5CF, - 0x8DF9: 0xF5D1, - 0x8DFA: 0xB6E5, - 0x8DFB: 0xF5D2, - 0x8DFC: 0xDB52, - 0x8DFD: 0xF5D5, - 0x8DFE: 0xDB53, - 0x8DFF: 0xDB54, - 0x8E00: 0xDB55, - 0x8E01: 0xDB56, - 0x8E02: 0xDB57, - 0x8E03: 0xDB58, - 0x8E04: 0xDB59, - 0x8E05: 0xF5BD, - 0x8E06: 0xDB5A, - 0x8E07: 0xDB5B, - 0x8E08: 0xDB5C, - 0x8E09: 0xF5D4, - 0x8E0A: 0xD3BB, - 0x8E0B: 0xDB5D, - 0x8E0C: 0xB3EC, - 0x8E0D: 0xDB5E, - 0x8E0E: 0xDB5F, - 0x8E0F: 0xCCA4, - 0x8E10: 0xDB60, - 0x8E11: 0xDB61, - 0x8E12: 0xDB62, - 0x8E13: 0xDB63, - 0x8E14: 0xF5D6, - 0x8E15: 0xDB64, - 0x8E16: 0xDB65, - 0x8E17: 0xDB66, - 0x8E18: 0xDB67, - 0x8E19: 0xDB68, - 0x8E1A: 0xDB69, - 0x8E1B: 0xDB6A, - 0x8E1C: 0xDB6B, - 0x8E1D: 0xF5D7, - 0x8E1E: 0xBEE1, - 0x8E1F: 0xF5D8, - 0x8E20: 0xDB6C, - 0x8E21: 0xDB6D, - 0x8E22: 0xCCDF, - 0x8E23: 0xF5DB, - 0x8E24: 0xDB6E, - 0x8E25: 0xDB6F, - 0x8E26: 0xDB70, - 0x8E27: 0xDB71, - 0x8E28: 0xDB72, - 0x8E29: 0xB2C8, - 0x8E2A: 0xD7D9, - 0x8E2B: 0xDB73, - 0x8E2C: 0xF5D9, - 0x8E2D: 0xDB74, - 0x8E2E: 0xF5DA, - 0x8E2F: 0xF5DC, - 0x8E30: 0xDB75, - 0x8E31: 0xF5E2, - 0x8E32: 0xDB76, - 0x8E33: 0xDB77, - 0x8E34: 0xDB78, - 0x8E35: 0xF5E0, - 0x8E36: 0xDB79, - 0x8E37: 0xDB7A, - 0x8E38: 0xDB7B, - 0x8E39: 0xF5DF, - 0x8E3A: 0xF5DD, - 0x8E3B: 0xDB7C, - 0x8E3C: 0xDB7D, - 0x8E3D: 0xF5E1, - 0x8E3E: 0xDB7E, - 0x8E3F: 0xDB80, - 0x8E40: 0xF5DE, - 0x8E41: 0xF5E4, - 0x8E42: 0xF5E5, - 0x8E43: 0xDB81, - 0x8E44: 0xCCE3, - 0x8E45: 0xDB82, - 0x8E46: 0xDB83, - 0x8E47: 0xE5BF, - 0x8E48: 0xB5B8, - 0x8E49: 0xF5E3, - 0x8E4A: 0xF5E8, - 0x8E4B: 0xCCA3, - 0x8E4C: 0xDB84, - 0x8E4D: 0xDB85, - 0x8E4E: 0xDB86, - 0x8E4F: 0xDB87, - 0x8E50: 0xDB88, - 0x8E51: 0xF5E6, - 0x8E52: 0xF5E7, - 0x8E53: 0xDB89, - 0x8E54: 0xDB8A, - 0x8E55: 0xDB8B, - 0x8E56: 0xDB8C, - 0x8E57: 0xDB8D, - 0x8E58: 0xDB8E, - 0x8E59: 0xF5BE, - 0x8E5A: 0xDB8F, - 0x8E5B: 0xDB90, - 0x8E5C: 0xDB91, - 0x8E5D: 0xDB92, - 0x8E5E: 0xDB93, - 0x8E5F: 0xDB94, - 0x8E60: 0xDB95, - 0x8E61: 0xDB96, - 0x8E62: 0xDB97, - 0x8E63: 0xDB98, - 0x8E64: 0xDB99, - 0x8E65: 0xDB9A, - 0x8E66: 0xB1C4, - 0x8E67: 0xDB9B, - 0x8E68: 0xDB9C, - 0x8E69: 0xF5BF, - 0x8E6A: 0xDB9D, - 0x8E6B: 0xDB9E, - 0x8E6C: 0xB5C5, - 0x8E6D: 0xB2E4, - 0x8E6E: 0xDB9F, - 0x8E6F: 0xF5EC, - 0x8E70: 0xF5E9, - 0x8E71: 0xDBA0, - 0x8E72: 0xB6D7, - 0x8E73: 0xDC40, - 0x8E74: 0xF5ED, - 0x8E75: 0xDC41, - 0x8E76: 0xF5EA, - 0x8E77: 0xDC42, - 0x8E78: 0xDC43, - 0x8E79: 0xDC44, - 0x8E7A: 0xDC45, - 0x8E7B: 0xDC46, - 0x8E7C: 0xF5EB, - 0x8E7D: 0xDC47, - 0x8E7E: 0xDC48, - 0x8E7F: 0xB4DA, - 0x8E80: 0xDC49, - 0x8E81: 0xD4EA, - 0x8E82: 0xDC4A, - 0x8E83: 0xDC4B, - 0x8E84: 0xDC4C, - 0x8E85: 0xF5EE, - 0x8E86: 0xDC4D, - 0x8E87: 0xB3F9, - 0x8E88: 0xDC4E, - 0x8E89: 0xDC4F, - 0x8E8A: 0xDC50, - 0x8E8B: 0xDC51, - 0x8E8C: 0xDC52, - 0x8E8D: 0xDC53, - 0x8E8E: 0xDC54, - 0x8E8F: 0xF5EF, - 0x8E90: 0xF5F1, - 0x8E91: 0xDC55, - 0x8E92: 0xDC56, - 0x8E93: 0xDC57, - 0x8E94: 0xF5F0, - 0x8E95: 0xDC58, - 0x8E96: 0xDC59, - 0x8E97: 0xDC5A, - 0x8E98: 0xDC5B, - 0x8E99: 0xDC5C, - 0x8E9A: 0xDC5D, - 0x8E9B: 0xDC5E, - 0x8E9C: 0xF5F2, - 0x8E9D: 0xDC5F, - 0x8E9E: 0xF5F3, - 0x8E9F: 0xDC60, - 0x8EA0: 0xDC61, - 0x8EA1: 0xDC62, - 0x8EA2: 0xDC63, - 0x8EA3: 0xDC64, - 0x8EA4: 0xDC65, - 0x8EA5: 0xDC66, - 0x8EA6: 0xDC67, - 0x8EA7: 0xDC68, - 0x8EA8: 0xDC69, - 0x8EA9: 0xDC6A, - 0x8EAA: 0xDC6B, - 0x8EAB: 0xC9ED, - 0x8EAC: 0xB9AA, - 0x8EAD: 0xDC6C, - 0x8EAE: 0xDC6D, - 0x8EAF: 0xC7FB, - 0x8EB0: 0xDC6E, - 0x8EB1: 0xDC6F, - 0x8EB2: 0xB6E3, - 0x8EB3: 0xDC70, - 0x8EB4: 0xDC71, - 0x8EB5: 0xDC72, - 0x8EB6: 0xDC73, - 0x8EB7: 0xDC74, - 0x8EB8: 0xDC75, - 0x8EB9: 0xDC76, - 0x8EBA: 0xCCC9, - 0x8EBB: 0xDC77, - 0x8EBC: 0xDC78, - 0x8EBD: 0xDC79, - 0x8EBE: 0xDC7A, - 0x8EBF: 0xDC7B, - 0x8EC0: 0xDC7C, - 0x8EC1: 0xDC7D, - 0x8EC2: 0xDC7E, - 0x8EC3: 0xDC80, - 0x8EC4: 0xDC81, - 0x8EC5: 0xDC82, - 0x8EC6: 0xDC83, - 0x8EC7: 0xDC84, - 0x8EC8: 0xDC85, - 0x8EC9: 0xDC86, - 0x8ECA: 0xDC87, - 0x8ECB: 0xDC88, - 0x8ECC: 0xDC89, - 0x8ECD: 0xDC8A, - 0x8ECE: 0xEAA6, - 0x8ECF: 0xDC8B, - 0x8ED0: 0xDC8C, - 0x8ED1: 0xDC8D, - 0x8ED2: 0xDC8E, - 0x8ED3: 0xDC8F, - 0x8ED4: 0xDC90, - 0x8ED5: 0xDC91, - 0x8ED6: 0xDC92, - 0x8ED7: 0xDC93, - 0x8ED8: 0xDC94, - 0x8ED9: 0xDC95, - 0x8EDA: 0xDC96, - 0x8EDB: 0xDC97, - 0x8EDC: 0xDC98, - 0x8EDD: 0xDC99, - 0x8EDE: 0xDC9A, - 0x8EDF: 0xDC9B, - 0x8EE0: 0xDC9C, - 0x8EE1: 0xDC9D, - 0x8EE2: 0xDC9E, - 0x8EE3: 0xDC9F, - 0x8EE4: 0xDCA0, - 0x8EE5: 0xDD40, - 0x8EE6: 0xDD41, - 0x8EE7: 0xDD42, - 0x8EE8: 0xDD43, - 0x8EE9: 0xDD44, - 0x8EEA: 0xDD45, - 0x8EEB: 0xDD46, - 0x8EEC: 0xDD47, - 0x8EED: 0xDD48, - 0x8EEE: 0xDD49, - 0x8EEF: 0xDD4A, - 0x8EF0: 0xDD4B, - 0x8EF1: 0xDD4C, - 0x8EF2: 0xDD4D, - 0x8EF3: 0xDD4E, - 0x8EF4: 0xDD4F, - 0x8EF5: 0xDD50, - 0x8EF6: 0xDD51, - 0x8EF7: 0xDD52, - 0x8EF8: 0xDD53, - 0x8EF9: 0xDD54, - 0x8EFA: 0xDD55, - 0x8EFB: 0xDD56, - 0x8EFC: 0xDD57, - 0x8EFD: 0xDD58, - 0x8EFE: 0xDD59, - 0x8EFF: 0xDD5A, - 0x8F00: 0xDD5B, - 0x8F01: 0xDD5C, - 0x8F02: 0xDD5D, - 0x8F03: 0xDD5E, - 0x8F04: 0xDD5F, - 0x8F05: 0xDD60, - 0x8F06: 0xDD61, - 0x8F07: 0xDD62, - 0x8F08: 0xDD63, - 0x8F09: 0xDD64, - 0x8F0A: 0xDD65, - 0x8F0B: 0xDD66, - 0x8F0C: 0xDD67, - 0x8F0D: 0xDD68, - 0x8F0E: 0xDD69, - 0x8F0F: 0xDD6A, - 0x8F10: 0xDD6B, - 0x8F11: 0xDD6C, - 0x8F12: 0xDD6D, - 0x8F13: 0xDD6E, - 0x8F14: 0xDD6F, - 0x8F15: 0xDD70, - 0x8F16: 0xDD71, - 0x8F17: 0xDD72, - 0x8F18: 0xDD73, - 0x8F19: 0xDD74, - 0x8F1A: 0xDD75, - 0x8F1B: 0xDD76, - 0x8F1C: 0xDD77, - 0x8F1D: 0xDD78, - 0x8F1E: 0xDD79, - 0x8F1F: 0xDD7A, - 0x8F20: 0xDD7B, - 0x8F21: 0xDD7C, - 0x8F22: 0xDD7D, - 0x8F23: 0xDD7E, - 0x8F24: 0xDD80, - 0x8F25: 0xDD81, - 0x8F26: 0xDD82, - 0x8F27: 0xDD83, - 0x8F28: 0xDD84, - 0x8F29: 0xDD85, - 0x8F2A: 0xDD86, - 0x8F2B: 0xDD87, - 0x8F2C: 0xDD88, - 0x8F2D: 0xDD89, - 0x8F2E: 0xDD8A, - 0x8F2F: 0xDD8B, - 0x8F30: 0xDD8C, - 0x8F31: 0xDD8D, - 0x8F32: 0xDD8E, - 0x8F33: 0xDD8F, - 0x8F34: 0xDD90, - 0x8F35: 0xDD91, - 0x8F36: 0xDD92, - 0x8F37: 0xDD93, - 0x8F38: 0xDD94, - 0x8F39: 0xDD95, - 0x8F3A: 0xDD96, - 0x8F3B: 0xDD97, - 0x8F3C: 0xDD98, - 0x8F3D: 0xDD99, - 0x8F3E: 0xDD9A, - 0x8F3F: 0xDD9B, - 0x8F40: 0xDD9C, - 0x8F41: 0xDD9D, - 0x8F42: 0xDD9E, - 0x8F43: 0xDD9F, - 0x8F44: 0xDDA0, - 0x8F45: 0xDE40, - 0x8F46: 0xDE41, - 0x8F47: 0xDE42, - 0x8F48: 0xDE43, - 0x8F49: 0xDE44, - 0x8F4A: 0xDE45, - 0x8F4B: 0xDE46, - 0x8F4C: 0xDE47, - 0x8F4D: 0xDE48, - 0x8F4E: 0xDE49, - 0x8F4F: 0xDE4A, - 0x8F50: 0xDE4B, - 0x8F51: 0xDE4C, - 0x8F52: 0xDE4D, - 0x8F53: 0xDE4E, - 0x8F54: 0xDE4F, - 0x8F55: 0xDE50, - 0x8F56: 0xDE51, - 0x8F57: 0xDE52, - 0x8F58: 0xDE53, - 0x8F59: 0xDE54, - 0x8F5A: 0xDE55, - 0x8F5B: 0xDE56, - 0x8F5C: 0xDE57, - 0x8F5D: 0xDE58, - 0x8F5E: 0xDE59, - 0x8F5F: 0xDE5A, - 0x8F60: 0xDE5B, - 0x8F61: 0xDE5C, - 0x8F62: 0xDE5D, - 0x8F63: 0xDE5E, - 0x8F64: 0xDE5F, - 0x8F65: 0xDE60, - 0x8F66: 0xB3B5, - 0x8F67: 0xD4FE, - 0x8F68: 0xB9EC, - 0x8F69: 0xD0F9, - 0x8F6A: 0xDE61, - 0x8F6B: 0xE9ED, - 0x8F6C: 0xD7AA, - 0x8F6D: 0xE9EE, - 0x8F6E: 0xC2D6, - 0x8F6F: 0xC8ED, - 0x8F70: 0xBAE4, - 0x8F71: 0xE9EF, - 0x8F72: 0xE9F0, - 0x8F73: 0xE9F1, - 0x8F74: 0xD6E1, - 0x8F75: 0xE9F2, - 0x8F76: 0xE9F3, - 0x8F77: 0xE9F5, - 0x8F78: 0xE9F4, - 0x8F79: 0xE9F6, - 0x8F7A: 0xE9F7, - 0x8F7B: 0xC7E1, - 0x8F7C: 0xE9F8, - 0x8F7D: 0xD4D8, - 0x8F7E: 0xE9F9, - 0x8F7F: 0xBDCE, - 0x8F80: 0xDE62, - 0x8F81: 0xE9FA, - 0x8F82: 0xE9FB, - 0x8F83: 0xBDCF, - 0x8F84: 0xE9FC, - 0x8F85: 0xB8A8, - 0x8F86: 0xC1BE, - 0x8F87: 0xE9FD, - 0x8F88: 0xB1B2, - 0x8F89: 0xBBD4, - 0x8F8A: 0xB9F5, - 0x8F8B: 0xE9FE, - 0x8F8C: 0xDE63, - 0x8F8D: 0xEAA1, - 0x8F8E: 0xEAA2, - 0x8F8F: 0xEAA3, - 0x8F90: 0xB7F8, - 0x8F91: 0xBCAD, - 0x8F92: 0xDE64, - 0x8F93: 0xCAE4, - 0x8F94: 0xE0CE, - 0x8F95: 0xD4AF, - 0x8F96: 0xCFBD, - 0x8F97: 0xD5B7, - 0x8F98: 0xEAA4, - 0x8F99: 0xD5DE, - 0x8F9A: 0xEAA5, - 0x8F9B: 0xD0C1, - 0x8F9C: 0xB9BC, - 0x8F9D: 0xDE65, - 0x8F9E: 0xB4C7, - 0x8F9F: 0xB1D9, - 0x8FA0: 0xDE66, - 0x8FA1: 0xDE67, - 0x8FA2: 0xDE68, - 0x8FA3: 0xC0B1, - 0x8FA4: 0xDE69, - 0x8FA5: 0xDE6A, - 0x8FA6: 0xDE6B, - 0x8FA7: 0xDE6C, - 0x8FA8: 0xB1E6, - 0x8FA9: 0xB1E7, - 0x8FAA: 0xDE6D, - 0x8FAB: 0xB1E8, - 0x8FAC: 0xDE6E, - 0x8FAD: 0xDE6F, - 0x8FAE: 0xDE70, - 0x8FAF: 0xDE71, - 0x8FB0: 0xB3BD, - 0x8FB1: 0xC8E8, - 0x8FB2: 0xDE72, - 0x8FB3: 0xDE73, - 0x8FB4: 0xDE74, - 0x8FB5: 0xDE75, - 0x8FB6: 0xE5C1, - 0x8FB7: 0xDE76, - 0x8FB8: 0xDE77, - 0x8FB9: 0xB1DF, - 0x8FBA: 0xDE78, - 0x8FBB: 0xDE79, - 0x8FBC: 0xDE7A, - 0x8FBD: 0xC1C9, - 0x8FBE: 0xB4EF, - 0x8FBF: 0xDE7B, - 0x8FC0: 0xDE7C, - 0x8FC1: 0xC7A8, - 0x8FC2: 0xD3D8, - 0x8FC3: 0xDE7D, - 0x8FC4: 0xC6F9, - 0x8FC5: 0xD1B8, - 0x8FC6: 0xDE7E, - 0x8FC7: 0xB9FD, - 0x8FC8: 0xC2F5, - 0x8FC9: 0xDE80, - 0x8FCA: 0xDE81, - 0x8FCB: 0xDE82, - 0x8FCC: 0xDE83, - 0x8FCD: 0xDE84, - 0x8FCE: 0xD3AD, - 0x8FCF: 0xDE85, - 0x8FD0: 0xD4CB, - 0x8FD1: 0xBDFC, - 0x8FD2: 0xDE86, - 0x8FD3: 0xE5C2, - 0x8FD4: 0xB7B5, - 0x8FD5: 0xE5C3, - 0x8FD6: 0xDE87, - 0x8FD7: 0xDE88, - 0x8FD8: 0xBBB9, - 0x8FD9: 0xD5E2, - 0x8FDA: 0xDE89, - 0x8FDB: 0xBDF8, - 0x8FDC: 0xD4B6, - 0x8FDD: 0xCEA5, - 0x8FDE: 0xC1AC, - 0x8FDF: 0xB3D9, - 0x8FE0: 0xDE8A, - 0x8FE1: 0xDE8B, - 0x8FE2: 0xCCF6, - 0x8FE3: 0xDE8C, - 0x8FE4: 0xE5C6, - 0x8FE5: 0xE5C4, - 0x8FE6: 0xE5C8, - 0x8FE7: 0xDE8D, - 0x8FE8: 0xE5CA, - 0x8FE9: 0xE5C7, - 0x8FEA: 0xB5CF, - 0x8FEB: 0xC6C8, - 0x8FEC: 0xDE8E, - 0x8FED: 0xB5FC, - 0x8FEE: 0xE5C5, - 0x8FEF: 0xDE8F, - 0x8FF0: 0xCAF6, - 0x8FF1: 0xDE90, - 0x8FF2: 0xDE91, - 0x8FF3: 0xE5C9, - 0x8FF4: 0xDE92, - 0x8FF5: 0xDE93, - 0x8FF6: 0xDE94, - 0x8FF7: 0xC3D4, - 0x8FF8: 0xB1C5, - 0x8FF9: 0xBCA3, - 0x8FFA: 0xDE95, - 0x8FFB: 0xDE96, - 0x8FFC: 0xDE97, - 0x8FFD: 0xD7B7, - 0x8FFE: 0xDE98, - 0x8FFF: 0xDE99, - 0x9000: 0xCDCB, - 0x9001: 0xCBCD, - 0x9002: 0xCACA, - 0x9003: 0xCCD3, - 0x9004: 0xE5CC, - 0x9005: 0xE5CB, - 0x9006: 0xC4E6, - 0x9007: 0xDE9A, - 0x9008: 0xDE9B, - 0x9009: 0xD1A1, - 0x900A: 0xD1B7, - 0x900B: 0xE5CD, - 0x900C: 0xDE9C, - 0x900D: 0xE5D0, - 0x900E: 0xDE9D, - 0x900F: 0xCDB8, - 0x9010: 0xD6F0, - 0x9011: 0xE5CF, - 0x9012: 0xB5DD, - 0x9013: 0xDE9E, - 0x9014: 0xCDBE, - 0x9015: 0xDE9F, - 0x9016: 0xE5D1, - 0x9017: 0xB6BA, - 0x9018: 0xDEA0, - 0x9019: 0xDF40, - 0x901A: 0xCDA8, - 0x901B: 0xB9E4, - 0x901C: 0xDF41, - 0x901D: 0xCAC5, - 0x901E: 0xB3D1, - 0x901F: 0xCBD9, - 0x9020: 0xD4EC, - 0x9021: 0xE5D2, - 0x9022: 0xB7EA, - 0x9023: 0xDF42, - 0x9024: 0xDF43, - 0x9025: 0xDF44, - 0x9026: 0xE5CE, - 0x9027: 0xDF45, - 0x9028: 0xDF46, - 0x9029: 0xDF47, - 0x902A: 0xDF48, - 0x902B: 0xDF49, - 0x902C: 0xDF4A, - 0x902D: 0xE5D5, - 0x902E: 0xB4FE, - 0x902F: 0xE5D6, - 0x9030: 0xDF4B, - 0x9031: 0xDF4C, - 0x9032: 0xDF4D, - 0x9033: 0xDF4E, - 0x9034: 0xDF4F, - 0x9035: 0xE5D3, - 0x9036: 0xE5D4, - 0x9037: 0xDF50, - 0x9038: 0xD2DD, - 0x9039: 0xDF51, - 0x903A: 0xDF52, - 0x903B: 0xC2DF, - 0x903C: 0xB1C6, - 0x903D: 0xDF53, - 0x903E: 0xD3E2, - 0x903F: 0xDF54, - 0x9040: 0xDF55, - 0x9041: 0xB6DD, - 0x9042: 0xCBEC, - 0x9043: 0xDF56, - 0x9044: 0xE5D7, - 0x9045: 0xDF57, - 0x9046: 0xDF58, - 0x9047: 0xD3F6, - 0x9048: 0xDF59, - 0x9049: 0xDF5A, - 0x904A: 0xDF5B, - 0x904B: 0xDF5C, - 0x904C: 0xDF5D, - 0x904D: 0xB1E9, - 0x904E: 0xDF5E, - 0x904F: 0xB6F4, - 0x9050: 0xE5DA, - 0x9051: 0xE5D8, - 0x9052: 0xE5D9, - 0x9053: 0xB5C0, - 0x9054: 0xDF5F, - 0x9055: 0xDF60, - 0x9056: 0xDF61, - 0x9057: 0xD2C5, - 0x9058: 0xE5DC, - 0x9059: 0xDF62, - 0x905A: 0xDF63, - 0x905B: 0xE5DE, - 0x905C: 0xDF64, - 0x905D: 0xDF65, - 0x905E: 0xDF66, - 0x905F: 0xDF67, - 0x9060: 0xDF68, - 0x9061: 0xDF69, - 0x9062: 0xE5DD, - 0x9063: 0xC7B2, - 0x9064: 0xDF6A, - 0x9065: 0xD2A3, - 0x9066: 0xDF6B, - 0x9067: 0xDF6C, - 0x9068: 0xE5DB, - 0x9069: 0xDF6D, - 0x906A: 0xDF6E, - 0x906B: 0xDF6F, - 0x906C: 0xDF70, - 0x906D: 0xD4E2, - 0x906E: 0xD5DA, - 0x906F: 0xDF71, - 0x9070: 0xDF72, - 0x9071: 0xDF73, - 0x9072: 0xDF74, - 0x9073: 0xDF75, - 0x9074: 0xE5E0, - 0x9075: 0xD7F1, - 0x9076: 0xDF76, - 0x9077: 0xDF77, - 0x9078: 0xDF78, - 0x9079: 0xDF79, - 0x907A: 0xDF7A, - 0x907B: 0xDF7B, - 0x907C: 0xDF7C, - 0x907D: 0xE5E1, - 0x907E: 0xDF7D, - 0x907F: 0xB1DC, - 0x9080: 0xD1FB, - 0x9081: 0xDF7E, - 0x9082: 0xE5E2, - 0x9083: 0xE5E4, - 0x9084: 0xDF80, - 0x9085: 0xDF81, - 0x9086: 0xDF82, - 0x9087: 0xDF83, - 0x9088: 0xE5E3, - 0x9089: 0xDF84, - 0x908A: 0xDF85, - 0x908B: 0xE5E5, - 0x908C: 0xDF86, - 0x908D: 0xDF87, - 0x908E: 0xDF88, - 0x908F: 0xDF89, - 0x9090: 0xDF8A, - 0x9091: 0xD2D8, - 0x9092: 0xDF8B, - 0x9093: 0xB5CB, - 0x9094: 0xDF8C, - 0x9095: 0xE7DF, - 0x9096: 0xDF8D, - 0x9097: 0xDAF5, - 0x9098: 0xDF8E, - 0x9099: 0xDAF8, - 0x909A: 0xDF8F, - 0x909B: 0xDAF6, - 0x909C: 0xDF90, - 0x909D: 0xDAF7, - 0x909E: 0xDF91, - 0x909F: 0xDF92, - 0x90A0: 0xDF93, - 0x90A1: 0xDAFA, - 0x90A2: 0xD0CF, - 0x90A3: 0xC4C7, - 0x90A4: 0xDF94, - 0x90A5: 0xDF95, - 0x90A6: 0xB0EE, - 0x90A7: 0xDF96, - 0x90A8: 0xDF97, - 0x90A9: 0xDF98, - 0x90AA: 0xD0B0, - 0x90AB: 0xDF99, - 0x90AC: 0xDAF9, - 0x90AD: 0xDF9A, - 0x90AE: 0xD3CA, - 0x90AF: 0xBAAA, - 0x90B0: 0xDBA2, - 0x90B1: 0xC7F1, - 0x90B2: 0xDF9B, - 0x90B3: 0xDAFC, - 0x90B4: 0xDAFB, - 0x90B5: 0xC9DB, - 0x90B6: 0xDAFD, - 0x90B7: 0xDF9C, - 0x90B8: 0xDBA1, - 0x90B9: 0xD7DE, - 0x90BA: 0xDAFE, - 0x90BB: 0xC1DA, - 0x90BC: 0xDF9D, - 0x90BD: 0xDF9E, - 0x90BE: 0xDBA5, - 0x90BF: 0xDF9F, - 0x90C0: 0xDFA0, - 0x90C1: 0xD3F4, - 0x90C2: 0xE040, - 0x90C3: 0xE041, - 0x90C4: 0xDBA7, - 0x90C5: 0xDBA4, - 0x90C6: 0xE042, - 0x90C7: 0xDBA8, - 0x90C8: 0xE043, - 0x90C9: 0xE044, - 0x90CA: 0xBDBC, - 0x90CB: 0xE045, - 0x90CC: 0xE046, - 0x90CD: 0xE047, - 0x90CE: 0xC0C9, - 0x90CF: 0xDBA3, - 0x90D0: 0xDBA6, - 0x90D1: 0xD6A3, - 0x90D2: 0xE048, - 0x90D3: 0xDBA9, - 0x90D4: 0xE049, - 0x90D5: 0xE04A, - 0x90D6: 0xE04B, - 0x90D7: 0xDBAD, - 0x90D8: 0xE04C, - 0x90D9: 0xE04D, - 0x90DA: 0xE04E, - 0x90DB: 0xDBAE, - 0x90DC: 0xDBAC, - 0x90DD: 0xBAC2, - 0x90DE: 0xE04F, - 0x90DF: 0xE050, - 0x90E0: 0xE051, - 0x90E1: 0xBFA4, - 0x90E2: 0xDBAB, - 0x90E3: 0xE052, - 0x90E4: 0xE053, - 0x90E5: 0xE054, - 0x90E6: 0xDBAA, - 0x90E7: 0xD4C7, - 0x90E8: 0xB2BF, - 0x90E9: 0xE055, - 0x90EA: 0xE056, - 0x90EB: 0xDBAF, - 0x90EC: 0xE057, - 0x90ED: 0xB9F9, - 0x90EE: 0xE058, - 0x90EF: 0xDBB0, - 0x90F0: 0xE059, - 0x90F1: 0xE05A, - 0x90F2: 0xE05B, - 0x90F3: 0xE05C, - 0x90F4: 0xB3BB, - 0x90F5: 0xE05D, - 0x90F6: 0xE05E, - 0x90F7: 0xE05F, - 0x90F8: 0xB5A6, - 0x90F9: 0xE060, - 0x90FA: 0xE061, - 0x90FB: 0xE062, - 0x90FC: 0xE063, - 0x90FD: 0xB6BC, - 0x90FE: 0xDBB1, - 0x90FF: 0xE064, - 0x9100: 0xE065, - 0x9101: 0xE066, - 0x9102: 0xB6F5, - 0x9103: 0xE067, - 0x9104: 0xDBB2, - 0x9105: 0xE068, - 0x9106: 0xE069, - 0x9107: 0xE06A, - 0x9108: 0xE06B, - 0x9109: 0xE06C, - 0x910A: 0xE06D, - 0x910B: 0xE06E, - 0x910C: 0xE06F, - 0x910D: 0xE070, - 0x910E: 0xE071, - 0x910F: 0xE072, - 0x9110: 0xE073, - 0x9111: 0xE074, - 0x9112: 0xE075, - 0x9113: 0xE076, - 0x9114: 0xE077, - 0x9115: 0xE078, - 0x9116: 0xE079, - 0x9117: 0xE07A, - 0x9118: 0xE07B, - 0x9119: 0xB1C9, - 0x911A: 0xE07C, - 0x911B: 0xE07D, - 0x911C: 0xE07E, - 0x911D: 0xE080, - 0x911E: 0xDBB4, - 0x911F: 0xE081, - 0x9120: 0xE082, - 0x9121: 0xE083, - 0x9122: 0xDBB3, - 0x9123: 0xDBB5, - 0x9124: 0xE084, - 0x9125: 0xE085, - 0x9126: 0xE086, - 0x9127: 0xE087, - 0x9128: 0xE088, - 0x9129: 0xE089, - 0x912A: 0xE08A, - 0x912B: 0xE08B, - 0x912C: 0xE08C, - 0x912D: 0xE08D, - 0x912E: 0xE08E, - 0x912F: 0xDBB7, - 0x9130: 0xE08F, - 0x9131: 0xDBB6, - 0x9132: 0xE090, - 0x9133: 0xE091, - 0x9134: 0xE092, - 0x9135: 0xE093, - 0x9136: 0xE094, - 0x9137: 0xE095, - 0x9138: 0xE096, - 0x9139: 0xDBB8, - 0x913A: 0xE097, - 0x913B: 0xE098, - 0x913C: 0xE099, - 0x913D: 0xE09A, - 0x913E: 0xE09B, - 0x913F: 0xE09C, - 0x9140: 0xE09D, - 0x9141: 0xE09E, - 0x9142: 0xE09F, - 0x9143: 0xDBB9, - 0x9144: 0xE0A0, - 0x9145: 0xE140, - 0x9146: 0xDBBA, - 0x9147: 0xE141, - 0x9148: 0xE142, - 0x9149: 0xD3CF, - 0x914A: 0xF4FA, - 0x914B: 0xC7F5, - 0x914C: 0xD7C3, - 0x914D: 0xC5E4, - 0x914E: 0xF4FC, - 0x914F: 0xF4FD, - 0x9150: 0xF4FB, - 0x9151: 0xE143, - 0x9152: 0xBEC6, - 0x9153: 0xE144, - 0x9154: 0xE145, - 0x9155: 0xE146, - 0x9156: 0xE147, - 0x9157: 0xD0EF, - 0x9158: 0xE148, - 0x9159: 0xE149, - 0x915A: 0xB7D3, - 0x915B: 0xE14A, - 0x915C: 0xE14B, - 0x915D: 0xD4CD, - 0x915E: 0xCCAA, - 0x915F: 0xE14C, - 0x9160: 0xE14D, - 0x9161: 0xF5A2, - 0x9162: 0xF5A1, - 0x9163: 0xBAA8, - 0x9164: 0xF4FE, - 0x9165: 0xCBD6, - 0x9166: 0xE14E, - 0x9167: 0xE14F, - 0x9168: 0xE150, - 0x9169: 0xF5A4, - 0x916A: 0xC0D2, - 0x916B: 0xE151, - 0x916C: 0xB3EA, - 0x916D: 0xE152, - 0x916E: 0xCDAA, - 0x916F: 0xF5A5, - 0x9170: 0xF5A3, - 0x9171: 0xBDB4, - 0x9172: 0xF5A8, - 0x9173: 0xE153, - 0x9174: 0xF5A9, - 0x9175: 0xBDCD, - 0x9176: 0xC3B8, - 0x9177: 0xBFE1, - 0x9178: 0xCBE1, - 0x9179: 0xF5AA, - 0x917A: 0xE154, - 0x917B: 0xE155, - 0x917C: 0xE156, - 0x917D: 0xF5A6, - 0x917E: 0xF5A7, - 0x917F: 0xC4F0, - 0x9180: 0xE157, - 0x9181: 0xE158, - 0x9182: 0xE159, - 0x9183: 0xE15A, - 0x9184: 0xE15B, - 0x9185: 0xF5AC, - 0x9186: 0xE15C, - 0x9187: 0xB4BC, - 0x9188: 0xE15D, - 0x9189: 0xD7ED, - 0x918A: 0xE15E, - 0x918B: 0xB4D7, - 0x918C: 0xF5AB, - 0x918D: 0xF5AE, - 0x918E: 0xE15F, - 0x918F: 0xE160, - 0x9190: 0xF5AD, - 0x9191: 0xF5AF, - 0x9192: 0xD0D1, - 0x9193: 0xE161, - 0x9194: 0xE162, - 0x9195: 0xE163, - 0x9196: 0xE164, - 0x9197: 0xE165, - 0x9198: 0xE166, - 0x9199: 0xE167, - 0x919A: 0xC3D1, - 0x919B: 0xC8A9, - 0x919C: 0xE168, - 0x919D: 0xE169, - 0x919E: 0xE16A, - 0x919F: 0xE16B, - 0x91A0: 0xE16C, - 0x91A1: 0xE16D, - 0x91A2: 0xF5B0, - 0x91A3: 0xF5B1, - 0x91A4: 0xE16E, - 0x91A5: 0xE16F, - 0x91A6: 0xE170, - 0x91A7: 0xE171, - 0x91A8: 0xE172, - 0x91A9: 0xE173, - 0x91AA: 0xF5B2, - 0x91AB: 0xE174, - 0x91AC: 0xE175, - 0x91AD: 0xF5B3, - 0x91AE: 0xF5B4, - 0x91AF: 0xF5B5, - 0x91B0: 0xE176, - 0x91B1: 0xE177, - 0x91B2: 0xE178, - 0x91B3: 0xE179, - 0x91B4: 0xF5B7, - 0x91B5: 0xF5B6, - 0x91B6: 0xE17A, - 0x91B7: 0xE17B, - 0x91B8: 0xE17C, - 0x91B9: 0xE17D, - 0x91BA: 0xF5B8, - 0x91BB: 0xE17E, - 0x91BC: 0xE180, - 0x91BD: 0xE181, - 0x91BE: 0xE182, - 0x91BF: 0xE183, - 0x91C0: 0xE184, - 0x91C1: 0xE185, - 0x91C2: 0xE186, - 0x91C3: 0xE187, - 0x91C4: 0xE188, - 0x91C5: 0xE189, - 0x91C6: 0xE18A, - 0x91C7: 0xB2C9, - 0x91C8: 0xE18B, - 0x91C9: 0xD3D4, - 0x91CA: 0xCACD, - 0x91CB: 0xE18C, - 0x91CC: 0xC0EF, - 0x91CD: 0xD6D8, - 0x91CE: 0xD2B0, - 0x91CF: 0xC1BF, - 0x91D0: 0xE18D, - 0x91D1: 0xBDF0, - 0x91D2: 0xE18E, - 0x91D3: 0xE18F, - 0x91D4: 0xE190, - 0x91D5: 0xE191, - 0x91D6: 0xE192, - 0x91D7: 0xE193, - 0x91D8: 0xE194, - 0x91D9: 0xE195, - 0x91DA: 0xE196, - 0x91DB: 0xE197, - 0x91DC: 0xB8AA, - 0x91DD: 0xE198, - 0x91DE: 0xE199, - 0x91DF: 0xE19A, - 0x91E0: 0xE19B, - 0x91E1: 0xE19C, - 0x91E2: 0xE19D, - 0x91E3: 0xE19E, - 0x91E4: 0xE19F, - 0x91E5: 0xE1A0, - 0x91E6: 0xE240, - 0x91E7: 0xE241, - 0x91E8: 0xE242, - 0x91E9: 0xE243, - 0x91EA: 0xE244, - 0x91EB: 0xE245, - 0x91EC: 0xE246, - 0x91ED: 0xE247, - 0x91EE: 0xE248, - 0x91EF: 0xE249, - 0x91F0: 0xE24A, - 0x91F1: 0xE24B, - 0x91F2: 0xE24C, - 0x91F3: 0xE24D, - 0x91F4: 0xE24E, - 0x91F5: 0xE24F, - 0x91F6: 0xE250, - 0x91F7: 0xE251, - 0x91F8: 0xE252, - 0x91F9: 0xE253, - 0x91FA: 0xE254, - 0x91FB: 0xE255, - 0x91FC: 0xE256, - 0x91FD: 0xE257, - 0x91FE: 0xE258, - 0x91FF: 0xE259, - 0x9200: 0xE25A, - 0x9201: 0xE25B, - 0x9202: 0xE25C, - 0x9203: 0xE25D, - 0x9204: 0xE25E, - 0x9205: 0xE25F, - 0x9206: 0xE260, - 0x9207: 0xE261, - 0x9208: 0xE262, - 0x9209: 0xE263, - 0x920A: 0xE264, - 0x920B: 0xE265, - 0x920C: 0xE266, - 0x920D: 0xE267, - 0x920E: 0xE268, - 0x920F: 0xE269, - 0x9210: 0xE26A, - 0x9211: 0xE26B, - 0x9212: 0xE26C, - 0x9213: 0xE26D, - 0x9214: 0xE26E, - 0x9215: 0xE26F, - 0x9216: 0xE270, - 0x9217: 0xE271, - 0x9218: 0xE272, - 0x9219: 0xE273, - 0x921A: 0xE274, - 0x921B: 0xE275, - 0x921C: 0xE276, - 0x921D: 0xE277, - 0x921E: 0xE278, - 0x921F: 0xE279, - 0x9220: 0xE27A, - 0x9221: 0xE27B, - 0x9222: 0xE27C, - 0x9223: 0xE27D, - 0x9224: 0xE27E, - 0x9225: 0xE280, - 0x9226: 0xE281, - 0x9227: 0xE282, - 0x9228: 0xE283, - 0x9229: 0xE284, - 0x922A: 0xE285, - 0x922B: 0xE286, - 0x922C: 0xE287, - 0x922D: 0xE288, - 0x922E: 0xE289, - 0x922F: 0xE28A, - 0x9230: 0xE28B, - 0x9231: 0xE28C, - 0x9232: 0xE28D, - 0x9233: 0xE28E, - 0x9234: 0xE28F, - 0x9235: 0xE290, - 0x9236: 0xE291, - 0x9237: 0xE292, - 0x9238: 0xE293, - 0x9239: 0xE294, - 0x923A: 0xE295, - 0x923B: 0xE296, - 0x923C: 0xE297, - 0x923D: 0xE298, - 0x923E: 0xE299, - 0x923F: 0xE29A, - 0x9240: 0xE29B, - 0x9241: 0xE29C, - 0x9242: 0xE29D, - 0x9243: 0xE29E, - 0x9244: 0xE29F, - 0x9245: 0xE2A0, - 0x9246: 0xE340, - 0x9247: 0xE341, - 0x9248: 0xE342, - 0x9249: 0xE343, - 0x924A: 0xE344, - 0x924B: 0xE345, - 0x924C: 0xE346, - 0x924D: 0xE347, - 0x924E: 0xE348, - 0x924F: 0xE349, - 0x9250: 0xE34A, - 0x9251: 0xE34B, - 0x9252: 0xE34C, - 0x9253: 0xE34D, - 0x9254: 0xE34E, - 0x9255: 0xE34F, - 0x9256: 0xE350, - 0x9257: 0xE351, - 0x9258: 0xE352, - 0x9259: 0xE353, - 0x925A: 0xE354, - 0x925B: 0xE355, - 0x925C: 0xE356, - 0x925D: 0xE357, - 0x925E: 0xE358, - 0x925F: 0xE359, - 0x9260: 0xE35A, - 0x9261: 0xE35B, - 0x9262: 0xE35C, - 0x9263: 0xE35D, - 0x9264: 0xE35E, - 0x9265: 0xE35F, - 0x9266: 0xE360, - 0x9267: 0xE361, - 0x9268: 0xE362, - 0x9269: 0xE363, - 0x926A: 0xE364, - 0x926B: 0xE365, - 0x926C: 0xE366, - 0x926D: 0xE367, - 0x926E: 0xE368, - 0x926F: 0xE369, - 0x9270: 0xE36A, - 0x9271: 0xE36B, - 0x9272: 0xE36C, - 0x9273: 0xE36D, - 0x9274: 0xBCF8, - 0x9275: 0xE36E, - 0x9276: 0xE36F, - 0x9277: 0xE370, - 0x9278: 0xE371, - 0x9279: 0xE372, - 0x927A: 0xE373, - 0x927B: 0xE374, - 0x927C: 0xE375, - 0x927D: 0xE376, - 0x927E: 0xE377, - 0x927F: 0xE378, - 0x9280: 0xE379, - 0x9281: 0xE37A, - 0x9282: 0xE37B, - 0x9283: 0xE37C, - 0x9284: 0xE37D, - 0x9285: 0xE37E, - 0x9286: 0xE380, - 0x9287: 0xE381, - 0x9288: 0xE382, - 0x9289: 0xE383, - 0x928A: 0xE384, - 0x928B: 0xE385, - 0x928C: 0xE386, - 0x928D: 0xE387, - 0x928E: 0xF6C6, - 0x928F: 0xE388, - 0x9290: 0xE389, - 0x9291: 0xE38A, - 0x9292: 0xE38B, - 0x9293: 0xE38C, - 0x9294: 0xE38D, - 0x9295: 0xE38E, - 0x9296: 0xE38F, - 0x9297: 0xE390, - 0x9298: 0xE391, - 0x9299: 0xE392, - 0x929A: 0xE393, - 0x929B: 0xE394, - 0x929C: 0xE395, - 0x929D: 0xE396, - 0x929E: 0xE397, - 0x929F: 0xE398, - 0x92A0: 0xE399, - 0x92A1: 0xE39A, - 0x92A2: 0xE39B, - 0x92A3: 0xE39C, - 0x92A4: 0xE39D, - 0x92A5: 0xE39E, - 0x92A6: 0xE39F, - 0x92A7: 0xE3A0, - 0x92A8: 0xE440, - 0x92A9: 0xE441, - 0x92AA: 0xE442, - 0x92AB: 0xE443, - 0x92AC: 0xE444, - 0x92AD: 0xE445, - 0x92AE: 0xF6C7, - 0x92AF: 0xE446, - 0x92B0: 0xE447, - 0x92B1: 0xE448, - 0x92B2: 0xE449, - 0x92B3: 0xE44A, - 0x92B4: 0xE44B, - 0x92B5: 0xE44C, - 0x92B6: 0xE44D, - 0x92B7: 0xE44E, - 0x92B8: 0xE44F, - 0x92B9: 0xE450, - 0x92BA: 0xE451, - 0x92BB: 0xE452, - 0x92BC: 0xE453, - 0x92BD: 0xE454, - 0x92BE: 0xE455, - 0x92BF: 0xE456, - 0x92C0: 0xE457, - 0x92C1: 0xE458, - 0x92C2: 0xE459, - 0x92C3: 0xE45A, - 0x92C4: 0xE45B, - 0x92C5: 0xE45C, - 0x92C6: 0xE45D, - 0x92C7: 0xE45E, - 0x92C8: 0xF6C8, - 0x92C9: 0xE45F, - 0x92CA: 0xE460, - 0x92CB: 0xE461, - 0x92CC: 0xE462, - 0x92CD: 0xE463, - 0x92CE: 0xE464, - 0x92CF: 0xE465, - 0x92D0: 0xE466, - 0x92D1: 0xE467, - 0x92D2: 0xE468, - 0x92D3: 0xE469, - 0x92D4: 0xE46A, - 0x92D5: 0xE46B, - 0x92D6: 0xE46C, - 0x92D7: 0xE46D, - 0x92D8: 0xE46E, - 0x92D9: 0xE46F, - 0x92DA: 0xE470, - 0x92DB: 0xE471, - 0x92DC: 0xE472, - 0x92DD: 0xE473, - 0x92DE: 0xE474, - 0x92DF: 0xE475, - 0x92E0: 0xE476, - 0x92E1: 0xE477, - 0x92E2: 0xE478, - 0x92E3: 0xE479, - 0x92E4: 0xE47A, - 0x92E5: 0xE47B, - 0x92E6: 0xE47C, - 0x92E7: 0xE47D, - 0x92E8: 0xE47E, - 0x92E9: 0xE480, - 0x92EA: 0xE481, - 0x92EB: 0xE482, - 0x92EC: 0xE483, - 0x92ED: 0xE484, - 0x92EE: 0xE485, - 0x92EF: 0xE486, - 0x92F0: 0xE487, - 0x92F1: 0xE488, - 0x92F2: 0xE489, - 0x92F3: 0xE48A, - 0x92F4: 0xE48B, - 0x92F5: 0xE48C, - 0x92F6: 0xE48D, - 0x92F7: 0xE48E, - 0x92F8: 0xE48F, - 0x92F9: 0xE490, - 0x92FA: 0xE491, - 0x92FB: 0xE492, - 0x92FC: 0xE493, - 0x92FD: 0xE494, - 0x92FE: 0xE495, - 0x92FF: 0xE496, - 0x9300: 0xE497, - 0x9301: 0xE498, - 0x9302: 0xE499, - 0x9303: 0xE49A, - 0x9304: 0xE49B, - 0x9305: 0xE49C, - 0x9306: 0xE49D, - 0x9307: 0xE49E, - 0x9308: 0xE49F, - 0x9309: 0xE4A0, - 0x930A: 0xE540, - 0x930B: 0xE541, - 0x930C: 0xE542, - 0x930D: 0xE543, - 0x930E: 0xE544, - 0x930F: 0xE545, - 0x9310: 0xE546, - 0x9311: 0xE547, - 0x9312: 0xE548, - 0x9313: 0xE549, - 0x9314: 0xE54A, - 0x9315: 0xE54B, - 0x9316: 0xE54C, - 0x9317: 0xE54D, - 0x9318: 0xE54E, - 0x9319: 0xE54F, - 0x931A: 0xE550, - 0x931B: 0xE551, - 0x931C: 0xE552, - 0x931D: 0xE553, - 0x931E: 0xE554, - 0x931F: 0xE555, - 0x9320: 0xE556, - 0x9321: 0xE557, - 0x9322: 0xE558, - 0x9323: 0xE559, - 0x9324: 0xE55A, - 0x9325: 0xE55B, - 0x9326: 0xE55C, - 0x9327: 0xE55D, - 0x9328: 0xE55E, - 0x9329: 0xE55F, - 0x932A: 0xE560, - 0x932B: 0xE561, - 0x932C: 0xE562, - 0x932D: 0xE563, - 0x932E: 0xE564, - 0x932F: 0xE565, - 0x9330: 0xE566, - 0x9331: 0xE567, - 0x9332: 0xE568, - 0x9333: 0xE569, - 0x9334: 0xE56A, - 0x9335: 0xE56B, - 0x9336: 0xE56C, - 0x9337: 0xE56D, - 0x9338: 0xE56E, - 0x9339: 0xE56F, - 0x933A: 0xE570, - 0x933B: 0xE571, - 0x933C: 0xE572, - 0x933D: 0xE573, - 0x933E: 0xF6C9, - 0x933F: 0xE574, - 0x9340: 0xE575, - 0x9341: 0xE576, - 0x9342: 0xE577, - 0x9343: 0xE578, - 0x9344: 0xE579, - 0x9345: 0xE57A, - 0x9346: 0xE57B, - 0x9347: 0xE57C, - 0x9348: 0xE57D, - 0x9349: 0xE57E, - 0x934A: 0xE580, - 0x934B: 0xE581, - 0x934C: 0xE582, - 0x934D: 0xE583, - 0x934E: 0xE584, - 0x934F: 0xE585, - 0x9350: 0xE586, - 0x9351: 0xE587, - 0x9352: 0xE588, - 0x9353: 0xE589, - 0x9354: 0xE58A, - 0x9355: 0xE58B, - 0x9356: 0xE58C, - 0x9357: 0xE58D, - 0x9358: 0xE58E, - 0x9359: 0xE58F, - 0x935A: 0xE590, - 0x935B: 0xE591, - 0x935C: 0xE592, - 0x935D: 0xE593, - 0x935E: 0xE594, - 0x935F: 0xE595, - 0x9360: 0xE596, - 0x9361: 0xE597, - 0x9362: 0xE598, - 0x9363: 0xE599, - 0x9364: 0xE59A, - 0x9365: 0xE59B, - 0x9366: 0xE59C, - 0x9367: 0xE59D, - 0x9368: 0xE59E, - 0x9369: 0xE59F, - 0x936A: 0xF6CA, - 0x936B: 0xE5A0, - 0x936C: 0xE640, - 0x936D: 0xE641, - 0x936E: 0xE642, - 0x936F: 0xE643, - 0x9370: 0xE644, - 0x9371: 0xE645, - 0x9372: 0xE646, - 0x9373: 0xE647, - 0x9374: 0xE648, - 0x9375: 0xE649, - 0x9376: 0xE64A, - 0x9377: 0xE64B, - 0x9378: 0xE64C, - 0x9379: 0xE64D, - 0x937A: 0xE64E, - 0x937B: 0xE64F, - 0x937C: 0xE650, - 0x937D: 0xE651, - 0x937E: 0xE652, - 0x937F: 0xE653, - 0x9380: 0xE654, - 0x9381: 0xE655, - 0x9382: 0xE656, - 0x9383: 0xE657, - 0x9384: 0xE658, - 0x9385: 0xE659, - 0x9386: 0xE65A, - 0x9387: 0xE65B, - 0x9388: 0xE65C, - 0x9389: 0xE65D, - 0x938A: 0xE65E, - 0x938B: 0xE65F, - 0x938C: 0xE660, - 0x938D: 0xE661, - 0x938E: 0xE662, - 0x938F: 0xF6CC, - 0x9390: 0xE663, - 0x9391: 0xE664, - 0x9392: 0xE665, - 0x9393: 0xE666, - 0x9394: 0xE667, - 0x9395: 0xE668, - 0x9396: 0xE669, - 0x9397: 0xE66A, - 0x9398: 0xE66B, - 0x9399: 0xE66C, - 0x939A: 0xE66D, - 0x939B: 0xE66E, - 0x939C: 0xE66F, - 0x939D: 0xE670, - 0x939E: 0xE671, - 0x939F: 0xE672, - 0x93A0: 0xE673, - 0x93A1: 0xE674, - 0x93A2: 0xE675, - 0x93A3: 0xE676, - 0x93A4: 0xE677, - 0x93A5: 0xE678, - 0x93A6: 0xE679, - 0x93A7: 0xE67A, - 0x93A8: 0xE67B, - 0x93A9: 0xE67C, - 0x93AA: 0xE67D, - 0x93AB: 0xE67E, - 0x93AC: 0xE680, - 0x93AD: 0xE681, - 0x93AE: 0xE682, - 0x93AF: 0xE683, - 0x93B0: 0xE684, - 0x93B1: 0xE685, - 0x93B2: 0xE686, - 0x93B3: 0xE687, - 0x93B4: 0xE688, - 0x93B5: 0xE689, - 0x93B6: 0xE68A, - 0x93B7: 0xE68B, - 0x93B8: 0xE68C, - 0x93B9: 0xE68D, - 0x93BA: 0xE68E, - 0x93BB: 0xE68F, - 0x93BC: 0xE690, - 0x93BD: 0xE691, - 0x93BE: 0xE692, - 0x93BF: 0xE693, - 0x93C0: 0xE694, - 0x93C1: 0xE695, - 0x93C2: 0xE696, - 0x93C3: 0xE697, - 0x93C4: 0xE698, - 0x93C5: 0xE699, - 0x93C6: 0xE69A, - 0x93C7: 0xE69B, - 0x93C8: 0xE69C, - 0x93C9: 0xE69D, - 0x93CA: 0xF6CB, - 0x93CB: 0xE69E, - 0x93CC: 0xE69F, - 0x93CD: 0xE6A0, - 0x93CE: 0xE740, - 0x93CF: 0xE741, - 0x93D0: 0xE742, - 0x93D1: 0xE743, - 0x93D2: 0xE744, - 0x93D3: 0xE745, - 0x93D4: 0xE746, - 0x93D5: 0xE747, - 0x93D6: 0xF7E9, - 0x93D7: 0xE748, - 0x93D8: 0xE749, - 0x93D9: 0xE74A, - 0x93DA: 0xE74B, - 0x93DB: 0xE74C, - 0x93DC: 0xE74D, - 0x93DD: 0xE74E, - 0x93DE: 0xE74F, - 0x93DF: 0xE750, - 0x93E0: 0xE751, - 0x93E1: 0xE752, - 0x93E2: 0xE753, - 0x93E3: 0xE754, - 0x93E4: 0xE755, - 0x93E5: 0xE756, - 0x93E6: 0xE757, - 0x93E7: 0xE758, - 0x93E8: 0xE759, - 0x93E9: 0xE75A, - 0x93EA: 0xE75B, - 0x93EB: 0xE75C, - 0x93EC: 0xE75D, - 0x93ED: 0xE75E, - 0x93EE: 0xE75F, - 0x93EF: 0xE760, - 0x93F0: 0xE761, - 0x93F1: 0xE762, - 0x93F2: 0xE763, - 0x93F3: 0xE764, - 0x93F4: 0xE765, - 0x93F5: 0xE766, - 0x93F6: 0xE767, - 0x93F7: 0xE768, - 0x93F8: 0xE769, - 0x93F9: 0xE76A, - 0x93FA: 0xE76B, - 0x93FB: 0xE76C, - 0x93FC: 0xE76D, - 0x93FD: 0xE76E, - 0x93FE: 0xE76F, - 0x93FF: 0xE770, - 0x9400: 0xE771, - 0x9401: 0xE772, - 0x9402: 0xE773, - 0x9403: 0xE774, - 0x9404: 0xE775, - 0x9405: 0xE776, - 0x9406: 0xE777, - 0x9407: 0xE778, - 0x9408: 0xE779, - 0x9409: 0xE77A, - 0x940A: 0xE77B, - 0x940B: 0xE77C, - 0x940C: 0xE77D, - 0x940D: 0xE77E, - 0x940E: 0xE780, - 0x940F: 0xE781, - 0x9410: 0xE782, - 0x9411: 0xE783, - 0x9412: 0xE784, - 0x9413: 0xE785, - 0x9414: 0xE786, - 0x9415: 0xE787, - 0x9416: 0xE788, - 0x9417: 0xE789, - 0x9418: 0xE78A, - 0x9419: 0xE78B, - 0x941A: 0xE78C, - 0x941B: 0xE78D, - 0x941C: 0xE78E, - 0x941D: 0xE78F, - 0x941E: 0xE790, - 0x941F: 0xE791, - 0x9420: 0xE792, - 0x9421: 0xE793, - 0x9422: 0xE794, - 0x9423: 0xE795, - 0x9424: 0xE796, - 0x9425: 0xE797, - 0x9426: 0xE798, - 0x9427: 0xE799, - 0x9428: 0xE79A, - 0x9429: 0xE79B, - 0x942A: 0xE79C, - 0x942B: 0xE79D, - 0x942C: 0xE79E, - 0x942D: 0xE79F, - 0x942E: 0xE7A0, - 0x942F: 0xE840, - 0x9430: 0xE841, - 0x9431: 0xE842, - 0x9432: 0xE843, - 0x9433: 0xE844, - 0x9434: 0xE845, - 0x9435: 0xE846, - 0x9436: 0xE847, - 0x9437: 0xE848, - 0x9438: 0xE849, - 0x9439: 0xE84A, - 0x943A: 0xE84B, - 0x943B: 0xE84C, - 0x943C: 0xE84D, - 0x943D: 0xE84E, - 0x943E: 0xF6CD, - 0x943F: 0xE84F, - 0x9440: 0xE850, - 0x9441: 0xE851, - 0x9442: 0xE852, - 0x9443: 0xE853, - 0x9444: 0xE854, - 0x9445: 0xE855, - 0x9446: 0xE856, - 0x9447: 0xE857, - 0x9448: 0xE858, - 0x9449: 0xE859, - 0x944A: 0xE85A, - 0x944B: 0xE85B, - 0x944C: 0xE85C, - 0x944D: 0xE85D, - 0x944E: 0xE85E, - 0x944F: 0xE85F, - 0x9450: 0xE860, - 0x9451: 0xE861, - 0x9452: 0xE862, - 0x9453: 0xE863, - 0x9454: 0xE864, - 0x9455: 0xE865, - 0x9456: 0xE866, - 0x9457: 0xE867, - 0x9458: 0xE868, - 0x9459: 0xE869, - 0x945A: 0xE86A, - 0x945B: 0xE86B, - 0x945C: 0xE86C, - 0x945D: 0xE86D, - 0x945E: 0xE86E, - 0x945F: 0xE86F, - 0x9460: 0xE870, - 0x9461: 0xE871, - 0x9462: 0xE872, - 0x9463: 0xE873, - 0x9464: 0xE874, - 0x9465: 0xE875, - 0x9466: 0xE876, - 0x9467: 0xE877, - 0x9468: 0xE878, - 0x9469: 0xE879, - 0x946A: 0xE87A, - 0x946B: 0xF6CE, - 0x946C: 0xE87B, - 0x946D: 0xE87C, - 0x946E: 0xE87D, - 0x946F: 0xE87E, - 0x9470: 0xE880, - 0x9471: 0xE881, - 0x9472: 0xE882, - 0x9473: 0xE883, - 0x9474: 0xE884, - 0x9475: 0xE885, - 0x9476: 0xE886, - 0x9477: 0xE887, - 0x9478: 0xE888, - 0x9479: 0xE889, - 0x947A: 0xE88A, - 0x947B: 0xE88B, - 0x947C: 0xE88C, - 0x947D: 0xE88D, - 0x947E: 0xE88E, - 0x947F: 0xE88F, - 0x9480: 0xE890, - 0x9481: 0xE891, - 0x9482: 0xE892, - 0x9483: 0xE893, - 0x9484: 0xE894, - 0x9485: 0xEEC4, - 0x9486: 0xEEC5, - 0x9487: 0xEEC6, - 0x9488: 0xD5EB, - 0x9489: 0xB6A4, - 0x948A: 0xEEC8, - 0x948B: 0xEEC7, - 0x948C: 0xEEC9, - 0x948D: 0xEECA, - 0x948E: 0xC7A5, - 0x948F: 0xEECB, - 0x9490: 0xEECC, - 0x9491: 0xE895, - 0x9492: 0xB7B0, - 0x9493: 0xB5F6, - 0x9494: 0xEECD, - 0x9495: 0xEECF, - 0x9496: 0xE896, - 0x9497: 0xEECE, - 0x9498: 0xE897, - 0x9499: 0xB8C6, - 0x949A: 0xEED0, - 0x949B: 0xEED1, - 0x949C: 0xEED2, - 0x949D: 0xB6DB, - 0x949E: 0xB3AE, - 0x949F: 0xD6D3, - 0x94A0: 0xC4C6, - 0x94A1: 0xB1B5, - 0x94A2: 0xB8D6, - 0x94A3: 0xEED3, - 0x94A4: 0xEED4, - 0x94A5: 0xD4BF, - 0x94A6: 0xC7D5, - 0x94A7: 0xBEFB, - 0x94A8: 0xCED9, - 0x94A9: 0xB9B3, - 0x94AA: 0xEED6, - 0x94AB: 0xEED5, - 0x94AC: 0xEED8, - 0x94AD: 0xEED7, - 0x94AE: 0xC5A5, - 0x94AF: 0xEED9, - 0x94B0: 0xEEDA, - 0x94B1: 0xC7AE, - 0x94B2: 0xEEDB, - 0x94B3: 0xC7AF, - 0x94B4: 0xEEDC, - 0x94B5: 0xB2A7, - 0x94B6: 0xEEDD, - 0x94B7: 0xEEDE, - 0x94B8: 0xEEDF, - 0x94B9: 0xEEE0, - 0x94BA: 0xEEE1, - 0x94BB: 0xD7EA, - 0x94BC: 0xEEE2, - 0x94BD: 0xEEE3, - 0x94BE: 0xBCD8, - 0x94BF: 0xEEE4, - 0x94C0: 0xD3CB, - 0x94C1: 0xCCFA, - 0x94C2: 0xB2AC, - 0x94C3: 0xC1E5, - 0x94C4: 0xEEE5, - 0x94C5: 0xC7A6, - 0x94C6: 0xC3AD, - 0x94C7: 0xE898, - 0x94C8: 0xEEE6, - 0x94C9: 0xEEE7, - 0x94CA: 0xEEE8, - 0x94CB: 0xEEE9, - 0x94CC: 0xEEEA, - 0x94CD: 0xEEEB, - 0x94CE: 0xEEEC, - 0x94CF: 0xE899, - 0x94D0: 0xEEED, - 0x94D1: 0xEEEE, - 0x94D2: 0xEEEF, - 0x94D3: 0xE89A, - 0x94D4: 0xE89B, - 0x94D5: 0xEEF0, - 0x94D6: 0xEEF1, - 0x94D7: 0xEEF2, - 0x94D8: 0xEEF4, - 0x94D9: 0xEEF3, - 0x94DA: 0xE89C, - 0x94DB: 0xEEF5, - 0x94DC: 0xCDAD, - 0x94DD: 0xC2C1, - 0x94DE: 0xEEF6, - 0x94DF: 0xEEF7, - 0x94E0: 0xEEF8, - 0x94E1: 0xD5A1, - 0x94E2: 0xEEF9, - 0x94E3: 0xCFB3, - 0x94E4: 0xEEFA, - 0x94E5: 0xEEFB, - 0x94E6: 0xE89D, - 0x94E7: 0xEEFC, - 0x94E8: 0xEEFD, - 0x94E9: 0xEFA1, - 0x94EA: 0xEEFE, - 0x94EB: 0xEFA2, - 0x94EC: 0xB8F5, - 0x94ED: 0xC3FA, - 0x94EE: 0xEFA3, - 0x94EF: 0xEFA4, - 0x94F0: 0xBDC2, - 0x94F1: 0xD2BF, - 0x94F2: 0xB2F9, - 0x94F3: 0xEFA5, - 0x94F4: 0xEFA6, - 0x94F5: 0xEFA7, - 0x94F6: 0xD2F8, - 0x94F7: 0xEFA8, - 0x94F8: 0xD6FD, - 0x94F9: 0xEFA9, - 0x94FA: 0xC6CC, - 0x94FB: 0xE89E, - 0x94FC: 0xEFAA, - 0x94FD: 0xEFAB, - 0x94FE: 0xC1B4, - 0x94FF: 0xEFAC, - 0x9500: 0xCFFA, - 0x9501: 0xCBF8, - 0x9502: 0xEFAE, - 0x9503: 0xEFAD, - 0x9504: 0xB3FA, - 0x9505: 0xB9F8, - 0x9506: 0xEFAF, - 0x9507: 0xEFB0, - 0x9508: 0xD0E2, - 0x9509: 0xEFB1, - 0x950A: 0xEFB2, - 0x950B: 0xB7E6, - 0x950C: 0xD0BF, - 0x950D: 0xEFB3, - 0x950E: 0xEFB4, - 0x950F: 0xEFB5, - 0x9510: 0xC8F1, - 0x9511: 0xCCE0, - 0x9512: 0xEFB6, - 0x9513: 0xEFB7, - 0x9514: 0xEFB8, - 0x9515: 0xEFB9, - 0x9516: 0xEFBA, - 0x9517: 0xD5E0, - 0x9518: 0xEFBB, - 0x9519: 0xB4ED, - 0x951A: 0xC3AA, - 0x951B: 0xEFBC, - 0x951C: 0xE89F, - 0x951D: 0xEFBD, - 0x951E: 0xEFBE, - 0x951F: 0xEFBF, - 0x9520: 0xE8A0, - 0x9521: 0xCEFD, - 0x9522: 0xEFC0, - 0x9523: 0xC2E0, - 0x9524: 0xB4B8, - 0x9525: 0xD7B6, - 0x9526: 0xBDF5, - 0x9527: 0xE940, - 0x9528: 0xCFC7, - 0x9529: 0xEFC3, - 0x952A: 0xEFC1, - 0x952B: 0xEFC2, - 0x952C: 0xEFC4, - 0x952D: 0xB6A7, - 0x952E: 0xBCFC, - 0x952F: 0xBEE2, - 0x9530: 0xC3CC, - 0x9531: 0xEFC5, - 0x9532: 0xEFC6, - 0x9533: 0xE941, - 0x9534: 0xEFC7, - 0x9535: 0xEFCF, - 0x9536: 0xEFC8, - 0x9537: 0xEFC9, - 0x9538: 0xEFCA, - 0x9539: 0xC7C2, - 0x953A: 0xEFF1, - 0x953B: 0xB6CD, - 0x953C: 0xEFCB, - 0x953D: 0xE942, - 0x953E: 0xEFCC, - 0x953F: 0xEFCD, - 0x9540: 0xB6C6, - 0x9541: 0xC3BE, - 0x9542: 0xEFCE, - 0x9543: 0xE943, - 0x9544: 0xEFD0, - 0x9545: 0xEFD1, - 0x9546: 0xEFD2, - 0x9547: 0xD5F2, - 0x9548: 0xE944, - 0x9549: 0xEFD3, - 0x954A: 0xC4F7, - 0x954B: 0xE945, - 0x954C: 0xEFD4, - 0x954D: 0xC4F8, - 0x954E: 0xEFD5, - 0x954F: 0xEFD6, - 0x9550: 0xB8E4, - 0x9551: 0xB0F7, - 0x9552: 0xEFD7, - 0x9553: 0xEFD8, - 0x9554: 0xEFD9, - 0x9555: 0xE946, - 0x9556: 0xEFDA, - 0x9557: 0xEFDB, - 0x9558: 0xEFDC, - 0x9559: 0xEFDD, - 0x955A: 0xE947, - 0x955B: 0xEFDE, - 0x955C: 0xBEB5, - 0x955D: 0xEFE1, - 0x955E: 0xEFDF, - 0x955F: 0xEFE0, - 0x9560: 0xE948, - 0x9561: 0xEFE2, - 0x9562: 0xEFE3, - 0x9563: 0xC1CD, - 0x9564: 0xEFE4, - 0x9565: 0xEFE5, - 0x9566: 0xEFE6, - 0x9567: 0xEFE7, - 0x9568: 0xEFE8, - 0x9569: 0xEFE9, - 0x956A: 0xEFEA, - 0x956B: 0xEFEB, - 0x956C: 0xEFEC, - 0x956D: 0xC0D8, - 0x956E: 0xE949, - 0x956F: 0xEFED, - 0x9570: 0xC1AD, - 0x9571: 0xEFEE, - 0x9572: 0xEFEF, - 0x9573: 0xEFF0, - 0x9574: 0xE94A, - 0x9575: 0xE94B, - 0x9576: 0xCFE2, - 0x9577: 0xE94C, - 0x9578: 0xE94D, - 0x9579: 0xE94E, - 0x957A: 0xE94F, - 0x957B: 0xE950, - 0x957C: 0xE951, - 0x957D: 0xE952, - 0x957E: 0xE953, - 0x957F: 0xB3A4, - 0x9580: 0xE954, - 0x9581: 0xE955, - 0x9582: 0xE956, - 0x9583: 0xE957, - 0x9584: 0xE958, - 0x9585: 0xE959, - 0x9586: 0xE95A, - 0x9587: 0xE95B, - 0x9588: 0xE95C, - 0x9589: 0xE95D, - 0x958A: 0xE95E, - 0x958B: 0xE95F, - 0x958C: 0xE960, - 0x958D: 0xE961, - 0x958E: 0xE962, - 0x958F: 0xE963, - 0x9590: 0xE964, - 0x9591: 0xE965, - 0x9592: 0xE966, - 0x9593: 0xE967, - 0x9594: 0xE968, - 0x9595: 0xE969, - 0x9596: 0xE96A, - 0x9597: 0xE96B, - 0x9598: 0xE96C, - 0x9599: 0xE96D, - 0x959A: 0xE96E, - 0x959B: 0xE96F, - 0x959C: 0xE970, - 0x959D: 0xE971, - 0x959E: 0xE972, - 0x959F: 0xE973, - 0x95A0: 0xE974, - 0x95A1: 0xE975, - 0x95A2: 0xE976, - 0x95A3: 0xE977, - 0x95A4: 0xE978, - 0x95A5: 0xE979, - 0x95A6: 0xE97A, - 0x95A7: 0xE97B, - 0x95A8: 0xE97C, - 0x95A9: 0xE97D, - 0x95AA: 0xE97E, - 0x95AB: 0xE980, - 0x95AC: 0xE981, - 0x95AD: 0xE982, - 0x95AE: 0xE983, - 0x95AF: 0xE984, - 0x95B0: 0xE985, - 0x95B1: 0xE986, - 0x95B2: 0xE987, - 0x95B3: 0xE988, - 0x95B4: 0xE989, - 0x95B5: 0xE98A, - 0x95B6: 0xE98B, - 0x95B7: 0xE98C, - 0x95B8: 0xE98D, - 0x95B9: 0xE98E, - 0x95BA: 0xE98F, - 0x95BB: 0xE990, - 0x95BC: 0xE991, - 0x95BD: 0xE992, - 0x95BE: 0xE993, - 0x95BF: 0xE994, - 0x95C0: 0xE995, - 0x95C1: 0xE996, - 0x95C2: 0xE997, - 0x95C3: 0xE998, - 0x95C4: 0xE999, - 0x95C5: 0xE99A, - 0x95C6: 0xE99B, - 0x95C7: 0xE99C, - 0x95C8: 0xE99D, - 0x95C9: 0xE99E, - 0x95CA: 0xE99F, - 0x95CB: 0xE9A0, - 0x95CC: 0xEA40, - 0x95CD: 0xEA41, - 0x95CE: 0xEA42, - 0x95CF: 0xEA43, - 0x95D0: 0xEA44, - 0x95D1: 0xEA45, - 0x95D2: 0xEA46, - 0x95D3: 0xEA47, - 0x95D4: 0xEA48, - 0x95D5: 0xEA49, - 0x95D6: 0xEA4A, - 0x95D7: 0xEA4B, - 0x95D8: 0xEA4C, - 0x95D9: 0xEA4D, - 0x95DA: 0xEA4E, - 0x95DB: 0xEA4F, - 0x95DC: 0xEA50, - 0x95DD: 0xEA51, - 0x95DE: 0xEA52, - 0x95DF: 0xEA53, - 0x95E0: 0xEA54, - 0x95E1: 0xEA55, - 0x95E2: 0xEA56, - 0x95E3: 0xEA57, - 0x95E4: 0xEA58, - 0x95E5: 0xEA59, - 0x95E6: 0xEA5A, - 0x95E7: 0xEA5B, - 0x95E8: 0xC3C5, - 0x95E9: 0xE3C5, - 0x95EA: 0xC9C1, - 0x95EB: 0xE3C6, - 0x95EC: 0xEA5C, - 0x95ED: 0xB1D5, - 0x95EE: 0xCECA, - 0x95EF: 0xB4B3, - 0x95F0: 0xC8F2, - 0x95F1: 0xE3C7, - 0x95F2: 0xCFD0, - 0x95F3: 0xE3C8, - 0x95F4: 0xBCE4, - 0x95F5: 0xE3C9, - 0x95F6: 0xE3CA, - 0x95F7: 0xC3C6, - 0x95F8: 0xD5A2, - 0x95F9: 0xC4D6, - 0x95FA: 0xB9EB, - 0x95FB: 0xCEC5, - 0x95FC: 0xE3CB, - 0x95FD: 0xC3F6, - 0x95FE: 0xE3CC, - 0x95FF: 0xEA5D, - 0x9600: 0xB7A7, - 0x9601: 0xB8F3, - 0x9602: 0xBAD2, - 0x9603: 0xE3CD, - 0x9604: 0xE3CE, - 0x9605: 0xD4C4, - 0x9606: 0xE3CF, - 0x9607: 0xEA5E, - 0x9608: 0xE3D0, - 0x9609: 0xD1CB, - 0x960A: 0xE3D1, - 0x960B: 0xE3D2, - 0x960C: 0xE3D3, - 0x960D: 0xE3D4, - 0x960E: 0xD1D6, - 0x960F: 0xE3D5, - 0x9610: 0xB2FB, - 0x9611: 0xC0BB, - 0x9612: 0xE3D6, - 0x9613: 0xEA5F, - 0x9614: 0xC0AB, - 0x9615: 0xE3D7, - 0x9616: 0xE3D8, - 0x9617: 0xE3D9, - 0x9618: 0xEA60, - 0x9619: 0xE3DA, - 0x961A: 0xE3DB, - 0x961B: 0xEA61, - 0x961C: 0xB8B7, - 0x961D: 0xDAE2, - 0x961E: 0xEA62, - 0x961F: 0xB6D3, - 0x9620: 0xEA63, - 0x9621: 0xDAE4, - 0x9622: 0xDAE3, - 0x9623: 0xEA64, - 0x9624: 0xEA65, - 0x9625: 0xEA66, - 0x9626: 0xEA67, - 0x9627: 0xEA68, - 0x9628: 0xEA69, - 0x9629: 0xEA6A, - 0x962A: 0xDAE6, - 0x962B: 0xEA6B, - 0x962C: 0xEA6C, - 0x962D: 0xEA6D, - 0x962E: 0xC8EE, - 0x962F: 0xEA6E, - 0x9630: 0xEA6F, - 0x9631: 0xDAE5, - 0x9632: 0xB7C0, - 0x9633: 0xD1F4, - 0x9634: 0xD2F5, - 0x9635: 0xD5F3, - 0x9636: 0xBDD7, - 0x9637: 0xEA70, - 0x9638: 0xEA71, - 0x9639: 0xEA72, - 0x963A: 0xEA73, - 0x963B: 0xD7E8, - 0x963C: 0xDAE8, - 0x963D: 0xDAE7, - 0x963E: 0xEA74, - 0x963F: 0xB0A2, - 0x9640: 0xCDD3, - 0x9641: 0xEA75, - 0x9642: 0xDAE9, - 0x9643: 0xEA76, - 0x9644: 0xB8BD, - 0x9645: 0xBCCA, - 0x9646: 0xC2BD, - 0x9647: 0xC2A4, - 0x9648: 0xB3C2, - 0x9649: 0xDAEA, - 0x964A: 0xEA77, - 0x964B: 0xC2AA, - 0x964C: 0xC4B0, - 0x964D: 0xBDB5, - 0x964E: 0xEA78, - 0x964F: 0xEA79, - 0x9650: 0xCFDE, - 0x9651: 0xEA7A, - 0x9652: 0xEA7B, - 0x9653: 0xEA7C, - 0x9654: 0xDAEB, - 0x9655: 0xC9C2, - 0x9656: 0xEA7D, - 0x9657: 0xEA7E, - 0x9658: 0xEA80, - 0x9659: 0xEA81, - 0x965A: 0xEA82, - 0x965B: 0xB1DD, - 0x965C: 0xEA83, - 0x965D: 0xEA84, - 0x965E: 0xEA85, - 0x965F: 0xDAEC, - 0x9660: 0xEA86, - 0x9661: 0xB6B8, - 0x9662: 0xD4BA, - 0x9663: 0xEA87, - 0x9664: 0xB3FD, - 0x9665: 0xEA88, - 0x9666: 0xEA89, - 0x9667: 0xDAED, - 0x9668: 0xD4C9, - 0x9669: 0xCFD5, - 0x966A: 0xC5E3, - 0x966B: 0xEA8A, - 0x966C: 0xDAEE, - 0x966D: 0xEA8B, - 0x966E: 0xEA8C, - 0x966F: 0xEA8D, - 0x9670: 0xEA8E, - 0x9671: 0xEA8F, - 0x9672: 0xDAEF, - 0x9673: 0xEA90, - 0x9674: 0xDAF0, - 0x9675: 0xC1EA, - 0x9676: 0xCCD5, - 0x9677: 0xCFDD, - 0x9678: 0xEA91, - 0x9679: 0xEA92, - 0x967A: 0xEA93, - 0x967B: 0xEA94, - 0x967C: 0xEA95, - 0x967D: 0xEA96, - 0x967E: 0xEA97, - 0x967F: 0xEA98, - 0x9680: 0xEA99, - 0x9681: 0xEA9A, - 0x9682: 0xEA9B, - 0x9683: 0xEA9C, - 0x9684: 0xEA9D, - 0x9685: 0xD3E7, - 0x9686: 0xC2A1, - 0x9687: 0xEA9E, - 0x9688: 0xDAF1, - 0x9689: 0xEA9F, - 0x968A: 0xEAA0, - 0x968B: 0xCBE5, - 0x968C: 0xEB40, - 0x968D: 0xDAF2, - 0x968E: 0xEB41, - 0x968F: 0xCBE6, - 0x9690: 0xD2FE, - 0x9691: 0xEB42, - 0x9692: 0xEB43, - 0x9693: 0xEB44, - 0x9694: 0xB8F4, - 0x9695: 0xEB45, - 0x9696: 0xEB46, - 0x9697: 0xDAF3, - 0x9698: 0xB0AF, - 0x9699: 0xCFB6, - 0x969A: 0xEB47, - 0x969B: 0xEB48, - 0x969C: 0xD5CF, - 0x969D: 0xEB49, - 0x969E: 0xEB4A, - 0x969F: 0xEB4B, - 0x96A0: 0xEB4C, - 0x96A1: 0xEB4D, - 0x96A2: 0xEB4E, - 0x96A3: 0xEB4F, - 0x96A4: 0xEB50, - 0x96A5: 0xEB51, - 0x96A6: 0xEB52, - 0x96A7: 0xCBED, - 0x96A8: 0xEB53, - 0x96A9: 0xEB54, - 0x96AA: 0xEB55, - 0x96AB: 0xEB56, - 0x96AC: 0xEB57, - 0x96AD: 0xEB58, - 0x96AE: 0xEB59, - 0x96AF: 0xEB5A, - 0x96B0: 0xDAF4, - 0x96B1: 0xEB5B, - 0x96B2: 0xEB5C, - 0x96B3: 0xE3C4, - 0x96B4: 0xEB5D, - 0x96B5: 0xEB5E, - 0x96B6: 0xC1A5, - 0x96B7: 0xEB5F, - 0x96B8: 0xEB60, - 0x96B9: 0xF6BF, - 0x96BA: 0xEB61, - 0x96BB: 0xEB62, - 0x96BC: 0xF6C0, - 0x96BD: 0xF6C1, - 0x96BE: 0xC4D1, - 0x96BF: 0xEB63, - 0x96C0: 0xC8B8, - 0x96C1: 0xD1E3, - 0x96C2: 0xEB64, - 0x96C3: 0xEB65, - 0x96C4: 0xD0DB, - 0x96C5: 0xD1C5, - 0x96C6: 0xBCAF, - 0x96C7: 0xB9CD, - 0x96C8: 0xEB66, - 0x96C9: 0xEFF4, - 0x96CA: 0xEB67, - 0x96CB: 0xEB68, - 0x96CC: 0xB4C6, - 0x96CD: 0xD3BA, - 0x96CE: 0xF6C2, - 0x96CF: 0xB3FB, - 0x96D0: 0xEB69, - 0x96D1: 0xEB6A, - 0x96D2: 0xF6C3, - 0x96D3: 0xEB6B, - 0x96D4: 0xEB6C, - 0x96D5: 0xB5F1, - 0x96D6: 0xEB6D, - 0x96D7: 0xEB6E, - 0x96D8: 0xEB6F, - 0x96D9: 0xEB70, - 0x96DA: 0xEB71, - 0x96DB: 0xEB72, - 0x96DC: 0xEB73, - 0x96DD: 0xEB74, - 0x96DE: 0xEB75, - 0x96DF: 0xEB76, - 0x96E0: 0xF6C5, - 0x96E1: 0xEB77, - 0x96E2: 0xEB78, - 0x96E3: 0xEB79, - 0x96E4: 0xEB7A, - 0x96E5: 0xEB7B, - 0x96E6: 0xEB7C, - 0x96E7: 0xEB7D, - 0x96E8: 0xD3EA, - 0x96E9: 0xF6A7, - 0x96EA: 0xD1A9, - 0x96EB: 0xEB7E, - 0x96EC: 0xEB80, - 0x96ED: 0xEB81, - 0x96EE: 0xEB82, - 0x96EF: 0xF6A9, - 0x96F0: 0xEB83, - 0x96F1: 0xEB84, - 0x96F2: 0xEB85, - 0x96F3: 0xF6A8, - 0x96F4: 0xEB86, - 0x96F5: 0xEB87, - 0x96F6: 0xC1E3, - 0x96F7: 0xC0D7, - 0x96F8: 0xEB88, - 0x96F9: 0xB1A2, - 0x96FA: 0xEB89, - 0x96FB: 0xEB8A, - 0x96FC: 0xEB8B, - 0x96FD: 0xEB8C, - 0x96FE: 0xCEED, - 0x96FF: 0xEB8D, - 0x9700: 0xD0E8, - 0x9701: 0xF6AB, - 0x9702: 0xEB8E, - 0x9703: 0xEB8F, - 0x9704: 0xCFF6, - 0x9705: 0xEB90, - 0x9706: 0xF6AA, - 0x9707: 0xD5F0, - 0x9708: 0xF6AC, - 0x9709: 0xC3B9, - 0x970A: 0xEB91, - 0x970B: 0xEB92, - 0x970C: 0xEB93, - 0x970D: 0xBBF4, - 0x970E: 0xF6AE, - 0x970F: 0xF6AD, - 0x9710: 0xEB94, - 0x9711: 0xEB95, - 0x9712: 0xEB96, - 0x9713: 0xC4DE, - 0x9714: 0xEB97, - 0x9715: 0xEB98, - 0x9716: 0xC1D8, - 0x9717: 0xEB99, - 0x9718: 0xEB9A, - 0x9719: 0xEB9B, - 0x971A: 0xEB9C, - 0x971B: 0xEB9D, - 0x971C: 0xCBAA, - 0x971D: 0xEB9E, - 0x971E: 0xCFBC, - 0x971F: 0xEB9F, - 0x9720: 0xEBA0, - 0x9721: 0xEC40, - 0x9722: 0xEC41, - 0x9723: 0xEC42, - 0x9724: 0xEC43, - 0x9725: 0xEC44, - 0x9726: 0xEC45, - 0x9727: 0xEC46, - 0x9728: 0xEC47, - 0x9729: 0xEC48, - 0x972A: 0xF6AF, - 0x972B: 0xEC49, - 0x972C: 0xEC4A, - 0x972D: 0xF6B0, - 0x972E: 0xEC4B, - 0x972F: 0xEC4C, - 0x9730: 0xF6B1, - 0x9731: 0xEC4D, - 0x9732: 0xC2B6, - 0x9733: 0xEC4E, - 0x9734: 0xEC4F, - 0x9735: 0xEC50, - 0x9736: 0xEC51, - 0x9737: 0xEC52, - 0x9738: 0xB0D4, - 0x9739: 0xC5F9, - 0x973A: 0xEC53, - 0x973B: 0xEC54, - 0x973C: 0xEC55, - 0x973D: 0xEC56, - 0x973E: 0xF6B2, - 0x973F: 0xEC57, - 0x9740: 0xEC58, - 0x9741: 0xEC59, - 0x9742: 0xEC5A, - 0x9743: 0xEC5B, - 0x9744: 0xEC5C, - 0x9745: 0xEC5D, - 0x9746: 0xEC5E, - 0x9747: 0xEC5F, - 0x9748: 0xEC60, - 0x9749: 0xEC61, - 0x974A: 0xEC62, - 0x974B: 0xEC63, - 0x974C: 0xEC64, - 0x974D: 0xEC65, - 0x974E: 0xEC66, - 0x974F: 0xEC67, - 0x9750: 0xEC68, - 0x9751: 0xEC69, - 0x9752: 0xC7E0, - 0x9753: 0xF6A6, - 0x9754: 0xEC6A, - 0x9755: 0xEC6B, - 0x9756: 0xBEB8, - 0x9757: 0xEC6C, - 0x9758: 0xEC6D, - 0x9759: 0xBEB2, - 0x975A: 0xEC6E, - 0x975B: 0xB5E5, - 0x975C: 0xEC6F, - 0x975D: 0xEC70, - 0x975E: 0xB7C7, - 0x975F: 0xEC71, - 0x9760: 0xBFBF, - 0x9761: 0xC3D2, - 0x9762: 0xC3E6, - 0x9763: 0xEC72, - 0x9764: 0xEC73, - 0x9765: 0xD8CC, - 0x9766: 0xEC74, - 0x9767: 0xEC75, - 0x9768: 0xEC76, - 0x9769: 0xB8EF, - 0x976A: 0xEC77, - 0x976B: 0xEC78, - 0x976C: 0xEC79, - 0x976D: 0xEC7A, - 0x976E: 0xEC7B, - 0x976F: 0xEC7C, - 0x9770: 0xEC7D, - 0x9771: 0xEC7E, - 0x9772: 0xEC80, - 0x9773: 0xBDF9, - 0x9774: 0xD1A5, - 0x9775: 0xEC81, - 0x9776: 0xB0D0, - 0x9777: 0xEC82, - 0x9778: 0xEC83, - 0x9779: 0xEC84, - 0x977A: 0xEC85, - 0x977B: 0xEC86, - 0x977C: 0xF7B0, - 0x977D: 0xEC87, - 0x977E: 0xEC88, - 0x977F: 0xEC89, - 0x9780: 0xEC8A, - 0x9781: 0xEC8B, - 0x9782: 0xEC8C, - 0x9783: 0xEC8D, - 0x9784: 0xEC8E, - 0x9785: 0xF7B1, - 0x9786: 0xEC8F, - 0x9787: 0xEC90, - 0x9788: 0xEC91, - 0x9789: 0xEC92, - 0x978A: 0xEC93, - 0x978B: 0xD0AC, - 0x978C: 0xEC94, - 0x978D: 0xB0B0, - 0x978E: 0xEC95, - 0x978F: 0xEC96, - 0x9790: 0xEC97, - 0x9791: 0xF7B2, - 0x9792: 0xF7B3, - 0x9793: 0xEC98, - 0x9794: 0xF7B4, - 0x9795: 0xEC99, - 0x9796: 0xEC9A, - 0x9797: 0xEC9B, - 0x9798: 0xC7CA, - 0x9799: 0xEC9C, - 0x979A: 0xEC9D, - 0x979B: 0xEC9E, - 0x979C: 0xEC9F, - 0x979D: 0xECA0, - 0x979E: 0xED40, - 0x979F: 0xED41, - 0x97A0: 0xBECF, - 0x97A1: 0xED42, - 0x97A2: 0xED43, - 0x97A3: 0xF7B7, - 0x97A4: 0xED44, - 0x97A5: 0xED45, - 0x97A6: 0xED46, - 0x97A7: 0xED47, - 0x97A8: 0xED48, - 0x97A9: 0xED49, - 0x97AA: 0xED4A, - 0x97AB: 0xF7B6, - 0x97AC: 0xED4B, - 0x97AD: 0xB1DE, - 0x97AE: 0xED4C, - 0x97AF: 0xF7B5, - 0x97B0: 0xED4D, - 0x97B1: 0xED4E, - 0x97B2: 0xF7B8, - 0x97B3: 0xED4F, - 0x97B4: 0xF7B9, - 0x97B5: 0xED50, - 0x97B6: 0xED51, - 0x97B7: 0xED52, - 0x97B8: 0xED53, - 0x97B9: 0xED54, - 0x97BA: 0xED55, - 0x97BB: 0xED56, - 0x97BC: 0xED57, - 0x97BD: 0xED58, - 0x97BE: 0xED59, - 0x97BF: 0xED5A, - 0x97C0: 0xED5B, - 0x97C1: 0xED5C, - 0x97C2: 0xED5D, - 0x97C3: 0xED5E, - 0x97C4: 0xED5F, - 0x97C5: 0xED60, - 0x97C6: 0xED61, - 0x97C7: 0xED62, - 0x97C8: 0xED63, - 0x97C9: 0xED64, - 0x97CA: 0xED65, - 0x97CB: 0xED66, - 0x97CC: 0xED67, - 0x97CD: 0xED68, - 0x97CE: 0xED69, - 0x97CF: 0xED6A, - 0x97D0: 0xED6B, - 0x97D1: 0xED6C, - 0x97D2: 0xED6D, - 0x97D3: 0xED6E, - 0x97D4: 0xED6F, - 0x97D5: 0xED70, - 0x97D6: 0xED71, - 0x97D7: 0xED72, - 0x97D8: 0xED73, - 0x97D9: 0xED74, - 0x97DA: 0xED75, - 0x97DB: 0xED76, - 0x97DC: 0xED77, - 0x97DD: 0xED78, - 0x97DE: 0xED79, - 0x97DF: 0xED7A, - 0x97E0: 0xED7B, - 0x97E1: 0xED7C, - 0x97E2: 0xED7D, - 0x97E3: 0xED7E, - 0x97E4: 0xED80, - 0x97E5: 0xED81, - 0x97E6: 0xCEA4, - 0x97E7: 0xC8CD, - 0x97E8: 0xED82, - 0x97E9: 0xBAAB, - 0x97EA: 0xE8B8, - 0x97EB: 0xE8B9, - 0x97EC: 0xE8BA, - 0x97ED: 0xBEC2, - 0x97EE: 0xED83, - 0x97EF: 0xED84, - 0x97F0: 0xED85, - 0x97F1: 0xED86, - 0x97F2: 0xED87, - 0x97F3: 0xD2F4, - 0x97F4: 0xED88, - 0x97F5: 0xD4CF, - 0x97F6: 0xC9D8, - 0x97F7: 0xED89, - 0x97F8: 0xED8A, - 0x97F9: 0xED8B, - 0x97FA: 0xED8C, - 0x97FB: 0xED8D, - 0x97FC: 0xED8E, - 0x97FD: 0xED8F, - 0x97FE: 0xED90, - 0x97FF: 0xED91, - 0x9800: 0xED92, - 0x9801: 0xED93, - 0x9802: 0xED94, - 0x9803: 0xED95, - 0x9804: 0xED96, - 0x9805: 0xED97, - 0x9806: 0xED98, - 0x9807: 0xED99, - 0x9808: 0xED9A, - 0x9809: 0xED9B, - 0x980A: 0xED9C, - 0x980B: 0xED9D, - 0x980C: 0xED9E, - 0x980D: 0xED9F, - 0x980E: 0xEDA0, - 0x980F: 0xEE40, - 0x9810: 0xEE41, - 0x9811: 0xEE42, - 0x9812: 0xEE43, - 0x9813: 0xEE44, - 0x9814: 0xEE45, - 0x9815: 0xEE46, - 0x9816: 0xEE47, - 0x9817: 0xEE48, - 0x9818: 0xEE49, - 0x9819: 0xEE4A, - 0x981A: 0xEE4B, - 0x981B: 0xEE4C, - 0x981C: 0xEE4D, - 0x981D: 0xEE4E, - 0x981E: 0xEE4F, - 0x981F: 0xEE50, - 0x9820: 0xEE51, - 0x9821: 0xEE52, - 0x9822: 0xEE53, - 0x9823: 0xEE54, - 0x9824: 0xEE55, - 0x9825: 0xEE56, - 0x9826: 0xEE57, - 0x9827: 0xEE58, - 0x9828: 0xEE59, - 0x9829: 0xEE5A, - 0x982A: 0xEE5B, - 0x982B: 0xEE5C, - 0x982C: 0xEE5D, - 0x982D: 0xEE5E, - 0x982E: 0xEE5F, - 0x982F: 0xEE60, - 0x9830: 0xEE61, - 0x9831: 0xEE62, - 0x9832: 0xEE63, - 0x9833: 0xEE64, - 0x9834: 0xEE65, - 0x9835: 0xEE66, - 0x9836: 0xEE67, - 0x9837: 0xEE68, - 0x9838: 0xEE69, - 0x9839: 0xEE6A, - 0x983A: 0xEE6B, - 0x983B: 0xEE6C, - 0x983C: 0xEE6D, - 0x983D: 0xEE6E, - 0x983E: 0xEE6F, - 0x983F: 0xEE70, - 0x9840: 0xEE71, - 0x9841: 0xEE72, - 0x9842: 0xEE73, - 0x9843: 0xEE74, - 0x9844: 0xEE75, - 0x9845: 0xEE76, - 0x9846: 0xEE77, - 0x9847: 0xEE78, - 0x9848: 0xEE79, - 0x9849: 0xEE7A, - 0x984A: 0xEE7B, - 0x984B: 0xEE7C, - 0x984C: 0xEE7D, - 0x984D: 0xEE7E, - 0x984E: 0xEE80, - 0x984F: 0xEE81, - 0x9850: 0xEE82, - 0x9851: 0xEE83, - 0x9852: 0xEE84, - 0x9853: 0xEE85, - 0x9854: 0xEE86, - 0x9855: 0xEE87, - 0x9856: 0xEE88, - 0x9857: 0xEE89, - 0x9858: 0xEE8A, - 0x9859: 0xEE8B, - 0x985A: 0xEE8C, - 0x985B: 0xEE8D, - 0x985C: 0xEE8E, - 0x985D: 0xEE8F, - 0x985E: 0xEE90, - 0x985F: 0xEE91, - 0x9860: 0xEE92, - 0x9861: 0xEE93, - 0x9862: 0xEE94, - 0x9863: 0xEE95, - 0x9864: 0xEE96, - 0x9865: 0xEE97, - 0x9866: 0xEE98, - 0x9867: 0xEE99, - 0x9868: 0xEE9A, - 0x9869: 0xEE9B, - 0x986A: 0xEE9C, - 0x986B: 0xEE9D, - 0x986C: 0xEE9E, - 0x986D: 0xEE9F, - 0x986E: 0xEEA0, - 0x986F: 0xEF40, - 0x9870: 0xEF41, - 0x9871: 0xEF42, - 0x9872: 0xEF43, - 0x9873: 0xEF44, - 0x9874: 0xEF45, - 0x9875: 0xD2B3, - 0x9876: 0xB6A5, - 0x9877: 0xC7EA, - 0x9878: 0xF1FC, - 0x9879: 0xCFEE, - 0x987A: 0xCBB3, - 0x987B: 0xD0EB, - 0x987C: 0xE7EF, - 0x987D: 0xCDE7, - 0x987E: 0xB9CB, - 0x987F: 0xB6D9, - 0x9880: 0xF1FD, - 0x9881: 0xB0E4, - 0x9882: 0xCBCC, - 0x9883: 0xF1FE, - 0x9884: 0xD4A4, - 0x9885: 0xC2AD, - 0x9886: 0xC1EC, - 0x9887: 0xC6C4, - 0x9888: 0xBEB1, - 0x9889: 0xF2A1, - 0x988A: 0xBCD5, - 0x988B: 0xEF46, - 0x988C: 0xF2A2, - 0x988D: 0xF2A3, - 0x988E: 0xEF47, - 0x988F: 0xF2A4, - 0x9890: 0xD2C3, - 0x9891: 0xC6B5, - 0x9892: 0xEF48, - 0x9893: 0xCDC7, - 0x9894: 0xF2A5, - 0x9895: 0xEF49, - 0x9896: 0xD3B1, - 0x9897: 0xBFC5, - 0x9898: 0xCCE2, - 0x9899: 0xEF4A, - 0x989A: 0xF2A6, - 0x989B: 0xF2A7, - 0x989C: 0xD1D5, - 0x989D: 0xB6EE, - 0x989E: 0xF2A8, - 0x989F: 0xF2A9, - 0x98A0: 0xB5DF, - 0x98A1: 0xF2AA, - 0x98A2: 0xF2AB, - 0x98A3: 0xEF4B, - 0x98A4: 0xB2FC, - 0x98A5: 0xF2AC, - 0x98A6: 0xF2AD, - 0x98A7: 0xC8A7, - 0x98A8: 0xEF4C, - 0x98A9: 0xEF4D, - 0x98AA: 0xEF4E, - 0x98AB: 0xEF4F, - 0x98AC: 0xEF50, - 0x98AD: 0xEF51, - 0x98AE: 0xEF52, - 0x98AF: 0xEF53, - 0x98B0: 0xEF54, - 0x98B1: 0xEF55, - 0x98B2: 0xEF56, - 0x98B3: 0xEF57, - 0x98B4: 0xEF58, - 0x98B5: 0xEF59, - 0x98B6: 0xEF5A, - 0x98B7: 0xEF5B, - 0x98B8: 0xEF5C, - 0x98B9: 0xEF5D, - 0x98BA: 0xEF5E, - 0x98BB: 0xEF5F, - 0x98BC: 0xEF60, - 0x98BD: 0xEF61, - 0x98BE: 0xEF62, - 0x98BF: 0xEF63, - 0x98C0: 0xEF64, - 0x98C1: 0xEF65, - 0x98C2: 0xEF66, - 0x98C3: 0xEF67, - 0x98C4: 0xEF68, - 0x98C5: 0xEF69, - 0x98C6: 0xEF6A, - 0x98C7: 0xEF6B, - 0x98C8: 0xEF6C, - 0x98C9: 0xEF6D, - 0x98CA: 0xEF6E, - 0x98CB: 0xEF6F, - 0x98CC: 0xEF70, - 0x98CD: 0xEF71, - 0x98CE: 0xB7E7, - 0x98CF: 0xEF72, - 0x98D0: 0xEF73, - 0x98D1: 0xECA9, - 0x98D2: 0xECAA, - 0x98D3: 0xECAB, - 0x98D4: 0xEF74, - 0x98D5: 0xECAC, - 0x98D6: 0xEF75, - 0x98D7: 0xEF76, - 0x98D8: 0xC6AE, - 0x98D9: 0xECAD, - 0x98DA: 0xECAE, - 0x98DB: 0xEF77, - 0x98DC: 0xEF78, - 0x98DD: 0xEF79, - 0x98DE: 0xB7C9, - 0x98DF: 0xCAB3, - 0x98E0: 0xEF7A, - 0x98E1: 0xEF7B, - 0x98E2: 0xEF7C, - 0x98E3: 0xEF7D, - 0x98E4: 0xEF7E, - 0x98E5: 0xEF80, - 0x98E6: 0xEF81, - 0x98E7: 0xE2B8, - 0x98E8: 0xF7CF, - 0x98E9: 0xEF82, - 0x98EA: 0xEF83, - 0x98EB: 0xEF84, - 0x98EC: 0xEF85, - 0x98ED: 0xEF86, - 0x98EE: 0xEF87, - 0x98EF: 0xEF88, - 0x98F0: 0xEF89, - 0x98F1: 0xEF8A, - 0x98F2: 0xEF8B, - 0x98F3: 0xEF8C, - 0x98F4: 0xEF8D, - 0x98F5: 0xEF8E, - 0x98F6: 0xEF8F, - 0x98F7: 0xEF90, - 0x98F8: 0xEF91, - 0x98F9: 0xEF92, - 0x98FA: 0xEF93, - 0x98FB: 0xEF94, - 0x98FC: 0xEF95, - 0x98FD: 0xEF96, - 0x98FE: 0xEF97, - 0x98FF: 0xEF98, - 0x9900: 0xEF99, - 0x9901: 0xEF9A, - 0x9902: 0xEF9B, - 0x9903: 0xEF9C, - 0x9904: 0xEF9D, - 0x9905: 0xEF9E, - 0x9906: 0xEF9F, - 0x9907: 0xEFA0, - 0x9908: 0xF040, - 0x9909: 0xF041, - 0x990A: 0xF042, - 0x990B: 0xF043, - 0x990C: 0xF044, - 0x990D: 0xF7D0, - 0x990E: 0xF045, - 0x990F: 0xF046, - 0x9910: 0xB2CD, - 0x9911: 0xF047, - 0x9912: 0xF048, - 0x9913: 0xF049, - 0x9914: 0xF04A, - 0x9915: 0xF04B, - 0x9916: 0xF04C, - 0x9917: 0xF04D, - 0x9918: 0xF04E, - 0x9919: 0xF04F, - 0x991A: 0xF050, - 0x991B: 0xF051, - 0x991C: 0xF052, - 0x991D: 0xF053, - 0x991E: 0xF054, - 0x991F: 0xF055, - 0x9920: 0xF056, - 0x9921: 0xF057, - 0x9922: 0xF058, - 0x9923: 0xF059, - 0x9924: 0xF05A, - 0x9925: 0xF05B, - 0x9926: 0xF05C, - 0x9927: 0xF05D, - 0x9928: 0xF05E, - 0x9929: 0xF05F, - 0x992A: 0xF060, - 0x992B: 0xF061, - 0x992C: 0xF062, - 0x992D: 0xF063, - 0x992E: 0xF7D1, - 0x992F: 0xF064, - 0x9930: 0xF065, - 0x9931: 0xF066, - 0x9932: 0xF067, - 0x9933: 0xF068, - 0x9934: 0xF069, - 0x9935: 0xF06A, - 0x9936: 0xF06B, - 0x9937: 0xF06C, - 0x9938: 0xF06D, - 0x9939: 0xF06E, - 0x993A: 0xF06F, - 0x993B: 0xF070, - 0x993C: 0xF071, - 0x993D: 0xF072, - 0x993E: 0xF073, - 0x993F: 0xF074, - 0x9940: 0xF075, - 0x9941: 0xF076, - 0x9942: 0xF077, - 0x9943: 0xF078, - 0x9944: 0xF079, - 0x9945: 0xF07A, - 0x9946: 0xF07B, - 0x9947: 0xF07C, - 0x9948: 0xF07D, - 0x9949: 0xF07E, - 0x994A: 0xF080, - 0x994B: 0xF081, - 0x994C: 0xF082, - 0x994D: 0xF083, - 0x994E: 0xF084, - 0x994F: 0xF085, - 0x9950: 0xF086, - 0x9951: 0xF087, - 0x9952: 0xF088, - 0x9953: 0xF089, - 0x9954: 0xF7D3, - 0x9955: 0xF7D2, - 0x9956: 0xF08A, - 0x9957: 0xF08B, - 0x9958: 0xF08C, - 0x9959: 0xF08D, - 0x995A: 0xF08E, - 0x995B: 0xF08F, - 0x995C: 0xF090, - 0x995D: 0xF091, - 0x995E: 0xF092, - 0x995F: 0xF093, - 0x9960: 0xF094, - 0x9961: 0xF095, - 0x9962: 0xF096, - 0x9963: 0xE2BB, - 0x9964: 0xF097, - 0x9965: 0xBCA2, - 0x9966: 0xF098, - 0x9967: 0xE2BC, - 0x9968: 0xE2BD, - 0x9969: 0xE2BE, - 0x996A: 0xE2BF, - 0x996B: 0xE2C0, - 0x996C: 0xE2C1, - 0x996D: 0xB7B9, - 0x996E: 0xD2FB, - 0x996F: 0xBDA4, - 0x9970: 0xCACE, - 0x9971: 0xB1A5, - 0x9972: 0xCBC7, - 0x9973: 0xF099, - 0x9974: 0xE2C2, - 0x9975: 0xB6FC, - 0x9976: 0xC8C4, - 0x9977: 0xE2C3, - 0x9978: 0xF09A, - 0x9979: 0xF09B, - 0x997A: 0xBDC8, - 0x997B: 0xF09C, - 0x997C: 0xB1FD, - 0x997D: 0xE2C4, - 0x997E: 0xF09D, - 0x997F: 0xB6F6, - 0x9980: 0xE2C5, - 0x9981: 0xC4D9, - 0x9982: 0xF09E, - 0x9983: 0xF09F, - 0x9984: 0xE2C6, - 0x9985: 0xCFDA, - 0x9986: 0xB9DD, - 0x9987: 0xE2C7, - 0x9988: 0xC0A1, - 0x9989: 0xF0A0, - 0x998A: 0xE2C8, - 0x998B: 0xB2F6, - 0x998C: 0xF140, - 0x998D: 0xE2C9, - 0x998E: 0xF141, - 0x998F: 0xC1F3, - 0x9990: 0xE2CA, - 0x9991: 0xE2CB, - 0x9992: 0xC2F8, - 0x9993: 0xE2CC, - 0x9994: 0xE2CD, - 0x9995: 0xE2CE, - 0x9996: 0xCAD7, - 0x9997: 0xD8B8, - 0x9998: 0xD9E5, - 0x9999: 0xCFE3, - 0x999A: 0xF142, - 0x999B: 0xF143, - 0x999C: 0xF144, - 0x999D: 0xF145, - 0x999E: 0xF146, - 0x999F: 0xF147, - 0x99A0: 0xF148, - 0x99A1: 0xF149, - 0x99A2: 0xF14A, - 0x99A3: 0xF14B, - 0x99A4: 0xF14C, - 0x99A5: 0xF0A5, - 0x99A6: 0xF14D, - 0x99A7: 0xF14E, - 0x99A8: 0xDCB0, - 0x99A9: 0xF14F, - 0x99AA: 0xF150, - 0x99AB: 0xF151, - 0x99AC: 0xF152, - 0x99AD: 0xF153, - 0x99AE: 0xF154, - 0x99AF: 0xF155, - 0x99B0: 0xF156, - 0x99B1: 0xF157, - 0x99B2: 0xF158, - 0x99B3: 0xF159, - 0x99B4: 0xF15A, - 0x99B5: 0xF15B, - 0x99B6: 0xF15C, - 0x99B7: 0xF15D, - 0x99B8: 0xF15E, - 0x99B9: 0xF15F, - 0x99BA: 0xF160, - 0x99BB: 0xF161, - 0x99BC: 0xF162, - 0x99BD: 0xF163, - 0x99BE: 0xF164, - 0x99BF: 0xF165, - 0x99C0: 0xF166, - 0x99C1: 0xF167, - 0x99C2: 0xF168, - 0x99C3: 0xF169, - 0x99C4: 0xF16A, - 0x99C5: 0xF16B, - 0x99C6: 0xF16C, - 0x99C7: 0xF16D, - 0x99C8: 0xF16E, - 0x99C9: 0xF16F, - 0x99CA: 0xF170, - 0x99CB: 0xF171, - 0x99CC: 0xF172, - 0x99CD: 0xF173, - 0x99CE: 0xF174, - 0x99CF: 0xF175, - 0x99D0: 0xF176, - 0x99D1: 0xF177, - 0x99D2: 0xF178, - 0x99D3: 0xF179, - 0x99D4: 0xF17A, - 0x99D5: 0xF17B, - 0x99D6: 0xF17C, - 0x99D7: 0xF17D, - 0x99D8: 0xF17E, - 0x99D9: 0xF180, - 0x99DA: 0xF181, - 0x99DB: 0xF182, - 0x99DC: 0xF183, - 0x99DD: 0xF184, - 0x99DE: 0xF185, - 0x99DF: 0xF186, - 0x99E0: 0xF187, - 0x99E1: 0xF188, - 0x99E2: 0xF189, - 0x99E3: 0xF18A, - 0x99E4: 0xF18B, - 0x99E5: 0xF18C, - 0x99E6: 0xF18D, - 0x99E7: 0xF18E, - 0x99E8: 0xF18F, - 0x99E9: 0xF190, - 0x99EA: 0xF191, - 0x99EB: 0xF192, - 0x99EC: 0xF193, - 0x99ED: 0xF194, - 0x99EE: 0xF195, - 0x99EF: 0xF196, - 0x99F0: 0xF197, - 0x99F1: 0xF198, - 0x99F2: 0xF199, - 0x99F3: 0xF19A, - 0x99F4: 0xF19B, - 0x99F5: 0xF19C, - 0x99F6: 0xF19D, - 0x99F7: 0xF19E, - 0x99F8: 0xF19F, - 0x99F9: 0xF1A0, - 0x99FA: 0xF240, - 0x99FB: 0xF241, - 0x99FC: 0xF242, - 0x99FD: 0xF243, - 0x99FE: 0xF244, - 0x99FF: 0xF245, - 0x9A00: 0xF246, - 0x9A01: 0xF247, - 0x9A02: 0xF248, - 0x9A03: 0xF249, - 0x9A04: 0xF24A, - 0x9A05: 0xF24B, - 0x9A06: 0xF24C, - 0x9A07: 0xF24D, - 0x9A08: 0xF24E, - 0x9A09: 0xF24F, - 0x9A0A: 0xF250, - 0x9A0B: 0xF251, - 0x9A0C: 0xF252, - 0x9A0D: 0xF253, - 0x9A0E: 0xF254, - 0x9A0F: 0xF255, - 0x9A10: 0xF256, - 0x9A11: 0xF257, - 0x9A12: 0xF258, - 0x9A13: 0xF259, - 0x9A14: 0xF25A, - 0x9A15: 0xF25B, - 0x9A16: 0xF25C, - 0x9A17: 0xF25D, - 0x9A18: 0xF25E, - 0x9A19: 0xF25F, - 0x9A1A: 0xF260, - 0x9A1B: 0xF261, - 0x9A1C: 0xF262, - 0x9A1D: 0xF263, - 0x9A1E: 0xF264, - 0x9A1F: 0xF265, - 0x9A20: 0xF266, - 0x9A21: 0xF267, - 0x9A22: 0xF268, - 0x9A23: 0xF269, - 0x9A24: 0xF26A, - 0x9A25: 0xF26B, - 0x9A26: 0xF26C, - 0x9A27: 0xF26D, - 0x9A28: 0xF26E, - 0x9A29: 0xF26F, - 0x9A2A: 0xF270, - 0x9A2B: 0xF271, - 0x9A2C: 0xF272, - 0x9A2D: 0xF273, - 0x9A2E: 0xF274, - 0x9A2F: 0xF275, - 0x9A30: 0xF276, - 0x9A31: 0xF277, - 0x9A32: 0xF278, - 0x9A33: 0xF279, - 0x9A34: 0xF27A, - 0x9A35: 0xF27B, - 0x9A36: 0xF27C, - 0x9A37: 0xF27D, - 0x9A38: 0xF27E, - 0x9A39: 0xF280, - 0x9A3A: 0xF281, - 0x9A3B: 0xF282, - 0x9A3C: 0xF283, - 0x9A3D: 0xF284, - 0x9A3E: 0xF285, - 0x9A3F: 0xF286, - 0x9A40: 0xF287, - 0x9A41: 0xF288, - 0x9A42: 0xF289, - 0x9A43: 0xF28A, - 0x9A44: 0xF28B, - 0x9A45: 0xF28C, - 0x9A46: 0xF28D, - 0x9A47: 0xF28E, - 0x9A48: 0xF28F, - 0x9A49: 0xF290, - 0x9A4A: 0xF291, - 0x9A4B: 0xF292, - 0x9A4C: 0xF293, - 0x9A4D: 0xF294, - 0x9A4E: 0xF295, - 0x9A4F: 0xF296, - 0x9A50: 0xF297, - 0x9A51: 0xF298, - 0x9A52: 0xF299, - 0x9A53: 0xF29A, - 0x9A54: 0xF29B, - 0x9A55: 0xF29C, - 0x9A56: 0xF29D, - 0x9A57: 0xF29E, - 0x9A58: 0xF29F, - 0x9A59: 0xF2A0, - 0x9A5A: 0xF340, - 0x9A5B: 0xF341, - 0x9A5C: 0xF342, - 0x9A5D: 0xF343, - 0x9A5E: 0xF344, - 0x9A5F: 0xF345, - 0x9A60: 0xF346, - 0x9A61: 0xF347, - 0x9A62: 0xF348, - 0x9A63: 0xF349, - 0x9A64: 0xF34A, - 0x9A65: 0xF34B, - 0x9A66: 0xF34C, - 0x9A67: 0xF34D, - 0x9A68: 0xF34E, - 0x9A69: 0xF34F, - 0x9A6A: 0xF350, - 0x9A6B: 0xF351, - 0x9A6C: 0xC2ED, - 0x9A6D: 0xD4A6, - 0x9A6E: 0xCDD4, - 0x9A6F: 0xD1B1, - 0x9A70: 0xB3DB, - 0x9A71: 0xC7FD, - 0x9A72: 0xF352, - 0x9A73: 0xB2B5, - 0x9A74: 0xC2BF, - 0x9A75: 0xE6E0, - 0x9A76: 0xCABB, - 0x9A77: 0xE6E1, - 0x9A78: 0xE6E2, - 0x9A79: 0xBED4, - 0x9A7A: 0xE6E3, - 0x9A7B: 0xD7A4, - 0x9A7C: 0xCDD5, - 0x9A7D: 0xE6E5, - 0x9A7E: 0xBCDD, - 0x9A7F: 0xE6E4, - 0x9A80: 0xE6E6, - 0x9A81: 0xE6E7, - 0x9A82: 0xC2EE, - 0x9A83: 0xF353, - 0x9A84: 0xBDBE, - 0x9A85: 0xE6E8, - 0x9A86: 0xC2E6, - 0x9A87: 0xBAA7, - 0x9A88: 0xE6E9, - 0x9A89: 0xF354, - 0x9A8A: 0xE6EA, - 0x9A8B: 0xB3D2, - 0x9A8C: 0xD1E9, - 0x9A8D: 0xF355, - 0x9A8E: 0xF356, - 0x9A8F: 0xBFA5, - 0x9A90: 0xE6EB, - 0x9A91: 0xC6EF, - 0x9A92: 0xE6EC, - 0x9A93: 0xE6ED, - 0x9A94: 0xF357, - 0x9A95: 0xF358, - 0x9A96: 0xE6EE, - 0x9A97: 0xC6AD, - 0x9A98: 0xE6EF, - 0x9A99: 0xF359, - 0x9A9A: 0xC9A7, - 0x9A9B: 0xE6F0, - 0x9A9C: 0xE6F1, - 0x9A9D: 0xE6F2, - 0x9A9E: 0xE5B9, - 0x9A9F: 0xE6F3, - 0x9AA0: 0xE6F4, - 0x9AA1: 0xC2E2, - 0x9AA2: 0xE6F5, - 0x9AA3: 0xE6F6, - 0x9AA4: 0xD6E8, - 0x9AA5: 0xE6F7, - 0x9AA6: 0xF35A, - 0x9AA7: 0xE6F8, - 0x9AA8: 0xB9C7, - 0x9AA9: 0xF35B, - 0x9AAA: 0xF35C, - 0x9AAB: 0xF35D, - 0x9AAC: 0xF35E, - 0x9AAD: 0xF35F, - 0x9AAE: 0xF360, - 0x9AAF: 0xF361, - 0x9AB0: 0xF7BB, - 0x9AB1: 0xF7BA, - 0x9AB2: 0xF362, - 0x9AB3: 0xF363, - 0x9AB4: 0xF364, - 0x9AB5: 0xF365, - 0x9AB6: 0xF7BE, - 0x9AB7: 0xF7BC, - 0x9AB8: 0xBAA1, - 0x9AB9: 0xF366, - 0x9ABA: 0xF7BF, - 0x9ABB: 0xF367, - 0x9ABC: 0xF7C0, - 0x9ABD: 0xF368, - 0x9ABE: 0xF369, - 0x9ABF: 0xF36A, - 0x9AC0: 0xF7C2, - 0x9AC1: 0xF7C1, - 0x9AC2: 0xF7C4, - 0x9AC3: 0xF36B, - 0x9AC4: 0xF36C, - 0x9AC5: 0xF7C3, - 0x9AC6: 0xF36D, - 0x9AC7: 0xF36E, - 0x9AC8: 0xF36F, - 0x9AC9: 0xF370, - 0x9ACA: 0xF371, - 0x9ACB: 0xF7C5, - 0x9ACC: 0xF7C6, - 0x9ACD: 0xF372, - 0x9ACE: 0xF373, - 0x9ACF: 0xF374, - 0x9AD0: 0xF375, - 0x9AD1: 0xF7C7, - 0x9AD2: 0xF376, - 0x9AD3: 0xCBE8, - 0x9AD4: 0xF377, - 0x9AD5: 0xF378, - 0x9AD6: 0xF379, - 0x9AD7: 0xF37A, - 0x9AD8: 0xB8DF, - 0x9AD9: 0xF37B, - 0x9ADA: 0xF37C, - 0x9ADB: 0xF37D, - 0x9ADC: 0xF37E, - 0x9ADD: 0xF380, - 0x9ADE: 0xF381, - 0x9ADF: 0xF7D4, - 0x9AE0: 0xF382, - 0x9AE1: 0xF7D5, - 0x9AE2: 0xF383, - 0x9AE3: 0xF384, - 0x9AE4: 0xF385, - 0x9AE5: 0xF386, - 0x9AE6: 0xF7D6, - 0x9AE7: 0xF387, - 0x9AE8: 0xF388, - 0x9AE9: 0xF389, - 0x9AEA: 0xF38A, - 0x9AEB: 0xF7D8, - 0x9AEC: 0xF38B, - 0x9AED: 0xF7DA, - 0x9AEE: 0xF38C, - 0x9AEF: 0xF7D7, - 0x9AF0: 0xF38D, - 0x9AF1: 0xF38E, - 0x9AF2: 0xF38F, - 0x9AF3: 0xF390, - 0x9AF4: 0xF391, - 0x9AF5: 0xF392, - 0x9AF6: 0xF393, - 0x9AF7: 0xF394, - 0x9AF8: 0xF395, - 0x9AF9: 0xF7DB, - 0x9AFA: 0xF396, - 0x9AFB: 0xF7D9, - 0x9AFC: 0xF397, - 0x9AFD: 0xF398, - 0x9AFE: 0xF399, - 0x9AFF: 0xF39A, - 0x9B00: 0xF39B, - 0x9B01: 0xF39C, - 0x9B02: 0xF39D, - 0x9B03: 0xD7D7, - 0x9B04: 0xF39E, - 0x9B05: 0xF39F, - 0x9B06: 0xF3A0, - 0x9B07: 0xF440, - 0x9B08: 0xF7DC, - 0x9B09: 0xF441, - 0x9B0A: 0xF442, - 0x9B0B: 0xF443, - 0x9B0C: 0xF444, - 0x9B0D: 0xF445, - 0x9B0E: 0xF446, - 0x9B0F: 0xF7DD, - 0x9B10: 0xF447, - 0x9B11: 0xF448, - 0x9B12: 0xF449, - 0x9B13: 0xF7DE, - 0x9B14: 0xF44A, - 0x9B15: 0xF44B, - 0x9B16: 0xF44C, - 0x9B17: 0xF44D, - 0x9B18: 0xF44E, - 0x9B19: 0xF44F, - 0x9B1A: 0xF450, - 0x9B1B: 0xF451, - 0x9B1C: 0xF452, - 0x9B1D: 0xF453, - 0x9B1E: 0xF454, - 0x9B1F: 0xF7DF, - 0x9B20: 0xF455, - 0x9B21: 0xF456, - 0x9B22: 0xF457, - 0x9B23: 0xF7E0, - 0x9B24: 0xF458, - 0x9B25: 0xF459, - 0x9B26: 0xF45A, - 0x9B27: 0xF45B, - 0x9B28: 0xF45C, - 0x9B29: 0xF45D, - 0x9B2A: 0xF45E, - 0x9B2B: 0xF45F, - 0x9B2C: 0xF460, - 0x9B2D: 0xF461, - 0x9B2E: 0xF462, - 0x9B2F: 0xDBCB, - 0x9B30: 0xF463, - 0x9B31: 0xF464, - 0x9B32: 0xD8AA, - 0x9B33: 0xF465, - 0x9B34: 0xF466, - 0x9B35: 0xF467, - 0x9B36: 0xF468, - 0x9B37: 0xF469, - 0x9B38: 0xF46A, - 0x9B39: 0xF46B, - 0x9B3A: 0xF46C, - 0x9B3B: 0xE5F7, - 0x9B3C: 0xB9ED, - 0x9B3D: 0xF46D, - 0x9B3E: 0xF46E, - 0x9B3F: 0xF46F, - 0x9B40: 0xF470, - 0x9B41: 0xBFFD, - 0x9B42: 0xBBEA, - 0x9B43: 0xF7C9, - 0x9B44: 0xC6C7, - 0x9B45: 0xF7C8, - 0x9B46: 0xF471, - 0x9B47: 0xF7CA, - 0x9B48: 0xF7CC, - 0x9B49: 0xF7CB, - 0x9B4A: 0xF472, - 0x9B4B: 0xF473, - 0x9B4C: 0xF474, - 0x9B4D: 0xF7CD, - 0x9B4E: 0xF475, - 0x9B4F: 0xCEBA, - 0x9B50: 0xF476, - 0x9B51: 0xF7CE, - 0x9B52: 0xF477, - 0x9B53: 0xF478, - 0x9B54: 0xC4A7, - 0x9B55: 0xF479, - 0x9B56: 0xF47A, - 0x9B57: 0xF47B, - 0x9B58: 0xF47C, - 0x9B59: 0xF47D, - 0x9B5A: 0xF47E, - 0x9B5B: 0xF480, - 0x9B5C: 0xF481, - 0x9B5D: 0xF482, - 0x9B5E: 0xF483, - 0x9B5F: 0xF484, - 0x9B60: 0xF485, - 0x9B61: 0xF486, - 0x9B62: 0xF487, - 0x9B63: 0xF488, - 0x9B64: 0xF489, - 0x9B65: 0xF48A, - 0x9B66: 0xF48B, - 0x9B67: 0xF48C, - 0x9B68: 0xF48D, - 0x9B69: 0xF48E, - 0x9B6A: 0xF48F, - 0x9B6B: 0xF490, - 0x9B6C: 0xF491, - 0x9B6D: 0xF492, - 0x9B6E: 0xF493, - 0x9B6F: 0xF494, - 0x9B70: 0xF495, - 0x9B71: 0xF496, - 0x9B72: 0xF497, - 0x9B73: 0xF498, - 0x9B74: 0xF499, - 0x9B75: 0xF49A, - 0x9B76: 0xF49B, - 0x9B77: 0xF49C, - 0x9B78: 0xF49D, - 0x9B79: 0xF49E, - 0x9B7A: 0xF49F, - 0x9B7B: 0xF4A0, - 0x9B7C: 0xF540, - 0x9B7D: 0xF541, - 0x9B7E: 0xF542, - 0x9B7F: 0xF543, - 0x9B80: 0xF544, - 0x9B81: 0xF545, - 0x9B82: 0xF546, - 0x9B83: 0xF547, - 0x9B84: 0xF548, - 0x9B85: 0xF549, - 0x9B86: 0xF54A, - 0x9B87: 0xF54B, - 0x9B88: 0xF54C, - 0x9B89: 0xF54D, - 0x9B8A: 0xF54E, - 0x9B8B: 0xF54F, - 0x9B8C: 0xF550, - 0x9B8D: 0xF551, - 0x9B8E: 0xF552, - 0x9B8F: 0xF553, - 0x9B90: 0xF554, - 0x9B91: 0xF555, - 0x9B92: 0xF556, - 0x9B93: 0xF557, - 0x9B94: 0xF558, - 0x9B95: 0xF559, - 0x9B96: 0xF55A, - 0x9B97: 0xF55B, - 0x9B98: 0xF55C, - 0x9B99: 0xF55D, - 0x9B9A: 0xF55E, - 0x9B9B: 0xF55F, - 0x9B9C: 0xF560, - 0x9B9D: 0xF561, - 0x9B9E: 0xF562, - 0x9B9F: 0xF563, - 0x9BA0: 0xF564, - 0x9BA1: 0xF565, - 0x9BA2: 0xF566, - 0x9BA3: 0xF567, - 0x9BA4: 0xF568, - 0x9BA5: 0xF569, - 0x9BA6: 0xF56A, - 0x9BA7: 0xF56B, - 0x9BA8: 0xF56C, - 0x9BA9: 0xF56D, - 0x9BAA: 0xF56E, - 0x9BAB: 0xF56F, - 0x9BAC: 0xF570, - 0x9BAD: 0xF571, - 0x9BAE: 0xF572, - 0x9BAF: 0xF573, - 0x9BB0: 0xF574, - 0x9BB1: 0xF575, - 0x9BB2: 0xF576, - 0x9BB3: 0xF577, - 0x9BB4: 0xF578, - 0x9BB5: 0xF579, - 0x9BB6: 0xF57A, - 0x9BB7: 0xF57B, - 0x9BB8: 0xF57C, - 0x9BB9: 0xF57D, - 0x9BBA: 0xF57E, - 0x9BBB: 0xF580, - 0x9BBC: 0xF581, - 0x9BBD: 0xF582, - 0x9BBE: 0xF583, - 0x9BBF: 0xF584, - 0x9BC0: 0xF585, - 0x9BC1: 0xF586, - 0x9BC2: 0xF587, - 0x9BC3: 0xF588, - 0x9BC4: 0xF589, - 0x9BC5: 0xF58A, - 0x9BC6: 0xF58B, - 0x9BC7: 0xF58C, - 0x9BC8: 0xF58D, - 0x9BC9: 0xF58E, - 0x9BCA: 0xF58F, - 0x9BCB: 0xF590, - 0x9BCC: 0xF591, - 0x9BCD: 0xF592, - 0x9BCE: 0xF593, - 0x9BCF: 0xF594, - 0x9BD0: 0xF595, - 0x9BD1: 0xF596, - 0x9BD2: 0xF597, - 0x9BD3: 0xF598, - 0x9BD4: 0xF599, - 0x9BD5: 0xF59A, - 0x9BD6: 0xF59B, - 0x9BD7: 0xF59C, - 0x9BD8: 0xF59D, - 0x9BD9: 0xF59E, - 0x9BDA: 0xF59F, - 0x9BDB: 0xF5A0, - 0x9BDC: 0xF640, - 0x9BDD: 0xF641, - 0x9BDE: 0xF642, - 0x9BDF: 0xF643, - 0x9BE0: 0xF644, - 0x9BE1: 0xF645, - 0x9BE2: 0xF646, - 0x9BE3: 0xF647, - 0x9BE4: 0xF648, - 0x9BE5: 0xF649, - 0x9BE6: 0xF64A, - 0x9BE7: 0xF64B, - 0x9BE8: 0xF64C, - 0x9BE9: 0xF64D, - 0x9BEA: 0xF64E, - 0x9BEB: 0xF64F, - 0x9BEC: 0xF650, - 0x9BED: 0xF651, - 0x9BEE: 0xF652, - 0x9BEF: 0xF653, - 0x9BF0: 0xF654, - 0x9BF1: 0xF655, - 0x9BF2: 0xF656, - 0x9BF3: 0xF657, - 0x9BF4: 0xF658, - 0x9BF5: 0xF659, - 0x9BF6: 0xF65A, - 0x9BF7: 0xF65B, - 0x9BF8: 0xF65C, - 0x9BF9: 0xF65D, - 0x9BFA: 0xF65E, - 0x9BFB: 0xF65F, - 0x9BFC: 0xF660, - 0x9BFD: 0xF661, - 0x9BFE: 0xF662, - 0x9BFF: 0xF663, - 0x9C00: 0xF664, - 0x9C01: 0xF665, - 0x9C02: 0xF666, - 0x9C03: 0xF667, - 0x9C04: 0xF668, - 0x9C05: 0xF669, - 0x9C06: 0xF66A, - 0x9C07: 0xF66B, - 0x9C08: 0xF66C, - 0x9C09: 0xF66D, - 0x9C0A: 0xF66E, - 0x9C0B: 0xF66F, - 0x9C0C: 0xF670, - 0x9C0D: 0xF671, - 0x9C0E: 0xF672, - 0x9C0F: 0xF673, - 0x9C10: 0xF674, - 0x9C11: 0xF675, - 0x9C12: 0xF676, - 0x9C13: 0xF677, - 0x9C14: 0xF678, - 0x9C15: 0xF679, - 0x9C16: 0xF67A, - 0x9C17: 0xF67B, - 0x9C18: 0xF67C, - 0x9C19: 0xF67D, - 0x9C1A: 0xF67E, - 0x9C1B: 0xF680, - 0x9C1C: 0xF681, - 0x9C1D: 0xF682, - 0x9C1E: 0xF683, - 0x9C1F: 0xF684, - 0x9C20: 0xF685, - 0x9C21: 0xF686, - 0x9C22: 0xF687, - 0x9C23: 0xF688, - 0x9C24: 0xF689, - 0x9C25: 0xF68A, - 0x9C26: 0xF68B, - 0x9C27: 0xF68C, - 0x9C28: 0xF68D, - 0x9C29: 0xF68E, - 0x9C2A: 0xF68F, - 0x9C2B: 0xF690, - 0x9C2C: 0xF691, - 0x9C2D: 0xF692, - 0x9C2E: 0xF693, - 0x9C2F: 0xF694, - 0x9C30: 0xF695, - 0x9C31: 0xF696, - 0x9C32: 0xF697, - 0x9C33: 0xF698, - 0x9C34: 0xF699, - 0x9C35: 0xF69A, - 0x9C36: 0xF69B, - 0x9C37: 0xF69C, - 0x9C38: 0xF69D, - 0x9C39: 0xF69E, - 0x9C3A: 0xF69F, - 0x9C3B: 0xF6A0, - 0x9C3C: 0xF740, - 0x9C3D: 0xF741, - 0x9C3E: 0xF742, - 0x9C3F: 0xF743, - 0x9C40: 0xF744, - 0x9C41: 0xF745, - 0x9C42: 0xF746, - 0x9C43: 0xF747, - 0x9C44: 0xF748, - 0x9C45: 0xF749, - 0x9C46: 0xF74A, - 0x9C47: 0xF74B, - 0x9C48: 0xF74C, - 0x9C49: 0xF74D, - 0x9C4A: 0xF74E, - 0x9C4B: 0xF74F, - 0x9C4C: 0xF750, - 0x9C4D: 0xF751, - 0x9C4E: 0xF752, - 0x9C4F: 0xF753, - 0x9C50: 0xF754, - 0x9C51: 0xF755, - 0x9C52: 0xF756, - 0x9C53: 0xF757, - 0x9C54: 0xF758, - 0x9C55: 0xF759, - 0x9C56: 0xF75A, - 0x9C57: 0xF75B, - 0x9C58: 0xF75C, - 0x9C59: 0xF75D, - 0x9C5A: 0xF75E, - 0x9C5B: 0xF75F, - 0x9C5C: 0xF760, - 0x9C5D: 0xF761, - 0x9C5E: 0xF762, - 0x9C5F: 0xF763, - 0x9C60: 0xF764, - 0x9C61: 0xF765, - 0x9C62: 0xF766, - 0x9C63: 0xF767, - 0x9C64: 0xF768, - 0x9C65: 0xF769, - 0x9C66: 0xF76A, - 0x9C67: 0xF76B, - 0x9C68: 0xF76C, - 0x9C69: 0xF76D, - 0x9C6A: 0xF76E, - 0x9C6B: 0xF76F, - 0x9C6C: 0xF770, - 0x9C6D: 0xF771, - 0x9C6E: 0xF772, - 0x9C6F: 0xF773, - 0x9C70: 0xF774, - 0x9C71: 0xF775, - 0x9C72: 0xF776, - 0x9C73: 0xF777, - 0x9C74: 0xF778, - 0x9C75: 0xF779, - 0x9C76: 0xF77A, - 0x9C77: 0xF77B, - 0x9C78: 0xF77C, - 0x9C79: 0xF77D, - 0x9C7A: 0xF77E, - 0x9C7B: 0xF780, - 0x9C7C: 0xD3E3, - 0x9C7D: 0xF781, - 0x9C7E: 0xF782, - 0x9C7F: 0xF6CF, - 0x9C80: 0xF783, - 0x9C81: 0xC2B3, - 0x9C82: 0xF6D0, - 0x9C83: 0xF784, - 0x9C84: 0xF785, - 0x9C85: 0xF6D1, - 0x9C86: 0xF6D2, - 0x9C87: 0xF6D3, - 0x9C88: 0xF6D4, - 0x9C89: 0xF786, - 0x9C8A: 0xF787, - 0x9C8B: 0xF6D6, - 0x9C8C: 0xF788, - 0x9C8D: 0xB1AB, - 0x9C8E: 0xF6D7, - 0x9C8F: 0xF789, - 0x9C90: 0xF6D8, - 0x9C91: 0xF6D9, - 0x9C92: 0xF6DA, - 0x9C93: 0xF78A, - 0x9C94: 0xF6DB, - 0x9C95: 0xF6DC, - 0x9C96: 0xF78B, - 0x9C97: 0xF78C, - 0x9C98: 0xF78D, - 0x9C99: 0xF78E, - 0x9C9A: 0xF6DD, - 0x9C9B: 0xF6DE, - 0x9C9C: 0xCFCA, - 0x9C9D: 0xF78F, - 0x9C9E: 0xF6DF, - 0x9C9F: 0xF6E0, - 0x9CA0: 0xF6E1, - 0x9CA1: 0xF6E2, - 0x9CA2: 0xF6E3, - 0x9CA3: 0xF6E4, - 0x9CA4: 0xC0F0, - 0x9CA5: 0xF6E5, - 0x9CA6: 0xF6E6, - 0x9CA7: 0xF6E7, - 0x9CA8: 0xF6E8, - 0x9CA9: 0xF6E9, - 0x9CAA: 0xF790, - 0x9CAB: 0xF6EA, - 0x9CAC: 0xF791, - 0x9CAD: 0xF6EB, - 0x9CAE: 0xF6EC, - 0x9CAF: 0xF792, - 0x9CB0: 0xF6ED, - 0x9CB1: 0xF6EE, - 0x9CB2: 0xF6EF, - 0x9CB3: 0xF6F0, - 0x9CB4: 0xF6F1, - 0x9CB5: 0xF6F2, - 0x9CB6: 0xF6F3, - 0x9CB7: 0xF6F4, - 0x9CB8: 0xBEA8, - 0x9CB9: 0xF793, - 0x9CBA: 0xF6F5, - 0x9CBB: 0xF6F6, - 0x9CBC: 0xF6F7, - 0x9CBD: 0xF6F8, - 0x9CBE: 0xF794, - 0x9CBF: 0xF795, - 0x9CC0: 0xF796, - 0x9CC1: 0xF797, - 0x9CC2: 0xF798, - 0x9CC3: 0xC8FA, - 0x9CC4: 0xF6F9, - 0x9CC5: 0xF6FA, - 0x9CC6: 0xF6FB, - 0x9CC7: 0xF6FC, - 0x9CC8: 0xF799, - 0x9CC9: 0xF79A, - 0x9CCA: 0xF6FD, - 0x9CCB: 0xF6FE, - 0x9CCC: 0xF7A1, - 0x9CCD: 0xF7A2, - 0x9CCE: 0xF7A3, - 0x9CCF: 0xF7A4, - 0x9CD0: 0xF7A5, - 0x9CD1: 0xF79B, - 0x9CD2: 0xF79C, - 0x9CD3: 0xF7A6, - 0x9CD4: 0xF7A7, - 0x9CD5: 0xF7A8, - 0x9CD6: 0xB1EE, - 0x9CD7: 0xF7A9, - 0x9CD8: 0xF7AA, - 0x9CD9: 0xF7AB, - 0x9CDA: 0xF79D, - 0x9CDB: 0xF79E, - 0x9CDC: 0xF7AC, - 0x9CDD: 0xF7AD, - 0x9CDE: 0xC1DB, - 0x9CDF: 0xF7AE, - 0x9CE0: 0xF79F, - 0x9CE1: 0xF7A0, - 0x9CE2: 0xF7AF, - 0x9CE3: 0xF840, - 0x9CE4: 0xF841, - 0x9CE5: 0xF842, - 0x9CE6: 0xF843, - 0x9CE7: 0xF844, - 0x9CE8: 0xF845, - 0x9CE9: 0xF846, - 0x9CEA: 0xF847, - 0x9CEB: 0xF848, - 0x9CEC: 0xF849, - 0x9CED: 0xF84A, - 0x9CEE: 0xF84B, - 0x9CEF: 0xF84C, - 0x9CF0: 0xF84D, - 0x9CF1: 0xF84E, - 0x9CF2: 0xF84F, - 0x9CF3: 0xF850, - 0x9CF4: 0xF851, - 0x9CF5: 0xF852, - 0x9CF6: 0xF853, - 0x9CF7: 0xF854, - 0x9CF8: 0xF855, - 0x9CF9: 0xF856, - 0x9CFA: 0xF857, - 0x9CFB: 0xF858, - 0x9CFC: 0xF859, - 0x9CFD: 0xF85A, - 0x9CFE: 0xF85B, - 0x9CFF: 0xF85C, - 0x9D00: 0xF85D, - 0x9D01: 0xF85E, - 0x9D02: 0xF85F, - 0x9D03: 0xF860, - 0x9D04: 0xF861, - 0x9D05: 0xF862, - 0x9D06: 0xF863, - 0x9D07: 0xF864, - 0x9D08: 0xF865, - 0x9D09: 0xF866, - 0x9D0A: 0xF867, - 0x9D0B: 0xF868, - 0x9D0C: 0xF869, - 0x9D0D: 0xF86A, - 0x9D0E: 0xF86B, - 0x9D0F: 0xF86C, - 0x9D10: 0xF86D, - 0x9D11: 0xF86E, - 0x9D12: 0xF86F, - 0x9D13: 0xF870, - 0x9D14: 0xF871, - 0x9D15: 0xF872, - 0x9D16: 0xF873, - 0x9D17: 0xF874, - 0x9D18: 0xF875, - 0x9D19: 0xF876, - 0x9D1A: 0xF877, - 0x9D1B: 0xF878, - 0x9D1C: 0xF879, - 0x9D1D: 0xF87A, - 0x9D1E: 0xF87B, - 0x9D1F: 0xF87C, - 0x9D20: 0xF87D, - 0x9D21: 0xF87E, - 0x9D22: 0xF880, - 0x9D23: 0xF881, - 0x9D24: 0xF882, - 0x9D25: 0xF883, - 0x9D26: 0xF884, - 0x9D27: 0xF885, - 0x9D28: 0xF886, - 0x9D29: 0xF887, - 0x9D2A: 0xF888, - 0x9D2B: 0xF889, - 0x9D2C: 0xF88A, - 0x9D2D: 0xF88B, - 0x9D2E: 0xF88C, - 0x9D2F: 0xF88D, - 0x9D30: 0xF88E, - 0x9D31: 0xF88F, - 0x9D32: 0xF890, - 0x9D33: 0xF891, - 0x9D34: 0xF892, - 0x9D35: 0xF893, - 0x9D36: 0xF894, - 0x9D37: 0xF895, - 0x9D38: 0xF896, - 0x9D39: 0xF897, - 0x9D3A: 0xF898, - 0x9D3B: 0xF899, - 0x9D3C: 0xF89A, - 0x9D3D: 0xF89B, - 0x9D3E: 0xF89C, - 0x9D3F: 0xF89D, - 0x9D40: 0xF89E, - 0x9D41: 0xF89F, - 0x9D42: 0xF8A0, - 0x9D43: 0xF940, - 0x9D44: 0xF941, - 0x9D45: 0xF942, - 0x9D46: 0xF943, - 0x9D47: 0xF944, - 0x9D48: 0xF945, - 0x9D49: 0xF946, - 0x9D4A: 0xF947, - 0x9D4B: 0xF948, - 0x9D4C: 0xF949, - 0x9D4D: 0xF94A, - 0x9D4E: 0xF94B, - 0x9D4F: 0xF94C, - 0x9D50: 0xF94D, - 0x9D51: 0xF94E, - 0x9D52: 0xF94F, - 0x9D53: 0xF950, - 0x9D54: 0xF951, - 0x9D55: 0xF952, - 0x9D56: 0xF953, - 0x9D57: 0xF954, - 0x9D58: 0xF955, - 0x9D59: 0xF956, - 0x9D5A: 0xF957, - 0x9D5B: 0xF958, - 0x9D5C: 0xF959, - 0x9D5D: 0xF95A, - 0x9D5E: 0xF95B, - 0x9D5F: 0xF95C, - 0x9D60: 0xF95D, - 0x9D61: 0xF95E, - 0x9D62: 0xF95F, - 0x9D63: 0xF960, - 0x9D64: 0xF961, - 0x9D65: 0xF962, - 0x9D66: 0xF963, - 0x9D67: 0xF964, - 0x9D68: 0xF965, - 0x9D69: 0xF966, - 0x9D6A: 0xF967, - 0x9D6B: 0xF968, - 0x9D6C: 0xF969, - 0x9D6D: 0xF96A, - 0x9D6E: 0xF96B, - 0x9D6F: 0xF96C, - 0x9D70: 0xF96D, - 0x9D71: 0xF96E, - 0x9D72: 0xF96F, - 0x9D73: 0xF970, - 0x9D74: 0xF971, - 0x9D75: 0xF972, - 0x9D76: 0xF973, - 0x9D77: 0xF974, - 0x9D78: 0xF975, - 0x9D79: 0xF976, - 0x9D7A: 0xF977, - 0x9D7B: 0xF978, - 0x9D7C: 0xF979, - 0x9D7D: 0xF97A, - 0x9D7E: 0xF97B, - 0x9D7F: 0xF97C, - 0x9D80: 0xF97D, - 0x9D81: 0xF97E, - 0x9D82: 0xF980, - 0x9D83: 0xF981, - 0x9D84: 0xF982, - 0x9D85: 0xF983, - 0x9D86: 0xF984, - 0x9D87: 0xF985, - 0x9D88: 0xF986, - 0x9D89: 0xF987, - 0x9D8A: 0xF988, - 0x9D8B: 0xF989, - 0x9D8C: 0xF98A, - 0x9D8D: 0xF98B, - 0x9D8E: 0xF98C, - 0x9D8F: 0xF98D, - 0x9D90: 0xF98E, - 0x9D91: 0xF98F, - 0x9D92: 0xF990, - 0x9D93: 0xF991, - 0x9D94: 0xF992, - 0x9D95: 0xF993, - 0x9D96: 0xF994, - 0x9D97: 0xF995, - 0x9D98: 0xF996, - 0x9D99: 0xF997, - 0x9D9A: 0xF998, - 0x9D9B: 0xF999, - 0x9D9C: 0xF99A, - 0x9D9D: 0xF99B, - 0x9D9E: 0xF99C, - 0x9D9F: 0xF99D, - 0x9DA0: 0xF99E, - 0x9DA1: 0xF99F, - 0x9DA2: 0xF9A0, - 0x9DA3: 0xFA40, - 0x9DA4: 0xFA41, - 0x9DA5: 0xFA42, - 0x9DA6: 0xFA43, - 0x9DA7: 0xFA44, - 0x9DA8: 0xFA45, - 0x9DA9: 0xFA46, - 0x9DAA: 0xFA47, - 0x9DAB: 0xFA48, - 0x9DAC: 0xFA49, - 0x9DAD: 0xFA4A, - 0x9DAE: 0xFA4B, - 0x9DAF: 0xFA4C, - 0x9DB0: 0xFA4D, - 0x9DB1: 0xFA4E, - 0x9DB2: 0xFA4F, - 0x9DB3: 0xFA50, - 0x9DB4: 0xFA51, - 0x9DB5: 0xFA52, - 0x9DB6: 0xFA53, - 0x9DB7: 0xFA54, - 0x9DB8: 0xFA55, - 0x9DB9: 0xFA56, - 0x9DBA: 0xFA57, - 0x9DBB: 0xFA58, - 0x9DBC: 0xFA59, - 0x9DBD: 0xFA5A, - 0x9DBE: 0xFA5B, - 0x9DBF: 0xFA5C, - 0x9DC0: 0xFA5D, - 0x9DC1: 0xFA5E, - 0x9DC2: 0xFA5F, - 0x9DC3: 0xFA60, - 0x9DC4: 0xFA61, - 0x9DC5: 0xFA62, - 0x9DC6: 0xFA63, - 0x9DC7: 0xFA64, - 0x9DC8: 0xFA65, - 0x9DC9: 0xFA66, - 0x9DCA: 0xFA67, - 0x9DCB: 0xFA68, - 0x9DCC: 0xFA69, - 0x9DCD: 0xFA6A, - 0x9DCE: 0xFA6B, - 0x9DCF: 0xFA6C, - 0x9DD0: 0xFA6D, - 0x9DD1: 0xFA6E, - 0x9DD2: 0xFA6F, - 0x9DD3: 0xFA70, - 0x9DD4: 0xFA71, - 0x9DD5: 0xFA72, - 0x9DD6: 0xFA73, - 0x9DD7: 0xFA74, - 0x9DD8: 0xFA75, - 0x9DD9: 0xFA76, - 0x9DDA: 0xFA77, - 0x9DDB: 0xFA78, - 0x9DDC: 0xFA79, - 0x9DDD: 0xFA7A, - 0x9DDE: 0xFA7B, - 0x9DDF: 0xFA7C, - 0x9DE0: 0xFA7D, - 0x9DE1: 0xFA7E, - 0x9DE2: 0xFA80, - 0x9DE3: 0xFA81, - 0x9DE4: 0xFA82, - 0x9DE5: 0xFA83, - 0x9DE6: 0xFA84, - 0x9DE7: 0xFA85, - 0x9DE8: 0xFA86, - 0x9DE9: 0xFA87, - 0x9DEA: 0xFA88, - 0x9DEB: 0xFA89, - 0x9DEC: 0xFA8A, - 0x9DED: 0xFA8B, - 0x9DEE: 0xFA8C, - 0x9DEF: 0xFA8D, - 0x9DF0: 0xFA8E, - 0x9DF1: 0xFA8F, - 0x9DF2: 0xFA90, - 0x9DF3: 0xFA91, - 0x9DF4: 0xFA92, - 0x9DF5: 0xFA93, - 0x9DF6: 0xFA94, - 0x9DF7: 0xFA95, - 0x9DF8: 0xFA96, - 0x9DF9: 0xFA97, - 0x9DFA: 0xFA98, - 0x9DFB: 0xFA99, - 0x9DFC: 0xFA9A, - 0x9DFD: 0xFA9B, - 0x9DFE: 0xFA9C, - 0x9DFF: 0xFA9D, - 0x9E00: 0xFA9E, - 0x9E01: 0xFA9F, - 0x9E02: 0xFAA0, - 0x9E03: 0xFB40, - 0x9E04: 0xFB41, - 0x9E05: 0xFB42, - 0x9E06: 0xFB43, - 0x9E07: 0xFB44, - 0x9E08: 0xFB45, - 0x9E09: 0xFB46, - 0x9E0A: 0xFB47, - 0x9E0B: 0xFB48, - 0x9E0C: 0xFB49, - 0x9E0D: 0xFB4A, - 0x9E0E: 0xFB4B, - 0x9E0F: 0xFB4C, - 0x9E10: 0xFB4D, - 0x9E11: 0xFB4E, - 0x9E12: 0xFB4F, - 0x9E13: 0xFB50, - 0x9E14: 0xFB51, - 0x9E15: 0xFB52, - 0x9E16: 0xFB53, - 0x9E17: 0xFB54, - 0x9E18: 0xFB55, - 0x9E19: 0xFB56, - 0x9E1A: 0xFB57, - 0x9E1B: 0xFB58, - 0x9E1C: 0xFB59, - 0x9E1D: 0xFB5A, - 0x9E1E: 0xFB5B, - 0x9E1F: 0xC4F1, - 0x9E20: 0xF0AF, - 0x9E21: 0xBCA6, - 0x9E22: 0xF0B0, - 0x9E23: 0xC3F9, - 0x9E24: 0xFB5C, - 0x9E25: 0xC5B8, - 0x9E26: 0xD1BB, - 0x9E27: 0xFB5D, - 0x9E28: 0xF0B1, - 0x9E29: 0xF0B2, - 0x9E2A: 0xF0B3, - 0x9E2B: 0xF0B4, - 0x9E2C: 0xF0B5, - 0x9E2D: 0xD1BC, - 0x9E2E: 0xFB5E, - 0x9E2F: 0xD1EC, - 0x9E30: 0xFB5F, - 0x9E31: 0xF0B7, - 0x9E32: 0xF0B6, - 0x9E33: 0xD4A7, - 0x9E34: 0xFB60, - 0x9E35: 0xCDD2, - 0x9E36: 0xF0B8, - 0x9E37: 0xF0BA, - 0x9E38: 0xF0B9, - 0x9E39: 0xF0BB, - 0x9E3A: 0xF0BC, - 0x9E3B: 0xFB61, - 0x9E3C: 0xFB62, - 0x9E3D: 0xB8EB, - 0x9E3E: 0xF0BD, - 0x9E3F: 0xBAE8, - 0x9E40: 0xFB63, - 0x9E41: 0xF0BE, - 0x9E42: 0xF0BF, - 0x9E43: 0xBEE9, - 0x9E44: 0xF0C0, - 0x9E45: 0xB6EC, - 0x9E46: 0xF0C1, - 0x9E47: 0xF0C2, - 0x9E48: 0xF0C3, - 0x9E49: 0xF0C4, - 0x9E4A: 0xC8B5, - 0x9E4B: 0xF0C5, - 0x9E4C: 0xF0C6, - 0x9E4D: 0xFB64, - 0x9E4E: 0xF0C7, - 0x9E4F: 0xC5F4, - 0x9E50: 0xFB65, - 0x9E51: 0xF0C8, - 0x9E52: 0xFB66, - 0x9E53: 0xFB67, - 0x9E54: 0xFB68, - 0x9E55: 0xF0C9, - 0x9E56: 0xFB69, - 0x9E57: 0xF0CA, - 0x9E58: 0xF7BD, - 0x9E59: 0xFB6A, - 0x9E5A: 0xF0CB, - 0x9E5B: 0xF0CC, - 0x9E5C: 0xF0CD, - 0x9E5D: 0xFB6B, - 0x9E5E: 0xF0CE, - 0x9E5F: 0xFB6C, - 0x9E60: 0xFB6D, - 0x9E61: 0xFB6E, - 0x9E62: 0xFB6F, - 0x9E63: 0xF0CF, - 0x9E64: 0xBAD7, - 0x9E65: 0xFB70, - 0x9E66: 0xF0D0, - 0x9E67: 0xF0D1, - 0x9E68: 0xF0D2, - 0x9E69: 0xF0D3, - 0x9E6A: 0xF0D4, - 0x9E6B: 0xF0D5, - 0x9E6C: 0xF0D6, - 0x9E6D: 0xF0D8, - 0x9E6E: 0xFB71, - 0x9E6F: 0xFB72, - 0x9E70: 0xD3A5, - 0x9E71: 0xF0D7, - 0x9E72: 0xFB73, - 0x9E73: 0xF0D9, - 0x9E74: 0xFB74, - 0x9E75: 0xFB75, - 0x9E76: 0xFB76, - 0x9E77: 0xFB77, - 0x9E78: 0xFB78, - 0x9E79: 0xFB79, - 0x9E7A: 0xFB7A, - 0x9E7B: 0xFB7B, - 0x9E7C: 0xFB7C, - 0x9E7D: 0xFB7D, - 0x9E7E: 0xF5BA, - 0x9E7F: 0xC2B9, - 0x9E80: 0xFB7E, - 0x9E81: 0xFB80, - 0x9E82: 0xF7E4, - 0x9E83: 0xFB81, - 0x9E84: 0xFB82, - 0x9E85: 0xFB83, - 0x9E86: 0xFB84, - 0x9E87: 0xF7E5, - 0x9E88: 0xF7E6, - 0x9E89: 0xFB85, - 0x9E8A: 0xFB86, - 0x9E8B: 0xF7E7, - 0x9E8C: 0xFB87, - 0x9E8D: 0xFB88, - 0x9E8E: 0xFB89, - 0x9E8F: 0xFB8A, - 0x9E90: 0xFB8B, - 0x9E91: 0xFB8C, - 0x9E92: 0xF7E8, - 0x9E93: 0xC2B4, - 0x9E94: 0xFB8D, - 0x9E95: 0xFB8E, - 0x9E96: 0xFB8F, - 0x9E97: 0xFB90, - 0x9E98: 0xFB91, - 0x9E99: 0xFB92, - 0x9E9A: 0xFB93, - 0x9E9B: 0xFB94, - 0x9E9C: 0xFB95, - 0x9E9D: 0xF7EA, - 0x9E9E: 0xFB96, - 0x9E9F: 0xF7EB, - 0x9EA0: 0xFB97, - 0x9EA1: 0xFB98, - 0x9EA2: 0xFB99, - 0x9EA3: 0xFB9A, - 0x9EA4: 0xFB9B, - 0x9EA5: 0xFB9C, - 0x9EA6: 0xC2F3, - 0x9EA7: 0xFB9D, - 0x9EA8: 0xFB9E, - 0x9EA9: 0xFB9F, - 0x9EAA: 0xFBA0, - 0x9EAB: 0xFC40, - 0x9EAC: 0xFC41, - 0x9EAD: 0xFC42, - 0x9EAE: 0xFC43, - 0x9EAF: 0xFC44, - 0x9EB0: 0xFC45, - 0x9EB1: 0xFC46, - 0x9EB2: 0xFC47, - 0x9EB3: 0xFC48, - 0x9EB4: 0xF4F0, - 0x9EB5: 0xFC49, - 0x9EB6: 0xFC4A, - 0x9EB7: 0xFC4B, - 0x9EB8: 0xF4EF, - 0x9EB9: 0xFC4C, - 0x9EBA: 0xFC4D, - 0x9EBB: 0xC2E9, - 0x9EBC: 0xFC4E, - 0x9EBD: 0xF7E1, - 0x9EBE: 0xF7E2, - 0x9EBF: 0xFC4F, - 0x9EC0: 0xFC50, - 0x9EC1: 0xFC51, - 0x9EC2: 0xFC52, - 0x9EC3: 0xFC53, - 0x9EC4: 0xBBC6, - 0x9EC5: 0xFC54, - 0x9EC6: 0xFC55, - 0x9EC7: 0xFC56, - 0x9EC8: 0xFC57, - 0x9EC9: 0xD9E4, - 0x9ECA: 0xFC58, - 0x9ECB: 0xFC59, - 0x9ECC: 0xFC5A, - 0x9ECD: 0xCAF2, - 0x9ECE: 0xC0E8, - 0x9ECF: 0xF0A4, - 0x9ED0: 0xFC5B, - 0x9ED1: 0xBADA, - 0x9ED2: 0xFC5C, - 0x9ED3: 0xFC5D, - 0x9ED4: 0xC7AD, - 0x9ED5: 0xFC5E, - 0x9ED6: 0xFC5F, - 0x9ED7: 0xFC60, - 0x9ED8: 0xC4AC, - 0x9ED9: 0xFC61, - 0x9EDA: 0xFC62, - 0x9EDB: 0xF7EC, - 0x9EDC: 0xF7ED, - 0x9EDD: 0xF7EE, - 0x9EDE: 0xFC63, - 0x9EDF: 0xF7F0, - 0x9EE0: 0xF7EF, - 0x9EE1: 0xFC64, - 0x9EE2: 0xF7F1, - 0x9EE3: 0xFC65, - 0x9EE4: 0xFC66, - 0x9EE5: 0xF7F4, - 0x9EE6: 0xFC67, - 0x9EE7: 0xF7F3, - 0x9EE8: 0xFC68, - 0x9EE9: 0xF7F2, - 0x9EEA: 0xF7F5, - 0x9EEB: 0xFC69, - 0x9EEC: 0xFC6A, - 0x9EED: 0xFC6B, - 0x9EEE: 0xFC6C, - 0x9EEF: 0xF7F6, - 0x9EF0: 0xFC6D, - 0x9EF1: 0xFC6E, - 0x9EF2: 0xFC6F, - 0x9EF3: 0xFC70, - 0x9EF4: 0xFC71, - 0x9EF5: 0xFC72, - 0x9EF6: 0xFC73, - 0x9EF7: 0xFC74, - 0x9EF8: 0xFC75, - 0x9EF9: 0xEDE9, - 0x9EFA: 0xFC76, - 0x9EFB: 0xEDEA, - 0x9EFC: 0xEDEB, - 0x9EFD: 0xFC77, - 0x9EFE: 0xF6BC, - 0x9EFF: 0xFC78, - 0x9F00: 0xFC79, - 0x9F01: 0xFC7A, - 0x9F02: 0xFC7B, - 0x9F03: 0xFC7C, - 0x9F04: 0xFC7D, - 0x9F05: 0xFC7E, - 0x9F06: 0xFC80, - 0x9F07: 0xFC81, - 0x9F08: 0xFC82, - 0x9F09: 0xFC83, - 0x9F0A: 0xFC84, - 0x9F0B: 0xF6BD, - 0x9F0C: 0xFC85, - 0x9F0D: 0xF6BE, - 0x9F0E: 0xB6A6, - 0x9F0F: 0xFC86, - 0x9F10: 0xD8BE, - 0x9F11: 0xFC87, - 0x9F12: 0xFC88, - 0x9F13: 0xB9C4, - 0x9F14: 0xFC89, - 0x9F15: 0xFC8A, - 0x9F16: 0xFC8B, - 0x9F17: 0xD8BB, - 0x9F18: 0xFC8C, - 0x9F19: 0xDCB1, - 0x9F1A: 0xFC8D, - 0x9F1B: 0xFC8E, - 0x9F1C: 0xFC8F, - 0x9F1D: 0xFC90, - 0x9F1E: 0xFC91, - 0x9F1F: 0xFC92, - 0x9F20: 0xCAF3, - 0x9F21: 0xFC93, - 0x9F22: 0xF7F7, - 0x9F23: 0xFC94, - 0x9F24: 0xFC95, - 0x9F25: 0xFC96, - 0x9F26: 0xFC97, - 0x9F27: 0xFC98, - 0x9F28: 0xFC99, - 0x9F29: 0xFC9A, - 0x9F2A: 0xFC9B, - 0x9F2B: 0xFC9C, - 0x9F2C: 0xF7F8, - 0x9F2D: 0xFC9D, - 0x9F2E: 0xFC9E, - 0x9F2F: 0xF7F9, - 0x9F30: 0xFC9F, - 0x9F31: 0xFCA0, - 0x9F32: 0xFD40, - 0x9F33: 0xFD41, - 0x9F34: 0xFD42, - 0x9F35: 0xFD43, - 0x9F36: 0xFD44, - 0x9F37: 0xF7FB, - 0x9F38: 0xFD45, - 0x9F39: 0xF7FA, - 0x9F3A: 0xFD46, - 0x9F3B: 0xB1C7, - 0x9F3C: 0xFD47, - 0x9F3D: 0xF7FC, - 0x9F3E: 0xF7FD, - 0x9F3F: 0xFD48, - 0x9F40: 0xFD49, - 0x9F41: 0xFD4A, - 0x9F42: 0xFD4B, - 0x9F43: 0xFD4C, - 0x9F44: 0xF7FE, - 0x9F45: 0xFD4D, - 0x9F46: 0xFD4E, - 0x9F47: 0xFD4F, - 0x9F48: 0xFD50, - 0x9F49: 0xFD51, - 0x9F4A: 0xFD52, - 0x9F4B: 0xFD53, - 0x9F4C: 0xFD54, - 0x9F4D: 0xFD55, - 0x9F4E: 0xFD56, - 0x9F4F: 0xFD57, - 0x9F50: 0xC6EB, - 0x9F51: 0xECB4, - 0x9F52: 0xFD58, - 0x9F53: 0xFD59, - 0x9F54: 0xFD5A, - 0x9F55: 0xFD5B, - 0x9F56: 0xFD5C, - 0x9F57: 0xFD5D, - 0x9F58: 0xFD5E, - 0x9F59: 0xFD5F, - 0x9F5A: 0xFD60, - 0x9F5B: 0xFD61, - 0x9F5C: 0xFD62, - 0x9F5D: 0xFD63, - 0x9F5E: 0xFD64, - 0x9F5F: 0xFD65, - 0x9F60: 0xFD66, - 0x9F61: 0xFD67, - 0x9F62: 0xFD68, - 0x9F63: 0xFD69, - 0x9F64: 0xFD6A, - 0x9F65: 0xFD6B, - 0x9F66: 0xFD6C, - 0x9F67: 0xFD6D, - 0x9F68: 0xFD6E, - 0x9F69: 0xFD6F, - 0x9F6A: 0xFD70, - 0x9F6B: 0xFD71, - 0x9F6C: 0xFD72, - 0x9F6D: 0xFD73, - 0x9F6E: 0xFD74, - 0x9F6F: 0xFD75, - 0x9F70: 0xFD76, - 0x9F71: 0xFD77, - 0x9F72: 0xFD78, - 0x9F73: 0xFD79, - 0x9F74: 0xFD7A, - 0x9F75: 0xFD7B, - 0x9F76: 0xFD7C, - 0x9F77: 0xFD7D, - 0x9F78: 0xFD7E, - 0x9F79: 0xFD80, - 0x9F7A: 0xFD81, - 0x9F7B: 0xFD82, - 0x9F7C: 0xFD83, - 0x9F7D: 0xFD84, - 0x9F7E: 0xFD85, - 0x9F7F: 0xB3DD, - 0x9F80: 0xF6B3, - 0x9F81: 0xFD86, - 0x9F82: 0xFD87, - 0x9F83: 0xF6B4, - 0x9F84: 0xC1E4, - 0x9F85: 0xF6B5, - 0x9F86: 0xF6B6, - 0x9F87: 0xF6B7, - 0x9F88: 0xF6B8, - 0x9F89: 0xF6B9, - 0x9F8A: 0xF6BA, - 0x9F8B: 0xC8A3, - 0x9F8C: 0xF6BB, - 0x9F8D: 0xFD88, - 0x9F8E: 0xFD89, - 0x9F8F: 0xFD8A, - 0x9F90: 0xFD8B, - 0x9F91: 0xFD8C, - 0x9F92: 0xFD8D, - 0x9F93: 0xFD8E, - 0x9F94: 0xFD8F, - 0x9F95: 0xFD90, - 0x9F96: 0xFD91, - 0x9F97: 0xFD92, - 0x9F98: 0xFD93, - 0x9F99: 0xC1FA, - 0x9F9A: 0xB9A8, - 0x9F9B: 0xEDE8, - 0x9F9C: 0xFD94, - 0x9F9D: 0xFD95, - 0x9F9E: 0xFD96, - 0x9F9F: 0xB9EA, - 0x9FA0: 0xD9DF, - 0x9FA1: 0xFD97, - 0x9FA2: 0xFD98, - 0x9FA3: 0xFD99, - 0x9FA4: 0xFD9A, - 0x9FA5: 0xFD9B, - 0x9FB4: 0xFE59, - 0x9FB5: 0xFE61, - 0x9FB6: 0xFE66, - 0x9FB7: 0xFE67, - 0x9FB8: 0xFE6D, - 0x9FB9: 0xFE7E, - 0x9FBA: 0xFE90, - 0x9FBB: 0xFEA0, - 0xE000: 0xAAA1, - 0xE001: 0xAAA2, - 0xE002: 0xAAA3, - 0xE003: 0xAAA4, - 0xE004: 0xAAA5, - 0xE005: 0xAAA6, - 0xE006: 0xAAA7, - 0xE007: 0xAAA8, - 0xE008: 0xAAA9, - 0xE009: 0xAAAA, - 0xE00A: 0xAAAB, - 0xE00B: 0xAAAC, - 0xE00C: 0xAAAD, - 0xE00D: 0xAAAE, - 0xE00E: 0xAAAF, - 0xE00F: 0xAAB0, - 0xE010: 0xAAB1, - 0xE011: 0xAAB2, - 0xE012: 0xAAB3, - 0xE013: 0xAAB4, - 0xE014: 0xAAB5, - 0xE015: 0xAAB6, - 0xE016: 0xAAB7, - 0xE017: 0xAAB8, - 0xE018: 0xAAB9, - 0xE019: 0xAABA, - 0xE01A: 0xAABB, - 0xE01B: 0xAABC, - 0xE01C: 0xAABD, - 0xE01D: 0xAABE, - 0xE01E: 0xAABF, - 0xE01F: 0xAAC0, - 0xE020: 0xAAC1, - 0xE021: 0xAAC2, - 0xE022: 0xAAC3, - 0xE023: 0xAAC4, - 0xE024: 0xAAC5, - 0xE025: 0xAAC6, - 0xE026: 0xAAC7, - 0xE027: 0xAAC8, - 0xE028: 0xAAC9, - 0xE029: 0xAACA, - 0xE02A: 0xAACB, - 0xE02B: 0xAACC, - 0xE02C: 0xAACD, - 0xE02D: 0xAACE, - 0xE02E: 0xAACF, - 0xE02F: 0xAAD0, - 0xE030: 0xAAD1, - 0xE031: 0xAAD2, - 0xE032: 0xAAD3, - 0xE033: 0xAAD4, - 0xE034: 0xAAD5, - 0xE035: 0xAAD6, - 0xE036: 0xAAD7, - 0xE037: 0xAAD8, - 0xE038: 0xAAD9, - 0xE039: 0xAADA, - 0xE03A: 0xAADB, - 0xE03B: 0xAADC, - 0xE03C: 0xAADD, - 0xE03D: 0xAADE, - 0xE03E: 0xAADF, - 0xE03F: 0xAAE0, - 0xE040: 0xAAE1, - 0xE041: 0xAAE2, - 0xE042: 0xAAE3, - 0xE043: 0xAAE4, - 0xE044: 0xAAE5, - 0xE045: 0xAAE6, - 0xE046: 0xAAE7, - 0xE047: 0xAAE8, - 0xE048: 0xAAE9, - 0xE049: 0xAAEA, - 0xE04A: 0xAAEB, - 0xE04B: 0xAAEC, - 0xE04C: 0xAAED, - 0xE04D: 0xAAEE, - 0xE04E: 0xAAEF, - 0xE04F: 0xAAF0, - 0xE050: 0xAAF1, - 0xE051: 0xAAF2, - 0xE052: 0xAAF3, - 0xE053: 0xAAF4, - 0xE054: 0xAAF5, - 0xE055: 0xAAF6, - 0xE056: 0xAAF7, - 0xE057: 0xAAF8, - 0xE058: 0xAAF9, - 0xE059: 0xAAFA, - 0xE05A: 0xAAFB, - 0xE05B: 0xAAFC, - 0xE05C: 0xAAFD, - 0xE05D: 0xAAFE, - 0xE05E: 0xABA1, - 0xE05F: 0xABA2, - 0xE060: 0xABA3, - 0xE061: 0xABA4, - 0xE062: 0xABA5, - 0xE063: 0xABA6, - 0xE064: 0xABA7, - 0xE065: 0xABA8, - 0xE066: 0xABA9, - 0xE067: 0xABAA, - 0xE068: 0xABAB, - 0xE069: 0xABAC, - 0xE06A: 0xABAD, - 0xE06B: 0xABAE, - 0xE06C: 0xABAF, - 0xE06D: 0xABB0, - 0xE06E: 0xABB1, - 0xE06F: 0xABB2, - 0xE070: 0xABB3, - 0xE071: 0xABB4, - 0xE072: 0xABB5, - 0xE073: 0xABB6, - 0xE074: 0xABB7, - 0xE075: 0xABB8, - 0xE076: 0xABB9, - 0xE077: 0xABBA, - 0xE078: 0xABBB, - 0xE079: 0xABBC, - 0xE07A: 0xABBD, - 0xE07B: 0xABBE, - 0xE07C: 0xABBF, - 0xE07D: 0xABC0, - 0xE07E: 0xABC1, - 0xE07F: 0xABC2, - 0xE080: 0xABC3, - 0xE081: 0xABC4, - 0xE082: 0xABC5, - 0xE083: 0xABC6, - 0xE084: 0xABC7, - 0xE085: 0xABC8, - 0xE086: 0xABC9, - 0xE087: 0xABCA, - 0xE088: 0xABCB, - 0xE089: 0xABCC, - 0xE08A: 0xABCD, - 0xE08B: 0xABCE, - 0xE08C: 0xABCF, - 0xE08D: 0xABD0, - 0xE08E: 0xABD1, - 0xE08F: 0xABD2, - 0xE090: 0xABD3, - 0xE091: 0xABD4, - 0xE092: 0xABD5, - 0xE093: 0xABD6, - 0xE094: 0xABD7, - 0xE095: 0xABD8, - 0xE096: 0xABD9, - 0xE097: 0xABDA, - 0xE098: 0xABDB, - 0xE099: 0xABDC, - 0xE09A: 0xABDD, - 0xE09B: 0xABDE, - 0xE09C: 0xABDF, - 0xE09D: 0xABE0, - 0xE09E: 0xABE1, - 0xE09F: 0xABE2, - 0xE0A0: 0xABE3, - 0xE0A1: 0xABE4, - 0xE0A2: 0xABE5, - 0xE0A3: 0xABE6, - 0xE0A4: 0xABE7, - 0xE0A5: 0xABE8, - 0xE0A6: 0xABE9, - 0xE0A7: 0xABEA, - 0xE0A8: 0xABEB, - 0xE0A9: 0xABEC, - 0xE0AA: 0xABED, - 0xE0AB: 0xABEE, - 0xE0AC: 0xABEF, - 0xE0AD: 0xABF0, - 0xE0AE: 0xABF1, - 0xE0AF: 0xABF2, - 0xE0B0: 0xABF3, - 0xE0B1: 0xABF4, - 0xE0B2: 0xABF5, - 0xE0B3: 0xABF6, - 0xE0B4: 0xABF7, - 0xE0B5: 0xABF8, - 0xE0B6: 0xABF9, - 0xE0B7: 0xABFA, - 0xE0B8: 0xABFB, - 0xE0B9: 0xABFC, - 0xE0BA: 0xABFD, - 0xE0BB: 0xABFE, - 0xE0BC: 0xACA1, - 0xE0BD: 0xACA2, - 0xE0BE: 0xACA3, - 0xE0BF: 0xACA4, - 0xE0C0: 0xACA5, - 0xE0C1: 0xACA6, - 0xE0C2: 0xACA7, - 0xE0C3: 0xACA8, - 0xE0C4: 0xACA9, - 0xE0C5: 0xACAA, - 0xE0C6: 0xACAB, - 0xE0C7: 0xACAC, - 0xE0C8: 0xACAD, - 0xE0C9: 0xACAE, - 0xE0CA: 0xACAF, - 0xE0CB: 0xACB0, - 0xE0CC: 0xACB1, - 0xE0CD: 0xACB2, - 0xE0CE: 0xACB3, - 0xE0CF: 0xACB4, - 0xE0D0: 0xACB5, - 0xE0D1: 0xACB6, - 0xE0D2: 0xACB7, - 0xE0D3: 0xACB8, - 0xE0D4: 0xACB9, - 0xE0D5: 0xACBA, - 0xE0D6: 0xACBB, - 0xE0D7: 0xACBC, - 0xE0D8: 0xACBD, - 0xE0D9: 0xACBE, - 0xE0DA: 0xACBF, - 0xE0DB: 0xACC0, - 0xE0DC: 0xACC1, - 0xE0DD: 0xACC2, - 0xE0DE: 0xACC3, - 0xE0DF: 0xACC4, - 0xE0E0: 0xACC5, - 0xE0E1: 0xACC6, - 0xE0E2: 0xACC7, - 0xE0E3: 0xACC8, - 0xE0E4: 0xACC9, - 0xE0E5: 0xACCA, - 0xE0E6: 0xACCB, - 0xE0E7: 0xACCC, - 0xE0E8: 0xACCD, - 0xE0E9: 0xACCE, - 0xE0EA: 0xACCF, - 0xE0EB: 0xACD0, - 0xE0EC: 0xACD1, - 0xE0ED: 0xACD2, - 0xE0EE: 0xACD3, - 0xE0EF: 0xACD4, - 0xE0F0: 0xACD5, - 0xE0F1: 0xACD6, - 0xE0F2: 0xACD7, - 0xE0F3: 0xACD8, - 0xE0F4: 0xACD9, - 0xE0F5: 0xACDA, - 0xE0F6: 0xACDB, - 0xE0F7: 0xACDC, - 0xE0F8: 0xACDD, - 0xE0F9: 0xACDE, - 0xE0FA: 0xACDF, - 0xE0FB: 0xACE0, - 0xE0FC: 0xACE1, - 0xE0FD: 0xACE2, - 0xE0FE: 0xACE3, - 0xE0FF: 0xACE4, - 0xE100: 0xACE5, - 0xE101: 0xACE6, - 0xE102: 0xACE7, - 0xE103: 0xACE8, - 0xE104: 0xACE9, - 0xE105: 0xACEA, - 0xE106: 0xACEB, - 0xE107: 0xACEC, - 0xE108: 0xACED, - 0xE109: 0xACEE, - 0xE10A: 0xACEF, - 0xE10B: 0xACF0, - 0xE10C: 0xACF1, - 0xE10D: 0xACF2, - 0xE10E: 0xACF3, - 0xE10F: 0xACF4, - 0xE110: 0xACF5, - 0xE111: 0xACF6, - 0xE112: 0xACF7, - 0xE113: 0xACF8, - 0xE114: 0xACF9, - 0xE115: 0xACFA, - 0xE116: 0xACFB, - 0xE117: 0xACFC, - 0xE118: 0xACFD, - 0xE119: 0xACFE, - 0xE11A: 0xADA1, - 0xE11B: 0xADA2, - 0xE11C: 0xADA3, - 0xE11D: 0xADA4, - 0xE11E: 0xADA5, - 0xE11F: 0xADA6, - 0xE120: 0xADA7, - 0xE121: 0xADA8, - 0xE122: 0xADA9, - 0xE123: 0xADAA, - 0xE124: 0xADAB, - 0xE125: 0xADAC, - 0xE126: 0xADAD, - 0xE127: 0xADAE, - 0xE128: 0xADAF, - 0xE129: 0xADB0, - 0xE12A: 0xADB1, - 0xE12B: 0xADB2, - 0xE12C: 0xADB3, - 0xE12D: 0xADB4, - 0xE12E: 0xADB5, - 0xE12F: 0xADB6, - 0xE130: 0xADB7, - 0xE131: 0xADB8, - 0xE132: 0xADB9, - 0xE133: 0xADBA, - 0xE134: 0xADBB, - 0xE135: 0xADBC, - 0xE136: 0xADBD, - 0xE137: 0xADBE, - 0xE138: 0xADBF, - 0xE139: 0xADC0, - 0xE13A: 0xADC1, - 0xE13B: 0xADC2, - 0xE13C: 0xADC3, - 0xE13D: 0xADC4, - 0xE13E: 0xADC5, - 0xE13F: 0xADC6, - 0xE140: 0xADC7, - 0xE141: 0xADC8, - 0xE142: 0xADC9, - 0xE143: 0xADCA, - 0xE144: 0xADCB, - 0xE145: 0xADCC, - 0xE146: 0xADCD, - 0xE147: 0xADCE, - 0xE148: 0xADCF, - 0xE149: 0xADD0, - 0xE14A: 0xADD1, - 0xE14B: 0xADD2, - 0xE14C: 0xADD3, - 0xE14D: 0xADD4, - 0xE14E: 0xADD5, - 0xE14F: 0xADD6, - 0xE150: 0xADD7, - 0xE151: 0xADD8, - 0xE152: 0xADD9, - 0xE153: 0xADDA, - 0xE154: 0xADDB, - 0xE155: 0xADDC, - 0xE156: 0xADDD, - 0xE157: 0xADDE, - 0xE158: 0xADDF, - 0xE159: 0xADE0, - 0xE15A: 0xADE1, - 0xE15B: 0xADE2, - 0xE15C: 0xADE3, - 0xE15D: 0xADE4, - 0xE15E: 0xADE5, - 0xE15F: 0xADE6, - 0xE160: 0xADE7, - 0xE161: 0xADE8, - 0xE162: 0xADE9, - 0xE163: 0xADEA, - 0xE164: 0xADEB, - 0xE165: 0xADEC, - 0xE166: 0xADED, - 0xE167: 0xADEE, - 0xE168: 0xADEF, - 0xE169: 0xADF0, - 0xE16A: 0xADF1, - 0xE16B: 0xADF2, - 0xE16C: 0xADF3, - 0xE16D: 0xADF4, - 0xE16E: 0xADF5, - 0xE16F: 0xADF6, - 0xE170: 0xADF7, - 0xE171: 0xADF8, - 0xE172: 0xADF9, - 0xE173: 0xADFA, - 0xE174: 0xADFB, - 0xE175: 0xADFC, - 0xE176: 0xADFD, - 0xE177: 0xADFE, - 0xE178: 0xAEA1, - 0xE179: 0xAEA2, - 0xE17A: 0xAEA3, - 0xE17B: 0xAEA4, - 0xE17C: 0xAEA5, - 0xE17D: 0xAEA6, - 0xE17E: 0xAEA7, - 0xE17F: 0xAEA8, - 0xE180: 0xAEA9, - 0xE181: 0xAEAA, - 0xE182: 0xAEAB, - 0xE183: 0xAEAC, - 0xE184: 0xAEAD, - 0xE185: 0xAEAE, - 0xE186: 0xAEAF, - 0xE187: 0xAEB0, - 0xE188: 0xAEB1, - 0xE189: 0xAEB2, - 0xE18A: 0xAEB3, - 0xE18B: 0xAEB4, - 0xE18C: 0xAEB5, - 0xE18D: 0xAEB6, - 0xE18E: 0xAEB7, - 0xE18F: 0xAEB8, - 0xE190: 0xAEB9, - 0xE191: 0xAEBA, - 0xE192: 0xAEBB, - 0xE193: 0xAEBC, - 0xE194: 0xAEBD, - 0xE195: 0xAEBE, - 0xE196: 0xAEBF, - 0xE197: 0xAEC0, - 0xE198: 0xAEC1, - 0xE199: 0xAEC2, - 0xE19A: 0xAEC3, - 0xE19B: 0xAEC4, - 0xE19C: 0xAEC5, - 0xE19D: 0xAEC6, - 0xE19E: 0xAEC7, - 0xE19F: 0xAEC8, - 0xE1A0: 0xAEC9, - 0xE1A1: 0xAECA, - 0xE1A2: 0xAECB, - 0xE1A3: 0xAECC, - 0xE1A4: 0xAECD, - 0xE1A5: 0xAECE, - 0xE1A6: 0xAECF, - 0xE1A7: 0xAED0, - 0xE1A8: 0xAED1, - 0xE1A9: 0xAED2, - 0xE1AA: 0xAED3, - 0xE1AB: 0xAED4, - 0xE1AC: 0xAED5, - 0xE1AD: 0xAED6, - 0xE1AE: 0xAED7, - 0xE1AF: 0xAED8, - 0xE1B0: 0xAED9, - 0xE1B1: 0xAEDA, - 0xE1B2: 0xAEDB, - 0xE1B3: 0xAEDC, - 0xE1B4: 0xAEDD, - 0xE1B5: 0xAEDE, - 0xE1B6: 0xAEDF, - 0xE1B7: 0xAEE0, - 0xE1B8: 0xAEE1, - 0xE1B9: 0xAEE2, - 0xE1BA: 0xAEE3, - 0xE1BB: 0xAEE4, - 0xE1BC: 0xAEE5, - 0xE1BD: 0xAEE6, - 0xE1BE: 0xAEE7, - 0xE1BF: 0xAEE8, - 0xE1C0: 0xAEE9, - 0xE1C1: 0xAEEA, - 0xE1C2: 0xAEEB, - 0xE1C3: 0xAEEC, - 0xE1C4: 0xAEED, - 0xE1C5: 0xAEEE, - 0xE1C6: 0xAEEF, - 0xE1C7: 0xAEF0, - 0xE1C8: 0xAEF1, - 0xE1C9: 0xAEF2, - 0xE1CA: 0xAEF3, - 0xE1CB: 0xAEF4, - 0xE1CC: 0xAEF5, - 0xE1CD: 0xAEF6, - 0xE1CE: 0xAEF7, - 0xE1CF: 0xAEF8, - 0xE1D0: 0xAEF9, - 0xE1D1: 0xAEFA, - 0xE1D2: 0xAEFB, - 0xE1D3: 0xAEFC, - 0xE1D4: 0xAEFD, - 0xE1D5: 0xAEFE, - 0xE1D6: 0xAFA1, - 0xE1D7: 0xAFA2, - 0xE1D8: 0xAFA3, - 0xE1D9: 0xAFA4, - 0xE1DA: 0xAFA5, - 0xE1DB: 0xAFA6, - 0xE1DC: 0xAFA7, - 0xE1DD: 0xAFA8, - 0xE1DE: 0xAFA9, - 0xE1DF: 0xAFAA, - 0xE1E0: 0xAFAB, - 0xE1E1: 0xAFAC, - 0xE1E2: 0xAFAD, - 0xE1E3: 0xAFAE, - 0xE1E4: 0xAFAF, - 0xE1E5: 0xAFB0, - 0xE1E6: 0xAFB1, - 0xE1E7: 0xAFB2, - 0xE1E8: 0xAFB3, - 0xE1E9: 0xAFB4, - 0xE1EA: 0xAFB5, - 0xE1EB: 0xAFB6, - 0xE1EC: 0xAFB7, - 0xE1ED: 0xAFB8, - 0xE1EE: 0xAFB9, - 0xE1EF: 0xAFBA, - 0xE1F0: 0xAFBB, - 0xE1F1: 0xAFBC, - 0xE1F2: 0xAFBD, - 0xE1F3: 0xAFBE, - 0xE1F4: 0xAFBF, - 0xE1F5: 0xAFC0, - 0xE1F6: 0xAFC1, - 0xE1F7: 0xAFC2, - 0xE1F8: 0xAFC3, - 0xE1F9: 0xAFC4, - 0xE1FA: 0xAFC5, - 0xE1FB: 0xAFC6, - 0xE1FC: 0xAFC7, - 0xE1FD: 0xAFC8, - 0xE1FE: 0xAFC9, - 0xE1FF: 0xAFCA, - 0xE200: 0xAFCB, - 0xE201: 0xAFCC, - 0xE202: 0xAFCD, - 0xE203: 0xAFCE, - 0xE204: 0xAFCF, - 0xE205: 0xAFD0, - 0xE206: 0xAFD1, - 0xE207: 0xAFD2, - 0xE208: 0xAFD3, - 0xE209: 0xAFD4, - 0xE20A: 0xAFD5, - 0xE20B: 0xAFD6, - 0xE20C: 0xAFD7, - 0xE20D: 0xAFD8, - 0xE20E: 0xAFD9, - 0xE20F: 0xAFDA, - 0xE210: 0xAFDB, - 0xE211: 0xAFDC, - 0xE212: 0xAFDD, - 0xE213: 0xAFDE, - 0xE214: 0xAFDF, - 0xE215: 0xAFE0, - 0xE216: 0xAFE1, - 0xE217: 0xAFE2, - 0xE218: 0xAFE3, - 0xE219: 0xAFE4, - 0xE21A: 0xAFE5, - 0xE21B: 0xAFE6, - 0xE21C: 0xAFE7, - 0xE21D: 0xAFE8, - 0xE21E: 0xAFE9, - 0xE21F: 0xAFEA, - 0xE220: 0xAFEB, - 0xE221: 0xAFEC, - 0xE222: 0xAFED, - 0xE223: 0xAFEE, - 0xE224: 0xAFEF, - 0xE225: 0xAFF0, - 0xE226: 0xAFF1, - 0xE227: 0xAFF2, - 0xE228: 0xAFF3, - 0xE229: 0xAFF4, - 0xE22A: 0xAFF5, - 0xE22B: 0xAFF6, - 0xE22C: 0xAFF7, - 0xE22D: 0xAFF8, - 0xE22E: 0xAFF9, - 0xE22F: 0xAFFA, - 0xE230: 0xAFFB, - 0xE231: 0xAFFC, - 0xE232: 0xAFFD, - 0xE233: 0xAFFE, - 0xE234: 0xF8A1, - 0xE235: 0xF8A2, - 0xE236: 0xF8A3, - 0xE237: 0xF8A4, - 0xE238: 0xF8A5, - 0xE239: 0xF8A6, - 0xE23A: 0xF8A7, - 0xE23B: 0xF8A8, - 0xE23C: 0xF8A9, - 0xE23D: 0xF8AA, - 0xE23E: 0xF8AB, - 0xE23F: 0xF8AC, - 0xE240: 0xF8AD, - 0xE241: 0xF8AE, - 0xE242: 0xF8AF, - 0xE243: 0xF8B0, - 0xE244: 0xF8B1, - 0xE245: 0xF8B2, - 0xE246: 0xF8B3, - 0xE247: 0xF8B4, - 0xE248: 0xF8B5, - 0xE249: 0xF8B6, - 0xE24A: 0xF8B7, - 0xE24B: 0xF8B8, - 0xE24C: 0xF8B9, - 0xE24D: 0xF8BA, - 0xE24E: 0xF8BB, - 0xE24F: 0xF8BC, - 0xE250: 0xF8BD, - 0xE251: 0xF8BE, - 0xE252: 0xF8BF, - 0xE253: 0xF8C0, - 0xE254: 0xF8C1, - 0xE255: 0xF8C2, - 0xE256: 0xF8C3, - 0xE257: 0xF8C4, - 0xE258: 0xF8C5, - 0xE259: 0xF8C6, - 0xE25A: 0xF8C7, - 0xE25B: 0xF8C8, - 0xE25C: 0xF8C9, - 0xE25D: 0xF8CA, - 0xE25E: 0xF8CB, - 0xE25F: 0xF8CC, - 0xE260: 0xF8CD, - 0xE261: 0xF8CE, - 0xE262: 0xF8CF, - 0xE263: 0xF8D0, - 0xE264: 0xF8D1, - 0xE265: 0xF8D2, - 0xE266: 0xF8D3, - 0xE267: 0xF8D4, - 0xE268: 0xF8D5, - 0xE269: 0xF8D6, - 0xE26A: 0xF8D7, - 0xE26B: 0xF8D8, - 0xE26C: 0xF8D9, - 0xE26D: 0xF8DA, - 0xE26E: 0xF8DB, - 0xE26F: 0xF8DC, - 0xE270: 0xF8DD, - 0xE271: 0xF8DE, - 0xE272: 0xF8DF, - 0xE273: 0xF8E0, - 0xE274: 0xF8E1, - 0xE275: 0xF8E2, - 0xE276: 0xF8E3, - 0xE277: 0xF8E4, - 0xE278: 0xF8E5, - 0xE279: 0xF8E6, - 0xE27A: 0xF8E7, - 0xE27B: 0xF8E8, - 0xE27C: 0xF8E9, - 0xE27D: 0xF8EA, - 0xE27E: 0xF8EB, - 0xE27F: 0xF8EC, - 0xE280: 0xF8ED, - 0xE281: 0xF8EE, - 0xE282: 0xF8EF, - 0xE283: 0xF8F0, - 0xE284: 0xF8F1, - 0xE285: 0xF8F2, - 0xE286: 0xF8F3, - 0xE287: 0xF8F4, - 0xE288: 0xF8F5, - 0xE289: 0xF8F6, - 0xE28A: 0xF8F7, - 0xE28B: 0xF8F8, - 0xE28C: 0xF8F9, - 0xE28D: 0xF8FA, - 0xE28E: 0xF8FB, - 0xE28F: 0xF8FC, - 0xE290: 0xF8FD, - 0xE291: 0xF8FE, - 0xE292: 0xF9A1, - 0xE293: 0xF9A2, - 0xE294: 0xF9A3, - 0xE295: 0xF9A4, - 0xE296: 0xF9A5, - 0xE297: 0xF9A6, - 0xE298: 0xF9A7, - 0xE299: 0xF9A8, - 0xE29A: 0xF9A9, - 0xE29B: 0xF9AA, - 0xE29C: 0xF9AB, - 0xE29D: 0xF9AC, - 0xE29E: 0xF9AD, - 0xE29F: 0xF9AE, - 0xE2A0: 0xF9AF, - 0xE2A1: 0xF9B0, - 0xE2A2: 0xF9B1, - 0xE2A3: 0xF9B2, - 0xE2A4: 0xF9B3, - 0xE2A5: 0xF9B4, - 0xE2A6: 0xF9B5, - 0xE2A7: 0xF9B6, - 0xE2A8: 0xF9B7, - 0xE2A9: 0xF9B8, - 0xE2AA: 0xF9B9, - 0xE2AB: 0xF9BA, - 0xE2AC: 0xF9BB, - 0xE2AD: 0xF9BC, - 0xE2AE: 0xF9BD, - 0xE2AF: 0xF9BE, - 0xE2B0: 0xF9BF, - 0xE2B1: 0xF9C0, - 0xE2B2: 0xF9C1, - 0xE2B3: 0xF9C2, - 0xE2B4: 0xF9C3, - 0xE2B5: 0xF9C4, - 0xE2B6: 0xF9C5, - 0xE2B7: 0xF9C6, - 0xE2B8: 0xF9C7, - 0xE2B9: 0xF9C8, - 0xE2BA: 0xF9C9, - 0xE2BB: 0xF9CA, - 0xE2BC: 0xF9CB, - 0xE2BD: 0xF9CC, - 0xE2BE: 0xF9CD, - 0xE2BF: 0xF9CE, - 0xE2C0: 0xF9CF, - 0xE2C1: 0xF9D0, - 0xE2C2: 0xF9D1, - 0xE2C3: 0xF9D2, - 0xE2C4: 0xF9D3, - 0xE2C5: 0xF9D4, - 0xE2C6: 0xF9D5, - 0xE2C7: 0xF9D6, - 0xE2C8: 0xF9D7, - 0xE2C9: 0xF9D8, - 0xE2CA: 0xF9D9, - 0xE2CB: 0xF9DA, - 0xE2CC: 0xF9DB, - 0xE2CD: 0xF9DC, - 0xE2CE: 0xF9DD, - 0xE2CF: 0xF9DE, - 0xE2D0: 0xF9DF, - 0xE2D1: 0xF9E0, - 0xE2D2: 0xF9E1, - 0xE2D3: 0xF9E2, - 0xE2D4: 0xF9E3, - 0xE2D5: 0xF9E4, - 0xE2D6: 0xF9E5, - 0xE2D7: 0xF9E6, - 0xE2D8: 0xF9E7, - 0xE2D9: 0xF9E8, - 0xE2DA: 0xF9E9, - 0xE2DB: 0xF9EA, - 0xE2DC: 0xF9EB, - 0xE2DD: 0xF9EC, - 0xE2DE: 0xF9ED, - 0xE2DF: 0xF9EE, - 0xE2E0: 0xF9EF, - 0xE2E1: 0xF9F0, - 0xE2E2: 0xF9F1, - 0xE2E3: 0xF9F2, - 0xE2E4: 0xF9F3, - 0xE2E5: 0xF9F4, - 0xE2E6: 0xF9F5, - 0xE2E7: 0xF9F6, - 0xE2E8: 0xF9F7, - 0xE2E9: 0xF9F8, - 0xE2EA: 0xF9F9, - 0xE2EB: 0xF9FA, - 0xE2EC: 0xF9FB, - 0xE2ED: 0xF9FC, - 0xE2EE: 0xF9FD, - 0xE2EF: 0xF9FE, - 0xE2F0: 0xFAA1, - 0xE2F1: 0xFAA2, - 0xE2F2: 0xFAA3, - 0xE2F3: 0xFAA4, - 0xE2F4: 0xFAA5, - 0xE2F5: 0xFAA6, - 0xE2F6: 0xFAA7, - 0xE2F7: 0xFAA8, - 0xE2F8: 0xFAA9, - 0xE2F9: 0xFAAA, - 0xE2FA: 0xFAAB, - 0xE2FB: 0xFAAC, - 0xE2FC: 0xFAAD, - 0xE2FD: 0xFAAE, - 0xE2FE: 0xFAAF, - 0xE2FF: 0xFAB0, - 0xE300: 0xFAB1, - 0xE301: 0xFAB2, - 0xE302: 0xFAB3, - 0xE303: 0xFAB4, - 0xE304: 0xFAB5, - 0xE305: 0xFAB6, - 0xE306: 0xFAB7, - 0xE307: 0xFAB8, - 0xE308: 0xFAB9, - 0xE309: 0xFABA, - 0xE30A: 0xFABB, - 0xE30B: 0xFABC, - 0xE30C: 0xFABD, - 0xE30D: 0xFABE, - 0xE30E: 0xFABF, - 0xE30F: 0xFAC0, - 0xE310: 0xFAC1, - 0xE311: 0xFAC2, - 0xE312: 0xFAC3, - 0xE313: 0xFAC4, - 0xE314: 0xFAC5, - 0xE315: 0xFAC6, - 0xE316: 0xFAC7, - 0xE317: 0xFAC8, - 0xE318: 0xFAC9, - 0xE319: 0xFACA, - 0xE31A: 0xFACB, - 0xE31B: 0xFACC, - 0xE31C: 0xFACD, - 0xE31D: 0xFACE, - 0xE31E: 0xFACF, - 0xE31F: 0xFAD0, - 0xE320: 0xFAD1, - 0xE321: 0xFAD2, - 0xE322: 0xFAD3, - 0xE323: 0xFAD4, - 0xE324: 0xFAD5, - 0xE325: 0xFAD6, - 0xE326: 0xFAD7, - 0xE327: 0xFAD8, - 0xE328: 0xFAD9, - 0xE329: 0xFADA, - 0xE32A: 0xFADB, - 0xE32B: 0xFADC, - 0xE32C: 0xFADD, - 0xE32D: 0xFADE, - 0xE32E: 0xFADF, - 0xE32F: 0xFAE0, - 0xE330: 0xFAE1, - 0xE331: 0xFAE2, - 0xE332: 0xFAE3, - 0xE333: 0xFAE4, - 0xE334: 0xFAE5, - 0xE335: 0xFAE6, - 0xE336: 0xFAE7, - 0xE337: 0xFAE8, - 0xE338: 0xFAE9, - 0xE339: 0xFAEA, - 0xE33A: 0xFAEB, - 0xE33B: 0xFAEC, - 0xE33C: 0xFAED, - 0xE33D: 0xFAEE, - 0xE33E: 0xFAEF, - 0xE33F: 0xFAF0, - 0xE340: 0xFAF1, - 0xE341: 0xFAF2, - 0xE342: 0xFAF3, - 0xE343: 0xFAF4, - 0xE344: 0xFAF5, - 0xE345: 0xFAF6, - 0xE346: 0xFAF7, - 0xE347: 0xFAF8, - 0xE348: 0xFAF9, - 0xE349: 0xFAFA, - 0xE34A: 0xFAFB, - 0xE34B: 0xFAFC, - 0xE34C: 0xFAFD, - 0xE34D: 0xFAFE, - 0xE34E: 0xFBA1, - 0xE34F: 0xFBA2, - 0xE350: 0xFBA3, - 0xE351: 0xFBA4, - 0xE352: 0xFBA5, - 0xE353: 0xFBA6, - 0xE354: 0xFBA7, - 0xE355: 0xFBA8, - 0xE356: 0xFBA9, - 0xE357: 0xFBAA, - 0xE358: 0xFBAB, - 0xE359: 0xFBAC, - 0xE35A: 0xFBAD, - 0xE35B: 0xFBAE, - 0xE35C: 0xFBAF, - 0xE35D: 0xFBB0, - 0xE35E: 0xFBB1, - 0xE35F: 0xFBB2, - 0xE360: 0xFBB3, - 0xE361: 0xFBB4, - 0xE362: 0xFBB5, - 0xE363: 0xFBB6, - 0xE364: 0xFBB7, - 0xE365: 0xFBB8, - 0xE366: 0xFBB9, - 0xE367: 0xFBBA, - 0xE368: 0xFBBB, - 0xE369: 0xFBBC, - 0xE36A: 0xFBBD, - 0xE36B: 0xFBBE, - 0xE36C: 0xFBBF, - 0xE36D: 0xFBC0, - 0xE36E: 0xFBC1, - 0xE36F: 0xFBC2, - 0xE370: 0xFBC3, - 0xE371: 0xFBC4, - 0xE372: 0xFBC5, - 0xE373: 0xFBC6, - 0xE374: 0xFBC7, - 0xE375: 0xFBC8, - 0xE376: 0xFBC9, - 0xE377: 0xFBCA, - 0xE378: 0xFBCB, - 0xE379: 0xFBCC, - 0xE37A: 0xFBCD, - 0xE37B: 0xFBCE, - 0xE37C: 0xFBCF, - 0xE37D: 0xFBD0, - 0xE37E: 0xFBD1, - 0xE37F: 0xFBD2, - 0xE380: 0xFBD3, - 0xE381: 0xFBD4, - 0xE382: 0xFBD5, - 0xE383: 0xFBD6, - 0xE384: 0xFBD7, - 0xE385: 0xFBD8, - 0xE386: 0xFBD9, - 0xE387: 0xFBDA, - 0xE388: 0xFBDB, - 0xE389: 0xFBDC, - 0xE38A: 0xFBDD, - 0xE38B: 0xFBDE, - 0xE38C: 0xFBDF, - 0xE38D: 0xFBE0, - 0xE38E: 0xFBE1, - 0xE38F: 0xFBE2, - 0xE390: 0xFBE3, - 0xE391: 0xFBE4, - 0xE392: 0xFBE5, - 0xE393: 0xFBE6, - 0xE394: 0xFBE7, - 0xE395: 0xFBE8, - 0xE396: 0xFBE9, - 0xE397: 0xFBEA, - 0xE398: 0xFBEB, - 0xE399: 0xFBEC, - 0xE39A: 0xFBED, - 0xE39B: 0xFBEE, - 0xE39C: 0xFBEF, - 0xE39D: 0xFBF0, - 0xE39E: 0xFBF1, - 0xE39F: 0xFBF2, - 0xE3A0: 0xFBF3, - 0xE3A1: 0xFBF4, - 0xE3A2: 0xFBF5, - 0xE3A3: 0xFBF6, - 0xE3A4: 0xFBF7, - 0xE3A5: 0xFBF8, - 0xE3A6: 0xFBF9, - 0xE3A7: 0xFBFA, - 0xE3A8: 0xFBFB, - 0xE3A9: 0xFBFC, - 0xE3AA: 0xFBFD, - 0xE3AB: 0xFBFE, - 0xE3AC: 0xFCA1, - 0xE3AD: 0xFCA2, - 0xE3AE: 0xFCA3, - 0xE3AF: 0xFCA4, - 0xE3B0: 0xFCA5, - 0xE3B1: 0xFCA6, - 0xE3B2: 0xFCA7, - 0xE3B3: 0xFCA8, - 0xE3B4: 0xFCA9, - 0xE3B5: 0xFCAA, - 0xE3B6: 0xFCAB, - 0xE3B7: 0xFCAC, - 0xE3B8: 0xFCAD, - 0xE3B9: 0xFCAE, - 0xE3BA: 0xFCAF, - 0xE3BB: 0xFCB0, - 0xE3BC: 0xFCB1, - 0xE3BD: 0xFCB2, - 0xE3BE: 0xFCB3, - 0xE3BF: 0xFCB4, - 0xE3C0: 0xFCB5, - 0xE3C1: 0xFCB6, - 0xE3C2: 0xFCB7, - 0xE3C3: 0xFCB8, - 0xE3C4: 0xFCB9, - 0xE3C5: 0xFCBA, - 0xE3C6: 0xFCBB, - 0xE3C7: 0xFCBC, - 0xE3C8: 0xFCBD, - 0xE3C9: 0xFCBE, - 0xE3CA: 0xFCBF, - 0xE3CB: 0xFCC0, - 0xE3CC: 0xFCC1, - 0xE3CD: 0xFCC2, - 0xE3CE: 0xFCC3, - 0xE3CF: 0xFCC4, - 0xE3D0: 0xFCC5, - 0xE3D1: 0xFCC6, - 0xE3D2: 0xFCC7, - 0xE3D3: 0xFCC8, - 0xE3D4: 0xFCC9, - 0xE3D5: 0xFCCA, - 0xE3D6: 0xFCCB, - 0xE3D7: 0xFCCC, - 0xE3D8: 0xFCCD, - 0xE3D9: 0xFCCE, - 0xE3DA: 0xFCCF, - 0xE3DB: 0xFCD0, - 0xE3DC: 0xFCD1, - 0xE3DD: 0xFCD2, - 0xE3DE: 0xFCD3, - 0xE3DF: 0xFCD4, - 0xE3E0: 0xFCD5, - 0xE3E1: 0xFCD6, - 0xE3E2: 0xFCD7, - 0xE3E3: 0xFCD8, - 0xE3E4: 0xFCD9, - 0xE3E5: 0xFCDA, - 0xE3E6: 0xFCDB, - 0xE3E7: 0xFCDC, - 0xE3E8: 0xFCDD, - 0xE3E9: 0xFCDE, - 0xE3EA: 0xFCDF, - 0xE3EB: 0xFCE0, - 0xE3EC: 0xFCE1, - 0xE3ED: 0xFCE2, - 0xE3EE: 0xFCE3, - 0xE3EF: 0xFCE4, - 0xE3F0: 0xFCE5, - 0xE3F1: 0xFCE6, - 0xE3F2: 0xFCE7, - 0xE3F3: 0xFCE8, - 0xE3F4: 0xFCE9, - 0xE3F5: 0xFCEA, - 0xE3F6: 0xFCEB, - 0xE3F7: 0xFCEC, - 0xE3F8: 0xFCED, - 0xE3F9: 0xFCEE, - 0xE3FA: 0xFCEF, - 0xE3FB: 0xFCF0, - 0xE3FC: 0xFCF1, - 0xE3FD: 0xFCF2, - 0xE3FE: 0xFCF3, - 0xE3FF: 0xFCF4, - 0xE400: 0xFCF5, - 0xE401: 0xFCF6, - 0xE402: 0xFCF7, - 0xE403: 0xFCF8, - 0xE404: 0xFCF9, - 0xE405: 0xFCFA, - 0xE406: 0xFCFB, - 0xE407: 0xFCFC, - 0xE408: 0xFCFD, - 0xE409: 0xFCFE, - 0xE40A: 0xFDA1, - 0xE40B: 0xFDA2, - 0xE40C: 0xFDA3, - 0xE40D: 0xFDA4, - 0xE40E: 0xFDA5, - 0xE40F: 0xFDA6, - 0xE410: 0xFDA7, - 0xE411: 0xFDA8, - 0xE412: 0xFDA9, - 0xE413: 0xFDAA, - 0xE414: 0xFDAB, - 0xE415: 0xFDAC, - 0xE416: 0xFDAD, - 0xE417: 0xFDAE, - 0xE418: 0xFDAF, - 0xE419: 0xFDB0, - 0xE41A: 0xFDB1, - 0xE41B: 0xFDB2, - 0xE41C: 0xFDB3, - 0xE41D: 0xFDB4, - 0xE41E: 0xFDB5, - 0xE41F: 0xFDB6, - 0xE420: 0xFDB7, - 0xE421: 0xFDB8, - 0xE422: 0xFDB9, - 0xE423: 0xFDBA, - 0xE424: 0xFDBB, - 0xE425: 0xFDBC, - 0xE426: 0xFDBD, - 0xE427: 0xFDBE, - 0xE428: 0xFDBF, - 0xE429: 0xFDC0, - 0xE42A: 0xFDC1, - 0xE42B: 0xFDC2, - 0xE42C: 0xFDC3, - 0xE42D: 0xFDC4, - 0xE42E: 0xFDC5, - 0xE42F: 0xFDC6, - 0xE430: 0xFDC7, - 0xE431: 0xFDC8, - 0xE432: 0xFDC9, - 0xE433: 0xFDCA, - 0xE434: 0xFDCB, - 0xE435: 0xFDCC, - 0xE436: 0xFDCD, - 0xE437: 0xFDCE, - 0xE438: 0xFDCF, - 0xE439: 0xFDD0, - 0xE43A: 0xFDD1, - 0xE43B: 0xFDD2, - 0xE43C: 0xFDD3, - 0xE43D: 0xFDD4, - 0xE43E: 0xFDD5, - 0xE43F: 0xFDD6, - 0xE440: 0xFDD7, - 0xE441: 0xFDD8, - 0xE442: 0xFDD9, - 0xE443: 0xFDDA, - 0xE444: 0xFDDB, - 0xE445: 0xFDDC, - 0xE446: 0xFDDD, - 0xE447: 0xFDDE, - 0xE448: 0xFDDF, - 0xE449: 0xFDE0, - 0xE44A: 0xFDE1, - 0xE44B: 0xFDE2, - 0xE44C: 0xFDE3, - 0xE44D: 0xFDE4, - 0xE44E: 0xFDE5, - 0xE44F: 0xFDE6, - 0xE450: 0xFDE7, - 0xE451: 0xFDE8, - 0xE452: 0xFDE9, - 0xE453: 0xFDEA, - 0xE454: 0xFDEB, - 0xE455: 0xFDEC, - 0xE456: 0xFDED, - 0xE457: 0xFDEE, - 0xE458: 0xFDEF, - 0xE459: 0xFDF0, - 0xE45A: 0xFDF1, - 0xE45B: 0xFDF2, - 0xE45C: 0xFDF3, - 0xE45D: 0xFDF4, - 0xE45E: 0xFDF5, - 0xE45F: 0xFDF6, - 0xE460: 0xFDF7, - 0xE461: 0xFDF8, - 0xE462: 0xFDF9, - 0xE463: 0xFDFA, - 0xE464: 0xFDFB, - 0xE465: 0xFDFC, - 0xE466: 0xFDFD, - 0xE467: 0xFDFE, - 0xE468: 0xFEA1, - 0xE469: 0xFEA2, - 0xE46A: 0xFEA3, - 0xE46B: 0xFEA4, - 0xE46C: 0xFEA5, - 0xE46D: 0xFEA6, - 0xE46E: 0xFEA7, - 0xE46F: 0xFEA8, - 0xE470: 0xFEA9, - 0xE471: 0xFEAA, - 0xE472: 0xFEAB, - 0xE473: 0xFEAC, - 0xE474: 0xFEAD, - 0xE475: 0xFEAE, - 0xE476: 0xFEAF, - 0xE477: 0xFEB0, - 0xE478: 0xFEB1, - 0xE479: 0xFEB2, - 0xE47A: 0xFEB3, - 0xE47B: 0xFEB4, - 0xE47C: 0xFEB5, - 0xE47D: 0xFEB6, - 0xE47E: 0xFEB7, - 0xE47F: 0xFEB8, - 0xE480: 0xFEB9, - 0xE481: 0xFEBA, - 0xE482: 0xFEBB, - 0xE483: 0xFEBC, - 0xE484: 0xFEBD, - 0xE485: 0xFEBE, - 0xE486: 0xFEBF, - 0xE487: 0xFEC0, - 0xE488: 0xFEC1, - 0xE489: 0xFEC2, - 0xE48A: 0xFEC3, - 0xE48B: 0xFEC4, - 0xE48C: 0xFEC5, - 0xE48D: 0xFEC6, - 0xE48E: 0xFEC7, - 0xE48F: 0xFEC8, - 0xE490: 0xFEC9, - 0xE491: 0xFECA, - 0xE492: 0xFECB, - 0xE493: 0xFECC, - 0xE494: 0xFECD, - 0xE495: 0xFECE, - 0xE496: 0xFECF, - 0xE497: 0xFED0, - 0xE498: 0xFED1, - 0xE499: 0xFED2, - 0xE49A: 0xFED3, - 0xE49B: 0xFED4, - 0xE49C: 0xFED5, - 0xE49D: 0xFED6, - 0xE49E: 0xFED7, - 0xE49F: 0xFED8, - 0xE4A0: 0xFED9, - 0xE4A1: 0xFEDA, - 0xE4A2: 0xFEDB, - 0xE4A3: 0xFEDC, - 0xE4A4: 0xFEDD, - 0xE4A5: 0xFEDE, - 0xE4A6: 0xFEDF, - 0xE4A7: 0xFEE0, - 0xE4A8: 0xFEE1, - 0xE4A9: 0xFEE2, - 0xE4AA: 0xFEE3, - 0xE4AB: 0xFEE4, - 0xE4AC: 0xFEE5, - 0xE4AD: 0xFEE6, - 0xE4AE: 0xFEE7, - 0xE4AF: 0xFEE8, - 0xE4B0: 0xFEE9, - 0xE4B1: 0xFEEA, - 0xE4B2: 0xFEEB, - 0xE4B3: 0xFEEC, - 0xE4B4: 0xFEED, - 0xE4B5: 0xFEEE, - 0xE4B6: 0xFEEF, - 0xE4B7: 0xFEF0, - 0xE4B8: 0xFEF1, - 0xE4B9: 0xFEF2, - 0xE4BA: 0xFEF3, - 0xE4BB: 0xFEF4, - 0xE4BC: 0xFEF5, - 0xE4BD: 0xFEF6, - 0xE4BE: 0xFEF7, - 0xE4BF: 0xFEF8, - 0xE4C0: 0xFEF9, - 0xE4C1: 0xFEFA, - 0xE4C2: 0xFEFB, - 0xE4C3: 0xFEFC, - 0xE4C4: 0xFEFD, - 0xE4C5: 0xFEFE, - 0xE4C6: 0xA140, - 0xE4C7: 0xA141, - 0xE4C8: 0xA142, - 0xE4C9: 0xA143, - 0xE4CA: 0xA144, - 0xE4CB: 0xA145, - 0xE4CC: 0xA146, - 0xE4CD: 0xA147, - 0xE4CE: 0xA148, - 0xE4CF: 0xA149, - 0xE4D0: 0xA14A, - 0xE4D1: 0xA14B, - 0xE4D2: 0xA14C, - 0xE4D3: 0xA14D, - 0xE4D4: 0xA14E, - 0xE4D5: 0xA14F, - 0xE4D6: 0xA150, - 0xE4D7: 0xA151, - 0xE4D8: 0xA152, - 0xE4D9: 0xA153, - 0xE4DA: 0xA154, - 0xE4DB: 0xA155, - 0xE4DC: 0xA156, - 0xE4DD: 0xA157, - 0xE4DE: 0xA158, - 0xE4DF: 0xA159, - 0xE4E0: 0xA15A, - 0xE4E1: 0xA15B, - 0xE4E2: 0xA15C, - 0xE4E3: 0xA15D, - 0xE4E4: 0xA15E, - 0xE4E5: 0xA15F, - 0xE4E6: 0xA160, - 0xE4E7: 0xA161, - 0xE4E8: 0xA162, - 0xE4E9: 0xA163, - 0xE4EA: 0xA164, - 0xE4EB: 0xA165, - 0xE4EC: 0xA166, - 0xE4ED: 0xA167, - 0xE4EE: 0xA168, - 0xE4EF: 0xA169, - 0xE4F0: 0xA16A, - 0xE4F1: 0xA16B, - 0xE4F2: 0xA16C, - 0xE4F3: 0xA16D, - 0xE4F4: 0xA16E, - 0xE4F5: 0xA16F, - 0xE4F6: 0xA170, - 0xE4F7: 0xA171, - 0xE4F8: 0xA172, - 0xE4F9: 0xA173, - 0xE4FA: 0xA174, - 0xE4FB: 0xA175, - 0xE4FC: 0xA176, - 0xE4FD: 0xA177, - 0xE4FE: 0xA178, - 0xE4FF: 0xA179, - 0xE500: 0xA17A, - 0xE501: 0xA17B, - 0xE502: 0xA17C, - 0xE503: 0xA17D, - 0xE504: 0xA17E, - 0xE505: 0xA180, - 0xE506: 0xA181, - 0xE507: 0xA182, - 0xE508: 0xA183, - 0xE509: 0xA184, - 0xE50A: 0xA185, - 0xE50B: 0xA186, - 0xE50C: 0xA187, - 0xE50D: 0xA188, - 0xE50E: 0xA189, - 0xE50F: 0xA18A, - 0xE510: 0xA18B, - 0xE511: 0xA18C, - 0xE512: 0xA18D, - 0xE513: 0xA18E, - 0xE514: 0xA18F, - 0xE515: 0xA190, - 0xE516: 0xA191, - 0xE517: 0xA192, - 0xE518: 0xA193, - 0xE519: 0xA194, - 0xE51A: 0xA195, - 0xE51B: 0xA196, - 0xE51C: 0xA197, - 0xE51D: 0xA198, - 0xE51E: 0xA199, - 0xE51F: 0xA19A, - 0xE520: 0xA19B, - 0xE521: 0xA19C, - 0xE522: 0xA19D, - 0xE523: 0xA19E, - 0xE524: 0xA19F, - 0xE525: 0xA1A0, - 0xE526: 0xA240, - 0xE527: 0xA241, - 0xE528: 0xA242, - 0xE529: 0xA243, - 0xE52A: 0xA244, - 0xE52B: 0xA245, - 0xE52C: 0xA246, - 0xE52D: 0xA247, - 0xE52E: 0xA248, - 0xE52F: 0xA249, - 0xE530: 0xA24A, - 0xE531: 0xA24B, - 0xE532: 0xA24C, - 0xE533: 0xA24D, - 0xE534: 0xA24E, - 0xE535: 0xA24F, - 0xE536: 0xA250, - 0xE537: 0xA251, - 0xE538: 0xA252, - 0xE539: 0xA253, - 0xE53A: 0xA254, - 0xE53B: 0xA255, - 0xE53C: 0xA256, - 0xE53D: 0xA257, - 0xE53E: 0xA258, - 0xE53F: 0xA259, - 0xE540: 0xA25A, - 0xE541: 0xA25B, - 0xE542: 0xA25C, - 0xE543: 0xA25D, - 0xE544: 0xA25E, - 0xE545: 0xA25F, - 0xE546: 0xA260, - 0xE547: 0xA261, - 0xE548: 0xA262, - 0xE549: 0xA263, - 0xE54A: 0xA264, - 0xE54B: 0xA265, - 0xE54C: 0xA266, - 0xE54D: 0xA267, - 0xE54E: 0xA268, - 0xE54F: 0xA269, - 0xE550: 0xA26A, - 0xE551: 0xA26B, - 0xE552: 0xA26C, - 0xE553: 0xA26D, - 0xE554: 0xA26E, - 0xE555: 0xA26F, - 0xE556: 0xA270, - 0xE557: 0xA271, - 0xE558: 0xA272, - 0xE559: 0xA273, - 0xE55A: 0xA274, - 0xE55B: 0xA275, - 0xE55C: 0xA276, - 0xE55D: 0xA277, - 0xE55E: 0xA278, - 0xE55F: 0xA279, - 0xE560: 0xA27A, - 0xE561: 0xA27B, - 0xE562: 0xA27C, - 0xE563: 0xA27D, - 0xE564: 0xA27E, - 0xE565: 0xA280, - 0xE566: 0xA281, - 0xE567: 0xA282, - 0xE568: 0xA283, - 0xE569: 0xA284, - 0xE56A: 0xA285, - 0xE56B: 0xA286, - 0xE56C: 0xA287, - 0xE56D: 0xA288, - 0xE56E: 0xA289, - 0xE56F: 0xA28A, - 0xE570: 0xA28B, - 0xE571: 0xA28C, - 0xE572: 0xA28D, - 0xE573: 0xA28E, - 0xE574: 0xA28F, - 0xE575: 0xA290, - 0xE576: 0xA291, - 0xE577: 0xA292, - 0xE578: 0xA293, - 0xE579: 0xA294, - 0xE57A: 0xA295, - 0xE57B: 0xA296, - 0xE57C: 0xA297, - 0xE57D: 0xA298, - 0xE57E: 0xA299, - 0xE57F: 0xA29A, - 0xE580: 0xA29B, - 0xE581: 0xA29C, - 0xE582: 0xA29D, - 0xE583: 0xA29E, - 0xE584: 0xA29F, - 0xE585: 0xA2A0, - 0xE586: 0xA340, - 0xE587: 0xA341, - 0xE588: 0xA342, - 0xE589: 0xA343, - 0xE58A: 0xA344, - 0xE58B: 0xA345, - 0xE58C: 0xA346, - 0xE58D: 0xA347, - 0xE58E: 0xA348, - 0xE58F: 0xA349, - 0xE590: 0xA34A, - 0xE591: 0xA34B, - 0xE592: 0xA34C, - 0xE593: 0xA34D, - 0xE594: 0xA34E, - 0xE595: 0xA34F, - 0xE596: 0xA350, - 0xE597: 0xA351, - 0xE598: 0xA352, - 0xE599: 0xA353, - 0xE59A: 0xA354, - 0xE59B: 0xA355, - 0xE59C: 0xA356, - 0xE59D: 0xA357, - 0xE59E: 0xA358, - 0xE59F: 0xA359, - 0xE5A0: 0xA35A, - 0xE5A1: 0xA35B, - 0xE5A2: 0xA35C, - 0xE5A3: 0xA35D, - 0xE5A4: 0xA35E, - 0xE5A5: 0xA35F, - 0xE5A6: 0xA360, - 0xE5A7: 0xA361, - 0xE5A8: 0xA362, - 0xE5A9: 0xA363, - 0xE5AA: 0xA364, - 0xE5AB: 0xA365, - 0xE5AC: 0xA366, - 0xE5AD: 0xA367, - 0xE5AE: 0xA368, - 0xE5AF: 0xA369, - 0xE5B0: 0xA36A, - 0xE5B1: 0xA36B, - 0xE5B2: 0xA36C, - 0xE5B3: 0xA36D, - 0xE5B4: 0xA36E, - 0xE5B5: 0xA36F, - 0xE5B6: 0xA370, - 0xE5B7: 0xA371, - 0xE5B8: 0xA372, - 0xE5B9: 0xA373, - 0xE5BA: 0xA374, - 0xE5BB: 0xA375, - 0xE5BC: 0xA376, - 0xE5BD: 0xA377, - 0xE5BE: 0xA378, - 0xE5BF: 0xA379, - 0xE5C0: 0xA37A, - 0xE5C1: 0xA37B, - 0xE5C2: 0xA37C, - 0xE5C3: 0xA37D, - 0xE5C4: 0xA37E, - 0xE5C5: 0xA380, - 0xE5C6: 0xA381, - 0xE5C7: 0xA382, - 0xE5C8: 0xA383, - 0xE5C9: 0xA384, - 0xE5CA: 0xA385, - 0xE5CB: 0xA386, - 0xE5CC: 0xA387, - 0xE5CD: 0xA388, - 0xE5CE: 0xA389, - 0xE5CF: 0xA38A, - 0xE5D0: 0xA38B, - 0xE5D1: 0xA38C, - 0xE5D2: 0xA38D, - 0xE5D3: 0xA38E, - 0xE5D4: 0xA38F, - 0xE5D5: 0xA390, - 0xE5D6: 0xA391, - 0xE5D7: 0xA392, - 0xE5D8: 0xA393, - 0xE5D9: 0xA394, - 0xE5DA: 0xA395, - 0xE5DB: 0xA396, - 0xE5DC: 0xA397, - 0xE5DD: 0xA398, - 0xE5DE: 0xA399, - 0xE5DF: 0xA39A, - 0xE5E0: 0xA39B, - 0xE5E1: 0xA39C, - 0xE5E2: 0xA39D, - 0xE5E3: 0xA39E, - 0xE5E4: 0xA39F, - 0xE5E5: 0xA3A0, - 0xE5E6: 0xA440, - 0xE5E7: 0xA441, - 0xE5E8: 0xA442, - 0xE5E9: 0xA443, - 0xE5EA: 0xA444, - 0xE5EB: 0xA445, - 0xE5EC: 0xA446, - 0xE5ED: 0xA447, - 0xE5EE: 0xA448, - 0xE5EF: 0xA449, - 0xE5F0: 0xA44A, - 0xE5F1: 0xA44B, - 0xE5F2: 0xA44C, - 0xE5F3: 0xA44D, - 0xE5F4: 0xA44E, - 0xE5F5: 0xA44F, - 0xE5F6: 0xA450, - 0xE5F7: 0xA451, - 0xE5F8: 0xA452, - 0xE5F9: 0xA453, - 0xE5FA: 0xA454, - 0xE5FB: 0xA455, - 0xE5FC: 0xA456, - 0xE5FD: 0xA457, - 0xE5FE: 0xA458, - 0xE5FF: 0xA459, - 0xE600: 0xA45A, - 0xE601: 0xA45B, - 0xE602: 0xA45C, - 0xE603: 0xA45D, - 0xE604: 0xA45E, - 0xE605: 0xA45F, - 0xE606: 0xA460, - 0xE607: 0xA461, - 0xE608: 0xA462, - 0xE609: 0xA463, - 0xE60A: 0xA464, - 0xE60B: 0xA465, - 0xE60C: 0xA466, - 0xE60D: 0xA467, - 0xE60E: 0xA468, - 0xE60F: 0xA469, - 0xE610: 0xA46A, - 0xE611: 0xA46B, - 0xE612: 0xA46C, - 0xE613: 0xA46D, - 0xE614: 0xA46E, - 0xE615: 0xA46F, - 0xE616: 0xA470, - 0xE617: 0xA471, - 0xE618: 0xA472, - 0xE619: 0xA473, - 0xE61A: 0xA474, - 0xE61B: 0xA475, - 0xE61C: 0xA476, - 0xE61D: 0xA477, - 0xE61E: 0xA478, - 0xE61F: 0xA479, - 0xE620: 0xA47A, - 0xE621: 0xA47B, - 0xE622: 0xA47C, - 0xE623: 0xA47D, - 0xE624: 0xA47E, - 0xE625: 0xA480, - 0xE626: 0xA481, - 0xE627: 0xA482, - 0xE628: 0xA483, - 0xE629: 0xA484, - 0xE62A: 0xA485, - 0xE62B: 0xA486, - 0xE62C: 0xA487, - 0xE62D: 0xA488, - 0xE62E: 0xA489, - 0xE62F: 0xA48A, - 0xE630: 0xA48B, - 0xE631: 0xA48C, - 0xE632: 0xA48D, - 0xE633: 0xA48E, - 0xE634: 0xA48F, - 0xE635: 0xA490, - 0xE636: 0xA491, - 0xE637: 0xA492, - 0xE638: 0xA493, - 0xE639: 0xA494, - 0xE63A: 0xA495, - 0xE63B: 0xA496, - 0xE63C: 0xA497, - 0xE63D: 0xA498, - 0xE63E: 0xA499, - 0xE63F: 0xA49A, - 0xE640: 0xA49B, - 0xE641: 0xA49C, - 0xE642: 0xA49D, - 0xE643: 0xA49E, - 0xE644: 0xA49F, - 0xE645: 0xA4A0, - 0xE646: 0xA540, - 0xE647: 0xA541, - 0xE648: 0xA542, - 0xE649: 0xA543, - 0xE64A: 0xA544, - 0xE64B: 0xA545, - 0xE64C: 0xA546, - 0xE64D: 0xA547, - 0xE64E: 0xA548, - 0xE64F: 0xA549, - 0xE650: 0xA54A, - 0xE651: 0xA54B, - 0xE652: 0xA54C, - 0xE653: 0xA54D, - 0xE654: 0xA54E, - 0xE655: 0xA54F, - 0xE656: 0xA550, - 0xE657: 0xA551, - 0xE658: 0xA552, - 0xE659: 0xA553, - 0xE65A: 0xA554, - 0xE65B: 0xA555, - 0xE65C: 0xA556, - 0xE65D: 0xA557, - 0xE65E: 0xA558, - 0xE65F: 0xA559, - 0xE660: 0xA55A, - 0xE661: 0xA55B, - 0xE662: 0xA55C, - 0xE663: 0xA55D, - 0xE664: 0xA55E, - 0xE665: 0xA55F, - 0xE666: 0xA560, - 0xE667: 0xA561, - 0xE668: 0xA562, - 0xE669: 0xA563, - 0xE66A: 0xA564, - 0xE66B: 0xA565, - 0xE66C: 0xA566, - 0xE66D: 0xA567, - 0xE66E: 0xA568, - 0xE66F: 0xA569, - 0xE670: 0xA56A, - 0xE671: 0xA56B, - 0xE672: 0xA56C, - 0xE673: 0xA56D, - 0xE674: 0xA56E, - 0xE675: 0xA56F, - 0xE676: 0xA570, - 0xE677: 0xA571, - 0xE678: 0xA572, - 0xE679: 0xA573, - 0xE67A: 0xA574, - 0xE67B: 0xA575, - 0xE67C: 0xA576, - 0xE67D: 0xA577, - 0xE67E: 0xA578, - 0xE67F: 0xA579, - 0xE680: 0xA57A, - 0xE681: 0xA57B, - 0xE682: 0xA57C, - 0xE683: 0xA57D, - 0xE684: 0xA57E, - 0xE685: 0xA580, - 0xE686: 0xA581, - 0xE687: 0xA582, - 0xE688: 0xA583, - 0xE689: 0xA584, - 0xE68A: 0xA585, - 0xE68B: 0xA586, - 0xE68C: 0xA587, - 0xE68D: 0xA588, - 0xE68E: 0xA589, - 0xE68F: 0xA58A, - 0xE690: 0xA58B, - 0xE691: 0xA58C, - 0xE692: 0xA58D, - 0xE693: 0xA58E, - 0xE694: 0xA58F, - 0xE695: 0xA590, - 0xE696: 0xA591, - 0xE697: 0xA592, - 0xE698: 0xA593, - 0xE699: 0xA594, - 0xE69A: 0xA595, - 0xE69B: 0xA596, - 0xE69C: 0xA597, - 0xE69D: 0xA598, - 0xE69E: 0xA599, - 0xE69F: 0xA59A, - 0xE6A0: 0xA59B, - 0xE6A1: 0xA59C, - 0xE6A2: 0xA59D, - 0xE6A3: 0xA59E, - 0xE6A4: 0xA59F, - 0xE6A5: 0xA5A0, - 0xE6A6: 0xA640, - 0xE6A7: 0xA641, - 0xE6A8: 0xA642, - 0xE6A9: 0xA643, - 0xE6AA: 0xA644, - 0xE6AB: 0xA645, - 0xE6AC: 0xA646, - 0xE6AD: 0xA647, - 0xE6AE: 0xA648, - 0xE6AF: 0xA649, - 0xE6B0: 0xA64A, - 0xE6B1: 0xA64B, - 0xE6B2: 0xA64C, - 0xE6B3: 0xA64D, - 0xE6B4: 0xA64E, - 0xE6B5: 0xA64F, - 0xE6B6: 0xA650, - 0xE6B7: 0xA651, - 0xE6B8: 0xA652, - 0xE6B9: 0xA653, - 0xE6BA: 0xA654, - 0xE6BB: 0xA655, - 0xE6BC: 0xA656, - 0xE6BD: 0xA657, - 0xE6BE: 0xA658, - 0xE6BF: 0xA659, - 0xE6C0: 0xA65A, - 0xE6C1: 0xA65B, - 0xE6C2: 0xA65C, - 0xE6C3: 0xA65D, - 0xE6C4: 0xA65E, - 0xE6C5: 0xA65F, - 0xE6C6: 0xA660, - 0xE6C7: 0xA661, - 0xE6C8: 0xA662, - 0xE6C9: 0xA663, - 0xE6CA: 0xA664, - 0xE6CB: 0xA665, - 0xE6CC: 0xA666, - 0xE6CD: 0xA667, - 0xE6CE: 0xA668, - 0xE6CF: 0xA669, - 0xE6D0: 0xA66A, - 0xE6D1: 0xA66B, - 0xE6D2: 0xA66C, - 0xE6D3: 0xA66D, - 0xE6D4: 0xA66E, - 0xE6D5: 0xA66F, - 0xE6D6: 0xA670, - 0xE6D7: 0xA671, - 0xE6D8: 0xA672, - 0xE6D9: 0xA673, - 0xE6DA: 0xA674, - 0xE6DB: 0xA675, - 0xE6DC: 0xA676, - 0xE6DD: 0xA677, - 0xE6DE: 0xA678, - 0xE6DF: 0xA679, - 0xE6E0: 0xA67A, - 0xE6E1: 0xA67B, - 0xE6E2: 0xA67C, - 0xE6E3: 0xA67D, - 0xE6E4: 0xA67E, - 0xE6E5: 0xA680, - 0xE6E6: 0xA681, - 0xE6E7: 0xA682, - 0xE6E8: 0xA683, - 0xE6E9: 0xA684, - 0xE6EA: 0xA685, - 0xE6EB: 0xA686, - 0xE6EC: 0xA687, - 0xE6ED: 0xA688, - 0xE6EE: 0xA689, - 0xE6EF: 0xA68A, - 0xE6F0: 0xA68B, - 0xE6F1: 0xA68C, - 0xE6F2: 0xA68D, - 0xE6F3: 0xA68E, - 0xE6F4: 0xA68F, - 0xE6F5: 0xA690, - 0xE6F6: 0xA691, - 0xE6F7: 0xA692, - 0xE6F8: 0xA693, - 0xE6F9: 0xA694, - 0xE6FA: 0xA695, - 0xE6FB: 0xA696, - 0xE6FC: 0xA697, - 0xE6FD: 0xA698, - 0xE6FE: 0xA699, - 0xE6FF: 0xA69A, - 0xE700: 0xA69B, - 0xE701: 0xA69C, - 0xE702: 0xA69D, - 0xE703: 0xA69E, - 0xE704: 0xA69F, - 0xE705: 0xA6A0, - 0xE706: 0xA740, - 0xE707: 0xA741, - 0xE708: 0xA742, - 0xE709: 0xA743, - 0xE70A: 0xA744, - 0xE70B: 0xA745, - 0xE70C: 0xA746, - 0xE70D: 0xA747, - 0xE70E: 0xA748, - 0xE70F: 0xA749, - 0xE710: 0xA74A, - 0xE711: 0xA74B, - 0xE712: 0xA74C, - 0xE713: 0xA74D, - 0xE714: 0xA74E, - 0xE715: 0xA74F, - 0xE716: 0xA750, - 0xE717: 0xA751, - 0xE718: 0xA752, - 0xE719: 0xA753, - 0xE71A: 0xA754, - 0xE71B: 0xA755, - 0xE71C: 0xA756, - 0xE71D: 0xA757, - 0xE71E: 0xA758, - 0xE71F: 0xA759, - 0xE720: 0xA75A, - 0xE721: 0xA75B, - 0xE722: 0xA75C, - 0xE723: 0xA75D, - 0xE724: 0xA75E, - 0xE725: 0xA75F, - 0xE726: 0xA760, - 0xE727: 0xA761, - 0xE728: 0xA762, - 0xE729: 0xA763, - 0xE72A: 0xA764, - 0xE72B: 0xA765, - 0xE72C: 0xA766, - 0xE72D: 0xA767, - 0xE72E: 0xA768, - 0xE72F: 0xA769, - 0xE730: 0xA76A, - 0xE731: 0xA76B, - 0xE732: 0xA76C, - 0xE733: 0xA76D, - 0xE734: 0xA76E, - 0xE735: 0xA76F, - 0xE736: 0xA770, - 0xE737: 0xA771, - 0xE738: 0xA772, - 0xE739: 0xA773, - 0xE73A: 0xA774, - 0xE73B: 0xA775, - 0xE73C: 0xA776, - 0xE73D: 0xA777, - 0xE73E: 0xA778, - 0xE73F: 0xA779, - 0xE740: 0xA77A, - 0xE741: 0xA77B, - 0xE742: 0xA77C, - 0xE743: 0xA77D, - 0xE744: 0xA77E, - 0xE745: 0xA780, - 0xE746: 0xA781, - 0xE747: 0xA782, - 0xE748: 0xA783, - 0xE749: 0xA784, - 0xE74A: 0xA785, - 0xE74B: 0xA786, - 0xE74C: 0xA787, - 0xE74D: 0xA788, - 0xE74E: 0xA789, - 0xE74F: 0xA78A, - 0xE750: 0xA78B, - 0xE751: 0xA78C, - 0xE752: 0xA78D, - 0xE753: 0xA78E, - 0xE754: 0xA78F, - 0xE755: 0xA790, - 0xE756: 0xA791, - 0xE757: 0xA792, - 0xE758: 0xA793, - 0xE759: 0xA794, - 0xE75A: 0xA795, - 0xE75B: 0xA796, - 0xE75C: 0xA797, - 0xE75D: 0xA798, - 0xE75E: 0xA799, - 0xE75F: 0xA79A, - 0xE760: 0xA79B, - 0xE761: 0xA79C, - 0xE762: 0xA79D, - 0xE763: 0xA79E, - 0xE764: 0xA79F, - 0xE765: 0xA7A0, - 0xE766: 0xA2AB, - 0xE767: 0xA2AC, - 0xE768: 0xA2AD, - 0xE769: 0xA2AE, - 0xE76A: 0xA2AF, - 0xE76B: 0xA2B0, - 0xE76D: 0xA2E4, - 0xE76E: 0xA2EF, - 0xE76F: 0xA2F0, - 0xE770: 0xA2FD, - 0xE771: 0xA2FE, - 0xE772: 0xA4F4, - 0xE773: 0xA4F5, - 0xE774: 0xA4F6, - 0xE775: 0xA4F7, - 0xE776: 0xA4F8, - 0xE777: 0xA4F9, - 0xE778: 0xA4FA, - 0xE779: 0xA4FB, - 0xE77A: 0xA4FC, - 0xE77B: 0xA4FD, - 0xE77C: 0xA4FE, - 0xE77D: 0xA5F7, - 0xE77E: 0xA5F8, - 0xE77F: 0xA5F9, - 0xE780: 0xA5FA, - 0xE781: 0xA5FB, - 0xE782: 0xA5FC, - 0xE783: 0xA5FD, - 0xE784: 0xA5FE, - 0xE785: 0xA6B9, - 0xE786: 0xA6BA, - 0xE787: 0xA6BB, - 0xE788: 0xA6BC, - 0xE789: 0xA6BD, - 0xE78A: 0xA6BE, - 0xE78B: 0xA6BF, - 0xE78C: 0xA6C0, - 0xE78D: 0xA6D9, - 0xE78E: 0xA6DA, - 0xE78F: 0xA6DB, - 0xE790: 0xA6DC, - 0xE791: 0xA6DD, - 0xE792: 0xA6DE, - 0xE793: 0xA6DF, - 0xE794: 0xA6EC, - 0xE795: 0xA6ED, - 0xE796: 0xA6F3, - 0xE797: 0xA6F6, - 0xE798: 0xA6F7, - 0xE799: 0xA6F8, - 0xE79A: 0xA6F9, - 0xE79B: 0xA6FA, - 0xE79C: 0xA6FB, - 0xE79D: 0xA6FC, - 0xE79E: 0xA6FD, - 0xE79F: 0xA6FE, - 0xE7A0: 0xA7C2, - 0xE7A1: 0xA7C3, - 0xE7A2: 0xA7C4, - 0xE7A3: 0xA7C5, - 0xE7A4: 0xA7C6, - 0xE7A5: 0xA7C7, - 0xE7A6: 0xA7C8, - 0xE7A7: 0xA7C9, - 0xE7A8: 0xA7CA, - 0xE7A9: 0xA7CB, - 0xE7AA: 0xA7CC, - 0xE7AB: 0xA7CD, - 0xE7AC: 0xA7CE, - 0xE7AD: 0xA7CF, - 0xE7AE: 0xA7D0, - 0xE7AF: 0xA7F2, - 0xE7B0: 0xA7F3, - 0xE7B1: 0xA7F4, - 0xE7B2: 0xA7F5, - 0xE7B3: 0xA7F6, - 0xE7B4: 0xA7F7, - 0xE7B5: 0xA7F8, - 0xE7B6: 0xA7F9, - 0xE7B7: 0xA7FA, - 0xE7B8: 0xA7FB, - 0xE7B9: 0xA7FC, - 0xE7BA: 0xA7FD, - 0xE7BB: 0xA7FE, - 0xE7BC: 0xA896, - 0xE7BD: 0xA897, - 0xE7BE: 0xA898, - 0xE7BF: 0xA899, - 0xE7C0: 0xA89A, - 0xE7C1: 0xA89B, - 0xE7C2: 0xA89C, - 0xE7C3: 0xA89D, - 0xE7C4: 0xA89E, - 0xE7C5: 0xA89F, - 0xE7C6: 0xA8A0, - 0xE7C9: 0xA8C1, - 0xE7CA: 0xA8C2, - 0xE7CB: 0xA8C3, - 0xE7CC: 0xA8C4, - 0xE7CD: 0xA8EA, - 0xE7CE: 0xA8EB, - 0xE7CF: 0xA8EC, - 0xE7D0: 0xA8ED, - 0xE7D1: 0xA8EE, - 0xE7D2: 0xA8EF, - 0xE7D3: 0xA8F0, - 0xE7D4: 0xA8F1, - 0xE7D5: 0xA8F2, - 0xE7D6: 0xA8F3, - 0xE7D7: 0xA8F4, - 0xE7D8: 0xA8F5, - 0xE7D9: 0xA8F6, - 0xE7DA: 0xA8F7, - 0xE7DB: 0xA8F8, - 0xE7DC: 0xA8F9, - 0xE7DD: 0xA8FA, - 0xE7DE: 0xA8FB, - 0xE7DF: 0xA8FC, - 0xE7E0: 0xA8FD, - 0xE7E1: 0xA8FE, - 0xE7E2: 0xA958, - 0xE7E3: 0xA95B, - 0xE7E4: 0xA95D, - 0xE7E5: 0xA95E, - 0xE7E6: 0xA95F, - 0xE7F4: 0xA997, - 0xE7F5: 0xA998, - 0xE7F6: 0xA999, - 0xE7F7: 0xA99A, - 0xE7F8: 0xA99B, - 0xE7F9: 0xA99C, - 0xE7FA: 0xA99D, - 0xE7FB: 0xA99E, - 0xE7FC: 0xA99F, - 0xE7FD: 0xA9A0, - 0xE7FE: 0xA9A1, - 0xE7FF: 0xA9A2, - 0xE800: 0xA9A3, - 0xE801: 0xA9F0, - 0xE802: 0xA9F1, - 0xE803: 0xA9F2, - 0xE804: 0xA9F3, - 0xE805: 0xA9F4, - 0xE806: 0xA9F5, - 0xE807: 0xA9F6, - 0xE808: 0xA9F7, - 0xE809: 0xA9F8, - 0xE80A: 0xA9F9, - 0xE80B: 0xA9FA, - 0xE80C: 0xA9FB, - 0xE80D: 0xA9FC, - 0xE80E: 0xA9FD, - 0xE80F: 0xA9FE, - 0xE810: 0xD7FA, - 0xE811: 0xD7FB, - 0xE812: 0xD7FC, - 0xE813: 0xD7FD, - 0xE814: 0xD7FE, - 0xE816: 0xFE51, - 0xE817: 0xFE52, - 0xE818: 0xFE53, - 0xE81E: 0xFE59, - 0xE826: 0xFE61, - 0xE82B: 0xFE66, - 0xE82C: 0xFE67, - 0xE831: 0xFE6C, - 0xE832: 0xFE6D, - 0xE83B: 0xFE76, - 0xE843: 0xFE7E, - 0xE854: 0xFE90, - 0xE855: 0xFE91, - 0xE864: 0xFEA0, - 0xF92C: 0xFD9C, - 0xF979: 0xFD9D, - 0xF995: 0xFD9E, - 0xF9E7: 0xFD9F, - 0xF9F1: 0xFDA0, - 0xFA0C: 0xFE40, - 0xFA0D: 0xFE41, - 0xFA0E: 0xFE42, - 0xFA0F: 0xFE43, - 0xFA11: 0xFE44, - 0xFA13: 0xFE45, - 0xFA14: 0xFE46, - 0xFA18: 0xFE47, - 0xFA1F: 0xFE48, - 0xFA20: 0xFE49, - 0xFA21: 0xFE4A, - 0xFA23: 0xFE4B, - 0xFA24: 0xFE4C, - 0xFA27: 0xFE4D, - 0xFA28: 0xFE4E, - 0xFA29: 0xFE4F, - 0xFE10: 0xA6D9, - 0xFE11: 0xA6DB, - 0xFE12: 0xA6DA, - 0xFE13: 0xA6DC, - 0xFE14: 0xA6DD, - 0xFE15: 0xA6DE, - 0xFE16: 0xA6DF, - 0xFE17: 0xA6EC, - 0xFE18: 0xA6ED, - 0xFE19: 0xA6F3, - 0xFE30: 0xA955, - 0xFE31: 0xA6F2, - 0xFE33: 0xA6F4, - 0xFE34: 0xA6F5, - 0xFE35: 0xA6E0, - 0xFE36: 0xA6E1, - 0xFE37: 0xA6F0, - 0xFE38: 0xA6F1, - 0xFE39: 0xA6E2, - 0xFE3A: 0xA6E3, - 0xFE3B: 0xA6EE, - 0xFE3C: 0xA6EF, - 0xFE3D: 0xA6E6, - 0xFE3E: 0xA6E7, - 0xFE3F: 0xA6E4, - 0xFE40: 0xA6E5, - 0xFE41: 0xA6E8, - 0xFE42: 0xA6E9, - 0xFE43: 0xA6EA, - 0xFE44: 0xA6EB, - 0xFE49: 0xA968, - 0xFE4A: 0xA969, - 0xFE4B: 0xA96A, - 0xFE4C: 0xA96B, - 0xFE4D: 0xA96C, - 0xFE4E: 0xA96D, - 0xFE4F: 0xA96E, - 0xFE50: 0xA96F, - 0xFE51: 0xA970, - 0xFE52: 0xA971, - 0xFE54: 0xA972, - 0xFE55: 0xA973, - 0xFE56: 0xA974, - 0xFE57: 0xA975, - 0xFE59: 0xA976, - 0xFE5A: 0xA977, - 0xFE5B: 0xA978, - 0xFE5C: 0xA979, - 0xFE5D: 0xA97A, - 0xFE5E: 0xA97B, - 0xFE5F: 0xA97C, - 0xFE60: 0xA97D, - 0xFE61: 0xA97E, - 0xFE62: 0xA980, - 0xFE63: 0xA981, - 0xFE64: 0xA982, - 0xFE65: 0xA983, - 0xFE66: 0xA984, - 0xFE68: 0xA985, - 0xFE69: 0xA986, - 0xFE6A: 0xA987, - 0xFE6B: 0xA988, - 0xFF01: 0xA3A1, - 0xFF02: 0xA3A2, - 0xFF03: 0xA3A3, - 0xFF04: 0xA1E7, - 0xFF05: 0xA3A5, - 0xFF06: 0xA3A6, - 0xFF07: 0xA3A7, - 0xFF08: 0xA3A8, - 0xFF09: 0xA3A9, - 0xFF0A: 0xA3AA, - 0xFF0B: 0xA3AB, - 0xFF0C: 0xA3AC, - 0xFF0D: 0xA3AD, - 0xFF0E: 0xA3AE, - 0xFF0F: 0xA3AF, - 0xFF10: 0xA3B0, - 0xFF11: 0xA3B1, - 0xFF12: 0xA3B2, - 0xFF13: 0xA3B3, - 0xFF14: 0xA3B4, - 0xFF15: 0xA3B5, - 0xFF16: 0xA3B6, - 0xFF17: 0xA3B7, - 0xFF18: 0xA3B8, - 0xFF19: 0xA3B9, - 0xFF1A: 0xA3BA, - 0xFF1B: 0xA3BB, - 0xFF1C: 0xA3BC, - 0xFF1D: 0xA3BD, - 0xFF1E: 0xA3BE, - 0xFF1F: 0xA3BF, - 0xFF20: 0xA3C0, - 0xFF21: 0xA3C1, - 0xFF22: 0xA3C2, - 0xFF23: 0xA3C3, - 0xFF24: 0xA3C4, - 0xFF25: 0xA3C5, - 0xFF26: 0xA3C6, - 0xFF27: 0xA3C7, - 0xFF28: 0xA3C8, - 0xFF29: 0xA3C9, - 0xFF2A: 0xA3CA, - 0xFF2B: 0xA3CB, - 0xFF2C: 0xA3CC, - 0xFF2D: 0xA3CD, - 0xFF2E: 0xA3CE, - 0xFF2F: 0xA3CF, - 0xFF30: 0xA3D0, - 0xFF31: 0xA3D1, - 0xFF32: 0xA3D2, - 0xFF33: 0xA3D3, - 0xFF34: 0xA3D4, - 0xFF35: 0xA3D5, - 0xFF36: 0xA3D6, - 0xFF37: 0xA3D7, - 0xFF38: 0xA3D8, - 0xFF39: 0xA3D9, - 0xFF3A: 0xA3DA, - 0xFF3B: 0xA3DB, - 0xFF3C: 0xA3DC, - 0xFF3D: 0xA3DD, - 0xFF3E: 0xA3DE, - 0xFF3F: 0xA3DF, - 0xFF40: 0xA3E0, - 0xFF41: 0xA3E1, - 0xFF42: 0xA3E2, - 0xFF43: 0xA3E3, - 0xFF44: 0xA3E4, - 0xFF45: 0xA3E5, - 0xFF46: 0xA3E6, - 0xFF47: 0xA3E7, - 0xFF48: 0xA3E8, - 0xFF49: 0xA3E9, - 0xFF4A: 0xA3EA, - 0xFF4B: 0xA3EB, - 0xFF4C: 0xA3EC, - 0xFF4D: 0xA3ED, - 0xFF4E: 0xA3EE, - 0xFF4F: 0xA3EF, - 0xFF50: 0xA3F0, - 0xFF51: 0xA3F1, - 0xFF52: 0xA3F2, - 0xFF53: 0xA3F3, - 0xFF54: 0xA3F4, - 0xFF55: 0xA3F5, - 0xFF56: 0xA3F6, - 0xFF57: 0xA3F7, - 0xFF58: 0xA3F8, - 0xFF59: 0xA3F9, - 0xFF5A: 0xA3FA, - 0xFF5B: 0xA3FB, - 0xFF5C: 0xA3FC, - 0xFF5D: 0xA3FD, - 0xFF5E: 0xA1AB, - 0xFFE0: 0xA1E9, - 0xFFE1: 0xA1EA, - 0xFFE2: 0xA956, - 0xFFE3: 0xA3FE, - 0xFFE4: 0xA957, - 0xFFE5: 0xA3A4, -} - -var gbkToUnicode = [65536]uint16{ - 0x8140: 0x4E02, - 0x8141: 0x4E04, - 0x8142: 0x4E05, - 0x8143: 0x4E06, - 0x8144: 0x4E0F, - 0x8145: 0x4E12, - 0x8146: 0x4E17, - 0x8147: 0x4E1F, - 0x8148: 0x4E20, - 0x8149: 0x4E21, - 0x814A: 0x4E23, - 0x814B: 0x4E26, - 0x814C: 0x4E29, - 0x814D: 0x4E2E, - 0x814E: 0x4E2F, - 0x814F: 0x4E31, - 0x8150: 0x4E33, - 0x8151: 0x4E35, - 0x8152: 0x4E37, - 0x8153: 0x4E3C, - 0x8154: 0x4E40, - 0x8155: 0x4E41, - 0x8156: 0x4E42, - 0x8157: 0x4E44, - 0x8158: 0x4E46, - 0x8159: 0x4E4A, - 0x815A: 0x4E51, - 0x815B: 0x4E55, - 0x815C: 0x4E57, - 0x815D: 0x4E5A, - 0x815E: 0x4E5B, - 0x815F: 0x4E62, - 0x8160: 0x4E63, - 0x8161: 0x4E64, - 0x8162: 0x4E65, - 0x8163: 0x4E67, - 0x8164: 0x4E68, - 0x8165: 0x4E6A, - 0x8166: 0x4E6B, - 0x8167: 0x4E6C, - 0x8168: 0x4E6D, - 0x8169: 0x4E6E, - 0x816A: 0x4E6F, - 0x816B: 0x4E72, - 0x816C: 0x4E74, - 0x816D: 0x4E75, - 0x816E: 0x4E76, - 0x816F: 0x4E77, - 0x8170: 0x4E78, - 0x8171: 0x4E79, - 0x8172: 0x4E7A, - 0x8173: 0x4E7B, - 0x8174: 0x4E7C, - 0x8175: 0x4E7D, - 0x8176: 0x4E7F, - 0x8177: 0x4E80, - 0x8178: 0x4E81, - 0x8179: 0x4E82, - 0x817A: 0x4E83, - 0x817B: 0x4E84, - 0x817C: 0x4E85, - 0x817D: 0x4E87, - 0x817E: 0x4E8A, - 0x8180: 0x4E90, - 0x8181: 0x4E96, - 0x8182: 0x4E97, - 0x8183: 0x4E99, - 0x8184: 0x4E9C, - 0x8185: 0x4E9D, - 0x8186: 0x4E9E, - 0x8187: 0x4EA3, - 0x8188: 0x4EAA, - 0x8189: 0x4EAF, - 0x818A: 0x4EB0, - 0x818B: 0x4EB1, - 0x818C: 0x4EB4, - 0x818D: 0x4EB6, - 0x818E: 0x4EB7, - 0x818F: 0x4EB8, - 0x8190: 0x4EB9, - 0x8191: 0x4EBC, - 0x8192: 0x4EBD, - 0x8193: 0x4EBE, - 0x8194: 0x4EC8, - 0x8195: 0x4ECC, - 0x8196: 0x4ECF, - 0x8197: 0x4ED0, - 0x8198: 0x4ED2, - 0x8199: 0x4EDA, - 0x819A: 0x4EDB, - 0x819B: 0x4EDC, - 0x819C: 0x4EE0, - 0x819D: 0x4EE2, - 0x819E: 0x4EE6, - 0x819F: 0x4EE7, - 0x81A0: 0x4EE9, - 0x81A1: 0x4EED, - 0x81A2: 0x4EEE, - 0x81A3: 0x4EEF, - 0x81A4: 0x4EF1, - 0x81A5: 0x4EF4, - 0x81A6: 0x4EF8, - 0x81A7: 0x4EF9, - 0x81A8: 0x4EFA, - 0x81A9: 0x4EFC, - 0x81AA: 0x4EFE, - 0x81AB: 0x4F00, - 0x81AC: 0x4F02, - 0x81AD: 0x4F03, - 0x81AE: 0x4F04, - 0x81AF: 0x4F05, - 0x81B0: 0x4F06, - 0x81B1: 0x4F07, - 0x81B2: 0x4F08, - 0x81B3: 0x4F0B, - 0x81B4: 0x4F0C, - 0x81B5: 0x4F12, - 0x81B6: 0x4F13, - 0x81B7: 0x4F14, - 0x81B8: 0x4F15, - 0x81B9: 0x4F16, - 0x81BA: 0x4F1C, - 0x81BB: 0x4F1D, - 0x81BC: 0x4F21, - 0x81BD: 0x4F23, - 0x81BE: 0x4F28, - 0x81BF: 0x4F29, - 0x81C0: 0x4F2C, - 0x81C1: 0x4F2D, - 0x81C2: 0x4F2E, - 0x81C3: 0x4F31, - 0x81C4: 0x4F33, - 0x81C5: 0x4F35, - 0x81C6: 0x4F37, - 0x81C7: 0x4F39, - 0x81C8: 0x4F3B, - 0x81C9: 0x4F3E, - 0x81CA: 0x4F3F, - 0x81CB: 0x4F40, - 0x81CC: 0x4F41, - 0x81CD: 0x4F42, - 0x81CE: 0x4F44, - 0x81CF: 0x4F45, - 0x81D0: 0x4F47, - 0x81D1: 0x4F48, - 0x81D2: 0x4F49, - 0x81D3: 0x4F4A, - 0x81D4: 0x4F4B, - 0x81D5: 0x4F4C, - 0x81D6: 0x4F52, - 0x81D7: 0x4F54, - 0x81D8: 0x4F56, - 0x81D9: 0x4F61, - 0x81DA: 0x4F62, - 0x81DB: 0x4F66, - 0x81DC: 0x4F68, - 0x81DD: 0x4F6A, - 0x81DE: 0x4F6B, - 0x81DF: 0x4F6D, - 0x81E0: 0x4F6E, - 0x81E1: 0x4F71, - 0x81E2: 0x4F72, - 0x81E3: 0x4F75, - 0x81E4: 0x4F77, - 0x81E5: 0x4F78, - 0x81E6: 0x4F79, - 0x81E7: 0x4F7A, - 0x81E8: 0x4F7D, - 0x81E9: 0x4F80, - 0x81EA: 0x4F81, - 0x81EB: 0x4F82, - 0x81EC: 0x4F85, - 0x81ED: 0x4F86, - 0x81EE: 0x4F87, - 0x81EF: 0x4F8A, - 0x81F0: 0x4F8C, - 0x81F1: 0x4F8E, - 0x81F2: 0x4F90, - 0x81F3: 0x4F92, - 0x81F4: 0x4F93, - 0x81F5: 0x4F95, - 0x81F6: 0x4F96, - 0x81F7: 0x4F98, - 0x81F8: 0x4F99, - 0x81F9: 0x4F9A, - 0x81FA: 0x4F9C, - 0x81FB: 0x4F9E, - 0x81FC: 0x4F9F, - 0x81FD: 0x4FA1, - 0x81FE: 0x4FA2, - 0x8240: 0x4FA4, - 0x8241: 0x4FAB, - 0x8242: 0x4FAD, - 0x8243: 0x4FB0, - 0x8244: 0x4FB1, - 0x8245: 0x4FB2, - 0x8246: 0x4FB3, - 0x8247: 0x4FB4, - 0x8248: 0x4FB6, - 0x8249: 0x4FB7, - 0x824A: 0x4FB8, - 0x824B: 0x4FB9, - 0x824C: 0x4FBA, - 0x824D: 0x4FBB, - 0x824E: 0x4FBC, - 0x824F: 0x4FBD, - 0x8250: 0x4FBE, - 0x8251: 0x4FC0, - 0x8252: 0x4FC1, - 0x8253: 0x4FC2, - 0x8254: 0x4FC6, - 0x8255: 0x4FC7, - 0x8256: 0x4FC8, - 0x8257: 0x4FC9, - 0x8258: 0x4FCB, - 0x8259: 0x4FCC, - 0x825A: 0x4FCD, - 0x825B: 0x4FD2, - 0x825C: 0x4FD3, - 0x825D: 0x4FD4, - 0x825E: 0x4FD5, - 0x825F: 0x4FD6, - 0x8260: 0x4FD9, - 0x8261: 0x4FDB, - 0x8262: 0x4FE0, - 0x8263: 0x4FE2, - 0x8264: 0x4FE4, - 0x8265: 0x4FE5, - 0x8266: 0x4FE7, - 0x8267: 0x4FEB, - 0x8268: 0x4FEC, - 0x8269: 0x4FF0, - 0x826A: 0x4FF2, - 0x826B: 0x4FF4, - 0x826C: 0x4FF5, - 0x826D: 0x4FF6, - 0x826E: 0x4FF7, - 0x826F: 0x4FF9, - 0x8270: 0x4FFB, - 0x8271: 0x4FFC, - 0x8272: 0x4FFD, - 0x8273: 0x4FFF, - 0x8274: 0x5000, - 0x8275: 0x5001, - 0x8276: 0x5002, - 0x8277: 0x5003, - 0x8278: 0x5004, - 0x8279: 0x5005, - 0x827A: 0x5006, - 0x827B: 0x5007, - 0x827C: 0x5008, - 0x827D: 0x5009, - 0x827E: 0x500A, - 0x8280: 0x500B, - 0x8281: 0x500E, - 0x8282: 0x5010, - 0x8283: 0x5011, - 0x8284: 0x5013, - 0x8285: 0x5015, - 0x8286: 0x5016, - 0x8287: 0x5017, - 0x8288: 0x501B, - 0x8289: 0x501D, - 0x828A: 0x501E, - 0x828B: 0x5020, - 0x828C: 0x5022, - 0x828D: 0x5023, - 0x828E: 0x5024, - 0x828F: 0x5027, - 0x8290: 0x502B, - 0x8291: 0x502F, - 0x8292: 0x5030, - 0x8293: 0x5031, - 0x8294: 0x5032, - 0x8295: 0x5033, - 0x8296: 0x5034, - 0x8297: 0x5035, - 0x8298: 0x5036, - 0x8299: 0x5037, - 0x829A: 0x5038, - 0x829B: 0x5039, - 0x829C: 0x503B, - 0x829D: 0x503D, - 0x829E: 0x503F, - 0x829F: 0x5040, - 0x82A0: 0x5041, - 0x82A1: 0x5042, - 0x82A2: 0x5044, - 0x82A3: 0x5045, - 0x82A4: 0x5046, - 0x82A5: 0x5049, - 0x82A6: 0x504A, - 0x82A7: 0x504B, - 0x82A8: 0x504D, - 0x82A9: 0x5050, - 0x82AA: 0x5051, - 0x82AB: 0x5052, - 0x82AC: 0x5053, - 0x82AD: 0x5054, - 0x82AE: 0x5056, - 0x82AF: 0x5057, - 0x82B0: 0x5058, - 0x82B1: 0x5059, - 0x82B2: 0x505B, - 0x82B3: 0x505D, - 0x82B4: 0x505E, - 0x82B5: 0x505F, - 0x82B6: 0x5060, - 0x82B7: 0x5061, - 0x82B8: 0x5062, - 0x82B9: 0x5063, - 0x82BA: 0x5064, - 0x82BB: 0x5066, - 0x82BC: 0x5067, - 0x82BD: 0x5068, - 0x82BE: 0x5069, - 0x82BF: 0x506A, - 0x82C0: 0x506B, - 0x82C1: 0x506D, - 0x82C2: 0x506E, - 0x82C3: 0x506F, - 0x82C4: 0x5070, - 0x82C5: 0x5071, - 0x82C6: 0x5072, - 0x82C7: 0x5073, - 0x82C8: 0x5074, - 0x82C9: 0x5075, - 0x82CA: 0x5078, - 0x82CB: 0x5079, - 0x82CC: 0x507A, - 0x82CD: 0x507C, - 0x82CE: 0x507D, - 0x82CF: 0x5081, - 0x82D0: 0x5082, - 0x82D1: 0x5083, - 0x82D2: 0x5084, - 0x82D3: 0x5086, - 0x82D4: 0x5087, - 0x82D5: 0x5089, - 0x82D6: 0x508A, - 0x82D7: 0x508B, - 0x82D8: 0x508C, - 0x82D9: 0x508E, - 0x82DA: 0x508F, - 0x82DB: 0x5090, - 0x82DC: 0x5091, - 0x82DD: 0x5092, - 0x82DE: 0x5093, - 0x82DF: 0x5094, - 0x82E0: 0x5095, - 0x82E1: 0x5096, - 0x82E2: 0x5097, - 0x82E3: 0x5098, - 0x82E4: 0x5099, - 0x82E5: 0x509A, - 0x82E6: 0x509B, - 0x82E7: 0x509C, - 0x82E8: 0x509D, - 0x82E9: 0x509E, - 0x82EA: 0x509F, - 0x82EB: 0x50A0, - 0x82EC: 0x50A1, - 0x82ED: 0x50A2, - 0x82EE: 0x50A4, - 0x82EF: 0x50A6, - 0x82F0: 0x50AA, - 0x82F1: 0x50AB, - 0x82F2: 0x50AD, - 0x82F3: 0x50AE, - 0x82F4: 0x50AF, - 0x82F5: 0x50B0, - 0x82F6: 0x50B1, - 0x82F7: 0x50B3, - 0x82F8: 0x50B4, - 0x82F9: 0x50B5, - 0x82FA: 0x50B6, - 0x82FB: 0x50B7, - 0x82FC: 0x50B8, - 0x82FD: 0x50B9, - 0x82FE: 0x50BC, - 0x8340: 0x50BD, - 0x8341: 0x50BE, - 0x8342: 0x50BF, - 0x8343: 0x50C0, - 0x8344: 0x50C1, - 0x8345: 0x50C2, - 0x8346: 0x50C3, - 0x8347: 0x50C4, - 0x8348: 0x50C5, - 0x8349: 0x50C6, - 0x834A: 0x50C7, - 0x834B: 0x50C8, - 0x834C: 0x50C9, - 0x834D: 0x50CA, - 0x834E: 0x50CB, - 0x834F: 0x50CC, - 0x8350: 0x50CD, - 0x8351: 0x50CE, - 0x8352: 0x50D0, - 0x8353: 0x50D1, - 0x8354: 0x50D2, - 0x8355: 0x50D3, - 0x8356: 0x50D4, - 0x8357: 0x50D5, - 0x8358: 0x50D7, - 0x8359: 0x50D8, - 0x835A: 0x50D9, - 0x835B: 0x50DB, - 0x835C: 0x50DC, - 0x835D: 0x50DD, - 0x835E: 0x50DE, - 0x835F: 0x50DF, - 0x8360: 0x50E0, - 0x8361: 0x50E1, - 0x8362: 0x50E2, - 0x8363: 0x50E3, - 0x8364: 0x50E4, - 0x8365: 0x50E5, - 0x8366: 0x50E8, - 0x8367: 0x50E9, - 0x8368: 0x50EA, - 0x8369: 0x50EB, - 0x836A: 0x50EF, - 0x836B: 0x50F0, - 0x836C: 0x50F1, - 0x836D: 0x50F2, - 0x836E: 0x50F4, - 0x836F: 0x50F6, - 0x8370: 0x50F7, - 0x8371: 0x50F8, - 0x8372: 0x50F9, - 0x8373: 0x50FA, - 0x8374: 0x50FC, - 0x8375: 0x50FD, - 0x8376: 0x50FE, - 0x8377: 0x50FF, - 0x8378: 0x5100, - 0x8379: 0x5101, - 0x837A: 0x5102, - 0x837B: 0x5103, - 0x837C: 0x5104, - 0x837D: 0x5105, - 0x837E: 0x5108, - 0x8380: 0x5109, - 0x8381: 0x510A, - 0x8382: 0x510C, - 0x8383: 0x510D, - 0x8384: 0x510E, - 0x8385: 0x510F, - 0x8386: 0x5110, - 0x8387: 0x5111, - 0x8388: 0x5113, - 0x8389: 0x5114, - 0x838A: 0x5115, - 0x838B: 0x5116, - 0x838C: 0x5117, - 0x838D: 0x5118, - 0x838E: 0x5119, - 0x838F: 0x511A, - 0x8390: 0x511B, - 0x8391: 0x511C, - 0x8392: 0x511D, - 0x8393: 0x511E, - 0x8394: 0x511F, - 0x8395: 0x5120, - 0x8396: 0x5122, - 0x8397: 0x5123, - 0x8398: 0x5124, - 0x8399: 0x5125, - 0x839A: 0x5126, - 0x839B: 0x5127, - 0x839C: 0x5128, - 0x839D: 0x5129, - 0x839E: 0x512A, - 0x839F: 0x512B, - 0x83A0: 0x512C, - 0x83A1: 0x512D, - 0x83A2: 0x512E, - 0x83A3: 0x512F, - 0x83A4: 0x5130, - 0x83A5: 0x5131, - 0x83A6: 0x5132, - 0x83A7: 0x5133, - 0x83A8: 0x5134, - 0x83A9: 0x5135, - 0x83AA: 0x5136, - 0x83AB: 0x5137, - 0x83AC: 0x5138, - 0x83AD: 0x5139, - 0x83AE: 0x513A, - 0x83AF: 0x513B, - 0x83B0: 0x513C, - 0x83B1: 0x513D, - 0x83B2: 0x513E, - 0x83B3: 0x5142, - 0x83B4: 0x5147, - 0x83B5: 0x514A, - 0x83B6: 0x514C, - 0x83B7: 0x514E, - 0x83B8: 0x514F, - 0x83B9: 0x5150, - 0x83BA: 0x5152, - 0x83BB: 0x5153, - 0x83BC: 0x5157, - 0x83BD: 0x5158, - 0x83BE: 0x5159, - 0x83BF: 0x515B, - 0x83C0: 0x515D, - 0x83C1: 0x515E, - 0x83C2: 0x515F, - 0x83C3: 0x5160, - 0x83C4: 0x5161, - 0x83C5: 0x5163, - 0x83C6: 0x5164, - 0x83C7: 0x5166, - 0x83C8: 0x5167, - 0x83C9: 0x5169, - 0x83CA: 0x516A, - 0x83CB: 0x516F, - 0x83CC: 0x5172, - 0x83CD: 0x517A, - 0x83CE: 0x517E, - 0x83CF: 0x517F, - 0x83D0: 0x5183, - 0x83D1: 0x5184, - 0x83D2: 0x5186, - 0x83D3: 0x5187, - 0x83D4: 0x518A, - 0x83D5: 0x518B, - 0x83D6: 0x518E, - 0x83D7: 0x518F, - 0x83D8: 0x5190, - 0x83D9: 0x5191, - 0x83DA: 0x5193, - 0x83DB: 0x5194, - 0x83DC: 0x5198, - 0x83DD: 0x519A, - 0x83DE: 0x519D, - 0x83DF: 0x519E, - 0x83E0: 0x519F, - 0x83E1: 0x51A1, - 0x83E2: 0x51A3, - 0x83E3: 0x51A6, - 0x83E4: 0x51A7, - 0x83E5: 0x51A8, - 0x83E6: 0x51A9, - 0x83E7: 0x51AA, - 0x83E8: 0x51AD, - 0x83E9: 0x51AE, - 0x83EA: 0x51B4, - 0x83EB: 0x51B8, - 0x83EC: 0x51B9, - 0x83ED: 0x51BA, - 0x83EE: 0x51BE, - 0x83EF: 0x51BF, - 0x83F0: 0x51C1, - 0x83F1: 0x51C2, - 0x83F2: 0x51C3, - 0x83F3: 0x51C5, - 0x83F4: 0x51C8, - 0x83F5: 0x51CA, - 0x83F6: 0x51CD, - 0x83F7: 0x51CE, - 0x83F8: 0x51D0, - 0x83F9: 0x51D2, - 0x83FA: 0x51D3, - 0x83FB: 0x51D4, - 0x83FC: 0x51D5, - 0x83FD: 0x51D6, - 0x83FE: 0x51D7, - 0x8440: 0x51D8, - 0x8441: 0x51D9, - 0x8442: 0x51DA, - 0x8443: 0x51DC, - 0x8444: 0x51DE, - 0x8445: 0x51DF, - 0x8446: 0x51E2, - 0x8447: 0x51E3, - 0x8448: 0x51E5, - 0x8449: 0x51E6, - 0x844A: 0x51E7, - 0x844B: 0x51E8, - 0x844C: 0x51E9, - 0x844D: 0x51EA, - 0x844E: 0x51EC, - 0x844F: 0x51EE, - 0x8450: 0x51F1, - 0x8451: 0x51F2, - 0x8452: 0x51F4, - 0x8453: 0x51F7, - 0x8454: 0x51FE, - 0x8455: 0x5204, - 0x8456: 0x5205, - 0x8457: 0x5209, - 0x8458: 0x520B, - 0x8459: 0x520C, - 0x845A: 0x520F, - 0x845B: 0x5210, - 0x845C: 0x5213, - 0x845D: 0x5214, - 0x845E: 0x5215, - 0x845F: 0x521C, - 0x8460: 0x521E, - 0x8461: 0x521F, - 0x8462: 0x5221, - 0x8463: 0x5222, - 0x8464: 0x5223, - 0x8465: 0x5225, - 0x8466: 0x5226, - 0x8467: 0x5227, - 0x8468: 0x522A, - 0x8469: 0x522C, - 0x846A: 0x522F, - 0x846B: 0x5231, - 0x846C: 0x5232, - 0x846D: 0x5234, - 0x846E: 0x5235, - 0x846F: 0x523C, - 0x8470: 0x523E, - 0x8471: 0x5244, - 0x8472: 0x5245, - 0x8473: 0x5246, - 0x8474: 0x5247, - 0x8475: 0x5248, - 0x8476: 0x5249, - 0x8477: 0x524B, - 0x8478: 0x524E, - 0x8479: 0x524F, - 0x847A: 0x5252, - 0x847B: 0x5253, - 0x847C: 0x5255, - 0x847D: 0x5257, - 0x847E: 0x5258, - 0x8480: 0x5259, - 0x8481: 0x525A, - 0x8482: 0x525B, - 0x8483: 0x525D, - 0x8484: 0x525F, - 0x8485: 0x5260, - 0x8486: 0x5262, - 0x8487: 0x5263, - 0x8488: 0x5264, - 0x8489: 0x5266, - 0x848A: 0x5268, - 0x848B: 0x526B, - 0x848C: 0x526C, - 0x848D: 0x526D, - 0x848E: 0x526E, - 0x848F: 0x5270, - 0x8490: 0x5271, - 0x8491: 0x5273, - 0x8492: 0x5274, - 0x8493: 0x5275, - 0x8494: 0x5276, - 0x8495: 0x5277, - 0x8496: 0x5278, - 0x8497: 0x5279, - 0x8498: 0x527A, - 0x8499: 0x527B, - 0x849A: 0x527C, - 0x849B: 0x527E, - 0x849C: 0x5280, - 0x849D: 0x5283, - 0x849E: 0x5284, - 0x849F: 0x5285, - 0x84A0: 0x5286, - 0x84A1: 0x5287, - 0x84A2: 0x5289, - 0x84A3: 0x528A, - 0x84A4: 0x528B, - 0x84A5: 0x528C, - 0x84A6: 0x528D, - 0x84A7: 0x528E, - 0x84A8: 0x528F, - 0x84A9: 0x5291, - 0x84AA: 0x5292, - 0x84AB: 0x5294, - 0x84AC: 0x5295, - 0x84AD: 0x5296, - 0x84AE: 0x5297, - 0x84AF: 0x5298, - 0x84B0: 0x5299, - 0x84B1: 0x529A, - 0x84B2: 0x529C, - 0x84B3: 0x52A4, - 0x84B4: 0x52A5, - 0x84B5: 0x52A6, - 0x84B6: 0x52A7, - 0x84B7: 0x52AE, - 0x84B8: 0x52AF, - 0x84B9: 0x52B0, - 0x84BA: 0x52B4, - 0x84BB: 0x52B5, - 0x84BC: 0x52B6, - 0x84BD: 0x52B7, - 0x84BE: 0x52B8, - 0x84BF: 0x52B9, - 0x84C0: 0x52BA, - 0x84C1: 0x52BB, - 0x84C2: 0x52BC, - 0x84C3: 0x52BD, - 0x84C4: 0x52C0, - 0x84C5: 0x52C1, - 0x84C6: 0x52C2, - 0x84C7: 0x52C4, - 0x84C8: 0x52C5, - 0x84C9: 0x52C6, - 0x84CA: 0x52C8, - 0x84CB: 0x52CA, - 0x84CC: 0x52CC, - 0x84CD: 0x52CD, - 0x84CE: 0x52CE, - 0x84CF: 0x52CF, - 0x84D0: 0x52D1, - 0x84D1: 0x52D3, - 0x84D2: 0x52D4, - 0x84D3: 0x52D5, - 0x84D4: 0x52D7, - 0x84D5: 0x52D9, - 0x84D6: 0x52DA, - 0x84D7: 0x52DB, - 0x84D8: 0x52DC, - 0x84D9: 0x52DD, - 0x84DA: 0x52DE, - 0x84DB: 0x52E0, - 0x84DC: 0x52E1, - 0x84DD: 0x52E2, - 0x84DE: 0x52E3, - 0x84DF: 0x52E5, - 0x84E0: 0x52E6, - 0x84E1: 0x52E7, - 0x84E2: 0x52E8, - 0x84E3: 0x52E9, - 0x84E4: 0x52EA, - 0x84E5: 0x52EB, - 0x84E6: 0x52EC, - 0x84E7: 0x52ED, - 0x84E8: 0x52EE, - 0x84E9: 0x52EF, - 0x84EA: 0x52F1, - 0x84EB: 0x52F2, - 0x84EC: 0x52F3, - 0x84ED: 0x52F4, - 0x84EE: 0x52F5, - 0x84EF: 0x52F6, - 0x84F0: 0x52F7, - 0x84F1: 0x52F8, - 0x84F2: 0x52FB, - 0x84F3: 0x52FC, - 0x84F4: 0x52FD, - 0x84F5: 0x5301, - 0x84F6: 0x5302, - 0x84F7: 0x5303, - 0x84F8: 0x5304, - 0x84F9: 0x5307, - 0x84FA: 0x5309, - 0x84FB: 0x530A, - 0x84FC: 0x530B, - 0x84FD: 0x530C, - 0x84FE: 0x530E, - 0x8540: 0x5311, - 0x8541: 0x5312, - 0x8542: 0x5313, - 0x8543: 0x5314, - 0x8544: 0x5318, - 0x8545: 0x531B, - 0x8546: 0x531C, - 0x8547: 0x531E, - 0x8548: 0x531F, - 0x8549: 0x5322, - 0x854A: 0x5324, - 0x854B: 0x5325, - 0x854C: 0x5327, - 0x854D: 0x5328, - 0x854E: 0x5329, - 0x854F: 0x532B, - 0x8550: 0x532C, - 0x8551: 0x532D, - 0x8552: 0x532F, - 0x8553: 0x5330, - 0x8554: 0x5331, - 0x8555: 0x5332, - 0x8556: 0x5333, - 0x8557: 0x5334, - 0x8558: 0x5335, - 0x8559: 0x5336, - 0x855A: 0x5337, - 0x855B: 0x5338, - 0x855C: 0x533C, - 0x855D: 0x533D, - 0x855E: 0x5340, - 0x855F: 0x5342, - 0x8560: 0x5344, - 0x8561: 0x5346, - 0x8562: 0x534B, - 0x8563: 0x534C, - 0x8564: 0x534D, - 0x8565: 0x5350, - 0x8566: 0x5354, - 0x8567: 0x5358, - 0x8568: 0x5359, - 0x8569: 0x535B, - 0x856A: 0x535D, - 0x856B: 0x5365, - 0x856C: 0x5368, - 0x856D: 0x536A, - 0x856E: 0x536C, - 0x856F: 0x536D, - 0x8570: 0x5372, - 0x8571: 0x5376, - 0x8572: 0x5379, - 0x8573: 0x537B, - 0x8574: 0x537C, - 0x8575: 0x537D, - 0x8576: 0x537E, - 0x8577: 0x5380, - 0x8578: 0x5381, - 0x8579: 0x5383, - 0x857A: 0x5387, - 0x857B: 0x5388, - 0x857C: 0x538A, - 0x857D: 0x538E, - 0x857E: 0x538F, - 0x8580: 0x5390, - 0x8581: 0x5391, - 0x8582: 0x5392, - 0x8583: 0x5393, - 0x8584: 0x5394, - 0x8585: 0x5396, - 0x8586: 0x5397, - 0x8587: 0x5399, - 0x8588: 0x539B, - 0x8589: 0x539C, - 0x858A: 0x539E, - 0x858B: 0x53A0, - 0x858C: 0x53A1, - 0x858D: 0x53A4, - 0x858E: 0x53A7, - 0x858F: 0x53AA, - 0x8590: 0x53AB, - 0x8591: 0x53AC, - 0x8592: 0x53AD, - 0x8593: 0x53AF, - 0x8594: 0x53B0, - 0x8595: 0x53B1, - 0x8596: 0x53B2, - 0x8597: 0x53B3, - 0x8598: 0x53B4, - 0x8599: 0x53B5, - 0x859A: 0x53B7, - 0x859B: 0x53B8, - 0x859C: 0x53B9, - 0x859D: 0x53BA, - 0x859E: 0x53BC, - 0x859F: 0x53BD, - 0x85A0: 0x53BE, - 0x85A1: 0x53C0, - 0x85A2: 0x53C3, - 0x85A3: 0x53C4, - 0x85A4: 0x53C5, - 0x85A5: 0x53C6, - 0x85A6: 0x53C7, - 0x85A7: 0x53CE, - 0x85A8: 0x53CF, - 0x85A9: 0x53D0, - 0x85AA: 0x53D2, - 0x85AB: 0x53D3, - 0x85AC: 0x53D5, - 0x85AD: 0x53DA, - 0x85AE: 0x53DC, - 0x85AF: 0x53DD, - 0x85B0: 0x53DE, - 0x85B1: 0x53E1, - 0x85B2: 0x53E2, - 0x85B3: 0x53E7, - 0x85B4: 0x53F4, - 0x85B5: 0x53FA, - 0x85B6: 0x53FE, - 0x85B7: 0x53FF, - 0x85B8: 0x5400, - 0x85B9: 0x5402, - 0x85BA: 0x5405, - 0x85BB: 0x5407, - 0x85BC: 0x540B, - 0x85BD: 0x5414, - 0x85BE: 0x5418, - 0x85BF: 0x5419, - 0x85C0: 0x541A, - 0x85C1: 0x541C, - 0x85C2: 0x5422, - 0x85C3: 0x5424, - 0x85C4: 0x5425, - 0x85C5: 0x542A, - 0x85C6: 0x5430, - 0x85C7: 0x5433, - 0x85C8: 0x5436, - 0x85C9: 0x5437, - 0x85CA: 0x543A, - 0x85CB: 0x543D, - 0x85CC: 0x543F, - 0x85CD: 0x5441, - 0x85CE: 0x5442, - 0x85CF: 0x5444, - 0x85D0: 0x5445, - 0x85D1: 0x5447, - 0x85D2: 0x5449, - 0x85D3: 0x544C, - 0x85D4: 0x544D, - 0x85D5: 0x544E, - 0x85D6: 0x544F, - 0x85D7: 0x5451, - 0x85D8: 0x545A, - 0x85D9: 0x545D, - 0x85DA: 0x545E, - 0x85DB: 0x545F, - 0x85DC: 0x5460, - 0x85DD: 0x5461, - 0x85DE: 0x5463, - 0x85DF: 0x5465, - 0x85E0: 0x5467, - 0x85E1: 0x5469, - 0x85E2: 0x546A, - 0x85E3: 0x546B, - 0x85E4: 0x546C, - 0x85E5: 0x546D, - 0x85E6: 0x546E, - 0x85E7: 0x546F, - 0x85E8: 0x5470, - 0x85E9: 0x5474, - 0x85EA: 0x5479, - 0x85EB: 0x547A, - 0x85EC: 0x547E, - 0x85ED: 0x547F, - 0x85EE: 0x5481, - 0x85EF: 0x5483, - 0x85F0: 0x5485, - 0x85F1: 0x5487, - 0x85F2: 0x5488, - 0x85F3: 0x5489, - 0x85F4: 0x548A, - 0x85F5: 0x548D, - 0x85F6: 0x5491, - 0x85F7: 0x5493, - 0x85F8: 0x5497, - 0x85F9: 0x5498, - 0x85FA: 0x549C, - 0x85FB: 0x549E, - 0x85FC: 0x549F, - 0x85FD: 0x54A0, - 0x85FE: 0x54A1, - 0x8640: 0x54A2, - 0x8641: 0x54A5, - 0x8642: 0x54AE, - 0x8643: 0x54B0, - 0x8644: 0x54B2, - 0x8645: 0x54B5, - 0x8646: 0x54B6, - 0x8647: 0x54B7, - 0x8648: 0x54B9, - 0x8649: 0x54BA, - 0x864A: 0x54BC, - 0x864B: 0x54BE, - 0x864C: 0x54C3, - 0x864D: 0x54C5, - 0x864E: 0x54CA, - 0x864F: 0x54CB, - 0x8650: 0x54D6, - 0x8651: 0x54D8, - 0x8652: 0x54DB, - 0x8653: 0x54E0, - 0x8654: 0x54E1, - 0x8655: 0x54E2, - 0x8656: 0x54E3, - 0x8657: 0x54E4, - 0x8658: 0x54EB, - 0x8659: 0x54EC, - 0x865A: 0x54EF, - 0x865B: 0x54F0, - 0x865C: 0x54F1, - 0x865D: 0x54F4, - 0x865E: 0x54F5, - 0x865F: 0x54F6, - 0x8660: 0x54F7, - 0x8661: 0x54F8, - 0x8662: 0x54F9, - 0x8663: 0x54FB, - 0x8664: 0x54FE, - 0x8665: 0x5500, - 0x8666: 0x5502, - 0x8667: 0x5503, - 0x8668: 0x5504, - 0x8669: 0x5505, - 0x866A: 0x5508, - 0x866B: 0x550A, - 0x866C: 0x550B, - 0x866D: 0x550C, - 0x866E: 0x550D, - 0x866F: 0x550E, - 0x8670: 0x5512, - 0x8671: 0x5513, - 0x8672: 0x5515, - 0x8673: 0x5516, - 0x8674: 0x5517, - 0x8675: 0x5518, - 0x8676: 0x5519, - 0x8677: 0x551A, - 0x8678: 0x551C, - 0x8679: 0x551D, - 0x867A: 0x551E, - 0x867B: 0x551F, - 0x867C: 0x5521, - 0x867D: 0x5525, - 0x867E: 0x5526, - 0x8680: 0x5528, - 0x8681: 0x5529, - 0x8682: 0x552B, - 0x8683: 0x552D, - 0x8684: 0x5532, - 0x8685: 0x5534, - 0x8686: 0x5535, - 0x8687: 0x5536, - 0x8688: 0x5538, - 0x8689: 0x5539, - 0x868A: 0x553A, - 0x868B: 0x553B, - 0x868C: 0x553D, - 0x868D: 0x5540, - 0x868E: 0x5542, - 0x868F: 0x5545, - 0x8690: 0x5547, - 0x8691: 0x5548, - 0x8692: 0x554B, - 0x8693: 0x554C, - 0x8694: 0x554D, - 0x8695: 0x554E, - 0x8696: 0x554F, - 0x8697: 0x5551, - 0x8698: 0x5552, - 0x8699: 0x5553, - 0x869A: 0x5554, - 0x869B: 0x5557, - 0x869C: 0x5558, - 0x869D: 0x5559, - 0x869E: 0x555A, - 0x869F: 0x555B, - 0x86A0: 0x555D, - 0x86A1: 0x555E, - 0x86A2: 0x555F, - 0x86A3: 0x5560, - 0x86A4: 0x5562, - 0x86A5: 0x5563, - 0x86A6: 0x5568, - 0x86A7: 0x5569, - 0x86A8: 0x556B, - 0x86A9: 0x556F, - 0x86AA: 0x5570, - 0x86AB: 0x5571, - 0x86AC: 0x5572, - 0x86AD: 0x5573, - 0x86AE: 0x5574, - 0x86AF: 0x5579, - 0x86B0: 0x557A, - 0x86B1: 0x557D, - 0x86B2: 0x557F, - 0x86B3: 0x5585, - 0x86B4: 0x5586, - 0x86B5: 0x558C, - 0x86B6: 0x558D, - 0x86B7: 0x558E, - 0x86B8: 0x5590, - 0x86B9: 0x5592, - 0x86BA: 0x5593, - 0x86BB: 0x5595, - 0x86BC: 0x5596, - 0x86BD: 0x5597, - 0x86BE: 0x559A, - 0x86BF: 0x559B, - 0x86C0: 0x559E, - 0x86C1: 0x55A0, - 0x86C2: 0x55A1, - 0x86C3: 0x55A2, - 0x86C4: 0x55A3, - 0x86C5: 0x55A4, - 0x86C6: 0x55A5, - 0x86C7: 0x55A6, - 0x86C8: 0x55A8, - 0x86C9: 0x55A9, - 0x86CA: 0x55AA, - 0x86CB: 0x55AB, - 0x86CC: 0x55AC, - 0x86CD: 0x55AD, - 0x86CE: 0x55AE, - 0x86CF: 0x55AF, - 0x86D0: 0x55B0, - 0x86D1: 0x55B2, - 0x86D2: 0x55B4, - 0x86D3: 0x55B6, - 0x86D4: 0x55B8, - 0x86D5: 0x55BA, - 0x86D6: 0x55BC, - 0x86D7: 0x55BF, - 0x86D8: 0x55C0, - 0x86D9: 0x55C1, - 0x86DA: 0x55C2, - 0x86DB: 0x55C3, - 0x86DC: 0x55C6, - 0x86DD: 0x55C7, - 0x86DE: 0x55C8, - 0x86DF: 0x55CA, - 0x86E0: 0x55CB, - 0x86E1: 0x55CE, - 0x86E2: 0x55CF, - 0x86E3: 0x55D0, - 0x86E4: 0x55D5, - 0x86E5: 0x55D7, - 0x86E6: 0x55D8, - 0x86E7: 0x55D9, - 0x86E8: 0x55DA, - 0x86E9: 0x55DB, - 0x86EA: 0x55DE, - 0x86EB: 0x55E0, - 0x86EC: 0x55E2, - 0x86ED: 0x55E7, - 0x86EE: 0x55E9, - 0x86EF: 0x55ED, - 0x86F0: 0x55EE, - 0x86F1: 0x55F0, - 0x86F2: 0x55F1, - 0x86F3: 0x55F4, - 0x86F4: 0x55F6, - 0x86F5: 0x55F8, - 0x86F6: 0x55F9, - 0x86F7: 0x55FA, - 0x86F8: 0x55FB, - 0x86F9: 0x55FC, - 0x86FA: 0x55FF, - 0x86FB: 0x5602, - 0x86FC: 0x5603, - 0x86FD: 0x5604, - 0x86FE: 0x5605, - 0x8740: 0x5606, - 0x8741: 0x5607, - 0x8742: 0x560A, - 0x8743: 0x560B, - 0x8744: 0x560D, - 0x8745: 0x5610, - 0x8746: 0x5611, - 0x8747: 0x5612, - 0x8748: 0x5613, - 0x8749: 0x5614, - 0x874A: 0x5615, - 0x874B: 0x5616, - 0x874C: 0x5617, - 0x874D: 0x5619, - 0x874E: 0x561A, - 0x874F: 0x561C, - 0x8750: 0x561D, - 0x8751: 0x5620, - 0x8752: 0x5621, - 0x8753: 0x5622, - 0x8754: 0x5625, - 0x8755: 0x5626, - 0x8756: 0x5628, - 0x8757: 0x5629, - 0x8758: 0x562A, - 0x8759: 0x562B, - 0x875A: 0x562E, - 0x875B: 0x562F, - 0x875C: 0x5630, - 0x875D: 0x5633, - 0x875E: 0x5635, - 0x875F: 0x5637, - 0x8760: 0x5638, - 0x8761: 0x563A, - 0x8762: 0x563C, - 0x8763: 0x563D, - 0x8764: 0x563E, - 0x8765: 0x5640, - 0x8766: 0x5641, - 0x8767: 0x5642, - 0x8768: 0x5643, - 0x8769: 0x5644, - 0x876A: 0x5645, - 0x876B: 0x5646, - 0x876C: 0x5647, - 0x876D: 0x5648, - 0x876E: 0x5649, - 0x876F: 0x564A, - 0x8770: 0x564B, - 0x8771: 0x564F, - 0x8772: 0x5650, - 0x8773: 0x5651, - 0x8774: 0x5652, - 0x8775: 0x5653, - 0x8776: 0x5655, - 0x8777: 0x5656, - 0x8778: 0x565A, - 0x8779: 0x565B, - 0x877A: 0x565D, - 0x877B: 0x565E, - 0x877C: 0x565F, - 0x877D: 0x5660, - 0x877E: 0x5661, - 0x8780: 0x5663, - 0x8781: 0x5665, - 0x8782: 0x5666, - 0x8783: 0x5667, - 0x8784: 0x566D, - 0x8785: 0x566E, - 0x8786: 0x566F, - 0x8787: 0x5670, - 0x8788: 0x5672, - 0x8789: 0x5673, - 0x878A: 0x5674, - 0x878B: 0x5675, - 0x878C: 0x5677, - 0x878D: 0x5678, - 0x878E: 0x5679, - 0x878F: 0x567A, - 0x8790: 0x567D, - 0x8791: 0x567E, - 0x8792: 0x567F, - 0x8793: 0x5680, - 0x8794: 0x5681, - 0x8795: 0x5682, - 0x8796: 0x5683, - 0x8797: 0x5684, - 0x8798: 0x5687, - 0x8799: 0x5688, - 0x879A: 0x5689, - 0x879B: 0x568A, - 0x879C: 0x568B, - 0x879D: 0x568C, - 0x879E: 0x568D, - 0x879F: 0x5690, - 0x87A0: 0x5691, - 0x87A1: 0x5692, - 0x87A2: 0x5694, - 0x87A3: 0x5695, - 0x87A4: 0x5696, - 0x87A5: 0x5697, - 0x87A6: 0x5698, - 0x87A7: 0x5699, - 0x87A8: 0x569A, - 0x87A9: 0x569B, - 0x87AA: 0x569C, - 0x87AB: 0x569D, - 0x87AC: 0x569E, - 0x87AD: 0x569F, - 0x87AE: 0x56A0, - 0x87AF: 0x56A1, - 0x87B0: 0x56A2, - 0x87B1: 0x56A4, - 0x87B2: 0x56A5, - 0x87B3: 0x56A6, - 0x87B4: 0x56A7, - 0x87B5: 0x56A8, - 0x87B6: 0x56A9, - 0x87B7: 0x56AA, - 0x87B8: 0x56AB, - 0x87B9: 0x56AC, - 0x87BA: 0x56AD, - 0x87BB: 0x56AE, - 0x87BC: 0x56B0, - 0x87BD: 0x56B1, - 0x87BE: 0x56B2, - 0x87BF: 0x56B3, - 0x87C0: 0x56B4, - 0x87C1: 0x56B5, - 0x87C2: 0x56B6, - 0x87C3: 0x56B8, - 0x87C4: 0x56B9, - 0x87C5: 0x56BA, - 0x87C6: 0x56BB, - 0x87C7: 0x56BD, - 0x87C8: 0x56BE, - 0x87C9: 0x56BF, - 0x87CA: 0x56C0, - 0x87CB: 0x56C1, - 0x87CC: 0x56C2, - 0x87CD: 0x56C3, - 0x87CE: 0x56C4, - 0x87CF: 0x56C5, - 0x87D0: 0x56C6, - 0x87D1: 0x56C7, - 0x87D2: 0x56C8, - 0x87D3: 0x56C9, - 0x87D4: 0x56CB, - 0x87D5: 0x56CC, - 0x87D6: 0x56CD, - 0x87D7: 0x56CE, - 0x87D8: 0x56CF, - 0x87D9: 0x56D0, - 0x87DA: 0x56D1, - 0x87DB: 0x56D2, - 0x87DC: 0x56D3, - 0x87DD: 0x56D5, - 0x87DE: 0x56D6, - 0x87DF: 0x56D8, - 0x87E0: 0x56D9, - 0x87E1: 0x56DC, - 0x87E2: 0x56E3, - 0x87E3: 0x56E5, - 0x87E4: 0x56E6, - 0x87E5: 0x56E7, - 0x87E6: 0x56E8, - 0x87E7: 0x56E9, - 0x87E8: 0x56EA, - 0x87E9: 0x56EC, - 0x87EA: 0x56EE, - 0x87EB: 0x56EF, - 0x87EC: 0x56F2, - 0x87ED: 0x56F3, - 0x87EE: 0x56F6, - 0x87EF: 0x56F7, - 0x87F0: 0x56F8, - 0x87F1: 0x56FB, - 0x87F2: 0x56FC, - 0x87F3: 0x5700, - 0x87F4: 0x5701, - 0x87F5: 0x5702, - 0x87F6: 0x5705, - 0x87F7: 0x5707, - 0x87F8: 0x570B, - 0x87F9: 0x570C, - 0x87FA: 0x570D, - 0x87FB: 0x570E, - 0x87FC: 0x570F, - 0x87FD: 0x5710, - 0x87FE: 0x5711, - 0x8840: 0x5712, - 0x8841: 0x5713, - 0x8842: 0x5714, - 0x8843: 0x5715, - 0x8844: 0x5716, - 0x8845: 0x5717, - 0x8846: 0x5718, - 0x8847: 0x5719, - 0x8848: 0x571A, - 0x8849: 0x571B, - 0x884A: 0x571D, - 0x884B: 0x571E, - 0x884C: 0x5720, - 0x884D: 0x5721, - 0x884E: 0x5722, - 0x884F: 0x5724, - 0x8850: 0x5725, - 0x8851: 0x5726, - 0x8852: 0x5727, - 0x8853: 0x572B, - 0x8854: 0x5731, - 0x8855: 0x5732, - 0x8856: 0x5734, - 0x8857: 0x5735, - 0x8858: 0x5736, - 0x8859: 0x5737, - 0x885A: 0x5738, - 0x885B: 0x573C, - 0x885C: 0x573D, - 0x885D: 0x573F, - 0x885E: 0x5741, - 0x885F: 0x5743, - 0x8860: 0x5744, - 0x8861: 0x5745, - 0x8862: 0x5746, - 0x8863: 0x5748, - 0x8864: 0x5749, - 0x8865: 0x574B, - 0x8866: 0x5752, - 0x8867: 0x5753, - 0x8868: 0x5754, - 0x8869: 0x5755, - 0x886A: 0x5756, - 0x886B: 0x5758, - 0x886C: 0x5759, - 0x886D: 0x5762, - 0x886E: 0x5763, - 0x886F: 0x5765, - 0x8870: 0x5767, - 0x8871: 0x576C, - 0x8872: 0x576E, - 0x8873: 0x5770, - 0x8874: 0x5771, - 0x8875: 0x5772, - 0x8876: 0x5774, - 0x8877: 0x5775, - 0x8878: 0x5778, - 0x8879: 0x5779, - 0x887A: 0x577A, - 0x887B: 0x577D, - 0x887C: 0x577E, - 0x887D: 0x577F, - 0x887E: 0x5780, - 0x8880: 0x5781, - 0x8881: 0x5787, - 0x8882: 0x5788, - 0x8883: 0x5789, - 0x8884: 0x578A, - 0x8885: 0x578D, - 0x8886: 0x578E, - 0x8887: 0x578F, - 0x8888: 0x5790, - 0x8889: 0x5791, - 0x888A: 0x5794, - 0x888B: 0x5795, - 0x888C: 0x5796, - 0x888D: 0x5797, - 0x888E: 0x5798, - 0x888F: 0x5799, - 0x8890: 0x579A, - 0x8891: 0x579C, - 0x8892: 0x579D, - 0x8893: 0x579E, - 0x8894: 0x579F, - 0x8895: 0x57A5, - 0x8896: 0x57A8, - 0x8897: 0x57AA, - 0x8898: 0x57AC, - 0x8899: 0x57AF, - 0x889A: 0x57B0, - 0x889B: 0x57B1, - 0x889C: 0x57B3, - 0x889D: 0x57B5, - 0x889E: 0x57B6, - 0x889F: 0x57B7, - 0x88A0: 0x57B9, - 0x88A1: 0x57BA, - 0x88A2: 0x57BB, - 0x88A3: 0x57BC, - 0x88A4: 0x57BD, - 0x88A5: 0x57BE, - 0x88A6: 0x57BF, - 0x88A7: 0x57C0, - 0x88A8: 0x57C1, - 0x88A9: 0x57C4, - 0x88AA: 0x57C5, - 0x88AB: 0x57C6, - 0x88AC: 0x57C7, - 0x88AD: 0x57C8, - 0x88AE: 0x57C9, - 0x88AF: 0x57CA, - 0x88B0: 0x57CC, - 0x88B1: 0x57CD, - 0x88B2: 0x57D0, - 0x88B3: 0x57D1, - 0x88B4: 0x57D3, - 0x88B5: 0x57D6, - 0x88B6: 0x57D7, - 0x88B7: 0x57DB, - 0x88B8: 0x57DC, - 0x88B9: 0x57DE, - 0x88BA: 0x57E1, - 0x88BB: 0x57E2, - 0x88BC: 0x57E3, - 0x88BD: 0x57E5, - 0x88BE: 0x57E6, - 0x88BF: 0x57E7, - 0x88C0: 0x57E8, - 0x88C1: 0x57E9, - 0x88C2: 0x57EA, - 0x88C3: 0x57EB, - 0x88C4: 0x57EC, - 0x88C5: 0x57EE, - 0x88C6: 0x57F0, - 0x88C7: 0x57F1, - 0x88C8: 0x57F2, - 0x88C9: 0x57F3, - 0x88CA: 0x57F5, - 0x88CB: 0x57F6, - 0x88CC: 0x57F7, - 0x88CD: 0x57FB, - 0x88CE: 0x57FC, - 0x88CF: 0x57FE, - 0x88D0: 0x57FF, - 0x88D1: 0x5801, - 0x88D2: 0x5803, - 0x88D3: 0x5804, - 0x88D4: 0x5805, - 0x88D5: 0x5808, - 0x88D6: 0x5809, - 0x88D7: 0x580A, - 0x88D8: 0x580C, - 0x88D9: 0x580E, - 0x88DA: 0x580F, - 0x88DB: 0x5810, - 0x88DC: 0x5812, - 0x88DD: 0x5813, - 0x88DE: 0x5814, - 0x88DF: 0x5816, - 0x88E0: 0x5817, - 0x88E1: 0x5818, - 0x88E2: 0x581A, - 0x88E3: 0x581B, - 0x88E4: 0x581C, - 0x88E5: 0x581D, - 0x88E6: 0x581F, - 0x88E7: 0x5822, - 0x88E8: 0x5823, - 0x88E9: 0x5825, - 0x88EA: 0x5826, - 0x88EB: 0x5827, - 0x88EC: 0x5828, - 0x88ED: 0x5829, - 0x88EE: 0x582B, - 0x88EF: 0x582C, - 0x88F0: 0x582D, - 0x88F1: 0x582E, - 0x88F2: 0x582F, - 0x88F3: 0x5831, - 0x88F4: 0x5832, - 0x88F5: 0x5833, - 0x88F6: 0x5834, - 0x88F7: 0x5836, - 0x88F8: 0x5837, - 0x88F9: 0x5838, - 0x88FA: 0x5839, - 0x88FB: 0x583A, - 0x88FC: 0x583B, - 0x88FD: 0x583C, - 0x88FE: 0x583D, - 0x8940: 0x583E, - 0x8941: 0x583F, - 0x8942: 0x5840, - 0x8943: 0x5841, - 0x8944: 0x5842, - 0x8945: 0x5843, - 0x8946: 0x5845, - 0x8947: 0x5846, - 0x8948: 0x5847, - 0x8949: 0x5848, - 0x894A: 0x5849, - 0x894B: 0x584A, - 0x894C: 0x584B, - 0x894D: 0x584E, - 0x894E: 0x584F, - 0x894F: 0x5850, - 0x8950: 0x5852, - 0x8951: 0x5853, - 0x8952: 0x5855, - 0x8953: 0x5856, - 0x8954: 0x5857, - 0x8955: 0x5859, - 0x8956: 0x585A, - 0x8957: 0x585B, - 0x8958: 0x585C, - 0x8959: 0x585D, - 0x895A: 0x585F, - 0x895B: 0x5860, - 0x895C: 0x5861, - 0x895D: 0x5862, - 0x895E: 0x5863, - 0x895F: 0x5864, - 0x8960: 0x5866, - 0x8961: 0x5867, - 0x8962: 0x5868, - 0x8963: 0x5869, - 0x8964: 0x586A, - 0x8965: 0x586D, - 0x8966: 0x586E, - 0x8967: 0x586F, - 0x8968: 0x5870, - 0x8969: 0x5871, - 0x896A: 0x5872, - 0x896B: 0x5873, - 0x896C: 0x5874, - 0x896D: 0x5875, - 0x896E: 0x5876, - 0x896F: 0x5877, - 0x8970: 0x5878, - 0x8971: 0x5879, - 0x8972: 0x587A, - 0x8973: 0x587B, - 0x8974: 0x587C, - 0x8975: 0x587D, - 0x8976: 0x587F, - 0x8977: 0x5882, - 0x8978: 0x5884, - 0x8979: 0x5886, - 0x897A: 0x5887, - 0x897B: 0x5888, - 0x897C: 0x588A, - 0x897D: 0x588B, - 0x897E: 0x588C, - 0x8980: 0x588D, - 0x8981: 0x588E, - 0x8982: 0x588F, - 0x8983: 0x5890, - 0x8984: 0x5891, - 0x8985: 0x5894, - 0x8986: 0x5895, - 0x8987: 0x5896, - 0x8988: 0x5897, - 0x8989: 0x5898, - 0x898A: 0x589B, - 0x898B: 0x589C, - 0x898C: 0x589D, - 0x898D: 0x58A0, - 0x898E: 0x58A1, - 0x898F: 0x58A2, - 0x8990: 0x58A3, - 0x8991: 0x58A4, - 0x8992: 0x58A5, - 0x8993: 0x58A6, - 0x8994: 0x58A7, - 0x8995: 0x58AA, - 0x8996: 0x58AB, - 0x8997: 0x58AC, - 0x8998: 0x58AD, - 0x8999: 0x58AE, - 0x899A: 0x58AF, - 0x899B: 0x58B0, - 0x899C: 0x58B1, - 0x899D: 0x58B2, - 0x899E: 0x58B3, - 0x899F: 0x58B4, - 0x89A0: 0x58B5, - 0x89A1: 0x58B6, - 0x89A2: 0x58B7, - 0x89A3: 0x58B8, - 0x89A4: 0x58B9, - 0x89A5: 0x58BA, - 0x89A6: 0x58BB, - 0x89A7: 0x58BD, - 0x89A8: 0x58BE, - 0x89A9: 0x58BF, - 0x89AA: 0x58C0, - 0x89AB: 0x58C2, - 0x89AC: 0x58C3, - 0x89AD: 0x58C4, - 0x89AE: 0x58C6, - 0x89AF: 0x58C7, - 0x89B0: 0x58C8, - 0x89B1: 0x58C9, - 0x89B2: 0x58CA, - 0x89B3: 0x58CB, - 0x89B4: 0x58CC, - 0x89B5: 0x58CD, - 0x89B6: 0x58CE, - 0x89B7: 0x58CF, - 0x89B8: 0x58D0, - 0x89B9: 0x58D2, - 0x89BA: 0x58D3, - 0x89BB: 0x58D4, - 0x89BC: 0x58D6, - 0x89BD: 0x58D7, - 0x89BE: 0x58D8, - 0x89BF: 0x58D9, - 0x89C0: 0x58DA, - 0x89C1: 0x58DB, - 0x89C2: 0x58DC, - 0x89C3: 0x58DD, - 0x89C4: 0x58DE, - 0x89C5: 0x58DF, - 0x89C6: 0x58E0, - 0x89C7: 0x58E1, - 0x89C8: 0x58E2, - 0x89C9: 0x58E3, - 0x89CA: 0x58E5, - 0x89CB: 0x58E6, - 0x89CC: 0x58E7, - 0x89CD: 0x58E8, - 0x89CE: 0x58E9, - 0x89CF: 0x58EA, - 0x89D0: 0x58ED, - 0x89D1: 0x58EF, - 0x89D2: 0x58F1, - 0x89D3: 0x58F2, - 0x89D4: 0x58F4, - 0x89D5: 0x58F5, - 0x89D6: 0x58F7, - 0x89D7: 0x58F8, - 0x89D8: 0x58FA, - 0x89D9: 0x58FB, - 0x89DA: 0x58FC, - 0x89DB: 0x58FD, - 0x89DC: 0x58FE, - 0x89DD: 0x58FF, - 0x89DE: 0x5900, - 0x89DF: 0x5901, - 0x89E0: 0x5903, - 0x89E1: 0x5905, - 0x89E2: 0x5906, - 0x89E3: 0x5908, - 0x89E4: 0x5909, - 0x89E5: 0x590A, - 0x89E6: 0x590B, - 0x89E7: 0x590C, - 0x89E8: 0x590E, - 0x89E9: 0x5910, - 0x89EA: 0x5911, - 0x89EB: 0x5912, - 0x89EC: 0x5913, - 0x89ED: 0x5917, - 0x89EE: 0x5918, - 0x89EF: 0x591B, - 0x89F0: 0x591D, - 0x89F1: 0x591E, - 0x89F2: 0x5920, - 0x89F3: 0x5921, - 0x89F4: 0x5922, - 0x89F5: 0x5923, - 0x89F6: 0x5926, - 0x89F7: 0x5928, - 0x89F8: 0x592C, - 0x89F9: 0x5930, - 0x89FA: 0x5932, - 0x89FB: 0x5933, - 0x89FC: 0x5935, - 0x89FD: 0x5936, - 0x89FE: 0x593B, - 0x8A40: 0x593D, - 0x8A41: 0x593E, - 0x8A42: 0x593F, - 0x8A43: 0x5940, - 0x8A44: 0x5943, - 0x8A45: 0x5945, - 0x8A46: 0x5946, - 0x8A47: 0x594A, - 0x8A48: 0x594C, - 0x8A49: 0x594D, - 0x8A4A: 0x5950, - 0x8A4B: 0x5952, - 0x8A4C: 0x5953, - 0x8A4D: 0x5959, - 0x8A4E: 0x595B, - 0x8A4F: 0x595C, - 0x8A50: 0x595D, - 0x8A51: 0x595E, - 0x8A52: 0x595F, - 0x8A53: 0x5961, - 0x8A54: 0x5963, - 0x8A55: 0x5964, - 0x8A56: 0x5966, - 0x8A57: 0x5967, - 0x8A58: 0x5968, - 0x8A59: 0x5969, - 0x8A5A: 0x596A, - 0x8A5B: 0x596B, - 0x8A5C: 0x596C, - 0x8A5D: 0x596D, - 0x8A5E: 0x596E, - 0x8A5F: 0x596F, - 0x8A60: 0x5970, - 0x8A61: 0x5971, - 0x8A62: 0x5972, - 0x8A63: 0x5975, - 0x8A64: 0x5977, - 0x8A65: 0x597A, - 0x8A66: 0x597B, - 0x8A67: 0x597C, - 0x8A68: 0x597E, - 0x8A69: 0x597F, - 0x8A6A: 0x5980, - 0x8A6B: 0x5985, - 0x8A6C: 0x5989, - 0x8A6D: 0x598B, - 0x8A6E: 0x598C, - 0x8A6F: 0x598E, - 0x8A70: 0x598F, - 0x8A71: 0x5990, - 0x8A72: 0x5991, - 0x8A73: 0x5994, - 0x8A74: 0x5995, - 0x8A75: 0x5998, - 0x8A76: 0x599A, - 0x8A77: 0x599B, - 0x8A78: 0x599C, - 0x8A79: 0x599D, - 0x8A7A: 0x599F, - 0x8A7B: 0x59A0, - 0x8A7C: 0x59A1, - 0x8A7D: 0x59A2, - 0x8A7E: 0x59A6, - 0x8A80: 0x59A7, - 0x8A81: 0x59AC, - 0x8A82: 0x59AD, - 0x8A83: 0x59B0, - 0x8A84: 0x59B1, - 0x8A85: 0x59B3, - 0x8A86: 0x59B4, - 0x8A87: 0x59B5, - 0x8A88: 0x59B6, - 0x8A89: 0x59B7, - 0x8A8A: 0x59B8, - 0x8A8B: 0x59BA, - 0x8A8C: 0x59BC, - 0x8A8D: 0x59BD, - 0x8A8E: 0x59BF, - 0x8A8F: 0x59C0, - 0x8A90: 0x59C1, - 0x8A91: 0x59C2, - 0x8A92: 0x59C3, - 0x8A93: 0x59C4, - 0x8A94: 0x59C5, - 0x8A95: 0x59C7, - 0x8A96: 0x59C8, - 0x8A97: 0x59C9, - 0x8A98: 0x59CC, - 0x8A99: 0x59CD, - 0x8A9A: 0x59CE, - 0x8A9B: 0x59CF, - 0x8A9C: 0x59D5, - 0x8A9D: 0x59D6, - 0x8A9E: 0x59D9, - 0x8A9F: 0x59DB, - 0x8AA0: 0x59DE, - 0x8AA1: 0x59DF, - 0x8AA2: 0x59E0, - 0x8AA3: 0x59E1, - 0x8AA4: 0x59E2, - 0x8AA5: 0x59E4, - 0x8AA6: 0x59E6, - 0x8AA7: 0x59E7, - 0x8AA8: 0x59E9, - 0x8AA9: 0x59EA, - 0x8AAA: 0x59EB, - 0x8AAB: 0x59ED, - 0x8AAC: 0x59EE, - 0x8AAD: 0x59EF, - 0x8AAE: 0x59F0, - 0x8AAF: 0x59F1, - 0x8AB0: 0x59F2, - 0x8AB1: 0x59F3, - 0x8AB2: 0x59F4, - 0x8AB3: 0x59F5, - 0x8AB4: 0x59F6, - 0x8AB5: 0x59F7, - 0x8AB6: 0x59F8, - 0x8AB7: 0x59FA, - 0x8AB8: 0x59FC, - 0x8AB9: 0x59FD, - 0x8ABA: 0x59FE, - 0x8ABB: 0x5A00, - 0x8ABC: 0x5A02, - 0x8ABD: 0x5A0A, - 0x8ABE: 0x5A0B, - 0x8ABF: 0x5A0D, - 0x8AC0: 0x5A0E, - 0x8AC1: 0x5A0F, - 0x8AC2: 0x5A10, - 0x8AC3: 0x5A12, - 0x8AC4: 0x5A14, - 0x8AC5: 0x5A15, - 0x8AC6: 0x5A16, - 0x8AC7: 0x5A17, - 0x8AC8: 0x5A19, - 0x8AC9: 0x5A1A, - 0x8ACA: 0x5A1B, - 0x8ACB: 0x5A1D, - 0x8ACC: 0x5A1E, - 0x8ACD: 0x5A21, - 0x8ACE: 0x5A22, - 0x8ACF: 0x5A24, - 0x8AD0: 0x5A26, - 0x8AD1: 0x5A27, - 0x8AD2: 0x5A28, - 0x8AD3: 0x5A2A, - 0x8AD4: 0x5A2B, - 0x8AD5: 0x5A2C, - 0x8AD6: 0x5A2D, - 0x8AD7: 0x5A2E, - 0x8AD8: 0x5A2F, - 0x8AD9: 0x5A30, - 0x8ADA: 0x5A33, - 0x8ADB: 0x5A35, - 0x8ADC: 0x5A37, - 0x8ADD: 0x5A38, - 0x8ADE: 0x5A39, - 0x8ADF: 0x5A3A, - 0x8AE0: 0x5A3B, - 0x8AE1: 0x5A3D, - 0x8AE2: 0x5A3E, - 0x8AE3: 0x5A3F, - 0x8AE4: 0x5A41, - 0x8AE5: 0x5A42, - 0x8AE6: 0x5A43, - 0x8AE7: 0x5A44, - 0x8AE8: 0x5A45, - 0x8AE9: 0x5A47, - 0x8AEA: 0x5A48, - 0x8AEB: 0x5A4B, - 0x8AEC: 0x5A4C, - 0x8AED: 0x5A4D, - 0x8AEE: 0x5A4E, - 0x8AEF: 0x5A4F, - 0x8AF0: 0x5A50, - 0x8AF1: 0x5A51, - 0x8AF2: 0x5A52, - 0x8AF3: 0x5A53, - 0x8AF4: 0x5A54, - 0x8AF5: 0x5A56, - 0x8AF6: 0x5A57, - 0x8AF7: 0x5A58, - 0x8AF8: 0x5A59, - 0x8AF9: 0x5A5B, - 0x8AFA: 0x5A5C, - 0x8AFB: 0x5A5D, - 0x8AFC: 0x5A5E, - 0x8AFD: 0x5A5F, - 0x8AFE: 0x5A60, - 0x8B40: 0x5A61, - 0x8B41: 0x5A63, - 0x8B42: 0x5A64, - 0x8B43: 0x5A65, - 0x8B44: 0x5A66, - 0x8B45: 0x5A68, - 0x8B46: 0x5A69, - 0x8B47: 0x5A6B, - 0x8B48: 0x5A6C, - 0x8B49: 0x5A6D, - 0x8B4A: 0x5A6E, - 0x8B4B: 0x5A6F, - 0x8B4C: 0x5A70, - 0x8B4D: 0x5A71, - 0x8B4E: 0x5A72, - 0x8B4F: 0x5A73, - 0x8B50: 0x5A78, - 0x8B51: 0x5A79, - 0x8B52: 0x5A7B, - 0x8B53: 0x5A7C, - 0x8B54: 0x5A7D, - 0x8B55: 0x5A7E, - 0x8B56: 0x5A80, - 0x8B57: 0x5A81, - 0x8B58: 0x5A82, - 0x8B59: 0x5A83, - 0x8B5A: 0x5A84, - 0x8B5B: 0x5A85, - 0x8B5C: 0x5A86, - 0x8B5D: 0x5A87, - 0x8B5E: 0x5A88, - 0x8B5F: 0x5A89, - 0x8B60: 0x5A8A, - 0x8B61: 0x5A8B, - 0x8B62: 0x5A8C, - 0x8B63: 0x5A8D, - 0x8B64: 0x5A8E, - 0x8B65: 0x5A8F, - 0x8B66: 0x5A90, - 0x8B67: 0x5A91, - 0x8B68: 0x5A93, - 0x8B69: 0x5A94, - 0x8B6A: 0x5A95, - 0x8B6B: 0x5A96, - 0x8B6C: 0x5A97, - 0x8B6D: 0x5A98, - 0x8B6E: 0x5A99, - 0x8B6F: 0x5A9C, - 0x8B70: 0x5A9D, - 0x8B71: 0x5A9E, - 0x8B72: 0x5A9F, - 0x8B73: 0x5AA0, - 0x8B74: 0x5AA1, - 0x8B75: 0x5AA2, - 0x8B76: 0x5AA3, - 0x8B77: 0x5AA4, - 0x8B78: 0x5AA5, - 0x8B79: 0x5AA6, - 0x8B7A: 0x5AA7, - 0x8B7B: 0x5AA8, - 0x8B7C: 0x5AA9, - 0x8B7D: 0x5AAB, - 0x8B7E: 0x5AAC, - 0x8B80: 0x5AAD, - 0x8B81: 0x5AAE, - 0x8B82: 0x5AAF, - 0x8B83: 0x5AB0, - 0x8B84: 0x5AB1, - 0x8B85: 0x5AB4, - 0x8B86: 0x5AB6, - 0x8B87: 0x5AB7, - 0x8B88: 0x5AB9, - 0x8B89: 0x5ABA, - 0x8B8A: 0x5ABB, - 0x8B8B: 0x5ABC, - 0x8B8C: 0x5ABD, - 0x8B8D: 0x5ABF, - 0x8B8E: 0x5AC0, - 0x8B8F: 0x5AC3, - 0x8B90: 0x5AC4, - 0x8B91: 0x5AC5, - 0x8B92: 0x5AC6, - 0x8B93: 0x5AC7, - 0x8B94: 0x5AC8, - 0x8B95: 0x5ACA, - 0x8B96: 0x5ACB, - 0x8B97: 0x5ACD, - 0x8B98: 0x5ACE, - 0x8B99: 0x5ACF, - 0x8B9A: 0x5AD0, - 0x8B9B: 0x5AD1, - 0x8B9C: 0x5AD3, - 0x8B9D: 0x5AD5, - 0x8B9E: 0x5AD7, - 0x8B9F: 0x5AD9, - 0x8BA0: 0x5ADA, - 0x8BA1: 0x5ADB, - 0x8BA2: 0x5ADD, - 0x8BA3: 0x5ADE, - 0x8BA4: 0x5ADF, - 0x8BA5: 0x5AE2, - 0x8BA6: 0x5AE4, - 0x8BA7: 0x5AE5, - 0x8BA8: 0x5AE7, - 0x8BA9: 0x5AE8, - 0x8BAA: 0x5AEA, - 0x8BAB: 0x5AEC, - 0x8BAC: 0x5AED, - 0x8BAD: 0x5AEE, - 0x8BAE: 0x5AEF, - 0x8BAF: 0x5AF0, - 0x8BB0: 0x5AF2, - 0x8BB1: 0x5AF3, - 0x8BB2: 0x5AF4, - 0x8BB3: 0x5AF5, - 0x8BB4: 0x5AF6, - 0x8BB5: 0x5AF7, - 0x8BB6: 0x5AF8, - 0x8BB7: 0x5AF9, - 0x8BB8: 0x5AFA, - 0x8BB9: 0x5AFB, - 0x8BBA: 0x5AFC, - 0x8BBB: 0x5AFD, - 0x8BBC: 0x5AFE, - 0x8BBD: 0x5AFF, - 0x8BBE: 0x5B00, - 0x8BBF: 0x5B01, - 0x8BC0: 0x5B02, - 0x8BC1: 0x5B03, - 0x8BC2: 0x5B04, - 0x8BC3: 0x5B05, - 0x8BC4: 0x5B06, - 0x8BC5: 0x5B07, - 0x8BC6: 0x5B08, - 0x8BC7: 0x5B0A, - 0x8BC8: 0x5B0B, - 0x8BC9: 0x5B0C, - 0x8BCA: 0x5B0D, - 0x8BCB: 0x5B0E, - 0x8BCC: 0x5B0F, - 0x8BCD: 0x5B10, - 0x8BCE: 0x5B11, - 0x8BCF: 0x5B12, - 0x8BD0: 0x5B13, - 0x8BD1: 0x5B14, - 0x8BD2: 0x5B15, - 0x8BD3: 0x5B18, - 0x8BD4: 0x5B19, - 0x8BD5: 0x5B1A, - 0x8BD6: 0x5B1B, - 0x8BD7: 0x5B1C, - 0x8BD8: 0x5B1D, - 0x8BD9: 0x5B1E, - 0x8BDA: 0x5B1F, - 0x8BDB: 0x5B20, - 0x8BDC: 0x5B21, - 0x8BDD: 0x5B22, - 0x8BDE: 0x5B23, - 0x8BDF: 0x5B24, - 0x8BE0: 0x5B25, - 0x8BE1: 0x5B26, - 0x8BE2: 0x5B27, - 0x8BE3: 0x5B28, - 0x8BE4: 0x5B29, - 0x8BE5: 0x5B2A, - 0x8BE6: 0x5B2B, - 0x8BE7: 0x5B2C, - 0x8BE8: 0x5B2D, - 0x8BE9: 0x5B2E, - 0x8BEA: 0x5B2F, - 0x8BEB: 0x5B30, - 0x8BEC: 0x5B31, - 0x8BED: 0x5B33, - 0x8BEE: 0x5B35, - 0x8BEF: 0x5B36, - 0x8BF0: 0x5B38, - 0x8BF1: 0x5B39, - 0x8BF2: 0x5B3A, - 0x8BF3: 0x5B3B, - 0x8BF4: 0x5B3C, - 0x8BF5: 0x5B3D, - 0x8BF6: 0x5B3E, - 0x8BF7: 0x5B3F, - 0x8BF8: 0x5B41, - 0x8BF9: 0x5B42, - 0x8BFA: 0x5B43, - 0x8BFB: 0x5B44, - 0x8BFC: 0x5B45, - 0x8BFD: 0x5B46, - 0x8BFE: 0x5B47, - 0x8C40: 0x5B48, - 0x8C41: 0x5B49, - 0x8C42: 0x5B4A, - 0x8C43: 0x5B4B, - 0x8C44: 0x5B4C, - 0x8C45: 0x5B4D, - 0x8C46: 0x5B4E, - 0x8C47: 0x5B4F, - 0x8C48: 0x5B52, - 0x8C49: 0x5B56, - 0x8C4A: 0x5B5E, - 0x8C4B: 0x5B60, - 0x8C4C: 0x5B61, - 0x8C4D: 0x5B67, - 0x8C4E: 0x5B68, - 0x8C4F: 0x5B6B, - 0x8C50: 0x5B6D, - 0x8C51: 0x5B6E, - 0x8C52: 0x5B6F, - 0x8C53: 0x5B72, - 0x8C54: 0x5B74, - 0x8C55: 0x5B76, - 0x8C56: 0x5B77, - 0x8C57: 0x5B78, - 0x8C58: 0x5B79, - 0x8C59: 0x5B7B, - 0x8C5A: 0x5B7C, - 0x8C5B: 0x5B7E, - 0x8C5C: 0x5B7F, - 0x8C5D: 0x5B82, - 0x8C5E: 0x5B86, - 0x8C5F: 0x5B8A, - 0x8C60: 0x5B8D, - 0x8C61: 0x5B8E, - 0x8C62: 0x5B90, - 0x8C63: 0x5B91, - 0x8C64: 0x5B92, - 0x8C65: 0x5B94, - 0x8C66: 0x5B96, - 0x8C67: 0x5B9F, - 0x8C68: 0x5BA7, - 0x8C69: 0x5BA8, - 0x8C6A: 0x5BA9, - 0x8C6B: 0x5BAC, - 0x8C6C: 0x5BAD, - 0x8C6D: 0x5BAE, - 0x8C6E: 0x5BAF, - 0x8C6F: 0x5BB1, - 0x8C70: 0x5BB2, - 0x8C71: 0x5BB7, - 0x8C72: 0x5BBA, - 0x8C73: 0x5BBB, - 0x8C74: 0x5BBC, - 0x8C75: 0x5BC0, - 0x8C76: 0x5BC1, - 0x8C77: 0x5BC3, - 0x8C78: 0x5BC8, - 0x8C79: 0x5BC9, - 0x8C7A: 0x5BCA, - 0x8C7B: 0x5BCB, - 0x8C7C: 0x5BCD, - 0x8C7D: 0x5BCE, - 0x8C7E: 0x5BCF, - 0x8C80: 0x5BD1, - 0x8C81: 0x5BD4, - 0x8C82: 0x5BD5, - 0x8C83: 0x5BD6, - 0x8C84: 0x5BD7, - 0x8C85: 0x5BD8, - 0x8C86: 0x5BD9, - 0x8C87: 0x5BDA, - 0x8C88: 0x5BDB, - 0x8C89: 0x5BDC, - 0x8C8A: 0x5BE0, - 0x8C8B: 0x5BE2, - 0x8C8C: 0x5BE3, - 0x8C8D: 0x5BE6, - 0x8C8E: 0x5BE7, - 0x8C8F: 0x5BE9, - 0x8C90: 0x5BEA, - 0x8C91: 0x5BEB, - 0x8C92: 0x5BEC, - 0x8C93: 0x5BED, - 0x8C94: 0x5BEF, - 0x8C95: 0x5BF1, - 0x8C96: 0x5BF2, - 0x8C97: 0x5BF3, - 0x8C98: 0x5BF4, - 0x8C99: 0x5BF5, - 0x8C9A: 0x5BF6, - 0x8C9B: 0x5BF7, - 0x8C9C: 0x5BFD, - 0x8C9D: 0x5BFE, - 0x8C9E: 0x5C00, - 0x8C9F: 0x5C02, - 0x8CA0: 0x5C03, - 0x8CA1: 0x5C05, - 0x8CA2: 0x5C07, - 0x8CA3: 0x5C08, - 0x8CA4: 0x5C0B, - 0x8CA5: 0x5C0C, - 0x8CA6: 0x5C0D, - 0x8CA7: 0x5C0E, - 0x8CA8: 0x5C10, - 0x8CA9: 0x5C12, - 0x8CAA: 0x5C13, - 0x8CAB: 0x5C17, - 0x8CAC: 0x5C19, - 0x8CAD: 0x5C1B, - 0x8CAE: 0x5C1E, - 0x8CAF: 0x5C1F, - 0x8CB0: 0x5C20, - 0x8CB1: 0x5C21, - 0x8CB2: 0x5C23, - 0x8CB3: 0x5C26, - 0x8CB4: 0x5C28, - 0x8CB5: 0x5C29, - 0x8CB6: 0x5C2A, - 0x8CB7: 0x5C2B, - 0x8CB8: 0x5C2D, - 0x8CB9: 0x5C2E, - 0x8CBA: 0x5C2F, - 0x8CBB: 0x5C30, - 0x8CBC: 0x5C32, - 0x8CBD: 0x5C33, - 0x8CBE: 0x5C35, - 0x8CBF: 0x5C36, - 0x8CC0: 0x5C37, - 0x8CC1: 0x5C43, - 0x8CC2: 0x5C44, - 0x8CC3: 0x5C46, - 0x8CC4: 0x5C47, - 0x8CC5: 0x5C4C, - 0x8CC6: 0x5C4D, - 0x8CC7: 0x5C52, - 0x8CC8: 0x5C53, - 0x8CC9: 0x5C54, - 0x8CCA: 0x5C56, - 0x8CCB: 0x5C57, - 0x8CCC: 0x5C58, - 0x8CCD: 0x5C5A, - 0x8CCE: 0x5C5B, - 0x8CCF: 0x5C5C, - 0x8CD0: 0x5C5D, - 0x8CD1: 0x5C5F, - 0x8CD2: 0x5C62, - 0x8CD3: 0x5C64, - 0x8CD4: 0x5C67, - 0x8CD5: 0x5C68, - 0x8CD6: 0x5C69, - 0x8CD7: 0x5C6A, - 0x8CD8: 0x5C6B, - 0x8CD9: 0x5C6C, - 0x8CDA: 0x5C6D, - 0x8CDB: 0x5C70, - 0x8CDC: 0x5C72, - 0x8CDD: 0x5C73, - 0x8CDE: 0x5C74, - 0x8CDF: 0x5C75, - 0x8CE0: 0x5C76, - 0x8CE1: 0x5C77, - 0x8CE2: 0x5C78, - 0x8CE3: 0x5C7B, - 0x8CE4: 0x5C7C, - 0x8CE5: 0x5C7D, - 0x8CE6: 0x5C7E, - 0x8CE7: 0x5C80, - 0x8CE8: 0x5C83, - 0x8CE9: 0x5C84, - 0x8CEA: 0x5C85, - 0x8CEB: 0x5C86, - 0x8CEC: 0x5C87, - 0x8CED: 0x5C89, - 0x8CEE: 0x5C8A, - 0x8CEF: 0x5C8B, - 0x8CF0: 0x5C8E, - 0x8CF1: 0x5C8F, - 0x8CF2: 0x5C92, - 0x8CF3: 0x5C93, - 0x8CF4: 0x5C95, - 0x8CF5: 0x5C9D, - 0x8CF6: 0x5C9E, - 0x8CF7: 0x5C9F, - 0x8CF8: 0x5CA0, - 0x8CF9: 0x5CA1, - 0x8CFA: 0x5CA4, - 0x8CFB: 0x5CA5, - 0x8CFC: 0x5CA6, - 0x8CFD: 0x5CA7, - 0x8CFE: 0x5CA8, - 0x8D40: 0x5CAA, - 0x8D41: 0x5CAE, - 0x8D42: 0x5CAF, - 0x8D43: 0x5CB0, - 0x8D44: 0x5CB2, - 0x8D45: 0x5CB4, - 0x8D46: 0x5CB6, - 0x8D47: 0x5CB9, - 0x8D48: 0x5CBA, - 0x8D49: 0x5CBB, - 0x8D4A: 0x5CBC, - 0x8D4B: 0x5CBE, - 0x8D4C: 0x5CC0, - 0x8D4D: 0x5CC2, - 0x8D4E: 0x5CC3, - 0x8D4F: 0x5CC5, - 0x8D50: 0x5CC6, - 0x8D51: 0x5CC7, - 0x8D52: 0x5CC8, - 0x8D53: 0x5CC9, - 0x8D54: 0x5CCA, - 0x8D55: 0x5CCC, - 0x8D56: 0x5CCD, - 0x8D57: 0x5CCE, - 0x8D58: 0x5CCF, - 0x8D59: 0x5CD0, - 0x8D5A: 0x5CD1, - 0x8D5B: 0x5CD3, - 0x8D5C: 0x5CD4, - 0x8D5D: 0x5CD5, - 0x8D5E: 0x5CD6, - 0x8D5F: 0x5CD7, - 0x8D60: 0x5CD8, - 0x8D61: 0x5CDA, - 0x8D62: 0x5CDB, - 0x8D63: 0x5CDC, - 0x8D64: 0x5CDD, - 0x8D65: 0x5CDE, - 0x8D66: 0x5CDF, - 0x8D67: 0x5CE0, - 0x8D68: 0x5CE2, - 0x8D69: 0x5CE3, - 0x8D6A: 0x5CE7, - 0x8D6B: 0x5CE9, - 0x8D6C: 0x5CEB, - 0x8D6D: 0x5CEC, - 0x8D6E: 0x5CEE, - 0x8D6F: 0x5CEF, - 0x8D70: 0x5CF1, - 0x8D71: 0x5CF2, - 0x8D72: 0x5CF3, - 0x8D73: 0x5CF4, - 0x8D74: 0x5CF5, - 0x8D75: 0x5CF6, - 0x8D76: 0x5CF7, - 0x8D77: 0x5CF8, - 0x8D78: 0x5CF9, - 0x8D79: 0x5CFA, - 0x8D7A: 0x5CFC, - 0x8D7B: 0x5CFD, - 0x8D7C: 0x5CFE, - 0x8D7D: 0x5CFF, - 0x8D7E: 0x5D00, - 0x8D80: 0x5D01, - 0x8D81: 0x5D04, - 0x8D82: 0x5D05, - 0x8D83: 0x5D08, - 0x8D84: 0x5D09, - 0x8D85: 0x5D0A, - 0x8D86: 0x5D0B, - 0x8D87: 0x5D0C, - 0x8D88: 0x5D0D, - 0x8D89: 0x5D0F, - 0x8D8A: 0x5D10, - 0x8D8B: 0x5D11, - 0x8D8C: 0x5D12, - 0x8D8D: 0x5D13, - 0x8D8E: 0x5D15, - 0x8D8F: 0x5D17, - 0x8D90: 0x5D18, - 0x8D91: 0x5D19, - 0x8D92: 0x5D1A, - 0x8D93: 0x5D1C, - 0x8D94: 0x5D1D, - 0x8D95: 0x5D1F, - 0x8D96: 0x5D20, - 0x8D97: 0x5D21, - 0x8D98: 0x5D22, - 0x8D99: 0x5D23, - 0x8D9A: 0x5D25, - 0x8D9B: 0x5D28, - 0x8D9C: 0x5D2A, - 0x8D9D: 0x5D2B, - 0x8D9E: 0x5D2C, - 0x8D9F: 0x5D2F, - 0x8DA0: 0x5D30, - 0x8DA1: 0x5D31, - 0x8DA2: 0x5D32, - 0x8DA3: 0x5D33, - 0x8DA4: 0x5D35, - 0x8DA5: 0x5D36, - 0x8DA6: 0x5D37, - 0x8DA7: 0x5D38, - 0x8DA8: 0x5D39, - 0x8DA9: 0x5D3A, - 0x8DAA: 0x5D3B, - 0x8DAB: 0x5D3C, - 0x8DAC: 0x5D3F, - 0x8DAD: 0x5D40, - 0x8DAE: 0x5D41, - 0x8DAF: 0x5D42, - 0x8DB0: 0x5D43, - 0x8DB1: 0x5D44, - 0x8DB2: 0x5D45, - 0x8DB3: 0x5D46, - 0x8DB4: 0x5D48, - 0x8DB5: 0x5D49, - 0x8DB6: 0x5D4D, - 0x8DB7: 0x5D4E, - 0x8DB8: 0x5D4F, - 0x8DB9: 0x5D50, - 0x8DBA: 0x5D51, - 0x8DBB: 0x5D52, - 0x8DBC: 0x5D53, - 0x8DBD: 0x5D54, - 0x8DBE: 0x5D55, - 0x8DBF: 0x5D56, - 0x8DC0: 0x5D57, - 0x8DC1: 0x5D59, - 0x8DC2: 0x5D5A, - 0x8DC3: 0x5D5C, - 0x8DC4: 0x5D5E, - 0x8DC5: 0x5D5F, - 0x8DC6: 0x5D60, - 0x8DC7: 0x5D61, - 0x8DC8: 0x5D62, - 0x8DC9: 0x5D63, - 0x8DCA: 0x5D64, - 0x8DCB: 0x5D65, - 0x8DCC: 0x5D66, - 0x8DCD: 0x5D67, - 0x8DCE: 0x5D68, - 0x8DCF: 0x5D6A, - 0x8DD0: 0x5D6D, - 0x8DD1: 0x5D6E, - 0x8DD2: 0x5D70, - 0x8DD3: 0x5D71, - 0x8DD4: 0x5D72, - 0x8DD5: 0x5D73, - 0x8DD6: 0x5D75, - 0x8DD7: 0x5D76, - 0x8DD8: 0x5D77, - 0x8DD9: 0x5D78, - 0x8DDA: 0x5D79, - 0x8DDB: 0x5D7A, - 0x8DDC: 0x5D7B, - 0x8DDD: 0x5D7C, - 0x8DDE: 0x5D7D, - 0x8DDF: 0x5D7E, - 0x8DE0: 0x5D7F, - 0x8DE1: 0x5D80, - 0x8DE2: 0x5D81, - 0x8DE3: 0x5D83, - 0x8DE4: 0x5D84, - 0x8DE5: 0x5D85, - 0x8DE6: 0x5D86, - 0x8DE7: 0x5D87, - 0x8DE8: 0x5D88, - 0x8DE9: 0x5D89, - 0x8DEA: 0x5D8A, - 0x8DEB: 0x5D8B, - 0x8DEC: 0x5D8C, - 0x8DED: 0x5D8D, - 0x8DEE: 0x5D8E, - 0x8DEF: 0x5D8F, - 0x8DF0: 0x5D90, - 0x8DF1: 0x5D91, - 0x8DF2: 0x5D92, - 0x8DF3: 0x5D93, - 0x8DF4: 0x5D94, - 0x8DF5: 0x5D95, - 0x8DF6: 0x5D96, - 0x8DF7: 0x5D97, - 0x8DF8: 0x5D98, - 0x8DF9: 0x5D9A, - 0x8DFA: 0x5D9B, - 0x8DFB: 0x5D9C, - 0x8DFC: 0x5D9E, - 0x8DFD: 0x5D9F, - 0x8DFE: 0x5DA0, - 0x8E40: 0x5DA1, - 0x8E41: 0x5DA2, - 0x8E42: 0x5DA3, - 0x8E43: 0x5DA4, - 0x8E44: 0x5DA5, - 0x8E45: 0x5DA6, - 0x8E46: 0x5DA7, - 0x8E47: 0x5DA8, - 0x8E48: 0x5DA9, - 0x8E49: 0x5DAA, - 0x8E4A: 0x5DAB, - 0x8E4B: 0x5DAC, - 0x8E4C: 0x5DAD, - 0x8E4D: 0x5DAE, - 0x8E4E: 0x5DAF, - 0x8E4F: 0x5DB0, - 0x8E50: 0x5DB1, - 0x8E51: 0x5DB2, - 0x8E52: 0x5DB3, - 0x8E53: 0x5DB4, - 0x8E54: 0x5DB5, - 0x8E55: 0x5DB6, - 0x8E56: 0x5DB8, - 0x8E57: 0x5DB9, - 0x8E58: 0x5DBA, - 0x8E59: 0x5DBB, - 0x8E5A: 0x5DBC, - 0x8E5B: 0x5DBD, - 0x8E5C: 0x5DBE, - 0x8E5D: 0x5DBF, - 0x8E5E: 0x5DC0, - 0x8E5F: 0x5DC1, - 0x8E60: 0x5DC2, - 0x8E61: 0x5DC3, - 0x8E62: 0x5DC4, - 0x8E63: 0x5DC6, - 0x8E64: 0x5DC7, - 0x8E65: 0x5DC8, - 0x8E66: 0x5DC9, - 0x8E67: 0x5DCA, - 0x8E68: 0x5DCB, - 0x8E69: 0x5DCC, - 0x8E6A: 0x5DCE, - 0x8E6B: 0x5DCF, - 0x8E6C: 0x5DD0, - 0x8E6D: 0x5DD1, - 0x8E6E: 0x5DD2, - 0x8E6F: 0x5DD3, - 0x8E70: 0x5DD4, - 0x8E71: 0x5DD5, - 0x8E72: 0x5DD6, - 0x8E73: 0x5DD7, - 0x8E74: 0x5DD8, - 0x8E75: 0x5DD9, - 0x8E76: 0x5DDA, - 0x8E77: 0x5DDC, - 0x8E78: 0x5DDF, - 0x8E79: 0x5DE0, - 0x8E7A: 0x5DE3, - 0x8E7B: 0x5DE4, - 0x8E7C: 0x5DEA, - 0x8E7D: 0x5DEC, - 0x8E7E: 0x5DED, - 0x8E80: 0x5DF0, - 0x8E81: 0x5DF5, - 0x8E82: 0x5DF6, - 0x8E83: 0x5DF8, - 0x8E84: 0x5DF9, - 0x8E85: 0x5DFA, - 0x8E86: 0x5DFB, - 0x8E87: 0x5DFC, - 0x8E88: 0x5DFF, - 0x8E89: 0x5E00, - 0x8E8A: 0x5E04, - 0x8E8B: 0x5E07, - 0x8E8C: 0x5E09, - 0x8E8D: 0x5E0A, - 0x8E8E: 0x5E0B, - 0x8E8F: 0x5E0D, - 0x8E90: 0x5E0E, - 0x8E91: 0x5E12, - 0x8E92: 0x5E13, - 0x8E93: 0x5E17, - 0x8E94: 0x5E1E, - 0x8E95: 0x5E1F, - 0x8E96: 0x5E20, - 0x8E97: 0x5E21, - 0x8E98: 0x5E22, - 0x8E99: 0x5E23, - 0x8E9A: 0x5E24, - 0x8E9B: 0x5E25, - 0x8E9C: 0x5E28, - 0x8E9D: 0x5E29, - 0x8E9E: 0x5E2A, - 0x8E9F: 0x5E2B, - 0x8EA0: 0x5E2C, - 0x8EA1: 0x5E2F, - 0x8EA2: 0x5E30, - 0x8EA3: 0x5E32, - 0x8EA4: 0x5E33, - 0x8EA5: 0x5E34, - 0x8EA6: 0x5E35, - 0x8EA7: 0x5E36, - 0x8EA8: 0x5E39, - 0x8EA9: 0x5E3A, - 0x8EAA: 0x5E3E, - 0x8EAB: 0x5E3F, - 0x8EAC: 0x5E40, - 0x8EAD: 0x5E41, - 0x8EAE: 0x5E43, - 0x8EAF: 0x5E46, - 0x8EB0: 0x5E47, - 0x8EB1: 0x5E48, - 0x8EB2: 0x5E49, - 0x8EB3: 0x5E4A, - 0x8EB4: 0x5E4B, - 0x8EB5: 0x5E4D, - 0x8EB6: 0x5E4E, - 0x8EB7: 0x5E4F, - 0x8EB8: 0x5E50, - 0x8EB9: 0x5E51, - 0x8EBA: 0x5E52, - 0x8EBB: 0x5E53, - 0x8EBC: 0x5E56, - 0x8EBD: 0x5E57, - 0x8EBE: 0x5E58, - 0x8EBF: 0x5E59, - 0x8EC0: 0x5E5A, - 0x8EC1: 0x5E5C, - 0x8EC2: 0x5E5D, - 0x8EC3: 0x5E5F, - 0x8EC4: 0x5E60, - 0x8EC5: 0x5E63, - 0x8EC6: 0x5E64, - 0x8EC7: 0x5E65, - 0x8EC8: 0x5E66, - 0x8EC9: 0x5E67, - 0x8ECA: 0x5E68, - 0x8ECB: 0x5E69, - 0x8ECC: 0x5E6A, - 0x8ECD: 0x5E6B, - 0x8ECE: 0x5E6C, - 0x8ECF: 0x5E6D, - 0x8ED0: 0x5E6E, - 0x8ED1: 0x5E6F, - 0x8ED2: 0x5E70, - 0x8ED3: 0x5E71, - 0x8ED4: 0x5E75, - 0x8ED5: 0x5E77, - 0x8ED6: 0x5E79, - 0x8ED7: 0x5E7E, - 0x8ED8: 0x5E81, - 0x8ED9: 0x5E82, - 0x8EDA: 0x5E83, - 0x8EDB: 0x5E85, - 0x8EDC: 0x5E88, - 0x8EDD: 0x5E89, - 0x8EDE: 0x5E8C, - 0x8EDF: 0x5E8D, - 0x8EE0: 0x5E8E, - 0x8EE1: 0x5E92, - 0x8EE2: 0x5E98, - 0x8EE3: 0x5E9B, - 0x8EE4: 0x5E9D, - 0x8EE5: 0x5EA1, - 0x8EE6: 0x5EA2, - 0x8EE7: 0x5EA3, - 0x8EE8: 0x5EA4, - 0x8EE9: 0x5EA8, - 0x8EEA: 0x5EA9, - 0x8EEB: 0x5EAA, - 0x8EEC: 0x5EAB, - 0x8EED: 0x5EAC, - 0x8EEE: 0x5EAE, - 0x8EEF: 0x5EAF, - 0x8EF0: 0x5EB0, - 0x8EF1: 0x5EB1, - 0x8EF2: 0x5EB2, - 0x8EF3: 0x5EB4, - 0x8EF4: 0x5EBA, - 0x8EF5: 0x5EBB, - 0x8EF6: 0x5EBC, - 0x8EF7: 0x5EBD, - 0x8EF8: 0x5EBF, - 0x8EF9: 0x5EC0, - 0x8EFA: 0x5EC1, - 0x8EFB: 0x5EC2, - 0x8EFC: 0x5EC3, - 0x8EFD: 0x5EC4, - 0x8EFE: 0x5EC5, - 0x8F40: 0x5EC6, - 0x8F41: 0x5EC7, - 0x8F42: 0x5EC8, - 0x8F43: 0x5ECB, - 0x8F44: 0x5ECC, - 0x8F45: 0x5ECD, - 0x8F46: 0x5ECE, - 0x8F47: 0x5ECF, - 0x8F48: 0x5ED0, - 0x8F49: 0x5ED4, - 0x8F4A: 0x5ED5, - 0x8F4B: 0x5ED7, - 0x8F4C: 0x5ED8, - 0x8F4D: 0x5ED9, - 0x8F4E: 0x5EDA, - 0x8F4F: 0x5EDC, - 0x8F50: 0x5EDD, - 0x8F51: 0x5EDE, - 0x8F52: 0x5EDF, - 0x8F53: 0x5EE0, - 0x8F54: 0x5EE1, - 0x8F55: 0x5EE2, - 0x8F56: 0x5EE3, - 0x8F57: 0x5EE4, - 0x8F58: 0x5EE5, - 0x8F59: 0x5EE6, - 0x8F5A: 0x5EE7, - 0x8F5B: 0x5EE9, - 0x8F5C: 0x5EEB, - 0x8F5D: 0x5EEC, - 0x8F5E: 0x5EED, - 0x8F5F: 0x5EEE, - 0x8F60: 0x5EEF, - 0x8F61: 0x5EF0, - 0x8F62: 0x5EF1, - 0x8F63: 0x5EF2, - 0x8F64: 0x5EF3, - 0x8F65: 0x5EF5, - 0x8F66: 0x5EF8, - 0x8F67: 0x5EF9, - 0x8F68: 0x5EFB, - 0x8F69: 0x5EFC, - 0x8F6A: 0x5EFD, - 0x8F6B: 0x5F05, - 0x8F6C: 0x5F06, - 0x8F6D: 0x5F07, - 0x8F6E: 0x5F09, - 0x8F6F: 0x5F0C, - 0x8F70: 0x5F0D, - 0x8F71: 0x5F0E, - 0x8F72: 0x5F10, - 0x8F73: 0x5F12, - 0x8F74: 0x5F14, - 0x8F75: 0x5F16, - 0x8F76: 0x5F19, - 0x8F77: 0x5F1A, - 0x8F78: 0x5F1C, - 0x8F79: 0x5F1D, - 0x8F7A: 0x5F1E, - 0x8F7B: 0x5F21, - 0x8F7C: 0x5F22, - 0x8F7D: 0x5F23, - 0x8F7E: 0x5F24, - 0x8F80: 0x5F28, - 0x8F81: 0x5F2B, - 0x8F82: 0x5F2C, - 0x8F83: 0x5F2E, - 0x8F84: 0x5F30, - 0x8F85: 0x5F32, - 0x8F86: 0x5F33, - 0x8F87: 0x5F34, - 0x8F88: 0x5F35, - 0x8F89: 0x5F36, - 0x8F8A: 0x5F37, - 0x8F8B: 0x5F38, - 0x8F8C: 0x5F3B, - 0x8F8D: 0x5F3D, - 0x8F8E: 0x5F3E, - 0x8F8F: 0x5F3F, - 0x8F90: 0x5F41, - 0x8F91: 0x5F42, - 0x8F92: 0x5F43, - 0x8F93: 0x5F44, - 0x8F94: 0x5F45, - 0x8F95: 0x5F46, - 0x8F96: 0x5F47, - 0x8F97: 0x5F48, - 0x8F98: 0x5F49, - 0x8F99: 0x5F4A, - 0x8F9A: 0x5F4B, - 0x8F9B: 0x5F4C, - 0x8F9C: 0x5F4D, - 0x8F9D: 0x5F4E, - 0x8F9E: 0x5F4F, - 0x8F9F: 0x5F51, - 0x8FA0: 0x5F54, - 0x8FA1: 0x5F59, - 0x8FA2: 0x5F5A, - 0x8FA3: 0x5F5B, - 0x8FA4: 0x5F5C, - 0x8FA5: 0x5F5E, - 0x8FA6: 0x5F5F, - 0x8FA7: 0x5F60, - 0x8FA8: 0x5F63, - 0x8FA9: 0x5F65, - 0x8FAA: 0x5F67, - 0x8FAB: 0x5F68, - 0x8FAC: 0x5F6B, - 0x8FAD: 0x5F6E, - 0x8FAE: 0x5F6F, - 0x8FAF: 0x5F72, - 0x8FB0: 0x5F74, - 0x8FB1: 0x5F75, - 0x8FB2: 0x5F76, - 0x8FB3: 0x5F78, - 0x8FB4: 0x5F7A, - 0x8FB5: 0x5F7D, - 0x8FB6: 0x5F7E, - 0x8FB7: 0x5F7F, - 0x8FB8: 0x5F83, - 0x8FB9: 0x5F86, - 0x8FBA: 0x5F8D, - 0x8FBB: 0x5F8E, - 0x8FBC: 0x5F8F, - 0x8FBD: 0x5F91, - 0x8FBE: 0x5F93, - 0x8FBF: 0x5F94, - 0x8FC0: 0x5F96, - 0x8FC1: 0x5F9A, - 0x8FC2: 0x5F9B, - 0x8FC3: 0x5F9D, - 0x8FC4: 0x5F9E, - 0x8FC5: 0x5F9F, - 0x8FC6: 0x5FA0, - 0x8FC7: 0x5FA2, - 0x8FC8: 0x5FA3, - 0x8FC9: 0x5FA4, - 0x8FCA: 0x5FA5, - 0x8FCB: 0x5FA6, - 0x8FCC: 0x5FA7, - 0x8FCD: 0x5FA9, - 0x8FCE: 0x5FAB, - 0x8FCF: 0x5FAC, - 0x8FD0: 0x5FAF, - 0x8FD1: 0x5FB0, - 0x8FD2: 0x5FB1, - 0x8FD3: 0x5FB2, - 0x8FD4: 0x5FB3, - 0x8FD5: 0x5FB4, - 0x8FD6: 0x5FB6, - 0x8FD7: 0x5FB8, - 0x8FD8: 0x5FB9, - 0x8FD9: 0x5FBA, - 0x8FDA: 0x5FBB, - 0x8FDB: 0x5FBE, - 0x8FDC: 0x5FBF, - 0x8FDD: 0x5FC0, - 0x8FDE: 0x5FC1, - 0x8FDF: 0x5FC2, - 0x8FE0: 0x5FC7, - 0x8FE1: 0x5FC8, - 0x8FE2: 0x5FCA, - 0x8FE3: 0x5FCB, - 0x8FE4: 0x5FCE, - 0x8FE5: 0x5FD3, - 0x8FE6: 0x5FD4, - 0x8FE7: 0x5FD5, - 0x8FE8: 0x5FDA, - 0x8FE9: 0x5FDB, - 0x8FEA: 0x5FDC, - 0x8FEB: 0x5FDE, - 0x8FEC: 0x5FDF, - 0x8FED: 0x5FE2, - 0x8FEE: 0x5FE3, - 0x8FEF: 0x5FE5, - 0x8FF0: 0x5FE6, - 0x8FF1: 0x5FE8, - 0x8FF2: 0x5FE9, - 0x8FF3: 0x5FEC, - 0x8FF4: 0x5FEF, - 0x8FF5: 0x5FF0, - 0x8FF6: 0x5FF2, - 0x8FF7: 0x5FF3, - 0x8FF8: 0x5FF4, - 0x8FF9: 0x5FF6, - 0x8FFA: 0x5FF7, - 0x8FFB: 0x5FF9, - 0x8FFC: 0x5FFA, - 0x8FFD: 0x5FFC, - 0x8FFE: 0x6007, - 0x9040: 0x6008, - 0x9041: 0x6009, - 0x9042: 0x600B, - 0x9043: 0x600C, - 0x9044: 0x6010, - 0x9045: 0x6011, - 0x9046: 0x6013, - 0x9047: 0x6017, - 0x9048: 0x6018, - 0x9049: 0x601A, - 0x904A: 0x601E, - 0x904B: 0x601F, - 0x904C: 0x6022, - 0x904D: 0x6023, - 0x904E: 0x6024, - 0x904F: 0x602C, - 0x9050: 0x602D, - 0x9051: 0x602E, - 0x9052: 0x6030, - 0x9053: 0x6031, - 0x9054: 0x6032, - 0x9055: 0x6033, - 0x9056: 0x6034, - 0x9057: 0x6036, - 0x9058: 0x6037, - 0x9059: 0x6038, - 0x905A: 0x6039, - 0x905B: 0x603A, - 0x905C: 0x603D, - 0x905D: 0x603E, - 0x905E: 0x6040, - 0x905F: 0x6044, - 0x9060: 0x6045, - 0x9061: 0x6046, - 0x9062: 0x6047, - 0x9063: 0x6048, - 0x9064: 0x6049, - 0x9065: 0x604A, - 0x9066: 0x604C, - 0x9067: 0x604E, - 0x9068: 0x604F, - 0x9069: 0x6051, - 0x906A: 0x6053, - 0x906B: 0x6054, - 0x906C: 0x6056, - 0x906D: 0x6057, - 0x906E: 0x6058, - 0x906F: 0x605B, - 0x9070: 0x605C, - 0x9071: 0x605E, - 0x9072: 0x605F, - 0x9073: 0x6060, - 0x9074: 0x6061, - 0x9075: 0x6065, - 0x9076: 0x6066, - 0x9077: 0x606E, - 0x9078: 0x6071, - 0x9079: 0x6072, - 0x907A: 0x6074, - 0x907B: 0x6075, - 0x907C: 0x6077, - 0x907D: 0x607E, - 0x907E: 0x6080, - 0x9080: 0x6081, - 0x9081: 0x6082, - 0x9082: 0x6085, - 0x9083: 0x6086, - 0x9084: 0x6087, - 0x9085: 0x6088, - 0x9086: 0x608A, - 0x9087: 0x608B, - 0x9088: 0x608E, - 0x9089: 0x608F, - 0x908A: 0x6090, - 0x908B: 0x6091, - 0x908C: 0x6093, - 0x908D: 0x6095, - 0x908E: 0x6097, - 0x908F: 0x6098, - 0x9090: 0x6099, - 0x9091: 0x609C, - 0x9092: 0x609E, - 0x9093: 0x60A1, - 0x9094: 0x60A2, - 0x9095: 0x60A4, - 0x9096: 0x60A5, - 0x9097: 0x60A7, - 0x9098: 0x60A9, - 0x9099: 0x60AA, - 0x909A: 0x60AE, - 0x909B: 0x60B0, - 0x909C: 0x60B3, - 0x909D: 0x60B5, - 0x909E: 0x60B6, - 0x909F: 0x60B7, - 0x90A0: 0x60B9, - 0x90A1: 0x60BA, - 0x90A2: 0x60BD, - 0x90A3: 0x60BE, - 0x90A4: 0x60BF, - 0x90A5: 0x60C0, - 0x90A6: 0x60C1, - 0x90A7: 0x60C2, - 0x90A8: 0x60C3, - 0x90A9: 0x60C4, - 0x90AA: 0x60C7, - 0x90AB: 0x60C8, - 0x90AC: 0x60C9, - 0x90AD: 0x60CC, - 0x90AE: 0x60CD, - 0x90AF: 0x60CE, - 0x90B0: 0x60CF, - 0x90B1: 0x60D0, - 0x90B2: 0x60D2, - 0x90B3: 0x60D3, - 0x90B4: 0x60D4, - 0x90B5: 0x60D6, - 0x90B6: 0x60D7, - 0x90B7: 0x60D9, - 0x90B8: 0x60DB, - 0x90B9: 0x60DE, - 0x90BA: 0x60E1, - 0x90BB: 0x60E2, - 0x90BC: 0x60E3, - 0x90BD: 0x60E4, - 0x90BE: 0x60E5, - 0x90BF: 0x60EA, - 0x90C0: 0x60F1, - 0x90C1: 0x60F2, - 0x90C2: 0x60F5, - 0x90C3: 0x60F7, - 0x90C4: 0x60F8, - 0x90C5: 0x60FB, - 0x90C6: 0x60FC, - 0x90C7: 0x60FD, - 0x90C8: 0x60FE, - 0x90C9: 0x60FF, - 0x90CA: 0x6102, - 0x90CB: 0x6103, - 0x90CC: 0x6104, - 0x90CD: 0x6105, - 0x90CE: 0x6107, - 0x90CF: 0x610A, - 0x90D0: 0x610B, - 0x90D1: 0x610C, - 0x90D2: 0x6110, - 0x90D3: 0x6111, - 0x90D4: 0x6112, - 0x90D5: 0x6113, - 0x90D6: 0x6114, - 0x90D7: 0x6116, - 0x90D8: 0x6117, - 0x90D9: 0x6118, - 0x90DA: 0x6119, - 0x90DB: 0x611B, - 0x90DC: 0x611C, - 0x90DD: 0x611D, - 0x90DE: 0x611E, - 0x90DF: 0x6121, - 0x90E0: 0x6122, - 0x90E1: 0x6125, - 0x90E2: 0x6128, - 0x90E3: 0x6129, - 0x90E4: 0x612A, - 0x90E5: 0x612C, - 0x90E6: 0x612D, - 0x90E7: 0x612E, - 0x90E8: 0x612F, - 0x90E9: 0x6130, - 0x90EA: 0x6131, - 0x90EB: 0x6132, - 0x90EC: 0x6133, - 0x90ED: 0x6134, - 0x90EE: 0x6135, - 0x90EF: 0x6136, - 0x90F0: 0x6137, - 0x90F1: 0x6138, - 0x90F2: 0x6139, - 0x90F3: 0x613A, - 0x90F4: 0x613B, - 0x90F5: 0x613C, - 0x90F6: 0x613D, - 0x90F7: 0x613E, - 0x90F8: 0x6140, - 0x90F9: 0x6141, - 0x90FA: 0x6142, - 0x90FB: 0x6143, - 0x90FC: 0x6144, - 0x90FD: 0x6145, - 0x90FE: 0x6146, - 0x9140: 0x6147, - 0x9141: 0x6149, - 0x9142: 0x614B, - 0x9143: 0x614D, - 0x9144: 0x614F, - 0x9145: 0x6150, - 0x9146: 0x6152, - 0x9147: 0x6153, - 0x9148: 0x6154, - 0x9149: 0x6156, - 0x914A: 0x6157, - 0x914B: 0x6158, - 0x914C: 0x6159, - 0x914D: 0x615A, - 0x914E: 0x615B, - 0x914F: 0x615C, - 0x9150: 0x615E, - 0x9151: 0x615F, - 0x9152: 0x6160, - 0x9153: 0x6161, - 0x9154: 0x6163, - 0x9155: 0x6164, - 0x9156: 0x6165, - 0x9157: 0x6166, - 0x9158: 0x6169, - 0x9159: 0x616A, - 0x915A: 0x616B, - 0x915B: 0x616C, - 0x915C: 0x616D, - 0x915D: 0x616E, - 0x915E: 0x616F, - 0x915F: 0x6171, - 0x9160: 0x6172, - 0x9161: 0x6173, - 0x9162: 0x6174, - 0x9163: 0x6176, - 0x9164: 0x6178, - 0x9165: 0x6179, - 0x9166: 0x617A, - 0x9167: 0x617B, - 0x9168: 0x617C, - 0x9169: 0x617D, - 0x916A: 0x617E, - 0x916B: 0x617F, - 0x916C: 0x6180, - 0x916D: 0x6181, - 0x916E: 0x6182, - 0x916F: 0x6183, - 0x9170: 0x6184, - 0x9171: 0x6185, - 0x9172: 0x6186, - 0x9173: 0x6187, - 0x9174: 0x6188, - 0x9175: 0x6189, - 0x9176: 0x618A, - 0x9177: 0x618C, - 0x9178: 0x618D, - 0x9179: 0x618F, - 0x917A: 0x6190, - 0x917B: 0x6191, - 0x917C: 0x6192, - 0x917D: 0x6193, - 0x917E: 0x6195, - 0x9180: 0x6196, - 0x9181: 0x6197, - 0x9182: 0x6198, - 0x9183: 0x6199, - 0x9184: 0x619A, - 0x9185: 0x619B, - 0x9186: 0x619C, - 0x9187: 0x619E, - 0x9188: 0x619F, - 0x9189: 0x61A0, - 0x918A: 0x61A1, - 0x918B: 0x61A2, - 0x918C: 0x61A3, - 0x918D: 0x61A4, - 0x918E: 0x61A5, - 0x918F: 0x61A6, - 0x9190: 0x61AA, - 0x9191: 0x61AB, - 0x9192: 0x61AD, - 0x9193: 0x61AE, - 0x9194: 0x61AF, - 0x9195: 0x61B0, - 0x9196: 0x61B1, - 0x9197: 0x61B2, - 0x9198: 0x61B3, - 0x9199: 0x61B4, - 0x919A: 0x61B5, - 0x919B: 0x61B6, - 0x919C: 0x61B8, - 0x919D: 0x61B9, - 0x919E: 0x61BA, - 0x919F: 0x61BB, - 0x91A0: 0x61BC, - 0x91A1: 0x61BD, - 0x91A2: 0x61BF, - 0x91A3: 0x61C0, - 0x91A4: 0x61C1, - 0x91A5: 0x61C3, - 0x91A6: 0x61C4, - 0x91A7: 0x61C5, - 0x91A8: 0x61C6, - 0x91A9: 0x61C7, - 0x91AA: 0x61C9, - 0x91AB: 0x61CC, - 0x91AC: 0x61CD, - 0x91AD: 0x61CE, - 0x91AE: 0x61CF, - 0x91AF: 0x61D0, - 0x91B0: 0x61D3, - 0x91B1: 0x61D5, - 0x91B2: 0x61D6, - 0x91B3: 0x61D7, - 0x91B4: 0x61D8, - 0x91B5: 0x61D9, - 0x91B6: 0x61DA, - 0x91B7: 0x61DB, - 0x91B8: 0x61DC, - 0x91B9: 0x61DD, - 0x91BA: 0x61DE, - 0x91BB: 0x61DF, - 0x91BC: 0x61E0, - 0x91BD: 0x61E1, - 0x91BE: 0x61E2, - 0x91BF: 0x61E3, - 0x91C0: 0x61E4, - 0x91C1: 0x61E5, - 0x91C2: 0x61E7, - 0x91C3: 0x61E8, - 0x91C4: 0x61E9, - 0x91C5: 0x61EA, - 0x91C6: 0x61EB, - 0x91C7: 0x61EC, - 0x91C8: 0x61ED, - 0x91C9: 0x61EE, - 0x91CA: 0x61EF, - 0x91CB: 0x61F0, - 0x91CC: 0x61F1, - 0x91CD: 0x61F2, - 0x91CE: 0x61F3, - 0x91CF: 0x61F4, - 0x91D0: 0x61F6, - 0x91D1: 0x61F7, - 0x91D2: 0x61F8, - 0x91D3: 0x61F9, - 0x91D4: 0x61FA, - 0x91D5: 0x61FB, - 0x91D6: 0x61FC, - 0x91D7: 0x61FD, - 0x91D8: 0x61FE, - 0x91D9: 0x6200, - 0x91DA: 0x6201, - 0x91DB: 0x6202, - 0x91DC: 0x6203, - 0x91DD: 0x6204, - 0x91DE: 0x6205, - 0x91DF: 0x6207, - 0x91E0: 0x6209, - 0x91E1: 0x6213, - 0x91E2: 0x6214, - 0x91E3: 0x6219, - 0x91E4: 0x621C, - 0x91E5: 0x621D, - 0x91E6: 0x621E, - 0x91E7: 0x6220, - 0x91E8: 0x6223, - 0x91E9: 0x6226, - 0x91EA: 0x6227, - 0x91EB: 0x6228, - 0x91EC: 0x6229, - 0x91ED: 0x622B, - 0x91EE: 0x622D, - 0x91EF: 0x622F, - 0x91F0: 0x6230, - 0x91F1: 0x6231, - 0x91F2: 0x6232, - 0x91F3: 0x6235, - 0x91F4: 0x6236, - 0x91F5: 0x6238, - 0x91F6: 0x6239, - 0x91F7: 0x623A, - 0x91F8: 0x623B, - 0x91F9: 0x623C, - 0x91FA: 0x6242, - 0x91FB: 0x6244, - 0x91FC: 0x6245, - 0x91FD: 0x6246, - 0x91FE: 0x624A, - 0x9240: 0x624F, - 0x9241: 0x6250, - 0x9242: 0x6255, - 0x9243: 0x6256, - 0x9244: 0x6257, - 0x9245: 0x6259, - 0x9246: 0x625A, - 0x9247: 0x625C, - 0x9248: 0x625D, - 0x9249: 0x625E, - 0x924A: 0x625F, - 0x924B: 0x6260, - 0x924C: 0x6261, - 0x924D: 0x6262, - 0x924E: 0x6264, - 0x924F: 0x6265, - 0x9250: 0x6268, - 0x9251: 0x6271, - 0x9252: 0x6272, - 0x9253: 0x6274, - 0x9254: 0x6275, - 0x9255: 0x6277, - 0x9256: 0x6278, - 0x9257: 0x627A, - 0x9258: 0x627B, - 0x9259: 0x627D, - 0x925A: 0x6281, - 0x925B: 0x6282, - 0x925C: 0x6283, - 0x925D: 0x6285, - 0x925E: 0x6286, - 0x925F: 0x6287, - 0x9260: 0x6288, - 0x9261: 0x628B, - 0x9262: 0x628C, - 0x9263: 0x628D, - 0x9264: 0x628E, - 0x9265: 0x628F, - 0x9266: 0x6290, - 0x9267: 0x6294, - 0x9268: 0x6299, - 0x9269: 0x629C, - 0x926A: 0x629D, - 0x926B: 0x629E, - 0x926C: 0x62A3, - 0x926D: 0x62A6, - 0x926E: 0x62A7, - 0x926F: 0x62A9, - 0x9270: 0x62AA, - 0x9271: 0x62AD, - 0x9272: 0x62AE, - 0x9273: 0x62AF, - 0x9274: 0x62B0, - 0x9275: 0x62B2, - 0x9276: 0x62B3, - 0x9277: 0x62B4, - 0x9278: 0x62B6, - 0x9279: 0x62B7, - 0x927A: 0x62B8, - 0x927B: 0x62BA, - 0x927C: 0x62BE, - 0x927D: 0x62C0, - 0x927E: 0x62C1, - 0x9280: 0x62C3, - 0x9281: 0x62CB, - 0x9282: 0x62CF, - 0x9283: 0x62D1, - 0x9284: 0x62D5, - 0x9285: 0x62DD, - 0x9286: 0x62DE, - 0x9287: 0x62E0, - 0x9288: 0x62E1, - 0x9289: 0x62E4, - 0x928A: 0x62EA, - 0x928B: 0x62EB, - 0x928C: 0x62F0, - 0x928D: 0x62F2, - 0x928E: 0x62F5, - 0x928F: 0x62F8, - 0x9290: 0x62F9, - 0x9291: 0x62FA, - 0x9292: 0x62FB, - 0x9293: 0x6300, - 0x9294: 0x6303, - 0x9295: 0x6304, - 0x9296: 0x6305, - 0x9297: 0x6306, - 0x9298: 0x630A, - 0x9299: 0x630B, - 0x929A: 0x630C, - 0x929B: 0x630D, - 0x929C: 0x630F, - 0x929D: 0x6310, - 0x929E: 0x6312, - 0x929F: 0x6313, - 0x92A0: 0x6314, - 0x92A1: 0x6315, - 0x92A2: 0x6317, - 0x92A3: 0x6318, - 0x92A4: 0x6319, - 0x92A5: 0x631C, - 0x92A6: 0x6326, - 0x92A7: 0x6327, - 0x92A8: 0x6329, - 0x92A9: 0x632C, - 0x92AA: 0x632D, - 0x92AB: 0x632E, - 0x92AC: 0x6330, - 0x92AD: 0x6331, - 0x92AE: 0x6333, - 0x92AF: 0x6334, - 0x92B0: 0x6335, - 0x92B1: 0x6336, - 0x92B2: 0x6337, - 0x92B3: 0x6338, - 0x92B4: 0x633B, - 0x92B5: 0x633C, - 0x92B6: 0x633E, - 0x92B7: 0x633F, - 0x92B8: 0x6340, - 0x92B9: 0x6341, - 0x92BA: 0x6344, - 0x92BB: 0x6347, - 0x92BC: 0x6348, - 0x92BD: 0x634A, - 0x92BE: 0x6351, - 0x92BF: 0x6352, - 0x92C0: 0x6353, - 0x92C1: 0x6354, - 0x92C2: 0x6356, - 0x92C3: 0x6357, - 0x92C4: 0x6358, - 0x92C5: 0x6359, - 0x92C6: 0x635A, - 0x92C7: 0x635B, - 0x92C8: 0x635C, - 0x92C9: 0x635D, - 0x92CA: 0x6360, - 0x92CB: 0x6364, - 0x92CC: 0x6365, - 0x92CD: 0x6366, - 0x92CE: 0x6368, - 0x92CF: 0x636A, - 0x92D0: 0x636B, - 0x92D1: 0x636C, - 0x92D2: 0x636F, - 0x92D3: 0x6370, - 0x92D4: 0x6372, - 0x92D5: 0x6373, - 0x92D6: 0x6374, - 0x92D7: 0x6375, - 0x92D8: 0x6378, - 0x92D9: 0x6379, - 0x92DA: 0x637C, - 0x92DB: 0x637D, - 0x92DC: 0x637E, - 0x92DD: 0x637F, - 0x92DE: 0x6381, - 0x92DF: 0x6383, - 0x92E0: 0x6384, - 0x92E1: 0x6385, - 0x92E2: 0x6386, - 0x92E3: 0x638B, - 0x92E4: 0x638D, - 0x92E5: 0x6391, - 0x92E6: 0x6393, - 0x92E7: 0x6394, - 0x92E8: 0x6395, - 0x92E9: 0x6397, - 0x92EA: 0x6399, - 0x92EB: 0x639A, - 0x92EC: 0x639B, - 0x92ED: 0x639C, - 0x92EE: 0x639D, - 0x92EF: 0x639E, - 0x92F0: 0x639F, - 0x92F1: 0x63A1, - 0x92F2: 0x63A4, - 0x92F3: 0x63A6, - 0x92F4: 0x63AB, - 0x92F5: 0x63AF, - 0x92F6: 0x63B1, - 0x92F7: 0x63B2, - 0x92F8: 0x63B5, - 0x92F9: 0x63B6, - 0x92FA: 0x63B9, - 0x92FB: 0x63BB, - 0x92FC: 0x63BD, - 0x92FD: 0x63BF, - 0x92FE: 0x63C0, - 0x9340: 0x63C1, - 0x9341: 0x63C2, - 0x9342: 0x63C3, - 0x9343: 0x63C5, - 0x9344: 0x63C7, - 0x9345: 0x63C8, - 0x9346: 0x63CA, - 0x9347: 0x63CB, - 0x9348: 0x63CC, - 0x9349: 0x63D1, - 0x934A: 0x63D3, - 0x934B: 0x63D4, - 0x934C: 0x63D5, - 0x934D: 0x63D7, - 0x934E: 0x63D8, - 0x934F: 0x63D9, - 0x9350: 0x63DA, - 0x9351: 0x63DB, - 0x9352: 0x63DC, - 0x9353: 0x63DD, - 0x9354: 0x63DF, - 0x9355: 0x63E2, - 0x9356: 0x63E4, - 0x9357: 0x63E5, - 0x9358: 0x63E6, - 0x9359: 0x63E7, - 0x935A: 0x63E8, - 0x935B: 0x63EB, - 0x935C: 0x63EC, - 0x935D: 0x63EE, - 0x935E: 0x63EF, - 0x935F: 0x63F0, - 0x9360: 0x63F1, - 0x9361: 0x63F3, - 0x9362: 0x63F5, - 0x9363: 0x63F7, - 0x9364: 0x63F9, - 0x9365: 0x63FA, - 0x9366: 0x63FB, - 0x9367: 0x63FC, - 0x9368: 0x63FE, - 0x9369: 0x6403, - 0x936A: 0x6404, - 0x936B: 0x6406, - 0x936C: 0x6407, - 0x936D: 0x6408, - 0x936E: 0x6409, - 0x936F: 0x640A, - 0x9370: 0x640D, - 0x9371: 0x640E, - 0x9372: 0x6411, - 0x9373: 0x6412, - 0x9374: 0x6415, - 0x9375: 0x6416, - 0x9376: 0x6417, - 0x9377: 0x6418, - 0x9378: 0x6419, - 0x9379: 0x641A, - 0x937A: 0x641D, - 0x937B: 0x641F, - 0x937C: 0x6422, - 0x937D: 0x6423, - 0x937E: 0x6424, - 0x9380: 0x6425, - 0x9381: 0x6427, - 0x9382: 0x6428, - 0x9383: 0x6429, - 0x9384: 0x642B, - 0x9385: 0x642E, - 0x9386: 0x642F, - 0x9387: 0x6430, - 0x9388: 0x6431, - 0x9389: 0x6432, - 0x938A: 0x6433, - 0x938B: 0x6435, - 0x938C: 0x6436, - 0x938D: 0x6437, - 0x938E: 0x6438, - 0x938F: 0x6439, - 0x9390: 0x643B, - 0x9391: 0x643C, - 0x9392: 0x643E, - 0x9393: 0x6440, - 0x9394: 0x6442, - 0x9395: 0x6443, - 0x9396: 0x6449, - 0x9397: 0x644B, - 0x9398: 0x644C, - 0x9399: 0x644D, - 0x939A: 0x644E, - 0x939B: 0x644F, - 0x939C: 0x6450, - 0x939D: 0x6451, - 0x939E: 0x6453, - 0x939F: 0x6455, - 0x93A0: 0x6456, - 0x93A1: 0x6457, - 0x93A2: 0x6459, - 0x93A3: 0x645A, - 0x93A4: 0x645B, - 0x93A5: 0x645C, - 0x93A6: 0x645D, - 0x93A7: 0x645F, - 0x93A8: 0x6460, - 0x93A9: 0x6461, - 0x93AA: 0x6462, - 0x93AB: 0x6463, - 0x93AC: 0x6464, - 0x93AD: 0x6465, - 0x93AE: 0x6466, - 0x93AF: 0x6468, - 0x93B0: 0x646A, - 0x93B1: 0x646B, - 0x93B2: 0x646C, - 0x93B3: 0x646E, - 0x93B4: 0x646F, - 0x93B5: 0x6470, - 0x93B6: 0x6471, - 0x93B7: 0x6472, - 0x93B8: 0x6473, - 0x93B9: 0x6474, - 0x93BA: 0x6475, - 0x93BB: 0x6476, - 0x93BC: 0x6477, - 0x93BD: 0x647B, - 0x93BE: 0x647C, - 0x93BF: 0x647D, - 0x93C0: 0x647E, - 0x93C1: 0x647F, - 0x93C2: 0x6480, - 0x93C3: 0x6481, - 0x93C4: 0x6483, - 0x93C5: 0x6486, - 0x93C6: 0x6488, - 0x93C7: 0x6489, - 0x93C8: 0x648A, - 0x93C9: 0x648B, - 0x93CA: 0x648C, - 0x93CB: 0x648D, - 0x93CC: 0x648E, - 0x93CD: 0x648F, - 0x93CE: 0x6490, - 0x93CF: 0x6493, - 0x93D0: 0x6494, - 0x93D1: 0x6497, - 0x93D2: 0x6498, - 0x93D3: 0x649A, - 0x93D4: 0x649B, - 0x93D5: 0x649C, - 0x93D6: 0x649D, - 0x93D7: 0x649F, - 0x93D8: 0x64A0, - 0x93D9: 0x64A1, - 0x93DA: 0x64A2, - 0x93DB: 0x64A3, - 0x93DC: 0x64A5, - 0x93DD: 0x64A6, - 0x93DE: 0x64A7, - 0x93DF: 0x64A8, - 0x93E0: 0x64AA, - 0x93E1: 0x64AB, - 0x93E2: 0x64AF, - 0x93E3: 0x64B1, - 0x93E4: 0x64B2, - 0x93E5: 0x64B3, - 0x93E6: 0x64B4, - 0x93E7: 0x64B6, - 0x93E8: 0x64B9, - 0x93E9: 0x64BB, - 0x93EA: 0x64BD, - 0x93EB: 0x64BE, - 0x93EC: 0x64BF, - 0x93ED: 0x64C1, - 0x93EE: 0x64C3, - 0x93EF: 0x64C4, - 0x93F0: 0x64C6, - 0x93F1: 0x64C7, - 0x93F2: 0x64C8, - 0x93F3: 0x64C9, - 0x93F4: 0x64CA, - 0x93F5: 0x64CB, - 0x93F6: 0x64CC, - 0x93F7: 0x64CF, - 0x93F8: 0x64D1, - 0x93F9: 0x64D3, - 0x93FA: 0x64D4, - 0x93FB: 0x64D5, - 0x93FC: 0x64D6, - 0x93FD: 0x64D9, - 0x93FE: 0x64DA, - 0x9440: 0x64DB, - 0x9441: 0x64DC, - 0x9442: 0x64DD, - 0x9443: 0x64DF, - 0x9444: 0x64E0, - 0x9445: 0x64E1, - 0x9446: 0x64E3, - 0x9447: 0x64E5, - 0x9448: 0x64E7, - 0x9449: 0x64E8, - 0x944A: 0x64E9, - 0x944B: 0x64EA, - 0x944C: 0x64EB, - 0x944D: 0x64EC, - 0x944E: 0x64ED, - 0x944F: 0x64EE, - 0x9450: 0x64EF, - 0x9451: 0x64F0, - 0x9452: 0x64F1, - 0x9453: 0x64F2, - 0x9454: 0x64F3, - 0x9455: 0x64F4, - 0x9456: 0x64F5, - 0x9457: 0x64F6, - 0x9458: 0x64F7, - 0x9459: 0x64F8, - 0x945A: 0x64F9, - 0x945B: 0x64FA, - 0x945C: 0x64FB, - 0x945D: 0x64FC, - 0x945E: 0x64FD, - 0x945F: 0x64FE, - 0x9460: 0x64FF, - 0x9461: 0x6501, - 0x9462: 0x6502, - 0x9463: 0x6503, - 0x9464: 0x6504, - 0x9465: 0x6505, - 0x9466: 0x6506, - 0x9467: 0x6507, - 0x9468: 0x6508, - 0x9469: 0x650A, - 0x946A: 0x650B, - 0x946B: 0x650C, - 0x946C: 0x650D, - 0x946D: 0x650E, - 0x946E: 0x650F, - 0x946F: 0x6510, - 0x9470: 0x6511, - 0x9471: 0x6513, - 0x9472: 0x6514, - 0x9473: 0x6515, - 0x9474: 0x6516, - 0x9475: 0x6517, - 0x9476: 0x6519, - 0x9477: 0x651A, - 0x9478: 0x651B, - 0x9479: 0x651C, - 0x947A: 0x651D, - 0x947B: 0x651E, - 0x947C: 0x651F, - 0x947D: 0x6520, - 0x947E: 0x6521, - 0x9480: 0x6522, - 0x9481: 0x6523, - 0x9482: 0x6524, - 0x9483: 0x6526, - 0x9484: 0x6527, - 0x9485: 0x6528, - 0x9486: 0x6529, - 0x9487: 0x652A, - 0x9488: 0x652C, - 0x9489: 0x652D, - 0x948A: 0x6530, - 0x948B: 0x6531, - 0x948C: 0x6532, - 0x948D: 0x6533, - 0x948E: 0x6537, - 0x948F: 0x653A, - 0x9490: 0x653C, - 0x9491: 0x653D, - 0x9492: 0x6540, - 0x9493: 0x6541, - 0x9494: 0x6542, - 0x9495: 0x6543, - 0x9496: 0x6544, - 0x9497: 0x6546, - 0x9498: 0x6547, - 0x9499: 0x654A, - 0x949A: 0x654B, - 0x949B: 0x654D, - 0x949C: 0x654E, - 0x949D: 0x6550, - 0x949E: 0x6552, - 0x949F: 0x6553, - 0x94A0: 0x6554, - 0x94A1: 0x6557, - 0x94A2: 0x6558, - 0x94A3: 0x655A, - 0x94A4: 0x655C, - 0x94A5: 0x655F, - 0x94A6: 0x6560, - 0x94A7: 0x6561, - 0x94A8: 0x6564, - 0x94A9: 0x6565, - 0x94AA: 0x6567, - 0x94AB: 0x6568, - 0x94AC: 0x6569, - 0x94AD: 0x656A, - 0x94AE: 0x656D, - 0x94AF: 0x656E, - 0x94B0: 0x656F, - 0x94B1: 0x6571, - 0x94B2: 0x6573, - 0x94B3: 0x6575, - 0x94B4: 0x6576, - 0x94B5: 0x6578, - 0x94B6: 0x6579, - 0x94B7: 0x657A, - 0x94B8: 0x657B, - 0x94B9: 0x657C, - 0x94BA: 0x657D, - 0x94BB: 0x657E, - 0x94BC: 0x657F, - 0x94BD: 0x6580, - 0x94BE: 0x6581, - 0x94BF: 0x6582, - 0x94C0: 0x6583, - 0x94C1: 0x6584, - 0x94C2: 0x6585, - 0x94C3: 0x6586, - 0x94C4: 0x6588, - 0x94C5: 0x6589, - 0x94C6: 0x658A, - 0x94C7: 0x658D, - 0x94C8: 0x658E, - 0x94C9: 0x658F, - 0x94CA: 0x6592, - 0x94CB: 0x6594, - 0x94CC: 0x6595, - 0x94CD: 0x6596, - 0x94CE: 0x6598, - 0x94CF: 0x659A, - 0x94D0: 0x659D, - 0x94D1: 0x659E, - 0x94D2: 0x65A0, - 0x94D3: 0x65A2, - 0x94D4: 0x65A3, - 0x94D5: 0x65A6, - 0x94D6: 0x65A8, - 0x94D7: 0x65AA, - 0x94D8: 0x65AC, - 0x94D9: 0x65AE, - 0x94DA: 0x65B1, - 0x94DB: 0x65B2, - 0x94DC: 0x65B3, - 0x94DD: 0x65B4, - 0x94DE: 0x65B5, - 0x94DF: 0x65B6, - 0x94E0: 0x65B7, - 0x94E1: 0x65B8, - 0x94E2: 0x65BA, - 0x94E3: 0x65BB, - 0x94E4: 0x65BE, - 0x94E5: 0x65BF, - 0x94E6: 0x65C0, - 0x94E7: 0x65C2, - 0x94E8: 0x65C7, - 0x94E9: 0x65C8, - 0x94EA: 0x65C9, - 0x94EB: 0x65CA, - 0x94EC: 0x65CD, - 0x94ED: 0x65D0, - 0x94EE: 0x65D1, - 0x94EF: 0x65D3, - 0x94F0: 0x65D4, - 0x94F1: 0x65D5, - 0x94F2: 0x65D8, - 0x94F3: 0x65D9, - 0x94F4: 0x65DA, - 0x94F5: 0x65DB, - 0x94F6: 0x65DC, - 0x94F7: 0x65DD, - 0x94F8: 0x65DE, - 0x94F9: 0x65DF, - 0x94FA: 0x65E1, - 0x94FB: 0x65E3, - 0x94FC: 0x65E4, - 0x94FD: 0x65EA, - 0x94FE: 0x65EB, - 0x9540: 0x65F2, - 0x9541: 0x65F3, - 0x9542: 0x65F4, - 0x9543: 0x65F5, - 0x9544: 0x65F8, - 0x9545: 0x65F9, - 0x9546: 0x65FB, - 0x9547: 0x65FC, - 0x9548: 0x65FD, - 0x9549: 0x65FE, - 0x954A: 0x65FF, - 0x954B: 0x6601, - 0x954C: 0x6604, - 0x954D: 0x6605, - 0x954E: 0x6607, - 0x954F: 0x6608, - 0x9550: 0x6609, - 0x9551: 0x660B, - 0x9552: 0x660D, - 0x9553: 0x6610, - 0x9554: 0x6611, - 0x9555: 0x6612, - 0x9556: 0x6616, - 0x9557: 0x6617, - 0x9558: 0x6618, - 0x9559: 0x661A, - 0x955A: 0x661B, - 0x955B: 0x661C, - 0x955C: 0x661E, - 0x955D: 0x6621, - 0x955E: 0x6622, - 0x955F: 0x6623, - 0x9560: 0x6624, - 0x9561: 0x6626, - 0x9562: 0x6629, - 0x9563: 0x662A, - 0x9564: 0x662B, - 0x9565: 0x662C, - 0x9566: 0x662E, - 0x9567: 0x6630, - 0x9568: 0x6632, - 0x9569: 0x6633, - 0x956A: 0x6637, - 0x956B: 0x6638, - 0x956C: 0x6639, - 0x956D: 0x663A, - 0x956E: 0x663B, - 0x956F: 0x663D, - 0x9570: 0x663F, - 0x9571: 0x6640, - 0x9572: 0x6642, - 0x9573: 0x6644, - 0x9574: 0x6645, - 0x9575: 0x6646, - 0x9576: 0x6647, - 0x9577: 0x6648, - 0x9578: 0x6649, - 0x9579: 0x664A, - 0x957A: 0x664D, - 0x957B: 0x664E, - 0x957C: 0x6650, - 0x957D: 0x6651, - 0x957E: 0x6658, - 0x9580: 0x6659, - 0x9581: 0x665B, - 0x9582: 0x665C, - 0x9583: 0x665D, - 0x9584: 0x665E, - 0x9585: 0x6660, - 0x9586: 0x6662, - 0x9587: 0x6663, - 0x9588: 0x6665, - 0x9589: 0x6667, - 0x958A: 0x6669, - 0x958B: 0x666A, - 0x958C: 0x666B, - 0x958D: 0x666C, - 0x958E: 0x666D, - 0x958F: 0x6671, - 0x9590: 0x6672, - 0x9591: 0x6673, - 0x9592: 0x6675, - 0x9593: 0x6678, - 0x9594: 0x6679, - 0x9595: 0x667B, - 0x9596: 0x667C, - 0x9597: 0x667D, - 0x9598: 0x667F, - 0x9599: 0x6680, - 0x959A: 0x6681, - 0x959B: 0x6683, - 0x959C: 0x6685, - 0x959D: 0x6686, - 0x959E: 0x6688, - 0x959F: 0x6689, - 0x95A0: 0x668A, - 0x95A1: 0x668B, - 0x95A2: 0x668D, - 0x95A3: 0x668E, - 0x95A4: 0x668F, - 0x95A5: 0x6690, - 0x95A6: 0x6692, - 0x95A7: 0x6693, - 0x95A8: 0x6694, - 0x95A9: 0x6695, - 0x95AA: 0x6698, - 0x95AB: 0x6699, - 0x95AC: 0x669A, - 0x95AD: 0x669B, - 0x95AE: 0x669C, - 0x95AF: 0x669E, - 0x95B0: 0x669F, - 0x95B1: 0x66A0, - 0x95B2: 0x66A1, - 0x95B3: 0x66A2, - 0x95B4: 0x66A3, - 0x95B5: 0x66A4, - 0x95B6: 0x66A5, - 0x95B7: 0x66A6, - 0x95B8: 0x66A9, - 0x95B9: 0x66AA, - 0x95BA: 0x66AB, - 0x95BB: 0x66AC, - 0x95BC: 0x66AD, - 0x95BD: 0x66AF, - 0x95BE: 0x66B0, - 0x95BF: 0x66B1, - 0x95C0: 0x66B2, - 0x95C1: 0x66B3, - 0x95C2: 0x66B5, - 0x95C3: 0x66B6, - 0x95C4: 0x66B7, - 0x95C5: 0x66B8, - 0x95C6: 0x66BA, - 0x95C7: 0x66BB, - 0x95C8: 0x66BC, - 0x95C9: 0x66BD, - 0x95CA: 0x66BF, - 0x95CB: 0x66C0, - 0x95CC: 0x66C1, - 0x95CD: 0x66C2, - 0x95CE: 0x66C3, - 0x95CF: 0x66C4, - 0x95D0: 0x66C5, - 0x95D1: 0x66C6, - 0x95D2: 0x66C7, - 0x95D3: 0x66C8, - 0x95D4: 0x66C9, - 0x95D5: 0x66CA, - 0x95D6: 0x66CB, - 0x95D7: 0x66CC, - 0x95D8: 0x66CD, - 0x95D9: 0x66CE, - 0x95DA: 0x66CF, - 0x95DB: 0x66D0, - 0x95DC: 0x66D1, - 0x95DD: 0x66D2, - 0x95DE: 0x66D3, - 0x95DF: 0x66D4, - 0x95E0: 0x66D5, - 0x95E1: 0x66D6, - 0x95E2: 0x66D7, - 0x95E3: 0x66D8, - 0x95E4: 0x66DA, - 0x95E5: 0x66DE, - 0x95E6: 0x66DF, - 0x95E7: 0x66E0, - 0x95E8: 0x66E1, - 0x95E9: 0x66E2, - 0x95EA: 0x66E3, - 0x95EB: 0x66E4, - 0x95EC: 0x66E5, - 0x95ED: 0x66E7, - 0x95EE: 0x66E8, - 0x95EF: 0x66EA, - 0x95F0: 0x66EB, - 0x95F1: 0x66EC, - 0x95F2: 0x66ED, - 0x95F3: 0x66EE, - 0x95F4: 0x66EF, - 0x95F5: 0x66F1, - 0x95F6: 0x66F5, - 0x95F7: 0x66F6, - 0x95F8: 0x66F8, - 0x95F9: 0x66FA, - 0x95FA: 0x66FB, - 0x95FB: 0x66FD, - 0x95FC: 0x6701, - 0x95FD: 0x6702, - 0x95FE: 0x6703, - 0x9640: 0x6704, - 0x9641: 0x6705, - 0x9642: 0x6706, - 0x9643: 0x6707, - 0x9644: 0x670C, - 0x9645: 0x670E, - 0x9646: 0x670F, - 0x9647: 0x6711, - 0x9648: 0x6712, - 0x9649: 0x6713, - 0x964A: 0x6716, - 0x964B: 0x6718, - 0x964C: 0x6719, - 0x964D: 0x671A, - 0x964E: 0x671C, - 0x964F: 0x671E, - 0x9650: 0x6720, - 0x9651: 0x6721, - 0x9652: 0x6722, - 0x9653: 0x6723, - 0x9654: 0x6724, - 0x9655: 0x6725, - 0x9656: 0x6727, - 0x9657: 0x6729, - 0x9658: 0x672E, - 0x9659: 0x6730, - 0x965A: 0x6732, - 0x965B: 0x6733, - 0x965C: 0x6736, - 0x965D: 0x6737, - 0x965E: 0x6738, - 0x965F: 0x6739, - 0x9660: 0x673B, - 0x9661: 0x673C, - 0x9662: 0x673E, - 0x9663: 0x673F, - 0x9664: 0x6741, - 0x9665: 0x6744, - 0x9666: 0x6745, - 0x9667: 0x6747, - 0x9668: 0x674A, - 0x9669: 0x674B, - 0x966A: 0x674D, - 0x966B: 0x6752, - 0x966C: 0x6754, - 0x966D: 0x6755, - 0x966E: 0x6757, - 0x966F: 0x6758, - 0x9670: 0x6759, - 0x9671: 0x675A, - 0x9672: 0x675B, - 0x9673: 0x675D, - 0x9674: 0x6762, - 0x9675: 0x6763, - 0x9676: 0x6764, - 0x9677: 0x6766, - 0x9678: 0x6767, - 0x9679: 0x676B, - 0x967A: 0x676C, - 0x967B: 0x676E, - 0x967C: 0x6771, - 0x967D: 0x6774, - 0x967E: 0x6776, - 0x9680: 0x6778, - 0x9681: 0x6779, - 0x9682: 0x677A, - 0x9683: 0x677B, - 0x9684: 0x677D, - 0x9685: 0x6780, - 0x9686: 0x6782, - 0x9687: 0x6783, - 0x9688: 0x6785, - 0x9689: 0x6786, - 0x968A: 0x6788, - 0x968B: 0x678A, - 0x968C: 0x678C, - 0x968D: 0x678D, - 0x968E: 0x678E, - 0x968F: 0x678F, - 0x9690: 0x6791, - 0x9691: 0x6792, - 0x9692: 0x6793, - 0x9693: 0x6794, - 0x9694: 0x6796, - 0x9695: 0x6799, - 0x9696: 0x679B, - 0x9697: 0x679F, - 0x9698: 0x67A0, - 0x9699: 0x67A1, - 0x969A: 0x67A4, - 0x969B: 0x67A6, - 0x969C: 0x67A9, - 0x969D: 0x67AC, - 0x969E: 0x67AE, - 0x969F: 0x67B1, - 0x96A0: 0x67B2, - 0x96A1: 0x67B4, - 0x96A2: 0x67B9, - 0x96A3: 0x67BA, - 0x96A4: 0x67BB, - 0x96A5: 0x67BC, - 0x96A6: 0x67BD, - 0x96A7: 0x67BE, - 0x96A8: 0x67BF, - 0x96A9: 0x67C0, - 0x96AA: 0x67C2, - 0x96AB: 0x67C5, - 0x96AC: 0x67C6, - 0x96AD: 0x67C7, - 0x96AE: 0x67C8, - 0x96AF: 0x67C9, - 0x96B0: 0x67CA, - 0x96B1: 0x67CB, - 0x96B2: 0x67CC, - 0x96B3: 0x67CD, - 0x96B4: 0x67CE, - 0x96B5: 0x67D5, - 0x96B6: 0x67D6, - 0x96B7: 0x67D7, - 0x96B8: 0x67DB, - 0x96B9: 0x67DF, - 0x96BA: 0x67E1, - 0x96BB: 0x67E3, - 0x96BC: 0x67E4, - 0x96BD: 0x67E6, - 0x96BE: 0x67E7, - 0x96BF: 0x67E8, - 0x96C0: 0x67EA, - 0x96C1: 0x67EB, - 0x96C2: 0x67ED, - 0x96C3: 0x67EE, - 0x96C4: 0x67F2, - 0x96C5: 0x67F5, - 0x96C6: 0x67F6, - 0x96C7: 0x67F7, - 0x96C8: 0x67F8, - 0x96C9: 0x67F9, - 0x96CA: 0x67FA, - 0x96CB: 0x67FB, - 0x96CC: 0x67FC, - 0x96CD: 0x67FE, - 0x96CE: 0x6801, - 0x96CF: 0x6802, - 0x96D0: 0x6803, - 0x96D1: 0x6804, - 0x96D2: 0x6806, - 0x96D3: 0x680D, - 0x96D4: 0x6810, - 0x96D5: 0x6812, - 0x96D6: 0x6814, - 0x96D7: 0x6815, - 0x96D8: 0x6818, - 0x96D9: 0x6819, - 0x96DA: 0x681A, - 0x96DB: 0x681B, - 0x96DC: 0x681C, - 0x96DD: 0x681E, - 0x96DE: 0x681F, - 0x96DF: 0x6820, - 0x96E0: 0x6822, - 0x96E1: 0x6823, - 0x96E2: 0x6824, - 0x96E3: 0x6825, - 0x96E4: 0x6826, - 0x96E5: 0x6827, - 0x96E6: 0x6828, - 0x96E7: 0x682B, - 0x96E8: 0x682C, - 0x96E9: 0x682D, - 0x96EA: 0x682E, - 0x96EB: 0x682F, - 0x96EC: 0x6830, - 0x96ED: 0x6831, - 0x96EE: 0x6834, - 0x96EF: 0x6835, - 0x96F0: 0x6836, - 0x96F1: 0x683A, - 0x96F2: 0x683B, - 0x96F3: 0x683F, - 0x96F4: 0x6847, - 0x96F5: 0x684B, - 0x96F6: 0x684D, - 0x96F7: 0x684F, - 0x96F8: 0x6852, - 0x96F9: 0x6856, - 0x96FA: 0x6857, - 0x96FB: 0x6858, - 0x96FC: 0x6859, - 0x96FD: 0x685A, - 0x96FE: 0x685B, - 0x9740: 0x685C, - 0x9741: 0x685D, - 0x9742: 0x685E, - 0x9743: 0x685F, - 0x9744: 0x686A, - 0x9745: 0x686C, - 0x9746: 0x686D, - 0x9747: 0x686E, - 0x9748: 0x686F, - 0x9749: 0x6870, - 0x974A: 0x6871, - 0x974B: 0x6872, - 0x974C: 0x6873, - 0x974D: 0x6875, - 0x974E: 0x6878, - 0x974F: 0x6879, - 0x9750: 0x687A, - 0x9751: 0x687B, - 0x9752: 0x687C, - 0x9753: 0x687D, - 0x9754: 0x687E, - 0x9755: 0x687F, - 0x9756: 0x6880, - 0x9757: 0x6882, - 0x9758: 0x6884, - 0x9759: 0x6887, - 0x975A: 0x6888, - 0x975B: 0x6889, - 0x975C: 0x688A, - 0x975D: 0x688B, - 0x975E: 0x688C, - 0x975F: 0x688D, - 0x9760: 0x688E, - 0x9761: 0x6890, - 0x9762: 0x6891, - 0x9763: 0x6892, - 0x9764: 0x6894, - 0x9765: 0x6895, - 0x9766: 0x6896, - 0x9767: 0x6898, - 0x9768: 0x6899, - 0x9769: 0x689A, - 0x976A: 0x689B, - 0x976B: 0x689C, - 0x976C: 0x689D, - 0x976D: 0x689E, - 0x976E: 0x689F, - 0x976F: 0x68A0, - 0x9770: 0x68A1, - 0x9771: 0x68A3, - 0x9772: 0x68A4, - 0x9773: 0x68A5, - 0x9774: 0x68A9, - 0x9775: 0x68AA, - 0x9776: 0x68AB, - 0x9777: 0x68AC, - 0x9778: 0x68AE, - 0x9779: 0x68B1, - 0x977A: 0x68B2, - 0x977B: 0x68B4, - 0x977C: 0x68B6, - 0x977D: 0x68B7, - 0x977E: 0x68B8, - 0x9780: 0x68B9, - 0x9781: 0x68BA, - 0x9782: 0x68BB, - 0x9783: 0x68BC, - 0x9784: 0x68BD, - 0x9785: 0x68BE, - 0x9786: 0x68BF, - 0x9787: 0x68C1, - 0x9788: 0x68C3, - 0x9789: 0x68C4, - 0x978A: 0x68C5, - 0x978B: 0x68C6, - 0x978C: 0x68C7, - 0x978D: 0x68C8, - 0x978E: 0x68CA, - 0x978F: 0x68CC, - 0x9790: 0x68CE, - 0x9791: 0x68CF, - 0x9792: 0x68D0, - 0x9793: 0x68D1, - 0x9794: 0x68D3, - 0x9795: 0x68D4, - 0x9796: 0x68D6, - 0x9797: 0x68D7, - 0x9798: 0x68D9, - 0x9799: 0x68DB, - 0x979A: 0x68DC, - 0x979B: 0x68DD, - 0x979C: 0x68DE, - 0x979D: 0x68DF, - 0x979E: 0x68E1, - 0x979F: 0x68E2, - 0x97A0: 0x68E4, - 0x97A1: 0x68E5, - 0x97A2: 0x68E6, - 0x97A3: 0x68E7, - 0x97A4: 0x68E8, - 0x97A5: 0x68E9, - 0x97A6: 0x68EA, - 0x97A7: 0x68EB, - 0x97A8: 0x68EC, - 0x97A9: 0x68ED, - 0x97AA: 0x68EF, - 0x97AB: 0x68F2, - 0x97AC: 0x68F3, - 0x97AD: 0x68F4, - 0x97AE: 0x68F6, - 0x97AF: 0x68F7, - 0x97B0: 0x68F8, - 0x97B1: 0x68FB, - 0x97B2: 0x68FD, - 0x97B3: 0x68FE, - 0x97B4: 0x68FF, - 0x97B5: 0x6900, - 0x97B6: 0x6902, - 0x97B7: 0x6903, - 0x97B8: 0x6904, - 0x97B9: 0x6906, - 0x97BA: 0x6907, - 0x97BB: 0x6908, - 0x97BC: 0x6909, - 0x97BD: 0x690A, - 0x97BE: 0x690C, - 0x97BF: 0x690F, - 0x97C0: 0x6911, - 0x97C1: 0x6913, - 0x97C2: 0x6914, - 0x97C3: 0x6915, - 0x97C4: 0x6916, - 0x97C5: 0x6917, - 0x97C6: 0x6918, - 0x97C7: 0x6919, - 0x97C8: 0x691A, - 0x97C9: 0x691B, - 0x97CA: 0x691C, - 0x97CB: 0x691D, - 0x97CC: 0x691E, - 0x97CD: 0x6921, - 0x97CE: 0x6922, - 0x97CF: 0x6923, - 0x97D0: 0x6925, - 0x97D1: 0x6926, - 0x97D2: 0x6927, - 0x97D3: 0x6928, - 0x97D4: 0x6929, - 0x97D5: 0x692A, - 0x97D6: 0x692B, - 0x97D7: 0x692C, - 0x97D8: 0x692E, - 0x97D9: 0x692F, - 0x97DA: 0x6931, - 0x97DB: 0x6932, - 0x97DC: 0x6933, - 0x97DD: 0x6935, - 0x97DE: 0x6936, - 0x97DF: 0x6937, - 0x97E0: 0x6938, - 0x97E1: 0x693A, - 0x97E2: 0x693B, - 0x97E3: 0x693C, - 0x97E4: 0x693E, - 0x97E5: 0x6940, - 0x97E6: 0x6941, - 0x97E7: 0x6943, - 0x97E8: 0x6944, - 0x97E9: 0x6945, - 0x97EA: 0x6946, - 0x97EB: 0x6947, - 0x97EC: 0x6948, - 0x97ED: 0x6949, - 0x97EE: 0x694A, - 0x97EF: 0x694B, - 0x97F0: 0x694C, - 0x97F1: 0x694D, - 0x97F2: 0x694E, - 0x97F3: 0x694F, - 0x97F4: 0x6950, - 0x97F5: 0x6951, - 0x97F6: 0x6952, - 0x97F7: 0x6953, - 0x97F8: 0x6955, - 0x97F9: 0x6956, - 0x97FA: 0x6958, - 0x97FB: 0x6959, - 0x97FC: 0x695B, - 0x97FD: 0x695C, - 0x97FE: 0x695F, - 0x9840: 0x6961, - 0x9841: 0x6962, - 0x9842: 0x6964, - 0x9843: 0x6965, - 0x9844: 0x6967, - 0x9845: 0x6968, - 0x9846: 0x6969, - 0x9847: 0x696A, - 0x9848: 0x696C, - 0x9849: 0x696D, - 0x984A: 0x696F, - 0x984B: 0x6970, - 0x984C: 0x6972, - 0x984D: 0x6973, - 0x984E: 0x6974, - 0x984F: 0x6975, - 0x9850: 0x6976, - 0x9851: 0x697A, - 0x9852: 0x697B, - 0x9853: 0x697D, - 0x9854: 0x697E, - 0x9855: 0x697F, - 0x9856: 0x6981, - 0x9857: 0x6983, - 0x9858: 0x6985, - 0x9859: 0x698A, - 0x985A: 0x698B, - 0x985B: 0x698C, - 0x985C: 0x698E, - 0x985D: 0x698F, - 0x985E: 0x6990, - 0x985F: 0x6991, - 0x9860: 0x6992, - 0x9861: 0x6993, - 0x9862: 0x6996, - 0x9863: 0x6997, - 0x9864: 0x6999, - 0x9865: 0x699A, - 0x9866: 0x699D, - 0x9867: 0x699E, - 0x9868: 0x699F, - 0x9869: 0x69A0, - 0x986A: 0x69A1, - 0x986B: 0x69A2, - 0x986C: 0x69A3, - 0x986D: 0x69A4, - 0x986E: 0x69A5, - 0x986F: 0x69A6, - 0x9870: 0x69A9, - 0x9871: 0x69AA, - 0x9872: 0x69AC, - 0x9873: 0x69AE, - 0x9874: 0x69AF, - 0x9875: 0x69B0, - 0x9876: 0x69B2, - 0x9877: 0x69B3, - 0x9878: 0x69B5, - 0x9879: 0x69B6, - 0x987A: 0x69B8, - 0x987B: 0x69B9, - 0x987C: 0x69BA, - 0x987D: 0x69BC, - 0x987E: 0x69BD, - 0x9880: 0x69BE, - 0x9881: 0x69BF, - 0x9882: 0x69C0, - 0x9883: 0x69C2, - 0x9884: 0x69C3, - 0x9885: 0x69C4, - 0x9886: 0x69C5, - 0x9887: 0x69C6, - 0x9888: 0x69C7, - 0x9889: 0x69C8, - 0x988A: 0x69C9, - 0x988B: 0x69CB, - 0x988C: 0x69CD, - 0x988D: 0x69CF, - 0x988E: 0x69D1, - 0x988F: 0x69D2, - 0x9890: 0x69D3, - 0x9891: 0x69D5, - 0x9892: 0x69D6, - 0x9893: 0x69D7, - 0x9894: 0x69D8, - 0x9895: 0x69D9, - 0x9896: 0x69DA, - 0x9897: 0x69DC, - 0x9898: 0x69DD, - 0x9899: 0x69DE, - 0x989A: 0x69E1, - 0x989B: 0x69E2, - 0x989C: 0x69E3, - 0x989D: 0x69E4, - 0x989E: 0x69E5, - 0x989F: 0x69E6, - 0x98A0: 0x69E7, - 0x98A1: 0x69E8, - 0x98A2: 0x69E9, - 0x98A3: 0x69EA, - 0x98A4: 0x69EB, - 0x98A5: 0x69EC, - 0x98A6: 0x69EE, - 0x98A7: 0x69EF, - 0x98A8: 0x69F0, - 0x98A9: 0x69F1, - 0x98AA: 0x69F3, - 0x98AB: 0x69F4, - 0x98AC: 0x69F5, - 0x98AD: 0x69F6, - 0x98AE: 0x69F7, - 0x98AF: 0x69F8, - 0x98B0: 0x69F9, - 0x98B1: 0x69FA, - 0x98B2: 0x69FB, - 0x98B3: 0x69FC, - 0x98B4: 0x69FE, - 0x98B5: 0x6A00, - 0x98B6: 0x6A01, - 0x98B7: 0x6A02, - 0x98B8: 0x6A03, - 0x98B9: 0x6A04, - 0x98BA: 0x6A05, - 0x98BB: 0x6A06, - 0x98BC: 0x6A07, - 0x98BD: 0x6A08, - 0x98BE: 0x6A09, - 0x98BF: 0x6A0B, - 0x98C0: 0x6A0C, - 0x98C1: 0x6A0D, - 0x98C2: 0x6A0E, - 0x98C3: 0x6A0F, - 0x98C4: 0x6A10, - 0x98C5: 0x6A11, - 0x98C6: 0x6A12, - 0x98C7: 0x6A13, - 0x98C8: 0x6A14, - 0x98C9: 0x6A15, - 0x98CA: 0x6A16, - 0x98CB: 0x6A19, - 0x98CC: 0x6A1A, - 0x98CD: 0x6A1B, - 0x98CE: 0x6A1C, - 0x98CF: 0x6A1D, - 0x98D0: 0x6A1E, - 0x98D1: 0x6A20, - 0x98D2: 0x6A22, - 0x98D3: 0x6A23, - 0x98D4: 0x6A24, - 0x98D5: 0x6A25, - 0x98D6: 0x6A26, - 0x98D7: 0x6A27, - 0x98D8: 0x6A29, - 0x98D9: 0x6A2B, - 0x98DA: 0x6A2C, - 0x98DB: 0x6A2D, - 0x98DC: 0x6A2E, - 0x98DD: 0x6A30, - 0x98DE: 0x6A32, - 0x98DF: 0x6A33, - 0x98E0: 0x6A34, - 0x98E1: 0x6A36, - 0x98E2: 0x6A37, - 0x98E3: 0x6A38, - 0x98E4: 0x6A39, - 0x98E5: 0x6A3A, - 0x98E6: 0x6A3B, - 0x98E7: 0x6A3C, - 0x98E8: 0x6A3F, - 0x98E9: 0x6A40, - 0x98EA: 0x6A41, - 0x98EB: 0x6A42, - 0x98EC: 0x6A43, - 0x98ED: 0x6A45, - 0x98EE: 0x6A46, - 0x98EF: 0x6A48, - 0x98F0: 0x6A49, - 0x98F1: 0x6A4A, - 0x98F2: 0x6A4B, - 0x98F3: 0x6A4C, - 0x98F4: 0x6A4D, - 0x98F5: 0x6A4E, - 0x98F6: 0x6A4F, - 0x98F7: 0x6A51, - 0x98F8: 0x6A52, - 0x98F9: 0x6A53, - 0x98FA: 0x6A54, - 0x98FB: 0x6A55, - 0x98FC: 0x6A56, - 0x98FD: 0x6A57, - 0x98FE: 0x6A5A, - 0x9940: 0x6A5C, - 0x9941: 0x6A5D, - 0x9942: 0x6A5E, - 0x9943: 0x6A5F, - 0x9944: 0x6A60, - 0x9945: 0x6A62, - 0x9946: 0x6A63, - 0x9947: 0x6A64, - 0x9948: 0x6A66, - 0x9949: 0x6A67, - 0x994A: 0x6A68, - 0x994B: 0x6A69, - 0x994C: 0x6A6A, - 0x994D: 0x6A6B, - 0x994E: 0x6A6C, - 0x994F: 0x6A6D, - 0x9950: 0x6A6E, - 0x9951: 0x6A6F, - 0x9952: 0x6A70, - 0x9953: 0x6A72, - 0x9954: 0x6A73, - 0x9955: 0x6A74, - 0x9956: 0x6A75, - 0x9957: 0x6A76, - 0x9958: 0x6A77, - 0x9959: 0x6A78, - 0x995A: 0x6A7A, - 0x995B: 0x6A7B, - 0x995C: 0x6A7D, - 0x995D: 0x6A7E, - 0x995E: 0x6A7F, - 0x995F: 0x6A81, - 0x9960: 0x6A82, - 0x9961: 0x6A83, - 0x9962: 0x6A85, - 0x9963: 0x6A86, - 0x9964: 0x6A87, - 0x9965: 0x6A88, - 0x9966: 0x6A89, - 0x9967: 0x6A8A, - 0x9968: 0x6A8B, - 0x9969: 0x6A8C, - 0x996A: 0x6A8D, - 0x996B: 0x6A8F, - 0x996C: 0x6A92, - 0x996D: 0x6A93, - 0x996E: 0x6A94, - 0x996F: 0x6A95, - 0x9970: 0x6A96, - 0x9971: 0x6A98, - 0x9972: 0x6A99, - 0x9973: 0x6A9A, - 0x9974: 0x6A9B, - 0x9975: 0x6A9C, - 0x9976: 0x6A9D, - 0x9977: 0x6A9E, - 0x9978: 0x6A9F, - 0x9979: 0x6AA1, - 0x997A: 0x6AA2, - 0x997B: 0x6AA3, - 0x997C: 0x6AA4, - 0x997D: 0x6AA5, - 0x997E: 0x6AA6, - 0x9980: 0x6AA7, - 0x9981: 0x6AA8, - 0x9982: 0x6AAA, - 0x9983: 0x6AAD, - 0x9984: 0x6AAE, - 0x9985: 0x6AAF, - 0x9986: 0x6AB0, - 0x9987: 0x6AB1, - 0x9988: 0x6AB2, - 0x9989: 0x6AB3, - 0x998A: 0x6AB4, - 0x998B: 0x6AB5, - 0x998C: 0x6AB6, - 0x998D: 0x6AB7, - 0x998E: 0x6AB8, - 0x998F: 0x6AB9, - 0x9990: 0x6ABA, - 0x9991: 0x6ABB, - 0x9992: 0x6ABC, - 0x9993: 0x6ABD, - 0x9994: 0x6ABE, - 0x9995: 0x6ABF, - 0x9996: 0x6AC0, - 0x9997: 0x6AC1, - 0x9998: 0x6AC2, - 0x9999: 0x6AC3, - 0x999A: 0x6AC4, - 0x999B: 0x6AC5, - 0x999C: 0x6AC6, - 0x999D: 0x6AC7, - 0x999E: 0x6AC8, - 0x999F: 0x6AC9, - 0x99A0: 0x6ACA, - 0x99A1: 0x6ACB, - 0x99A2: 0x6ACC, - 0x99A3: 0x6ACD, - 0x99A4: 0x6ACE, - 0x99A5: 0x6ACF, - 0x99A6: 0x6AD0, - 0x99A7: 0x6AD1, - 0x99A8: 0x6AD2, - 0x99A9: 0x6AD3, - 0x99AA: 0x6AD4, - 0x99AB: 0x6AD5, - 0x99AC: 0x6AD6, - 0x99AD: 0x6AD7, - 0x99AE: 0x6AD8, - 0x99AF: 0x6AD9, - 0x99B0: 0x6ADA, - 0x99B1: 0x6ADB, - 0x99B2: 0x6ADC, - 0x99B3: 0x6ADD, - 0x99B4: 0x6ADE, - 0x99B5: 0x6ADF, - 0x99B6: 0x6AE0, - 0x99B7: 0x6AE1, - 0x99B8: 0x6AE2, - 0x99B9: 0x6AE3, - 0x99BA: 0x6AE4, - 0x99BB: 0x6AE5, - 0x99BC: 0x6AE6, - 0x99BD: 0x6AE7, - 0x99BE: 0x6AE8, - 0x99BF: 0x6AE9, - 0x99C0: 0x6AEA, - 0x99C1: 0x6AEB, - 0x99C2: 0x6AEC, - 0x99C3: 0x6AED, - 0x99C4: 0x6AEE, - 0x99C5: 0x6AEF, - 0x99C6: 0x6AF0, - 0x99C7: 0x6AF1, - 0x99C8: 0x6AF2, - 0x99C9: 0x6AF3, - 0x99CA: 0x6AF4, - 0x99CB: 0x6AF5, - 0x99CC: 0x6AF6, - 0x99CD: 0x6AF7, - 0x99CE: 0x6AF8, - 0x99CF: 0x6AF9, - 0x99D0: 0x6AFA, - 0x99D1: 0x6AFB, - 0x99D2: 0x6AFC, - 0x99D3: 0x6AFD, - 0x99D4: 0x6AFE, - 0x99D5: 0x6AFF, - 0x99D6: 0x6B00, - 0x99D7: 0x6B01, - 0x99D8: 0x6B02, - 0x99D9: 0x6B03, - 0x99DA: 0x6B04, - 0x99DB: 0x6B05, - 0x99DC: 0x6B06, - 0x99DD: 0x6B07, - 0x99DE: 0x6B08, - 0x99DF: 0x6B09, - 0x99E0: 0x6B0A, - 0x99E1: 0x6B0B, - 0x99E2: 0x6B0C, - 0x99E3: 0x6B0D, - 0x99E4: 0x6B0E, - 0x99E5: 0x6B0F, - 0x99E6: 0x6B10, - 0x99E7: 0x6B11, - 0x99E8: 0x6B12, - 0x99E9: 0x6B13, - 0x99EA: 0x6B14, - 0x99EB: 0x6B15, - 0x99EC: 0x6B16, - 0x99ED: 0x6B17, - 0x99EE: 0x6B18, - 0x99EF: 0x6B19, - 0x99F0: 0x6B1A, - 0x99F1: 0x6B1B, - 0x99F2: 0x6B1C, - 0x99F3: 0x6B1D, - 0x99F4: 0x6B1E, - 0x99F5: 0x6B1F, - 0x99F6: 0x6B25, - 0x99F7: 0x6B26, - 0x99F8: 0x6B28, - 0x99F9: 0x6B29, - 0x99FA: 0x6B2A, - 0x99FB: 0x6B2B, - 0x99FC: 0x6B2C, - 0x99FD: 0x6B2D, - 0x99FE: 0x6B2E, - 0x9A40: 0x6B2F, - 0x9A41: 0x6B30, - 0x9A42: 0x6B31, - 0x9A43: 0x6B33, - 0x9A44: 0x6B34, - 0x9A45: 0x6B35, - 0x9A46: 0x6B36, - 0x9A47: 0x6B38, - 0x9A48: 0x6B3B, - 0x9A49: 0x6B3C, - 0x9A4A: 0x6B3D, - 0x9A4B: 0x6B3F, - 0x9A4C: 0x6B40, - 0x9A4D: 0x6B41, - 0x9A4E: 0x6B42, - 0x9A4F: 0x6B44, - 0x9A50: 0x6B45, - 0x9A51: 0x6B48, - 0x9A52: 0x6B4A, - 0x9A53: 0x6B4B, - 0x9A54: 0x6B4D, - 0x9A55: 0x6B4E, - 0x9A56: 0x6B4F, - 0x9A57: 0x6B50, - 0x9A58: 0x6B51, - 0x9A59: 0x6B52, - 0x9A5A: 0x6B53, - 0x9A5B: 0x6B54, - 0x9A5C: 0x6B55, - 0x9A5D: 0x6B56, - 0x9A5E: 0x6B57, - 0x9A5F: 0x6B58, - 0x9A60: 0x6B5A, - 0x9A61: 0x6B5B, - 0x9A62: 0x6B5C, - 0x9A63: 0x6B5D, - 0x9A64: 0x6B5E, - 0x9A65: 0x6B5F, - 0x9A66: 0x6B60, - 0x9A67: 0x6B61, - 0x9A68: 0x6B68, - 0x9A69: 0x6B69, - 0x9A6A: 0x6B6B, - 0x9A6B: 0x6B6C, - 0x9A6C: 0x6B6D, - 0x9A6D: 0x6B6E, - 0x9A6E: 0x6B6F, - 0x9A6F: 0x6B70, - 0x9A70: 0x6B71, - 0x9A71: 0x6B72, - 0x9A72: 0x6B73, - 0x9A73: 0x6B74, - 0x9A74: 0x6B75, - 0x9A75: 0x6B76, - 0x9A76: 0x6B77, - 0x9A77: 0x6B78, - 0x9A78: 0x6B7A, - 0x9A79: 0x6B7D, - 0x9A7A: 0x6B7E, - 0x9A7B: 0x6B7F, - 0x9A7C: 0x6B80, - 0x9A7D: 0x6B85, - 0x9A7E: 0x6B88, - 0x9A80: 0x6B8C, - 0x9A81: 0x6B8E, - 0x9A82: 0x6B8F, - 0x9A83: 0x6B90, - 0x9A84: 0x6B91, - 0x9A85: 0x6B94, - 0x9A86: 0x6B95, - 0x9A87: 0x6B97, - 0x9A88: 0x6B98, - 0x9A89: 0x6B99, - 0x9A8A: 0x6B9C, - 0x9A8B: 0x6B9D, - 0x9A8C: 0x6B9E, - 0x9A8D: 0x6B9F, - 0x9A8E: 0x6BA0, - 0x9A8F: 0x6BA2, - 0x9A90: 0x6BA3, - 0x9A91: 0x6BA4, - 0x9A92: 0x6BA5, - 0x9A93: 0x6BA6, - 0x9A94: 0x6BA7, - 0x9A95: 0x6BA8, - 0x9A96: 0x6BA9, - 0x9A97: 0x6BAB, - 0x9A98: 0x6BAC, - 0x9A99: 0x6BAD, - 0x9A9A: 0x6BAE, - 0x9A9B: 0x6BAF, - 0x9A9C: 0x6BB0, - 0x9A9D: 0x6BB1, - 0x9A9E: 0x6BB2, - 0x9A9F: 0x6BB6, - 0x9AA0: 0x6BB8, - 0x9AA1: 0x6BB9, - 0x9AA2: 0x6BBA, - 0x9AA3: 0x6BBB, - 0x9AA4: 0x6BBC, - 0x9AA5: 0x6BBD, - 0x9AA6: 0x6BBE, - 0x9AA7: 0x6BC0, - 0x9AA8: 0x6BC3, - 0x9AA9: 0x6BC4, - 0x9AAA: 0x6BC6, - 0x9AAB: 0x6BC7, - 0x9AAC: 0x6BC8, - 0x9AAD: 0x6BC9, - 0x9AAE: 0x6BCA, - 0x9AAF: 0x6BCC, - 0x9AB0: 0x6BCE, - 0x9AB1: 0x6BD0, - 0x9AB2: 0x6BD1, - 0x9AB3: 0x6BD8, - 0x9AB4: 0x6BDA, - 0x9AB5: 0x6BDC, - 0x9AB6: 0x6BDD, - 0x9AB7: 0x6BDE, - 0x9AB8: 0x6BDF, - 0x9AB9: 0x6BE0, - 0x9ABA: 0x6BE2, - 0x9ABB: 0x6BE3, - 0x9ABC: 0x6BE4, - 0x9ABD: 0x6BE5, - 0x9ABE: 0x6BE6, - 0x9ABF: 0x6BE7, - 0x9AC0: 0x6BE8, - 0x9AC1: 0x6BE9, - 0x9AC2: 0x6BEC, - 0x9AC3: 0x6BED, - 0x9AC4: 0x6BEE, - 0x9AC5: 0x6BF0, - 0x9AC6: 0x6BF1, - 0x9AC7: 0x6BF2, - 0x9AC8: 0x6BF4, - 0x9AC9: 0x6BF6, - 0x9ACA: 0x6BF7, - 0x9ACB: 0x6BF8, - 0x9ACC: 0x6BFA, - 0x9ACD: 0x6BFB, - 0x9ACE: 0x6BFC, - 0x9ACF: 0x6BFE, - 0x9AD0: 0x6BFF, - 0x9AD1: 0x6C00, - 0x9AD2: 0x6C01, - 0x9AD3: 0x6C02, - 0x9AD4: 0x6C03, - 0x9AD5: 0x6C04, - 0x9AD6: 0x6C08, - 0x9AD7: 0x6C09, - 0x9AD8: 0x6C0A, - 0x9AD9: 0x6C0B, - 0x9ADA: 0x6C0C, - 0x9ADB: 0x6C0E, - 0x9ADC: 0x6C12, - 0x9ADD: 0x6C17, - 0x9ADE: 0x6C1C, - 0x9ADF: 0x6C1D, - 0x9AE0: 0x6C1E, - 0x9AE1: 0x6C20, - 0x9AE2: 0x6C23, - 0x9AE3: 0x6C25, - 0x9AE4: 0x6C2B, - 0x9AE5: 0x6C2C, - 0x9AE6: 0x6C2D, - 0x9AE7: 0x6C31, - 0x9AE8: 0x6C33, - 0x9AE9: 0x6C36, - 0x9AEA: 0x6C37, - 0x9AEB: 0x6C39, - 0x9AEC: 0x6C3A, - 0x9AED: 0x6C3B, - 0x9AEE: 0x6C3C, - 0x9AEF: 0x6C3E, - 0x9AF0: 0x6C3F, - 0x9AF1: 0x6C43, - 0x9AF2: 0x6C44, - 0x9AF3: 0x6C45, - 0x9AF4: 0x6C48, - 0x9AF5: 0x6C4B, - 0x9AF6: 0x6C4C, - 0x9AF7: 0x6C4D, - 0x9AF8: 0x6C4E, - 0x9AF9: 0x6C4F, - 0x9AFA: 0x6C51, - 0x9AFB: 0x6C52, - 0x9AFC: 0x6C53, - 0x9AFD: 0x6C56, - 0x9AFE: 0x6C58, - 0x9B40: 0x6C59, - 0x9B41: 0x6C5A, - 0x9B42: 0x6C62, - 0x9B43: 0x6C63, - 0x9B44: 0x6C65, - 0x9B45: 0x6C66, - 0x9B46: 0x6C67, - 0x9B47: 0x6C6B, - 0x9B48: 0x6C6C, - 0x9B49: 0x6C6D, - 0x9B4A: 0x6C6E, - 0x9B4B: 0x6C6F, - 0x9B4C: 0x6C71, - 0x9B4D: 0x6C73, - 0x9B4E: 0x6C75, - 0x9B4F: 0x6C77, - 0x9B50: 0x6C78, - 0x9B51: 0x6C7A, - 0x9B52: 0x6C7B, - 0x9B53: 0x6C7C, - 0x9B54: 0x6C7F, - 0x9B55: 0x6C80, - 0x9B56: 0x6C84, - 0x9B57: 0x6C87, - 0x9B58: 0x6C8A, - 0x9B59: 0x6C8B, - 0x9B5A: 0x6C8D, - 0x9B5B: 0x6C8E, - 0x9B5C: 0x6C91, - 0x9B5D: 0x6C92, - 0x9B5E: 0x6C95, - 0x9B5F: 0x6C96, - 0x9B60: 0x6C97, - 0x9B61: 0x6C98, - 0x9B62: 0x6C9A, - 0x9B63: 0x6C9C, - 0x9B64: 0x6C9D, - 0x9B65: 0x6C9E, - 0x9B66: 0x6CA0, - 0x9B67: 0x6CA2, - 0x9B68: 0x6CA8, - 0x9B69: 0x6CAC, - 0x9B6A: 0x6CAF, - 0x9B6B: 0x6CB0, - 0x9B6C: 0x6CB4, - 0x9B6D: 0x6CB5, - 0x9B6E: 0x6CB6, - 0x9B6F: 0x6CB7, - 0x9B70: 0x6CBA, - 0x9B71: 0x6CC0, - 0x9B72: 0x6CC1, - 0x9B73: 0x6CC2, - 0x9B74: 0x6CC3, - 0x9B75: 0x6CC6, - 0x9B76: 0x6CC7, - 0x9B77: 0x6CC8, - 0x9B78: 0x6CCB, - 0x9B79: 0x6CCD, - 0x9B7A: 0x6CCE, - 0x9B7B: 0x6CCF, - 0x9B7C: 0x6CD1, - 0x9B7D: 0x6CD2, - 0x9B7E: 0x6CD8, - 0x9B80: 0x6CD9, - 0x9B81: 0x6CDA, - 0x9B82: 0x6CDC, - 0x9B83: 0x6CDD, - 0x9B84: 0x6CDF, - 0x9B85: 0x6CE4, - 0x9B86: 0x6CE6, - 0x9B87: 0x6CE7, - 0x9B88: 0x6CE9, - 0x9B89: 0x6CEC, - 0x9B8A: 0x6CED, - 0x9B8B: 0x6CF2, - 0x9B8C: 0x6CF4, - 0x9B8D: 0x6CF9, - 0x9B8E: 0x6CFF, - 0x9B8F: 0x6D00, - 0x9B90: 0x6D02, - 0x9B91: 0x6D03, - 0x9B92: 0x6D05, - 0x9B93: 0x6D06, - 0x9B94: 0x6D08, - 0x9B95: 0x6D09, - 0x9B96: 0x6D0A, - 0x9B97: 0x6D0D, - 0x9B98: 0x6D0F, - 0x9B99: 0x6D10, - 0x9B9A: 0x6D11, - 0x9B9B: 0x6D13, - 0x9B9C: 0x6D14, - 0x9B9D: 0x6D15, - 0x9B9E: 0x6D16, - 0x9B9F: 0x6D18, - 0x9BA0: 0x6D1C, - 0x9BA1: 0x6D1D, - 0x9BA2: 0x6D1F, - 0x9BA3: 0x6D20, - 0x9BA4: 0x6D21, - 0x9BA5: 0x6D22, - 0x9BA6: 0x6D23, - 0x9BA7: 0x6D24, - 0x9BA8: 0x6D26, - 0x9BA9: 0x6D28, - 0x9BAA: 0x6D29, - 0x9BAB: 0x6D2C, - 0x9BAC: 0x6D2D, - 0x9BAD: 0x6D2F, - 0x9BAE: 0x6D30, - 0x9BAF: 0x6D34, - 0x9BB0: 0x6D36, - 0x9BB1: 0x6D37, - 0x9BB2: 0x6D38, - 0x9BB3: 0x6D3A, - 0x9BB4: 0x6D3F, - 0x9BB5: 0x6D40, - 0x9BB6: 0x6D42, - 0x9BB7: 0x6D44, - 0x9BB8: 0x6D49, - 0x9BB9: 0x6D4C, - 0x9BBA: 0x6D50, - 0x9BBB: 0x6D55, - 0x9BBC: 0x6D56, - 0x9BBD: 0x6D57, - 0x9BBE: 0x6D58, - 0x9BBF: 0x6D5B, - 0x9BC0: 0x6D5D, - 0x9BC1: 0x6D5F, - 0x9BC2: 0x6D61, - 0x9BC3: 0x6D62, - 0x9BC4: 0x6D64, - 0x9BC5: 0x6D65, - 0x9BC6: 0x6D67, - 0x9BC7: 0x6D68, - 0x9BC8: 0x6D6B, - 0x9BC9: 0x6D6C, - 0x9BCA: 0x6D6D, - 0x9BCB: 0x6D70, - 0x9BCC: 0x6D71, - 0x9BCD: 0x6D72, - 0x9BCE: 0x6D73, - 0x9BCF: 0x6D75, - 0x9BD0: 0x6D76, - 0x9BD1: 0x6D79, - 0x9BD2: 0x6D7A, - 0x9BD3: 0x6D7B, - 0x9BD4: 0x6D7D, - 0x9BD5: 0x6D7E, - 0x9BD6: 0x6D7F, - 0x9BD7: 0x6D80, - 0x9BD8: 0x6D81, - 0x9BD9: 0x6D83, - 0x9BDA: 0x6D84, - 0x9BDB: 0x6D86, - 0x9BDC: 0x6D87, - 0x9BDD: 0x6D8A, - 0x9BDE: 0x6D8B, - 0x9BDF: 0x6D8D, - 0x9BE0: 0x6D8F, - 0x9BE1: 0x6D90, - 0x9BE2: 0x6D92, - 0x9BE3: 0x6D96, - 0x9BE4: 0x6D97, - 0x9BE5: 0x6D98, - 0x9BE6: 0x6D99, - 0x9BE7: 0x6D9A, - 0x9BE8: 0x6D9C, - 0x9BE9: 0x6DA2, - 0x9BEA: 0x6DA5, - 0x9BEB: 0x6DAC, - 0x9BEC: 0x6DAD, - 0x9BED: 0x6DB0, - 0x9BEE: 0x6DB1, - 0x9BEF: 0x6DB3, - 0x9BF0: 0x6DB4, - 0x9BF1: 0x6DB6, - 0x9BF2: 0x6DB7, - 0x9BF3: 0x6DB9, - 0x9BF4: 0x6DBA, - 0x9BF5: 0x6DBB, - 0x9BF6: 0x6DBC, - 0x9BF7: 0x6DBD, - 0x9BF8: 0x6DBE, - 0x9BF9: 0x6DC1, - 0x9BFA: 0x6DC2, - 0x9BFB: 0x6DC3, - 0x9BFC: 0x6DC8, - 0x9BFD: 0x6DC9, - 0x9BFE: 0x6DCA, - 0x9C40: 0x6DCD, - 0x9C41: 0x6DCE, - 0x9C42: 0x6DCF, - 0x9C43: 0x6DD0, - 0x9C44: 0x6DD2, - 0x9C45: 0x6DD3, - 0x9C46: 0x6DD4, - 0x9C47: 0x6DD5, - 0x9C48: 0x6DD7, - 0x9C49: 0x6DDA, - 0x9C4A: 0x6DDB, - 0x9C4B: 0x6DDC, - 0x9C4C: 0x6DDF, - 0x9C4D: 0x6DE2, - 0x9C4E: 0x6DE3, - 0x9C4F: 0x6DE5, - 0x9C50: 0x6DE7, - 0x9C51: 0x6DE8, - 0x9C52: 0x6DE9, - 0x9C53: 0x6DEA, - 0x9C54: 0x6DED, - 0x9C55: 0x6DEF, - 0x9C56: 0x6DF0, - 0x9C57: 0x6DF2, - 0x9C58: 0x6DF4, - 0x9C59: 0x6DF5, - 0x9C5A: 0x6DF6, - 0x9C5B: 0x6DF8, - 0x9C5C: 0x6DFA, - 0x9C5D: 0x6DFD, - 0x9C5E: 0x6DFE, - 0x9C5F: 0x6DFF, - 0x9C60: 0x6E00, - 0x9C61: 0x6E01, - 0x9C62: 0x6E02, - 0x9C63: 0x6E03, - 0x9C64: 0x6E04, - 0x9C65: 0x6E06, - 0x9C66: 0x6E07, - 0x9C67: 0x6E08, - 0x9C68: 0x6E09, - 0x9C69: 0x6E0B, - 0x9C6A: 0x6E0F, - 0x9C6B: 0x6E12, - 0x9C6C: 0x6E13, - 0x9C6D: 0x6E15, - 0x9C6E: 0x6E18, - 0x9C6F: 0x6E19, - 0x9C70: 0x6E1B, - 0x9C71: 0x6E1C, - 0x9C72: 0x6E1E, - 0x9C73: 0x6E1F, - 0x9C74: 0x6E22, - 0x9C75: 0x6E26, - 0x9C76: 0x6E27, - 0x9C77: 0x6E28, - 0x9C78: 0x6E2A, - 0x9C79: 0x6E2C, - 0x9C7A: 0x6E2E, - 0x9C7B: 0x6E30, - 0x9C7C: 0x6E31, - 0x9C7D: 0x6E33, - 0x9C7E: 0x6E35, - 0x9C80: 0x6E36, - 0x9C81: 0x6E37, - 0x9C82: 0x6E39, - 0x9C83: 0x6E3B, - 0x9C84: 0x6E3C, - 0x9C85: 0x6E3D, - 0x9C86: 0x6E3E, - 0x9C87: 0x6E3F, - 0x9C88: 0x6E40, - 0x9C89: 0x6E41, - 0x9C8A: 0x6E42, - 0x9C8B: 0x6E45, - 0x9C8C: 0x6E46, - 0x9C8D: 0x6E47, - 0x9C8E: 0x6E48, - 0x9C8F: 0x6E49, - 0x9C90: 0x6E4A, - 0x9C91: 0x6E4B, - 0x9C92: 0x6E4C, - 0x9C93: 0x6E4F, - 0x9C94: 0x6E50, - 0x9C95: 0x6E51, - 0x9C96: 0x6E52, - 0x9C97: 0x6E55, - 0x9C98: 0x6E57, - 0x9C99: 0x6E59, - 0x9C9A: 0x6E5A, - 0x9C9B: 0x6E5C, - 0x9C9C: 0x6E5D, - 0x9C9D: 0x6E5E, - 0x9C9E: 0x6E60, - 0x9C9F: 0x6E61, - 0x9CA0: 0x6E62, - 0x9CA1: 0x6E63, - 0x9CA2: 0x6E64, - 0x9CA3: 0x6E65, - 0x9CA4: 0x6E66, - 0x9CA5: 0x6E67, - 0x9CA6: 0x6E68, - 0x9CA7: 0x6E69, - 0x9CA8: 0x6E6A, - 0x9CA9: 0x6E6C, - 0x9CAA: 0x6E6D, - 0x9CAB: 0x6E6F, - 0x9CAC: 0x6E70, - 0x9CAD: 0x6E71, - 0x9CAE: 0x6E72, - 0x9CAF: 0x6E73, - 0x9CB0: 0x6E74, - 0x9CB1: 0x6E75, - 0x9CB2: 0x6E76, - 0x9CB3: 0x6E77, - 0x9CB4: 0x6E78, - 0x9CB5: 0x6E79, - 0x9CB6: 0x6E7A, - 0x9CB7: 0x6E7B, - 0x9CB8: 0x6E7C, - 0x9CB9: 0x6E7D, - 0x9CBA: 0x6E80, - 0x9CBB: 0x6E81, - 0x9CBC: 0x6E82, - 0x9CBD: 0x6E84, - 0x9CBE: 0x6E87, - 0x9CBF: 0x6E88, - 0x9CC0: 0x6E8A, - 0x9CC1: 0x6E8B, - 0x9CC2: 0x6E8C, - 0x9CC3: 0x6E8D, - 0x9CC4: 0x6E8E, - 0x9CC5: 0x6E91, - 0x9CC6: 0x6E92, - 0x9CC7: 0x6E93, - 0x9CC8: 0x6E94, - 0x9CC9: 0x6E95, - 0x9CCA: 0x6E96, - 0x9CCB: 0x6E97, - 0x9CCC: 0x6E99, - 0x9CCD: 0x6E9A, - 0x9CCE: 0x6E9B, - 0x9CCF: 0x6E9D, - 0x9CD0: 0x6E9E, - 0x9CD1: 0x6EA0, - 0x9CD2: 0x6EA1, - 0x9CD3: 0x6EA3, - 0x9CD4: 0x6EA4, - 0x9CD5: 0x6EA6, - 0x9CD6: 0x6EA8, - 0x9CD7: 0x6EA9, - 0x9CD8: 0x6EAB, - 0x9CD9: 0x6EAC, - 0x9CDA: 0x6EAD, - 0x9CDB: 0x6EAE, - 0x9CDC: 0x6EB0, - 0x9CDD: 0x6EB3, - 0x9CDE: 0x6EB5, - 0x9CDF: 0x6EB8, - 0x9CE0: 0x6EB9, - 0x9CE1: 0x6EBC, - 0x9CE2: 0x6EBE, - 0x9CE3: 0x6EBF, - 0x9CE4: 0x6EC0, - 0x9CE5: 0x6EC3, - 0x9CE6: 0x6EC4, - 0x9CE7: 0x6EC5, - 0x9CE8: 0x6EC6, - 0x9CE9: 0x6EC8, - 0x9CEA: 0x6EC9, - 0x9CEB: 0x6ECA, - 0x9CEC: 0x6ECC, - 0x9CED: 0x6ECD, - 0x9CEE: 0x6ECE, - 0x9CEF: 0x6ED0, - 0x9CF0: 0x6ED2, - 0x9CF1: 0x6ED6, - 0x9CF2: 0x6ED8, - 0x9CF3: 0x6ED9, - 0x9CF4: 0x6EDB, - 0x9CF5: 0x6EDC, - 0x9CF6: 0x6EDD, - 0x9CF7: 0x6EE3, - 0x9CF8: 0x6EE7, - 0x9CF9: 0x6EEA, - 0x9CFA: 0x6EEB, - 0x9CFB: 0x6EEC, - 0x9CFC: 0x6EED, - 0x9CFD: 0x6EEE, - 0x9CFE: 0x6EEF, - 0x9D40: 0x6EF0, - 0x9D41: 0x6EF1, - 0x9D42: 0x6EF2, - 0x9D43: 0x6EF3, - 0x9D44: 0x6EF5, - 0x9D45: 0x6EF6, - 0x9D46: 0x6EF7, - 0x9D47: 0x6EF8, - 0x9D48: 0x6EFA, - 0x9D49: 0x6EFB, - 0x9D4A: 0x6EFC, - 0x9D4B: 0x6EFD, - 0x9D4C: 0x6EFE, - 0x9D4D: 0x6EFF, - 0x9D4E: 0x6F00, - 0x9D4F: 0x6F01, - 0x9D50: 0x6F03, - 0x9D51: 0x6F04, - 0x9D52: 0x6F05, - 0x9D53: 0x6F07, - 0x9D54: 0x6F08, - 0x9D55: 0x6F0A, - 0x9D56: 0x6F0B, - 0x9D57: 0x6F0C, - 0x9D58: 0x6F0D, - 0x9D59: 0x6F0E, - 0x9D5A: 0x6F10, - 0x9D5B: 0x6F11, - 0x9D5C: 0x6F12, - 0x9D5D: 0x6F16, - 0x9D5E: 0x6F17, - 0x9D5F: 0x6F18, - 0x9D60: 0x6F19, - 0x9D61: 0x6F1A, - 0x9D62: 0x6F1B, - 0x9D63: 0x6F1C, - 0x9D64: 0x6F1D, - 0x9D65: 0x6F1E, - 0x9D66: 0x6F1F, - 0x9D67: 0x6F21, - 0x9D68: 0x6F22, - 0x9D69: 0x6F23, - 0x9D6A: 0x6F25, - 0x9D6B: 0x6F26, - 0x9D6C: 0x6F27, - 0x9D6D: 0x6F28, - 0x9D6E: 0x6F2C, - 0x9D6F: 0x6F2E, - 0x9D70: 0x6F30, - 0x9D71: 0x6F32, - 0x9D72: 0x6F34, - 0x9D73: 0x6F35, - 0x9D74: 0x6F37, - 0x9D75: 0x6F38, - 0x9D76: 0x6F39, - 0x9D77: 0x6F3A, - 0x9D78: 0x6F3B, - 0x9D79: 0x6F3C, - 0x9D7A: 0x6F3D, - 0x9D7B: 0x6F3F, - 0x9D7C: 0x6F40, - 0x9D7D: 0x6F41, - 0x9D7E: 0x6F42, - 0x9D80: 0x6F43, - 0x9D81: 0x6F44, - 0x9D82: 0x6F45, - 0x9D83: 0x6F48, - 0x9D84: 0x6F49, - 0x9D85: 0x6F4A, - 0x9D86: 0x6F4C, - 0x9D87: 0x6F4E, - 0x9D88: 0x6F4F, - 0x9D89: 0x6F50, - 0x9D8A: 0x6F51, - 0x9D8B: 0x6F52, - 0x9D8C: 0x6F53, - 0x9D8D: 0x6F54, - 0x9D8E: 0x6F55, - 0x9D8F: 0x6F56, - 0x9D90: 0x6F57, - 0x9D91: 0x6F59, - 0x9D92: 0x6F5A, - 0x9D93: 0x6F5B, - 0x9D94: 0x6F5D, - 0x9D95: 0x6F5F, - 0x9D96: 0x6F60, - 0x9D97: 0x6F61, - 0x9D98: 0x6F63, - 0x9D99: 0x6F64, - 0x9D9A: 0x6F65, - 0x9D9B: 0x6F67, - 0x9D9C: 0x6F68, - 0x9D9D: 0x6F69, - 0x9D9E: 0x6F6A, - 0x9D9F: 0x6F6B, - 0x9DA0: 0x6F6C, - 0x9DA1: 0x6F6F, - 0x9DA2: 0x6F70, - 0x9DA3: 0x6F71, - 0x9DA4: 0x6F73, - 0x9DA5: 0x6F75, - 0x9DA6: 0x6F76, - 0x9DA7: 0x6F77, - 0x9DA8: 0x6F79, - 0x9DA9: 0x6F7B, - 0x9DAA: 0x6F7D, - 0x9DAB: 0x6F7E, - 0x9DAC: 0x6F7F, - 0x9DAD: 0x6F80, - 0x9DAE: 0x6F81, - 0x9DAF: 0x6F82, - 0x9DB0: 0x6F83, - 0x9DB1: 0x6F85, - 0x9DB2: 0x6F86, - 0x9DB3: 0x6F87, - 0x9DB4: 0x6F8A, - 0x9DB5: 0x6F8B, - 0x9DB6: 0x6F8F, - 0x9DB7: 0x6F90, - 0x9DB8: 0x6F91, - 0x9DB9: 0x6F92, - 0x9DBA: 0x6F93, - 0x9DBB: 0x6F94, - 0x9DBC: 0x6F95, - 0x9DBD: 0x6F96, - 0x9DBE: 0x6F97, - 0x9DBF: 0x6F98, - 0x9DC0: 0x6F99, - 0x9DC1: 0x6F9A, - 0x9DC2: 0x6F9B, - 0x9DC3: 0x6F9D, - 0x9DC4: 0x6F9E, - 0x9DC5: 0x6F9F, - 0x9DC6: 0x6FA0, - 0x9DC7: 0x6FA2, - 0x9DC8: 0x6FA3, - 0x9DC9: 0x6FA4, - 0x9DCA: 0x6FA5, - 0x9DCB: 0x6FA6, - 0x9DCC: 0x6FA8, - 0x9DCD: 0x6FA9, - 0x9DCE: 0x6FAA, - 0x9DCF: 0x6FAB, - 0x9DD0: 0x6FAC, - 0x9DD1: 0x6FAD, - 0x9DD2: 0x6FAE, - 0x9DD3: 0x6FAF, - 0x9DD4: 0x6FB0, - 0x9DD5: 0x6FB1, - 0x9DD6: 0x6FB2, - 0x9DD7: 0x6FB4, - 0x9DD8: 0x6FB5, - 0x9DD9: 0x6FB7, - 0x9DDA: 0x6FB8, - 0x9DDB: 0x6FBA, - 0x9DDC: 0x6FBB, - 0x9DDD: 0x6FBC, - 0x9DDE: 0x6FBD, - 0x9DDF: 0x6FBE, - 0x9DE0: 0x6FBF, - 0x9DE1: 0x6FC1, - 0x9DE2: 0x6FC3, - 0x9DE3: 0x6FC4, - 0x9DE4: 0x6FC5, - 0x9DE5: 0x6FC6, - 0x9DE6: 0x6FC7, - 0x9DE7: 0x6FC8, - 0x9DE8: 0x6FCA, - 0x9DE9: 0x6FCB, - 0x9DEA: 0x6FCC, - 0x9DEB: 0x6FCD, - 0x9DEC: 0x6FCE, - 0x9DED: 0x6FCF, - 0x9DEE: 0x6FD0, - 0x9DEF: 0x6FD3, - 0x9DF0: 0x6FD4, - 0x9DF1: 0x6FD5, - 0x9DF2: 0x6FD6, - 0x9DF3: 0x6FD7, - 0x9DF4: 0x6FD8, - 0x9DF5: 0x6FD9, - 0x9DF6: 0x6FDA, - 0x9DF7: 0x6FDB, - 0x9DF8: 0x6FDC, - 0x9DF9: 0x6FDD, - 0x9DFA: 0x6FDF, - 0x9DFB: 0x6FE2, - 0x9DFC: 0x6FE3, - 0x9DFD: 0x6FE4, - 0x9DFE: 0x6FE5, - 0x9E40: 0x6FE6, - 0x9E41: 0x6FE7, - 0x9E42: 0x6FE8, - 0x9E43: 0x6FE9, - 0x9E44: 0x6FEA, - 0x9E45: 0x6FEB, - 0x9E46: 0x6FEC, - 0x9E47: 0x6FED, - 0x9E48: 0x6FF0, - 0x9E49: 0x6FF1, - 0x9E4A: 0x6FF2, - 0x9E4B: 0x6FF3, - 0x9E4C: 0x6FF4, - 0x9E4D: 0x6FF5, - 0x9E4E: 0x6FF6, - 0x9E4F: 0x6FF7, - 0x9E50: 0x6FF8, - 0x9E51: 0x6FF9, - 0x9E52: 0x6FFA, - 0x9E53: 0x6FFB, - 0x9E54: 0x6FFC, - 0x9E55: 0x6FFD, - 0x9E56: 0x6FFE, - 0x9E57: 0x6FFF, - 0x9E58: 0x7000, - 0x9E59: 0x7001, - 0x9E5A: 0x7002, - 0x9E5B: 0x7003, - 0x9E5C: 0x7004, - 0x9E5D: 0x7005, - 0x9E5E: 0x7006, - 0x9E5F: 0x7007, - 0x9E60: 0x7008, - 0x9E61: 0x7009, - 0x9E62: 0x700A, - 0x9E63: 0x700B, - 0x9E64: 0x700C, - 0x9E65: 0x700D, - 0x9E66: 0x700E, - 0x9E67: 0x700F, - 0x9E68: 0x7010, - 0x9E69: 0x7012, - 0x9E6A: 0x7013, - 0x9E6B: 0x7014, - 0x9E6C: 0x7015, - 0x9E6D: 0x7016, - 0x9E6E: 0x7017, - 0x9E6F: 0x7018, - 0x9E70: 0x7019, - 0x9E71: 0x701C, - 0x9E72: 0x701D, - 0x9E73: 0x701E, - 0x9E74: 0x701F, - 0x9E75: 0x7020, - 0x9E76: 0x7021, - 0x9E77: 0x7022, - 0x9E78: 0x7024, - 0x9E79: 0x7025, - 0x9E7A: 0x7026, - 0x9E7B: 0x7027, - 0x9E7C: 0x7028, - 0x9E7D: 0x7029, - 0x9E7E: 0x702A, - 0x9E80: 0x702B, - 0x9E81: 0x702C, - 0x9E82: 0x702D, - 0x9E83: 0x702E, - 0x9E84: 0x702F, - 0x9E85: 0x7030, - 0x9E86: 0x7031, - 0x9E87: 0x7032, - 0x9E88: 0x7033, - 0x9E89: 0x7034, - 0x9E8A: 0x7036, - 0x9E8B: 0x7037, - 0x9E8C: 0x7038, - 0x9E8D: 0x703A, - 0x9E8E: 0x703B, - 0x9E8F: 0x703C, - 0x9E90: 0x703D, - 0x9E91: 0x703E, - 0x9E92: 0x703F, - 0x9E93: 0x7040, - 0x9E94: 0x7041, - 0x9E95: 0x7042, - 0x9E96: 0x7043, - 0x9E97: 0x7044, - 0x9E98: 0x7045, - 0x9E99: 0x7046, - 0x9E9A: 0x7047, - 0x9E9B: 0x7048, - 0x9E9C: 0x7049, - 0x9E9D: 0x704A, - 0x9E9E: 0x704B, - 0x9E9F: 0x704D, - 0x9EA0: 0x704E, - 0x9EA1: 0x7050, - 0x9EA2: 0x7051, - 0x9EA3: 0x7052, - 0x9EA4: 0x7053, - 0x9EA5: 0x7054, - 0x9EA6: 0x7055, - 0x9EA7: 0x7056, - 0x9EA8: 0x7057, - 0x9EA9: 0x7058, - 0x9EAA: 0x7059, - 0x9EAB: 0x705A, - 0x9EAC: 0x705B, - 0x9EAD: 0x705C, - 0x9EAE: 0x705D, - 0x9EAF: 0x705F, - 0x9EB0: 0x7060, - 0x9EB1: 0x7061, - 0x9EB2: 0x7062, - 0x9EB3: 0x7063, - 0x9EB4: 0x7064, - 0x9EB5: 0x7065, - 0x9EB6: 0x7066, - 0x9EB7: 0x7067, - 0x9EB8: 0x7068, - 0x9EB9: 0x7069, - 0x9EBA: 0x706A, - 0x9EBB: 0x706E, - 0x9EBC: 0x7071, - 0x9EBD: 0x7072, - 0x9EBE: 0x7073, - 0x9EBF: 0x7074, - 0x9EC0: 0x7077, - 0x9EC1: 0x7079, - 0x9EC2: 0x707A, - 0x9EC3: 0x707B, - 0x9EC4: 0x707D, - 0x9EC5: 0x7081, - 0x9EC6: 0x7082, - 0x9EC7: 0x7083, - 0x9EC8: 0x7084, - 0x9EC9: 0x7086, - 0x9ECA: 0x7087, - 0x9ECB: 0x7088, - 0x9ECC: 0x708B, - 0x9ECD: 0x708C, - 0x9ECE: 0x708D, - 0x9ECF: 0x708F, - 0x9ED0: 0x7090, - 0x9ED1: 0x7091, - 0x9ED2: 0x7093, - 0x9ED3: 0x7097, - 0x9ED4: 0x7098, - 0x9ED5: 0x709A, - 0x9ED6: 0x709B, - 0x9ED7: 0x709E, - 0x9ED8: 0x709F, - 0x9ED9: 0x70A0, - 0x9EDA: 0x70A1, - 0x9EDB: 0x70A2, - 0x9EDC: 0x70A3, - 0x9EDD: 0x70A4, - 0x9EDE: 0x70A5, - 0x9EDF: 0x70A6, - 0x9EE0: 0x70A7, - 0x9EE1: 0x70A8, - 0x9EE2: 0x70A9, - 0x9EE3: 0x70AA, - 0x9EE4: 0x70B0, - 0x9EE5: 0x70B2, - 0x9EE6: 0x70B4, - 0x9EE7: 0x70B5, - 0x9EE8: 0x70B6, - 0x9EE9: 0x70BA, - 0x9EEA: 0x70BE, - 0x9EEB: 0x70BF, - 0x9EEC: 0x70C4, - 0x9EED: 0x70C5, - 0x9EEE: 0x70C6, - 0x9EEF: 0x70C7, - 0x9EF0: 0x70C9, - 0x9EF1: 0x70CB, - 0x9EF2: 0x70CC, - 0x9EF3: 0x70CD, - 0x9EF4: 0x70CE, - 0x9EF5: 0x70CF, - 0x9EF6: 0x70D0, - 0x9EF7: 0x70D1, - 0x9EF8: 0x70D2, - 0x9EF9: 0x70D3, - 0x9EFA: 0x70D4, - 0x9EFB: 0x70D5, - 0x9EFC: 0x70D6, - 0x9EFD: 0x70D7, - 0x9EFE: 0x70DA, - 0x9F40: 0x70DC, - 0x9F41: 0x70DD, - 0x9F42: 0x70DE, - 0x9F43: 0x70E0, - 0x9F44: 0x70E1, - 0x9F45: 0x70E2, - 0x9F46: 0x70E3, - 0x9F47: 0x70E5, - 0x9F48: 0x70EA, - 0x9F49: 0x70EE, - 0x9F4A: 0x70F0, - 0x9F4B: 0x70F1, - 0x9F4C: 0x70F2, - 0x9F4D: 0x70F3, - 0x9F4E: 0x70F4, - 0x9F4F: 0x70F5, - 0x9F50: 0x70F6, - 0x9F51: 0x70F8, - 0x9F52: 0x70FA, - 0x9F53: 0x70FB, - 0x9F54: 0x70FC, - 0x9F55: 0x70FE, - 0x9F56: 0x70FF, - 0x9F57: 0x7100, - 0x9F58: 0x7101, - 0x9F59: 0x7102, - 0x9F5A: 0x7103, - 0x9F5B: 0x7104, - 0x9F5C: 0x7105, - 0x9F5D: 0x7106, - 0x9F5E: 0x7107, - 0x9F5F: 0x7108, - 0x9F60: 0x710B, - 0x9F61: 0x710C, - 0x9F62: 0x710D, - 0x9F63: 0x710E, - 0x9F64: 0x710F, - 0x9F65: 0x7111, - 0x9F66: 0x7112, - 0x9F67: 0x7114, - 0x9F68: 0x7117, - 0x9F69: 0x711B, - 0x9F6A: 0x711C, - 0x9F6B: 0x711D, - 0x9F6C: 0x711E, - 0x9F6D: 0x711F, - 0x9F6E: 0x7120, - 0x9F6F: 0x7121, - 0x9F70: 0x7122, - 0x9F71: 0x7123, - 0x9F72: 0x7124, - 0x9F73: 0x7125, - 0x9F74: 0x7127, - 0x9F75: 0x7128, - 0x9F76: 0x7129, - 0x9F77: 0x712A, - 0x9F78: 0x712B, - 0x9F79: 0x712C, - 0x9F7A: 0x712D, - 0x9F7B: 0x712E, - 0x9F7C: 0x7132, - 0x9F7D: 0x7133, - 0x9F7E: 0x7134, - 0x9F80: 0x7135, - 0x9F81: 0x7137, - 0x9F82: 0x7138, - 0x9F83: 0x7139, - 0x9F84: 0x713A, - 0x9F85: 0x713B, - 0x9F86: 0x713C, - 0x9F87: 0x713D, - 0x9F88: 0x713E, - 0x9F89: 0x713F, - 0x9F8A: 0x7140, - 0x9F8B: 0x7141, - 0x9F8C: 0x7142, - 0x9F8D: 0x7143, - 0x9F8E: 0x7144, - 0x9F8F: 0x7146, - 0x9F90: 0x7147, - 0x9F91: 0x7148, - 0x9F92: 0x7149, - 0x9F93: 0x714B, - 0x9F94: 0x714D, - 0x9F95: 0x714F, - 0x9F96: 0x7150, - 0x9F97: 0x7151, - 0x9F98: 0x7152, - 0x9F99: 0x7153, - 0x9F9A: 0x7154, - 0x9F9B: 0x7155, - 0x9F9C: 0x7156, - 0x9F9D: 0x7157, - 0x9F9E: 0x7158, - 0x9F9F: 0x7159, - 0x9FA0: 0x715A, - 0x9FA1: 0x715B, - 0x9FA2: 0x715D, - 0x9FA3: 0x715F, - 0x9FA4: 0x7160, - 0x9FA5: 0x7161, - 0x9FA6: 0x7162, - 0x9FA7: 0x7163, - 0x9FA8: 0x7165, - 0x9FA9: 0x7169, - 0x9FAA: 0x716A, - 0x9FAB: 0x716B, - 0x9FAC: 0x716C, - 0x9FAD: 0x716D, - 0x9FAE: 0x716F, - 0x9FAF: 0x7170, - 0x9FB0: 0x7171, - 0x9FB1: 0x7174, - 0x9FB2: 0x7175, - 0x9FB3: 0x7176, - 0x9FB4: 0x7177, - 0x9FB5: 0x7179, - 0x9FB6: 0x717B, - 0x9FB7: 0x717C, - 0x9FB8: 0x717E, - 0x9FB9: 0x717F, - 0x9FBA: 0x7180, - 0x9FBB: 0x7181, - 0x9FBC: 0x7182, - 0x9FBD: 0x7183, - 0x9FBE: 0x7185, - 0x9FBF: 0x7186, - 0x9FC0: 0x7187, - 0x9FC1: 0x7188, - 0x9FC2: 0x7189, - 0x9FC3: 0x718B, - 0x9FC4: 0x718C, - 0x9FC5: 0x718D, - 0x9FC6: 0x718E, - 0x9FC7: 0x7190, - 0x9FC8: 0x7191, - 0x9FC9: 0x7192, - 0x9FCA: 0x7193, - 0x9FCB: 0x7195, - 0x9FCC: 0x7196, - 0x9FCD: 0x7197, - 0x9FCE: 0x719A, - 0x9FCF: 0x719B, - 0x9FD0: 0x719C, - 0x9FD1: 0x719D, - 0x9FD2: 0x719E, - 0x9FD3: 0x71A1, - 0x9FD4: 0x71A2, - 0x9FD5: 0x71A3, - 0x9FD6: 0x71A4, - 0x9FD7: 0x71A5, - 0x9FD8: 0x71A6, - 0x9FD9: 0x71A7, - 0x9FDA: 0x71A9, - 0x9FDB: 0x71AA, - 0x9FDC: 0x71AB, - 0x9FDD: 0x71AD, - 0x9FDE: 0x71AE, - 0x9FDF: 0x71AF, - 0x9FE0: 0x71B0, - 0x9FE1: 0x71B1, - 0x9FE2: 0x71B2, - 0x9FE3: 0x71B4, - 0x9FE4: 0x71B6, - 0x9FE5: 0x71B7, - 0x9FE6: 0x71B8, - 0x9FE7: 0x71BA, - 0x9FE8: 0x71BB, - 0x9FE9: 0x71BC, - 0x9FEA: 0x71BD, - 0x9FEB: 0x71BE, - 0x9FEC: 0x71BF, - 0x9FED: 0x71C0, - 0x9FEE: 0x71C1, - 0x9FEF: 0x71C2, - 0x9FF0: 0x71C4, - 0x9FF1: 0x71C5, - 0x9FF2: 0x71C6, - 0x9FF3: 0x71C7, - 0x9FF4: 0x71C8, - 0x9FF5: 0x71C9, - 0x9FF6: 0x71CA, - 0x9FF7: 0x71CB, - 0x9FF8: 0x71CC, - 0x9FF9: 0x71CD, - 0x9FFA: 0x71CF, - 0x9FFB: 0x71D0, - 0x9FFC: 0x71D1, - 0x9FFD: 0x71D2, - 0x9FFE: 0x71D3, - 0xA040: 0x71D6, - 0xA041: 0x71D7, - 0xA042: 0x71D8, - 0xA043: 0x71D9, - 0xA044: 0x71DA, - 0xA045: 0x71DB, - 0xA046: 0x71DC, - 0xA047: 0x71DD, - 0xA048: 0x71DE, - 0xA049: 0x71DF, - 0xA04A: 0x71E1, - 0xA04B: 0x71E2, - 0xA04C: 0x71E3, - 0xA04D: 0x71E4, - 0xA04E: 0x71E6, - 0xA04F: 0x71E8, - 0xA050: 0x71E9, - 0xA051: 0x71EA, - 0xA052: 0x71EB, - 0xA053: 0x71EC, - 0xA054: 0x71ED, - 0xA055: 0x71EF, - 0xA056: 0x71F0, - 0xA057: 0x71F1, - 0xA058: 0x71F2, - 0xA059: 0x71F3, - 0xA05A: 0x71F4, - 0xA05B: 0x71F5, - 0xA05C: 0x71F6, - 0xA05D: 0x71F7, - 0xA05E: 0x71F8, - 0xA05F: 0x71FA, - 0xA060: 0x71FB, - 0xA061: 0x71FC, - 0xA062: 0x71FD, - 0xA063: 0x71FE, - 0xA064: 0x71FF, - 0xA065: 0x7200, - 0xA066: 0x7201, - 0xA067: 0x7202, - 0xA068: 0x7203, - 0xA069: 0x7204, - 0xA06A: 0x7205, - 0xA06B: 0x7207, - 0xA06C: 0x7208, - 0xA06D: 0x7209, - 0xA06E: 0x720A, - 0xA06F: 0x720B, - 0xA070: 0x720C, - 0xA071: 0x720D, - 0xA072: 0x720E, - 0xA073: 0x720F, - 0xA074: 0x7210, - 0xA075: 0x7211, - 0xA076: 0x7212, - 0xA077: 0x7213, - 0xA078: 0x7214, - 0xA079: 0x7215, - 0xA07A: 0x7216, - 0xA07B: 0x7217, - 0xA07C: 0x7218, - 0xA07D: 0x7219, - 0xA07E: 0x721A, - 0xA080: 0x721B, - 0xA081: 0x721C, - 0xA082: 0x721E, - 0xA083: 0x721F, - 0xA084: 0x7220, - 0xA085: 0x7221, - 0xA086: 0x7222, - 0xA087: 0x7223, - 0xA088: 0x7224, - 0xA089: 0x7225, - 0xA08A: 0x7226, - 0xA08B: 0x7227, - 0xA08C: 0x7229, - 0xA08D: 0x722B, - 0xA08E: 0x722D, - 0xA08F: 0x722E, - 0xA090: 0x722F, - 0xA091: 0x7232, - 0xA092: 0x7233, - 0xA093: 0x7234, - 0xA094: 0x723A, - 0xA095: 0x723C, - 0xA096: 0x723E, - 0xA097: 0x7240, - 0xA098: 0x7241, - 0xA099: 0x7242, - 0xA09A: 0x7243, - 0xA09B: 0x7244, - 0xA09C: 0x7245, - 0xA09D: 0x7246, - 0xA09E: 0x7249, - 0xA09F: 0x724A, - 0xA0A0: 0x724B, - 0xA0A1: 0x724E, - 0xA0A2: 0x724F, - 0xA0A3: 0x7250, - 0xA0A4: 0x7251, - 0xA0A5: 0x7253, - 0xA0A6: 0x7254, - 0xA0A7: 0x7255, - 0xA0A8: 0x7257, - 0xA0A9: 0x7258, - 0xA0AA: 0x725A, - 0xA0AB: 0x725C, - 0xA0AC: 0x725E, - 0xA0AD: 0x7260, - 0xA0AE: 0x7263, - 0xA0AF: 0x7264, - 0xA0B0: 0x7265, - 0xA0B1: 0x7268, - 0xA0B2: 0x726A, - 0xA0B3: 0x726B, - 0xA0B4: 0x726C, - 0xA0B5: 0x726D, - 0xA0B6: 0x7270, - 0xA0B7: 0x7271, - 0xA0B8: 0x7273, - 0xA0B9: 0x7274, - 0xA0BA: 0x7276, - 0xA0BB: 0x7277, - 0xA0BC: 0x7278, - 0xA0BD: 0x727B, - 0xA0BE: 0x727C, - 0xA0BF: 0x727D, - 0xA0C0: 0x7282, - 0xA0C1: 0x7283, - 0xA0C2: 0x7285, - 0xA0C3: 0x7286, - 0xA0C4: 0x7287, - 0xA0C5: 0x7288, - 0xA0C6: 0x7289, - 0xA0C7: 0x728C, - 0xA0C8: 0x728E, - 0xA0C9: 0x7290, - 0xA0CA: 0x7291, - 0xA0CB: 0x7293, - 0xA0CC: 0x7294, - 0xA0CD: 0x7295, - 0xA0CE: 0x7296, - 0xA0CF: 0x7297, - 0xA0D0: 0x7298, - 0xA0D1: 0x7299, - 0xA0D2: 0x729A, - 0xA0D3: 0x729B, - 0xA0D4: 0x729C, - 0xA0D5: 0x729D, - 0xA0D6: 0x729E, - 0xA0D7: 0x72A0, - 0xA0D8: 0x72A1, - 0xA0D9: 0x72A2, - 0xA0DA: 0x72A3, - 0xA0DB: 0x72A4, - 0xA0DC: 0x72A5, - 0xA0DD: 0x72A6, - 0xA0DE: 0x72A7, - 0xA0DF: 0x72A8, - 0xA0E0: 0x72A9, - 0xA0E1: 0x72AA, - 0xA0E2: 0x72AB, - 0xA0E3: 0x72AE, - 0xA0E4: 0x72B1, - 0xA0E5: 0x72B2, - 0xA0E6: 0x72B3, - 0xA0E7: 0x72B5, - 0xA0E8: 0x72BA, - 0xA0E9: 0x72BB, - 0xA0EA: 0x72BC, - 0xA0EB: 0x72BD, - 0xA0EC: 0x72BE, - 0xA0ED: 0x72BF, - 0xA0EE: 0x72C0, - 0xA0EF: 0x72C5, - 0xA0F0: 0x72C6, - 0xA0F1: 0x72C7, - 0xA0F2: 0x72C9, - 0xA0F3: 0x72CA, - 0xA0F4: 0x72CB, - 0xA0F5: 0x72CC, - 0xA0F6: 0x72CF, - 0xA0F7: 0x72D1, - 0xA0F8: 0x72D3, - 0xA0F9: 0x72D4, - 0xA0FA: 0x72D5, - 0xA0FB: 0x72D6, - 0xA0FC: 0x72D8, - 0xA0FD: 0x72DA, - 0xA0FE: 0x72DB, - 0xA140: 0xE4C6, - 0xA141: 0xE4C7, - 0xA142: 0xE4C8, - 0xA143: 0xE4C9, - 0xA144: 0xE4CA, - 0xA145: 0xE4CB, - 0xA146: 0xE4CC, - 0xA147: 0xE4CD, - 0xA148: 0xE4CE, - 0xA149: 0xE4CF, - 0xA14A: 0xE4D0, - 0xA14B: 0xE4D1, - 0xA14C: 0xE4D2, - 0xA14D: 0xE4D3, - 0xA14E: 0xE4D4, - 0xA14F: 0xE4D5, - 0xA150: 0xE4D6, - 0xA151: 0xE4D7, - 0xA152: 0xE4D8, - 0xA153: 0xE4D9, - 0xA154: 0xE4DA, - 0xA155: 0xE4DB, - 0xA156: 0xE4DC, - 0xA157: 0xE4DD, - 0xA158: 0xE4DE, - 0xA159: 0xE4DF, - 0xA15A: 0xE4E0, - 0xA15B: 0xE4E1, - 0xA15C: 0xE4E2, - 0xA15D: 0xE4E3, - 0xA15E: 0xE4E4, - 0xA15F: 0xE4E5, - 0xA160: 0xE4E6, - 0xA161: 0xE4E7, - 0xA162: 0xE4E8, - 0xA163: 0xE4E9, - 0xA164: 0xE4EA, - 0xA165: 0xE4EB, - 0xA166: 0xE4EC, - 0xA167: 0xE4ED, - 0xA168: 0xE4EE, - 0xA169: 0xE4EF, - 0xA16A: 0xE4F0, - 0xA16B: 0xE4F1, - 0xA16C: 0xE4F2, - 0xA16D: 0xE4F3, - 0xA16E: 0xE4F4, - 0xA16F: 0xE4F5, - 0xA170: 0xE4F6, - 0xA171: 0xE4F7, - 0xA172: 0xE4F8, - 0xA173: 0xE4F9, - 0xA174: 0xE4FA, - 0xA175: 0xE4FB, - 0xA176: 0xE4FC, - 0xA177: 0xE4FD, - 0xA178: 0xE4FE, - 0xA179: 0xE4FF, - 0xA17A: 0xE500, - 0xA17B: 0xE501, - 0xA17C: 0xE502, - 0xA17D: 0xE503, - 0xA17E: 0xE504, - 0xA180: 0xE505, - 0xA181: 0xE506, - 0xA182: 0xE507, - 0xA183: 0xE508, - 0xA184: 0xE509, - 0xA185: 0xE50A, - 0xA186: 0xE50B, - 0xA187: 0xE50C, - 0xA188: 0xE50D, - 0xA189: 0xE50E, - 0xA18A: 0xE50F, - 0xA18B: 0xE510, - 0xA18C: 0xE511, - 0xA18D: 0xE512, - 0xA18E: 0xE513, - 0xA18F: 0xE514, - 0xA190: 0xE515, - 0xA191: 0xE516, - 0xA192: 0xE517, - 0xA193: 0xE518, - 0xA194: 0xE519, - 0xA195: 0xE51A, - 0xA196: 0xE51B, - 0xA197: 0xE51C, - 0xA198: 0xE51D, - 0xA199: 0xE51E, - 0xA19A: 0xE51F, - 0xA19B: 0xE520, - 0xA19C: 0xE521, - 0xA19D: 0xE522, - 0xA19E: 0xE523, - 0xA19F: 0xE524, - 0xA1A0: 0xE525, - 0xA1A1: 0x3000, - 0xA1A2: 0x3001, - 0xA1A3: 0x3002, - 0xA1A4: 0x00B7, - 0xA1A5: 0x02C9, - 0xA1A6: 0x02C7, - 0xA1A7: 0x00A8, - 0xA1A8: 0x3003, - 0xA1A9: 0x3005, - 0xA1AA: 0x2014, - 0xA1AB: 0xFF5E, - 0xA1AC: 0x2016, - 0xA1AD: 0x2026, - 0xA1AE: 0x2018, - 0xA1AF: 0x2019, - 0xA1B0: 0x201C, - 0xA1B1: 0x201D, - 0xA1B2: 0x3014, - 0xA1B3: 0x3015, - 0xA1B4: 0x3008, - 0xA1B5: 0x3009, - 0xA1B6: 0x300A, - 0xA1B7: 0x300B, - 0xA1B8: 0x300C, - 0xA1B9: 0x300D, - 0xA1BA: 0x300E, - 0xA1BB: 0x300F, - 0xA1BC: 0x3016, - 0xA1BD: 0x3017, - 0xA1BE: 0x3010, - 0xA1BF: 0x3011, - 0xA1C0: 0x00B1, - 0xA1C1: 0x00D7, - 0xA1C2: 0x00F7, - 0xA1C3: 0x2236, - 0xA1C4: 0x2227, - 0xA1C5: 0x2228, - 0xA1C6: 0x2211, - 0xA1C7: 0x220F, - 0xA1C8: 0x222A, - 0xA1C9: 0x2229, - 0xA1CA: 0x2208, - 0xA1CB: 0x2237, - 0xA1CC: 0x221A, - 0xA1CD: 0x22A5, - 0xA1CE: 0x2225, - 0xA1CF: 0x2220, - 0xA1D0: 0x2312, - 0xA1D1: 0x2299, - 0xA1D2: 0x222B, - 0xA1D3: 0x222E, - 0xA1D4: 0x2261, - 0xA1D5: 0x224C, - 0xA1D6: 0x2248, - 0xA1D7: 0x223D, - 0xA1D8: 0x221D, - 0xA1D9: 0x2260, - 0xA1DA: 0x226E, - 0xA1DB: 0x226F, - 0xA1DC: 0x2264, - 0xA1DD: 0x2265, - 0xA1DE: 0x221E, - 0xA1DF: 0x2235, - 0xA1E0: 0x2234, - 0xA1E1: 0x2642, - 0xA1E2: 0x2640, - 0xA1E3: 0x00B0, - 0xA1E4: 0x2032, - 0xA1E5: 0x2033, - 0xA1E6: 0x2103, - 0xA1E7: 0xFF04, - 0xA1E8: 0x00A4, - 0xA1E9: 0xFFE0, - 0xA1EA: 0xFFE1, - 0xA1EB: 0x2030, - 0xA1EC: 0x00A7, - 0xA1ED: 0x2116, - 0xA1EE: 0x2606, - 0xA1EF: 0x2605, - 0xA1F0: 0x25CB, - 0xA1F1: 0x25CF, - 0xA1F2: 0x25CE, - 0xA1F3: 0x25C7, - 0xA1F4: 0x25C6, - 0xA1F5: 0x25A1, - 0xA1F6: 0x25A0, - 0xA1F7: 0x25B3, - 0xA1F8: 0x25B2, - 0xA1F9: 0x203B, - 0xA1FA: 0x2192, - 0xA1FB: 0x2190, - 0xA1FC: 0x2191, - 0xA1FD: 0x2193, - 0xA1FE: 0x3013, - 0xA240: 0xE526, - 0xA241: 0xE527, - 0xA242: 0xE528, - 0xA243: 0xE529, - 0xA244: 0xE52A, - 0xA245: 0xE52B, - 0xA246: 0xE52C, - 0xA247: 0xE52D, - 0xA248: 0xE52E, - 0xA249: 0xE52F, - 0xA24A: 0xE530, - 0xA24B: 0xE531, - 0xA24C: 0xE532, - 0xA24D: 0xE533, - 0xA24E: 0xE534, - 0xA24F: 0xE535, - 0xA250: 0xE536, - 0xA251: 0xE537, - 0xA252: 0xE538, - 0xA253: 0xE539, - 0xA254: 0xE53A, - 0xA255: 0xE53B, - 0xA256: 0xE53C, - 0xA257: 0xE53D, - 0xA258: 0xE53E, - 0xA259: 0xE53F, - 0xA25A: 0xE540, - 0xA25B: 0xE541, - 0xA25C: 0xE542, - 0xA25D: 0xE543, - 0xA25E: 0xE544, - 0xA25F: 0xE545, - 0xA260: 0xE546, - 0xA261: 0xE547, - 0xA262: 0xE548, - 0xA263: 0xE549, - 0xA264: 0xE54A, - 0xA265: 0xE54B, - 0xA266: 0xE54C, - 0xA267: 0xE54D, - 0xA268: 0xE54E, - 0xA269: 0xE54F, - 0xA26A: 0xE550, - 0xA26B: 0xE551, - 0xA26C: 0xE552, - 0xA26D: 0xE553, - 0xA26E: 0xE554, - 0xA26F: 0xE555, - 0xA270: 0xE556, - 0xA271: 0xE557, - 0xA272: 0xE558, - 0xA273: 0xE559, - 0xA274: 0xE55A, - 0xA275: 0xE55B, - 0xA276: 0xE55C, - 0xA277: 0xE55D, - 0xA278: 0xE55E, - 0xA279: 0xE55F, - 0xA27A: 0xE560, - 0xA27B: 0xE561, - 0xA27C: 0xE562, - 0xA27D: 0xE563, - 0xA27E: 0xE564, - 0xA280: 0xE565, - 0xA281: 0xE566, - 0xA282: 0xE567, - 0xA283: 0xE568, - 0xA284: 0xE569, - 0xA285: 0xE56A, - 0xA286: 0xE56B, - 0xA287: 0xE56C, - 0xA288: 0xE56D, - 0xA289: 0xE56E, - 0xA28A: 0xE56F, - 0xA28B: 0xE570, - 0xA28C: 0xE571, - 0xA28D: 0xE572, - 0xA28E: 0xE573, - 0xA28F: 0xE574, - 0xA290: 0xE575, - 0xA291: 0xE576, - 0xA292: 0xE577, - 0xA293: 0xE578, - 0xA294: 0xE579, - 0xA295: 0xE57A, - 0xA296: 0xE57B, - 0xA297: 0xE57C, - 0xA298: 0xE57D, - 0xA299: 0xE57E, - 0xA29A: 0xE57F, - 0xA29B: 0xE580, - 0xA29C: 0xE581, - 0xA29D: 0xE582, - 0xA29E: 0xE583, - 0xA29F: 0xE584, - 0xA2A0: 0xE585, - 0xA2A1: 0x2170, - 0xA2A2: 0x2171, - 0xA2A3: 0x2172, - 0xA2A4: 0x2173, - 0xA2A5: 0x2174, - 0xA2A6: 0x2175, - 0xA2A7: 0x2176, - 0xA2A8: 0x2177, - 0xA2A9: 0x2178, - 0xA2AA: 0x2179, - 0xA2AB: 0xE766, - 0xA2AC: 0xE767, - 0xA2AD: 0xE768, - 0xA2AE: 0xE769, - 0xA2AF: 0xE76A, - 0xA2B0: 0xE76B, - 0xA2B1: 0x2488, - 0xA2B2: 0x2489, - 0xA2B3: 0x248A, - 0xA2B4: 0x248B, - 0xA2B5: 0x248C, - 0xA2B6: 0x248D, - 0xA2B7: 0x248E, - 0xA2B8: 0x248F, - 0xA2B9: 0x2490, - 0xA2BA: 0x2491, - 0xA2BB: 0x2492, - 0xA2BC: 0x2493, - 0xA2BD: 0x2494, - 0xA2BE: 0x2495, - 0xA2BF: 0x2496, - 0xA2C0: 0x2497, - 0xA2C1: 0x2498, - 0xA2C2: 0x2499, - 0xA2C3: 0x249A, - 0xA2C4: 0x249B, - 0xA2C5: 0x2474, - 0xA2C6: 0x2475, - 0xA2C7: 0x2476, - 0xA2C8: 0x2477, - 0xA2C9: 0x2478, - 0xA2CA: 0x2479, - 0xA2CB: 0x247A, - 0xA2CC: 0x247B, - 0xA2CD: 0x247C, - 0xA2CE: 0x247D, - 0xA2CF: 0x247E, - 0xA2D0: 0x247F, - 0xA2D1: 0x2480, - 0xA2D2: 0x2481, - 0xA2D3: 0x2482, - 0xA2D4: 0x2483, - 0xA2D5: 0x2484, - 0xA2D6: 0x2485, - 0xA2D7: 0x2486, - 0xA2D8: 0x2487, - 0xA2D9: 0x2460, - 0xA2DA: 0x2461, - 0xA2DB: 0x2462, - 0xA2DC: 0x2463, - 0xA2DD: 0x2464, - 0xA2DE: 0x2465, - 0xA2DF: 0x2466, - 0xA2E0: 0x2467, - 0xA2E1: 0x2468, - 0xA2E2: 0x2469, - 0xA2E3: 0x20AC, - 0xA2E4: 0xE76D, - 0xA2E5: 0x3220, - 0xA2E6: 0x3221, - 0xA2E7: 0x3222, - 0xA2E8: 0x3223, - 0xA2E9: 0x3224, - 0xA2EA: 0x3225, - 0xA2EB: 0x3226, - 0xA2EC: 0x3227, - 0xA2ED: 0x3228, - 0xA2EE: 0x3229, - 0xA2EF: 0xE76E, - 0xA2F0: 0xE76F, - 0xA2F1: 0x2160, - 0xA2F2: 0x2161, - 0xA2F3: 0x2162, - 0xA2F4: 0x2163, - 0xA2F5: 0x2164, - 0xA2F6: 0x2165, - 0xA2F7: 0x2166, - 0xA2F8: 0x2167, - 0xA2F9: 0x2168, - 0xA2FA: 0x2169, - 0xA2FB: 0x216A, - 0xA2FC: 0x216B, - 0xA2FD: 0xE770, - 0xA2FE: 0xE771, - 0xA340: 0xE586, - 0xA341: 0xE587, - 0xA342: 0xE588, - 0xA343: 0xE589, - 0xA344: 0xE58A, - 0xA345: 0xE58B, - 0xA346: 0xE58C, - 0xA347: 0xE58D, - 0xA348: 0xE58E, - 0xA349: 0xE58F, - 0xA34A: 0xE590, - 0xA34B: 0xE591, - 0xA34C: 0xE592, - 0xA34D: 0xE593, - 0xA34E: 0xE594, - 0xA34F: 0xE595, - 0xA350: 0xE596, - 0xA351: 0xE597, - 0xA352: 0xE598, - 0xA353: 0xE599, - 0xA354: 0xE59A, - 0xA355: 0xE59B, - 0xA356: 0xE59C, - 0xA357: 0xE59D, - 0xA358: 0xE59E, - 0xA359: 0xE59F, - 0xA35A: 0xE5A0, - 0xA35B: 0xE5A1, - 0xA35C: 0xE5A2, - 0xA35D: 0xE5A3, - 0xA35E: 0xE5A4, - 0xA35F: 0xE5A5, - 0xA360: 0xE5A6, - 0xA361: 0xE5A7, - 0xA362: 0xE5A8, - 0xA363: 0xE5A9, - 0xA364: 0xE5AA, - 0xA365: 0xE5AB, - 0xA366: 0xE5AC, - 0xA367: 0xE5AD, - 0xA368: 0xE5AE, - 0xA369: 0xE5AF, - 0xA36A: 0xE5B0, - 0xA36B: 0xE5B1, - 0xA36C: 0xE5B2, - 0xA36D: 0xE5B3, - 0xA36E: 0xE5B4, - 0xA36F: 0xE5B5, - 0xA370: 0xE5B6, - 0xA371: 0xE5B7, - 0xA372: 0xE5B8, - 0xA373: 0xE5B9, - 0xA374: 0xE5BA, - 0xA375: 0xE5BB, - 0xA376: 0xE5BC, - 0xA377: 0xE5BD, - 0xA378: 0xE5BE, - 0xA379: 0xE5BF, - 0xA37A: 0xE5C0, - 0xA37B: 0xE5C1, - 0xA37C: 0xE5C2, - 0xA37D: 0xE5C3, - 0xA37E: 0xE5C4, - 0xA380: 0xE5C5, - 0xA381: 0xE5C6, - 0xA382: 0xE5C7, - 0xA383: 0xE5C8, - 0xA384: 0xE5C9, - 0xA385: 0xE5CA, - 0xA386: 0xE5CB, - 0xA387: 0xE5CC, - 0xA388: 0xE5CD, - 0xA389: 0xE5CE, - 0xA38A: 0xE5CF, - 0xA38B: 0xE5D0, - 0xA38C: 0xE5D1, - 0xA38D: 0xE5D2, - 0xA38E: 0xE5D3, - 0xA38F: 0xE5D4, - 0xA390: 0xE5D5, - 0xA391: 0xE5D6, - 0xA392: 0xE5D7, - 0xA393: 0xE5D8, - 0xA394: 0xE5D9, - 0xA395: 0xE5DA, - 0xA396: 0xE5DB, - 0xA397: 0xE5DC, - 0xA398: 0xE5DD, - 0xA399: 0xE5DE, - 0xA39A: 0xE5DF, - 0xA39B: 0xE5E0, - 0xA39C: 0xE5E1, - 0xA39D: 0xE5E2, - 0xA39E: 0xE5E3, - 0xA39F: 0xE5E4, - 0xA3A0: 0xE5E5, - 0xA3A1: 0xFF01, - 0xA3A2: 0xFF02, - 0xA3A3: 0xFF03, - 0xA3A4: 0xFFE5, - 0xA3A5: 0xFF05, - 0xA3A6: 0xFF06, - 0xA3A7: 0xFF07, - 0xA3A8: 0xFF08, - 0xA3A9: 0xFF09, - 0xA3AA: 0xFF0A, - 0xA3AB: 0xFF0B, - 0xA3AC: 0xFF0C, - 0xA3AD: 0xFF0D, - 0xA3AE: 0xFF0E, - 0xA3AF: 0xFF0F, - 0xA3B0: 0xFF10, - 0xA3B1: 0xFF11, - 0xA3B2: 0xFF12, - 0xA3B3: 0xFF13, - 0xA3B4: 0xFF14, - 0xA3B5: 0xFF15, - 0xA3B6: 0xFF16, - 0xA3B7: 0xFF17, - 0xA3B8: 0xFF18, - 0xA3B9: 0xFF19, - 0xA3BA: 0xFF1A, - 0xA3BB: 0xFF1B, - 0xA3BC: 0xFF1C, - 0xA3BD: 0xFF1D, - 0xA3BE: 0xFF1E, - 0xA3BF: 0xFF1F, - 0xA3C0: 0xFF20, - 0xA3C1: 0xFF21, - 0xA3C2: 0xFF22, - 0xA3C3: 0xFF23, - 0xA3C4: 0xFF24, - 0xA3C5: 0xFF25, - 0xA3C6: 0xFF26, - 0xA3C7: 0xFF27, - 0xA3C8: 0xFF28, - 0xA3C9: 0xFF29, - 0xA3CA: 0xFF2A, - 0xA3CB: 0xFF2B, - 0xA3CC: 0xFF2C, - 0xA3CD: 0xFF2D, - 0xA3CE: 0xFF2E, - 0xA3CF: 0xFF2F, - 0xA3D0: 0xFF30, - 0xA3D1: 0xFF31, - 0xA3D2: 0xFF32, - 0xA3D3: 0xFF33, - 0xA3D4: 0xFF34, - 0xA3D5: 0xFF35, - 0xA3D6: 0xFF36, - 0xA3D7: 0xFF37, - 0xA3D8: 0xFF38, - 0xA3D9: 0xFF39, - 0xA3DA: 0xFF3A, - 0xA3DB: 0xFF3B, - 0xA3DC: 0xFF3C, - 0xA3DD: 0xFF3D, - 0xA3DE: 0xFF3E, - 0xA3DF: 0xFF3F, - 0xA3E0: 0xFF40, - 0xA3E1: 0xFF41, - 0xA3E2: 0xFF42, - 0xA3E3: 0xFF43, - 0xA3E4: 0xFF44, - 0xA3E5: 0xFF45, - 0xA3E6: 0xFF46, - 0xA3E7: 0xFF47, - 0xA3E8: 0xFF48, - 0xA3E9: 0xFF49, - 0xA3EA: 0xFF4A, - 0xA3EB: 0xFF4B, - 0xA3EC: 0xFF4C, - 0xA3ED: 0xFF4D, - 0xA3EE: 0xFF4E, - 0xA3EF: 0xFF4F, - 0xA3F0: 0xFF50, - 0xA3F1: 0xFF51, - 0xA3F2: 0xFF52, - 0xA3F3: 0xFF53, - 0xA3F4: 0xFF54, - 0xA3F5: 0xFF55, - 0xA3F6: 0xFF56, - 0xA3F7: 0xFF57, - 0xA3F8: 0xFF58, - 0xA3F9: 0xFF59, - 0xA3FA: 0xFF5A, - 0xA3FB: 0xFF5B, - 0xA3FC: 0xFF5C, - 0xA3FD: 0xFF5D, - 0xA3FE: 0xFFE3, - 0xA440: 0xE5E6, - 0xA441: 0xE5E7, - 0xA442: 0xE5E8, - 0xA443: 0xE5E9, - 0xA444: 0xE5EA, - 0xA445: 0xE5EB, - 0xA446: 0xE5EC, - 0xA447: 0xE5ED, - 0xA448: 0xE5EE, - 0xA449: 0xE5EF, - 0xA44A: 0xE5F0, - 0xA44B: 0xE5F1, - 0xA44C: 0xE5F2, - 0xA44D: 0xE5F3, - 0xA44E: 0xE5F4, - 0xA44F: 0xE5F5, - 0xA450: 0xE5F6, - 0xA451: 0xE5F7, - 0xA452: 0xE5F8, - 0xA453: 0xE5F9, - 0xA454: 0xE5FA, - 0xA455: 0xE5FB, - 0xA456: 0xE5FC, - 0xA457: 0xE5FD, - 0xA458: 0xE5FE, - 0xA459: 0xE5FF, - 0xA45A: 0xE600, - 0xA45B: 0xE601, - 0xA45C: 0xE602, - 0xA45D: 0xE603, - 0xA45E: 0xE604, - 0xA45F: 0xE605, - 0xA460: 0xE606, - 0xA461: 0xE607, - 0xA462: 0xE608, - 0xA463: 0xE609, - 0xA464: 0xE60A, - 0xA465: 0xE60B, - 0xA466: 0xE60C, - 0xA467: 0xE60D, - 0xA468: 0xE60E, - 0xA469: 0xE60F, - 0xA46A: 0xE610, - 0xA46B: 0xE611, - 0xA46C: 0xE612, - 0xA46D: 0xE613, - 0xA46E: 0xE614, - 0xA46F: 0xE615, - 0xA470: 0xE616, - 0xA471: 0xE617, - 0xA472: 0xE618, - 0xA473: 0xE619, - 0xA474: 0xE61A, - 0xA475: 0xE61B, - 0xA476: 0xE61C, - 0xA477: 0xE61D, - 0xA478: 0xE61E, - 0xA479: 0xE61F, - 0xA47A: 0xE620, - 0xA47B: 0xE621, - 0xA47C: 0xE622, - 0xA47D: 0xE623, - 0xA47E: 0xE624, - 0xA480: 0xE625, - 0xA481: 0xE626, - 0xA482: 0xE627, - 0xA483: 0xE628, - 0xA484: 0xE629, - 0xA485: 0xE62A, - 0xA486: 0xE62B, - 0xA487: 0xE62C, - 0xA488: 0xE62D, - 0xA489: 0xE62E, - 0xA48A: 0xE62F, - 0xA48B: 0xE630, - 0xA48C: 0xE631, - 0xA48D: 0xE632, - 0xA48E: 0xE633, - 0xA48F: 0xE634, - 0xA490: 0xE635, - 0xA491: 0xE636, - 0xA492: 0xE637, - 0xA493: 0xE638, - 0xA494: 0xE639, - 0xA495: 0xE63A, - 0xA496: 0xE63B, - 0xA497: 0xE63C, - 0xA498: 0xE63D, - 0xA499: 0xE63E, - 0xA49A: 0xE63F, - 0xA49B: 0xE640, - 0xA49C: 0xE641, - 0xA49D: 0xE642, - 0xA49E: 0xE643, - 0xA49F: 0xE644, - 0xA4A0: 0xE645, - 0xA4A1: 0x3041, - 0xA4A2: 0x3042, - 0xA4A3: 0x3043, - 0xA4A4: 0x3044, - 0xA4A5: 0x3045, - 0xA4A6: 0x3046, - 0xA4A7: 0x3047, - 0xA4A8: 0x3048, - 0xA4A9: 0x3049, - 0xA4AA: 0x304A, - 0xA4AB: 0x304B, - 0xA4AC: 0x304C, - 0xA4AD: 0x304D, - 0xA4AE: 0x304E, - 0xA4AF: 0x304F, - 0xA4B0: 0x3050, - 0xA4B1: 0x3051, - 0xA4B2: 0x3052, - 0xA4B3: 0x3053, - 0xA4B4: 0x3054, - 0xA4B5: 0x3055, - 0xA4B6: 0x3056, - 0xA4B7: 0x3057, - 0xA4B8: 0x3058, - 0xA4B9: 0x3059, - 0xA4BA: 0x305A, - 0xA4BB: 0x305B, - 0xA4BC: 0x305C, - 0xA4BD: 0x305D, - 0xA4BE: 0x305E, - 0xA4BF: 0x305F, - 0xA4C0: 0x3060, - 0xA4C1: 0x3061, - 0xA4C2: 0x3062, - 0xA4C3: 0x3063, - 0xA4C4: 0x3064, - 0xA4C5: 0x3065, - 0xA4C6: 0x3066, - 0xA4C7: 0x3067, - 0xA4C8: 0x3068, - 0xA4C9: 0x3069, - 0xA4CA: 0x306A, - 0xA4CB: 0x306B, - 0xA4CC: 0x306C, - 0xA4CD: 0x306D, - 0xA4CE: 0x306E, - 0xA4CF: 0x306F, - 0xA4D0: 0x3070, - 0xA4D1: 0x3071, - 0xA4D2: 0x3072, - 0xA4D3: 0x3073, - 0xA4D4: 0x3074, - 0xA4D5: 0x3075, - 0xA4D6: 0x3076, - 0xA4D7: 0x3077, - 0xA4D8: 0x3078, - 0xA4D9: 0x3079, - 0xA4DA: 0x307A, - 0xA4DB: 0x307B, - 0xA4DC: 0x307C, - 0xA4DD: 0x307D, - 0xA4DE: 0x307E, - 0xA4DF: 0x307F, - 0xA4E0: 0x3080, - 0xA4E1: 0x3081, - 0xA4E2: 0x3082, - 0xA4E3: 0x3083, - 0xA4E4: 0x3084, - 0xA4E5: 0x3085, - 0xA4E6: 0x3086, - 0xA4E7: 0x3087, - 0xA4E8: 0x3088, - 0xA4E9: 0x3089, - 0xA4EA: 0x308A, - 0xA4EB: 0x308B, - 0xA4EC: 0x308C, - 0xA4ED: 0x308D, - 0xA4EE: 0x308E, - 0xA4EF: 0x308F, - 0xA4F0: 0x3090, - 0xA4F1: 0x3091, - 0xA4F2: 0x3092, - 0xA4F3: 0x3093, - 0xA4F4: 0xE772, - 0xA4F5: 0xE773, - 0xA4F6: 0xE774, - 0xA4F7: 0xE775, - 0xA4F8: 0xE776, - 0xA4F9: 0xE777, - 0xA4FA: 0xE778, - 0xA4FB: 0xE779, - 0xA4FC: 0xE77A, - 0xA4FD: 0xE77B, - 0xA4FE: 0xE77C, - 0xA540: 0xE646, - 0xA541: 0xE647, - 0xA542: 0xE648, - 0xA543: 0xE649, - 0xA544: 0xE64A, - 0xA545: 0xE64B, - 0xA546: 0xE64C, - 0xA547: 0xE64D, - 0xA548: 0xE64E, - 0xA549: 0xE64F, - 0xA54A: 0xE650, - 0xA54B: 0xE651, - 0xA54C: 0xE652, - 0xA54D: 0xE653, - 0xA54E: 0xE654, - 0xA54F: 0xE655, - 0xA550: 0xE656, - 0xA551: 0xE657, - 0xA552: 0xE658, - 0xA553: 0xE659, - 0xA554: 0xE65A, - 0xA555: 0xE65B, - 0xA556: 0xE65C, - 0xA557: 0xE65D, - 0xA558: 0xE65E, - 0xA559: 0xE65F, - 0xA55A: 0xE660, - 0xA55B: 0xE661, - 0xA55C: 0xE662, - 0xA55D: 0xE663, - 0xA55E: 0xE664, - 0xA55F: 0xE665, - 0xA560: 0xE666, - 0xA561: 0xE667, - 0xA562: 0xE668, - 0xA563: 0xE669, - 0xA564: 0xE66A, - 0xA565: 0xE66B, - 0xA566: 0xE66C, - 0xA567: 0xE66D, - 0xA568: 0xE66E, - 0xA569: 0xE66F, - 0xA56A: 0xE670, - 0xA56B: 0xE671, - 0xA56C: 0xE672, - 0xA56D: 0xE673, - 0xA56E: 0xE674, - 0xA56F: 0xE675, - 0xA570: 0xE676, - 0xA571: 0xE677, - 0xA572: 0xE678, - 0xA573: 0xE679, - 0xA574: 0xE67A, - 0xA575: 0xE67B, - 0xA576: 0xE67C, - 0xA577: 0xE67D, - 0xA578: 0xE67E, - 0xA579: 0xE67F, - 0xA57A: 0xE680, - 0xA57B: 0xE681, - 0xA57C: 0xE682, - 0xA57D: 0xE683, - 0xA57E: 0xE684, - 0xA580: 0xE685, - 0xA581: 0xE686, - 0xA582: 0xE687, - 0xA583: 0xE688, - 0xA584: 0xE689, - 0xA585: 0xE68A, - 0xA586: 0xE68B, - 0xA587: 0xE68C, - 0xA588: 0xE68D, - 0xA589: 0xE68E, - 0xA58A: 0xE68F, - 0xA58B: 0xE690, - 0xA58C: 0xE691, - 0xA58D: 0xE692, - 0xA58E: 0xE693, - 0xA58F: 0xE694, - 0xA590: 0xE695, - 0xA591: 0xE696, - 0xA592: 0xE697, - 0xA593: 0xE698, - 0xA594: 0xE699, - 0xA595: 0xE69A, - 0xA596: 0xE69B, - 0xA597: 0xE69C, - 0xA598: 0xE69D, - 0xA599: 0xE69E, - 0xA59A: 0xE69F, - 0xA59B: 0xE6A0, - 0xA59C: 0xE6A1, - 0xA59D: 0xE6A2, - 0xA59E: 0xE6A3, - 0xA59F: 0xE6A4, - 0xA5A0: 0xE6A5, - 0xA5A1: 0x30A1, - 0xA5A2: 0x30A2, - 0xA5A3: 0x30A3, - 0xA5A4: 0x30A4, - 0xA5A5: 0x30A5, - 0xA5A6: 0x30A6, - 0xA5A7: 0x30A7, - 0xA5A8: 0x30A8, - 0xA5A9: 0x30A9, - 0xA5AA: 0x30AA, - 0xA5AB: 0x30AB, - 0xA5AC: 0x30AC, - 0xA5AD: 0x30AD, - 0xA5AE: 0x30AE, - 0xA5AF: 0x30AF, - 0xA5B0: 0x30B0, - 0xA5B1: 0x30B1, - 0xA5B2: 0x30B2, - 0xA5B3: 0x30B3, - 0xA5B4: 0x30B4, - 0xA5B5: 0x30B5, - 0xA5B6: 0x30B6, - 0xA5B7: 0x30B7, - 0xA5B8: 0x30B8, - 0xA5B9: 0x30B9, - 0xA5BA: 0x30BA, - 0xA5BB: 0x30BB, - 0xA5BC: 0x30BC, - 0xA5BD: 0x30BD, - 0xA5BE: 0x30BE, - 0xA5BF: 0x30BF, - 0xA5C0: 0x30C0, - 0xA5C1: 0x30C1, - 0xA5C2: 0x30C2, - 0xA5C3: 0x30C3, - 0xA5C4: 0x30C4, - 0xA5C5: 0x30C5, - 0xA5C6: 0x30C6, - 0xA5C7: 0x30C7, - 0xA5C8: 0x30C8, - 0xA5C9: 0x30C9, - 0xA5CA: 0x30CA, - 0xA5CB: 0x30CB, - 0xA5CC: 0x30CC, - 0xA5CD: 0x30CD, - 0xA5CE: 0x30CE, - 0xA5CF: 0x30CF, - 0xA5D0: 0x30D0, - 0xA5D1: 0x30D1, - 0xA5D2: 0x30D2, - 0xA5D3: 0x30D3, - 0xA5D4: 0x30D4, - 0xA5D5: 0x30D5, - 0xA5D6: 0x30D6, - 0xA5D7: 0x30D7, - 0xA5D8: 0x30D8, - 0xA5D9: 0x30D9, - 0xA5DA: 0x30DA, - 0xA5DB: 0x30DB, - 0xA5DC: 0x30DC, - 0xA5DD: 0x30DD, - 0xA5DE: 0x30DE, - 0xA5DF: 0x30DF, - 0xA5E0: 0x30E0, - 0xA5E1: 0x30E1, - 0xA5E2: 0x30E2, - 0xA5E3: 0x30E3, - 0xA5E4: 0x30E4, - 0xA5E5: 0x30E5, - 0xA5E6: 0x30E6, - 0xA5E7: 0x30E7, - 0xA5E8: 0x30E8, - 0xA5E9: 0x30E9, - 0xA5EA: 0x30EA, - 0xA5EB: 0x30EB, - 0xA5EC: 0x30EC, - 0xA5ED: 0x30ED, - 0xA5EE: 0x30EE, - 0xA5EF: 0x30EF, - 0xA5F0: 0x30F0, - 0xA5F1: 0x30F1, - 0xA5F2: 0x30F2, - 0xA5F3: 0x30F3, - 0xA5F4: 0x30F4, - 0xA5F5: 0x30F5, - 0xA5F6: 0x30F6, - 0xA5F7: 0xE77D, - 0xA5F8: 0xE77E, - 0xA5F9: 0xE77F, - 0xA5FA: 0xE780, - 0xA5FB: 0xE781, - 0xA5FC: 0xE782, - 0xA5FD: 0xE783, - 0xA5FE: 0xE784, - 0xA640: 0xE6A6, - 0xA641: 0xE6A7, - 0xA642: 0xE6A8, - 0xA643: 0xE6A9, - 0xA644: 0xE6AA, - 0xA645: 0xE6AB, - 0xA646: 0xE6AC, - 0xA647: 0xE6AD, - 0xA648: 0xE6AE, - 0xA649: 0xE6AF, - 0xA64A: 0xE6B0, - 0xA64B: 0xE6B1, - 0xA64C: 0xE6B2, - 0xA64D: 0xE6B3, - 0xA64E: 0xE6B4, - 0xA64F: 0xE6B5, - 0xA650: 0xE6B6, - 0xA651: 0xE6B7, - 0xA652: 0xE6B8, - 0xA653: 0xE6B9, - 0xA654: 0xE6BA, - 0xA655: 0xE6BB, - 0xA656: 0xE6BC, - 0xA657: 0xE6BD, - 0xA658: 0xE6BE, - 0xA659: 0xE6BF, - 0xA65A: 0xE6C0, - 0xA65B: 0xE6C1, - 0xA65C: 0xE6C2, - 0xA65D: 0xE6C3, - 0xA65E: 0xE6C4, - 0xA65F: 0xE6C5, - 0xA660: 0xE6C6, - 0xA661: 0xE6C7, - 0xA662: 0xE6C8, - 0xA663: 0xE6C9, - 0xA664: 0xE6CA, - 0xA665: 0xE6CB, - 0xA666: 0xE6CC, - 0xA667: 0xE6CD, - 0xA668: 0xE6CE, - 0xA669: 0xE6CF, - 0xA66A: 0xE6D0, - 0xA66B: 0xE6D1, - 0xA66C: 0xE6D2, - 0xA66D: 0xE6D3, - 0xA66E: 0xE6D4, - 0xA66F: 0xE6D5, - 0xA670: 0xE6D6, - 0xA671: 0xE6D7, - 0xA672: 0xE6D8, - 0xA673: 0xE6D9, - 0xA674: 0xE6DA, - 0xA675: 0xE6DB, - 0xA676: 0xE6DC, - 0xA677: 0xE6DD, - 0xA678: 0xE6DE, - 0xA679: 0xE6DF, - 0xA67A: 0xE6E0, - 0xA67B: 0xE6E1, - 0xA67C: 0xE6E2, - 0xA67D: 0xE6E3, - 0xA67E: 0xE6E4, - 0xA680: 0xE6E5, - 0xA681: 0xE6E6, - 0xA682: 0xE6E7, - 0xA683: 0xE6E8, - 0xA684: 0xE6E9, - 0xA685: 0xE6EA, - 0xA686: 0xE6EB, - 0xA687: 0xE6EC, - 0xA688: 0xE6ED, - 0xA689: 0xE6EE, - 0xA68A: 0xE6EF, - 0xA68B: 0xE6F0, - 0xA68C: 0xE6F1, - 0xA68D: 0xE6F2, - 0xA68E: 0xE6F3, - 0xA68F: 0xE6F4, - 0xA690: 0xE6F5, - 0xA691: 0xE6F6, - 0xA692: 0xE6F7, - 0xA693: 0xE6F8, - 0xA694: 0xE6F9, - 0xA695: 0xE6FA, - 0xA696: 0xE6FB, - 0xA697: 0xE6FC, - 0xA698: 0xE6FD, - 0xA699: 0xE6FE, - 0xA69A: 0xE6FF, - 0xA69B: 0xE700, - 0xA69C: 0xE701, - 0xA69D: 0xE702, - 0xA69E: 0xE703, - 0xA69F: 0xE704, - 0xA6A0: 0xE705, - 0xA6A1: 0x0391, - 0xA6A2: 0x0392, - 0xA6A3: 0x0393, - 0xA6A4: 0x0394, - 0xA6A5: 0x0395, - 0xA6A6: 0x0396, - 0xA6A7: 0x0397, - 0xA6A8: 0x0398, - 0xA6A9: 0x0399, - 0xA6AA: 0x039A, - 0xA6AB: 0x039B, - 0xA6AC: 0x039C, - 0xA6AD: 0x039D, - 0xA6AE: 0x039E, - 0xA6AF: 0x039F, - 0xA6B0: 0x03A0, - 0xA6B1: 0x03A1, - 0xA6B2: 0x03A3, - 0xA6B3: 0x03A4, - 0xA6B4: 0x03A5, - 0xA6B5: 0x03A6, - 0xA6B6: 0x03A7, - 0xA6B7: 0x03A8, - 0xA6B8: 0x03A9, - 0xA6B9: 0xE785, - 0xA6BA: 0xE786, - 0xA6BB: 0xE787, - 0xA6BC: 0xE788, - 0xA6BD: 0xE789, - 0xA6BE: 0xE78A, - 0xA6BF: 0xE78B, - 0xA6C0: 0xE78C, - 0xA6C1: 0x03B1, - 0xA6C2: 0x03B2, - 0xA6C3: 0x03B3, - 0xA6C4: 0x03B4, - 0xA6C5: 0x03B5, - 0xA6C6: 0x03B6, - 0xA6C7: 0x03B7, - 0xA6C8: 0x03B8, - 0xA6C9: 0x03B9, - 0xA6CA: 0x03BA, - 0xA6CB: 0x03BB, - 0xA6CC: 0x03BC, - 0xA6CD: 0x03BD, - 0xA6CE: 0x03BE, - 0xA6CF: 0x03BF, - 0xA6D0: 0x03C0, - 0xA6D1: 0x03C1, - 0xA6D2: 0x03C3, - 0xA6D3: 0x03C4, - 0xA6D4: 0x03C5, - 0xA6D5: 0x03C6, - 0xA6D6: 0x03C7, - 0xA6D7: 0x03C8, - 0xA6D8: 0x03C9, - 0xA6D9: 0xFE10, - 0xA6DA: 0xFE12, - 0xA6DB: 0xFE11, - 0xA6DC: 0xFE13, - 0xA6DD: 0xFE14, - 0xA6DE: 0xFE15, - 0xA6DF: 0xFE16, - 0xA6E0: 0xFE35, - 0xA6E1: 0xFE36, - 0xA6E2: 0xFE39, - 0xA6E3: 0xFE3A, - 0xA6E4: 0xFE3F, - 0xA6E5: 0xFE40, - 0xA6E6: 0xFE3D, - 0xA6E7: 0xFE3E, - 0xA6E8: 0xFE41, - 0xA6E9: 0xFE42, - 0xA6EA: 0xFE43, - 0xA6EB: 0xFE44, - 0xA6EC: 0xFE17, - 0xA6ED: 0xFE18, - 0xA6EE: 0xFE3B, - 0xA6EF: 0xFE3C, - 0xA6F0: 0xFE37, - 0xA6F1: 0xFE38, - 0xA6F2: 0xFE31, - 0xA6F3: 0xFE19, - 0xA6F4: 0xFE33, - 0xA6F5: 0xFE34, - 0xA6F6: 0xE797, - 0xA6F7: 0xE798, - 0xA6F8: 0xE799, - 0xA6F9: 0xE79A, - 0xA6FA: 0xE79B, - 0xA6FB: 0xE79C, - 0xA6FC: 0xE79D, - 0xA6FD: 0xE79E, - 0xA6FE: 0xE79F, - 0xA740: 0xE706, - 0xA741: 0xE707, - 0xA742: 0xE708, - 0xA743: 0xE709, - 0xA744: 0xE70A, - 0xA745: 0xE70B, - 0xA746: 0xE70C, - 0xA747: 0xE70D, - 0xA748: 0xE70E, - 0xA749: 0xE70F, - 0xA74A: 0xE710, - 0xA74B: 0xE711, - 0xA74C: 0xE712, - 0xA74D: 0xE713, - 0xA74E: 0xE714, - 0xA74F: 0xE715, - 0xA750: 0xE716, - 0xA751: 0xE717, - 0xA752: 0xE718, - 0xA753: 0xE719, - 0xA754: 0xE71A, - 0xA755: 0xE71B, - 0xA756: 0xE71C, - 0xA757: 0xE71D, - 0xA758: 0xE71E, - 0xA759: 0xE71F, - 0xA75A: 0xE720, - 0xA75B: 0xE721, - 0xA75C: 0xE722, - 0xA75D: 0xE723, - 0xA75E: 0xE724, - 0xA75F: 0xE725, - 0xA760: 0xE726, - 0xA761: 0xE727, - 0xA762: 0xE728, - 0xA763: 0xE729, - 0xA764: 0xE72A, - 0xA765: 0xE72B, - 0xA766: 0xE72C, - 0xA767: 0xE72D, - 0xA768: 0xE72E, - 0xA769: 0xE72F, - 0xA76A: 0xE730, - 0xA76B: 0xE731, - 0xA76C: 0xE732, - 0xA76D: 0xE733, - 0xA76E: 0xE734, - 0xA76F: 0xE735, - 0xA770: 0xE736, - 0xA771: 0xE737, - 0xA772: 0xE738, - 0xA773: 0xE739, - 0xA774: 0xE73A, - 0xA775: 0xE73B, - 0xA776: 0xE73C, - 0xA777: 0xE73D, - 0xA778: 0xE73E, - 0xA779: 0xE73F, - 0xA77A: 0xE740, - 0xA77B: 0xE741, - 0xA77C: 0xE742, - 0xA77D: 0xE743, - 0xA77E: 0xE744, - 0xA780: 0xE745, - 0xA781: 0xE746, - 0xA782: 0xE747, - 0xA783: 0xE748, - 0xA784: 0xE749, - 0xA785: 0xE74A, - 0xA786: 0xE74B, - 0xA787: 0xE74C, - 0xA788: 0xE74D, - 0xA789: 0xE74E, - 0xA78A: 0xE74F, - 0xA78B: 0xE750, - 0xA78C: 0xE751, - 0xA78D: 0xE752, - 0xA78E: 0xE753, - 0xA78F: 0xE754, - 0xA790: 0xE755, - 0xA791: 0xE756, - 0xA792: 0xE757, - 0xA793: 0xE758, - 0xA794: 0xE759, - 0xA795: 0xE75A, - 0xA796: 0xE75B, - 0xA797: 0xE75C, - 0xA798: 0xE75D, - 0xA799: 0xE75E, - 0xA79A: 0xE75F, - 0xA79B: 0xE760, - 0xA79C: 0xE761, - 0xA79D: 0xE762, - 0xA79E: 0xE763, - 0xA79F: 0xE764, - 0xA7A0: 0xE765, - 0xA7A1: 0x0410, - 0xA7A2: 0x0411, - 0xA7A3: 0x0412, - 0xA7A4: 0x0413, - 0xA7A5: 0x0414, - 0xA7A6: 0x0415, - 0xA7A7: 0x0401, - 0xA7A8: 0x0416, - 0xA7A9: 0x0417, - 0xA7AA: 0x0418, - 0xA7AB: 0x0419, - 0xA7AC: 0x041A, - 0xA7AD: 0x041B, - 0xA7AE: 0x041C, - 0xA7AF: 0x041D, - 0xA7B0: 0x041E, - 0xA7B1: 0x041F, - 0xA7B2: 0x0420, - 0xA7B3: 0x0421, - 0xA7B4: 0x0422, - 0xA7B5: 0x0423, - 0xA7B6: 0x0424, - 0xA7B7: 0x0425, - 0xA7B8: 0x0426, - 0xA7B9: 0x0427, - 0xA7BA: 0x0428, - 0xA7BB: 0x0429, - 0xA7BC: 0x042A, - 0xA7BD: 0x042B, - 0xA7BE: 0x042C, - 0xA7BF: 0x042D, - 0xA7C0: 0x042E, - 0xA7C1: 0x042F, - 0xA7C2: 0xE7A0, - 0xA7C3: 0xE7A1, - 0xA7C4: 0xE7A2, - 0xA7C5: 0xE7A3, - 0xA7C6: 0xE7A4, - 0xA7C7: 0xE7A5, - 0xA7C8: 0xE7A6, - 0xA7C9: 0xE7A7, - 0xA7CA: 0xE7A8, - 0xA7CB: 0xE7A9, - 0xA7CC: 0xE7AA, - 0xA7CD: 0xE7AB, - 0xA7CE: 0xE7AC, - 0xA7CF: 0xE7AD, - 0xA7D0: 0xE7AE, - 0xA7D1: 0x0430, - 0xA7D2: 0x0431, - 0xA7D3: 0x0432, - 0xA7D4: 0x0433, - 0xA7D5: 0x0434, - 0xA7D6: 0x0435, - 0xA7D7: 0x0451, - 0xA7D8: 0x0436, - 0xA7D9: 0x0437, - 0xA7DA: 0x0438, - 0xA7DB: 0x0439, - 0xA7DC: 0x043A, - 0xA7DD: 0x043B, - 0xA7DE: 0x043C, - 0xA7DF: 0x043D, - 0xA7E0: 0x043E, - 0xA7E1: 0x043F, - 0xA7E2: 0x0440, - 0xA7E3: 0x0441, - 0xA7E4: 0x0442, - 0xA7E5: 0x0443, - 0xA7E6: 0x0444, - 0xA7E7: 0x0445, - 0xA7E8: 0x0446, - 0xA7E9: 0x0447, - 0xA7EA: 0x0448, - 0xA7EB: 0x0449, - 0xA7EC: 0x044A, - 0xA7ED: 0x044B, - 0xA7EE: 0x044C, - 0xA7EF: 0x044D, - 0xA7F0: 0x044E, - 0xA7F1: 0x044F, - 0xA7F2: 0xE7AF, - 0xA7F3: 0xE7B0, - 0xA7F4: 0xE7B1, - 0xA7F5: 0xE7B2, - 0xA7F6: 0xE7B3, - 0xA7F7: 0xE7B4, - 0xA7F8: 0xE7B5, - 0xA7F9: 0xE7B6, - 0xA7FA: 0xE7B7, - 0xA7FB: 0xE7B8, - 0xA7FC: 0xE7B9, - 0xA7FD: 0xE7BA, - 0xA7FE: 0xE7BB, - 0xA840: 0x02CA, - 0xA841: 0x02CB, - 0xA842: 0x02D9, - 0xA843: 0x2013, - 0xA844: 0x2015, - 0xA845: 0x2025, - 0xA846: 0x2035, - 0xA847: 0x2105, - 0xA848: 0x2109, - 0xA849: 0x2196, - 0xA84A: 0x2197, - 0xA84B: 0x2198, - 0xA84C: 0x2199, - 0xA84D: 0x2215, - 0xA84E: 0x221F, - 0xA84F: 0x2223, - 0xA850: 0x2252, - 0xA851: 0x2266, - 0xA852: 0x2267, - 0xA853: 0x22BF, - 0xA854: 0x2550, - 0xA855: 0x2551, - 0xA856: 0x2552, - 0xA857: 0x2553, - 0xA858: 0x2554, - 0xA859: 0x2555, - 0xA85A: 0x2556, - 0xA85B: 0x2557, - 0xA85C: 0x2558, - 0xA85D: 0x2559, - 0xA85E: 0x255A, - 0xA85F: 0x255B, - 0xA860: 0x255C, - 0xA861: 0x255D, - 0xA862: 0x255E, - 0xA863: 0x255F, - 0xA864: 0x2560, - 0xA865: 0x2561, - 0xA866: 0x2562, - 0xA867: 0x2563, - 0xA868: 0x2564, - 0xA869: 0x2565, - 0xA86A: 0x2566, - 0xA86B: 0x2567, - 0xA86C: 0x2568, - 0xA86D: 0x2569, - 0xA86E: 0x256A, - 0xA86F: 0x256B, - 0xA870: 0x256C, - 0xA871: 0x256D, - 0xA872: 0x256E, - 0xA873: 0x256F, - 0xA874: 0x2570, - 0xA875: 0x2571, - 0xA876: 0x2572, - 0xA877: 0x2573, - 0xA878: 0x2581, - 0xA879: 0x2582, - 0xA87A: 0x2583, - 0xA87B: 0x2584, - 0xA87C: 0x2585, - 0xA87D: 0x2586, - 0xA87E: 0x2587, - 0xA880: 0x2588, - 0xA881: 0x2589, - 0xA882: 0x258A, - 0xA883: 0x258B, - 0xA884: 0x258C, - 0xA885: 0x258D, - 0xA886: 0x258E, - 0xA887: 0x258F, - 0xA888: 0x2593, - 0xA889: 0x2594, - 0xA88A: 0x2595, - 0xA88B: 0x25BC, - 0xA88C: 0x25BD, - 0xA88D: 0x25E2, - 0xA88E: 0x25E3, - 0xA88F: 0x25E4, - 0xA890: 0x25E5, - 0xA891: 0x2609, - 0xA892: 0x2295, - 0xA893: 0x3012, - 0xA894: 0x301D, - 0xA895: 0x301E, - 0xA896: 0xE7BC, - 0xA897: 0xE7BD, - 0xA898: 0xE7BE, - 0xA899: 0xE7BF, - 0xA89A: 0xE7C0, - 0xA89B: 0xE7C1, - 0xA89C: 0xE7C2, - 0xA89D: 0xE7C3, - 0xA89E: 0xE7C4, - 0xA89F: 0xE7C5, - 0xA8A0: 0xE7C6, - 0xA8A1: 0x0101, - 0xA8A2: 0x00E1, - 0xA8A3: 0x01CE, - 0xA8A4: 0x00E0, - 0xA8A5: 0x0113, - 0xA8A6: 0x00E9, - 0xA8A7: 0x011B, - 0xA8A8: 0x00E8, - 0xA8A9: 0x012B, - 0xA8AA: 0x00ED, - 0xA8AB: 0x01D0, - 0xA8AC: 0x00EC, - 0xA8AD: 0x014D, - 0xA8AE: 0x00F3, - 0xA8AF: 0x01D2, - 0xA8B0: 0x00F2, - 0xA8B1: 0x016B, - 0xA8B2: 0x00FA, - 0xA8B3: 0x01D4, - 0xA8B4: 0x00F9, - 0xA8B5: 0x01D6, - 0xA8B6: 0x01D8, - 0xA8B7: 0x01DA, - 0xA8B8: 0x01DC, - 0xA8B9: 0x00FC, - 0xA8BA: 0x00EA, - 0xA8BB: 0x0251, - 0xA8BC: 0x1E3F, - 0xA8BD: 0x0144, - 0xA8BE: 0x0148, - 0xA8BF: 0x01F9, - 0xA8C0: 0x0261, - 0xA8C1: 0xE7C9, - 0xA8C2: 0xE7CA, - 0xA8C3: 0xE7CB, - 0xA8C4: 0xE7CC, - 0xA8C5: 0x3105, - 0xA8C6: 0x3106, - 0xA8C7: 0x3107, - 0xA8C8: 0x3108, - 0xA8C9: 0x3109, - 0xA8CA: 0x310A, - 0xA8CB: 0x310B, - 0xA8CC: 0x310C, - 0xA8CD: 0x310D, - 0xA8CE: 0x310E, - 0xA8CF: 0x310F, - 0xA8D0: 0x3110, - 0xA8D1: 0x3111, - 0xA8D2: 0x3112, - 0xA8D3: 0x3113, - 0xA8D4: 0x3114, - 0xA8D5: 0x3115, - 0xA8D6: 0x3116, - 0xA8D7: 0x3117, - 0xA8D8: 0x3118, - 0xA8D9: 0x3119, - 0xA8DA: 0x311A, - 0xA8DB: 0x311B, - 0xA8DC: 0x311C, - 0xA8DD: 0x311D, - 0xA8DE: 0x311E, - 0xA8DF: 0x311F, - 0xA8E0: 0x3120, - 0xA8E1: 0x3121, - 0xA8E2: 0x3122, - 0xA8E3: 0x3123, - 0xA8E4: 0x3124, - 0xA8E5: 0x3125, - 0xA8E6: 0x3126, - 0xA8E7: 0x3127, - 0xA8E8: 0x3128, - 0xA8E9: 0x3129, - 0xA8EA: 0xE7CD, - 0xA8EB: 0xE7CE, - 0xA8EC: 0xE7CF, - 0xA8ED: 0xE7D0, - 0xA8EE: 0xE7D1, - 0xA8EF: 0xE7D2, - 0xA8F0: 0xE7D3, - 0xA8F1: 0xE7D4, - 0xA8F2: 0xE7D5, - 0xA8F3: 0xE7D6, - 0xA8F4: 0xE7D7, - 0xA8F5: 0xE7D8, - 0xA8F6: 0xE7D9, - 0xA8F7: 0xE7DA, - 0xA8F8: 0xE7DB, - 0xA8F9: 0xE7DC, - 0xA8FA: 0xE7DD, - 0xA8FB: 0xE7DE, - 0xA8FC: 0xE7DF, - 0xA8FD: 0xE7E0, - 0xA8FE: 0xE7E1, - 0xA940: 0x3021, - 0xA941: 0x3022, - 0xA942: 0x3023, - 0xA943: 0x3024, - 0xA944: 0x3025, - 0xA945: 0x3026, - 0xA946: 0x3027, - 0xA947: 0x3028, - 0xA948: 0x3029, - 0xA949: 0x32A3, - 0xA94A: 0x338E, - 0xA94B: 0x338F, - 0xA94C: 0x339C, - 0xA94D: 0x339D, - 0xA94E: 0x339E, - 0xA94F: 0x33A1, - 0xA950: 0x33C4, - 0xA951: 0x33CE, - 0xA952: 0x33D1, - 0xA953: 0x33D2, - 0xA954: 0x33D5, - 0xA955: 0xFE30, - 0xA956: 0xFFE2, - 0xA957: 0xFFE4, - 0xA958: 0xE7E2, - 0xA959: 0x2121, - 0xA95A: 0x3231, - 0xA95B: 0xE7E3, - 0xA95C: 0x2010, - 0xA95D: 0xE7E4, - 0xA95E: 0xE7E5, - 0xA95F: 0xE7E6, - 0xA960: 0x30FC, - 0xA961: 0x309B, - 0xA962: 0x309C, - 0xA963: 0x30FD, - 0xA964: 0x30FE, - 0xA965: 0x3006, - 0xA966: 0x309D, - 0xA967: 0x309E, - 0xA968: 0xFE49, - 0xA969: 0xFE4A, - 0xA96A: 0xFE4B, - 0xA96B: 0xFE4C, - 0xA96C: 0xFE4D, - 0xA96D: 0xFE4E, - 0xA96E: 0xFE4F, - 0xA96F: 0xFE50, - 0xA970: 0xFE51, - 0xA971: 0xFE52, - 0xA972: 0xFE54, - 0xA973: 0xFE55, - 0xA974: 0xFE56, - 0xA975: 0xFE57, - 0xA976: 0xFE59, - 0xA977: 0xFE5A, - 0xA978: 0xFE5B, - 0xA979: 0xFE5C, - 0xA97A: 0xFE5D, - 0xA97B: 0xFE5E, - 0xA97C: 0xFE5F, - 0xA97D: 0xFE60, - 0xA97E: 0xFE61, - 0xA980: 0xFE62, - 0xA981: 0xFE63, - 0xA982: 0xFE64, - 0xA983: 0xFE65, - 0xA984: 0xFE66, - 0xA985: 0xFE68, - 0xA986: 0xFE69, - 0xA987: 0xFE6A, - 0xA988: 0xFE6B, - 0xA989: 0x303E, - 0xA98A: 0x2FF0, - 0xA98B: 0x2FF1, - 0xA98C: 0x2FF2, - 0xA98D: 0x2FF3, - 0xA98E: 0x2FF4, - 0xA98F: 0x2FF5, - 0xA990: 0x2FF6, - 0xA991: 0x2FF7, - 0xA992: 0x2FF8, - 0xA993: 0x2FF9, - 0xA994: 0x2FFA, - 0xA995: 0x2FFB, - 0xA996: 0x3007, - 0xA997: 0xE7F4, - 0xA998: 0xE7F5, - 0xA999: 0xE7F6, - 0xA99A: 0xE7F7, - 0xA99B: 0xE7F8, - 0xA99C: 0xE7F9, - 0xA99D: 0xE7FA, - 0xA99E: 0xE7FB, - 0xA99F: 0xE7FC, - 0xA9A0: 0xE7FD, - 0xA9A1: 0xE7FE, - 0xA9A2: 0xE7FF, - 0xA9A3: 0xE800, - 0xA9A4: 0x2500, - 0xA9A5: 0x2501, - 0xA9A6: 0x2502, - 0xA9A7: 0x2503, - 0xA9A8: 0x2504, - 0xA9A9: 0x2505, - 0xA9AA: 0x2506, - 0xA9AB: 0x2507, - 0xA9AC: 0x2508, - 0xA9AD: 0x2509, - 0xA9AE: 0x250A, - 0xA9AF: 0x250B, - 0xA9B0: 0x250C, - 0xA9B1: 0x250D, - 0xA9B2: 0x250E, - 0xA9B3: 0x250F, - 0xA9B4: 0x2510, - 0xA9B5: 0x2511, - 0xA9B6: 0x2512, - 0xA9B7: 0x2513, - 0xA9B8: 0x2514, - 0xA9B9: 0x2515, - 0xA9BA: 0x2516, - 0xA9BB: 0x2517, - 0xA9BC: 0x2518, - 0xA9BD: 0x2519, - 0xA9BE: 0x251A, - 0xA9BF: 0x251B, - 0xA9C0: 0x251C, - 0xA9C1: 0x251D, - 0xA9C2: 0x251E, - 0xA9C3: 0x251F, - 0xA9C4: 0x2520, - 0xA9C5: 0x2521, - 0xA9C6: 0x2522, - 0xA9C7: 0x2523, - 0xA9C8: 0x2524, - 0xA9C9: 0x2525, - 0xA9CA: 0x2526, - 0xA9CB: 0x2527, - 0xA9CC: 0x2528, - 0xA9CD: 0x2529, - 0xA9CE: 0x252A, - 0xA9CF: 0x252B, - 0xA9D0: 0x252C, - 0xA9D1: 0x252D, - 0xA9D2: 0x252E, - 0xA9D3: 0x252F, - 0xA9D4: 0x2530, - 0xA9D5: 0x2531, - 0xA9D6: 0x2532, - 0xA9D7: 0x2533, - 0xA9D8: 0x2534, - 0xA9D9: 0x2535, - 0xA9DA: 0x2536, - 0xA9DB: 0x2537, - 0xA9DC: 0x2538, - 0xA9DD: 0x2539, - 0xA9DE: 0x253A, - 0xA9DF: 0x253B, - 0xA9E0: 0x253C, - 0xA9E1: 0x253D, - 0xA9E2: 0x253E, - 0xA9E3: 0x253F, - 0xA9E4: 0x2540, - 0xA9E5: 0x2541, - 0xA9E6: 0x2542, - 0xA9E7: 0x2543, - 0xA9E8: 0x2544, - 0xA9E9: 0x2545, - 0xA9EA: 0x2546, - 0xA9EB: 0x2547, - 0xA9EC: 0x2548, - 0xA9ED: 0x2549, - 0xA9EE: 0x254A, - 0xA9EF: 0x254B, - 0xA9F0: 0xE801, - 0xA9F1: 0xE802, - 0xA9F2: 0xE803, - 0xA9F3: 0xE804, - 0xA9F4: 0xE805, - 0xA9F5: 0xE806, - 0xA9F6: 0xE807, - 0xA9F7: 0xE808, - 0xA9F8: 0xE809, - 0xA9F9: 0xE80A, - 0xA9FA: 0xE80B, - 0xA9FB: 0xE80C, - 0xA9FC: 0xE80D, - 0xA9FD: 0xE80E, - 0xA9FE: 0xE80F, - 0xAA40: 0x72DC, - 0xAA41: 0x72DD, - 0xAA42: 0x72DF, - 0xAA43: 0x72E2, - 0xAA44: 0x72E3, - 0xAA45: 0x72E4, - 0xAA46: 0x72E5, - 0xAA47: 0x72E6, - 0xAA48: 0x72E7, - 0xAA49: 0x72EA, - 0xAA4A: 0x72EB, - 0xAA4B: 0x72F5, - 0xAA4C: 0x72F6, - 0xAA4D: 0x72F9, - 0xAA4E: 0x72FD, - 0xAA4F: 0x72FE, - 0xAA50: 0x72FF, - 0xAA51: 0x7300, - 0xAA52: 0x7302, - 0xAA53: 0x7304, - 0xAA54: 0x7305, - 0xAA55: 0x7306, - 0xAA56: 0x7307, - 0xAA57: 0x7308, - 0xAA58: 0x7309, - 0xAA59: 0x730B, - 0xAA5A: 0x730C, - 0xAA5B: 0x730D, - 0xAA5C: 0x730F, - 0xAA5D: 0x7310, - 0xAA5E: 0x7311, - 0xAA5F: 0x7312, - 0xAA60: 0x7314, - 0xAA61: 0x7318, - 0xAA62: 0x7319, - 0xAA63: 0x731A, - 0xAA64: 0x731F, - 0xAA65: 0x7320, - 0xAA66: 0x7323, - 0xAA67: 0x7324, - 0xAA68: 0x7326, - 0xAA69: 0x7327, - 0xAA6A: 0x7328, - 0xAA6B: 0x732D, - 0xAA6C: 0x732F, - 0xAA6D: 0x7330, - 0xAA6E: 0x7332, - 0xAA6F: 0x7333, - 0xAA70: 0x7335, - 0xAA71: 0x7336, - 0xAA72: 0x733A, - 0xAA73: 0x733B, - 0xAA74: 0x733C, - 0xAA75: 0x733D, - 0xAA76: 0x7340, - 0xAA77: 0x7341, - 0xAA78: 0x7342, - 0xAA79: 0x7343, - 0xAA7A: 0x7344, - 0xAA7B: 0x7345, - 0xAA7C: 0x7346, - 0xAA7D: 0x7347, - 0xAA7E: 0x7348, - 0xAA80: 0x7349, - 0xAA81: 0x734A, - 0xAA82: 0x734B, - 0xAA83: 0x734C, - 0xAA84: 0x734E, - 0xAA85: 0x734F, - 0xAA86: 0x7351, - 0xAA87: 0x7353, - 0xAA88: 0x7354, - 0xAA89: 0x7355, - 0xAA8A: 0x7356, - 0xAA8B: 0x7358, - 0xAA8C: 0x7359, - 0xAA8D: 0x735A, - 0xAA8E: 0x735B, - 0xAA8F: 0x735C, - 0xAA90: 0x735D, - 0xAA91: 0x735E, - 0xAA92: 0x735F, - 0xAA93: 0x7361, - 0xAA94: 0x7362, - 0xAA95: 0x7363, - 0xAA96: 0x7364, - 0xAA97: 0x7365, - 0xAA98: 0x7366, - 0xAA99: 0x7367, - 0xAA9A: 0x7368, - 0xAA9B: 0x7369, - 0xAA9C: 0x736A, - 0xAA9D: 0x736B, - 0xAA9E: 0x736E, - 0xAA9F: 0x7370, - 0xAAA0: 0x7371, - 0xAAA1: 0xE000, - 0xAAA2: 0xE001, - 0xAAA3: 0xE002, - 0xAAA4: 0xE003, - 0xAAA5: 0xE004, - 0xAAA6: 0xE005, - 0xAAA7: 0xE006, - 0xAAA8: 0xE007, - 0xAAA9: 0xE008, - 0xAAAA: 0xE009, - 0xAAAB: 0xE00A, - 0xAAAC: 0xE00B, - 0xAAAD: 0xE00C, - 0xAAAE: 0xE00D, - 0xAAAF: 0xE00E, - 0xAAB0: 0xE00F, - 0xAAB1: 0xE010, - 0xAAB2: 0xE011, - 0xAAB3: 0xE012, - 0xAAB4: 0xE013, - 0xAAB5: 0xE014, - 0xAAB6: 0xE015, - 0xAAB7: 0xE016, - 0xAAB8: 0xE017, - 0xAAB9: 0xE018, - 0xAABA: 0xE019, - 0xAABB: 0xE01A, - 0xAABC: 0xE01B, - 0xAABD: 0xE01C, - 0xAABE: 0xE01D, - 0xAABF: 0xE01E, - 0xAAC0: 0xE01F, - 0xAAC1: 0xE020, - 0xAAC2: 0xE021, - 0xAAC3: 0xE022, - 0xAAC4: 0xE023, - 0xAAC5: 0xE024, - 0xAAC6: 0xE025, - 0xAAC7: 0xE026, - 0xAAC8: 0xE027, - 0xAAC9: 0xE028, - 0xAACA: 0xE029, - 0xAACB: 0xE02A, - 0xAACC: 0xE02B, - 0xAACD: 0xE02C, - 0xAACE: 0xE02D, - 0xAACF: 0xE02E, - 0xAAD0: 0xE02F, - 0xAAD1: 0xE030, - 0xAAD2: 0xE031, - 0xAAD3: 0xE032, - 0xAAD4: 0xE033, - 0xAAD5: 0xE034, - 0xAAD6: 0xE035, - 0xAAD7: 0xE036, - 0xAAD8: 0xE037, - 0xAAD9: 0xE038, - 0xAADA: 0xE039, - 0xAADB: 0xE03A, - 0xAADC: 0xE03B, - 0xAADD: 0xE03C, - 0xAADE: 0xE03D, - 0xAADF: 0xE03E, - 0xAAE0: 0xE03F, - 0xAAE1: 0xE040, - 0xAAE2: 0xE041, - 0xAAE3: 0xE042, - 0xAAE4: 0xE043, - 0xAAE5: 0xE044, - 0xAAE6: 0xE045, - 0xAAE7: 0xE046, - 0xAAE8: 0xE047, - 0xAAE9: 0xE048, - 0xAAEA: 0xE049, - 0xAAEB: 0xE04A, - 0xAAEC: 0xE04B, - 0xAAED: 0xE04C, - 0xAAEE: 0xE04D, - 0xAAEF: 0xE04E, - 0xAAF0: 0xE04F, - 0xAAF1: 0xE050, - 0xAAF2: 0xE051, - 0xAAF3: 0xE052, - 0xAAF4: 0xE053, - 0xAAF5: 0xE054, - 0xAAF6: 0xE055, - 0xAAF7: 0xE056, - 0xAAF8: 0xE057, - 0xAAF9: 0xE058, - 0xAAFA: 0xE059, - 0xAAFB: 0xE05A, - 0xAAFC: 0xE05B, - 0xAAFD: 0xE05C, - 0xAAFE: 0xE05D, - 0xAB40: 0x7372, - 0xAB41: 0x7373, - 0xAB42: 0x7374, - 0xAB43: 0x7375, - 0xAB44: 0x7376, - 0xAB45: 0x7377, - 0xAB46: 0x7378, - 0xAB47: 0x7379, - 0xAB48: 0x737A, - 0xAB49: 0x737B, - 0xAB4A: 0x737C, - 0xAB4B: 0x737D, - 0xAB4C: 0x737F, - 0xAB4D: 0x7380, - 0xAB4E: 0x7381, - 0xAB4F: 0x7382, - 0xAB50: 0x7383, - 0xAB51: 0x7385, - 0xAB52: 0x7386, - 0xAB53: 0x7388, - 0xAB54: 0x738A, - 0xAB55: 0x738C, - 0xAB56: 0x738D, - 0xAB57: 0x738F, - 0xAB58: 0x7390, - 0xAB59: 0x7392, - 0xAB5A: 0x7393, - 0xAB5B: 0x7394, - 0xAB5C: 0x7395, - 0xAB5D: 0x7397, - 0xAB5E: 0x7398, - 0xAB5F: 0x7399, - 0xAB60: 0x739A, - 0xAB61: 0x739C, - 0xAB62: 0x739D, - 0xAB63: 0x739E, - 0xAB64: 0x73A0, - 0xAB65: 0x73A1, - 0xAB66: 0x73A3, - 0xAB67: 0x73A4, - 0xAB68: 0x73A5, - 0xAB69: 0x73A6, - 0xAB6A: 0x73A7, - 0xAB6B: 0x73A8, - 0xAB6C: 0x73AA, - 0xAB6D: 0x73AC, - 0xAB6E: 0x73AD, - 0xAB6F: 0x73B1, - 0xAB70: 0x73B4, - 0xAB71: 0x73B5, - 0xAB72: 0x73B6, - 0xAB73: 0x73B8, - 0xAB74: 0x73B9, - 0xAB75: 0x73BC, - 0xAB76: 0x73BD, - 0xAB77: 0x73BE, - 0xAB78: 0x73BF, - 0xAB79: 0x73C1, - 0xAB7A: 0x73C3, - 0xAB7B: 0x73C4, - 0xAB7C: 0x73C5, - 0xAB7D: 0x73C6, - 0xAB7E: 0x73C7, - 0xAB80: 0x73CB, - 0xAB81: 0x73CC, - 0xAB82: 0x73CE, - 0xAB83: 0x73D2, - 0xAB84: 0x73D3, - 0xAB85: 0x73D4, - 0xAB86: 0x73D5, - 0xAB87: 0x73D6, - 0xAB88: 0x73D7, - 0xAB89: 0x73D8, - 0xAB8A: 0x73DA, - 0xAB8B: 0x73DB, - 0xAB8C: 0x73DC, - 0xAB8D: 0x73DD, - 0xAB8E: 0x73DF, - 0xAB8F: 0x73E1, - 0xAB90: 0x73E2, - 0xAB91: 0x73E3, - 0xAB92: 0x73E4, - 0xAB93: 0x73E6, - 0xAB94: 0x73E8, - 0xAB95: 0x73EA, - 0xAB96: 0x73EB, - 0xAB97: 0x73EC, - 0xAB98: 0x73EE, - 0xAB99: 0x73EF, - 0xAB9A: 0x73F0, - 0xAB9B: 0x73F1, - 0xAB9C: 0x73F3, - 0xAB9D: 0x73F4, - 0xAB9E: 0x73F5, - 0xAB9F: 0x73F6, - 0xABA0: 0x73F7, - 0xABA1: 0xE05E, - 0xABA2: 0xE05F, - 0xABA3: 0xE060, - 0xABA4: 0xE061, - 0xABA5: 0xE062, - 0xABA6: 0xE063, - 0xABA7: 0xE064, - 0xABA8: 0xE065, - 0xABA9: 0xE066, - 0xABAA: 0xE067, - 0xABAB: 0xE068, - 0xABAC: 0xE069, - 0xABAD: 0xE06A, - 0xABAE: 0xE06B, - 0xABAF: 0xE06C, - 0xABB0: 0xE06D, - 0xABB1: 0xE06E, - 0xABB2: 0xE06F, - 0xABB3: 0xE070, - 0xABB4: 0xE071, - 0xABB5: 0xE072, - 0xABB6: 0xE073, - 0xABB7: 0xE074, - 0xABB8: 0xE075, - 0xABB9: 0xE076, - 0xABBA: 0xE077, - 0xABBB: 0xE078, - 0xABBC: 0xE079, - 0xABBD: 0xE07A, - 0xABBE: 0xE07B, - 0xABBF: 0xE07C, - 0xABC0: 0xE07D, - 0xABC1: 0xE07E, - 0xABC2: 0xE07F, - 0xABC3: 0xE080, - 0xABC4: 0xE081, - 0xABC5: 0xE082, - 0xABC6: 0xE083, - 0xABC7: 0xE084, - 0xABC8: 0xE085, - 0xABC9: 0xE086, - 0xABCA: 0xE087, - 0xABCB: 0xE088, - 0xABCC: 0xE089, - 0xABCD: 0xE08A, - 0xABCE: 0xE08B, - 0xABCF: 0xE08C, - 0xABD0: 0xE08D, - 0xABD1: 0xE08E, - 0xABD2: 0xE08F, - 0xABD3: 0xE090, - 0xABD4: 0xE091, - 0xABD5: 0xE092, - 0xABD6: 0xE093, - 0xABD7: 0xE094, - 0xABD8: 0xE095, - 0xABD9: 0xE096, - 0xABDA: 0xE097, - 0xABDB: 0xE098, - 0xABDC: 0xE099, - 0xABDD: 0xE09A, - 0xABDE: 0xE09B, - 0xABDF: 0xE09C, - 0xABE0: 0xE09D, - 0xABE1: 0xE09E, - 0xABE2: 0xE09F, - 0xABE3: 0xE0A0, - 0xABE4: 0xE0A1, - 0xABE5: 0xE0A2, - 0xABE6: 0xE0A3, - 0xABE7: 0xE0A4, - 0xABE8: 0xE0A5, - 0xABE9: 0xE0A6, - 0xABEA: 0xE0A7, - 0xABEB: 0xE0A8, - 0xABEC: 0xE0A9, - 0xABED: 0xE0AA, - 0xABEE: 0xE0AB, - 0xABEF: 0xE0AC, - 0xABF0: 0xE0AD, - 0xABF1: 0xE0AE, - 0xABF2: 0xE0AF, - 0xABF3: 0xE0B0, - 0xABF4: 0xE0B1, - 0xABF5: 0xE0B2, - 0xABF6: 0xE0B3, - 0xABF7: 0xE0B4, - 0xABF8: 0xE0B5, - 0xABF9: 0xE0B6, - 0xABFA: 0xE0B7, - 0xABFB: 0xE0B8, - 0xABFC: 0xE0B9, - 0xABFD: 0xE0BA, - 0xABFE: 0xE0BB, - 0xAC40: 0x73F8, - 0xAC41: 0x73F9, - 0xAC42: 0x73FA, - 0xAC43: 0x73FB, - 0xAC44: 0x73FC, - 0xAC45: 0x73FD, - 0xAC46: 0x73FE, - 0xAC47: 0x73FF, - 0xAC48: 0x7400, - 0xAC49: 0x7401, - 0xAC4A: 0x7402, - 0xAC4B: 0x7404, - 0xAC4C: 0x7407, - 0xAC4D: 0x7408, - 0xAC4E: 0x740B, - 0xAC4F: 0x740C, - 0xAC50: 0x740D, - 0xAC51: 0x740E, - 0xAC52: 0x7411, - 0xAC53: 0x7412, - 0xAC54: 0x7413, - 0xAC55: 0x7414, - 0xAC56: 0x7415, - 0xAC57: 0x7416, - 0xAC58: 0x7417, - 0xAC59: 0x7418, - 0xAC5A: 0x7419, - 0xAC5B: 0x741C, - 0xAC5C: 0x741D, - 0xAC5D: 0x741E, - 0xAC5E: 0x741F, - 0xAC5F: 0x7420, - 0xAC60: 0x7421, - 0xAC61: 0x7423, - 0xAC62: 0x7424, - 0xAC63: 0x7427, - 0xAC64: 0x7429, - 0xAC65: 0x742B, - 0xAC66: 0x742D, - 0xAC67: 0x742F, - 0xAC68: 0x7431, - 0xAC69: 0x7432, - 0xAC6A: 0x7437, - 0xAC6B: 0x7438, - 0xAC6C: 0x7439, - 0xAC6D: 0x743A, - 0xAC6E: 0x743B, - 0xAC6F: 0x743D, - 0xAC70: 0x743E, - 0xAC71: 0x743F, - 0xAC72: 0x7440, - 0xAC73: 0x7442, - 0xAC74: 0x7443, - 0xAC75: 0x7444, - 0xAC76: 0x7445, - 0xAC77: 0x7446, - 0xAC78: 0x7447, - 0xAC79: 0x7448, - 0xAC7A: 0x7449, - 0xAC7B: 0x744A, - 0xAC7C: 0x744B, - 0xAC7D: 0x744C, - 0xAC7E: 0x744D, - 0xAC80: 0x744E, - 0xAC81: 0x744F, - 0xAC82: 0x7450, - 0xAC83: 0x7451, - 0xAC84: 0x7452, - 0xAC85: 0x7453, - 0xAC86: 0x7454, - 0xAC87: 0x7456, - 0xAC88: 0x7458, - 0xAC89: 0x745D, - 0xAC8A: 0x7460, - 0xAC8B: 0x7461, - 0xAC8C: 0x7462, - 0xAC8D: 0x7463, - 0xAC8E: 0x7464, - 0xAC8F: 0x7465, - 0xAC90: 0x7466, - 0xAC91: 0x7467, - 0xAC92: 0x7468, - 0xAC93: 0x7469, - 0xAC94: 0x746A, - 0xAC95: 0x746B, - 0xAC96: 0x746C, - 0xAC97: 0x746E, - 0xAC98: 0x746F, - 0xAC99: 0x7471, - 0xAC9A: 0x7472, - 0xAC9B: 0x7473, - 0xAC9C: 0x7474, - 0xAC9D: 0x7475, - 0xAC9E: 0x7478, - 0xAC9F: 0x7479, - 0xACA0: 0x747A, - 0xACA1: 0xE0BC, - 0xACA2: 0xE0BD, - 0xACA3: 0xE0BE, - 0xACA4: 0xE0BF, - 0xACA5: 0xE0C0, - 0xACA6: 0xE0C1, - 0xACA7: 0xE0C2, - 0xACA8: 0xE0C3, - 0xACA9: 0xE0C4, - 0xACAA: 0xE0C5, - 0xACAB: 0xE0C6, - 0xACAC: 0xE0C7, - 0xACAD: 0xE0C8, - 0xACAE: 0xE0C9, - 0xACAF: 0xE0CA, - 0xACB0: 0xE0CB, - 0xACB1: 0xE0CC, - 0xACB2: 0xE0CD, - 0xACB3: 0xE0CE, - 0xACB4: 0xE0CF, - 0xACB5: 0xE0D0, - 0xACB6: 0xE0D1, - 0xACB7: 0xE0D2, - 0xACB8: 0xE0D3, - 0xACB9: 0xE0D4, - 0xACBA: 0xE0D5, - 0xACBB: 0xE0D6, - 0xACBC: 0xE0D7, - 0xACBD: 0xE0D8, - 0xACBE: 0xE0D9, - 0xACBF: 0xE0DA, - 0xACC0: 0xE0DB, - 0xACC1: 0xE0DC, - 0xACC2: 0xE0DD, - 0xACC3: 0xE0DE, - 0xACC4: 0xE0DF, - 0xACC5: 0xE0E0, - 0xACC6: 0xE0E1, - 0xACC7: 0xE0E2, - 0xACC8: 0xE0E3, - 0xACC9: 0xE0E4, - 0xACCA: 0xE0E5, - 0xACCB: 0xE0E6, - 0xACCC: 0xE0E7, - 0xACCD: 0xE0E8, - 0xACCE: 0xE0E9, - 0xACCF: 0xE0EA, - 0xACD0: 0xE0EB, - 0xACD1: 0xE0EC, - 0xACD2: 0xE0ED, - 0xACD3: 0xE0EE, - 0xACD4: 0xE0EF, - 0xACD5: 0xE0F0, - 0xACD6: 0xE0F1, - 0xACD7: 0xE0F2, - 0xACD8: 0xE0F3, - 0xACD9: 0xE0F4, - 0xACDA: 0xE0F5, - 0xACDB: 0xE0F6, - 0xACDC: 0xE0F7, - 0xACDD: 0xE0F8, - 0xACDE: 0xE0F9, - 0xACDF: 0xE0FA, - 0xACE0: 0xE0FB, - 0xACE1: 0xE0FC, - 0xACE2: 0xE0FD, - 0xACE3: 0xE0FE, - 0xACE4: 0xE0FF, - 0xACE5: 0xE100, - 0xACE6: 0xE101, - 0xACE7: 0xE102, - 0xACE8: 0xE103, - 0xACE9: 0xE104, - 0xACEA: 0xE105, - 0xACEB: 0xE106, - 0xACEC: 0xE107, - 0xACED: 0xE108, - 0xACEE: 0xE109, - 0xACEF: 0xE10A, - 0xACF0: 0xE10B, - 0xACF1: 0xE10C, - 0xACF2: 0xE10D, - 0xACF3: 0xE10E, - 0xACF4: 0xE10F, - 0xACF5: 0xE110, - 0xACF6: 0xE111, - 0xACF7: 0xE112, - 0xACF8: 0xE113, - 0xACF9: 0xE114, - 0xACFA: 0xE115, - 0xACFB: 0xE116, - 0xACFC: 0xE117, - 0xACFD: 0xE118, - 0xACFE: 0xE119, - 0xAD40: 0x747B, - 0xAD41: 0x747C, - 0xAD42: 0x747D, - 0xAD43: 0x747F, - 0xAD44: 0x7482, - 0xAD45: 0x7484, - 0xAD46: 0x7485, - 0xAD47: 0x7486, - 0xAD48: 0x7488, - 0xAD49: 0x7489, - 0xAD4A: 0x748A, - 0xAD4B: 0x748C, - 0xAD4C: 0x748D, - 0xAD4D: 0x748F, - 0xAD4E: 0x7491, - 0xAD4F: 0x7492, - 0xAD50: 0x7493, - 0xAD51: 0x7494, - 0xAD52: 0x7495, - 0xAD53: 0x7496, - 0xAD54: 0x7497, - 0xAD55: 0x7498, - 0xAD56: 0x7499, - 0xAD57: 0x749A, - 0xAD58: 0x749B, - 0xAD59: 0x749D, - 0xAD5A: 0x749F, - 0xAD5B: 0x74A0, - 0xAD5C: 0x74A1, - 0xAD5D: 0x74A2, - 0xAD5E: 0x74A3, - 0xAD5F: 0x74A4, - 0xAD60: 0x74A5, - 0xAD61: 0x74A6, - 0xAD62: 0x74AA, - 0xAD63: 0x74AB, - 0xAD64: 0x74AC, - 0xAD65: 0x74AD, - 0xAD66: 0x74AE, - 0xAD67: 0x74AF, - 0xAD68: 0x74B0, - 0xAD69: 0x74B1, - 0xAD6A: 0x74B2, - 0xAD6B: 0x74B3, - 0xAD6C: 0x74B4, - 0xAD6D: 0x74B5, - 0xAD6E: 0x74B6, - 0xAD6F: 0x74B7, - 0xAD70: 0x74B8, - 0xAD71: 0x74B9, - 0xAD72: 0x74BB, - 0xAD73: 0x74BC, - 0xAD74: 0x74BD, - 0xAD75: 0x74BE, - 0xAD76: 0x74BF, - 0xAD77: 0x74C0, - 0xAD78: 0x74C1, - 0xAD79: 0x74C2, - 0xAD7A: 0x74C3, - 0xAD7B: 0x74C4, - 0xAD7C: 0x74C5, - 0xAD7D: 0x74C6, - 0xAD7E: 0x74C7, - 0xAD80: 0x74C8, - 0xAD81: 0x74C9, - 0xAD82: 0x74CA, - 0xAD83: 0x74CB, - 0xAD84: 0x74CC, - 0xAD85: 0x74CD, - 0xAD86: 0x74CE, - 0xAD87: 0x74CF, - 0xAD88: 0x74D0, - 0xAD89: 0x74D1, - 0xAD8A: 0x74D3, - 0xAD8B: 0x74D4, - 0xAD8C: 0x74D5, - 0xAD8D: 0x74D6, - 0xAD8E: 0x74D7, - 0xAD8F: 0x74D8, - 0xAD90: 0x74D9, - 0xAD91: 0x74DA, - 0xAD92: 0x74DB, - 0xAD93: 0x74DD, - 0xAD94: 0x74DF, - 0xAD95: 0x74E1, - 0xAD96: 0x74E5, - 0xAD97: 0x74E7, - 0xAD98: 0x74E8, - 0xAD99: 0x74E9, - 0xAD9A: 0x74EA, - 0xAD9B: 0x74EB, - 0xAD9C: 0x74EC, - 0xAD9D: 0x74ED, - 0xAD9E: 0x74F0, - 0xAD9F: 0x74F1, - 0xADA0: 0x74F2, - 0xADA1: 0xE11A, - 0xADA2: 0xE11B, - 0xADA3: 0xE11C, - 0xADA4: 0xE11D, - 0xADA5: 0xE11E, - 0xADA6: 0xE11F, - 0xADA7: 0xE120, - 0xADA8: 0xE121, - 0xADA9: 0xE122, - 0xADAA: 0xE123, - 0xADAB: 0xE124, - 0xADAC: 0xE125, - 0xADAD: 0xE126, - 0xADAE: 0xE127, - 0xADAF: 0xE128, - 0xADB0: 0xE129, - 0xADB1: 0xE12A, - 0xADB2: 0xE12B, - 0xADB3: 0xE12C, - 0xADB4: 0xE12D, - 0xADB5: 0xE12E, - 0xADB6: 0xE12F, - 0xADB7: 0xE130, - 0xADB8: 0xE131, - 0xADB9: 0xE132, - 0xADBA: 0xE133, - 0xADBB: 0xE134, - 0xADBC: 0xE135, - 0xADBD: 0xE136, - 0xADBE: 0xE137, - 0xADBF: 0xE138, - 0xADC0: 0xE139, - 0xADC1: 0xE13A, - 0xADC2: 0xE13B, - 0xADC3: 0xE13C, - 0xADC4: 0xE13D, - 0xADC5: 0xE13E, - 0xADC6: 0xE13F, - 0xADC7: 0xE140, - 0xADC8: 0xE141, - 0xADC9: 0xE142, - 0xADCA: 0xE143, - 0xADCB: 0xE144, - 0xADCC: 0xE145, - 0xADCD: 0xE146, - 0xADCE: 0xE147, - 0xADCF: 0xE148, - 0xADD0: 0xE149, - 0xADD1: 0xE14A, - 0xADD2: 0xE14B, - 0xADD3: 0xE14C, - 0xADD4: 0xE14D, - 0xADD5: 0xE14E, - 0xADD6: 0xE14F, - 0xADD7: 0xE150, - 0xADD8: 0xE151, - 0xADD9: 0xE152, - 0xADDA: 0xE153, - 0xADDB: 0xE154, - 0xADDC: 0xE155, - 0xADDD: 0xE156, - 0xADDE: 0xE157, - 0xADDF: 0xE158, - 0xADE0: 0xE159, - 0xADE1: 0xE15A, - 0xADE2: 0xE15B, - 0xADE3: 0xE15C, - 0xADE4: 0xE15D, - 0xADE5: 0xE15E, - 0xADE6: 0xE15F, - 0xADE7: 0xE160, - 0xADE8: 0xE161, - 0xADE9: 0xE162, - 0xADEA: 0xE163, - 0xADEB: 0xE164, - 0xADEC: 0xE165, - 0xADED: 0xE166, - 0xADEE: 0xE167, - 0xADEF: 0xE168, - 0xADF0: 0xE169, - 0xADF1: 0xE16A, - 0xADF2: 0xE16B, - 0xADF3: 0xE16C, - 0xADF4: 0xE16D, - 0xADF5: 0xE16E, - 0xADF6: 0xE16F, - 0xADF7: 0xE170, - 0xADF8: 0xE171, - 0xADF9: 0xE172, - 0xADFA: 0xE173, - 0xADFB: 0xE174, - 0xADFC: 0xE175, - 0xADFD: 0xE176, - 0xADFE: 0xE177, - 0xAE40: 0x74F3, - 0xAE41: 0x74F5, - 0xAE42: 0x74F8, - 0xAE43: 0x74F9, - 0xAE44: 0x74FA, - 0xAE45: 0x74FB, - 0xAE46: 0x74FC, - 0xAE47: 0x74FD, - 0xAE48: 0x74FE, - 0xAE49: 0x7500, - 0xAE4A: 0x7501, - 0xAE4B: 0x7502, - 0xAE4C: 0x7503, - 0xAE4D: 0x7505, - 0xAE4E: 0x7506, - 0xAE4F: 0x7507, - 0xAE50: 0x7508, - 0xAE51: 0x7509, - 0xAE52: 0x750A, - 0xAE53: 0x750B, - 0xAE54: 0x750C, - 0xAE55: 0x750E, - 0xAE56: 0x7510, - 0xAE57: 0x7512, - 0xAE58: 0x7514, - 0xAE59: 0x7515, - 0xAE5A: 0x7516, - 0xAE5B: 0x7517, - 0xAE5C: 0x751B, - 0xAE5D: 0x751D, - 0xAE5E: 0x751E, - 0xAE5F: 0x7520, - 0xAE60: 0x7521, - 0xAE61: 0x7522, - 0xAE62: 0x7523, - 0xAE63: 0x7524, - 0xAE64: 0x7526, - 0xAE65: 0x7527, - 0xAE66: 0x752A, - 0xAE67: 0x752E, - 0xAE68: 0x7534, - 0xAE69: 0x7536, - 0xAE6A: 0x7539, - 0xAE6B: 0x753C, - 0xAE6C: 0x753D, - 0xAE6D: 0x753F, - 0xAE6E: 0x7541, - 0xAE6F: 0x7542, - 0xAE70: 0x7543, - 0xAE71: 0x7544, - 0xAE72: 0x7546, - 0xAE73: 0x7547, - 0xAE74: 0x7549, - 0xAE75: 0x754A, - 0xAE76: 0x754D, - 0xAE77: 0x7550, - 0xAE78: 0x7551, - 0xAE79: 0x7552, - 0xAE7A: 0x7553, - 0xAE7B: 0x7555, - 0xAE7C: 0x7556, - 0xAE7D: 0x7557, - 0xAE7E: 0x7558, - 0xAE80: 0x755D, - 0xAE81: 0x755E, - 0xAE82: 0x755F, - 0xAE83: 0x7560, - 0xAE84: 0x7561, - 0xAE85: 0x7562, - 0xAE86: 0x7563, - 0xAE87: 0x7564, - 0xAE88: 0x7567, - 0xAE89: 0x7568, - 0xAE8A: 0x7569, - 0xAE8B: 0x756B, - 0xAE8C: 0x756C, - 0xAE8D: 0x756D, - 0xAE8E: 0x756E, - 0xAE8F: 0x756F, - 0xAE90: 0x7570, - 0xAE91: 0x7571, - 0xAE92: 0x7573, - 0xAE93: 0x7575, - 0xAE94: 0x7576, - 0xAE95: 0x7577, - 0xAE96: 0x757A, - 0xAE97: 0x757B, - 0xAE98: 0x757C, - 0xAE99: 0x757D, - 0xAE9A: 0x757E, - 0xAE9B: 0x7580, - 0xAE9C: 0x7581, - 0xAE9D: 0x7582, - 0xAE9E: 0x7584, - 0xAE9F: 0x7585, - 0xAEA0: 0x7587, - 0xAEA1: 0xE178, - 0xAEA2: 0xE179, - 0xAEA3: 0xE17A, - 0xAEA4: 0xE17B, - 0xAEA5: 0xE17C, - 0xAEA6: 0xE17D, - 0xAEA7: 0xE17E, - 0xAEA8: 0xE17F, - 0xAEA9: 0xE180, - 0xAEAA: 0xE181, - 0xAEAB: 0xE182, - 0xAEAC: 0xE183, - 0xAEAD: 0xE184, - 0xAEAE: 0xE185, - 0xAEAF: 0xE186, - 0xAEB0: 0xE187, - 0xAEB1: 0xE188, - 0xAEB2: 0xE189, - 0xAEB3: 0xE18A, - 0xAEB4: 0xE18B, - 0xAEB5: 0xE18C, - 0xAEB6: 0xE18D, - 0xAEB7: 0xE18E, - 0xAEB8: 0xE18F, - 0xAEB9: 0xE190, - 0xAEBA: 0xE191, - 0xAEBB: 0xE192, - 0xAEBC: 0xE193, - 0xAEBD: 0xE194, - 0xAEBE: 0xE195, - 0xAEBF: 0xE196, - 0xAEC0: 0xE197, - 0xAEC1: 0xE198, - 0xAEC2: 0xE199, - 0xAEC3: 0xE19A, - 0xAEC4: 0xE19B, - 0xAEC5: 0xE19C, - 0xAEC6: 0xE19D, - 0xAEC7: 0xE19E, - 0xAEC8: 0xE19F, - 0xAEC9: 0xE1A0, - 0xAECA: 0xE1A1, - 0xAECB: 0xE1A2, - 0xAECC: 0xE1A3, - 0xAECD: 0xE1A4, - 0xAECE: 0xE1A5, - 0xAECF: 0xE1A6, - 0xAED0: 0xE1A7, - 0xAED1: 0xE1A8, - 0xAED2: 0xE1A9, - 0xAED3: 0xE1AA, - 0xAED4: 0xE1AB, - 0xAED5: 0xE1AC, - 0xAED6: 0xE1AD, - 0xAED7: 0xE1AE, - 0xAED8: 0xE1AF, - 0xAED9: 0xE1B0, - 0xAEDA: 0xE1B1, - 0xAEDB: 0xE1B2, - 0xAEDC: 0xE1B3, - 0xAEDD: 0xE1B4, - 0xAEDE: 0xE1B5, - 0xAEDF: 0xE1B6, - 0xAEE0: 0xE1B7, - 0xAEE1: 0xE1B8, - 0xAEE2: 0xE1B9, - 0xAEE3: 0xE1BA, - 0xAEE4: 0xE1BB, - 0xAEE5: 0xE1BC, - 0xAEE6: 0xE1BD, - 0xAEE7: 0xE1BE, - 0xAEE8: 0xE1BF, - 0xAEE9: 0xE1C0, - 0xAEEA: 0xE1C1, - 0xAEEB: 0xE1C2, - 0xAEEC: 0xE1C3, - 0xAEED: 0xE1C4, - 0xAEEE: 0xE1C5, - 0xAEEF: 0xE1C6, - 0xAEF0: 0xE1C7, - 0xAEF1: 0xE1C8, - 0xAEF2: 0xE1C9, - 0xAEF3: 0xE1CA, - 0xAEF4: 0xE1CB, - 0xAEF5: 0xE1CC, - 0xAEF6: 0xE1CD, - 0xAEF7: 0xE1CE, - 0xAEF8: 0xE1CF, - 0xAEF9: 0xE1D0, - 0xAEFA: 0xE1D1, - 0xAEFB: 0xE1D2, - 0xAEFC: 0xE1D3, - 0xAEFD: 0xE1D4, - 0xAEFE: 0xE1D5, - 0xAF40: 0x7588, - 0xAF41: 0x7589, - 0xAF42: 0x758A, - 0xAF43: 0x758C, - 0xAF44: 0x758D, - 0xAF45: 0x758E, - 0xAF46: 0x7590, - 0xAF47: 0x7593, - 0xAF48: 0x7595, - 0xAF49: 0x7598, - 0xAF4A: 0x759B, - 0xAF4B: 0x759C, - 0xAF4C: 0x759E, - 0xAF4D: 0x75A2, - 0xAF4E: 0x75A6, - 0xAF4F: 0x75A7, - 0xAF50: 0x75A8, - 0xAF51: 0x75A9, - 0xAF52: 0x75AA, - 0xAF53: 0x75AD, - 0xAF54: 0x75B6, - 0xAF55: 0x75B7, - 0xAF56: 0x75BA, - 0xAF57: 0x75BB, - 0xAF58: 0x75BF, - 0xAF59: 0x75C0, - 0xAF5A: 0x75C1, - 0xAF5B: 0x75C6, - 0xAF5C: 0x75CB, - 0xAF5D: 0x75CC, - 0xAF5E: 0x75CE, - 0xAF5F: 0x75CF, - 0xAF60: 0x75D0, - 0xAF61: 0x75D1, - 0xAF62: 0x75D3, - 0xAF63: 0x75D7, - 0xAF64: 0x75D9, - 0xAF65: 0x75DA, - 0xAF66: 0x75DC, - 0xAF67: 0x75DD, - 0xAF68: 0x75DF, - 0xAF69: 0x75E0, - 0xAF6A: 0x75E1, - 0xAF6B: 0x75E5, - 0xAF6C: 0x75E9, - 0xAF6D: 0x75EC, - 0xAF6E: 0x75ED, - 0xAF6F: 0x75EE, - 0xAF70: 0x75EF, - 0xAF71: 0x75F2, - 0xAF72: 0x75F3, - 0xAF73: 0x75F5, - 0xAF74: 0x75F6, - 0xAF75: 0x75F7, - 0xAF76: 0x75F8, - 0xAF77: 0x75FA, - 0xAF78: 0x75FB, - 0xAF79: 0x75FD, - 0xAF7A: 0x75FE, - 0xAF7B: 0x7602, - 0xAF7C: 0x7604, - 0xAF7D: 0x7606, - 0xAF7E: 0x7607, - 0xAF80: 0x7608, - 0xAF81: 0x7609, - 0xAF82: 0x760B, - 0xAF83: 0x760D, - 0xAF84: 0x760E, - 0xAF85: 0x760F, - 0xAF86: 0x7611, - 0xAF87: 0x7612, - 0xAF88: 0x7613, - 0xAF89: 0x7614, - 0xAF8A: 0x7616, - 0xAF8B: 0x761A, - 0xAF8C: 0x761C, - 0xAF8D: 0x761D, - 0xAF8E: 0x761E, - 0xAF8F: 0x7621, - 0xAF90: 0x7623, - 0xAF91: 0x7627, - 0xAF92: 0x7628, - 0xAF93: 0x762C, - 0xAF94: 0x762E, - 0xAF95: 0x762F, - 0xAF96: 0x7631, - 0xAF97: 0x7632, - 0xAF98: 0x7636, - 0xAF99: 0x7637, - 0xAF9A: 0x7639, - 0xAF9B: 0x763A, - 0xAF9C: 0x763B, - 0xAF9D: 0x763D, - 0xAF9E: 0x7641, - 0xAF9F: 0x7642, - 0xAFA0: 0x7644, - 0xAFA1: 0xE1D6, - 0xAFA2: 0xE1D7, - 0xAFA3: 0xE1D8, - 0xAFA4: 0xE1D9, - 0xAFA5: 0xE1DA, - 0xAFA6: 0xE1DB, - 0xAFA7: 0xE1DC, - 0xAFA8: 0xE1DD, - 0xAFA9: 0xE1DE, - 0xAFAA: 0xE1DF, - 0xAFAB: 0xE1E0, - 0xAFAC: 0xE1E1, - 0xAFAD: 0xE1E2, - 0xAFAE: 0xE1E3, - 0xAFAF: 0xE1E4, - 0xAFB0: 0xE1E5, - 0xAFB1: 0xE1E6, - 0xAFB2: 0xE1E7, - 0xAFB3: 0xE1E8, - 0xAFB4: 0xE1E9, - 0xAFB5: 0xE1EA, - 0xAFB6: 0xE1EB, - 0xAFB7: 0xE1EC, - 0xAFB8: 0xE1ED, - 0xAFB9: 0xE1EE, - 0xAFBA: 0xE1EF, - 0xAFBB: 0xE1F0, - 0xAFBC: 0xE1F1, - 0xAFBD: 0xE1F2, - 0xAFBE: 0xE1F3, - 0xAFBF: 0xE1F4, - 0xAFC0: 0xE1F5, - 0xAFC1: 0xE1F6, - 0xAFC2: 0xE1F7, - 0xAFC3: 0xE1F8, - 0xAFC4: 0xE1F9, - 0xAFC5: 0xE1FA, - 0xAFC6: 0xE1FB, - 0xAFC7: 0xE1FC, - 0xAFC8: 0xE1FD, - 0xAFC9: 0xE1FE, - 0xAFCA: 0xE1FF, - 0xAFCB: 0xE200, - 0xAFCC: 0xE201, - 0xAFCD: 0xE202, - 0xAFCE: 0xE203, - 0xAFCF: 0xE204, - 0xAFD0: 0xE205, - 0xAFD1: 0xE206, - 0xAFD2: 0xE207, - 0xAFD3: 0xE208, - 0xAFD4: 0xE209, - 0xAFD5: 0xE20A, - 0xAFD6: 0xE20B, - 0xAFD7: 0xE20C, - 0xAFD8: 0xE20D, - 0xAFD9: 0xE20E, - 0xAFDA: 0xE20F, - 0xAFDB: 0xE210, - 0xAFDC: 0xE211, - 0xAFDD: 0xE212, - 0xAFDE: 0xE213, - 0xAFDF: 0xE214, - 0xAFE0: 0xE215, - 0xAFE1: 0xE216, - 0xAFE2: 0xE217, - 0xAFE3: 0xE218, - 0xAFE4: 0xE219, - 0xAFE5: 0xE21A, - 0xAFE6: 0xE21B, - 0xAFE7: 0xE21C, - 0xAFE8: 0xE21D, - 0xAFE9: 0xE21E, - 0xAFEA: 0xE21F, - 0xAFEB: 0xE220, - 0xAFEC: 0xE221, - 0xAFED: 0xE222, - 0xAFEE: 0xE223, - 0xAFEF: 0xE224, - 0xAFF0: 0xE225, - 0xAFF1: 0xE226, - 0xAFF2: 0xE227, - 0xAFF3: 0xE228, - 0xAFF4: 0xE229, - 0xAFF5: 0xE22A, - 0xAFF6: 0xE22B, - 0xAFF7: 0xE22C, - 0xAFF8: 0xE22D, - 0xAFF9: 0xE22E, - 0xAFFA: 0xE22F, - 0xAFFB: 0xE230, - 0xAFFC: 0xE231, - 0xAFFD: 0xE232, - 0xAFFE: 0xE233, - 0xB040: 0x7645, - 0xB041: 0x7646, - 0xB042: 0x7647, - 0xB043: 0x7648, - 0xB044: 0x7649, - 0xB045: 0x764A, - 0xB046: 0x764B, - 0xB047: 0x764E, - 0xB048: 0x764F, - 0xB049: 0x7650, - 0xB04A: 0x7651, - 0xB04B: 0x7652, - 0xB04C: 0x7653, - 0xB04D: 0x7655, - 0xB04E: 0x7657, - 0xB04F: 0x7658, - 0xB050: 0x7659, - 0xB051: 0x765A, - 0xB052: 0x765B, - 0xB053: 0x765D, - 0xB054: 0x765F, - 0xB055: 0x7660, - 0xB056: 0x7661, - 0xB057: 0x7662, - 0xB058: 0x7664, - 0xB059: 0x7665, - 0xB05A: 0x7666, - 0xB05B: 0x7667, - 0xB05C: 0x7668, - 0xB05D: 0x7669, - 0xB05E: 0x766A, - 0xB05F: 0x766C, - 0xB060: 0x766D, - 0xB061: 0x766E, - 0xB062: 0x7670, - 0xB063: 0x7671, - 0xB064: 0x7672, - 0xB065: 0x7673, - 0xB066: 0x7674, - 0xB067: 0x7675, - 0xB068: 0x7676, - 0xB069: 0x7677, - 0xB06A: 0x7679, - 0xB06B: 0x767A, - 0xB06C: 0x767C, - 0xB06D: 0x767F, - 0xB06E: 0x7680, - 0xB06F: 0x7681, - 0xB070: 0x7683, - 0xB071: 0x7685, - 0xB072: 0x7689, - 0xB073: 0x768A, - 0xB074: 0x768C, - 0xB075: 0x768D, - 0xB076: 0x768F, - 0xB077: 0x7690, - 0xB078: 0x7692, - 0xB079: 0x7694, - 0xB07A: 0x7695, - 0xB07B: 0x7697, - 0xB07C: 0x7698, - 0xB07D: 0x769A, - 0xB07E: 0x769B, - 0xB080: 0x769C, - 0xB081: 0x769D, - 0xB082: 0x769E, - 0xB083: 0x769F, - 0xB084: 0x76A0, - 0xB085: 0x76A1, - 0xB086: 0x76A2, - 0xB087: 0x76A3, - 0xB088: 0x76A5, - 0xB089: 0x76A6, - 0xB08A: 0x76A7, - 0xB08B: 0x76A8, - 0xB08C: 0x76A9, - 0xB08D: 0x76AA, - 0xB08E: 0x76AB, - 0xB08F: 0x76AC, - 0xB090: 0x76AD, - 0xB091: 0x76AF, - 0xB092: 0x76B0, - 0xB093: 0x76B3, - 0xB094: 0x76B5, - 0xB095: 0x76B6, - 0xB096: 0x76B7, - 0xB097: 0x76B8, - 0xB098: 0x76B9, - 0xB099: 0x76BA, - 0xB09A: 0x76BB, - 0xB09B: 0x76BC, - 0xB09C: 0x76BD, - 0xB09D: 0x76BE, - 0xB09E: 0x76C0, - 0xB09F: 0x76C1, - 0xB0A0: 0x76C3, - 0xB0A1: 0x554A, - 0xB0A2: 0x963F, - 0xB0A3: 0x57C3, - 0xB0A4: 0x6328, - 0xB0A5: 0x54CE, - 0xB0A6: 0x5509, - 0xB0A7: 0x54C0, - 0xB0A8: 0x7691, - 0xB0A9: 0x764C, - 0xB0AA: 0x853C, - 0xB0AB: 0x77EE, - 0xB0AC: 0x827E, - 0xB0AD: 0x788D, - 0xB0AE: 0x7231, - 0xB0AF: 0x9698, - 0xB0B0: 0x978D, - 0xB0B1: 0x6C28, - 0xB0B2: 0x5B89, - 0xB0B3: 0x4FFA, - 0xB0B4: 0x6309, - 0xB0B5: 0x6697, - 0xB0B6: 0x5CB8, - 0xB0B7: 0x80FA, - 0xB0B8: 0x6848, - 0xB0B9: 0x80AE, - 0xB0BA: 0x6602, - 0xB0BB: 0x76CE, - 0xB0BC: 0x51F9, - 0xB0BD: 0x6556, - 0xB0BE: 0x71AC, - 0xB0BF: 0x7FF1, - 0xB0C0: 0x8884, - 0xB0C1: 0x50B2, - 0xB0C2: 0x5965, - 0xB0C3: 0x61CA, - 0xB0C4: 0x6FB3, - 0xB0C5: 0x82AD, - 0xB0C6: 0x634C, - 0xB0C7: 0x6252, - 0xB0C8: 0x53ED, - 0xB0C9: 0x5427, - 0xB0CA: 0x7B06, - 0xB0CB: 0x516B, - 0xB0CC: 0x75A4, - 0xB0CD: 0x5DF4, - 0xB0CE: 0x62D4, - 0xB0CF: 0x8DCB, - 0xB0D0: 0x9776, - 0xB0D1: 0x628A, - 0xB0D2: 0x8019, - 0xB0D3: 0x575D, - 0xB0D4: 0x9738, - 0xB0D5: 0x7F62, - 0xB0D6: 0x7238, - 0xB0D7: 0x767D, - 0xB0D8: 0x67CF, - 0xB0D9: 0x767E, - 0xB0DA: 0x6446, - 0xB0DB: 0x4F70, - 0xB0DC: 0x8D25, - 0xB0DD: 0x62DC, - 0xB0DE: 0x7A17, - 0xB0DF: 0x6591, - 0xB0E0: 0x73ED, - 0xB0E1: 0x642C, - 0xB0E2: 0x6273, - 0xB0E3: 0x822C, - 0xB0E4: 0x9881, - 0xB0E5: 0x677F, - 0xB0E6: 0x7248, - 0xB0E7: 0x626E, - 0xB0E8: 0x62CC, - 0xB0E9: 0x4F34, - 0xB0EA: 0x74E3, - 0xB0EB: 0x534A, - 0xB0EC: 0x529E, - 0xB0ED: 0x7ECA, - 0xB0EE: 0x90A6, - 0xB0EF: 0x5E2E, - 0xB0F0: 0x6886, - 0xB0F1: 0x699C, - 0xB0F2: 0x8180, - 0xB0F3: 0x7ED1, - 0xB0F4: 0x68D2, - 0xB0F5: 0x78C5, - 0xB0F6: 0x868C, - 0xB0F7: 0x9551, - 0xB0F8: 0x508D, - 0xB0F9: 0x8C24, - 0xB0FA: 0x82DE, - 0xB0FB: 0x80DE, - 0xB0FC: 0x5305, - 0xB0FD: 0x8912, - 0xB0FE: 0x5265, - 0xB140: 0x76C4, - 0xB141: 0x76C7, - 0xB142: 0x76C9, - 0xB143: 0x76CB, - 0xB144: 0x76CC, - 0xB145: 0x76D3, - 0xB146: 0x76D5, - 0xB147: 0x76D9, - 0xB148: 0x76DA, - 0xB149: 0x76DC, - 0xB14A: 0x76DD, - 0xB14B: 0x76DE, - 0xB14C: 0x76E0, - 0xB14D: 0x76E1, - 0xB14E: 0x76E2, - 0xB14F: 0x76E3, - 0xB150: 0x76E4, - 0xB151: 0x76E6, - 0xB152: 0x76E7, - 0xB153: 0x76E8, - 0xB154: 0x76E9, - 0xB155: 0x76EA, - 0xB156: 0x76EB, - 0xB157: 0x76EC, - 0xB158: 0x76ED, - 0xB159: 0x76F0, - 0xB15A: 0x76F3, - 0xB15B: 0x76F5, - 0xB15C: 0x76F6, - 0xB15D: 0x76F7, - 0xB15E: 0x76FA, - 0xB15F: 0x76FB, - 0xB160: 0x76FD, - 0xB161: 0x76FF, - 0xB162: 0x7700, - 0xB163: 0x7702, - 0xB164: 0x7703, - 0xB165: 0x7705, - 0xB166: 0x7706, - 0xB167: 0x770A, - 0xB168: 0x770C, - 0xB169: 0x770E, - 0xB16A: 0x770F, - 0xB16B: 0x7710, - 0xB16C: 0x7711, - 0xB16D: 0x7712, - 0xB16E: 0x7713, - 0xB16F: 0x7714, - 0xB170: 0x7715, - 0xB171: 0x7716, - 0xB172: 0x7717, - 0xB173: 0x7718, - 0xB174: 0x771B, - 0xB175: 0x771C, - 0xB176: 0x771D, - 0xB177: 0x771E, - 0xB178: 0x7721, - 0xB179: 0x7723, - 0xB17A: 0x7724, - 0xB17B: 0x7725, - 0xB17C: 0x7727, - 0xB17D: 0x772A, - 0xB17E: 0x772B, - 0xB180: 0x772C, - 0xB181: 0x772E, - 0xB182: 0x7730, - 0xB183: 0x7731, - 0xB184: 0x7732, - 0xB185: 0x7733, - 0xB186: 0x7734, - 0xB187: 0x7739, - 0xB188: 0x773B, - 0xB189: 0x773D, - 0xB18A: 0x773E, - 0xB18B: 0x773F, - 0xB18C: 0x7742, - 0xB18D: 0x7744, - 0xB18E: 0x7745, - 0xB18F: 0x7746, - 0xB190: 0x7748, - 0xB191: 0x7749, - 0xB192: 0x774A, - 0xB193: 0x774B, - 0xB194: 0x774C, - 0xB195: 0x774D, - 0xB196: 0x774E, - 0xB197: 0x774F, - 0xB198: 0x7752, - 0xB199: 0x7753, - 0xB19A: 0x7754, - 0xB19B: 0x7755, - 0xB19C: 0x7756, - 0xB19D: 0x7757, - 0xB19E: 0x7758, - 0xB19F: 0x7759, - 0xB1A0: 0x775C, - 0xB1A1: 0x8584, - 0xB1A2: 0x96F9, - 0xB1A3: 0x4FDD, - 0xB1A4: 0x5821, - 0xB1A5: 0x9971, - 0xB1A6: 0x5B9D, - 0xB1A7: 0x62B1, - 0xB1A8: 0x62A5, - 0xB1A9: 0x66B4, - 0xB1AA: 0x8C79, - 0xB1AB: 0x9C8D, - 0xB1AC: 0x7206, - 0xB1AD: 0x676F, - 0xB1AE: 0x7891, - 0xB1AF: 0x60B2, - 0xB1B0: 0x5351, - 0xB1B1: 0x5317, - 0xB1B2: 0x8F88, - 0xB1B3: 0x80CC, - 0xB1B4: 0x8D1D, - 0xB1B5: 0x94A1, - 0xB1B6: 0x500D, - 0xB1B7: 0x72C8, - 0xB1B8: 0x5907, - 0xB1B9: 0x60EB, - 0xB1BA: 0x7119, - 0xB1BB: 0x88AB, - 0xB1BC: 0x5954, - 0xB1BD: 0x82EF, - 0xB1BE: 0x672C, - 0xB1BF: 0x7B28, - 0xB1C0: 0x5D29, - 0xB1C1: 0x7EF7, - 0xB1C2: 0x752D, - 0xB1C3: 0x6CF5, - 0xB1C4: 0x8E66, - 0xB1C5: 0x8FF8, - 0xB1C6: 0x903C, - 0xB1C7: 0x9F3B, - 0xB1C8: 0x6BD4, - 0xB1C9: 0x9119, - 0xB1CA: 0x7B14, - 0xB1CB: 0x5F7C, - 0xB1CC: 0x78A7, - 0xB1CD: 0x84D6, - 0xB1CE: 0x853D, - 0xB1CF: 0x6BD5, - 0xB1D0: 0x6BD9, - 0xB1D1: 0x6BD6, - 0xB1D2: 0x5E01, - 0xB1D3: 0x5E87, - 0xB1D4: 0x75F9, - 0xB1D5: 0x95ED, - 0xB1D6: 0x655D, - 0xB1D7: 0x5F0A, - 0xB1D8: 0x5FC5, - 0xB1D9: 0x8F9F, - 0xB1DA: 0x58C1, - 0xB1DB: 0x81C2, - 0xB1DC: 0x907F, - 0xB1DD: 0x965B, - 0xB1DE: 0x97AD, - 0xB1DF: 0x8FB9, - 0xB1E0: 0x7F16, - 0xB1E1: 0x8D2C, - 0xB1E2: 0x6241, - 0xB1E3: 0x4FBF, - 0xB1E4: 0x53D8, - 0xB1E5: 0x535E, - 0xB1E6: 0x8FA8, - 0xB1E7: 0x8FA9, - 0xB1E8: 0x8FAB, - 0xB1E9: 0x904D, - 0xB1EA: 0x6807, - 0xB1EB: 0x5F6A, - 0xB1EC: 0x8198, - 0xB1ED: 0x8868, - 0xB1EE: 0x9CD6, - 0xB1EF: 0x618B, - 0xB1F0: 0x522B, - 0xB1F1: 0x762A, - 0xB1F2: 0x5F6C, - 0xB1F3: 0x658C, - 0xB1F4: 0x6FD2, - 0xB1F5: 0x6EE8, - 0xB1F6: 0x5BBE, - 0xB1F7: 0x6448, - 0xB1F8: 0x5175, - 0xB1F9: 0x51B0, - 0xB1FA: 0x67C4, - 0xB1FB: 0x4E19, - 0xB1FC: 0x79C9, - 0xB1FD: 0x997C, - 0xB1FE: 0x70B3, - 0xB240: 0x775D, - 0xB241: 0x775E, - 0xB242: 0x775F, - 0xB243: 0x7760, - 0xB244: 0x7764, - 0xB245: 0x7767, - 0xB246: 0x7769, - 0xB247: 0x776A, - 0xB248: 0x776D, - 0xB249: 0x776E, - 0xB24A: 0x776F, - 0xB24B: 0x7770, - 0xB24C: 0x7771, - 0xB24D: 0x7772, - 0xB24E: 0x7773, - 0xB24F: 0x7774, - 0xB250: 0x7775, - 0xB251: 0x7776, - 0xB252: 0x7777, - 0xB253: 0x7778, - 0xB254: 0x777A, - 0xB255: 0x777B, - 0xB256: 0x777C, - 0xB257: 0x7781, - 0xB258: 0x7782, - 0xB259: 0x7783, - 0xB25A: 0x7786, - 0xB25B: 0x7787, - 0xB25C: 0x7788, - 0xB25D: 0x7789, - 0xB25E: 0x778A, - 0xB25F: 0x778B, - 0xB260: 0x778F, - 0xB261: 0x7790, - 0xB262: 0x7793, - 0xB263: 0x7794, - 0xB264: 0x7795, - 0xB265: 0x7796, - 0xB266: 0x7797, - 0xB267: 0x7798, - 0xB268: 0x7799, - 0xB269: 0x779A, - 0xB26A: 0x779B, - 0xB26B: 0x779C, - 0xB26C: 0x779D, - 0xB26D: 0x779E, - 0xB26E: 0x77A1, - 0xB26F: 0x77A3, - 0xB270: 0x77A4, - 0xB271: 0x77A6, - 0xB272: 0x77A8, - 0xB273: 0x77AB, - 0xB274: 0x77AD, - 0xB275: 0x77AE, - 0xB276: 0x77AF, - 0xB277: 0x77B1, - 0xB278: 0x77B2, - 0xB279: 0x77B4, - 0xB27A: 0x77B6, - 0xB27B: 0x77B7, - 0xB27C: 0x77B8, - 0xB27D: 0x77B9, - 0xB27E: 0x77BA, - 0xB280: 0x77BC, - 0xB281: 0x77BE, - 0xB282: 0x77C0, - 0xB283: 0x77C1, - 0xB284: 0x77C2, - 0xB285: 0x77C3, - 0xB286: 0x77C4, - 0xB287: 0x77C5, - 0xB288: 0x77C6, - 0xB289: 0x77C7, - 0xB28A: 0x77C8, - 0xB28B: 0x77C9, - 0xB28C: 0x77CA, - 0xB28D: 0x77CB, - 0xB28E: 0x77CC, - 0xB28F: 0x77CE, - 0xB290: 0x77CF, - 0xB291: 0x77D0, - 0xB292: 0x77D1, - 0xB293: 0x77D2, - 0xB294: 0x77D3, - 0xB295: 0x77D4, - 0xB296: 0x77D5, - 0xB297: 0x77D6, - 0xB298: 0x77D8, - 0xB299: 0x77D9, - 0xB29A: 0x77DA, - 0xB29B: 0x77DD, - 0xB29C: 0x77DE, - 0xB29D: 0x77DF, - 0xB29E: 0x77E0, - 0xB29F: 0x77E1, - 0xB2A0: 0x77E4, - 0xB2A1: 0x75C5, - 0xB2A2: 0x5E76, - 0xB2A3: 0x73BB, - 0xB2A4: 0x83E0, - 0xB2A5: 0x64AD, - 0xB2A6: 0x62E8, - 0xB2A7: 0x94B5, - 0xB2A8: 0x6CE2, - 0xB2A9: 0x535A, - 0xB2AA: 0x52C3, - 0xB2AB: 0x640F, - 0xB2AC: 0x94C2, - 0xB2AD: 0x7B94, - 0xB2AE: 0x4F2F, - 0xB2AF: 0x5E1B, - 0xB2B0: 0x8236, - 0xB2B1: 0x8116, - 0xB2B2: 0x818A, - 0xB2B3: 0x6E24, - 0xB2B4: 0x6CCA, - 0xB2B5: 0x9A73, - 0xB2B6: 0x6355, - 0xB2B7: 0x535C, - 0xB2B8: 0x54FA, - 0xB2B9: 0x8865, - 0xB2BA: 0x57E0, - 0xB2BB: 0x4E0D, - 0xB2BC: 0x5E03, - 0xB2BD: 0x6B65, - 0xB2BE: 0x7C3F, - 0xB2BF: 0x90E8, - 0xB2C0: 0x6016, - 0xB2C1: 0x64E6, - 0xB2C2: 0x731C, - 0xB2C3: 0x88C1, - 0xB2C4: 0x6750, - 0xB2C5: 0x624D, - 0xB2C6: 0x8D22, - 0xB2C7: 0x776C, - 0xB2C8: 0x8E29, - 0xB2C9: 0x91C7, - 0xB2CA: 0x5F69, - 0xB2CB: 0x83DC, - 0xB2CC: 0x8521, - 0xB2CD: 0x9910, - 0xB2CE: 0x53C2, - 0xB2CF: 0x8695, - 0xB2D0: 0x6B8B, - 0xB2D1: 0x60ED, - 0xB2D2: 0x60E8, - 0xB2D3: 0x707F, - 0xB2D4: 0x82CD, - 0xB2D5: 0x8231, - 0xB2D6: 0x4ED3, - 0xB2D7: 0x6CA7, - 0xB2D8: 0x85CF, - 0xB2D9: 0x64CD, - 0xB2DA: 0x7CD9, - 0xB2DB: 0x69FD, - 0xB2DC: 0x66F9, - 0xB2DD: 0x8349, - 0xB2DE: 0x5395, - 0xB2DF: 0x7B56, - 0xB2E0: 0x4FA7, - 0xB2E1: 0x518C, - 0xB2E2: 0x6D4B, - 0xB2E3: 0x5C42, - 0xB2E4: 0x8E6D, - 0xB2E5: 0x63D2, - 0xB2E6: 0x53C9, - 0xB2E7: 0x832C, - 0xB2E8: 0x8336, - 0xB2E9: 0x67E5, - 0xB2EA: 0x78B4, - 0xB2EB: 0x643D, - 0xB2EC: 0x5BDF, - 0xB2ED: 0x5C94, - 0xB2EE: 0x5DEE, - 0xB2EF: 0x8BE7, - 0xB2F0: 0x62C6, - 0xB2F1: 0x67F4, - 0xB2F2: 0x8C7A, - 0xB2F3: 0x6400, - 0xB2F4: 0x63BA, - 0xB2F5: 0x8749, - 0xB2F6: 0x998B, - 0xB2F7: 0x8C17, - 0xB2F8: 0x7F20, - 0xB2F9: 0x94F2, - 0xB2FA: 0x4EA7, - 0xB2FB: 0x9610, - 0xB2FC: 0x98A4, - 0xB2FD: 0x660C, - 0xB2FE: 0x7316, - 0xB340: 0x77E6, - 0xB341: 0x77E8, - 0xB342: 0x77EA, - 0xB343: 0x77EF, - 0xB344: 0x77F0, - 0xB345: 0x77F1, - 0xB346: 0x77F2, - 0xB347: 0x77F4, - 0xB348: 0x77F5, - 0xB349: 0x77F7, - 0xB34A: 0x77F9, - 0xB34B: 0x77FA, - 0xB34C: 0x77FB, - 0xB34D: 0x77FC, - 0xB34E: 0x7803, - 0xB34F: 0x7804, - 0xB350: 0x7805, - 0xB351: 0x7806, - 0xB352: 0x7807, - 0xB353: 0x7808, - 0xB354: 0x780A, - 0xB355: 0x780B, - 0xB356: 0x780E, - 0xB357: 0x780F, - 0xB358: 0x7810, - 0xB359: 0x7813, - 0xB35A: 0x7815, - 0xB35B: 0x7819, - 0xB35C: 0x781B, - 0xB35D: 0x781E, - 0xB35E: 0x7820, - 0xB35F: 0x7821, - 0xB360: 0x7822, - 0xB361: 0x7824, - 0xB362: 0x7828, - 0xB363: 0x782A, - 0xB364: 0x782B, - 0xB365: 0x782E, - 0xB366: 0x782F, - 0xB367: 0x7831, - 0xB368: 0x7832, - 0xB369: 0x7833, - 0xB36A: 0x7835, - 0xB36B: 0x7836, - 0xB36C: 0x783D, - 0xB36D: 0x783F, - 0xB36E: 0x7841, - 0xB36F: 0x7842, - 0xB370: 0x7843, - 0xB371: 0x7844, - 0xB372: 0x7846, - 0xB373: 0x7848, - 0xB374: 0x7849, - 0xB375: 0x784A, - 0xB376: 0x784B, - 0xB377: 0x784D, - 0xB378: 0x784F, - 0xB379: 0x7851, - 0xB37A: 0x7853, - 0xB37B: 0x7854, - 0xB37C: 0x7858, - 0xB37D: 0x7859, - 0xB37E: 0x785A, - 0xB380: 0x785B, - 0xB381: 0x785C, - 0xB382: 0x785E, - 0xB383: 0x785F, - 0xB384: 0x7860, - 0xB385: 0x7861, - 0xB386: 0x7862, - 0xB387: 0x7863, - 0xB388: 0x7864, - 0xB389: 0x7865, - 0xB38A: 0x7866, - 0xB38B: 0x7867, - 0xB38C: 0x7868, - 0xB38D: 0x7869, - 0xB38E: 0x786F, - 0xB38F: 0x7870, - 0xB390: 0x7871, - 0xB391: 0x7872, - 0xB392: 0x7873, - 0xB393: 0x7874, - 0xB394: 0x7875, - 0xB395: 0x7876, - 0xB396: 0x7878, - 0xB397: 0x7879, - 0xB398: 0x787A, - 0xB399: 0x787B, - 0xB39A: 0x787D, - 0xB39B: 0x787E, - 0xB39C: 0x787F, - 0xB39D: 0x7880, - 0xB39E: 0x7881, - 0xB39F: 0x7882, - 0xB3A0: 0x7883, - 0xB3A1: 0x573A, - 0xB3A2: 0x5C1D, - 0xB3A3: 0x5E38, - 0xB3A4: 0x957F, - 0xB3A5: 0x507F, - 0xB3A6: 0x80A0, - 0xB3A7: 0x5382, - 0xB3A8: 0x655E, - 0xB3A9: 0x7545, - 0xB3AA: 0x5531, - 0xB3AB: 0x5021, - 0xB3AC: 0x8D85, - 0xB3AD: 0x6284, - 0xB3AE: 0x949E, - 0xB3AF: 0x671D, - 0xB3B0: 0x5632, - 0xB3B1: 0x6F6E, - 0xB3B2: 0x5DE2, - 0xB3B3: 0x5435, - 0xB3B4: 0x7092, - 0xB3B5: 0x8F66, - 0xB3B6: 0x626F, - 0xB3B7: 0x64A4, - 0xB3B8: 0x63A3, - 0xB3B9: 0x5F7B, - 0xB3BA: 0x6F88, - 0xB3BB: 0x90F4, - 0xB3BC: 0x81E3, - 0xB3BD: 0x8FB0, - 0xB3BE: 0x5C18, - 0xB3BF: 0x6668, - 0xB3C0: 0x5FF1, - 0xB3C1: 0x6C89, - 0xB3C2: 0x9648, - 0xB3C3: 0x8D81, - 0xB3C4: 0x886C, - 0xB3C5: 0x6491, - 0xB3C6: 0x79F0, - 0xB3C7: 0x57CE, - 0xB3C8: 0x6A59, - 0xB3C9: 0x6210, - 0xB3CA: 0x5448, - 0xB3CB: 0x4E58, - 0xB3CC: 0x7A0B, - 0xB3CD: 0x60E9, - 0xB3CE: 0x6F84, - 0xB3CF: 0x8BDA, - 0xB3D0: 0x627F, - 0xB3D1: 0x901E, - 0xB3D2: 0x9A8B, - 0xB3D3: 0x79E4, - 0xB3D4: 0x5403, - 0xB3D5: 0x75F4, - 0xB3D6: 0x6301, - 0xB3D7: 0x5319, - 0xB3D8: 0x6C60, - 0xB3D9: 0x8FDF, - 0xB3DA: 0x5F1B, - 0xB3DB: 0x9A70, - 0xB3DC: 0x803B, - 0xB3DD: 0x9F7F, - 0xB3DE: 0x4F88, - 0xB3DF: 0x5C3A, - 0xB3E0: 0x8D64, - 0xB3E1: 0x7FC5, - 0xB3E2: 0x65A5, - 0xB3E3: 0x70BD, - 0xB3E4: 0x5145, - 0xB3E5: 0x51B2, - 0xB3E6: 0x866B, - 0xB3E7: 0x5D07, - 0xB3E8: 0x5BA0, - 0xB3E9: 0x62BD, - 0xB3EA: 0x916C, - 0xB3EB: 0x7574, - 0xB3EC: 0x8E0C, - 0xB3ED: 0x7A20, - 0xB3EE: 0x6101, - 0xB3EF: 0x7B79, - 0xB3F0: 0x4EC7, - 0xB3F1: 0x7EF8, - 0xB3F2: 0x7785, - 0xB3F3: 0x4E11, - 0xB3F4: 0x81ED, - 0xB3F5: 0x521D, - 0xB3F6: 0x51FA, - 0xB3F7: 0x6A71, - 0xB3F8: 0x53A8, - 0xB3F9: 0x8E87, - 0xB3FA: 0x9504, - 0xB3FB: 0x96CF, - 0xB3FC: 0x6EC1, - 0xB3FD: 0x9664, - 0xB3FE: 0x695A, - 0xB440: 0x7884, - 0xB441: 0x7885, - 0xB442: 0x7886, - 0xB443: 0x7888, - 0xB444: 0x788A, - 0xB445: 0x788B, - 0xB446: 0x788F, - 0xB447: 0x7890, - 0xB448: 0x7892, - 0xB449: 0x7894, - 0xB44A: 0x7895, - 0xB44B: 0x7896, - 0xB44C: 0x7899, - 0xB44D: 0x789D, - 0xB44E: 0x789E, - 0xB44F: 0x78A0, - 0xB450: 0x78A2, - 0xB451: 0x78A4, - 0xB452: 0x78A6, - 0xB453: 0x78A8, - 0xB454: 0x78A9, - 0xB455: 0x78AA, - 0xB456: 0x78AB, - 0xB457: 0x78AC, - 0xB458: 0x78AD, - 0xB459: 0x78AE, - 0xB45A: 0x78AF, - 0xB45B: 0x78B5, - 0xB45C: 0x78B6, - 0xB45D: 0x78B7, - 0xB45E: 0x78B8, - 0xB45F: 0x78BA, - 0xB460: 0x78BB, - 0xB461: 0x78BC, - 0xB462: 0x78BD, - 0xB463: 0x78BF, - 0xB464: 0x78C0, - 0xB465: 0x78C2, - 0xB466: 0x78C3, - 0xB467: 0x78C4, - 0xB468: 0x78C6, - 0xB469: 0x78C7, - 0xB46A: 0x78C8, - 0xB46B: 0x78CC, - 0xB46C: 0x78CD, - 0xB46D: 0x78CE, - 0xB46E: 0x78CF, - 0xB46F: 0x78D1, - 0xB470: 0x78D2, - 0xB471: 0x78D3, - 0xB472: 0x78D6, - 0xB473: 0x78D7, - 0xB474: 0x78D8, - 0xB475: 0x78DA, - 0xB476: 0x78DB, - 0xB477: 0x78DC, - 0xB478: 0x78DD, - 0xB479: 0x78DE, - 0xB47A: 0x78DF, - 0xB47B: 0x78E0, - 0xB47C: 0x78E1, - 0xB47D: 0x78E2, - 0xB47E: 0x78E3, - 0xB480: 0x78E4, - 0xB481: 0x78E5, - 0xB482: 0x78E6, - 0xB483: 0x78E7, - 0xB484: 0x78E9, - 0xB485: 0x78EA, - 0xB486: 0x78EB, - 0xB487: 0x78ED, - 0xB488: 0x78EE, - 0xB489: 0x78EF, - 0xB48A: 0x78F0, - 0xB48B: 0x78F1, - 0xB48C: 0x78F3, - 0xB48D: 0x78F5, - 0xB48E: 0x78F6, - 0xB48F: 0x78F8, - 0xB490: 0x78F9, - 0xB491: 0x78FB, - 0xB492: 0x78FC, - 0xB493: 0x78FD, - 0xB494: 0x78FE, - 0xB495: 0x78FF, - 0xB496: 0x7900, - 0xB497: 0x7902, - 0xB498: 0x7903, - 0xB499: 0x7904, - 0xB49A: 0x7906, - 0xB49B: 0x7907, - 0xB49C: 0x7908, - 0xB49D: 0x7909, - 0xB49E: 0x790A, - 0xB49F: 0x790B, - 0xB4A0: 0x790C, - 0xB4A1: 0x7840, - 0xB4A2: 0x50A8, - 0xB4A3: 0x77D7, - 0xB4A4: 0x6410, - 0xB4A5: 0x89E6, - 0xB4A6: 0x5904, - 0xB4A7: 0x63E3, - 0xB4A8: 0x5DDD, - 0xB4A9: 0x7A7F, - 0xB4AA: 0x693D, - 0xB4AB: 0x4F20, - 0xB4AC: 0x8239, - 0xB4AD: 0x5598, - 0xB4AE: 0x4E32, - 0xB4AF: 0x75AE, - 0xB4B0: 0x7A97, - 0xB4B1: 0x5E62, - 0xB4B2: 0x5E8A, - 0xB4B3: 0x95EF, - 0xB4B4: 0x521B, - 0xB4B5: 0x5439, - 0xB4B6: 0x708A, - 0xB4B7: 0x6376, - 0xB4B8: 0x9524, - 0xB4B9: 0x5782, - 0xB4BA: 0x6625, - 0xB4BB: 0x693F, - 0xB4BC: 0x9187, - 0xB4BD: 0x5507, - 0xB4BE: 0x6DF3, - 0xB4BF: 0x7EAF, - 0xB4C0: 0x8822, - 0xB4C1: 0x6233, - 0xB4C2: 0x7EF0, - 0xB4C3: 0x75B5, - 0xB4C4: 0x8328, - 0xB4C5: 0x78C1, - 0xB4C6: 0x96CC, - 0xB4C7: 0x8F9E, - 0xB4C8: 0x6148, - 0xB4C9: 0x74F7, - 0xB4CA: 0x8BCD, - 0xB4CB: 0x6B64, - 0xB4CC: 0x523A, - 0xB4CD: 0x8D50, - 0xB4CE: 0x6B21, - 0xB4CF: 0x806A, - 0xB4D0: 0x8471, - 0xB4D1: 0x56F1, - 0xB4D2: 0x5306, - 0xB4D3: 0x4ECE, - 0xB4D4: 0x4E1B, - 0xB4D5: 0x51D1, - 0xB4D6: 0x7C97, - 0xB4D7: 0x918B, - 0xB4D8: 0x7C07, - 0xB4D9: 0x4FC3, - 0xB4DA: 0x8E7F, - 0xB4DB: 0x7BE1, - 0xB4DC: 0x7A9C, - 0xB4DD: 0x6467, - 0xB4DE: 0x5D14, - 0xB4DF: 0x50AC, - 0xB4E0: 0x8106, - 0xB4E1: 0x7601, - 0xB4E2: 0x7CB9, - 0xB4E3: 0x6DEC, - 0xB4E4: 0x7FE0, - 0xB4E5: 0x6751, - 0xB4E6: 0x5B58, - 0xB4E7: 0x5BF8, - 0xB4E8: 0x78CB, - 0xB4E9: 0x64AE, - 0xB4EA: 0x6413, - 0xB4EB: 0x63AA, - 0xB4EC: 0x632B, - 0xB4ED: 0x9519, - 0xB4EE: 0x642D, - 0xB4EF: 0x8FBE, - 0xB4F0: 0x7B54, - 0xB4F1: 0x7629, - 0xB4F2: 0x6253, - 0xB4F3: 0x5927, - 0xB4F4: 0x5446, - 0xB4F5: 0x6B79, - 0xB4F6: 0x50A3, - 0xB4F7: 0x6234, - 0xB4F8: 0x5E26, - 0xB4F9: 0x6B86, - 0xB4FA: 0x4EE3, - 0xB4FB: 0x8D37, - 0xB4FC: 0x888B, - 0xB4FD: 0x5F85, - 0xB4FE: 0x902E, - 0xB540: 0x790D, - 0xB541: 0x790E, - 0xB542: 0x790F, - 0xB543: 0x7910, - 0xB544: 0x7911, - 0xB545: 0x7912, - 0xB546: 0x7914, - 0xB547: 0x7915, - 0xB548: 0x7916, - 0xB549: 0x7917, - 0xB54A: 0x7918, - 0xB54B: 0x7919, - 0xB54C: 0x791A, - 0xB54D: 0x791B, - 0xB54E: 0x791C, - 0xB54F: 0x791D, - 0xB550: 0x791F, - 0xB551: 0x7920, - 0xB552: 0x7921, - 0xB553: 0x7922, - 0xB554: 0x7923, - 0xB555: 0x7925, - 0xB556: 0x7926, - 0xB557: 0x7927, - 0xB558: 0x7928, - 0xB559: 0x7929, - 0xB55A: 0x792A, - 0xB55B: 0x792B, - 0xB55C: 0x792C, - 0xB55D: 0x792D, - 0xB55E: 0x792E, - 0xB55F: 0x792F, - 0xB560: 0x7930, - 0xB561: 0x7931, - 0xB562: 0x7932, - 0xB563: 0x7933, - 0xB564: 0x7935, - 0xB565: 0x7936, - 0xB566: 0x7937, - 0xB567: 0x7938, - 0xB568: 0x7939, - 0xB569: 0x793D, - 0xB56A: 0x793F, - 0xB56B: 0x7942, - 0xB56C: 0x7943, - 0xB56D: 0x7944, - 0xB56E: 0x7945, - 0xB56F: 0x7947, - 0xB570: 0x794A, - 0xB571: 0x794B, - 0xB572: 0x794C, - 0xB573: 0x794D, - 0xB574: 0x794E, - 0xB575: 0x794F, - 0xB576: 0x7950, - 0xB577: 0x7951, - 0xB578: 0x7952, - 0xB579: 0x7954, - 0xB57A: 0x7955, - 0xB57B: 0x7958, - 0xB57C: 0x7959, - 0xB57D: 0x7961, - 0xB57E: 0x7963, - 0xB580: 0x7964, - 0xB581: 0x7966, - 0xB582: 0x7969, - 0xB583: 0x796A, - 0xB584: 0x796B, - 0xB585: 0x796C, - 0xB586: 0x796E, - 0xB587: 0x7970, - 0xB588: 0x7971, - 0xB589: 0x7972, - 0xB58A: 0x7973, - 0xB58B: 0x7974, - 0xB58C: 0x7975, - 0xB58D: 0x7976, - 0xB58E: 0x7979, - 0xB58F: 0x797B, - 0xB590: 0x797C, - 0xB591: 0x797D, - 0xB592: 0x797E, - 0xB593: 0x797F, - 0xB594: 0x7982, - 0xB595: 0x7983, - 0xB596: 0x7986, - 0xB597: 0x7987, - 0xB598: 0x7988, - 0xB599: 0x7989, - 0xB59A: 0x798B, - 0xB59B: 0x798C, - 0xB59C: 0x798D, - 0xB59D: 0x798E, - 0xB59E: 0x7990, - 0xB59F: 0x7991, - 0xB5A0: 0x7992, - 0xB5A1: 0x6020, - 0xB5A2: 0x803D, - 0xB5A3: 0x62C5, - 0xB5A4: 0x4E39, - 0xB5A5: 0x5355, - 0xB5A6: 0x90F8, - 0xB5A7: 0x63B8, - 0xB5A8: 0x80C6, - 0xB5A9: 0x65E6, - 0xB5AA: 0x6C2E, - 0xB5AB: 0x4F46, - 0xB5AC: 0x60EE, - 0xB5AD: 0x6DE1, - 0xB5AE: 0x8BDE, - 0xB5AF: 0x5F39, - 0xB5B0: 0x86CB, - 0xB5B1: 0x5F53, - 0xB5B2: 0x6321, - 0xB5B3: 0x515A, - 0xB5B4: 0x8361, - 0xB5B5: 0x6863, - 0xB5B6: 0x5200, - 0xB5B7: 0x6363, - 0xB5B8: 0x8E48, - 0xB5B9: 0x5012, - 0xB5BA: 0x5C9B, - 0xB5BB: 0x7977, - 0xB5BC: 0x5BFC, - 0xB5BD: 0x5230, - 0xB5BE: 0x7A3B, - 0xB5BF: 0x60BC, - 0xB5C0: 0x9053, - 0xB5C1: 0x76D7, - 0xB5C2: 0x5FB7, - 0xB5C3: 0x5F97, - 0xB5C4: 0x7684, - 0xB5C5: 0x8E6C, - 0xB5C6: 0x706F, - 0xB5C7: 0x767B, - 0xB5C8: 0x7B49, - 0xB5C9: 0x77AA, - 0xB5CA: 0x51F3, - 0xB5CB: 0x9093, - 0xB5CC: 0x5824, - 0xB5CD: 0x4F4E, - 0xB5CE: 0x6EF4, - 0xB5CF: 0x8FEA, - 0xB5D0: 0x654C, - 0xB5D1: 0x7B1B, - 0xB5D2: 0x72C4, - 0xB5D3: 0x6DA4, - 0xB5D4: 0x7FDF, - 0xB5D5: 0x5AE1, - 0xB5D6: 0x62B5, - 0xB5D7: 0x5E95, - 0xB5D8: 0x5730, - 0xB5D9: 0x8482, - 0xB5DA: 0x7B2C, - 0xB5DB: 0x5E1D, - 0xB5DC: 0x5F1F, - 0xB5DD: 0x9012, - 0xB5DE: 0x7F14, - 0xB5DF: 0x98A0, - 0xB5E0: 0x6382, - 0xB5E1: 0x6EC7, - 0xB5E2: 0x7898, - 0xB5E3: 0x70B9, - 0xB5E4: 0x5178, - 0xB5E5: 0x975B, - 0xB5E6: 0x57AB, - 0xB5E7: 0x7535, - 0xB5E8: 0x4F43, - 0xB5E9: 0x7538, - 0xB5EA: 0x5E97, - 0xB5EB: 0x60E6, - 0xB5EC: 0x5960, - 0xB5ED: 0x6DC0, - 0xB5EE: 0x6BBF, - 0xB5EF: 0x7889, - 0xB5F0: 0x53FC, - 0xB5F1: 0x96D5, - 0xB5F2: 0x51CB, - 0xB5F3: 0x5201, - 0xB5F4: 0x6389, - 0xB5F5: 0x540A, - 0xB5F6: 0x9493, - 0xB5F7: 0x8C03, - 0xB5F8: 0x8DCC, - 0xB5F9: 0x7239, - 0xB5FA: 0x789F, - 0xB5FB: 0x8776, - 0xB5FC: 0x8FED, - 0xB5FD: 0x8C0D, - 0xB5FE: 0x53E0, - 0xB640: 0x7993, - 0xB641: 0x7994, - 0xB642: 0x7995, - 0xB643: 0x7996, - 0xB644: 0x7997, - 0xB645: 0x7998, - 0xB646: 0x7999, - 0xB647: 0x799B, - 0xB648: 0x799C, - 0xB649: 0x799D, - 0xB64A: 0x799E, - 0xB64B: 0x799F, - 0xB64C: 0x79A0, - 0xB64D: 0x79A1, - 0xB64E: 0x79A2, - 0xB64F: 0x79A3, - 0xB650: 0x79A4, - 0xB651: 0x79A5, - 0xB652: 0x79A6, - 0xB653: 0x79A8, - 0xB654: 0x79A9, - 0xB655: 0x79AA, - 0xB656: 0x79AB, - 0xB657: 0x79AC, - 0xB658: 0x79AD, - 0xB659: 0x79AE, - 0xB65A: 0x79AF, - 0xB65B: 0x79B0, - 0xB65C: 0x79B1, - 0xB65D: 0x79B2, - 0xB65E: 0x79B4, - 0xB65F: 0x79B5, - 0xB660: 0x79B6, - 0xB661: 0x79B7, - 0xB662: 0x79B8, - 0xB663: 0x79BC, - 0xB664: 0x79BF, - 0xB665: 0x79C2, - 0xB666: 0x79C4, - 0xB667: 0x79C5, - 0xB668: 0x79C7, - 0xB669: 0x79C8, - 0xB66A: 0x79CA, - 0xB66B: 0x79CC, - 0xB66C: 0x79CE, - 0xB66D: 0x79CF, - 0xB66E: 0x79D0, - 0xB66F: 0x79D3, - 0xB670: 0x79D4, - 0xB671: 0x79D6, - 0xB672: 0x79D7, - 0xB673: 0x79D9, - 0xB674: 0x79DA, - 0xB675: 0x79DB, - 0xB676: 0x79DC, - 0xB677: 0x79DD, - 0xB678: 0x79DE, - 0xB679: 0x79E0, - 0xB67A: 0x79E1, - 0xB67B: 0x79E2, - 0xB67C: 0x79E5, - 0xB67D: 0x79E8, - 0xB67E: 0x79EA, - 0xB680: 0x79EC, - 0xB681: 0x79EE, - 0xB682: 0x79F1, - 0xB683: 0x79F2, - 0xB684: 0x79F3, - 0xB685: 0x79F4, - 0xB686: 0x79F5, - 0xB687: 0x79F6, - 0xB688: 0x79F7, - 0xB689: 0x79F9, - 0xB68A: 0x79FA, - 0xB68B: 0x79FC, - 0xB68C: 0x79FE, - 0xB68D: 0x79FF, - 0xB68E: 0x7A01, - 0xB68F: 0x7A04, - 0xB690: 0x7A05, - 0xB691: 0x7A07, - 0xB692: 0x7A08, - 0xB693: 0x7A09, - 0xB694: 0x7A0A, - 0xB695: 0x7A0C, - 0xB696: 0x7A0F, - 0xB697: 0x7A10, - 0xB698: 0x7A11, - 0xB699: 0x7A12, - 0xB69A: 0x7A13, - 0xB69B: 0x7A15, - 0xB69C: 0x7A16, - 0xB69D: 0x7A18, - 0xB69E: 0x7A19, - 0xB69F: 0x7A1B, - 0xB6A0: 0x7A1C, - 0xB6A1: 0x4E01, - 0xB6A2: 0x76EF, - 0xB6A3: 0x53EE, - 0xB6A4: 0x9489, - 0xB6A5: 0x9876, - 0xB6A6: 0x9F0E, - 0xB6A7: 0x952D, - 0xB6A8: 0x5B9A, - 0xB6A9: 0x8BA2, - 0xB6AA: 0x4E22, - 0xB6AB: 0x4E1C, - 0xB6AC: 0x51AC, - 0xB6AD: 0x8463, - 0xB6AE: 0x61C2, - 0xB6AF: 0x52A8, - 0xB6B0: 0x680B, - 0xB6B1: 0x4F97, - 0xB6B2: 0x606B, - 0xB6B3: 0x51BB, - 0xB6B4: 0x6D1E, - 0xB6B5: 0x515C, - 0xB6B6: 0x6296, - 0xB6B7: 0x6597, - 0xB6B8: 0x9661, - 0xB6B9: 0x8C46, - 0xB6BA: 0x9017, - 0xB6BB: 0x75D8, - 0xB6BC: 0x90FD, - 0xB6BD: 0x7763, - 0xB6BE: 0x6BD2, - 0xB6BF: 0x728A, - 0xB6C0: 0x72EC, - 0xB6C1: 0x8BFB, - 0xB6C2: 0x5835, - 0xB6C3: 0x7779, - 0xB6C4: 0x8D4C, - 0xB6C5: 0x675C, - 0xB6C6: 0x9540, - 0xB6C7: 0x809A, - 0xB6C8: 0x5EA6, - 0xB6C9: 0x6E21, - 0xB6CA: 0x5992, - 0xB6CB: 0x7AEF, - 0xB6CC: 0x77ED, - 0xB6CD: 0x953B, - 0xB6CE: 0x6BB5, - 0xB6CF: 0x65AD, - 0xB6D0: 0x7F0E, - 0xB6D1: 0x5806, - 0xB6D2: 0x5151, - 0xB6D3: 0x961F, - 0xB6D4: 0x5BF9, - 0xB6D5: 0x58A9, - 0xB6D6: 0x5428, - 0xB6D7: 0x8E72, - 0xB6D8: 0x6566, - 0xB6D9: 0x987F, - 0xB6DA: 0x56E4, - 0xB6DB: 0x949D, - 0xB6DC: 0x76FE, - 0xB6DD: 0x9041, - 0xB6DE: 0x6387, - 0xB6DF: 0x54C6, - 0xB6E0: 0x591A, - 0xB6E1: 0x593A, - 0xB6E2: 0x579B, - 0xB6E3: 0x8EB2, - 0xB6E4: 0x6735, - 0xB6E5: 0x8DFA, - 0xB6E6: 0x8235, - 0xB6E7: 0x5241, - 0xB6E8: 0x60F0, - 0xB6E9: 0x5815, - 0xB6EA: 0x86FE, - 0xB6EB: 0x5CE8, - 0xB6EC: 0x9E45, - 0xB6ED: 0x4FC4, - 0xB6EE: 0x989D, - 0xB6EF: 0x8BB9, - 0xB6F0: 0x5A25, - 0xB6F1: 0x6076, - 0xB6F2: 0x5384, - 0xB6F3: 0x627C, - 0xB6F4: 0x904F, - 0xB6F5: 0x9102, - 0xB6F6: 0x997F, - 0xB6F7: 0x6069, - 0xB6F8: 0x800C, - 0xB6F9: 0x513F, - 0xB6FA: 0x8033, - 0xB6FB: 0x5C14, - 0xB6FC: 0x9975, - 0xB6FD: 0x6D31, - 0xB6FE: 0x4E8C, - 0xB740: 0x7A1D, - 0xB741: 0x7A1F, - 0xB742: 0x7A21, - 0xB743: 0x7A22, - 0xB744: 0x7A24, - 0xB745: 0x7A25, - 0xB746: 0x7A26, - 0xB747: 0x7A27, - 0xB748: 0x7A28, - 0xB749: 0x7A29, - 0xB74A: 0x7A2A, - 0xB74B: 0x7A2B, - 0xB74C: 0x7A2C, - 0xB74D: 0x7A2D, - 0xB74E: 0x7A2E, - 0xB74F: 0x7A2F, - 0xB750: 0x7A30, - 0xB751: 0x7A31, - 0xB752: 0x7A32, - 0xB753: 0x7A34, - 0xB754: 0x7A35, - 0xB755: 0x7A36, - 0xB756: 0x7A38, - 0xB757: 0x7A3A, - 0xB758: 0x7A3E, - 0xB759: 0x7A40, - 0xB75A: 0x7A41, - 0xB75B: 0x7A42, - 0xB75C: 0x7A43, - 0xB75D: 0x7A44, - 0xB75E: 0x7A45, - 0xB75F: 0x7A47, - 0xB760: 0x7A48, - 0xB761: 0x7A49, - 0xB762: 0x7A4A, - 0xB763: 0x7A4B, - 0xB764: 0x7A4C, - 0xB765: 0x7A4D, - 0xB766: 0x7A4E, - 0xB767: 0x7A4F, - 0xB768: 0x7A50, - 0xB769: 0x7A52, - 0xB76A: 0x7A53, - 0xB76B: 0x7A54, - 0xB76C: 0x7A55, - 0xB76D: 0x7A56, - 0xB76E: 0x7A58, - 0xB76F: 0x7A59, - 0xB770: 0x7A5A, - 0xB771: 0x7A5B, - 0xB772: 0x7A5C, - 0xB773: 0x7A5D, - 0xB774: 0x7A5E, - 0xB775: 0x7A5F, - 0xB776: 0x7A60, - 0xB777: 0x7A61, - 0xB778: 0x7A62, - 0xB779: 0x7A63, - 0xB77A: 0x7A64, - 0xB77B: 0x7A65, - 0xB77C: 0x7A66, - 0xB77D: 0x7A67, - 0xB77E: 0x7A68, - 0xB780: 0x7A69, - 0xB781: 0x7A6A, - 0xB782: 0x7A6B, - 0xB783: 0x7A6C, - 0xB784: 0x7A6D, - 0xB785: 0x7A6E, - 0xB786: 0x7A6F, - 0xB787: 0x7A71, - 0xB788: 0x7A72, - 0xB789: 0x7A73, - 0xB78A: 0x7A75, - 0xB78B: 0x7A7B, - 0xB78C: 0x7A7C, - 0xB78D: 0x7A7D, - 0xB78E: 0x7A7E, - 0xB78F: 0x7A82, - 0xB790: 0x7A85, - 0xB791: 0x7A87, - 0xB792: 0x7A89, - 0xB793: 0x7A8A, - 0xB794: 0x7A8B, - 0xB795: 0x7A8C, - 0xB796: 0x7A8E, - 0xB797: 0x7A8F, - 0xB798: 0x7A90, - 0xB799: 0x7A93, - 0xB79A: 0x7A94, - 0xB79B: 0x7A99, - 0xB79C: 0x7A9A, - 0xB79D: 0x7A9B, - 0xB79E: 0x7A9E, - 0xB79F: 0x7AA1, - 0xB7A0: 0x7AA2, - 0xB7A1: 0x8D30, - 0xB7A2: 0x53D1, - 0xB7A3: 0x7F5A, - 0xB7A4: 0x7B4F, - 0xB7A5: 0x4F10, - 0xB7A6: 0x4E4F, - 0xB7A7: 0x9600, - 0xB7A8: 0x6CD5, - 0xB7A9: 0x73D0, - 0xB7AA: 0x85E9, - 0xB7AB: 0x5E06, - 0xB7AC: 0x756A, - 0xB7AD: 0x7FFB, - 0xB7AE: 0x6A0A, - 0xB7AF: 0x77FE, - 0xB7B0: 0x9492, - 0xB7B1: 0x7E41, - 0xB7B2: 0x51E1, - 0xB7B3: 0x70E6, - 0xB7B4: 0x53CD, - 0xB7B5: 0x8FD4, - 0xB7B6: 0x8303, - 0xB7B7: 0x8D29, - 0xB7B8: 0x72AF, - 0xB7B9: 0x996D, - 0xB7BA: 0x6CDB, - 0xB7BB: 0x574A, - 0xB7BC: 0x82B3, - 0xB7BD: 0x65B9, - 0xB7BE: 0x80AA, - 0xB7BF: 0x623F, - 0xB7C0: 0x9632, - 0xB7C1: 0x59A8, - 0xB7C2: 0x4EFF, - 0xB7C3: 0x8BBF, - 0xB7C4: 0x7EBA, - 0xB7C5: 0x653E, - 0xB7C6: 0x83F2, - 0xB7C7: 0x975E, - 0xB7C8: 0x5561, - 0xB7C9: 0x98DE, - 0xB7CA: 0x80A5, - 0xB7CB: 0x532A, - 0xB7CC: 0x8BFD, - 0xB7CD: 0x5420, - 0xB7CE: 0x80BA, - 0xB7CF: 0x5E9F, - 0xB7D0: 0x6CB8, - 0xB7D1: 0x8D39, - 0xB7D2: 0x82AC, - 0xB7D3: 0x915A, - 0xB7D4: 0x5429, - 0xB7D5: 0x6C1B, - 0xB7D6: 0x5206, - 0xB7D7: 0x7EB7, - 0xB7D8: 0x575F, - 0xB7D9: 0x711A, - 0xB7DA: 0x6C7E, - 0xB7DB: 0x7C89, - 0xB7DC: 0x594B, - 0xB7DD: 0x4EFD, - 0xB7DE: 0x5FFF, - 0xB7DF: 0x6124, - 0xB7E0: 0x7CAA, - 0xB7E1: 0x4E30, - 0xB7E2: 0x5C01, - 0xB7E3: 0x67AB, - 0xB7E4: 0x8702, - 0xB7E5: 0x5CF0, - 0xB7E6: 0x950B, - 0xB7E7: 0x98CE, - 0xB7E8: 0x75AF, - 0xB7E9: 0x70FD, - 0xB7EA: 0x9022, - 0xB7EB: 0x51AF, - 0xB7EC: 0x7F1D, - 0xB7ED: 0x8BBD, - 0xB7EE: 0x5949, - 0xB7EF: 0x51E4, - 0xB7F0: 0x4F5B, - 0xB7F1: 0x5426, - 0xB7F2: 0x592B, - 0xB7F3: 0x6577, - 0xB7F4: 0x80A4, - 0xB7F5: 0x5B75, - 0xB7F6: 0x6276, - 0xB7F7: 0x62C2, - 0xB7F8: 0x8F90, - 0xB7F9: 0x5E45, - 0xB7FA: 0x6C1F, - 0xB7FB: 0x7B26, - 0xB7FC: 0x4F0F, - 0xB7FD: 0x4FD8, - 0xB7FE: 0x670D, - 0xB840: 0x7AA3, - 0xB841: 0x7AA4, - 0xB842: 0x7AA7, - 0xB843: 0x7AA9, - 0xB844: 0x7AAA, - 0xB845: 0x7AAB, - 0xB846: 0x7AAE, - 0xB847: 0x7AAF, - 0xB848: 0x7AB0, - 0xB849: 0x7AB1, - 0xB84A: 0x7AB2, - 0xB84B: 0x7AB4, - 0xB84C: 0x7AB5, - 0xB84D: 0x7AB6, - 0xB84E: 0x7AB7, - 0xB84F: 0x7AB8, - 0xB850: 0x7AB9, - 0xB851: 0x7ABA, - 0xB852: 0x7ABB, - 0xB853: 0x7ABC, - 0xB854: 0x7ABD, - 0xB855: 0x7ABE, - 0xB856: 0x7AC0, - 0xB857: 0x7AC1, - 0xB858: 0x7AC2, - 0xB859: 0x7AC3, - 0xB85A: 0x7AC4, - 0xB85B: 0x7AC5, - 0xB85C: 0x7AC6, - 0xB85D: 0x7AC7, - 0xB85E: 0x7AC8, - 0xB85F: 0x7AC9, - 0xB860: 0x7ACA, - 0xB861: 0x7ACC, - 0xB862: 0x7ACD, - 0xB863: 0x7ACE, - 0xB864: 0x7ACF, - 0xB865: 0x7AD0, - 0xB866: 0x7AD1, - 0xB867: 0x7AD2, - 0xB868: 0x7AD3, - 0xB869: 0x7AD4, - 0xB86A: 0x7AD5, - 0xB86B: 0x7AD7, - 0xB86C: 0x7AD8, - 0xB86D: 0x7ADA, - 0xB86E: 0x7ADB, - 0xB86F: 0x7ADC, - 0xB870: 0x7ADD, - 0xB871: 0x7AE1, - 0xB872: 0x7AE2, - 0xB873: 0x7AE4, - 0xB874: 0x7AE7, - 0xB875: 0x7AE8, - 0xB876: 0x7AE9, - 0xB877: 0x7AEA, - 0xB878: 0x7AEB, - 0xB879: 0x7AEC, - 0xB87A: 0x7AEE, - 0xB87B: 0x7AF0, - 0xB87C: 0x7AF1, - 0xB87D: 0x7AF2, - 0xB87E: 0x7AF3, - 0xB880: 0x7AF4, - 0xB881: 0x7AF5, - 0xB882: 0x7AF6, - 0xB883: 0x7AF7, - 0xB884: 0x7AF8, - 0xB885: 0x7AFB, - 0xB886: 0x7AFC, - 0xB887: 0x7AFE, - 0xB888: 0x7B00, - 0xB889: 0x7B01, - 0xB88A: 0x7B02, - 0xB88B: 0x7B05, - 0xB88C: 0x7B07, - 0xB88D: 0x7B09, - 0xB88E: 0x7B0C, - 0xB88F: 0x7B0D, - 0xB890: 0x7B0E, - 0xB891: 0x7B10, - 0xB892: 0x7B12, - 0xB893: 0x7B13, - 0xB894: 0x7B16, - 0xB895: 0x7B17, - 0xB896: 0x7B18, - 0xB897: 0x7B1A, - 0xB898: 0x7B1C, - 0xB899: 0x7B1D, - 0xB89A: 0x7B1F, - 0xB89B: 0x7B21, - 0xB89C: 0x7B22, - 0xB89D: 0x7B23, - 0xB89E: 0x7B27, - 0xB89F: 0x7B29, - 0xB8A0: 0x7B2D, - 0xB8A1: 0x6D6E, - 0xB8A2: 0x6DAA, - 0xB8A3: 0x798F, - 0xB8A4: 0x88B1, - 0xB8A5: 0x5F17, - 0xB8A6: 0x752B, - 0xB8A7: 0x629A, - 0xB8A8: 0x8F85, - 0xB8A9: 0x4FEF, - 0xB8AA: 0x91DC, - 0xB8AB: 0x65A7, - 0xB8AC: 0x812F, - 0xB8AD: 0x8151, - 0xB8AE: 0x5E9C, - 0xB8AF: 0x8150, - 0xB8B0: 0x8D74, - 0xB8B1: 0x526F, - 0xB8B2: 0x8986, - 0xB8B3: 0x8D4B, - 0xB8B4: 0x590D, - 0xB8B5: 0x5085, - 0xB8B6: 0x4ED8, - 0xB8B7: 0x961C, - 0xB8B8: 0x7236, - 0xB8B9: 0x8179, - 0xB8BA: 0x8D1F, - 0xB8BB: 0x5BCC, - 0xB8BC: 0x8BA3, - 0xB8BD: 0x9644, - 0xB8BE: 0x5987, - 0xB8BF: 0x7F1A, - 0xB8C0: 0x5490, - 0xB8C1: 0x5676, - 0xB8C2: 0x560E, - 0xB8C3: 0x8BE5, - 0xB8C4: 0x6539, - 0xB8C5: 0x6982, - 0xB8C6: 0x9499, - 0xB8C7: 0x76D6, - 0xB8C8: 0x6E89, - 0xB8C9: 0x5E72, - 0xB8CA: 0x7518, - 0xB8CB: 0x6746, - 0xB8CC: 0x67D1, - 0xB8CD: 0x7AFF, - 0xB8CE: 0x809D, - 0xB8CF: 0x8D76, - 0xB8D0: 0x611F, - 0xB8D1: 0x79C6, - 0xB8D2: 0x6562, - 0xB8D3: 0x8D63, - 0xB8D4: 0x5188, - 0xB8D5: 0x521A, - 0xB8D6: 0x94A2, - 0xB8D7: 0x7F38, - 0xB8D8: 0x809B, - 0xB8D9: 0x7EB2, - 0xB8DA: 0x5C97, - 0xB8DB: 0x6E2F, - 0xB8DC: 0x6760, - 0xB8DD: 0x7BD9, - 0xB8DE: 0x768B, - 0xB8DF: 0x9AD8, - 0xB8E0: 0x818F, - 0xB8E1: 0x7F94, - 0xB8E2: 0x7CD5, - 0xB8E3: 0x641E, - 0xB8E4: 0x9550, - 0xB8E5: 0x7A3F, - 0xB8E6: 0x544A, - 0xB8E7: 0x54E5, - 0xB8E8: 0x6B4C, - 0xB8E9: 0x6401, - 0xB8EA: 0x6208, - 0xB8EB: 0x9E3D, - 0xB8EC: 0x80F3, - 0xB8ED: 0x7599, - 0xB8EE: 0x5272, - 0xB8EF: 0x9769, - 0xB8F0: 0x845B, - 0xB8F1: 0x683C, - 0xB8F2: 0x86E4, - 0xB8F3: 0x9601, - 0xB8F4: 0x9694, - 0xB8F5: 0x94EC, - 0xB8F6: 0x4E2A, - 0xB8F7: 0x5404, - 0xB8F8: 0x7ED9, - 0xB8F9: 0x6839, - 0xB8FA: 0x8DDF, - 0xB8FB: 0x8015, - 0xB8FC: 0x66F4, - 0xB8FD: 0x5E9A, - 0xB8FE: 0x7FB9, - 0xB940: 0x7B2F, - 0xB941: 0x7B30, - 0xB942: 0x7B32, - 0xB943: 0x7B34, - 0xB944: 0x7B35, - 0xB945: 0x7B36, - 0xB946: 0x7B37, - 0xB947: 0x7B39, - 0xB948: 0x7B3B, - 0xB949: 0x7B3D, - 0xB94A: 0x7B3F, - 0xB94B: 0x7B40, - 0xB94C: 0x7B41, - 0xB94D: 0x7B42, - 0xB94E: 0x7B43, - 0xB94F: 0x7B44, - 0xB950: 0x7B46, - 0xB951: 0x7B48, - 0xB952: 0x7B4A, - 0xB953: 0x7B4D, - 0xB954: 0x7B4E, - 0xB955: 0x7B53, - 0xB956: 0x7B55, - 0xB957: 0x7B57, - 0xB958: 0x7B59, - 0xB959: 0x7B5C, - 0xB95A: 0x7B5E, - 0xB95B: 0x7B5F, - 0xB95C: 0x7B61, - 0xB95D: 0x7B63, - 0xB95E: 0x7B64, - 0xB95F: 0x7B65, - 0xB960: 0x7B66, - 0xB961: 0x7B67, - 0xB962: 0x7B68, - 0xB963: 0x7B69, - 0xB964: 0x7B6A, - 0xB965: 0x7B6B, - 0xB966: 0x7B6C, - 0xB967: 0x7B6D, - 0xB968: 0x7B6F, - 0xB969: 0x7B70, - 0xB96A: 0x7B73, - 0xB96B: 0x7B74, - 0xB96C: 0x7B76, - 0xB96D: 0x7B78, - 0xB96E: 0x7B7A, - 0xB96F: 0x7B7C, - 0xB970: 0x7B7D, - 0xB971: 0x7B7F, - 0xB972: 0x7B81, - 0xB973: 0x7B82, - 0xB974: 0x7B83, - 0xB975: 0x7B84, - 0xB976: 0x7B86, - 0xB977: 0x7B87, - 0xB978: 0x7B88, - 0xB979: 0x7B89, - 0xB97A: 0x7B8A, - 0xB97B: 0x7B8B, - 0xB97C: 0x7B8C, - 0xB97D: 0x7B8E, - 0xB97E: 0x7B8F, - 0xB980: 0x7B91, - 0xB981: 0x7B92, - 0xB982: 0x7B93, - 0xB983: 0x7B96, - 0xB984: 0x7B98, - 0xB985: 0x7B99, - 0xB986: 0x7B9A, - 0xB987: 0x7B9B, - 0xB988: 0x7B9E, - 0xB989: 0x7B9F, - 0xB98A: 0x7BA0, - 0xB98B: 0x7BA3, - 0xB98C: 0x7BA4, - 0xB98D: 0x7BA5, - 0xB98E: 0x7BAE, - 0xB98F: 0x7BAF, - 0xB990: 0x7BB0, - 0xB991: 0x7BB2, - 0xB992: 0x7BB3, - 0xB993: 0x7BB5, - 0xB994: 0x7BB6, - 0xB995: 0x7BB7, - 0xB996: 0x7BB9, - 0xB997: 0x7BBA, - 0xB998: 0x7BBB, - 0xB999: 0x7BBC, - 0xB99A: 0x7BBD, - 0xB99B: 0x7BBE, - 0xB99C: 0x7BBF, - 0xB99D: 0x7BC0, - 0xB99E: 0x7BC2, - 0xB99F: 0x7BC3, - 0xB9A0: 0x7BC4, - 0xB9A1: 0x57C2, - 0xB9A2: 0x803F, - 0xB9A3: 0x6897, - 0xB9A4: 0x5DE5, - 0xB9A5: 0x653B, - 0xB9A6: 0x529F, - 0xB9A7: 0x606D, - 0xB9A8: 0x9F9A, - 0xB9A9: 0x4F9B, - 0xB9AA: 0x8EAC, - 0xB9AB: 0x516C, - 0xB9AC: 0x5BAB, - 0xB9AD: 0x5F13, - 0xB9AE: 0x5DE9, - 0xB9AF: 0x6C5E, - 0xB9B0: 0x62F1, - 0xB9B1: 0x8D21, - 0xB9B2: 0x5171, - 0xB9B3: 0x94A9, - 0xB9B4: 0x52FE, - 0xB9B5: 0x6C9F, - 0xB9B6: 0x82DF, - 0xB9B7: 0x72D7, - 0xB9B8: 0x57A2, - 0xB9B9: 0x6784, - 0xB9BA: 0x8D2D, - 0xB9BB: 0x591F, - 0xB9BC: 0x8F9C, - 0xB9BD: 0x83C7, - 0xB9BE: 0x5495, - 0xB9BF: 0x7B8D, - 0xB9C0: 0x4F30, - 0xB9C1: 0x6CBD, - 0xB9C2: 0x5B64, - 0xB9C3: 0x59D1, - 0xB9C4: 0x9F13, - 0xB9C5: 0x53E4, - 0xB9C6: 0x86CA, - 0xB9C7: 0x9AA8, - 0xB9C8: 0x8C37, - 0xB9C9: 0x80A1, - 0xB9CA: 0x6545, - 0xB9CB: 0x987E, - 0xB9CC: 0x56FA, - 0xB9CD: 0x96C7, - 0xB9CE: 0x522E, - 0xB9CF: 0x74DC, - 0xB9D0: 0x5250, - 0xB9D1: 0x5BE1, - 0xB9D2: 0x6302, - 0xB9D3: 0x8902, - 0xB9D4: 0x4E56, - 0xB9D5: 0x62D0, - 0xB9D6: 0x602A, - 0xB9D7: 0x68FA, - 0xB9D8: 0x5173, - 0xB9D9: 0x5B98, - 0xB9DA: 0x51A0, - 0xB9DB: 0x89C2, - 0xB9DC: 0x7BA1, - 0xB9DD: 0x9986, - 0xB9DE: 0x7F50, - 0xB9DF: 0x60EF, - 0xB9E0: 0x704C, - 0xB9E1: 0x8D2F, - 0xB9E2: 0x5149, - 0xB9E3: 0x5E7F, - 0xB9E4: 0x901B, - 0xB9E5: 0x7470, - 0xB9E6: 0x89C4, - 0xB9E7: 0x572D, - 0xB9E8: 0x7845, - 0xB9E9: 0x5F52, - 0xB9EA: 0x9F9F, - 0xB9EB: 0x95FA, - 0xB9EC: 0x8F68, - 0xB9ED: 0x9B3C, - 0xB9EE: 0x8BE1, - 0xB9EF: 0x7678, - 0xB9F0: 0x6842, - 0xB9F1: 0x67DC, - 0xB9F2: 0x8DEA, - 0xB9F3: 0x8D35, - 0xB9F4: 0x523D, - 0xB9F5: 0x8F8A, - 0xB9F6: 0x6EDA, - 0xB9F7: 0x68CD, - 0xB9F8: 0x9505, - 0xB9F9: 0x90ED, - 0xB9FA: 0x56FD, - 0xB9FB: 0x679C, - 0xB9FC: 0x88F9, - 0xB9FD: 0x8FC7, - 0xB9FE: 0x54C8, - 0xBA40: 0x7BC5, - 0xBA41: 0x7BC8, - 0xBA42: 0x7BC9, - 0xBA43: 0x7BCA, - 0xBA44: 0x7BCB, - 0xBA45: 0x7BCD, - 0xBA46: 0x7BCE, - 0xBA47: 0x7BCF, - 0xBA48: 0x7BD0, - 0xBA49: 0x7BD2, - 0xBA4A: 0x7BD4, - 0xBA4B: 0x7BD5, - 0xBA4C: 0x7BD6, - 0xBA4D: 0x7BD7, - 0xBA4E: 0x7BD8, - 0xBA4F: 0x7BDB, - 0xBA50: 0x7BDC, - 0xBA51: 0x7BDE, - 0xBA52: 0x7BDF, - 0xBA53: 0x7BE0, - 0xBA54: 0x7BE2, - 0xBA55: 0x7BE3, - 0xBA56: 0x7BE4, - 0xBA57: 0x7BE7, - 0xBA58: 0x7BE8, - 0xBA59: 0x7BE9, - 0xBA5A: 0x7BEB, - 0xBA5B: 0x7BEC, - 0xBA5C: 0x7BED, - 0xBA5D: 0x7BEF, - 0xBA5E: 0x7BF0, - 0xBA5F: 0x7BF2, - 0xBA60: 0x7BF3, - 0xBA61: 0x7BF4, - 0xBA62: 0x7BF5, - 0xBA63: 0x7BF6, - 0xBA64: 0x7BF8, - 0xBA65: 0x7BF9, - 0xBA66: 0x7BFA, - 0xBA67: 0x7BFB, - 0xBA68: 0x7BFD, - 0xBA69: 0x7BFF, - 0xBA6A: 0x7C00, - 0xBA6B: 0x7C01, - 0xBA6C: 0x7C02, - 0xBA6D: 0x7C03, - 0xBA6E: 0x7C04, - 0xBA6F: 0x7C05, - 0xBA70: 0x7C06, - 0xBA71: 0x7C08, - 0xBA72: 0x7C09, - 0xBA73: 0x7C0A, - 0xBA74: 0x7C0D, - 0xBA75: 0x7C0E, - 0xBA76: 0x7C10, - 0xBA77: 0x7C11, - 0xBA78: 0x7C12, - 0xBA79: 0x7C13, - 0xBA7A: 0x7C14, - 0xBA7B: 0x7C15, - 0xBA7C: 0x7C17, - 0xBA7D: 0x7C18, - 0xBA7E: 0x7C19, - 0xBA80: 0x7C1A, - 0xBA81: 0x7C1B, - 0xBA82: 0x7C1C, - 0xBA83: 0x7C1D, - 0xBA84: 0x7C1E, - 0xBA85: 0x7C20, - 0xBA86: 0x7C21, - 0xBA87: 0x7C22, - 0xBA88: 0x7C23, - 0xBA89: 0x7C24, - 0xBA8A: 0x7C25, - 0xBA8B: 0x7C28, - 0xBA8C: 0x7C29, - 0xBA8D: 0x7C2B, - 0xBA8E: 0x7C2C, - 0xBA8F: 0x7C2D, - 0xBA90: 0x7C2E, - 0xBA91: 0x7C2F, - 0xBA92: 0x7C30, - 0xBA93: 0x7C31, - 0xBA94: 0x7C32, - 0xBA95: 0x7C33, - 0xBA96: 0x7C34, - 0xBA97: 0x7C35, - 0xBA98: 0x7C36, - 0xBA99: 0x7C37, - 0xBA9A: 0x7C39, - 0xBA9B: 0x7C3A, - 0xBA9C: 0x7C3B, - 0xBA9D: 0x7C3C, - 0xBA9E: 0x7C3D, - 0xBA9F: 0x7C3E, - 0xBAA0: 0x7C42, - 0xBAA1: 0x9AB8, - 0xBAA2: 0x5B69, - 0xBAA3: 0x6D77, - 0xBAA4: 0x6C26, - 0xBAA5: 0x4EA5, - 0xBAA6: 0x5BB3, - 0xBAA7: 0x9A87, - 0xBAA8: 0x9163, - 0xBAA9: 0x61A8, - 0xBAAA: 0x90AF, - 0xBAAB: 0x97E9, - 0xBAAC: 0x542B, - 0xBAAD: 0x6DB5, - 0xBAAE: 0x5BD2, - 0xBAAF: 0x51FD, - 0xBAB0: 0x558A, - 0xBAB1: 0x7F55, - 0xBAB2: 0x7FF0, - 0xBAB3: 0x64BC, - 0xBAB4: 0x634D, - 0xBAB5: 0x65F1, - 0xBAB6: 0x61BE, - 0xBAB7: 0x608D, - 0xBAB8: 0x710A, - 0xBAB9: 0x6C57, - 0xBABA: 0x6C49, - 0xBABB: 0x592F, - 0xBABC: 0x676D, - 0xBABD: 0x822A, - 0xBABE: 0x58D5, - 0xBABF: 0x568E, - 0xBAC0: 0x8C6A, - 0xBAC1: 0x6BEB, - 0xBAC2: 0x90DD, - 0xBAC3: 0x597D, - 0xBAC4: 0x8017, - 0xBAC5: 0x53F7, - 0xBAC6: 0x6D69, - 0xBAC7: 0x5475, - 0xBAC8: 0x559D, - 0xBAC9: 0x8377, - 0xBACA: 0x83CF, - 0xBACB: 0x6838, - 0xBACC: 0x79BE, - 0xBACD: 0x548C, - 0xBACE: 0x4F55, - 0xBACF: 0x5408, - 0xBAD0: 0x76D2, - 0xBAD1: 0x8C89, - 0xBAD2: 0x9602, - 0xBAD3: 0x6CB3, - 0xBAD4: 0x6DB8, - 0xBAD5: 0x8D6B, - 0xBAD6: 0x8910, - 0xBAD7: 0x9E64, - 0xBAD8: 0x8D3A, - 0xBAD9: 0x563F, - 0xBADA: 0x9ED1, - 0xBADB: 0x75D5, - 0xBADC: 0x5F88, - 0xBADD: 0x72E0, - 0xBADE: 0x6068, - 0xBADF: 0x54FC, - 0xBAE0: 0x4EA8, - 0xBAE1: 0x6A2A, - 0xBAE2: 0x8861, - 0xBAE3: 0x6052, - 0xBAE4: 0x8F70, - 0xBAE5: 0x54C4, - 0xBAE6: 0x70D8, - 0xBAE7: 0x8679, - 0xBAE8: 0x9E3F, - 0xBAE9: 0x6D2A, - 0xBAEA: 0x5B8F, - 0xBAEB: 0x5F18, - 0xBAEC: 0x7EA2, - 0xBAED: 0x5589, - 0xBAEE: 0x4FAF, - 0xBAEF: 0x7334, - 0xBAF0: 0x543C, - 0xBAF1: 0x539A, - 0xBAF2: 0x5019, - 0xBAF3: 0x540E, - 0xBAF4: 0x547C, - 0xBAF5: 0x4E4E, - 0xBAF6: 0x5FFD, - 0xBAF7: 0x745A, - 0xBAF8: 0x58F6, - 0xBAF9: 0x846B, - 0xBAFA: 0x80E1, - 0xBAFB: 0x8774, - 0xBAFC: 0x72D0, - 0xBAFD: 0x7CCA, - 0xBAFE: 0x6E56, - 0xBB40: 0x7C43, - 0xBB41: 0x7C44, - 0xBB42: 0x7C45, - 0xBB43: 0x7C46, - 0xBB44: 0x7C47, - 0xBB45: 0x7C48, - 0xBB46: 0x7C49, - 0xBB47: 0x7C4A, - 0xBB48: 0x7C4B, - 0xBB49: 0x7C4C, - 0xBB4A: 0x7C4E, - 0xBB4B: 0x7C4F, - 0xBB4C: 0x7C50, - 0xBB4D: 0x7C51, - 0xBB4E: 0x7C52, - 0xBB4F: 0x7C53, - 0xBB50: 0x7C54, - 0xBB51: 0x7C55, - 0xBB52: 0x7C56, - 0xBB53: 0x7C57, - 0xBB54: 0x7C58, - 0xBB55: 0x7C59, - 0xBB56: 0x7C5A, - 0xBB57: 0x7C5B, - 0xBB58: 0x7C5C, - 0xBB59: 0x7C5D, - 0xBB5A: 0x7C5E, - 0xBB5B: 0x7C5F, - 0xBB5C: 0x7C60, - 0xBB5D: 0x7C61, - 0xBB5E: 0x7C62, - 0xBB5F: 0x7C63, - 0xBB60: 0x7C64, - 0xBB61: 0x7C65, - 0xBB62: 0x7C66, - 0xBB63: 0x7C67, - 0xBB64: 0x7C68, - 0xBB65: 0x7C69, - 0xBB66: 0x7C6A, - 0xBB67: 0x7C6B, - 0xBB68: 0x7C6C, - 0xBB69: 0x7C6D, - 0xBB6A: 0x7C6E, - 0xBB6B: 0x7C6F, - 0xBB6C: 0x7C70, - 0xBB6D: 0x7C71, - 0xBB6E: 0x7C72, - 0xBB6F: 0x7C75, - 0xBB70: 0x7C76, - 0xBB71: 0x7C77, - 0xBB72: 0x7C78, - 0xBB73: 0x7C79, - 0xBB74: 0x7C7A, - 0xBB75: 0x7C7E, - 0xBB76: 0x7C7F, - 0xBB77: 0x7C80, - 0xBB78: 0x7C81, - 0xBB79: 0x7C82, - 0xBB7A: 0x7C83, - 0xBB7B: 0x7C84, - 0xBB7C: 0x7C85, - 0xBB7D: 0x7C86, - 0xBB7E: 0x7C87, - 0xBB80: 0x7C88, - 0xBB81: 0x7C8A, - 0xBB82: 0x7C8B, - 0xBB83: 0x7C8C, - 0xBB84: 0x7C8D, - 0xBB85: 0x7C8E, - 0xBB86: 0x7C8F, - 0xBB87: 0x7C90, - 0xBB88: 0x7C93, - 0xBB89: 0x7C94, - 0xBB8A: 0x7C96, - 0xBB8B: 0x7C99, - 0xBB8C: 0x7C9A, - 0xBB8D: 0x7C9B, - 0xBB8E: 0x7CA0, - 0xBB8F: 0x7CA1, - 0xBB90: 0x7CA3, - 0xBB91: 0x7CA6, - 0xBB92: 0x7CA7, - 0xBB93: 0x7CA8, - 0xBB94: 0x7CA9, - 0xBB95: 0x7CAB, - 0xBB96: 0x7CAC, - 0xBB97: 0x7CAD, - 0xBB98: 0x7CAF, - 0xBB99: 0x7CB0, - 0xBB9A: 0x7CB4, - 0xBB9B: 0x7CB5, - 0xBB9C: 0x7CB6, - 0xBB9D: 0x7CB7, - 0xBB9E: 0x7CB8, - 0xBB9F: 0x7CBA, - 0xBBA0: 0x7CBB, - 0xBBA1: 0x5F27, - 0xBBA2: 0x864E, - 0xBBA3: 0x552C, - 0xBBA4: 0x62A4, - 0xBBA5: 0x4E92, - 0xBBA6: 0x6CAA, - 0xBBA7: 0x6237, - 0xBBA8: 0x82B1, - 0xBBA9: 0x54D7, - 0xBBAA: 0x534E, - 0xBBAB: 0x733E, - 0xBBAC: 0x6ED1, - 0xBBAD: 0x753B, - 0xBBAE: 0x5212, - 0xBBAF: 0x5316, - 0xBBB0: 0x8BDD, - 0xBBB1: 0x69D0, - 0xBBB2: 0x5F8A, - 0xBBB3: 0x6000, - 0xBBB4: 0x6DEE, - 0xBBB5: 0x574F, - 0xBBB6: 0x6B22, - 0xBBB7: 0x73AF, - 0xBBB8: 0x6853, - 0xBBB9: 0x8FD8, - 0xBBBA: 0x7F13, - 0xBBBB: 0x6362, - 0xBBBC: 0x60A3, - 0xBBBD: 0x5524, - 0xBBBE: 0x75EA, - 0xBBBF: 0x8C62, - 0xBBC0: 0x7115, - 0xBBC1: 0x6DA3, - 0xBBC2: 0x5BA6, - 0xBBC3: 0x5E7B, - 0xBBC4: 0x8352, - 0xBBC5: 0x614C, - 0xBBC6: 0x9EC4, - 0xBBC7: 0x78FA, - 0xBBC8: 0x8757, - 0xBBC9: 0x7C27, - 0xBBCA: 0x7687, - 0xBBCB: 0x51F0, - 0xBBCC: 0x60F6, - 0xBBCD: 0x714C, - 0xBBCE: 0x6643, - 0xBBCF: 0x5E4C, - 0xBBD0: 0x604D, - 0xBBD1: 0x8C0E, - 0xBBD2: 0x7070, - 0xBBD3: 0x6325, - 0xBBD4: 0x8F89, - 0xBBD5: 0x5FBD, - 0xBBD6: 0x6062, - 0xBBD7: 0x86D4, - 0xBBD8: 0x56DE, - 0xBBD9: 0x6BC1, - 0xBBDA: 0x6094, - 0xBBDB: 0x6167, - 0xBBDC: 0x5349, - 0xBBDD: 0x60E0, - 0xBBDE: 0x6666, - 0xBBDF: 0x8D3F, - 0xBBE0: 0x79FD, - 0xBBE1: 0x4F1A, - 0xBBE2: 0x70E9, - 0xBBE3: 0x6C47, - 0xBBE4: 0x8BB3, - 0xBBE5: 0x8BF2, - 0xBBE6: 0x7ED8, - 0xBBE7: 0x8364, - 0xBBE8: 0x660F, - 0xBBE9: 0x5A5A, - 0xBBEA: 0x9B42, - 0xBBEB: 0x6D51, - 0xBBEC: 0x6DF7, - 0xBBED: 0x8C41, - 0xBBEE: 0x6D3B, - 0xBBEF: 0x4F19, - 0xBBF0: 0x706B, - 0xBBF1: 0x83B7, - 0xBBF2: 0x6216, - 0xBBF3: 0x60D1, - 0xBBF4: 0x970D, - 0xBBF5: 0x8D27, - 0xBBF6: 0x7978, - 0xBBF7: 0x51FB, - 0xBBF8: 0x573E, - 0xBBF9: 0x57FA, - 0xBBFA: 0x673A, - 0xBBFB: 0x7578, - 0xBBFC: 0x7A3D, - 0xBBFD: 0x79EF, - 0xBBFE: 0x7B95, - 0xBC40: 0x7CBF, - 0xBC41: 0x7CC0, - 0xBC42: 0x7CC2, - 0xBC43: 0x7CC3, - 0xBC44: 0x7CC4, - 0xBC45: 0x7CC6, - 0xBC46: 0x7CC9, - 0xBC47: 0x7CCB, - 0xBC48: 0x7CCE, - 0xBC49: 0x7CCF, - 0xBC4A: 0x7CD0, - 0xBC4B: 0x7CD1, - 0xBC4C: 0x7CD2, - 0xBC4D: 0x7CD3, - 0xBC4E: 0x7CD4, - 0xBC4F: 0x7CD8, - 0xBC50: 0x7CDA, - 0xBC51: 0x7CDB, - 0xBC52: 0x7CDD, - 0xBC53: 0x7CDE, - 0xBC54: 0x7CE1, - 0xBC55: 0x7CE2, - 0xBC56: 0x7CE3, - 0xBC57: 0x7CE4, - 0xBC58: 0x7CE5, - 0xBC59: 0x7CE6, - 0xBC5A: 0x7CE7, - 0xBC5B: 0x7CE9, - 0xBC5C: 0x7CEA, - 0xBC5D: 0x7CEB, - 0xBC5E: 0x7CEC, - 0xBC5F: 0x7CED, - 0xBC60: 0x7CEE, - 0xBC61: 0x7CF0, - 0xBC62: 0x7CF1, - 0xBC63: 0x7CF2, - 0xBC64: 0x7CF3, - 0xBC65: 0x7CF4, - 0xBC66: 0x7CF5, - 0xBC67: 0x7CF6, - 0xBC68: 0x7CF7, - 0xBC69: 0x7CF9, - 0xBC6A: 0x7CFA, - 0xBC6B: 0x7CFC, - 0xBC6C: 0x7CFD, - 0xBC6D: 0x7CFE, - 0xBC6E: 0x7CFF, - 0xBC6F: 0x7D00, - 0xBC70: 0x7D01, - 0xBC71: 0x7D02, - 0xBC72: 0x7D03, - 0xBC73: 0x7D04, - 0xBC74: 0x7D05, - 0xBC75: 0x7D06, - 0xBC76: 0x7D07, - 0xBC77: 0x7D08, - 0xBC78: 0x7D09, - 0xBC79: 0x7D0B, - 0xBC7A: 0x7D0C, - 0xBC7B: 0x7D0D, - 0xBC7C: 0x7D0E, - 0xBC7D: 0x7D0F, - 0xBC7E: 0x7D10, - 0xBC80: 0x7D11, - 0xBC81: 0x7D12, - 0xBC82: 0x7D13, - 0xBC83: 0x7D14, - 0xBC84: 0x7D15, - 0xBC85: 0x7D16, - 0xBC86: 0x7D17, - 0xBC87: 0x7D18, - 0xBC88: 0x7D19, - 0xBC89: 0x7D1A, - 0xBC8A: 0x7D1B, - 0xBC8B: 0x7D1C, - 0xBC8C: 0x7D1D, - 0xBC8D: 0x7D1E, - 0xBC8E: 0x7D1F, - 0xBC8F: 0x7D21, - 0xBC90: 0x7D23, - 0xBC91: 0x7D24, - 0xBC92: 0x7D25, - 0xBC93: 0x7D26, - 0xBC94: 0x7D28, - 0xBC95: 0x7D29, - 0xBC96: 0x7D2A, - 0xBC97: 0x7D2C, - 0xBC98: 0x7D2D, - 0xBC99: 0x7D2E, - 0xBC9A: 0x7D30, - 0xBC9B: 0x7D31, - 0xBC9C: 0x7D32, - 0xBC9D: 0x7D33, - 0xBC9E: 0x7D34, - 0xBC9F: 0x7D35, - 0xBCA0: 0x7D36, - 0xBCA1: 0x808C, - 0xBCA2: 0x9965, - 0xBCA3: 0x8FF9, - 0xBCA4: 0x6FC0, - 0xBCA5: 0x8BA5, - 0xBCA6: 0x9E21, - 0xBCA7: 0x59EC, - 0xBCA8: 0x7EE9, - 0xBCA9: 0x7F09, - 0xBCAA: 0x5409, - 0xBCAB: 0x6781, - 0xBCAC: 0x68D8, - 0xBCAD: 0x8F91, - 0xBCAE: 0x7C4D, - 0xBCAF: 0x96C6, - 0xBCB0: 0x53CA, - 0xBCB1: 0x6025, - 0xBCB2: 0x75BE, - 0xBCB3: 0x6C72, - 0xBCB4: 0x5373, - 0xBCB5: 0x5AC9, - 0xBCB6: 0x7EA7, - 0xBCB7: 0x6324, - 0xBCB8: 0x51E0, - 0xBCB9: 0x810A, - 0xBCBA: 0x5DF1, - 0xBCBB: 0x84DF, - 0xBCBC: 0x6280, - 0xBCBD: 0x5180, - 0xBCBE: 0x5B63, - 0xBCBF: 0x4F0E, - 0xBCC0: 0x796D, - 0xBCC1: 0x5242, - 0xBCC2: 0x60B8, - 0xBCC3: 0x6D4E, - 0xBCC4: 0x5BC4, - 0xBCC5: 0x5BC2, - 0xBCC6: 0x8BA1, - 0xBCC7: 0x8BB0, - 0xBCC8: 0x65E2, - 0xBCC9: 0x5FCC, - 0xBCCA: 0x9645, - 0xBCCB: 0x5993, - 0xBCCC: 0x7EE7, - 0xBCCD: 0x7EAA, - 0xBCCE: 0x5609, - 0xBCCF: 0x67B7, - 0xBCD0: 0x5939, - 0xBCD1: 0x4F73, - 0xBCD2: 0x5BB6, - 0xBCD3: 0x52A0, - 0xBCD4: 0x835A, - 0xBCD5: 0x988A, - 0xBCD6: 0x8D3E, - 0xBCD7: 0x7532, - 0xBCD8: 0x94BE, - 0xBCD9: 0x5047, - 0xBCDA: 0x7A3C, - 0xBCDB: 0x4EF7, - 0xBCDC: 0x67B6, - 0xBCDD: 0x9A7E, - 0xBCDE: 0x5AC1, - 0xBCDF: 0x6B7C, - 0xBCE0: 0x76D1, - 0xBCE1: 0x575A, - 0xBCE2: 0x5C16, - 0xBCE3: 0x7B3A, - 0xBCE4: 0x95F4, - 0xBCE5: 0x714E, - 0xBCE6: 0x517C, - 0xBCE7: 0x80A9, - 0xBCE8: 0x8270, - 0xBCE9: 0x5978, - 0xBCEA: 0x7F04, - 0xBCEB: 0x8327, - 0xBCEC: 0x68C0, - 0xBCED: 0x67EC, - 0xBCEE: 0x78B1, - 0xBCEF: 0x7877, - 0xBCF0: 0x62E3, - 0xBCF1: 0x6361, - 0xBCF2: 0x7B80, - 0xBCF3: 0x4FED, - 0xBCF4: 0x526A, - 0xBCF5: 0x51CF, - 0xBCF6: 0x8350, - 0xBCF7: 0x69DB, - 0xBCF8: 0x9274, - 0xBCF9: 0x8DF5, - 0xBCFA: 0x8D31, - 0xBCFB: 0x89C1, - 0xBCFC: 0x952E, - 0xBCFD: 0x7BAD, - 0xBCFE: 0x4EF6, - 0xBD40: 0x7D37, - 0xBD41: 0x7D38, - 0xBD42: 0x7D39, - 0xBD43: 0x7D3A, - 0xBD44: 0x7D3B, - 0xBD45: 0x7D3C, - 0xBD46: 0x7D3D, - 0xBD47: 0x7D3E, - 0xBD48: 0x7D3F, - 0xBD49: 0x7D40, - 0xBD4A: 0x7D41, - 0xBD4B: 0x7D42, - 0xBD4C: 0x7D43, - 0xBD4D: 0x7D44, - 0xBD4E: 0x7D45, - 0xBD4F: 0x7D46, - 0xBD50: 0x7D47, - 0xBD51: 0x7D48, - 0xBD52: 0x7D49, - 0xBD53: 0x7D4A, - 0xBD54: 0x7D4B, - 0xBD55: 0x7D4C, - 0xBD56: 0x7D4D, - 0xBD57: 0x7D4E, - 0xBD58: 0x7D4F, - 0xBD59: 0x7D50, - 0xBD5A: 0x7D51, - 0xBD5B: 0x7D52, - 0xBD5C: 0x7D53, - 0xBD5D: 0x7D54, - 0xBD5E: 0x7D55, - 0xBD5F: 0x7D56, - 0xBD60: 0x7D57, - 0xBD61: 0x7D58, - 0xBD62: 0x7D59, - 0xBD63: 0x7D5A, - 0xBD64: 0x7D5B, - 0xBD65: 0x7D5C, - 0xBD66: 0x7D5D, - 0xBD67: 0x7D5E, - 0xBD68: 0x7D5F, - 0xBD69: 0x7D60, - 0xBD6A: 0x7D61, - 0xBD6B: 0x7D62, - 0xBD6C: 0x7D63, - 0xBD6D: 0x7D64, - 0xBD6E: 0x7D65, - 0xBD6F: 0x7D66, - 0xBD70: 0x7D67, - 0xBD71: 0x7D68, - 0xBD72: 0x7D69, - 0xBD73: 0x7D6A, - 0xBD74: 0x7D6B, - 0xBD75: 0x7D6C, - 0xBD76: 0x7D6D, - 0xBD77: 0x7D6F, - 0xBD78: 0x7D70, - 0xBD79: 0x7D71, - 0xBD7A: 0x7D72, - 0xBD7B: 0x7D73, - 0xBD7C: 0x7D74, - 0xBD7D: 0x7D75, - 0xBD7E: 0x7D76, - 0xBD80: 0x7D78, - 0xBD81: 0x7D79, - 0xBD82: 0x7D7A, - 0xBD83: 0x7D7B, - 0xBD84: 0x7D7C, - 0xBD85: 0x7D7D, - 0xBD86: 0x7D7E, - 0xBD87: 0x7D7F, - 0xBD88: 0x7D80, - 0xBD89: 0x7D81, - 0xBD8A: 0x7D82, - 0xBD8B: 0x7D83, - 0xBD8C: 0x7D84, - 0xBD8D: 0x7D85, - 0xBD8E: 0x7D86, - 0xBD8F: 0x7D87, - 0xBD90: 0x7D88, - 0xBD91: 0x7D89, - 0xBD92: 0x7D8A, - 0xBD93: 0x7D8B, - 0xBD94: 0x7D8C, - 0xBD95: 0x7D8D, - 0xBD96: 0x7D8E, - 0xBD97: 0x7D8F, - 0xBD98: 0x7D90, - 0xBD99: 0x7D91, - 0xBD9A: 0x7D92, - 0xBD9B: 0x7D93, - 0xBD9C: 0x7D94, - 0xBD9D: 0x7D95, - 0xBD9E: 0x7D96, - 0xBD9F: 0x7D97, - 0xBDA0: 0x7D98, - 0xBDA1: 0x5065, - 0xBDA2: 0x8230, - 0xBDA3: 0x5251, - 0xBDA4: 0x996F, - 0xBDA5: 0x6E10, - 0xBDA6: 0x6E85, - 0xBDA7: 0x6DA7, - 0xBDA8: 0x5EFA, - 0xBDA9: 0x50F5, - 0xBDAA: 0x59DC, - 0xBDAB: 0x5C06, - 0xBDAC: 0x6D46, - 0xBDAD: 0x6C5F, - 0xBDAE: 0x7586, - 0xBDAF: 0x848B, - 0xBDB0: 0x6868, - 0xBDB1: 0x5956, - 0xBDB2: 0x8BB2, - 0xBDB3: 0x5320, - 0xBDB4: 0x9171, - 0xBDB5: 0x964D, - 0xBDB6: 0x8549, - 0xBDB7: 0x6912, - 0xBDB8: 0x7901, - 0xBDB9: 0x7126, - 0xBDBA: 0x80F6, - 0xBDBB: 0x4EA4, - 0xBDBC: 0x90CA, - 0xBDBD: 0x6D47, - 0xBDBE: 0x9A84, - 0xBDBF: 0x5A07, - 0xBDC0: 0x56BC, - 0xBDC1: 0x6405, - 0xBDC2: 0x94F0, - 0xBDC3: 0x77EB, - 0xBDC4: 0x4FA5, - 0xBDC5: 0x811A, - 0xBDC6: 0x72E1, - 0xBDC7: 0x89D2, - 0xBDC8: 0x997A, - 0xBDC9: 0x7F34, - 0xBDCA: 0x7EDE, - 0xBDCB: 0x527F, - 0xBDCC: 0x6559, - 0xBDCD: 0x9175, - 0xBDCE: 0x8F7F, - 0xBDCF: 0x8F83, - 0xBDD0: 0x53EB, - 0xBDD1: 0x7A96, - 0xBDD2: 0x63ED, - 0xBDD3: 0x63A5, - 0xBDD4: 0x7686, - 0xBDD5: 0x79F8, - 0xBDD6: 0x8857, - 0xBDD7: 0x9636, - 0xBDD8: 0x622A, - 0xBDD9: 0x52AB, - 0xBDDA: 0x8282, - 0xBDDB: 0x6854, - 0xBDDC: 0x6770, - 0xBDDD: 0x6377, - 0xBDDE: 0x776B, - 0xBDDF: 0x7AED, - 0xBDE0: 0x6D01, - 0xBDE1: 0x7ED3, - 0xBDE2: 0x89E3, - 0xBDE3: 0x59D0, - 0xBDE4: 0x6212, - 0xBDE5: 0x85C9, - 0xBDE6: 0x82A5, - 0xBDE7: 0x754C, - 0xBDE8: 0x501F, - 0xBDE9: 0x4ECB, - 0xBDEA: 0x75A5, - 0xBDEB: 0x8BEB, - 0xBDEC: 0x5C4A, - 0xBDED: 0x5DFE, - 0xBDEE: 0x7B4B, - 0xBDEF: 0x65A4, - 0xBDF0: 0x91D1, - 0xBDF1: 0x4ECA, - 0xBDF2: 0x6D25, - 0xBDF3: 0x895F, - 0xBDF4: 0x7D27, - 0xBDF5: 0x9526, - 0xBDF6: 0x4EC5, - 0xBDF7: 0x8C28, - 0xBDF8: 0x8FDB, - 0xBDF9: 0x9773, - 0xBDFA: 0x664B, - 0xBDFB: 0x7981, - 0xBDFC: 0x8FD1, - 0xBDFD: 0x70EC, - 0xBDFE: 0x6D78, - 0xBE40: 0x7D99, - 0xBE41: 0x7D9A, - 0xBE42: 0x7D9B, - 0xBE43: 0x7D9C, - 0xBE44: 0x7D9D, - 0xBE45: 0x7D9E, - 0xBE46: 0x7D9F, - 0xBE47: 0x7DA0, - 0xBE48: 0x7DA1, - 0xBE49: 0x7DA2, - 0xBE4A: 0x7DA3, - 0xBE4B: 0x7DA4, - 0xBE4C: 0x7DA5, - 0xBE4D: 0x7DA7, - 0xBE4E: 0x7DA8, - 0xBE4F: 0x7DA9, - 0xBE50: 0x7DAA, - 0xBE51: 0x7DAB, - 0xBE52: 0x7DAC, - 0xBE53: 0x7DAD, - 0xBE54: 0x7DAF, - 0xBE55: 0x7DB0, - 0xBE56: 0x7DB1, - 0xBE57: 0x7DB2, - 0xBE58: 0x7DB3, - 0xBE59: 0x7DB4, - 0xBE5A: 0x7DB5, - 0xBE5B: 0x7DB6, - 0xBE5C: 0x7DB7, - 0xBE5D: 0x7DB8, - 0xBE5E: 0x7DB9, - 0xBE5F: 0x7DBA, - 0xBE60: 0x7DBB, - 0xBE61: 0x7DBC, - 0xBE62: 0x7DBD, - 0xBE63: 0x7DBE, - 0xBE64: 0x7DBF, - 0xBE65: 0x7DC0, - 0xBE66: 0x7DC1, - 0xBE67: 0x7DC2, - 0xBE68: 0x7DC3, - 0xBE69: 0x7DC4, - 0xBE6A: 0x7DC5, - 0xBE6B: 0x7DC6, - 0xBE6C: 0x7DC7, - 0xBE6D: 0x7DC8, - 0xBE6E: 0x7DC9, - 0xBE6F: 0x7DCA, - 0xBE70: 0x7DCB, - 0xBE71: 0x7DCC, - 0xBE72: 0x7DCD, - 0xBE73: 0x7DCE, - 0xBE74: 0x7DCF, - 0xBE75: 0x7DD0, - 0xBE76: 0x7DD1, - 0xBE77: 0x7DD2, - 0xBE78: 0x7DD3, - 0xBE79: 0x7DD4, - 0xBE7A: 0x7DD5, - 0xBE7B: 0x7DD6, - 0xBE7C: 0x7DD7, - 0xBE7D: 0x7DD8, - 0xBE7E: 0x7DD9, - 0xBE80: 0x7DDA, - 0xBE81: 0x7DDB, - 0xBE82: 0x7DDC, - 0xBE83: 0x7DDD, - 0xBE84: 0x7DDE, - 0xBE85: 0x7DDF, - 0xBE86: 0x7DE0, - 0xBE87: 0x7DE1, - 0xBE88: 0x7DE2, - 0xBE89: 0x7DE3, - 0xBE8A: 0x7DE4, - 0xBE8B: 0x7DE5, - 0xBE8C: 0x7DE6, - 0xBE8D: 0x7DE7, - 0xBE8E: 0x7DE8, - 0xBE8F: 0x7DE9, - 0xBE90: 0x7DEA, - 0xBE91: 0x7DEB, - 0xBE92: 0x7DEC, - 0xBE93: 0x7DED, - 0xBE94: 0x7DEE, - 0xBE95: 0x7DEF, - 0xBE96: 0x7DF0, - 0xBE97: 0x7DF1, - 0xBE98: 0x7DF2, - 0xBE99: 0x7DF3, - 0xBE9A: 0x7DF4, - 0xBE9B: 0x7DF5, - 0xBE9C: 0x7DF6, - 0xBE9D: 0x7DF7, - 0xBE9E: 0x7DF8, - 0xBE9F: 0x7DF9, - 0xBEA0: 0x7DFA, - 0xBEA1: 0x5C3D, - 0xBEA2: 0x52B2, - 0xBEA3: 0x8346, - 0xBEA4: 0x5162, - 0xBEA5: 0x830E, - 0xBEA6: 0x775B, - 0xBEA7: 0x6676, - 0xBEA8: 0x9CB8, - 0xBEA9: 0x4EAC, - 0xBEAA: 0x60CA, - 0xBEAB: 0x7CBE, - 0xBEAC: 0x7CB3, - 0xBEAD: 0x7ECF, - 0xBEAE: 0x4E95, - 0xBEAF: 0x8B66, - 0xBEB0: 0x666F, - 0xBEB1: 0x9888, - 0xBEB2: 0x9759, - 0xBEB3: 0x5883, - 0xBEB4: 0x656C, - 0xBEB5: 0x955C, - 0xBEB6: 0x5F84, - 0xBEB7: 0x75C9, - 0xBEB8: 0x9756, - 0xBEB9: 0x7ADF, - 0xBEBA: 0x7ADE, - 0xBEBB: 0x51C0, - 0xBEBC: 0x70AF, - 0xBEBD: 0x7A98, - 0xBEBE: 0x63EA, - 0xBEBF: 0x7A76, - 0xBEC0: 0x7EA0, - 0xBEC1: 0x7396, - 0xBEC2: 0x97ED, - 0xBEC3: 0x4E45, - 0xBEC4: 0x7078, - 0xBEC5: 0x4E5D, - 0xBEC6: 0x9152, - 0xBEC7: 0x53A9, - 0xBEC8: 0x6551, - 0xBEC9: 0x65E7, - 0xBECA: 0x81FC, - 0xBECB: 0x8205, - 0xBECC: 0x548E, - 0xBECD: 0x5C31, - 0xBECE: 0x759A, - 0xBECF: 0x97A0, - 0xBED0: 0x62D8, - 0xBED1: 0x72D9, - 0xBED2: 0x75BD, - 0xBED3: 0x5C45, - 0xBED4: 0x9A79, - 0xBED5: 0x83CA, - 0xBED6: 0x5C40, - 0xBED7: 0x5480, - 0xBED8: 0x77E9, - 0xBED9: 0x4E3E, - 0xBEDA: 0x6CAE, - 0xBEDB: 0x805A, - 0xBEDC: 0x62D2, - 0xBEDD: 0x636E, - 0xBEDE: 0x5DE8, - 0xBEDF: 0x5177, - 0xBEE0: 0x8DDD, - 0xBEE1: 0x8E1E, - 0xBEE2: 0x952F, - 0xBEE3: 0x4FF1, - 0xBEE4: 0x53E5, - 0xBEE5: 0x60E7, - 0xBEE6: 0x70AC, - 0xBEE7: 0x5267, - 0xBEE8: 0x6350, - 0xBEE9: 0x9E43, - 0xBEEA: 0x5A1F, - 0xBEEB: 0x5026, - 0xBEEC: 0x7737, - 0xBEED: 0x5377, - 0xBEEE: 0x7EE2, - 0xBEEF: 0x6485, - 0xBEF0: 0x652B, - 0xBEF1: 0x6289, - 0xBEF2: 0x6398, - 0xBEF3: 0x5014, - 0xBEF4: 0x7235, - 0xBEF5: 0x89C9, - 0xBEF6: 0x51B3, - 0xBEF7: 0x8BC0, - 0xBEF8: 0x7EDD, - 0xBEF9: 0x5747, - 0xBEFA: 0x83CC, - 0xBEFB: 0x94A7, - 0xBEFC: 0x519B, - 0xBEFD: 0x541B, - 0xBEFE: 0x5CFB, - 0xBF40: 0x7DFB, - 0xBF41: 0x7DFC, - 0xBF42: 0x7DFD, - 0xBF43: 0x7DFE, - 0xBF44: 0x7DFF, - 0xBF45: 0x7E00, - 0xBF46: 0x7E01, - 0xBF47: 0x7E02, - 0xBF48: 0x7E03, - 0xBF49: 0x7E04, - 0xBF4A: 0x7E05, - 0xBF4B: 0x7E06, - 0xBF4C: 0x7E07, - 0xBF4D: 0x7E08, - 0xBF4E: 0x7E09, - 0xBF4F: 0x7E0A, - 0xBF50: 0x7E0B, - 0xBF51: 0x7E0C, - 0xBF52: 0x7E0D, - 0xBF53: 0x7E0E, - 0xBF54: 0x7E0F, - 0xBF55: 0x7E10, - 0xBF56: 0x7E11, - 0xBF57: 0x7E12, - 0xBF58: 0x7E13, - 0xBF59: 0x7E14, - 0xBF5A: 0x7E15, - 0xBF5B: 0x7E16, - 0xBF5C: 0x7E17, - 0xBF5D: 0x7E18, - 0xBF5E: 0x7E19, - 0xBF5F: 0x7E1A, - 0xBF60: 0x7E1B, - 0xBF61: 0x7E1C, - 0xBF62: 0x7E1D, - 0xBF63: 0x7E1E, - 0xBF64: 0x7E1F, - 0xBF65: 0x7E20, - 0xBF66: 0x7E21, - 0xBF67: 0x7E22, - 0xBF68: 0x7E23, - 0xBF69: 0x7E24, - 0xBF6A: 0x7E25, - 0xBF6B: 0x7E26, - 0xBF6C: 0x7E27, - 0xBF6D: 0x7E28, - 0xBF6E: 0x7E29, - 0xBF6F: 0x7E2A, - 0xBF70: 0x7E2B, - 0xBF71: 0x7E2C, - 0xBF72: 0x7E2D, - 0xBF73: 0x7E2E, - 0xBF74: 0x7E2F, - 0xBF75: 0x7E30, - 0xBF76: 0x7E31, - 0xBF77: 0x7E32, - 0xBF78: 0x7E33, - 0xBF79: 0x7E34, - 0xBF7A: 0x7E35, - 0xBF7B: 0x7E36, - 0xBF7C: 0x7E37, - 0xBF7D: 0x7E38, - 0xBF7E: 0x7E39, - 0xBF80: 0x7E3A, - 0xBF81: 0x7E3C, - 0xBF82: 0x7E3D, - 0xBF83: 0x7E3E, - 0xBF84: 0x7E3F, - 0xBF85: 0x7E40, - 0xBF86: 0x7E42, - 0xBF87: 0x7E43, - 0xBF88: 0x7E44, - 0xBF89: 0x7E45, - 0xBF8A: 0x7E46, - 0xBF8B: 0x7E48, - 0xBF8C: 0x7E49, - 0xBF8D: 0x7E4A, - 0xBF8E: 0x7E4B, - 0xBF8F: 0x7E4C, - 0xBF90: 0x7E4D, - 0xBF91: 0x7E4E, - 0xBF92: 0x7E4F, - 0xBF93: 0x7E50, - 0xBF94: 0x7E51, - 0xBF95: 0x7E52, - 0xBF96: 0x7E53, - 0xBF97: 0x7E54, - 0xBF98: 0x7E55, - 0xBF99: 0x7E56, - 0xBF9A: 0x7E57, - 0xBF9B: 0x7E58, - 0xBF9C: 0x7E59, - 0xBF9D: 0x7E5A, - 0xBF9E: 0x7E5B, - 0xBF9F: 0x7E5C, - 0xBFA0: 0x7E5D, - 0xBFA1: 0x4FCA, - 0xBFA2: 0x7AE3, - 0xBFA3: 0x6D5A, - 0xBFA4: 0x90E1, - 0xBFA5: 0x9A8F, - 0xBFA6: 0x5580, - 0xBFA7: 0x5496, - 0xBFA8: 0x5361, - 0xBFA9: 0x54AF, - 0xBFAA: 0x5F00, - 0xBFAB: 0x63E9, - 0xBFAC: 0x6977, - 0xBFAD: 0x51EF, - 0xBFAE: 0x6168, - 0xBFAF: 0x520A, - 0xBFB0: 0x582A, - 0xBFB1: 0x52D8, - 0xBFB2: 0x574E, - 0xBFB3: 0x780D, - 0xBFB4: 0x770B, - 0xBFB5: 0x5EB7, - 0xBFB6: 0x6177, - 0xBFB7: 0x7CE0, - 0xBFB8: 0x625B, - 0xBFB9: 0x6297, - 0xBFBA: 0x4EA2, - 0xBFBB: 0x7095, - 0xBFBC: 0x8003, - 0xBFBD: 0x62F7, - 0xBFBE: 0x70E4, - 0xBFBF: 0x9760, - 0xBFC0: 0x5777, - 0xBFC1: 0x82DB, - 0xBFC2: 0x67EF, - 0xBFC3: 0x68F5, - 0xBFC4: 0x78D5, - 0xBFC5: 0x9897, - 0xBFC6: 0x79D1, - 0xBFC7: 0x58F3, - 0xBFC8: 0x54B3, - 0xBFC9: 0x53EF, - 0xBFCA: 0x6E34, - 0xBFCB: 0x514B, - 0xBFCC: 0x523B, - 0xBFCD: 0x5BA2, - 0xBFCE: 0x8BFE, - 0xBFCF: 0x80AF, - 0xBFD0: 0x5543, - 0xBFD1: 0x57A6, - 0xBFD2: 0x6073, - 0xBFD3: 0x5751, - 0xBFD4: 0x542D, - 0xBFD5: 0x7A7A, - 0xBFD6: 0x6050, - 0xBFD7: 0x5B54, - 0xBFD8: 0x63A7, - 0xBFD9: 0x62A0, - 0xBFDA: 0x53E3, - 0xBFDB: 0x6263, - 0xBFDC: 0x5BC7, - 0xBFDD: 0x67AF, - 0xBFDE: 0x54ED, - 0xBFDF: 0x7A9F, - 0xBFE0: 0x82E6, - 0xBFE1: 0x9177, - 0xBFE2: 0x5E93, - 0xBFE3: 0x88E4, - 0xBFE4: 0x5938, - 0xBFE5: 0x57AE, - 0xBFE6: 0x630E, - 0xBFE7: 0x8DE8, - 0xBFE8: 0x80EF, - 0xBFE9: 0x5757, - 0xBFEA: 0x7B77, - 0xBFEB: 0x4FA9, - 0xBFEC: 0x5FEB, - 0xBFED: 0x5BBD, - 0xBFEE: 0x6B3E, - 0xBFEF: 0x5321, - 0xBFF0: 0x7B50, - 0xBFF1: 0x72C2, - 0xBFF2: 0x6846, - 0xBFF3: 0x77FF, - 0xBFF4: 0x7736, - 0xBFF5: 0x65F7, - 0xBFF6: 0x51B5, - 0xBFF7: 0x4E8F, - 0xBFF8: 0x76D4, - 0xBFF9: 0x5CBF, - 0xBFFA: 0x7AA5, - 0xBFFB: 0x8475, - 0xBFFC: 0x594E, - 0xBFFD: 0x9B41, - 0xBFFE: 0x5080, - 0xC040: 0x7E5E, - 0xC041: 0x7E5F, - 0xC042: 0x7E60, - 0xC043: 0x7E61, - 0xC044: 0x7E62, - 0xC045: 0x7E63, - 0xC046: 0x7E64, - 0xC047: 0x7E65, - 0xC048: 0x7E66, - 0xC049: 0x7E67, - 0xC04A: 0x7E68, - 0xC04B: 0x7E69, - 0xC04C: 0x7E6A, - 0xC04D: 0x7E6B, - 0xC04E: 0x7E6C, - 0xC04F: 0x7E6D, - 0xC050: 0x7E6E, - 0xC051: 0x7E6F, - 0xC052: 0x7E70, - 0xC053: 0x7E71, - 0xC054: 0x7E72, - 0xC055: 0x7E73, - 0xC056: 0x7E74, - 0xC057: 0x7E75, - 0xC058: 0x7E76, - 0xC059: 0x7E77, - 0xC05A: 0x7E78, - 0xC05B: 0x7E79, - 0xC05C: 0x7E7A, - 0xC05D: 0x7E7B, - 0xC05E: 0x7E7C, - 0xC05F: 0x7E7D, - 0xC060: 0x7E7E, - 0xC061: 0x7E7F, - 0xC062: 0x7E80, - 0xC063: 0x7E81, - 0xC064: 0x7E83, - 0xC065: 0x7E84, - 0xC066: 0x7E85, - 0xC067: 0x7E86, - 0xC068: 0x7E87, - 0xC069: 0x7E88, - 0xC06A: 0x7E89, - 0xC06B: 0x7E8A, - 0xC06C: 0x7E8B, - 0xC06D: 0x7E8C, - 0xC06E: 0x7E8D, - 0xC06F: 0x7E8E, - 0xC070: 0x7E8F, - 0xC071: 0x7E90, - 0xC072: 0x7E91, - 0xC073: 0x7E92, - 0xC074: 0x7E93, - 0xC075: 0x7E94, - 0xC076: 0x7E95, - 0xC077: 0x7E96, - 0xC078: 0x7E97, - 0xC079: 0x7E98, - 0xC07A: 0x7E99, - 0xC07B: 0x7E9A, - 0xC07C: 0x7E9C, - 0xC07D: 0x7E9D, - 0xC07E: 0x7E9E, - 0xC080: 0x7EAE, - 0xC081: 0x7EB4, - 0xC082: 0x7EBB, - 0xC083: 0x7EBC, - 0xC084: 0x7ED6, - 0xC085: 0x7EE4, - 0xC086: 0x7EEC, - 0xC087: 0x7EF9, - 0xC088: 0x7F0A, - 0xC089: 0x7F10, - 0xC08A: 0x7F1E, - 0xC08B: 0x7F37, - 0xC08C: 0x7F39, - 0xC08D: 0x7F3B, - 0xC08E: 0x7F3C, - 0xC08F: 0x7F3D, - 0xC090: 0x7F3E, - 0xC091: 0x7F3F, - 0xC092: 0x7F40, - 0xC093: 0x7F41, - 0xC094: 0x7F43, - 0xC095: 0x7F46, - 0xC096: 0x7F47, - 0xC097: 0x7F48, - 0xC098: 0x7F49, - 0xC099: 0x7F4A, - 0xC09A: 0x7F4B, - 0xC09B: 0x7F4C, - 0xC09C: 0x7F4D, - 0xC09D: 0x7F4E, - 0xC09E: 0x7F4F, - 0xC09F: 0x7F52, - 0xC0A0: 0x7F53, - 0xC0A1: 0x9988, - 0xC0A2: 0x6127, - 0xC0A3: 0x6E83, - 0xC0A4: 0x5764, - 0xC0A5: 0x6606, - 0xC0A6: 0x6346, - 0xC0A7: 0x56F0, - 0xC0A8: 0x62EC, - 0xC0A9: 0x6269, - 0xC0AA: 0x5ED3, - 0xC0AB: 0x9614, - 0xC0AC: 0x5783, - 0xC0AD: 0x62C9, - 0xC0AE: 0x5587, - 0xC0AF: 0x8721, - 0xC0B0: 0x814A, - 0xC0B1: 0x8FA3, - 0xC0B2: 0x5566, - 0xC0B3: 0x83B1, - 0xC0B4: 0x6765, - 0xC0B5: 0x8D56, - 0xC0B6: 0x84DD, - 0xC0B7: 0x5A6A, - 0xC0B8: 0x680F, - 0xC0B9: 0x62E6, - 0xC0BA: 0x7BEE, - 0xC0BB: 0x9611, - 0xC0BC: 0x5170, - 0xC0BD: 0x6F9C, - 0xC0BE: 0x8C30, - 0xC0BF: 0x63FD, - 0xC0C0: 0x89C8, - 0xC0C1: 0x61D2, - 0xC0C2: 0x7F06, - 0xC0C3: 0x70C2, - 0xC0C4: 0x6EE5, - 0xC0C5: 0x7405, - 0xC0C6: 0x6994, - 0xC0C7: 0x72FC, - 0xC0C8: 0x5ECA, - 0xC0C9: 0x90CE, - 0xC0CA: 0x6717, - 0xC0CB: 0x6D6A, - 0xC0CC: 0x635E, - 0xC0CD: 0x52B3, - 0xC0CE: 0x7262, - 0xC0CF: 0x8001, - 0xC0D0: 0x4F6C, - 0xC0D1: 0x59E5, - 0xC0D2: 0x916A, - 0xC0D3: 0x70D9, - 0xC0D4: 0x6D9D, - 0xC0D5: 0x52D2, - 0xC0D6: 0x4E50, - 0xC0D7: 0x96F7, - 0xC0D8: 0x956D, - 0xC0D9: 0x857E, - 0xC0DA: 0x78CA, - 0xC0DB: 0x7D2F, - 0xC0DC: 0x5121, - 0xC0DD: 0x5792, - 0xC0DE: 0x64C2, - 0xC0DF: 0x808B, - 0xC0E0: 0x7C7B, - 0xC0E1: 0x6CEA, - 0xC0E2: 0x68F1, - 0xC0E3: 0x695E, - 0xC0E4: 0x51B7, - 0xC0E5: 0x5398, - 0xC0E6: 0x68A8, - 0xC0E7: 0x7281, - 0xC0E8: 0x9ECE, - 0xC0E9: 0x7BF1, - 0xC0EA: 0x72F8, - 0xC0EB: 0x79BB, - 0xC0EC: 0x6F13, - 0xC0ED: 0x7406, - 0xC0EE: 0x674E, - 0xC0EF: 0x91CC, - 0xC0F0: 0x9CA4, - 0xC0F1: 0x793C, - 0xC0F2: 0x8389, - 0xC0F3: 0x8354, - 0xC0F4: 0x540F, - 0xC0F5: 0x6817, - 0xC0F6: 0x4E3D, - 0xC0F7: 0x5389, - 0xC0F8: 0x52B1, - 0xC0F9: 0x783E, - 0xC0FA: 0x5386, - 0xC0FB: 0x5229, - 0xC0FC: 0x5088, - 0xC0FD: 0x4F8B, - 0xC0FE: 0x4FD0, - 0xC140: 0x7F56, - 0xC141: 0x7F59, - 0xC142: 0x7F5B, - 0xC143: 0x7F5C, - 0xC144: 0x7F5D, - 0xC145: 0x7F5E, - 0xC146: 0x7F60, - 0xC147: 0x7F63, - 0xC148: 0x7F64, - 0xC149: 0x7F65, - 0xC14A: 0x7F66, - 0xC14B: 0x7F67, - 0xC14C: 0x7F6B, - 0xC14D: 0x7F6C, - 0xC14E: 0x7F6D, - 0xC14F: 0x7F6F, - 0xC150: 0x7F70, - 0xC151: 0x7F73, - 0xC152: 0x7F75, - 0xC153: 0x7F76, - 0xC154: 0x7F77, - 0xC155: 0x7F78, - 0xC156: 0x7F7A, - 0xC157: 0x7F7B, - 0xC158: 0x7F7C, - 0xC159: 0x7F7D, - 0xC15A: 0x7F7F, - 0xC15B: 0x7F80, - 0xC15C: 0x7F82, - 0xC15D: 0x7F83, - 0xC15E: 0x7F84, - 0xC15F: 0x7F85, - 0xC160: 0x7F86, - 0xC161: 0x7F87, - 0xC162: 0x7F88, - 0xC163: 0x7F89, - 0xC164: 0x7F8B, - 0xC165: 0x7F8D, - 0xC166: 0x7F8F, - 0xC167: 0x7F90, - 0xC168: 0x7F91, - 0xC169: 0x7F92, - 0xC16A: 0x7F93, - 0xC16B: 0x7F95, - 0xC16C: 0x7F96, - 0xC16D: 0x7F97, - 0xC16E: 0x7F98, - 0xC16F: 0x7F99, - 0xC170: 0x7F9B, - 0xC171: 0x7F9C, - 0xC172: 0x7FA0, - 0xC173: 0x7FA2, - 0xC174: 0x7FA3, - 0xC175: 0x7FA5, - 0xC176: 0x7FA6, - 0xC177: 0x7FA8, - 0xC178: 0x7FA9, - 0xC179: 0x7FAA, - 0xC17A: 0x7FAB, - 0xC17B: 0x7FAC, - 0xC17C: 0x7FAD, - 0xC17D: 0x7FAE, - 0xC17E: 0x7FB1, - 0xC180: 0x7FB3, - 0xC181: 0x7FB4, - 0xC182: 0x7FB5, - 0xC183: 0x7FB6, - 0xC184: 0x7FB7, - 0xC185: 0x7FBA, - 0xC186: 0x7FBB, - 0xC187: 0x7FBE, - 0xC188: 0x7FC0, - 0xC189: 0x7FC2, - 0xC18A: 0x7FC3, - 0xC18B: 0x7FC4, - 0xC18C: 0x7FC6, - 0xC18D: 0x7FC7, - 0xC18E: 0x7FC8, - 0xC18F: 0x7FC9, - 0xC190: 0x7FCB, - 0xC191: 0x7FCD, - 0xC192: 0x7FCF, - 0xC193: 0x7FD0, - 0xC194: 0x7FD1, - 0xC195: 0x7FD2, - 0xC196: 0x7FD3, - 0xC197: 0x7FD6, - 0xC198: 0x7FD7, - 0xC199: 0x7FD9, - 0xC19A: 0x7FDA, - 0xC19B: 0x7FDB, - 0xC19C: 0x7FDC, - 0xC19D: 0x7FDD, - 0xC19E: 0x7FDE, - 0xC19F: 0x7FE2, - 0xC1A0: 0x7FE3, - 0xC1A1: 0x75E2, - 0xC1A2: 0x7ACB, - 0xC1A3: 0x7C92, - 0xC1A4: 0x6CA5, - 0xC1A5: 0x96B6, - 0xC1A6: 0x529B, - 0xC1A7: 0x7483, - 0xC1A8: 0x54E9, - 0xC1A9: 0x4FE9, - 0xC1AA: 0x8054, - 0xC1AB: 0x83B2, - 0xC1AC: 0x8FDE, - 0xC1AD: 0x9570, - 0xC1AE: 0x5EC9, - 0xC1AF: 0x601C, - 0xC1B0: 0x6D9F, - 0xC1B1: 0x5E18, - 0xC1B2: 0x655B, - 0xC1B3: 0x8138, - 0xC1B4: 0x94FE, - 0xC1B5: 0x604B, - 0xC1B6: 0x70BC, - 0xC1B7: 0x7EC3, - 0xC1B8: 0x7CAE, - 0xC1B9: 0x51C9, - 0xC1BA: 0x6881, - 0xC1BB: 0x7CB1, - 0xC1BC: 0x826F, - 0xC1BD: 0x4E24, - 0xC1BE: 0x8F86, - 0xC1BF: 0x91CF, - 0xC1C0: 0x667E, - 0xC1C1: 0x4EAE, - 0xC1C2: 0x8C05, - 0xC1C3: 0x64A9, - 0xC1C4: 0x804A, - 0xC1C5: 0x50DA, - 0xC1C6: 0x7597, - 0xC1C7: 0x71CE, - 0xC1C8: 0x5BE5, - 0xC1C9: 0x8FBD, - 0xC1CA: 0x6F66, - 0xC1CB: 0x4E86, - 0xC1CC: 0x6482, - 0xC1CD: 0x9563, - 0xC1CE: 0x5ED6, - 0xC1CF: 0x6599, - 0xC1D0: 0x5217, - 0xC1D1: 0x88C2, - 0xC1D2: 0x70C8, - 0xC1D3: 0x52A3, - 0xC1D4: 0x730E, - 0xC1D5: 0x7433, - 0xC1D6: 0x6797, - 0xC1D7: 0x78F7, - 0xC1D8: 0x9716, - 0xC1D9: 0x4E34, - 0xC1DA: 0x90BB, - 0xC1DB: 0x9CDE, - 0xC1DC: 0x6DCB, - 0xC1DD: 0x51DB, - 0xC1DE: 0x8D41, - 0xC1DF: 0x541D, - 0xC1E0: 0x62CE, - 0xC1E1: 0x73B2, - 0xC1E2: 0x83F1, - 0xC1E3: 0x96F6, - 0xC1E4: 0x9F84, - 0xC1E5: 0x94C3, - 0xC1E6: 0x4F36, - 0xC1E7: 0x7F9A, - 0xC1E8: 0x51CC, - 0xC1E9: 0x7075, - 0xC1EA: 0x9675, - 0xC1EB: 0x5CAD, - 0xC1EC: 0x9886, - 0xC1ED: 0x53E6, - 0xC1EE: 0x4EE4, - 0xC1EF: 0x6E9C, - 0xC1F0: 0x7409, - 0xC1F1: 0x69B4, - 0xC1F2: 0x786B, - 0xC1F3: 0x998F, - 0xC1F4: 0x7559, - 0xC1F5: 0x5218, - 0xC1F6: 0x7624, - 0xC1F7: 0x6D41, - 0xC1F8: 0x67F3, - 0xC1F9: 0x516D, - 0xC1FA: 0x9F99, - 0xC1FB: 0x804B, - 0xC1FC: 0x5499, - 0xC1FD: 0x7B3C, - 0xC1FE: 0x7ABF, - 0xC240: 0x7FE4, - 0xC241: 0x7FE7, - 0xC242: 0x7FE8, - 0xC243: 0x7FEA, - 0xC244: 0x7FEB, - 0xC245: 0x7FEC, - 0xC246: 0x7FED, - 0xC247: 0x7FEF, - 0xC248: 0x7FF2, - 0xC249: 0x7FF4, - 0xC24A: 0x7FF5, - 0xC24B: 0x7FF6, - 0xC24C: 0x7FF7, - 0xC24D: 0x7FF8, - 0xC24E: 0x7FF9, - 0xC24F: 0x7FFA, - 0xC250: 0x7FFD, - 0xC251: 0x7FFE, - 0xC252: 0x7FFF, - 0xC253: 0x8002, - 0xC254: 0x8007, - 0xC255: 0x8008, - 0xC256: 0x8009, - 0xC257: 0x800A, - 0xC258: 0x800E, - 0xC259: 0x800F, - 0xC25A: 0x8011, - 0xC25B: 0x8013, - 0xC25C: 0x801A, - 0xC25D: 0x801B, - 0xC25E: 0x801D, - 0xC25F: 0x801E, - 0xC260: 0x801F, - 0xC261: 0x8021, - 0xC262: 0x8023, - 0xC263: 0x8024, - 0xC264: 0x802B, - 0xC265: 0x802C, - 0xC266: 0x802D, - 0xC267: 0x802E, - 0xC268: 0x802F, - 0xC269: 0x8030, - 0xC26A: 0x8032, - 0xC26B: 0x8034, - 0xC26C: 0x8039, - 0xC26D: 0x803A, - 0xC26E: 0x803C, - 0xC26F: 0x803E, - 0xC270: 0x8040, - 0xC271: 0x8041, - 0xC272: 0x8044, - 0xC273: 0x8045, - 0xC274: 0x8047, - 0xC275: 0x8048, - 0xC276: 0x8049, - 0xC277: 0x804E, - 0xC278: 0x804F, - 0xC279: 0x8050, - 0xC27A: 0x8051, - 0xC27B: 0x8053, - 0xC27C: 0x8055, - 0xC27D: 0x8056, - 0xC27E: 0x8057, - 0xC280: 0x8059, - 0xC281: 0x805B, - 0xC282: 0x805C, - 0xC283: 0x805D, - 0xC284: 0x805E, - 0xC285: 0x805F, - 0xC286: 0x8060, - 0xC287: 0x8061, - 0xC288: 0x8062, - 0xC289: 0x8063, - 0xC28A: 0x8064, - 0xC28B: 0x8065, - 0xC28C: 0x8066, - 0xC28D: 0x8067, - 0xC28E: 0x8068, - 0xC28F: 0x806B, - 0xC290: 0x806C, - 0xC291: 0x806D, - 0xC292: 0x806E, - 0xC293: 0x806F, - 0xC294: 0x8070, - 0xC295: 0x8072, - 0xC296: 0x8073, - 0xC297: 0x8074, - 0xC298: 0x8075, - 0xC299: 0x8076, - 0xC29A: 0x8077, - 0xC29B: 0x8078, - 0xC29C: 0x8079, - 0xC29D: 0x807A, - 0xC29E: 0x807B, - 0xC29F: 0x807C, - 0xC2A0: 0x807D, - 0xC2A1: 0x9686, - 0xC2A2: 0x5784, - 0xC2A3: 0x62E2, - 0xC2A4: 0x9647, - 0xC2A5: 0x697C, - 0xC2A6: 0x5A04, - 0xC2A7: 0x6402, - 0xC2A8: 0x7BD3, - 0xC2A9: 0x6F0F, - 0xC2AA: 0x964B, - 0xC2AB: 0x82A6, - 0xC2AC: 0x5362, - 0xC2AD: 0x9885, - 0xC2AE: 0x5E90, - 0xC2AF: 0x7089, - 0xC2B0: 0x63B3, - 0xC2B1: 0x5364, - 0xC2B2: 0x864F, - 0xC2B3: 0x9C81, - 0xC2B4: 0x9E93, - 0xC2B5: 0x788C, - 0xC2B6: 0x9732, - 0xC2B7: 0x8DEF, - 0xC2B8: 0x8D42, - 0xC2B9: 0x9E7F, - 0xC2BA: 0x6F5E, - 0xC2BB: 0x7984, - 0xC2BC: 0x5F55, - 0xC2BD: 0x9646, - 0xC2BE: 0x622E, - 0xC2BF: 0x9A74, - 0xC2C0: 0x5415, - 0xC2C1: 0x94DD, - 0xC2C2: 0x4FA3, - 0xC2C3: 0x65C5, - 0xC2C4: 0x5C65, - 0xC2C5: 0x5C61, - 0xC2C6: 0x7F15, - 0xC2C7: 0x8651, - 0xC2C8: 0x6C2F, - 0xC2C9: 0x5F8B, - 0xC2CA: 0x7387, - 0xC2CB: 0x6EE4, - 0xC2CC: 0x7EFF, - 0xC2CD: 0x5CE6, - 0xC2CE: 0x631B, - 0xC2CF: 0x5B6A, - 0xC2D0: 0x6EE6, - 0xC2D1: 0x5375, - 0xC2D2: 0x4E71, - 0xC2D3: 0x63A0, - 0xC2D4: 0x7565, - 0xC2D5: 0x62A1, - 0xC2D6: 0x8F6E, - 0xC2D7: 0x4F26, - 0xC2D8: 0x4ED1, - 0xC2D9: 0x6CA6, - 0xC2DA: 0x7EB6, - 0xC2DB: 0x8BBA, - 0xC2DC: 0x841D, - 0xC2DD: 0x87BA, - 0xC2DE: 0x7F57, - 0xC2DF: 0x903B, - 0xC2E0: 0x9523, - 0xC2E1: 0x7BA9, - 0xC2E2: 0x9AA1, - 0xC2E3: 0x88F8, - 0xC2E4: 0x843D, - 0xC2E5: 0x6D1B, - 0xC2E6: 0x9A86, - 0xC2E7: 0x7EDC, - 0xC2E8: 0x5988, - 0xC2E9: 0x9EBB, - 0xC2EA: 0x739B, - 0xC2EB: 0x7801, - 0xC2EC: 0x8682, - 0xC2ED: 0x9A6C, - 0xC2EE: 0x9A82, - 0xC2EF: 0x561B, - 0xC2F0: 0x5417, - 0xC2F1: 0x57CB, - 0xC2F2: 0x4E70, - 0xC2F3: 0x9EA6, - 0xC2F4: 0x5356, - 0xC2F5: 0x8FC8, - 0xC2F6: 0x8109, - 0xC2F7: 0x7792, - 0xC2F8: 0x9992, - 0xC2F9: 0x86EE, - 0xC2FA: 0x6EE1, - 0xC2FB: 0x8513, - 0xC2FC: 0x66FC, - 0xC2FD: 0x6162, - 0xC2FE: 0x6F2B, - 0xC340: 0x807E, - 0xC341: 0x8081, - 0xC342: 0x8082, - 0xC343: 0x8085, - 0xC344: 0x8088, - 0xC345: 0x808A, - 0xC346: 0x808D, - 0xC347: 0x808E, - 0xC348: 0x808F, - 0xC349: 0x8090, - 0xC34A: 0x8091, - 0xC34B: 0x8092, - 0xC34C: 0x8094, - 0xC34D: 0x8095, - 0xC34E: 0x8097, - 0xC34F: 0x8099, - 0xC350: 0x809E, - 0xC351: 0x80A3, - 0xC352: 0x80A6, - 0xC353: 0x80A7, - 0xC354: 0x80A8, - 0xC355: 0x80AC, - 0xC356: 0x80B0, - 0xC357: 0x80B3, - 0xC358: 0x80B5, - 0xC359: 0x80B6, - 0xC35A: 0x80B8, - 0xC35B: 0x80B9, - 0xC35C: 0x80BB, - 0xC35D: 0x80C5, - 0xC35E: 0x80C7, - 0xC35F: 0x80C8, - 0xC360: 0x80C9, - 0xC361: 0x80CA, - 0xC362: 0x80CB, - 0xC363: 0x80CF, - 0xC364: 0x80D0, - 0xC365: 0x80D1, - 0xC366: 0x80D2, - 0xC367: 0x80D3, - 0xC368: 0x80D4, - 0xC369: 0x80D5, - 0xC36A: 0x80D8, - 0xC36B: 0x80DF, - 0xC36C: 0x80E0, - 0xC36D: 0x80E2, - 0xC36E: 0x80E3, - 0xC36F: 0x80E6, - 0xC370: 0x80EE, - 0xC371: 0x80F5, - 0xC372: 0x80F7, - 0xC373: 0x80F9, - 0xC374: 0x80FB, - 0xC375: 0x80FE, - 0xC376: 0x80FF, - 0xC377: 0x8100, - 0xC378: 0x8101, - 0xC379: 0x8103, - 0xC37A: 0x8104, - 0xC37B: 0x8105, - 0xC37C: 0x8107, - 0xC37D: 0x8108, - 0xC37E: 0x810B, - 0xC380: 0x810C, - 0xC381: 0x8115, - 0xC382: 0x8117, - 0xC383: 0x8119, - 0xC384: 0x811B, - 0xC385: 0x811C, - 0xC386: 0x811D, - 0xC387: 0x811F, - 0xC388: 0x8120, - 0xC389: 0x8121, - 0xC38A: 0x8122, - 0xC38B: 0x8123, - 0xC38C: 0x8124, - 0xC38D: 0x8125, - 0xC38E: 0x8126, - 0xC38F: 0x8127, - 0xC390: 0x8128, - 0xC391: 0x8129, - 0xC392: 0x812A, - 0xC393: 0x812B, - 0xC394: 0x812D, - 0xC395: 0x812E, - 0xC396: 0x8130, - 0xC397: 0x8133, - 0xC398: 0x8134, - 0xC399: 0x8135, - 0xC39A: 0x8137, - 0xC39B: 0x8139, - 0xC39C: 0x813A, - 0xC39D: 0x813B, - 0xC39E: 0x813C, - 0xC39F: 0x813D, - 0xC3A0: 0x813F, - 0xC3A1: 0x8C29, - 0xC3A2: 0x8292, - 0xC3A3: 0x832B, - 0xC3A4: 0x76F2, - 0xC3A5: 0x6C13, - 0xC3A6: 0x5FD9, - 0xC3A7: 0x83BD, - 0xC3A8: 0x732B, - 0xC3A9: 0x8305, - 0xC3AA: 0x951A, - 0xC3AB: 0x6BDB, - 0xC3AC: 0x77DB, - 0xC3AD: 0x94C6, - 0xC3AE: 0x536F, - 0xC3AF: 0x8302, - 0xC3B0: 0x5192, - 0xC3B1: 0x5E3D, - 0xC3B2: 0x8C8C, - 0xC3B3: 0x8D38, - 0xC3B4: 0x4E48, - 0xC3B5: 0x73AB, - 0xC3B6: 0x679A, - 0xC3B7: 0x6885, - 0xC3B8: 0x9176, - 0xC3B9: 0x9709, - 0xC3BA: 0x7164, - 0xC3BB: 0x6CA1, - 0xC3BC: 0x7709, - 0xC3BD: 0x5A92, - 0xC3BE: 0x9541, - 0xC3BF: 0x6BCF, - 0xC3C0: 0x7F8E, - 0xC3C1: 0x6627, - 0xC3C2: 0x5BD0, - 0xC3C3: 0x59B9, - 0xC3C4: 0x5A9A, - 0xC3C5: 0x95E8, - 0xC3C6: 0x95F7, - 0xC3C7: 0x4EEC, - 0xC3C8: 0x840C, - 0xC3C9: 0x8499, - 0xC3CA: 0x6AAC, - 0xC3CB: 0x76DF, - 0xC3CC: 0x9530, - 0xC3CD: 0x731B, - 0xC3CE: 0x68A6, - 0xC3CF: 0x5B5F, - 0xC3D0: 0x772F, - 0xC3D1: 0x919A, - 0xC3D2: 0x9761, - 0xC3D3: 0x7CDC, - 0xC3D4: 0x8FF7, - 0xC3D5: 0x8C1C, - 0xC3D6: 0x5F25, - 0xC3D7: 0x7C73, - 0xC3D8: 0x79D8, - 0xC3D9: 0x89C5, - 0xC3DA: 0x6CCC, - 0xC3DB: 0x871C, - 0xC3DC: 0x5BC6, - 0xC3DD: 0x5E42, - 0xC3DE: 0x68C9, - 0xC3DF: 0x7720, - 0xC3E0: 0x7EF5, - 0xC3E1: 0x5195, - 0xC3E2: 0x514D, - 0xC3E3: 0x52C9, - 0xC3E4: 0x5A29, - 0xC3E5: 0x7F05, - 0xC3E6: 0x9762, - 0xC3E7: 0x82D7, - 0xC3E8: 0x63CF, - 0xC3E9: 0x7784, - 0xC3EA: 0x85D0, - 0xC3EB: 0x79D2, - 0xC3EC: 0x6E3A, - 0xC3ED: 0x5E99, - 0xC3EE: 0x5999, - 0xC3EF: 0x8511, - 0xC3F0: 0x706D, - 0xC3F1: 0x6C11, - 0xC3F2: 0x62BF, - 0xC3F3: 0x76BF, - 0xC3F4: 0x654F, - 0xC3F5: 0x60AF, - 0xC3F6: 0x95FD, - 0xC3F7: 0x660E, - 0xC3F8: 0x879F, - 0xC3F9: 0x9E23, - 0xC3FA: 0x94ED, - 0xC3FB: 0x540D, - 0xC3FC: 0x547D, - 0xC3FD: 0x8C2C, - 0xC3FE: 0x6478, - 0xC440: 0x8140, - 0xC441: 0x8141, - 0xC442: 0x8142, - 0xC443: 0x8143, - 0xC444: 0x8144, - 0xC445: 0x8145, - 0xC446: 0x8147, - 0xC447: 0x8149, - 0xC448: 0x814D, - 0xC449: 0x814E, - 0xC44A: 0x814F, - 0xC44B: 0x8152, - 0xC44C: 0x8156, - 0xC44D: 0x8157, - 0xC44E: 0x8158, - 0xC44F: 0x815B, - 0xC450: 0x815C, - 0xC451: 0x815D, - 0xC452: 0x815E, - 0xC453: 0x815F, - 0xC454: 0x8161, - 0xC455: 0x8162, - 0xC456: 0x8163, - 0xC457: 0x8164, - 0xC458: 0x8166, - 0xC459: 0x8168, - 0xC45A: 0x816A, - 0xC45B: 0x816B, - 0xC45C: 0x816C, - 0xC45D: 0x816F, - 0xC45E: 0x8172, - 0xC45F: 0x8173, - 0xC460: 0x8175, - 0xC461: 0x8176, - 0xC462: 0x8177, - 0xC463: 0x8178, - 0xC464: 0x8181, - 0xC465: 0x8183, - 0xC466: 0x8184, - 0xC467: 0x8185, - 0xC468: 0x8186, - 0xC469: 0x8187, - 0xC46A: 0x8189, - 0xC46B: 0x818B, - 0xC46C: 0x818C, - 0xC46D: 0x818D, - 0xC46E: 0x818E, - 0xC46F: 0x8190, - 0xC470: 0x8192, - 0xC471: 0x8193, - 0xC472: 0x8194, - 0xC473: 0x8195, - 0xC474: 0x8196, - 0xC475: 0x8197, - 0xC476: 0x8199, - 0xC477: 0x819A, - 0xC478: 0x819E, - 0xC479: 0x819F, - 0xC47A: 0x81A0, - 0xC47B: 0x81A1, - 0xC47C: 0x81A2, - 0xC47D: 0x81A4, - 0xC47E: 0x81A5, - 0xC480: 0x81A7, - 0xC481: 0x81A9, - 0xC482: 0x81AB, - 0xC483: 0x81AC, - 0xC484: 0x81AD, - 0xC485: 0x81AE, - 0xC486: 0x81AF, - 0xC487: 0x81B0, - 0xC488: 0x81B1, - 0xC489: 0x81B2, - 0xC48A: 0x81B4, - 0xC48B: 0x81B5, - 0xC48C: 0x81B6, - 0xC48D: 0x81B7, - 0xC48E: 0x81B8, - 0xC48F: 0x81B9, - 0xC490: 0x81BC, - 0xC491: 0x81BD, - 0xC492: 0x81BE, - 0xC493: 0x81BF, - 0xC494: 0x81C4, - 0xC495: 0x81C5, - 0xC496: 0x81C7, - 0xC497: 0x81C8, - 0xC498: 0x81C9, - 0xC499: 0x81CB, - 0xC49A: 0x81CD, - 0xC49B: 0x81CE, - 0xC49C: 0x81CF, - 0xC49D: 0x81D0, - 0xC49E: 0x81D1, - 0xC49F: 0x81D2, - 0xC4A0: 0x81D3, - 0xC4A1: 0x6479, - 0xC4A2: 0x8611, - 0xC4A3: 0x6A21, - 0xC4A4: 0x819C, - 0xC4A5: 0x78E8, - 0xC4A6: 0x6469, - 0xC4A7: 0x9B54, - 0xC4A8: 0x62B9, - 0xC4A9: 0x672B, - 0xC4AA: 0x83AB, - 0xC4AB: 0x58A8, - 0xC4AC: 0x9ED8, - 0xC4AD: 0x6CAB, - 0xC4AE: 0x6F20, - 0xC4AF: 0x5BDE, - 0xC4B0: 0x964C, - 0xC4B1: 0x8C0B, - 0xC4B2: 0x725F, - 0xC4B3: 0x67D0, - 0xC4B4: 0x62C7, - 0xC4B5: 0x7261, - 0xC4B6: 0x4EA9, - 0xC4B7: 0x59C6, - 0xC4B8: 0x6BCD, - 0xC4B9: 0x5893, - 0xC4BA: 0x66AE, - 0xC4BB: 0x5E55, - 0xC4BC: 0x52DF, - 0xC4BD: 0x6155, - 0xC4BE: 0x6728, - 0xC4BF: 0x76EE, - 0xC4C0: 0x7766, - 0xC4C1: 0x7267, - 0xC4C2: 0x7A46, - 0xC4C3: 0x62FF, - 0xC4C4: 0x54EA, - 0xC4C5: 0x5450, - 0xC4C6: 0x94A0, - 0xC4C7: 0x90A3, - 0xC4C8: 0x5A1C, - 0xC4C9: 0x7EB3, - 0xC4CA: 0x6C16, - 0xC4CB: 0x4E43, - 0xC4CC: 0x5976, - 0xC4CD: 0x8010, - 0xC4CE: 0x5948, - 0xC4CF: 0x5357, - 0xC4D0: 0x7537, - 0xC4D1: 0x96BE, - 0xC4D2: 0x56CA, - 0xC4D3: 0x6320, - 0xC4D4: 0x8111, - 0xC4D5: 0x607C, - 0xC4D6: 0x95F9, - 0xC4D7: 0x6DD6, - 0xC4D8: 0x5462, - 0xC4D9: 0x9981, - 0xC4DA: 0x5185, - 0xC4DB: 0x5AE9, - 0xC4DC: 0x80FD, - 0xC4DD: 0x59AE, - 0xC4DE: 0x9713, - 0xC4DF: 0x502A, - 0xC4E0: 0x6CE5, - 0xC4E1: 0x5C3C, - 0xC4E2: 0x62DF, - 0xC4E3: 0x4F60, - 0xC4E4: 0x533F, - 0xC4E5: 0x817B, - 0xC4E6: 0x9006, - 0xC4E7: 0x6EBA, - 0xC4E8: 0x852B, - 0xC4E9: 0x62C8, - 0xC4EA: 0x5E74, - 0xC4EB: 0x78BE, - 0xC4EC: 0x64B5, - 0xC4ED: 0x637B, - 0xC4EE: 0x5FF5, - 0xC4EF: 0x5A18, - 0xC4F0: 0x917F, - 0xC4F1: 0x9E1F, - 0xC4F2: 0x5C3F, - 0xC4F3: 0x634F, - 0xC4F4: 0x8042, - 0xC4F5: 0x5B7D, - 0xC4F6: 0x556E, - 0xC4F7: 0x954A, - 0xC4F8: 0x954D, - 0xC4F9: 0x6D85, - 0xC4FA: 0x60A8, - 0xC4FB: 0x67E0, - 0xC4FC: 0x72DE, - 0xC4FD: 0x51DD, - 0xC4FE: 0x5B81, - 0xC540: 0x81D4, - 0xC541: 0x81D5, - 0xC542: 0x81D6, - 0xC543: 0x81D7, - 0xC544: 0x81D8, - 0xC545: 0x81D9, - 0xC546: 0x81DA, - 0xC547: 0x81DB, - 0xC548: 0x81DC, - 0xC549: 0x81DD, - 0xC54A: 0x81DE, - 0xC54B: 0x81DF, - 0xC54C: 0x81E0, - 0xC54D: 0x81E1, - 0xC54E: 0x81E2, - 0xC54F: 0x81E4, - 0xC550: 0x81E5, - 0xC551: 0x81E6, - 0xC552: 0x81E8, - 0xC553: 0x81E9, - 0xC554: 0x81EB, - 0xC555: 0x81EE, - 0xC556: 0x81EF, - 0xC557: 0x81F0, - 0xC558: 0x81F1, - 0xC559: 0x81F2, - 0xC55A: 0x81F5, - 0xC55B: 0x81F6, - 0xC55C: 0x81F7, - 0xC55D: 0x81F8, - 0xC55E: 0x81F9, - 0xC55F: 0x81FA, - 0xC560: 0x81FD, - 0xC561: 0x81FF, - 0xC562: 0x8203, - 0xC563: 0x8207, - 0xC564: 0x8208, - 0xC565: 0x8209, - 0xC566: 0x820A, - 0xC567: 0x820B, - 0xC568: 0x820E, - 0xC569: 0x820F, - 0xC56A: 0x8211, - 0xC56B: 0x8213, - 0xC56C: 0x8215, - 0xC56D: 0x8216, - 0xC56E: 0x8217, - 0xC56F: 0x8218, - 0xC570: 0x8219, - 0xC571: 0x821A, - 0xC572: 0x821D, - 0xC573: 0x8220, - 0xC574: 0x8224, - 0xC575: 0x8225, - 0xC576: 0x8226, - 0xC577: 0x8227, - 0xC578: 0x8229, - 0xC579: 0x822E, - 0xC57A: 0x8232, - 0xC57B: 0x823A, - 0xC57C: 0x823C, - 0xC57D: 0x823D, - 0xC57E: 0x823F, - 0xC580: 0x8240, - 0xC581: 0x8241, - 0xC582: 0x8242, - 0xC583: 0x8243, - 0xC584: 0x8245, - 0xC585: 0x8246, - 0xC586: 0x8248, - 0xC587: 0x824A, - 0xC588: 0x824C, - 0xC589: 0x824D, - 0xC58A: 0x824E, - 0xC58B: 0x8250, - 0xC58C: 0x8251, - 0xC58D: 0x8252, - 0xC58E: 0x8253, - 0xC58F: 0x8254, - 0xC590: 0x8255, - 0xC591: 0x8256, - 0xC592: 0x8257, - 0xC593: 0x8259, - 0xC594: 0x825B, - 0xC595: 0x825C, - 0xC596: 0x825D, - 0xC597: 0x825E, - 0xC598: 0x8260, - 0xC599: 0x8261, - 0xC59A: 0x8262, - 0xC59B: 0x8263, - 0xC59C: 0x8264, - 0xC59D: 0x8265, - 0xC59E: 0x8266, - 0xC59F: 0x8267, - 0xC5A0: 0x8269, - 0xC5A1: 0x62E7, - 0xC5A2: 0x6CDE, - 0xC5A3: 0x725B, - 0xC5A4: 0x626D, - 0xC5A5: 0x94AE, - 0xC5A6: 0x7EBD, - 0xC5A7: 0x8113, - 0xC5A8: 0x6D53, - 0xC5A9: 0x519C, - 0xC5AA: 0x5F04, - 0xC5AB: 0x5974, - 0xC5AC: 0x52AA, - 0xC5AD: 0x6012, - 0xC5AE: 0x5973, - 0xC5AF: 0x6696, - 0xC5B0: 0x8650, - 0xC5B1: 0x759F, - 0xC5B2: 0x632A, - 0xC5B3: 0x61E6, - 0xC5B4: 0x7CEF, - 0xC5B5: 0x8BFA, - 0xC5B6: 0x54E6, - 0xC5B7: 0x6B27, - 0xC5B8: 0x9E25, - 0xC5B9: 0x6BB4, - 0xC5BA: 0x85D5, - 0xC5BB: 0x5455, - 0xC5BC: 0x5076, - 0xC5BD: 0x6CA4, - 0xC5BE: 0x556A, - 0xC5BF: 0x8DB4, - 0xC5C0: 0x722C, - 0xC5C1: 0x5E15, - 0xC5C2: 0x6015, - 0xC5C3: 0x7436, - 0xC5C4: 0x62CD, - 0xC5C5: 0x6392, - 0xC5C6: 0x724C, - 0xC5C7: 0x5F98, - 0xC5C8: 0x6E43, - 0xC5C9: 0x6D3E, - 0xC5CA: 0x6500, - 0xC5CB: 0x6F58, - 0xC5CC: 0x76D8, - 0xC5CD: 0x78D0, - 0xC5CE: 0x76FC, - 0xC5CF: 0x7554, - 0xC5D0: 0x5224, - 0xC5D1: 0x53DB, - 0xC5D2: 0x4E53, - 0xC5D3: 0x5E9E, - 0xC5D4: 0x65C1, - 0xC5D5: 0x802A, - 0xC5D6: 0x80D6, - 0xC5D7: 0x629B, - 0xC5D8: 0x5486, - 0xC5D9: 0x5228, - 0xC5DA: 0x70AE, - 0xC5DB: 0x888D, - 0xC5DC: 0x8DD1, - 0xC5DD: 0x6CE1, - 0xC5DE: 0x5478, - 0xC5DF: 0x80DA, - 0xC5E0: 0x57F9, - 0xC5E1: 0x88F4, - 0xC5E2: 0x8D54, - 0xC5E3: 0x966A, - 0xC5E4: 0x914D, - 0xC5E5: 0x4F69, - 0xC5E6: 0x6C9B, - 0xC5E7: 0x55B7, - 0xC5E8: 0x76C6, - 0xC5E9: 0x7830, - 0xC5EA: 0x62A8, - 0xC5EB: 0x70F9, - 0xC5EC: 0x6F8E, - 0xC5ED: 0x5F6D, - 0xC5EE: 0x84EC, - 0xC5EF: 0x68DA, - 0xC5F0: 0x787C, - 0xC5F1: 0x7BF7, - 0xC5F2: 0x81A8, - 0xC5F3: 0x670B, - 0xC5F4: 0x9E4F, - 0xC5F5: 0x6367, - 0xC5F6: 0x78B0, - 0xC5F7: 0x576F, - 0xC5F8: 0x7812, - 0xC5F9: 0x9739, - 0xC5FA: 0x6279, - 0xC5FB: 0x62AB, - 0xC5FC: 0x5288, - 0xC5FD: 0x7435, - 0xC5FE: 0x6BD7, - 0xC640: 0x826A, - 0xC641: 0x826B, - 0xC642: 0x826C, - 0xC643: 0x826D, - 0xC644: 0x8271, - 0xC645: 0x8275, - 0xC646: 0x8276, - 0xC647: 0x8277, - 0xC648: 0x8278, - 0xC649: 0x827B, - 0xC64A: 0x827C, - 0xC64B: 0x8280, - 0xC64C: 0x8281, - 0xC64D: 0x8283, - 0xC64E: 0x8285, - 0xC64F: 0x8286, - 0xC650: 0x8287, - 0xC651: 0x8289, - 0xC652: 0x828C, - 0xC653: 0x8290, - 0xC654: 0x8293, - 0xC655: 0x8294, - 0xC656: 0x8295, - 0xC657: 0x8296, - 0xC658: 0x829A, - 0xC659: 0x829B, - 0xC65A: 0x829E, - 0xC65B: 0x82A0, - 0xC65C: 0x82A2, - 0xC65D: 0x82A3, - 0xC65E: 0x82A7, - 0xC65F: 0x82B2, - 0xC660: 0x82B5, - 0xC661: 0x82B6, - 0xC662: 0x82BA, - 0xC663: 0x82BB, - 0xC664: 0x82BC, - 0xC665: 0x82BF, - 0xC666: 0x82C0, - 0xC667: 0x82C2, - 0xC668: 0x82C3, - 0xC669: 0x82C5, - 0xC66A: 0x82C6, - 0xC66B: 0x82C9, - 0xC66C: 0x82D0, - 0xC66D: 0x82D6, - 0xC66E: 0x82D9, - 0xC66F: 0x82DA, - 0xC670: 0x82DD, - 0xC671: 0x82E2, - 0xC672: 0x82E7, - 0xC673: 0x82E8, - 0xC674: 0x82E9, - 0xC675: 0x82EA, - 0xC676: 0x82EC, - 0xC677: 0x82ED, - 0xC678: 0x82EE, - 0xC679: 0x82F0, - 0xC67A: 0x82F2, - 0xC67B: 0x82F3, - 0xC67C: 0x82F5, - 0xC67D: 0x82F6, - 0xC67E: 0x82F8, - 0xC680: 0x82FA, - 0xC681: 0x82FC, - 0xC682: 0x82FD, - 0xC683: 0x82FE, - 0xC684: 0x82FF, - 0xC685: 0x8300, - 0xC686: 0x830A, - 0xC687: 0x830B, - 0xC688: 0x830D, - 0xC689: 0x8310, - 0xC68A: 0x8312, - 0xC68B: 0x8313, - 0xC68C: 0x8316, - 0xC68D: 0x8318, - 0xC68E: 0x8319, - 0xC68F: 0x831D, - 0xC690: 0x831E, - 0xC691: 0x831F, - 0xC692: 0x8320, - 0xC693: 0x8321, - 0xC694: 0x8322, - 0xC695: 0x8323, - 0xC696: 0x8324, - 0xC697: 0x8325, - 0xC698: 0x8326, - 0xC699: 0x8329, - 0xC69A: 0x832A, - 0xC69B: 0x832E, - 0xC69C: 0x8330, - 0xC69D: 0x8332, - 0xC69E: 0x8337, - 0xC69F: 0x833B, - 0xC6A0: 0x833D, - 0xC6A1: 0x5564, - 0xC6A2: 0x813E, - 0xC6A3: 0x75B2, - 0xC6A4: 0x76AE, - 0xC6A5: 0x5339, - 0xC6A6: 0x75DE, - 0xC6A7: 0x50FB, - 0xC6A8: 0x5C41, - 0xC6A9: 0x8B6C, - 0xC6AA: 0x7BC7, - 0xC6AB: 0x504F, - 0xC6AC: 0x7247, - 0xC6AD: 0x9A97, - 0xC6AE: 0x98D8, - 0xC6AF: 0x6F02, - 0xC6B0: 0x74E2, - 0xC6B1: 0x7968, - 0xC6B2: 0x6487, - 0xC6B3: 0x77A5, - 0xC6B4: 0x62FC, - 0xC6B5: 0x9891, - 0xC6B6: 0x8D2B, - 0xC6B7: 0x54C1, - 0xC6B8: 0x8058, - 0xC6B9: 0x4E52, - 0xC6BA: 0x576A, - 0xC6BB: 0x82F9, - 0xC6BC: 0x840D, - 0xC6BD: 0x5E73, - 0xC6BE: 0x51ED, - 0xC6BF: 0x74F6, - 0xC6C0: 0x8BC4, - 0xC6C1: 0x5C4F, - 0xC6C2: 0x5761, - 0xC6C3: 0x6CFC, - 0xC6C4: 0x9887, - 0xC6C5: 0x5A46, - 0xC6C6: 0x7834, - 0xC6C7: 0x9B44, - 0xC6C8: 0x8FEB, - 0xC6C9: 0x7C95, - 0xC6CA: 0x5256, - 0xC6CB: 0x6251, - 0xC6CC: 0x94FA, - 0xC6CD: 0x4EC6, - 0xC6CE: 0x8386, - 0xC6CF: 0x8461, - 0xC6D0: 0x83E9, - 0xC6D1: 0x84B2, - 0xC6D2: 0x57D4, - 0xC6D3: 0x6734, - 0xC6D4: 0x5703, - 0xC6D5: 0x666E, - 0xC6D6: 0x6D66, - 0xC6D7: 0x8C31, - 0xC6D8: 0x66DD, - 0xC6D9: 0x7011, - 0xC6DA: 0x671F, - 0xC6DB: 0x6B3A, - 0xC6DC: 0x6816, - 0xC6DD: 0x621A, - 0xC6DE: 0x59BB, - 0xC6DF: 0x4E03, - 0xC6E0: 0x51C4, - 0xC6E1: 0x6F06, - 0xC6E2: 0x67D2, - 0xC6E3: 0x6C8F, - 0xC6E4: 0x5176, - 0xC6E5: 0x68CB, - 0xC6E6: 0x5947, - 0xC6E7: 0x6B67, - 0xC6E8: 0x7566, - 0xC6E9: 0x5D0E, - 0xC6EA: 0x8110, - 0xC6EB: 0x9F50, - 0xC6EC: 0x65D7, - 0xC6ED: 0x7948, - 0xC6EE: 0x7941, - 0xC6EF: 0x9A91, - 0xC6F0: 0x8D77, - 0xC6F1: 0x5C82, - 0xC6F2: 0x4E5E, - 0xC6F3: 0x4F01, - 0xC6F4: 0x542F, - 0xC6F5: 0x5951, - 0xC6F6: 0x780C, - 0xC6F7: 0x5668, - 0xC6F8: 0x6C14, - 0xC6F9: 0x8FC4, - 0xC6FA: 0x5F03, - 0xC6FB: 0x6C7D, - 0xC6FC: 0x6CE3, - 0xC6FD: 0x8BAB, - 0xC6FE: 0x6390, - 0xC740: 0x833E, - 0xC741: 0x833F, - 0xC742: 0x8341, - 0xC743: 0x8342, - 0xC744: 0x8344, - 0xC745: 0x8345, - 0xC746: 0x8348, - 0xC747: 0x834A, - 0xC748: 0x834B, - 0xC749: 0x834C, - 0xC74A: 0x834D, - 0xC74B: 0x834E, - 0xC74C: 0x8353, - 0xC74D: 0x8355, - 0xC74E: 0x8356, - 0xC74F: 0x8357, - 0xC750: 0x8358, - 0xC751: 0x8359, - 0xC752: 0x835D, - 0xC753: 0x8362, - 0xC754: 0x8370, - 0xC755: 0x8371, - 0xC756: 0x8372, - 0xC757: 0x8373, - 0xC758: 0x8374, - 0xC759: 0x8375, - 0xC75A: 0x8376, - 0xC75B: 0x8379, - 0xC75C: 0x837A, - 0xC75D: 0x837E, - 0xC75E: 0x837F, - 0xC75F: 0x8380, - 0xC760: 0x8381, - 0xC761: 0x8382, - 0xC762: 0x8383, - 0xC763: 0x8384, - 0xC764: 0x8387, - 0xC765: 0x8388, - 0xC766: 0x838A, - 0xC767: 0x838B, - 0xC768: 0x838C, - 0xC769: 0x838D, - 0xC76A: 0x838F, - 0xC76B: 0x8390, - 0xC76C: 0x8391, - 0xC76D: 0x8394, - 0xC76E: 0x8395, - 0xC76F: 0x8396, - 0xC770: 0x8397, - 0xC771: 0x8399, - 0xC772: 0x839A, - 0xC773: 0x839D, - 0xC774: 0x839F, - 0xC775: 0x83A1, - 0xC776: 0x83A2, - 0xC777: 0x83A3, - 0xC778: 0x83A4, - 0xC779: 0x83A5, - 0xC77A: 0x83A6, - 0xC77B: 0x83A7, - 0xC77C: 0x83AC, - 0xC77D: 0x83AD, - 0xC77E: 0x83AE, - 0xC780: 0x83AF, - 0xC781: 0x83B5, - 0xC782: 0x83BB, - 0xC783: 0x83BE, - 0xC784: 0x83BF, - 0xC785: 0x83C2, - 0xC786: 0x83C3, - 0xC787: 0x83C4, - 0xC788: 0x83C6, - 0xC789: 0x83C8, - 0xC78A: 0x83C9, - 0xC78B: 0x83CB, - 0xC78C: 0x83CD, - 0xC78D: 0x83CE, - 0xC78E: 0x83D0, - 0xC78F: 0x83D1, - 0xC790: 0x83D2, - 0xC791: 0x83D3, - 0xC792: 0x83D5, - 0xC793: 0x83D7, - 0xC794: 0x83D9, - 0xC795: 0x83DA, - 0xC796: 0x83DB, - 0xC797: 0x83DE, - 0xC798: 0x83E2, - 0xC799: 0x83E3, - 0xC79A: 0x83E4, - 0xC79B: 0x83E6, - 0xC79C: 0x83E7, - 0xC79D: 0x83E8, - 0xC79E: 0x83EB, - 0xC79F: 0x83EC, - 0xC7A0: 0x83ED, - 0xC7A1: 0x6070, - 0xC7A2: 0x6D3D, - 0xC7A3: 0x7275, - 0xC7A4: 0x6266, - 0xC7A5: 0x948E, - 0xC7A6: 0x94C5, - 0xC7A7: 0x5343, - 0xC7A8: 0x8FC1, - 0xC7A9: 0x7B7E, - 0xC7AA: 0x4EDF, - 0xC7AB: 0x8C26, - 0xC7AC: 0x4E7E, - 0xC7AD: 0x9ED4, - 0xC7AE: 0x94B1, - 0xC7AF: 0x94B3, - 0xC7B0: 0x524D, - 0xC7B1: 0x6F5C, - 0xC7B2: 0x9063, - 0xC7B3: 0x6D45, - 0xC7B4: 0x8C34, - 0xC7B5: 0x5811, - 0xC7B6: 0x5D4C, - 0xC7B7: 0x6B20, - 0xC7B8: 0x6B49, - 0xC7B9: 0x67AA, - 0xC7BA: 0x545B, - 0xC7BB: 0x8154, - 0xC7BC: 0x7F8C, - 0xC7BD: 0x5899, - 0xC7BE: 0x8537, - 0xC7BF: 0x5F3A, - 0xC7C0: 0x62A2, - 0xC7C1: 0x6A47, - 0xC7C2: 0x9539, - 0xC7C3: 0x6572, - 0xC7C4: 0x6084, - 0xC7C5: 0x6865, - 0xC7C6: 0x77A7, - 0xC7C7: 0x4E54, - 0xC7C8: 0x4FA8, - 0xC7C9: 0x5DE7, - 0xC7CA: 0x9798, - 0xC7CB: 0x64AC, - 0xC7CC: 0x7FD8, - 0xC7CD: 0x5CED, - 0xC7CE: 0x4FCF, - 0xC7CF: 0x7A8D, - 0xC7D0: 0x5207, - 0xC7D1: 0x8304, - 0xC7D2: 0x4E14, - 0xC7D3: 0x602F, - 0xC7D4: 0x7A83, - 0xC7D5: 0x94A6, - 0xC7D6: 0x4FB5, - 0xC7D7: 0x4EB2, - 0xC7D8: 0x79E6, - 0xC7D9: 0x7434, - 0xC7DA: 0x52E4, - 0xC7DB: 0x82B9, - 0xC7DC: 0x64D2, - 0xC7DD: 0x79BD, - 0xC7DE: 0x5BDD, - 0xC7DF: 0x6C81, - 0xC7E0: 0x9752, - 0xC7E1: 0x8F7B, - 0xC7E2: 0x6C22, - 0xC7E3: 0x503E, - 0xC7E4: 0x537F, - 0xC7E5: 0x6E05, - 0xC7E6: 0x64CE, - 0xC7E7: 0x6674, - 0xC7E8: 0x6C30, - 0xC7E9: 0x60C5, - 0xC7EA: 0x9877, - 0xC7EB: 0x8BF7, - 0xC7EC: 0x5E86, - 0xC7ED: 0x743C, - 0xC7EE: 0x7A77, - 0xC7EF: 0x79CB, - 0xC7F0: 0x4E18, - 0xC7F1: 0x90B1, - 0xC7F2: 0x7403, - 0xC7F3: 0x6C42, - 0xC7F4: 0x56DA, - 0xC7F5: 0x914B, - 0xC7F6: 0x6CC5, - 0xC7F7: 0x8D8B, - 0xC7F8: 0x533A, - 0xC7F9: 0x86C6, - 0xC7FA: 0x66F2, - 0xC7FB: 0x8EAF, - 0xC7FC: 0x5C48, - 0xC7FD: 0x9A71, - 0xC7FE: 0x6E20, - 0xC840: 0x83EE, - 0xC841: 0x83EF, - 0xC842: 0x83F3, - 0xC843: 0x83F4, - 0xC844: 0x83F5, - 0xC845: 0x83F6, - 0xC846: 0x83F7, - 0xC847: 0x83FA, - 0xC848: 0x83FB, - 0xC849: 0x83FC, - 0xC84A: 0x83FE, - 0xC84B: 0x83FF, - 0xC84C: 0x8400, - 0xC84D: 0x8402, - 0xC84E: 0x8405, - 0xC84F: 0x8407, - 0xC850: 0x8408, - 0xC851: 0x8409, - 0xC852: 0x840A, - 0xC853: 0x8410, - 0xC854: 0x8412, - 0xC855: 0x8413, - 0xC856: 0x8414, - 0xC857: 0x8415, - 0xC858: 0x8416, - 0xC859: 0x8417, - 0xC85A: 0x8419, - 0xC85B: 0x841A, - 0xC85C: 0x841B, - 0xC85D: 0x841E, - 0xC85E: 0x841F, - 0xC85F: 0x8420, - 0xC860: 0x8421, - 0xC861: 0x8422, - 0xC862: 0x8423, - 0xC863: 0x8429, - 0xC864: 0x842A, - 0xC865: 0x842B, - 0xC866: 0x842C, - 0xC867: 0x842D, - 0xC868: 0x842E, - 0xC869: 0x842F, - 0xC86A: 0x8430, - 0xC86B: 0x8432, - 0xC86C: 0x8433, - 0xC86D: 0x8434, - 0xC86E: 0x8435, - 0xC86F: 0x8436, - 0xC870: 0x8437, - 0xC871: 0x8439, - 0xC872: 0x843A, - 0xC873: 0x843B, - 0xC874: 0x843E, - 0xC875: 0x843F, - 0xC876: 0x8440, - 0xC877: 0x8441, - 0xC878: 0x8442, - 0xC879: 0x8443, - 0xC87A: 0x8444, - 0xC87B: 0x8445, - 0xC87C: 0x8447, - 0xC87D: 0x8448, - 0xC87E: 0x8449, - 0xC880: 0x844A, - 0xC881: 0x844B, - 0xC882: 0x844C, - 0xC883: 0x844D, - 0xC884: 0x844E, - 0xC885: 0x844F, - 0xC886: 0x8450, - 0xC887: 0x8452, - 0xC888: 0x8453, - 0xC889: 0x8454, - 0xC88A: 0x8455, - 0xC88B: 0x8456, - 0xC88C: 0x8458, - 0xC88D: 0x845D, - 0xC88E: 0x845E, - 0xC88F: 0x845F, - 0xC890: 0x8460, - 0xC891: 0x8462, - 0xC892: 0x8464, - 0xC893: 0x8465, - 0xC894: 0x8466, - 0xC895: 0x8467, - 0xC896: 0x8468, - 0xC897: 0x846A, - 0xC898: 0x846E, - 0xC899: 0x846F, - 0xC89A: 0x8470, - 0xC89B: 0x8472, - 0xC89C: 0x8474, - 0xC89D: 0x8477, - 0xC89E: 0x8479, - 0xC89F: 0x847B, - 0xC8A0: 0x847C, - 0xC8A1: 0x53D6, - 0xC8A2: 0x5A36, - 0xC8A3: 0x9F8B, - 0xC8A4: 0x8DA3, - 0xC8A5: 0x53BB, - 0xC8A6: 0x5708, - 0xC8A7: 0x98A7, - 0xC8A8: 0x6743, - 0xC8A9: 0x919B, - 0xC8AA: 0x6CC9, - 0xC8AB: 0x5168, - 0xC8AC: 0x75CA, - 0xC8AD: 0x62F3, - 0xC8AE: 0x72AC, - 0xC8AF: 0x5238, - 0xC8B0: 0x529D, - 0xC8B1: 0x7F3A, - 0xC8B2: 0x7094, - 0xC8B3: 0x7638, - 0xC8B4: 0x5374, - 0xC8B5: 0x9E4A, - 0xC8B6: 0x69B7, - 0xC8B7: 0x786E, - 0xC8B8: 0x96C0, - 0xC8B9: 0x88D9, - 0xC8BA: 0x7FA4, - 0xC8BB: 0x7136, - 0xC8BC: 0x71C3, - 0xC8BD: 0x5189, - 0xC8BE: 0x67D3, - 0xC8BF: 0x74E4, - 0xC8C0: 0x58E4, - 0xC8C1: 0x6518, - 0xC8C2: 0x56B7, - 0xC8C3: 0x8BA9, - 0xC8C4: 0x9976, - 0xC8C5: 0x6270, - 0xC8C6: 0x7ED5, - 0xC8C7: 0x60F9, - 0xC8C8: 0x70ED, - 0xC8C9: 0x58EC, - 0xC8CA: 0x4EC1, - 0xC8CB: 0x4EBA, - 0xC8CC: 0x5FCD, - 0xC8CD: 0x97E7, - 0xC8CE: 0x4EFB, - 0xC8CF: 0x8BA4, - 0xC8D0: 0x5203, - 0xC8D1: 0x598A, - 0xC8D2: 0x7EAB, - 0xC8D3: 0x6254, - 0xC8D4: 0x4ECD, - 0xC8D5: 0x65E5, - 0xC8D6: 0x620E, - 0xC8D7: 0x8338, - 0xC8D8: 0x84C9, - 0xC8D9: 0x8363, - 0xC8DA: 0x878D, - 0xC8DB: 0x7194, - 0xC8DC: 0x6EB6, - 0xC8DD: 0x5BB9, - 0xC8DE: 0x7ED2, - 0xC8DF: 0x5197, - 0xC8E0: 0x63C9, - 0xC8E1: 0x67D4, - 0xC8E2: 0x8089, - 0xC8E3: 0x8339, - 0xC8E4: 0x8815, - 0xC8E5: 0x5112, - 0xC8E6: 0x5B7A, - 0xC8E7: 0x5982, - 0xC8E8: 0x8FB1, - 0xC8E9: 0x4E73, - 0xC8EA: 0x6C5D, - 0xC8EB: 0x5165, - 0xC8EC: 0x8925, - 0xC8ED: 0x8F6F, - 0xC8EE: 0x962E, - 0xC8EF: 0x854A, - 0xC8F0: 0x745E, - 0xC8F1: 0x9510, - 0xC8F2: 0x95F0, - 0xC8F3: 0x6DA6, - 0xC8F4: 0x82E5, - 0xC8F5: 0x5F31, - 0xC8F6: 0x6492, - 0xC8F7: 0x6D12, - 0xC8F8: 0x8428, - 0xC8F9: 0x816E, - 0xC8FA: 0x9CC3, - 0xC8FB: 0x585E, - 0xC8FC: 0x8D5B, - 0xC8FD: 0x4E09, - 0xC8FE: 0x53C1, - 0xC940: 0x847D, - 0xC941: 0x847E, - 0xC942: 0x847F, - 0xC943: 0x8480, - 0xC944: 0x8481, - 0xC945: 0x8483, - 0xC946: 0x8484, - 0xC947: 0x8485, - 0xC948: 0x8486, - 0xC949: 0x848A, - 0xC94A: 0x848D, - 0xC94B: 0x848F, - 0xC94C: 0x8490, - 0xC94D: 0x8491, - 0xC94E: 0x8492, - 0xC94F: 0x8493, - 0xC950: 0x8494, - 0xC951: 0x8495, - 0xC952: 0x8496, - 0xC953: 0x8498, - 0xC954: 0x849A, - 0xC955: 0x849B, - 0xC956: 0x849D, - 0xC957: 0x849E, - 0xC958: 0x849F, - 0xC959: 0x84A0, - 0xC95A: 0x84A2, - 0xC95B: 0x84A3, - 0xC95C: 0x84A4, - 0xC95D: 0x84A5, - 0xC95E: 0x84A6, - 0xC95F: 0x84A7, - 0xC960: 0x84A8, - 0xC961: 0x84A9, - 0xC962: 0x84AA, - 0xC963: 0x84AB, - 0xC964: 0x84AC, - 0xC965: 0x84AD, - 0xC966: 0x84AE, - 0xC967: 0x84B0, - 0xC968: 0x84B1, - 0xC969: 0x84B3, - 0xC96A: 0x84B5, - 0xC96B: 0x84B6, - 0xC96C: 0x84B7, - 0xC96D: 0x84BB, - 0xC96E: 0x84BC, - 0xC96F: 0x84BE, - 0xC970: 0x84C0, - 0xC971: 0x84C2, - 0xC972: 0x84C3, - 0xC973: 0x84C5, - 0xC974: 0x84C6, - 0xC975: 0x84C7, - 0xC976: 0x84C8, - 0xC977: 0x84CB, - 0xC978: 0x84CC, - 0xC979: 0x84CE, - 0xC97A: 0x84CF, - 0xC97B: 0x84D2, - 0xC97C: 0x84D4, - 0xC97D: 0x84D5, - 0xC97E: 0x84D7, - 0xC980: 0x84D8, - 0xC981: 0x84D9, - 0xC982: 0x84DA, - 0xC983: 0x84DB, - 0xC984: 0x84DC, - 0xC985: 0x84DE, - 0xC986: 0x84E1, - 0xC987: 0x84E2, - 0xC988: 0x84E4, - 0xC989: 0x84E7, - 0xC98A: 0x84E8, - 0xC98B: 0x84E9, - 0xC98C: 0x84EA, - 0xC98D: 0x84EB, - 0xC98E: 0x84ED, - 0xC98F: 0x84EE, - 0xC990: 0x84EF, - 0xC991: 0x84F1, - 0xC992: 0x84F2, - 0xC993: 0x84F3, - 0xC994: 0x84F4, - 0xC995: 0x84F5, - 0xC996: 0x84F6, - 0xC997: 0x84F7, - 0xC998: 0x84F8, - 0xC999: 0x84F9, - 0xC99A: 0x84FA, - 0xC99B: 0x84FB, - 0xC99C: 0x84FD, - 0xC99D: 0x84FE, - 0xC99E: 0x8500, - 0xC99F: 0x8501, - 0xC9A0: 0x8502, - 0xC9A1: 0x4F1E, - 0xC9A2: 0x6563, - 0xC9A3: 0x6851, - 0xC9A4: 0x55D3, - 0xC9A5: 0x4E27, - 0xC9A6: 0x6414, - 0xC9A7: 0x9A9A, - 0xC9A8: 0x626B, - 0xC9A9: 0x5AC2, - 0xC9AA: 0x745F, - 0xC9AB: 0x8272, - 0xC9AC: 0x6DA9, - 0xC9AD: 0x68EE, - 0xC9AE: 0x50E7, - 0xC9AF: 0x838E, - 0xC9B0: 0x7802, - 0xC9B1: 0x6740, - 0xC9B2: 0x5239, - 0xC9B3: 0x6C99, - 0xC9B4: 0x7EB1, - 0xC9B5: 0x50BB, - 0xC9B6: 0x5565, - 0xC9B7: 0x715E, - 0xC9B8: 0x7B5B, - 0xC9B9: 0x6652, - 0xC9BA: 0x73CA, - 0xC9BB: 0x82EB, - 0xC9BC: 0x6749, - 0xC9BD: 0x5C71, - 0xC9BE: 0x5220, - 0xC9BF: 0x717D, - 0xC9C0: 0x886B, - 0xC9C1: 0x95EA, - 0xC9C2: 0x9655, - 0xC9C3: 0x64C5, - 0xC9C4: 0x8D61, - 0xC9C5: 0x81B3, - 0xC9C6: 0x5584, - 0xC9C7: 0x6C55, - 0xC9C8: 0x6247, - 0xC9C9: 0x7F2E, - 0xC9CA: 0x5892, - 0xC9CB: 0x4F24, - 0xC9CC: 0x5546, - 0xC9CD: 0x8D4F, - 0xC9CE: 0x664C, - 0xC9CF: 0x4E0A, - 0xC9D0: 0x5C1A, - 0xC9D1: 0x88F3, - 0xC9D2: 0x68A2, - 0xC9D3: 0x634E, - 0xC9D4: 0x7A0D, - 0xC9D5: 0x70E7, - 0xC9D6: 0x828D, - 0xC9D7: 0x52FA, - 0xC9D8: 0x97F6, - 0xC9D9: 0x5C11, - 0xC9DA: 0x54E8, - 0xC9DB: 0x90B5, - 0xC9DC: 0x7ECD, - 0xC9DD: 0x5962, - 0xC9DE: 0x8D4A, - 0xC9DF: 0x86C7, - 0xC9E0: 0x820C, - 0xC9E1: 0x820D, - 0xC9E2: 0x8D66, - 0xC9E3: 0x6444, - 0xC9E4: 0x5C04, - 0xC9E5: 0x6151, - 0xC9E6: 0x6D89, - 0xC9E7: 0x793E, - 0xC9E8: 0x8BBE, - 0xC9E9: 0x7837, - 0xC9EA: 0x7533, - 0xC9EB: 0x547B, - 0xC9EC: 0x4F38, - 0xC9ED: 0x8EAB, - 0xC9EE: 0x6DF1, - 0xC9EF: 0x5A20, - 0xC9F0: 0x7EC5, - 0xC9F1: 0x795E, - 0xC9F2: 0x6C88, - 0xC9F3: 0x5BA1, - 0xC9F4: 0x5A76, - 0xC9F5: 0x751A, - 0xC9F6: 0x80BE, - 0xC9F7: 0x614E, - 0xC9F8: 0x6E17, - 0xC9F9: 0x58F0, - 0xC9FA: 0x751F, - 0xC9FB: 0x7525, - 0xC9FC: 0x7272, - 0xC9FD: 0x5347, - 0xC9FE: 0x7EF3, - 0xCA40: 0x8503, - 0xCA41: 0x8504, - 0xCA42: 0x8505, - 0xCA43: 0x8506, - 0xCA44: 0x8507, - 0xCA45: 0x8508, - 0xCA46: 0x8509, - 0xCA47: 0x850A, - 0xCA48: 0x850B, - 0xCA49: 0x850D, - 0xCA4A: 0x850E, - 0xCA4B: 0x850F, - 0xCA4C: 0x8510, - 0xCA4D: 0x8512, - 0xCA4E: 0x8514, - 0xCA4F: 0x8515, - 0xCA50: 0x8516, - 0xCA51: 0x8518, - 0xCA52: 0x8519, - 0xCA53: 0x851B, - 0xCA54: 0x851C, - 0xCA55: 0x851D, - 0xCA56: 0x851E, - 0xCA57: 0x8520, - 0xCA58: 0x8522, - 0xCA59: 0x8523, - 0xCA5A: 0x8524, - 0xCA5B: 0x8525, - 0xCA5C: 0x8526, - 0xCA5D: 0x8527, - 0xCA5E: 0x8528, - 0xCA5F: 0x8529, - 0xCA60: 0x852A, - 0xCA61: 0x852D, - 0xCA62: 0x852E, - 0xCA63: 0x852F, - 0xCA64: 0x8530, - 0xCA65: 0x8531, - 0xCA66: 0x8532, - 0xCA67: 0x8533, - 0xCA68: 0x8534, - 0xCA69: 0x8535, - 0xCA6A: 0x8536, - 0xCA6B: 0x853E, - 0xCA6C: 0x853F, - 0xCA6D: 0x8540, - 0xCA6E: 0x8541, - 0xCA6F: 0x8542, - 0xCA70: 0x8544, - 0xCA71: 0x8545, - 0xCA72: 0x8546, - 0xCA73: 0x8547, - 0xCA74: 0x854B, - 0xCA75: 0x854C, - 0xCA76: 0x854D, - 0xCA77: 0x854E, - 0xCA78: 0x854F, - 0xCA79: 0x8550, - 0xCA7A: 0x8551, - 0xCA7B: 0x8552, - 0xCA7C: 0x8553, - 0xCA7D: 0x8554, - 0xCA7E: 0x8555, - 0xCA80: 0x8557, - 0xCA81: 0x8558, - 0xCA82: 0x855A, - 0xCA83: 0x855B, - 0xCA84: 0x855C, - 0xCA85: 0x855D, - 0xCA86: 0x855F, - 0xCA87: 0x8560, - 0xCA88: 0x8561, - 0xCA89: 0x8562, - 0xCA8A: 0x8563, - 0xCA8B: 0x8565, - 0xCA8C: 0x8566, - 0xCA8D: 0x8567, - 0xCA8E: 0x8569, - 0xCA8F: 0x856A, - 0xCA90: 0x856B, - 0xCA91: 0x856C, - 0xCA92: 0x856D, - 0xCA93: 0x856E, - 0xCA94: 0x856F, - 0xCA95: 0x8570, - 0xCA96: 0x8571, - 0xCA97: 0x8573, - 0xCA98: 0x8575, - 0xCA99: 0x8576, - 0xCA9A: 0x8577, - 0xCA9B: 0x8578, - 0xCA9C: 0x857C, - 0xCA9D: 0x857D, - 0xCA9E: 0x857F, - 0xCA9F: 0x8580, - 0xCAA0: 0x8581, - 0xCAA1: 0x7701, - 0xCAA2: 0x76DB, - 0xCAA3: 0x5269, - 0xCAA4: 0x80DC, - 0xCAA5: 0x5723, - 0xCAA6: 0x5E08, - 0xCAA7: 0x5931, - 0xCAA8: 0x72EE, - 0xCAA9: 0x65BD, - 0xCAAA: 0x6E7F, - 0xCAAB: 0x8BD7, - 0xCAAC: 0x5C38, - 0xCAAD: 0x8671, - 0xCAAE: 0x5341, - 0xCAAF: 0x77F3, - 0xCAB0: 0x62FE, - 0xCAB1: 0x65F6, - 0xCAB2: 0x4EC0, - 0xCAB3: 0x98DF, - 0xCAB4: 0x8680, - 0xCAB5: 0x5B9E, - 0xCAB6: 0x8BC6, - 0xCAB7: 0x53F2, - 0xCAB8: 0x77E2, - 0xCAB9: 0x4F7F, - 0xCABA: 0x5C4E, - 0xCABB: 0x9A76, - 0xCABC: 0x59CB, - 0xCABD: 0x5F0F, - 0xCABE: 0x793A, - 0xCABF: 0x58EB, - 0xCAC0: 0x4E16, - 0xCAC1: 0x67FF, - 0xCAC2: 0x4E8B, - 0xCAC3: 0x62ED, - 0xCAC4: 0x8A93, - 0xCAC5: 0x901D, - 0xCAC6: 0x52BF, - 0xCAC7: 0x662F, - 0xCAC8: 0x55DC, - 0xCAC9: 0x566C, - 0xCACA: 0x9002, - 0xCACB: 0x4ED5, - 0xCACC: 0x4F8D, - 0xCACD: 0x91CA, - 0xCACE: 0x9970, - 0xCACF: 0x6C0F, - 0xCAD0: 0x5E02, - 0xCAD1: 0x6043, - 0xCAD2: 0x5BA4, - 0xCAD3: 0x89C6, - 0xCAD4: 0x8BD5, - 0xCAD5: 0x6536, - 0xCAD6: 0x624B, - 0xCAD7: 0x9996, - 0xCAD8: 0x5B88, - 0xCAD9: 0x5BFF, - 0xCADA: 0x6388, - 0xCADB: 0x552E, - 0xCADC: 0x53D7, - 0xCADD: 0x7626, - 0xCADE: 0x517D, - 0xCADF: 0x852C, - 0xCAE0: 0x67A2, - 0xCAE1: 0x68B3, - 0xCAE2: 0x6B8A, - 0xCAE3: 0x6292, - 0xCAE4: 0x8F93, - 0xCAE5: 0x53D4, - 0xCAE6: 0x8212, - 0xCAE7: 0x6DD1, - 0xCAE8: 0x758F, - 0xCAE9: 0x4E66, - 0xCAEA: 0x8D4E, - 0xCAEB: 0x5B70, - 0xCAEC: 0x719F, - 0xCAED: 0x85AF, - 0xCAEE: 0x6691, - 0xCAEF: 0x66D9, - 0xCAF0: 0x7F72, - 0xCAF1: 0x8700, - 0xCAF2: 0x9ECD, - 0xCAF3: 0x9F20, - 0xCAF4: 0x5C5E, - 0xCAF5: 0x672F, - 0xCAF6: 0x8FF0, - 0xCAF7: 0x6811, - 0xCAF8: 0x675F, - 0xCAF9: 0x620D, - 0xCAFA: 0x7AD6, - 0xCAFB: 0x5885, - 0xCAFC: 0x5EB6, - 0xCAFD: 0x6570, - 0xCAFE: 0x6F31, - 0xCB40: 0x8582, - 0xCB41: 0x8583, - 0xCB42: 0x8586, - 0xCB43: 0x8588, - 0xCB44: 0x8589, - 0xCB45: 0x858A, - 0xCB46: 0x858B, - 0xCB47: 0x858C, - 0xCB48: 0x858D, - 0xCB49: 0x858E, - 0xCB4A: 0x8590, - 0xCB4B: 0x8591, - 0xCB4C: 0x8592, - 0xCB4D: 0x8593, - 0xCB4E: 0x8594, - 0xCB4F: 0x8595, - 0xCB50: 0x8596, - 0xCB51: 0x8597, - 0xCB52: 0x8598, - 0xCB53: 0x8599, - 0xCB54: 0x859A, - 0xCB55: 0x859D, - 0xCB56: 0x859E, - 0xCB57: 0x859F, - 0xCB58: 0x85A0, - 0xCB59: 0x85A1, - 0xCB5A: 0x85A2, - 0xCB5B: 0x85A3, - 0xCB5C: 0x85A5, - 0xCB5D: 0x85A6, - 0xCB5E: 0x85A7, - 0xCB5F: 0x85A9, - 0xCB60: 0x85AB, - 0xCB61: 0x85AC, - 0xCB62: 0x85AD, - 0xCB63: 0x85B1, - 0xCB64: 0x85B2, - 0xCB65: 0x85B3, - 0xCB66: 0x85B4, - 0xCB67: 0x85B5, - 0xCB68: 0x85B6, - 0xCB69: 0x85B8, - 0xCB6A: 0x85BA, - 0xCB6B: 0x85BB, - 0xCB6C: 0x85BC, - 0xCB6D: 0x85BD, - 0xCB6E: 0x85BE, - 0xCB6F: 0x85BF, - 0xCB70: 0x85C0, - 0xCB71: 0x85C2, - 0xCB72: 0x85C3, - 0xCB73: 0x85C4, - 0xCB74: 0x85C5, - 0xCB75: 0x85C6, - 0xCB76: 0x85C7, - 0xCB77: 0x85C8, - 0xCB78: 0x85CA, - 0xCB79: 0x85CB, - 0xCB7A: 0x85CC, - 0xCB7B: 0x85CD, - 0xCB7C: 0x85CE, - 0xCB7D: 0x85D1, - 0xCB7E: 0x85D2, - 0xCB80: 0x85D4, - 0xCB81: 0x85D6, - 0xCB82: 0x85D7, - 0xCB83: 0x85D8, - 0xCB84: 0x85D9, - 0xCB85: 0x85DA, - 0xCB86: 0x85DB, - 0xCB87: 0x85DD, - 0xCB88: 0x85DE, - 0xCB89: 0x85DF, - 0xCB8A: 0x85E0, - 0xCB8B: 0x85E1, - 0xCB8C: 0x85E2, - 0xCB8D: 0x85E3, - 0xCB8E: 0x85E5, - 0xCB8F: 0x85E6, - 0xCB90: 0x85E7, - 0xCB91: 0x85E8, - 0xCB92: 0x85EA, - 0xCB93: 0x85EB, - 0xCB94: 0x85EC, - 0xCB95: 0x85ED, - 0xCB96: 0x85EE, - 0xCB97: 0x85EF, - 0xCB98: 0x85F0, - 0xCB99: 0x85F1, - 0xCB9A: 0x85F2, - 0xCB9B: 0x85F3, - 0xCB9C: 0x85F4, - 0xCB9D: 0x85F5, - 0xCB9E: 0x85F6, - 0xCB9F: 0x85F7, - 0xCBA0: 0x85F8, - 0xCBA1: 0x6055, - 0xCBA2: 0x5237, - 0xCBA3: 0x800D, - 0xCBA4: 0x6454, - 0xCBA5: 0x8870, - 0xCBA6: 0x7529, - 0xCBA7: 0x5E05, - 0xCBA8: 0x6813, - 0xCBA9: 0x62F4, - 0xCBAA: 0x971C, - 0xCBAB: 0x53CC, - 0xCBAC: 0x723D, - 0xCBAD: 0x8C01, - 0xCBAE: 0x6C34, - 0xCBAF: 0x7761, - 0xCBB0: 0x7A0E, - 0xCBB1: 0x542E, - 0xCBB2: 0x77AC, - 0xCBB3: 0x987A, - 0xCBB4: 0x821C, - 0xCBB5: 0x8BF4, - 0xCBB6: 0x7855, - 0xCBB7: 0x6714, - 0xCBB8: 0x70C1, - 0xCBB9: 0x65AF, - 0xCBBA: 0x6495, - 0xCBBB: 0x5636, - 0xCBBC: 0x601D, - 0xCBBD: 0x79C1, - 0xCBBE: 0x53F8, - 0xCBBF: 0x4E1D, - 0xCBC0: 0x6B7B, - 0xCBC1: 0x8086, - 0xCBC2: 0x5BFA, - 0xCBC3: 0x55E3, - 0xCBC4: 0x56DB, - 0xCBC5: 0x4F3A, - 0xCBC6: 0x4F3C, - 0xCBC7: 0x9972, - 0xCBC8: 0x5DF3, - 0xCBC9: 0x677E, - 0xCBCA: 0x8038, - 0xCBCB: 0x6002, - 0xCBCC: 0x9882, - 0xCBCD: 0x9001, - 0xCBCE: 0x5B8B, - 0xCBCF: 0x8BBC, - 0xCBD0: 0x8BF5, - 0xCBD1: 0x641C, - 0xCBD2: 0x8258, - 0xCBD3: 0x64DE, - 0xCBD4: 0x55FD, - 0xCBD5: 0x82CF, - 0xCBD6: 0x9165, - 0xCBD7: 0x4FD7, - 0xCBD8: 0x7D20, - 0xCBD9: 0x901F, - 0xCBDA: 0x7C9F, - 0xCBDB: 0x50F3, - 0xCBDC: 0x5851, - 0xCBDD: 0x6EAF, - 0xCBDE: 0x5BBF, - 0xCBDF: 0x8BC9, - 0xCBE0: 0x8083, - 0xCBE1: 0x9178, - 0xCBE2: 0x849C, - 0xCBE3: 0x7B97, - 0xCBE4: 0x867D, - 0xCBE5: 0x968B, - 0xCBE6: 0x968F, - 0xCBE7: 0x7EE5, - 0xCBE8: 0x9AD3, - 0xCBE9: 0x788E, - 0xCBEA: 0x5C81, - 0xCBEB: 0x7A57, - 0xCBEC: 0x9042, - 0xCBED: 0x96A7, - 0xCBEE: 0x795F, - 0xCBEF: 0x5B59, - 0xCBF0: 0x635F, - 0xCBF1: 0x7B0B, - 0xCBF2: 0x84D1, - 0xCBF3: 0x68AD, - 0xCBF4: 0x5506, - 0xCBF5: 0x7F29, - 0xCBF6: 0x7410, - 0xCBF7: 0x7D22, - 0xCBF8: 0x9501, - 0xCBF9: 0x6240, - 0xCBFA: 0x584C, - 0xCBFB: 0x4ED6, - 0xCBFC: 0x5B83, - 0xCBFD: 0x5979, - 0xCBFE: 0x5854, - 0xCC40: 0x85F9, - 0xCC41: 0x85FA, - 0xCC42: 0x85FC, - 0xCC43: 0x85FD, - 0xCC44: 0x85FE, - 0xCC45: 0x8600, - 0xCC46: 0x8601, - 0xCC47: 0x8602, - 0xCC48: 0x8603, - 0xCC49: 0x8604, - 0xCC4A: 0x8606, - 0xCC4B: 0x8607, - 0xCC4C: 0x8608, - 0xCC4D: 0x8609, - 0xCC4E: 0x860A, - 0xCC4F: 0x860B, - 0xCC50: 0x860C, - 0xCC51: 0x860D, - 0xCC52: 0x860E, - 0xCC53: 0x860F, - 0xCC54: 0x8610, - 0xCC55: 0x8612, - 0xCC56: 0x8613, - 0xCC57: 0x8614, - 0xCC58: 0x8615, - 0xCC59: 0x8617, - 0xCC5A: 0x8618, - 0xCC5B: 0x8619, - 0xCC5C: 0x861A, - 0xCC5D: 0x861B, - 0xCC5E: 0x861C, - 0xCC5F: 0x861D, - 0xCC60: 0x861E, - 0xCC61: 0x861F, - 0xCC62: 0x8620, - 0xCC63: 0x8621, - 0xCC64: 0x8622, - 0xCC65: 0x8623, - 0xCC66: 0x8624, - 0xCC67: 0x8625, - 0xCC68: 0x8626, - 0xCC69: 0x8628, - 0xCC6A: 0x862A, - 0xCC6B: 0x862B, - 0xCC6C: 0x862C, - 0xCC6D: 0x862D, - 0xCC6E: 0x862E, - 0xCC6F: 0x862F, - 0xCC70: 0x8630, - 0xCC71: 0x8631, - 0xCC72: 0x8632, - 0xCC73: 0x8633, - 0xCC74: 0x8634, - 0xCC75: 0x8635, - 0xCC76: 0x8636, - 0xCC77: 0x8637, - 0xCC78: 0x8639, - 0xCC79: 0x863A, - 0xCC7A: 0x863B, - 0xCC7B: 0x863D, - 0xCC7C: 0x863E, - 0xCC7D: 0x863F, - 0xCC7E: 0x8640, - 0xCC80: 0x8641, - 0xCC81: 0x8642, - 0xCC82: 0x8643, - 0xCC83: 0x8644, - 0xCC84: 0x8645, - 0xCC85: 0x8646, - 0xCC86: 0x8647, - 0xCC87: 0x8648, - 0xCC88: 0x8649, - 0xCC89: 0x864A, - 0xCC8A: 0x864B, - 0xCC8B: 0x864C, - 0xCC8C: 0x8652, - 0xCC8D: 0x8653, - 0xCC8E: 0x8655, - 0xCC8F: 0x8656, - 0xCC90: 0x8657, - 0xCC91: 0x8658, - 0xCC92: 0x8659, - 0xCC93: 0x865B, - 0xCC94: 0x865C, - 0xCC95: 0x865D, - 0xCC96: 0x865F, - 0xCC97: 0x8660, - 0xCC98: 0x8661, - 0xCC99: 0x8663, - 0xCC9A: 0x8664, - 0xCC9B: 0x8665, - 0xCC9C: 0x8666, - 0xCC9D: 0x8667, - 0xCC9E: 0x8668, - 0xCC9F: 0x8669, - 0xCCA0: 0x866A, - 0xCCA1: 0x736D, - 0xCCA2: 0x631E, - 0xCCA3: 0x8E4B, - 0xCCA4: 0x8E0F, - 0xCCA5: 0x80CE, - 0xCCA6: 0x82D4, - 0xCCA7: 0x62AC, - 0xCCA8: 0x53F0, - 0xCCA9: 0x6CF0, - 0xCCAA: 0x915E, - 0xCCAB: 0x592A, - 0xCCAC: 0x6001, - 0xCCAD: 0x6C70, - 0xCCAE: 0x574D, - 0xCCAF: 0x644A, - 0xCCB0: 0x8D2A, - 0xCCB1: 0x762B, - 0xCCB2: 0x6EE9, - 0xCCB3: 0x575B, - 0xCCB4: 0x6A80, - 0xCCB5: 0x75F0, - 0xCCB6: 0x6F6D, - 0xCCB7: 0x8C2D, - 0xCCB8: 0x8C08, - 0xCCB9: 0x5766, - 0xCCBA: 0x6BEF, - 0xCCBB: 0x8892, - 0xCCBC: 0x78B3, - 0xCCBD: 0x63A2, - 0xCCBE: 0x53F9, - 0xCCBF: 0x70AD, - 0xCCC0: 0x6C64, - 0xCCC1: 0x5858, - 0xCCC2: 0x642A, - 0xCCC3: 0x5802, - 0xCCC4: 0x68E0, - 0xCCC5: 0x819B, - 0xCCC6: 0x5510, - 0xCCC7: 0x7CD6, - 0xCCC8: 0x5018, - 0xCCC9: 0x8EBA, - 0xCCCA: 0x6DCC, - 0xCCCB: 0x8D9F, - 0xCCCC: 0x70EB, - 0xCCCD: 0x638F, - 0xCCCE: 0x6D9B, - 0xCCCF: 0x6ED4, - 0xCCD0: 0x7EE6, - 0xCCD1: 0x8404, - 0xCCD2: 0x6843, - 0xCCD3: 0x9003, - 0xCCD4: 0x6DD8, - 0xCCD5: 0x9676, - 0xCCD6: 0x8BA8, - 0xCCD7: 0x5957, - 0xCCD8: 0x7279, - 0xCCD9: 0x85E4, - 0xCCDA: 0x817E, - 0xCCDB: 0x75BC, - 0xCCDC: 0x8A8A, - 0xCCDD: 0x68AF, - 0xCCDE: 0x5254, - 0xCCDF: 0x8E22, - 0xCCE0: 0x9511, - 0xCCE1: 0x63D0, - 0xCCE2: 0x9898, - 0xCCE3: 0x8E44, - 0xCCE4: 0x557C, - 0xCCE5: 0x4F53, - 0xCCE6: 0x66FF, - 0xCCE7: 0x568F, - 0xCCE8: 0x60D5, - 0xCCE9: 0x6D95, - 0xCCEA: 0x5243, - 0xCCEB: 0x5C49, - 0xCCEC: 0x5929, - 0xCCED: 0x6DFB, - 0xCCEE: 0x586B, - 0xCCEF: 0x7530, - 0xCCF0: 0x751C, - 0xCCF1: 0x606C, - 0xCCF2: 0x8214, - 0xCCF3: 0x8146, - 0xCCF4: 0x6311, - 0xCCF5: 0x6761, - 0xCCF6: 0x8FE2, - 0xCCF7: 0x773A, - 0xCCF8: 0x8DF3, - 0xCCF9: 0x8D34, - 0xCCFA: 0x94C1, - 0xCCFB: 0x5E16, - 0xCCFC: 0x5385, - 0xCCFD: 0x542C, - 0xCCFE: 0x70C3, - 0xCD40: 0x866D, - 0xCD41: 0x866F, - 0xCD42: 0x8670, - 0xCD43: 0x8672, - 0xCD44: 0x8673, - 0xCD45: 0x8674, - 0xCD46: 0x8675, - 0xCD47: 0x8676, - 0xCD48: 0x8677, - 0xCD49: 0x8678, - 0xCD4A: 0x8683, - 0xCD4B: 0x8684, - 0xCD4C: 0x8685, - 0xCD4D: 0x8686, - 0xCD4E: 0x8687, - 0xCD4F: 0x8688, - 0xCD50: 0x8689, - 0xCD51: 0x868E, - 0xCD52: 0x868F, - 0xCD53: 0x8690, - 0xCD54: 0x8691, - 0xCD55: 0x8692, - 0xCD56: 0x8694, - 0xCD57: 0x8696, - 0xCD58: 0x8697, - 0xCD59: 0x8698, - 0xCD5A: 0x8699, - 0xCD5B: 0x869A, - 0xCD5C: 0x869B, - 0xCD5D: 0x869E, - 0xCD5E: 0x869F, - 0xCD5F: 0x86A0, - 0xCD60: 0x86A1, - 0xCD61: 0x86A2, - 0xCD62: 0x86A5, - 0xCD63: 0x86A6, - 0xCD64: 0x86AB, - 0xCD65: 0x86AD, - 0xCD66: 0x86AE, - 0xCD67: 0x86B2, - 0xCD68: 0x86B3, - 0xCD69: 0x86B7, - 0xCD6A: 0x86B8, - 0xCD6B: 0x86B9, - 0xCD6C: 0x86BB, - 0xCD6D: 0x86BC, - 0xCD6E: 0x86BD, - 0xCD6F: 0x86BE, - 0xCD70: 0x86BF, - 0xCD71: 0x86C1, - 0xCD72: 0x86C2, - 0xCD73: 0x86C3, - 0xCD74: 0x86C5, - 0xCD75: 0x86C8, - 0xCD76: 0x86CC, - 0xCD77: 0x86CD, - 0xCD78: 0x86D2, - 0xCD79: 0x86D3, - 0xCD7A: 0x86D5, - 0xCD7B: 0x86D6, - 0xCD7C: 0x86D7, - 0xCD7D: 0x86DA, - 0xCD7E: 0x86DC, - 0xCD80: 0x86DD, - 0xCD81: 0x86E0, - 0xCD82: 0x86E1, - 0xCD83: 0x86E2, - 0xCD84: 0x86E3, - 0xCD85: 0x86E5, - 0xCD86: 0x86E6, - 0xCD87: 0x86E7, - 0xCD88: 0x86E8, - 0xCD89: 0x86EA, - 0xCD8A: 0x86EB, - 0xCD8B: 0x86EC, - 0xCD8C: 0x86EF, - 0xCD8D: 0x86F5, - 0xCD8E: 0x86F6, - 0xCD8F: 0x86F7, - 0xCD90: 0x86FA, - 0xCD91: 0x86FB, - 0xCD92: 0x86FC, - 0xCD93: 0x86FD, - 0xCD94: 0x86FF, - 0xCD95: 0x8701, - 0xCD96: 0x8704, - 0xCD97: 0x8705, - 0xCD98: 0x8706, - 0xCD99: 0x870B, - 0xCD9A: 0x870C, - 0xCD9B: 0x870E, - 0xCD9C: 0x870F, - 0xCD9D: 0x8710, - 0xCD9E: 0x8711, - 0xCD9F: 0x8714, - 0xCDA0: 0x8716, - 0xCDA1: 0x6C40, - 0xCDA2: 0x5EF7, - 0xCDA3: 0x505C, - 0xCDA4: 0x4EAD, - 0xCDA5: 0x5EAD, - 0xCDA6: 0x633A, - 0xCDA7: 0x8247, - 0xCDA8: 0x901A, - 0xCDA9: 0x6850, - 0xCDAA: 0x916E, - 0xCDAB: 0x77B3, - 0xCDAC: 0x540C, - 0xCDAD: 0x94DC, - 0xCDAE: 0x5F64, - 0xCDAF: 0x7AE5, - 0xCDB0: 0x6876, - 0xCDB1: 0x6345, - 0xCDB2: 0x7B52, - 0xCDB3: 0x7EDF, - 0xCDB4: 0x75DB, - 0xCDB5: 0x5077, - 0xCDB6: 0x6295, - 0xCDB7: 0x5934, - 0xCDB8: 0x900F, - 0xCDB9: 0x51F8, - 0xCDBA: 0x79C3, - 0xCDBB: 0x7A81, - 0xCDBC: 0x56FE, - 0xCDBD: 0x5F92, - 0xCDBE: 0x9014, - 0xCDBF: 0x6D82, - 0xCDC0: 0x5C60, - 0xCDC1: 0x571F, - 0xCDC2: 0x5410, - 0xCDC3: 0x5154, - 0xCDC4: 0x6E4D, - 0xCDC5: 0x56E2, - 0xCDC6: 0x63A8, - 0xCDC7: 0x9893, - 0xCDC8: 0x817F, - 0xCDC9: 0x8715, - 0xCDCA: 0x892A, - 0xCDCB: 0x9000, - 0xCDCC: 0x541E, - 0xCDCD: 0x5C6F, - 0xCDCE: 0x81C0, - 0xCDCF: 0x62D6, - 0xCDD0: 0x6258, - 0xCDD1: 0x8131, - 0xCDD2: 0x9E35, - 0xCDD3: 0x9640, - 0xCDD4: 0x9A6E, - 0xCDD5: 0x9A7C, - 0xCDD6: 0x692D, - 0xCDD7: 0x59A5, - 0xCDD8: 0x62D3, - 0xCDD9: 0x553E, - 0xCDDA: 0x6316, - 0xCDDB: 0x54C7, - 0xCDDC: 0x86D9, - 0xCDDD: 0x6D3C, - 0xCDDE: 0x5A03, - 0xCDDF: 0x74E6, - 0xCDE0: 0x889C, - 0xCDE1: 0x6B6A, - 0xCDE2: 0x5916, - 0xCDE3: 0x8C4C, - 0xCDE4: 0x5F2F, - 0xCDE5: 0x6E7E, - 0xCDE6: 0x73A9, - 0xCDE7: 0x987D, - 0xCDE8: 0x4E38, - 0xCDE9: 0x70F7, - 0xCDEA: 0x5B8C, - 0xCDEB: 0x7897, - 0xCDEC: 0x633D, - 0xCDED: 0x665A, - 0xCDEE: 0x7696, - 0xCDEF: 0x60CB, - 0xCDF0: 0x5B9B, - 0xCDF1: 0x5A49, - 0xCDF2: 0x4E07, - 0xCDF3: 0x8155, - 0xCDF4: 0x6C6A, - 0xCDF5: 0x738B, - 0xCDF6: 0x4EA1, - 0xCDF7: 0x6789, - 0xCDF8: 0x7F51, - 0xCDF9: 0x5F80, - 0xCDFA: 0x65FA, - 0xCDFB: 0x671B, - 0xCDFC: 0x5FD8, - 0xCDFD: 0x5984, - 0xCDFE: 0x5A01, - 0xCE40: 0x8719, - 0xCE41: 0x871B, - 0xCE42: 0x871D, - 0xCE43: 0x871F, - 0xCE44: 0x8720, - 0xCE45: 0x8724, - 0xCE46: 0x8726, - 0xCE47: 0x8727, - 0xCE48: 0x8728, - 0xCE49: 0x872A, - 0xCE4A: 0x872B, - 0xCE4B: 0x872C, - 0xCE4C: 0x872D, - 0xCE4D: 0x872F, - 0xCE4E: 0x8730, - 0xCE4F: 0x8732, - 0xCE50: 0x8733, - 0xCE51: 0x8735, - 0xCE52: 0x8736, - 0xCE53: 0x8738, - 0xCE54: 0x8739, - 0xCE55: 0x873A, - 0xCE56: 0x873C, - 0xCE57: 0x873D, - 0xCE58: 0x8740, - 0xCE59: 0x8741, - 0xCE5A: 0x8742, - 0xCE5B: 0x8743, - 0xCE5C: 0x8744, - 0xCE5D: 0x8745, - 0xCE5E: 0x8746, - 0xCE5F: 0x874A, - 0xCE60: 0x874B, - 0xCE61: 0x874D, - 0xCE62: 0x874F, - 0xCE63: 0x8750, - 0xCE64: 0x8751, - 0xCE65: 0x8752, - 0xCE66: 0x8754, - 0xCE67: 0x8755, - 0xCE68: 0x8756, - 0xCE69: 0x8758, - 0xCE6A: 0x875A, - 0xCE6B: 0x875B, - 0xCE6C: 0x875C, - 0xCE6D: 0x875D, - 0xCE6E: 0x875E, - 0xCE6F: 0x875F, - 0xCE70: 0x8761, - 0xCE71: 0x8762, - 0xCE72: 0x8766, - 0xCE73: 0x8767, - 0xCE74: 0x8768, - 0xCE75: 0x8769, - 0xCE76: 0x876A, - 0xCE77: 0x876B, - 0xCE78: 0x876C, - 0xCE79: 0x876D, - 0xCE7A: 0x876F, - 0xCE7B: 0x8771, - 0xCE7C: 0x8772, - 0xCE7D: 0x8773, - 0xCE7E: 0x8775, - 0xCE80: 0x8777, - 0xCE81: 0x8778, - 0xCE82: 0x8779, - 0xCE83: 0x877A, - 0xCE84: 0x877F, - 0xCE85: 0x8780, - 0xCE86: 0x8781, - 0xCE87: 0x8784, - 0xCE88: 0x8786, - 0xCE89: 0x8787, - 0xCE8A: 0x8789, - 0xCE8B: 0x878A, - 0xCE8C: 0x878C, - 0xCE8D: 0x878E, - 0xCE8E: 0x878F, - 0xCE8F: 0x8790, - 0xCE90: 0x8791, - 0xCE91: 0x8792, - 0xCE92: 0x8794, - 0xCE93: 0x8795, - 0xCE94: 0x8796, - 0xCE95: 0x8798, - 0xCE96: 0x8799, - 0xCE97: 0x879A, - 0xCE98: 0x879B, - 0xCE99: 0x879C, - 0xCE9A: 0x879D, - 0xCE9B: 0x879E, - 0xCE9C: 0x87A0, - 0xCE9D: 0x87A1, - 0xCE9E: 0x87A2, - 0xCE9F: 0x87A3, - 0xCEA0: 0x87A4, - 0xCEA1: 0x5DCD, - 0xCEA2: 0x5FAE, - 0xCEA3: 0x5371, - 0xCEA4: 0x97E6, - 0xCEA5: 0x8FDD, - 0xCEA6: 0x6845, - 0xCEA7: 0x56F4, - 0xCEA8: 0x552F, - 0xCEA9: 0x60DF, - 0xCEAA: 0x4E3A, - 0xCEAB: 0x6F4D, - 0xCEAC: 0x7EF4, - 0xCEAD: 0x82C7, - 0xCEAE: 0x840E, - 0xCEAF: 0x59D4, - 0xCEB0: 0x4F1F, - 0xCEB1: 0x4F2A, - 0xCEB2: 0x5C3E, - 0xCEB3: 0x7EAC, - 0xCEB4: 0x672A, - 0xCEB5: 0x851A, - 0xCEB6: 0x5473, - 0xCEB7: 0x754F, - 0xCEB8: 0x80C3, - 0xCEB9: 0x5582, - 0xCEBA: 0x9B4F, - 0xCEBB: 0x4F4D, - 0xCEBC: 0x6E2D, - 0xCEBD: 0x8C13, - 0xCEBE: 0x5C09, - 0xCEBF: 0x6170, - 0xCEC0: 0x536B, - 0xCEC1: 0x761F, - 0xCEC2: 0x6E29, - 0xCEC3: 0x868A, - 0xCEC4: 0x6587, - 0xCEC5: 0x95FB, - 0xCEC6: 0x7EB9, - 0xCEC7: 0x543B, - 0xCEC8: 0x7A33, - 0xCEC9: 0x7D0A, - 0xCECA: 0x95EE, - 0xCECB: 0x55E1, - 0xCECC: 0x7FC1, - 0xCECD: 0x74EE, - 0xCECE: 0x631D, - 0xCECF: 0x8717, - 0xCED0: 0x6DA1, - 0xCED1: 0x7A9D, - 0xCED2: 0x6211, - 0xCED3: 0x65A1, - 0xCED4: 0x5367, - 0xCED5: 0x63E1, - 0xCED6: 0x6C83, - 0xCED7: 0x5DEB, - 0xCED8: 0x545C, - 0xCED9: 0x94A8, - 0xCEDA: 0x4E4C, - 0xCEDB: 0x6C61, - 0xCEDC: 0x8BEC, - 0xCEDD: 0x5C4B, - 0xCEDE: 0x65E0, - 0xCEDF: 0x829C, - 0xCEE0: 0x68A7, - 0xCEE1: 0x543E, - 0xCEE2: 0x5434, - 0xCEE3: 0x6BCB, - 0xCEE4: 0x6B66, - 0xCEE5: 0x4E94, - 0xCEE6: 0x6342, - 0xCEE7: 0x5348, - 0xCEE8: 0x821E, - 0xCEE9: 0x4F0D, - 0xCEEA: 0x4FAE, - 0xCEEB: 0x575E, - 0xCEEC: 0x620A, - 0xCEED: 0x96FE, - 0xCEEE: 0x6664, - 0xCEEF: 0x7269, - 0xCEF0: 0x52FF, - 0xCEF1: 0x52A1, - 0xCEF2: 0x609F, - 0xCEF3: 0x8BEF, - 0xCEF4: 0x6614, - 0xCEF5: 0x7199, - 0xCEF6: 0x6790, - 0xCEF7: 0x897F, - 0xCEF8: 0x7852, - 0xCEF9: 0x77FD, - 0xCEFA: 0x6670, - 0xCEFB: 0x563B, - 0xCEFC: 0x5438, - 0xCEFD: 0x9521, - 0xCEFE: 0x727A, - 0xCF40: 0x87A5, - 0xCF41: 0x87A6, - 0xCF42: 0x87A7, - 0xCF43: 0x87A9, - 0xCF44: 0x87AA, - 0xCF45: 0x87AE, - 0xCF46: 0x87B0, - 0xCF47: 0x87B1, - 0xCF48: 0x87B2, - 0xCF49: 0x87B4, - 0xCF4A: 0x87B6, - 0xCF4B: 0x87B7, - 0xCF4C: 0x87B8, - 0xCF4D: 0x87B9, - 0xCF4E: 0x87BB, - 0xCF4F: 0x87BC, - 0xCF50: 0x87BE, - 0xCF51: 0x87BF, - 0xCF52: 0x87C1, - 0xCF53: 0x87C2, - 0xCF54: 0x87C3, - 0xCF55: 0x87C4, - 0xCF56: 0x87C5, - 0xCF57: 0x87C7, - 0xCF58: 0x87C8, - 0xCF59: 0x87C9, - 0xCF5A: 0x87CC, - 0xCF5B: 0x87CD, - 0xCF5C: 0x87CE, - 0xCF5D: 0x87CF, - 0xCF5E: 0x87D0, - 0xCF5F: 0x87D4, - 0xCF60: 0x87D5, - 0xCF61: 0x87D6, - 0xCF62: 0x87D7, - 0xCF63: 0x87D8, - 0xCF64: 0x87D9, - 0xCF65: 0x87DA, - 0xCF66: 0x87DC, - 0xCF67: 0x87DD, - 0xCF68: 0x87DE, - 0xCF69: 0x87DF, - 0xCF6A: 0x87E1, - 0xCF6B: 0x87E2, - 0xCF6C: 0x87E3, - 0xCF6D: 0x87E4, - 0xCF6E: 0x87E6, - 0xCF6F: 0x87E7, - 0xCF70: 0x87E8, - 0xCF71: 0x87E9, - 0xCF72: 0x87EB, - 0xCF73: 0x87EC, - 0xCF74: 0x87ED, - 0xCF75: 0x87EF, - 0xCF76: 0x87F0, - 0xCF77: 0x87F1, - 0xCF78: 0x87F2, - 0xCF79: 0x87F3, - 0xCF7A: 0x87F4, - 0xCF7B: 0x87F5, - 0xCF7C: 0x87F6, - 0xCF7D: 0x87F7, - 0xCF7E: 0x87F8, - 0xCF80: 0x87FA, - 0xCF81: 0x87FB, - 0xCF82: 0x87FC, - 0xCF83: 0x87FD, - 0xCF84: 0x87FF, - 0xCF85: 0x8800, - 0xCF86: 0x8801, - 0xCF87: 0x8802, - 0xCF88: 0x8804, - 0xCF89: 0x8805, - 0xCF8A: 0x8806, - 0xCF8B: 0x8807, - 0xCF8C: 0x8808, - 0xCF8D: 0x8809, - 0xCF8E: 0x880B, - 0xCF8F: 0x880C, - 0xCF90: 0x880D, - 0xCF91: 0x880E, - 0xCF92: 0x880F, - 0xCF93: 0x8810, - 0xCF94: 0x8811, - 0xCF95: 0x8812, - 0xCF96: 0x8814, - 0xCF97: 0x8817, - 0xCF98: 0x8818, - 0xCF99: 0x8819, - 0xCF9A: 0x881A, - 0xCF9B: 0x881C, - 0xCF9C: 0x881D, - 0xCF9D: 0x881E, - 0xCF9E: 0x881F, - 0xCF9F: 0x8820, - 0xCFA0: 0x8823, - 0xCFA1: 0x7A00, - 0xCFA2: 0x606F, - 0xCFA3: 0x5E0C, - 0xCFA4: 0x6089, - 0xCFA5: 0x819D, - 0xCFA6: 0x5915, - 0xCFA7: 0x60DC, - 0xCFA8: 0x7184, - 0xCFA9: 0x70EF, - 0xCFAA: 0x6EAA, - 0xCFAB: 0x6C50, - 0xCFAC: 0x7280, - 0xCFAD: 0x6A84, - 0xCFAE: 0x88AD, - 0xCFAF: 0x5E2D, - 0xCFB0: 0x4E60, - 0xCFB1: 0x5AB3, - 0xCFB2: 0x559C, - 0xCFB3: 0x94E3, - 0xCFB4: 0x6D17, - 0xCFB5: 0x7CFB, - 0xCFB6: 0x9699, - 0xCFB7: 0x620F, - 0xCFB8: 0x7EC6, - 0xCFB9: 0x778E, - 0xCFBA: 0x867E, - 0xCFBB: 0x5323, - 0xCFBC: 0x971E, - 0xCFBD: 0x8F96, - 0xCFBE: 0x6687, - 0xCFBF: 0x5CE1, - 0xCFC0: 0x4FA0, - 0xCFC1: 0x72ED, - 0xCFC2: 0x4E0B, - 0xCFC3: 0x53A6, - 0xCFC4: 0x590F, - 0xCFC5: 0x5413, - 0xCFC6: 0x6380, - 0xCFC7: 0x9528, - 0xCFC8: 0x5148, - 0xCFC9: 0x4ED9, - 0xCFCA: 0x9C9C, - 0xCFCB: 0x7EA4, - 0xCFCC: 0x54B8, - 0xCFCD: 0x8D24, - 0xCFCE: 0x8854, - 0xCFCF: 0x8237, - 0xCFD0: 0x95F2, - 0xCFD1: 0x6D8E, - 0xCFD2: 0x5F26, - 0xCFD3: 0x5ACC, - 0xCFD4: 0x663E, - 0xCFD5: 0x9669, - 0xCFD6: 0x73B0, - 0xCFD7: 0x732E, - 0xCFD8: 0x53BF, - 0xCFD9: 0x817A, - 0xCFDA: 0x9985, - 0xCFDB: 0x7FA1, - 0xCFDC: 0x5BAA, - 0xCFDD: 0x9677, - 0xCFDE: 0x9650, - 0xCFDF: 0x7EBF, - 0xCFE0: 0x76F8, - 0xCFE1: 0x53A2, - 0xCFE2: 0x9576, - 0xCFE3: 0x9999, - 0xCFE4: 0x7BB1, - 0xCFE5: 0x8944, - 0xCFE6: 0x6E58, - 0xCFE7: 0x4E61, - 0xCFE8: 0x7FD4, - 0xCFE9: 0x7965, - 0xCFEA: 0x8BE6, - 0xCFEB: 0x60F3, - 0xCFEC: 0x54CD, - 0xCFED: 0x4EAB, - 0xCFEE: 0x9879, - 0xCFEF: 0x5DF7, - 0xCFF0: 0x6A61, - 0xCFF1: 0x50CF, - 0xCFF2: 0x5411, - 0xCFF3: 0x8C61, - 0xCFF4: 0x8427, - 0xCFF5: 0x785D, - 0xCFF6: 0x9704, - 0xCFF7: 0x524A, - 0xCFF8: 0x54EE, - 0xCFF9: 0x56A3, - 0xCFFA: 0x9500, - 0xCFFB: 0x6D88, - 0xCFFC: 0x5BB5, - 0xCFFD: 0x6DC6, - 0xCFFE: 0x6653, - 0xD040: 0x8824, - 0xD041: 0x8825, - 0xD042: 0x8826, - 0xD043: 0x8827, - 0xD044: 0x8828, - 0xD045: 0x8829, - 0xD046: 0x882A, - 0xD047: 0x882B, - 0xD048: 0x882C, - 0xD049: 0x882D, - 0xD04A: 0x882E, - 0xD04B: 0x882F, - 0xD04C: 0x8830, - 0xD04D: 0x8831, - 0xD04E: 0x8833, - 0xD04F: 0x8834, - 0xD050: 0x8835, - 0xD051: 0x8836, - 0xD052: 0x8837, - 0xD053: 0x8838, - 0xD054: 0x883A, - 0xD055: 0x883B, - 0xD056: 0x883D, - 0xD057: 0x883E, - 0xD058: 0x883F, - 0xD059: 0x8841, - 0xD05A: 0x8842, - 0xD05B: 0x8843, - 0xD05C: 0x8846, - 0xD05D: 0x8847, - 0xD05E: 0x8848, - 0xD05F: 0x8849, - 0xD060: 0x884A, - 0xD061: 0x884B, - 0xD062: 0x884E, - 0xD063: 0x884F, - 0xD064: 0x8850, - 0xD065: 0x8851, - 0xD066: 0x8852, - 0xD067: 0x8853, - 0xD068: 0x8855, - 0xD069: 0x8856, - 0xD06A: 0x8858, - 0xD06B: 0x885A, - 0xD06C: 0x885B, - 0xD06D: 0x885C, - 0xD06E: 0x885D, - 0xD06F: 0x885E, - 0xD070: 0x885F, - 0xD071: 0x8860, - 0xD072: 0x8866, - 0xD073: 0x8867, - 0xD074: 0x886A, - 0xD075: 0x886D, - 0xD076: 0x886F, - 0xD077: 0x8871, - 0xD078: 0x8873, - 0xD079: 0x8874, - 0xD07A: 0x8875, - 0xD07B: 0x8876, - 0xD07C: 0x8878, - 0xD07D: 0x8879, - 0xD07E: 0x887A, - 0xD080: 0x887B, - 0xD081: 0x887C, - 0xD082: 0x8880, - 0xD083: 0x8883, - 0xD084: 0x8886, - 0xD085: 0x8887, - 0xD086: 0x8889, - 0xD087: 0x888A, - 0xD088: 0x888C, - 0xD089: 0x888E, - 0xD08A: 0x888F, - 0xD08B: 0x8890, - 0xD08C: 0x8891, - 0xD08D: 0x8893, - 0xD08E: 0x8894, - 0xD08F: 0x8895, - 0xD090: 0x8897, - 0xD091: 0x8898, - 0xD092: 0x8899, - 0xD093: 0x889A, - 0xD094: 0x889B, - 0xD095: 0x889D, - 0xD096: 0x889E, - 0xD097: 0x889F, - 0xD098: 0x88A0, - 0xD099: 0x88A1, - 0xD09A: 0x88A3, - 0xD09B: 0x88A5, - 0xD09C: 0x88A6, - 0xD09D: 0x88A7, - 0xD09E: 0x88A8, - 0xD09F: 0x88A9, - 0xD0A0: 0x88AA, - 0xD0A1: 0x5C0F, - 0xD0A2: 0x5B5D, - 0xD0A3: 0x6821, - 0xD0A4: 0x8096, - 0xD0A5: 0x5578, - 0xD0A6: 0x7B11, - 0xD0A7: 0x6548, - 0xD0A8: 0x6954, - 0xD0A9: 0x4E9B, - 0xD0AA: 0x6B47, - 0xD0AB: 0x874E, - 0xD0AC: 0x978B, - 0xD0AD: 0x534F, - 0xD0AE: 0x631F, - 0xD0AF: 0x643A, - 0xD0B0: 0x90AA, - 0xD0B1: 0x659C, - 0xD0B2: 0x80C1, - 0xD0B3: 0x8C10, - 0xD0B4: 0x5199, - 0xD0B5: 0x68B0, - 0xD0B6: 0x5378, - 0xD0B7: 0x87F9, - 0xD0B8: 0x61C8, - 0xD0B9: 0x6CC4, - 0xD0BA: 0x6CFB, - 0xD0BB: 0x8C22, - 0xD0BC: 0x5C51, - 0xD0BD: 0x85AA, - 0xD0BE: 0x82AF, - 0xD0BF: 0x950C, - 0xD0C0: 0x6B23, - 0xD0C1: 0x8F9B, - 0xD0C2: 0x65B0, - 0xD0C3: 0x5FFB, - 0xD0C4: 0x5FC3, - 0xD0C5: 0x4FE1, - 0xD0C6: 0x8845, - 0xD0C7: 0x661F, - 0xD0C8: 0x8165, - 0xD0C9: 0x7329, - 0xD0CA: 0x60FA, - 0xD0CB: 0x5174, - 0xD0CC: 0x5211, - 0xD0CD: 0x578B, - 0xD0CE: 0x5F62, - 0xD0CF: 0x90A2, - 0xD0D0: 0x884C, - 0xD0D1: 0x9192, - 0xD0D2: 0x5E78, - 0xD0D3: 0x674F, - 0xD0D4: 0x6027, - 0xD0D5: 0x59D3, - 0xD0D6: 0x5144, - 0xD0D7: 0x51F6, - 0xD0D8: 0x80F8, - 0xD0D9: 0x5308, - 0xD0DA: 0x6C79, - 0xD0DB: 0x96C4, - 0xD0DC: 0x718A, - 0xD0DD: 0x4F11, - 0xD0DE: 0x4FEE, - 0xD0DF: 0x7F9E, - 0xD0E0: 0x673D, - 0xD0E1: 0x55C5, - 0xD0E2: 0x9508, - 0xD0E3: 0x79C0, - 0xD0E4: 0x8896, - 0xD0E5: 0x7EE3, - 0xD0E6: 0x589F, - 0xD0E7: 0x620C, - 0xD0E8: 0x9700, - 0xD0E9: 0x865A, - 0xD0EA: 0x5618, - 0xD0EB: 0x987B, - 0xD0EC: 0x5F90, - 0xD0ED: 0x8BB8, - 0xD0EE: 0x84C4, - 0xD0EF: 0x9157, - 0xD0F0: 0x53D9, - 0xD0F1: 0x65ED, - 0xD0F2: 0x5E8F, - 0xD0F3: 0x755C, - 0xD0F4: 0x6064, - 0xD0F5: 0x7D6E, - 0xD0F6: 0x5A7F, - 0xD0F7: 0x7EEA, - 0xD0F8: 0x7EED, - 0xD0F9: 0x8F69, - 0xD0FA: 0x55A7, - 0xD0FB: 0x5BA3, - 0xD0FC: 0x60AC, - 0xD0FD: 0x65CB, - 0xD0FE: 0x7384, - 0xD140: 0x88AC, - 0xD141: 0x88AE, - 0xD142: 0x88AF, - 0xD143: 0x88B0, - 0xD144: 0x88B2, - 0xD145: 0x88B3, - 0xD146: 0x88B4, - 0xD147: 0x88B5, - 0xD148: 0x88B6, - 0xD149: 0x88B8, - 0xD14A: 0x88B9, - 0xD14B: 0x88BA, - 0xD14C: 0x88BB, - 0xD14D: 0x88BD, - 0xD14E: 0x88BE, - 0xD14F: 0x88BF, - 0xD150: 0x88C0, - 0xD151: 0x88C3, - 0xD152: 0x88C4, - 0xD153: 0x88C7, - 0xD154: 0x88C8, - 0xD155: 0x88CA, - 0xD156: 0x88CB, - 0xD157: 0x88CC, - 0xD158: 0x88CD, - 0xD159: 0x88CF, - 0xD15A: 0x88D0, - 0xD15B: 0x88D1, - 0xD15C: 0x88D3, - 0xD15D: 0x88D6, - 0xD15E: 0x88D7, - 0xD15F: 0x88DA, - 0xD160: 0x88DB, - 0xD161: 0x88DC, - 0xD162: 0x88DD, - 0xD163: 0x88DE, - 0xD164: 0x88E0, - 0xD165: 0x88E1, - 0xD166: 0x88E6, - 0xD167: 0x88E7, - 0xD168: 0x88E9, - 0xD169: 0x88EA, - 0xD16A: 0x88EB, - 0xD16B: 0x88EC, - 0xD16C: 0x88ED, - 0xD16D: 0x88EE, - 0xD16E: 0x88EF, - 0xD16F: 0x88F2, - 0xD170: 0x88F5, - 0xD171: 0x88F6, - 0xD172: 0x88F7, - 0xD173: 0x88FA, - 0xD174: 0x88FB, - 0xD175: 0x88FD, - 0xD176: 0x88FF, - 0xD177: 0x8900, - 0xD178: 0x8901, - 0xD179: 0x8903, - 0xD17A: 0x8904, - 0xD17B: 0x8905, - 0xD17C: 0x8906, - 0xD17D: 0x8907, - 0xD17E: 0x8908, - 0xD180: 0x8909, - 0xD181: 0x890B, - 0xD182: 0x890C, - 0xD183: 0x890D, - 0xD184: 0x890E, - 0xD185: 0x890F, - 0xD186: 0x8911, - 0xD187: 0x8914, - 0xD188: 0x8915, - 0xD189: 0x8916, - 0xD18A: 0x8917, - 0xD18B: 0x8918, - 0xD18C: 0x891C, - 0xD18D: 0x891D, - 0xD18E: 0x891E, - 0xD18F: 0x891F, - 0xD190: 0x8920, - 0xD191: 0x8922, - 0xD192: 0x8923, - 0xD193: 0x8924, - 0xD194: 0x8926, - 0xD195: 0x8927, - 0xD196: 0x8928, - 0xD197: 0x8929, - 0xD198: 0x892C, - 0xD199: 0x892D, - 0xD19A: 0x892E, - 0xD19B: 0x892F, - 0xD19C: 0x8931, - 0xD19D: 0x8932, - 0xD19E: 0x8933, - 0xD19F: 0x8935, - 0xD1A0: 0x8937, - 0xD1A1: 0x9009, - 0xD1A2: 0x7663, - 0xD1A3: 0x7729, - 0xD1A4: 0x7EDA, - 0xD1A5: 0x9774, - 0xD1A6: 0x859B, - 0xD1A7: 0x5B66, - 0xD1A8: 0x7A74, - 0xD1A9: 0x96EA, - 0xD1AA: 0x8840, - 0xD1AB: 0x52CB, - 0xD1AC: 0x718F, - 0xD1AD: 0x5FAA, - 0xD1AE: 0x65EC, - 0xD1AF: 0x8BE2, - 0xD1B0: 0x5BFB, - 0xD1B1: 0x9A6F, - 0xD1B2: 0x5DE1, - 0xD1B3: 0x6B89, - 0xD1B4: 0x6C5B, - 0xD1B5: 0x8BAD, - 0xD1B6: 0x8BAF, - 0xD1B7: 0x900A, - 0xD1B8: 0x8FC5, - 0xD1B9: 0x538B, - 0xD1BA: 0x62BC, - 0xD1BB: 0x9E26, - 0xD1BC: 0x9E2D, - 0xD1BD: 0x5440, - 0xD1BE: 0x4E2B, - 0xD1BF: 0x82BD, - 0xD1C0: 0x7259, - 0xD1C1: 0x869C, - 0xD1C2: 0x5D16, - 0xD1C3: 0x8859, - 0xD1C4: 0x6DAF, - 0xD1C5: 0x96C5, - 0xD1C6: 0x54D1, - 0xD1C7: 0x4E9A, - 0xD1C8: 0x8BB6, - 0xD1C9: 0x7109, - 0xD1CA: 0x54BD, - 0xD1CB: 0x9609, - 0xD1CC: 0x70DF, - 0xD1CD: 0x6DF9, - 0xD1CE: 0x76D0, - 0xD1CF: 0x4E25, - 0xD1D0: 0x7814, - 0xD1D1: 0x8712, - 0xD1D2: 0x5CA9, - 0xD1D3: 0x5EF6, - 0xD1D4: 0x8A00, - 0xD1D5: 0x989C, - 0xD1D6: 0x960E, - 0xD1D7: 0x708E, - 0xD1D8: 0x6CBF, - 0xD1D9: 0x5944, - 0xD1DA: 0x63A9, - 0xD1DB: 0x773C, - 0xD1DC: 0x884D, - 0xD1DD: 0x6F14, - 0xD1DE: 0x8273, - 0xD1DF: 0x5830, - 0xD1E0: 0x71D5, - 0xD1E1: 0x538C, - 0xD1E2: 0x781A, - 0xD1E3: 0x96C1, - 0xD1E4: 0x5501, - 0xD1E5: 0x5F66, - 0xD1E6: 0x7130, - 0xD1E7: 0x5BB4, - 0xD1E8: 0x8C1A, - 0xD1E9: 0x9A8C, - 0xD1EA: 0x6B83, - 0xD1EB: 0x592E, - 0xD1EC: 0x9E2F, - 0xD1ED: 0x79E7, - 0xD1EE: 0x6768, - 0xD1EF: 0x626C, - 0xD1F0: 0x4F6F, - 0xD1F1: 0x75A1, - 0xD1F2: 0x7F8A, - 0xD1F3: 0x6D0B, - 0xD1F4: 0x9633, - 0xD1F5: 0x6C27, - 0xD1F6: 0x4EF0, - 0xD1F7: 0x75D2, - 0xD1F8: 0x517B, - 0xD1F9: 0x6837, - 0xD1FA: 0x6F3E, - 0xD1FB: 0x9080, - 0xD1FC: 0x8170, - 0xD1FD: 0x5996, - 0xD1FE: 0x7476, - 0xD240: 0x8938, - 0xD241: 0x8939, - 0xD242: 0x893A, - 0xD243: 0x893B, - 0xD244: 0x893C, - 0xD245: 0x893D, - 0xD246: 0x893E, - 0xD247: 0x893F, - 0xD248: 0x8940, - 0xD249: 0x8942, - 0xD24A: 0x8943, - 0xD24B: 0x8945, - 0xD24C: 0x8946, - 0xD24D: 0x8947, - 0xD24E: 0x8948, - 0xD24F: 0x8949, - 0xD250: 0x894A, - 0xD251: 0x894B, - 0xD252: 0x894C, - 0xD253: 0x894D, - 0xD254: 0x894E, - 0xD255: 0x894F, - 0xD256: 0x8950, - 0xD257: 0x8951, - 0xD258: 0x8952, - 0xD259: 0x8953, - 0xD25A: 0x8954, - 0xD25B: 0x8955, - 0xD25C: 0x8956, - 0xD25D: 0x8957, - 0xD25E: 0x8958, - 0xD25F: 0x8959, - 0xD260: 0x895A, - 0xD261: 0x895B, - 0xD262: 0x895C, - 0xD263: 0x895D, - 0xD264: 0x8960, - 0xD265: 0x8961, - 0xD266: 0x8962, - 0xD267: 0x8963, - 0xD268: 0x8964, - 0xD269: 0x8965, - 0xD26A: 0x8967, - 0xD26B: 0x8968, - 0xD26C: 0x8969, - 0xD26D: 0x896A, - 0xD26E: 0x896B, - 0xD26F: 0x896C, - 0xD270: 0x896D, - 0xD271: 0x896E, - 0xD272: 0x896F, - 0xD273: 0x8970, - 0xD274: 0x8971, - 0xD275: 0x8972, - 0xD276: 0x8973, - 0xD277: 0x8974, - 0xD278: 0x8975, - 0xD279: 0x8976, - 0xD27A: 0x8977, - 0xD27B: 0x8978, - 0xD27C: 0x8979, - 0xD27D: 0x897A, - 0xD27E: 0x897C, - 0xD280: 0x897D, - 0xD281: 0x897E, - 0xD282: 0x8980, - 0xD283: 0x8982, - 0xD284: 0x8984, - 0xD285: 0x8985, - 0xD286: 0x8987, - 0xD287: 0x8988, - 0xD288: 0x8989, - 0xD289: 0x898A, - 0xD28A: 0x898B, - 0xD28B: 0x898C, - 0xD28C: 0x898D, - 0xD28D: 0x898E, - 0xD28E: 0x898F, - 0xD28F: 0x8990, - 0xD290: 0x8991, - 0xD291: 0x8992, - 0xD292: 0x8993, - 0xD293: 0x8994, - 0xD294: 0x8995, - 0xD295: 0x8996, - 0xD296: 0x8997, - 0xD297: 0x8998, - 0xD298: 0x8999, - 0xD299: 0x899A, - 0xD29A: 0x899B, - 0xD29B: 0x899C, - 0xD29C: 0x899D, - 0xD29D: 0x899E, - 0xD29E: 0x899F, - 0xD29F: 0x89A0, - 0xD2A0: 0x89A1, - 0xD2A1: 0x6447, - 0xD2A2: 0x5C27, - 0xD2A3: 0x9065, - 0xD2A4: 0x7A91, - 0xD2A5: 0x8C23, - 0xD2A6: 0x59DA, - 0xD2A7: 0x54AC, - 0xD2A8: 0x8200, - 0xD2A9: 0x836F, - 0xD2AA: 0x8981, - 0xD2AB: 0x8000, - 0xD2AC: 0x6930, - 0xD2AD: 0x564E, - 0xD2AE: 0x8036, - 0xD2AF: 0x7237, - 0xD2B0: 0x91CE, - 0xD2B1: 0x51B6, - 0xD2B2: 0x4E5F, - 0xD2B3: 0x9875, - 0xD2B4: 0x6396, - 0xD2B5: 0x4E1A, - 0xD2B6: 0x53F6, - 0xD2B7: 0x66F3, - 0xD2B8: 0x814B, - 0xD2B9: 0x591C, - 0xD2BA: 0x6DB2, - 0xD2BB: 0x4E00, - 0xD2BC: 0x58F9, - 0xD2BD: 0x533B, - 0xD2BE: 0x63D6, - 0xD2BF: 0x94F1, - 0xD2C0: 0x4F9D, - 0xD2C1: 0x4F0A, - 0xD2C2: 0x8863, - 0xD2C3: 0x9890, - 0xD2C4: 0x5937, - 0xD2C5: 0x9057, - 0xD2C6: 0x79FB, - 0xD2C7: 0x4EEA, - 0xD2C8: 0x80F0, - 0xD2C9: 0x7591, - 0xD2CA: 0x6C82, - 0xD2CB: 0x5B9C, - 0xD2CC: 0x59E8, - 0xD2CD: 0x5F5D, - 0xD2CE: 0x6905, - 0xD2CF: 0x8681, - 0xD2D0: 0x501A, - 0xD2D1: 0x5DF2, - 0xD2D2: 0x4E59, - 0xD2D3: 0x77E3, - 0xD2D4: 0x4EE5, - 0xD2D5: 0x827A, - 0xD2D6: 0x6291, - 0xD2D7: 0x6613, - 0xD2D8: 0x9091, - 0xD2D9: 0x5C79, - 0xD2DA: 0x4EBF, - 0xD2DB: 0x5F79, - 0xD2DC: 0x81C6, - 0xD2DD: 0x9038, - 0xD2DE: 0x8084, - 0xD2DF: 0x75AB, - 0xD2E0: 0x4EA6, - 0xD2E1: 0x88D4, - 0xD2E2: 0x610F, - 0xD2E3: 0x6BC5, - 0xD2E4: 0x5FC6, - 0xD2E5: 0x4E49, - 0xD2E6: 0x76CA, - 0xD2E7: 0x6EA2, - 0xD2E8: 0x8BE3, - 0xD2E9: 0x8BAE, - 0xD2EA: 0x8C0A, - 0xD2EB: 0x8BD1, - 0xD2EC: 0x5F02, - 0xD2ED: 0x7FFC, - 0xD2EE: 0x7FCC, - 0xD2EF: 0x7ECE, - 0xD2F0: 0x8335, - 0xD2F1: 0x836B, - 0xD2F2: 0x56E0, - 0xD2F3: 0x6BB7, - 0xD2F4: 0x97F3, - 0xD2F5: 0x9634, - 0xD2F6: 0x59FB, - 0xD2F7: 0x541F, - 0xD2F8: 0x94F6, - 0xD2F9: 0x6DEB, - 0xD2FA: 0x5BC5, - 0xD2FB: 0x996E, - 0xD2FC: 0x5C39, - 0xD2FD: 0x5F15, - 0xD2FE: 0x9690, - 0xD340: 0x89A2, - 0xD341: 0x89A3, - 0xD342: 0x89A4, - 0xD343: 0x89A5, - 0xD344: 0x89A6, - 0xD345: 0x89A7, - 0xD346: 0x89A8, - 0xD347: 0x89A9, - 0xD348: 0x89AA, - 0xD349: 0x89AB, - 0xD34A: 0x89AC, - 0xD34B: 0x89AD, - 0xD34C: 0x89AE, - 0xD34D: 0x89AF, - 0xD34E: 0x89B0, - 0xD34F: 0x89B1, - 0xD350: 0x89B2, - 0xD351: 0x89B3, - 0xD352: 0x89B4, - 0xD353: 0x89B5, - 0xD354: 0x89B6, - 0xD355: 0x89B7, - 0xD356: 0x89B8, - 0xD357: 0x89B9, - 0xD358: 0x89BA, - 0xD359: 0x89BB, - 0xD35A: 0x89BC, - 0xD35B: 0x89BD, - 0xD35C: 0x89BE, - 0xD35D: 0x89BF, - 0xD35E: 0x89C0, - 0xD35F: 0x89C3, - 0xD360: 0x89CD, - 0xD361: 0x89D3, - 0xD362: 0x89D4, - 0xD363: 0x89D5, - 0xD364: 0x89D7, - 0xD365: 0x89D8, - 0xD366: 0x89D9, - 0xD367: 0x89DB, - 0xD368: 0x89DD, - 0xD369: 0x89DF, - 0xD36A: 0x89E0, - 0xD36B: 0x89E1, - 0xD36C: 0x89E2, - 0xD36D: 0x89E4, - 0xD36E: 0x89E7, - 0xD36F: 0x89E8, - 0xD370: 0x89E9, - 0xD371: 0x89EA, - 0xD372: 0x89EC, - 0xD373: 0x89ED, - 0xD374: 0x89EE, - 0xD375: 0x89F0, - 0xD376: 0x89F1, - 0xD377: 0x89F2, - 0xD378: 0x89F4, - 0xD379: 0x89F5, - 0xD37A: 0x89F6, - 0xD37B: 0x89F7, - 0xD37C: 0x89F8, - 0xD37D: 0x89F9, - 0xD37E: 0x89FA, - 0xD380: 0x89FB, - 0xD381: 0x89FC, - 0xD382: 0x89FD, - 0xD383: 0x89FE, - 0xD384: 0x89FF, - 0xD385: 0x8A01, - 0xD386: 0x8A02, - 0xD387: 0x8A03, - 0xD388: 0x8A04, - 0xD389: 0x8A05, - 0xD38A: 0x8A06, - 0xD38B: 0x8A08, - 0xD38C: 0x8A09, - 0xD38D: 0x8A0A, - 0xD38E: 0x8A0B, - 0xD38F: 0x8A0C, - 0xD390: 0x8A0D, - 0xD391: 0x8A0E, - 0xD392: 0x8A0F, - 0xD393: 0x8A10, - 0xD394: 0x8A11, - 0xD395: 0x8A12, - 0xD396: 0x8A13, - 0xD397: 0x8A14, - 0xD398: 0x8A15, - 0xD399: 0x8A16, - 0xD39A: 0x8A17, - 0xD39B: 0x8A18, - 0xD39C: 0x8A19, - 0xD39D: 0x8A1A, - 0xD39E: 0x8A1B, - 0xD39F: 0x8A1C, - 0xD3A0: 0x8A1D, - 0xD3A1: 0x5370, - 0xD3A2: 0x82F1, - 0xD3A3: 0x6A31, - 0xD3A4: 0x5A74, - 0xD3A5: 0x9E70, - 0xD3A6: 0x5E94, - 0xD3A7: 0x7F28, - 0xD3A8: 0x83B9, - 0xD3A9: 0x8424, - 0xD3AA: 0x8425, - 0xD3AB: 0x8367, - 0xD3AC: 0x8747, - 0xD3AD: 0x8FCE, - 0xD3AE: 0x8D62, - 0xD3AF: 0x76C8, - 0xD3B0: 0x5F71, - 0xD3B1: 0x9896, - 0xD3B2: 0x786C, - 0xD3B3: 0x6620, - 0xD3B4: 0x54DF, - 0xD3B5: 0x62E5, - 0xD3B6: 0x4F63, - 0xD3B7: 0x81C3, - 0xD3B8: 0x75C8, - 0xD3B9: 0x5EB8, - 0xD3BA: 0x96CD, - 0xD3BB: 0x8E0A, - 0xD3BC: 0x86F9, - 0xD3BD: 0x548F, - 0xD3BE: 0x6CF3, - 0xD3BF: 0x6D8C, - 0xD3C0: 0x6C38, - 0xD3C1: 0x607F, - 0xD3C2: 0x52C7, - 0xD3C3: 0x7528, - 0xD3C4: 0x5E7D, - 0xD3C5: 0x4F18, - 0xD3C6: 0x60A0, - 0xD3C7: 0x5FE7, - 0xD3C8: 0x5C24, - 0xD3C9: 0x7531, - 0xD3CA: 0x90AE, - 0xD3CB: 0x94C0, - 0xD3CC: 0x72B9, - 0xD3CD: 0x6CB9, - 0xD3CE: 0x6E38, - 0xD3CF: 0x9149, - 0xD3D0: 0x6709, - 0xD3D1: 0x53CB, - 0xD3D2: 0x53F3, - 0xD3D3: 0x4F51, - 0xD3D4: 0x91C9, - 0xD3D5: 0x8BF1, - 0xD3D6: 0x53C8, - 0xD3D7: 0x5E7C, - 0xD3D8: 0x8FC2, - 0xD3D9: 0x6DE4, - 0xD3DA: 0x4E8E, - 0xD3DB: 0x76C2, - 0xD3DC: 0x6986, - 0xD3DD: 0x865E, - 0xD3DE: 0x611A, - 0xD3DF: 0x8206, - 0xD3E0: 0x4F59, - 0xD3E1: 0x4FDE, - 0xD3E2: 0x903E, - 0xD3E3: 0x9C7C, - 0xD3E4: 0x6109, - 0xD3E5: 0x6E1D, - 0xD3E6: 0x6E14, - 0xD3E7: 0x9685, - 0xD3E8: 0x4E88, - 0xD3E9: 0x5A31, - 0xD3EA: 0x96E8, - 0xD3EB: 0x4E0E, - 0xD3EC: 0x5C7F, - 0xD3ED: 0x79B9, - 0xD3EE: 0x5B87, - 0xD3EF: 0x8BED, - 0xD3F0: 0x7FBD, - 0xD3F1: 0x7389, - 0xD3F2: 0x57DF, - 0xD3F3: 0x828B, - 0xD3F4: 0x90C1, - 0xD3F5: 0x5401, - 0xD3F6: 0x9047, - 0xD3F7: 0x55BB, - 0xD3F8: 0x5CEA, - 0xD3F9: 0x5FA1, - 0xD3FA: 0x6108, - 0xD3FB: 0x6B32, - 0xD3FC: 0x72F1, - 0xD3FD: 0x80B2, - 0xD3FE: 0x8A89, - 0xD440: 0x8A1E, - 0xD441: 0x8A1F, - 0xD442: 0x8A20, - 0xD443: 0x8A21, - 0xD444: 0x8A22, - 0xD445: 0x8A23, - 0xD446: 0x8A24, - 0xD447: 0x8A25, - 0xD448: 0x8A26, - 0xD449: 0x8A27, - 0xD44A: 0x8A28, - 0xD44B: 0x8A29, - 0xD44C: 0x8A2A, - 0xD44D: 0x8A2B, - 0xD44E: 0x8A2C, - 0xD44F: 0x8A2D, - 0xD450: 0x8A2E, - 0xD451: 0x8A2F, - 0xD452: 0x8A30, - 0xD453: 0x8A31, - 0xD454: 0x8A32, - 0xD455: 0x8A33, - 0xD456: 0x8A34, - 0xD457: 0x8A35, - 0xD458: 0x8A36, - 0xD459: 0x8A37, - 0xD45A: 0x8A38, - 0xD45B: 0x8A39, - 0xD45C: 0x8A3A, - 0xD45D: 0x8A3B, - 0xD45E: 0x8A3C, - 0xD45F: 0x8A3D, - 0xD460: 0x8A3F, - 0xD461: 0x8A40, - 0xD462: 0x8A41, - 0xD463: 0x8A42, - 0xD464: 0x8A43, - 0xD465: 0x8A44, - 0xD466: 0x8A45, - 0xD467: 0x8A46, - 0xD468: 0x8A47, - 0xD469: 0x8A49, - 0xD46A: 0x8A4A, - 0xD46B: 0x8A4B, - 0xD46C: 0x8A4C, - 0xD46D: 0x8A4D, - 0xD46E: 0x8A4E, - 0xD46F: 0x8A4F, - 0xD470: 0x8A50, - 0xD471: 0x8A51, - 0xD472: 0x8A52, - 0xD473: 0x8A53, - 0xD474: 0x8A54, - 0xD475: 0x8A55, - 0xD476: 0x8A56, - 0xD477: 0x8A57, - 0xD478: 0x8A58, - 0xD479: 0x8A59, - 0xD47A: 0x8A5A, - 0xD47B: 0x8A5B, - 0xD47C: 0x8A5C, - 0xD47D: 0x8A5D, - 0xD47E: 0x8A5E, - 0xD480: 0x8A5F, - 0xD481: 0x8A60, - 0xD482: 0x8A61, - 0xD483: 0x8A62, - 0xD484: 0x8A63, - 0xD485: 0x8A64, - 0xD486: 0x8A65, - 0xD487: 0x8A66, - 0xD488: 0x8A67, - 0xD489: 0x8A68, - 0xD48A: 0x8A69, - 0xD48B: 0x8A6A, - 0xD48C: 0x8A6B, - 0xD48D: 0x8A6C, - 0xD48E: 0x8A6D, - 0xD48F: 0x8A6E, - 0xD490: 0x8A6F, - 0xD491: 0x8A70, - 0xD492: 0x8A71, - 0xD493: 0x8A72, - 0xD494: 0x8A73, - 0xD495: 0x8A74, - 0xD496: 0x8A75, - 0xD497: 0x8A76, - 0xD498: 0x8A77, - 0xD499: 0x8A78, - 0xD49A: 0x8A7A, - 0xD49B: 0x8A7B, - 0xD49C: 0x8A7C, - 0xD49D: 0x8A7D, - 0xD49E: 0x8A7E, - 0xD49F: 0x8A7F, - 0xD4A0: 0x8A80, - 0xD4A1: 0x6D74, - 0xD4A2: 0x5BD3, - 0xD4A3: 0x88D5, - 0xD4A4: 0x9884, - 0xD4A5: 0x8C6B, - 0xD4A6: 0x9A6D, - 0xD4A7: 0x9E33, - 0xD4A8: 0x6E0A, - 0xD4A9: 0x51A4, - 0xD4AA: 0x5143, - 0xD4AB: 0x57A3, - 0xD4AC: 0x8881, - 0xD4AD: 0x539F, - 0xD4AE: 0x63F4, - 0xD4AF: 0x8F95, - 0xD4B0: 0x56ED, - 0xD4B1: 0x5458, - 0xD4B2: 0x5706, - 0xD4B3: 0x733F, - 0xD4B4: 0x6E90, - 0xD4B5: 0x7F18, - 0xD4B6: 0x8FDC, - 0xD4B7: 0x82D1, - 0xD4B8: 0x613F, - 0xD4B9: 0x6028, - 0xD4BA: 0x9662, - 0xD4BB: 0x66F0, - 0xD4BC: 0x7EA6, - 0xD4BD: 0x8D8A, - 0xD4BE: 0x8DC3, - 0xD4BF: 0x94A5, - 0xD4C0: 0x5CB3, - 0xD4C1: 0x7CA4, - 0xD4C2: 0x6708, - 0xD4C3: 0x60A6, - 0xD4C4: 0x9605, - 0xD4C5: 0x8018, - 0xD4C6: 0x4E91, - 0xD4C7: 0x90E7, - 0xD4C8: 0x5300, - 0xD4C9: 0x9668, - 0xD4CA: 0x5141, - 0xD4CB: 0x8FD0, - 0xD4CC: 0x8574, - 0xD4CD: 0x915D, - 0xD4CE: 0x6655, - 0xD4CF: 0x97F5, - 0xD4D0: 0x5B55, - 0xD4D1: 0x531D, - 0xD4D2: 0x7838, - 0xD4D3: 0x6742, - 0xD4D4: 0x683D, - 0xD4D5: 0x54C9, - 0xD4D6: 0x707E, - 0xD4D7: 0x5BB0, - 0xD4D8: 0x8F7D, - 0xD4D9: 0x518D, - 0xD4DA: 0x5728, - 0xD4DB: 0x54B1, - 0xD4DC: 0x6512, - 0xD4DD: 0x6682, - 0xD4DE: 0x8D5E, - 0xD4DF: 0x8D43, - 0xD4E0: 0x810F, - 0xD4E1: 0x846C, - 0xD4E2: 0x906D, - 0xD4E3: 0x7CDF, - 0xD4E4: 0x51FF, - 0xD4E5: 0x85FB, - 0xD4E6: 0x67A3, - 0xD4E7: 0x65E9, - 0xD4E8: 0x6FA1, - 0xD4E9: 0x86A4, - 0xD4EA: 0x8E81, - 0xD4EB: 0x566A, - 0xD4EC: 0x9020, - 0xD4ED: 0x7682, - 0xD4EE: 0x7076, - 0xD4EF: 0x71E5, - 0xD4F0: 0x8D23, - 0xD4F1: 0x62E9, - 0xD4F2: 0x5219, - 0xD4F3: 0x6CFD, - 0xD4F4: 0x8D3C, - 0xD4F5: 0x600E, - 0xD4F6: 0x589E, - 0xD4F7: 0x618E, - 0xD4F8: 0x66FE, - 0xD4F9: 0x8D60, - 0xD4FA: 0x624E, - 0xD4FB: 0x55B3, - 0xD4FC: 0x6E23, - 0xD4FD: 0x672D, - 0xD4FE: 0x8F67, - 0xD540: 0x8A81, - 0xD541: 0x8A82, - 0xD542: 0x8A83, - 0xD543: 0x8A84, - 0xD544: 0x8A85, - 0xD545: 0x8A86, - 0xD546: 0x8A87, - 0xD547: 0x8A88, - 0xD548: 0x8A8B, - 0xD549: 0x8A8C, - 0xD54A: 0x8A8D, - 0xD54B: 0x8A8E, - 0xD54C: 0x8A8F, - 0xD54D: 0x8A90, - 0xD54E: 0x8A91, - 0xD54F: 0x8A92, - 0xD550: 0x8A94, - 0xD551: 0x8A95, - 0xD552: 0x8A96, - 0xD553: 0x8A97, - 0xD554: 0x8A98, - 0xD555: 0x8A99, - 0xD556: 0x8A9A, - 0xD557: 0x8A9B, - 0xD558: 0x8A9C, - 0xD559: 0x8A9D, - 0xD55A: 0x8A9E, - 0xD55B: 0x8A9F, - 0xD55C: 0x8AA0, - 0xD55D: 0x8AA1, - 0xD55E: 0x8AA2, - 0xD55F: 0x8AA3, - 0xD560: 0x8AA4, - 0xD561: 0x8AA5, - 0xD562: 0x8AA6, - 0xD563: 0x8AA7, - 0xD564: 0x8AA8, - 0xD565: 0x8AA9, - 0xD566: 0x8AAA, - 0xD567: 0x8AAB, - 0xD568: 0x8AAC, - 0xD569: 0x8AAD, - 0xD56A: 0x8AAE, - 0xD56B: 0x8AAF, - 0xD56C: 0x8AB0, - 0xD56D: 0x8AB1, - 0xD56E: 0x8AB2, - 0xD56F: 0x8AB3, - 0xD570: 0x8AB4, - 0xD571: 0x8AB5, - 0xD572: 0x8AB6, - 0xD573: 0x8AB7, - 0xD574: 0x8AB8, - 0xD575: 0x8AB9, - 0xD576: 0x8ABA, - 0xD577: 0x8ABB, - 0xD578: 0x8ABC, - 0xD579: 0x8ABD, - 0xD57A: 0x8ABE, - 0xD57B: 0x8ABF, - 0xD57C: 0x8AC0, - 0xD57D: 0x8AC1, - 0xD57E: 0x8AC2, - 0xD580: 0x8AC3, - 0xD581: 0x8AC4, - 0xD582: 0x8AC5, - 0xD583: 0x8AC6, - 0xD584: 0x8AC7, - 0xD585: 0x8AC8, - 0xD586: 0x8AC9, - 0xD587: 0x8ACA, - 0xD588: 0x8ACB, - 0xD589: 0x8ACC, - 0xD58A: 0x8ACD, - 0xD58B: 0x8ACE, - 0xD58C: 0x8ACF, - 0xD58D: 0x8AD0, - 0xD58E: 0x8AD1, - 0xD58F: 0x8AD2, - 0xD590: 0x8AD3, - 0xD591: 0x8AD4, - 0xD592: 0x8AD5, - 0xD593: 0x8AD6, - 0xD594: 0x8AD7, - 0xD595: 0x8AD8, - 0xD596: 0x8AD9, - 0xD597: 0x8ADA, - 0xD598: 0x8ADB, - 0xD599: 0x8ADC, - 0xD59A: 0x8ADD, - 0xD59B: 0x8ADE, - 0xD59C: 0x8ADF, - 0xD59D: 0x8AE0, - 0xD59E: 0x8AE1, - 0xD59F: 0x8AE2, - 0xD5A0: 0x8AE3, - 0xD5A1: 0x94E1, - 0xD5A2: 0x95F8, - 0xD5A3: 0x7728, - 0xD5A4: 0x6805, - 0xD5A5: 0x69A8, - 0xD5A6: 0x548B, - 0xD5A7: 0x4E4D, - 0xD5A8: 0x70B8, - 0xD5A9: 0x8BC8, - 0xD5AA: 0x6458, - 0xD5AB: 0x658B, - 0xD5AC: 0x5B85, - 0xD5AD: 0x7A84, - 0xD5AE: 0x503A, - 0xD5AF: 0x5BE8, - 0xD5B0: 0x77BB, - 0xD5B1: 0x6BE1, - 0xD5B2: 0x8A79, - 0xD5B3: 0x7C98, - 0xD5B4: 0x6CBE, - 0xD5B5: 0x76CF, - 0xD5B6: 0x65A9, - 0xD5B7: 0x8F97, - 0xD5B8: 0x5D2D, - 0xD5B9: 0x5C55, - 0xD5BA: 0x8638, - 0xD5BB: 0x6808, - 0xD5BC: 0x5360, - 0xD5BD: 0x6218, - 0xD5BE: 0x7AD9, - 0xD5BF: 0x6E5B, - 0xD5C0: 0x7EFD, - 0xD5C1: 0x6A1F, - 0xD5C2: 0x7AE0, - 0xD5C3: 0x5F70, - 0xD5C4: 0x6F33, - 0xD5C5: 0x5F20, - 0xD5C6: 0x638C, - 0xD5C7: 0x6DA8, - 0xD5C8: 0x6756, - 0xD5C9: 0x4E08, - 0xD5CA: 0x5E10, - 0xD5CB: 0x8D26, - 0xD5CC: 0x4ED7, - 0xD5CD: 0x80C0, - 0xD5CE: 0x7634, - 0xD5CF: 0x969C, - 0xD5D0: 0x62DB, - 0xD5D1: 0x662D, - 0xD5D2: 0x627E, - 0xD5D3: 0x6CBC, - 0xD5D4: 0x8D75, - 0xD5D5: 0x7167, - 0xD5D6: 0x7F69, - 0xD5D7: 0x5146, - 0xD5D8: 0x8087, - 0xD5D9: 0x53EC, - 0xD5DA: 0x906E, - 0xD5DB: 0x6298, - 0xD5DC: 0x54F2, - 0xD5DD: 0x86F0, - 0xD5DE: 0x8F99, - 0xD5DF: 0x8005, - 0xD5E0: 0x9517, - 0xD5E1: 0x8517, - 0xD5E2: 0x8FD9, - 0xD5E3: 0x6D59, - 0xD5E4: 0x73CD, - 0xD5E5: 0x659F, - 0xD5E6: 0x771F, - 0xD5E7: 0x7504, - 0xD5E8: 0x7827, - 0xD5E9: 0x81FB, - 0xD5EA: 0x8D1E, - 0xD5EB: 0x9488, - 0xD5EC: 0x4FA6, - 0xD5ED: 0x6795, - 0xD5EE: 0x75B9, - 0xD5EF: 0x8BCA, - 0xD5F0: 0x9707, - 0xD5F1: 0x632F, - 0xD5F2: 0x9547, - 0xD5F3: 0x9635, - 0xD5F4: 0x84B8, - 0xD5F5: 0x6323, - 0xD5F6: 0x7741, - 0xD5F7: 0x5F81, - 0xD5F8: 0x72F0, - 0xD5F9: 0x4E89, - 0xD5FA: 0x6014, - 0xD5FB: 0x6574, - 0xD5FC: 0x62EF, - 0xD5FD: 0x6B63, - 0xD5FE: 0x653F, - 0xD640: 0x8AE4, - 0xD641: 0x8AE5, - 0xD642: 0x8AE6, - 0xD643: 0x8AE7, - 0xD644: 0x8AE8, - 0xD645: 0x8AE9, - 0xD646: 0x8AEA, - 0xD647: 0x8AEB, - 0xD648: 0x8AEC, - 0xD649: 0x8AED, - 0xD64A: 0x8AEE, - 0xD64B: 0x8AEF, - 0xD64C: 0x8AF0, - 0xD64D: 0x8AF1, - 0xD64E: 0x8AF2, - 0xD64F: 0x8AF3, - 0xD650: 0x8AF4, - 0xD651: 0x8AF5, - 0xD652: 0x8AF6, - 0xD653: 0x8AF7, - 0xD654: 0x8AF8, - 0xD655: 0x8AF9, - 0xD656: 0x8AFA, - 0xD657: 0x8AFB, - 0xD658: 0x8AFC, - 0xD659: 0x8AFD, - 0xD65A: 0x8AFE, - 0xD65B: 0x8AFF, - 0xD65C: 0x8B00, - 0xD65D: 0x8B01, - 0xD65E: 0x8B02, - 0xD65F: 0x8B03, - 0xD660: 0x8B04, - 0xD661: 0x8B05, - 0xD662: 0x8B06, - 0xD663: 0x8B08, - 0xD664: 0x8B09, - 0xD665: 0x8B0A, - 0xD666: 0x8B0B, - 0xD667: 0x8B0C, - 0xD668: 0x8B0D, - 0xD669: 0x8B0E, - 0xD66A: 0x8B0F, - 0xD66B: 0x8B10, - 0xD66C: 0x8B11, - 0xD66D: 0x8B12, - 0xD66E: 0x8B13, - 0xD66F: 0x8B14, - 0xD670: 0x8B15, - 0xD671: 0x8B16, - 0xD672: 0x8B17, - 0xD673: 0x8B18, - 0xD674: 0x8B19, - 0xD675: 0x8B1A, - 0xD676: 0x8B1B, - 0xD677: 0x8B1C, - 0xD678: 0x8B1D, - 0xD679: 0x8B1E, - 0xD67A: 0x8B1F, - 0xD67B: 0x8B20, - 0xD67C: 0x8B21, - 0xD67D: 0x8B22, - 0xD67E: 0x8B23, - 0xD680: 0x8B24, - 0xD681: 0x8B25, - 0xD682: 0x8B27, - 0xD683: 0x8B28, - 0xD684: 0x8B29, - 0xD685: 0x8B2A, - 0xD686: 0x8B2B, - 0xD687: 0x8B2C, - 0xD688: 0x8B2D, - 0xD689: 0x8B2E, - 0xD68A: 0x8B2F, - 0xD68B: 0x8B30, - 0xD68C: 0x8B31, - 0xD68D: 0x8B32, - 0xD68E: 0x8B33, - 0xD68F: 0x8B34, - 0xD690: 0x8B35, - 0xD691: 0x8B36, - 0xD692: 0x8B37, - 0xD693: 0x8B38, - 0xD694: 0x8B39, - 0xD695: 0x8B3A, - 0xD696: 0x8B3B, - 0xD697: 0x8B3C, - 0xD698: 0x8B3D, - 0xD699: 0x8B3E, - 0xD69A: 0x8B3F, - 0xD69B: 0x8B40, - 0xD69C: 0x8B41, - 0xD69D: 0x8B42, - 0xD69E: 0x8B43, - 0xD69F: 0x8B44, - 0xD6A0: 0x8B45, - 0xD6A1: 0x5E27, - 0xD6A2: 0x75C7, - 0xD6A3: 0x90D1, - 0xD6A4: 0x8BC1, - 0xD6A5: 0x829D, - 0xD6A6: 0x679D, - 0xD6A7: 0x652F, - 0xD6A8: 0x5431, - 0xD6A9: 0x8718, - 0xD6AA: 0x77E5, - 0xD6AB: 0x80A2, - 0xD6AC: 0x8102, - 0xD6AD: 0x6C41, - 0xD6AE: 0x4E4B, - 0xD6AF: 0x7EC7, - 0xD6B0: 0x804C, - 0xD6B1: 0x76F4, - 0xD6B2: 0x690D, - 0xD6B3: 0x6B96, - 0xD6B4: 0x6267, - 0xD6B5: 0x503C, - 0xD6B6: 0x4F84, - 0xD6B7: 0x5740, - 0xD6B8: 0x6307, - 0xD6B9: 0x6B62, - 0xD6BA: 0x8DBE, - 0xD6BB: 0x53EA, - 0xD6BC: 0x65E8, - 0xD6BD: 0x7EB8, - 0xD6BE: 0x5FD7, - 0xD6BF: 0x631A, - 0xD6C0: 0x63B7, - 0xD6C1: 0x81F3, - 0xD6C2: 0x81F4, - 0xD6C3: 0x7F6E, - 0xD6C4: 0x5E1C, - 0xD6C5: 0x5CD9, - 0xD6C6: 0x5236, - 0xD6C7: 0x667A, - 0xD6C8: 0x79E9, - 0xD6C9: 0x7A1A, - 0xD6CA: 0x8D28, - 0xD6CB: 0x7099, - 0xD6CC: 0x75D4, - 0xD6CD: 0x6EDE, - 0xD6CE: 0x6CBB, - 0xD6CF: 0x7A92, - 0xD6D0: 0x4E2D, - 0xD6D1: 0x76C5, - 0xD6D2: 0x5FE0, - 0xD6D3: 0x949F, - 0xD6D4: 0x8877, - 0xD6D5: 0x7EC8, - 0xD6D6: 0x79CD, - 0xD6D7: 0x80BF, - 0xD6D8: 0x91CD, - 0xD6D9: 0x4EF2, - 0xD6DA: 0x4F17, - 0xD6DB: 0x821F, - 0xD6DC: 0x5468, - 0xD6DD: 0x5DDE, - 0xD6DE: 0x6D32, - 0xD6DF: 0x8BCC, - 0xD6E0: 0x7CA5, - 0xD6E1: 0x8F74, - 0xD6E2: 0x8098, - 0xD6E3: 0x5E1A, - 0xD6E4: 0x5492, - 0xD6E5: 0x76B1, - 0xD6E6: 0x5B99, - 0xD6E7: 0x663C, - 0xD6E8: 0x9AA4, - 0xD6E9: 0x73E0, - 0xD6EA: 0x682A, - 0xD6EB: 0x86DB, - 0xD6EC: 0x6731, - 0xD6ED: 0x732A, - 0xD6EE: 0x8BF8, - 0xD6EF: 0x8BDB, - 0xD6F0: 0x9010, - 0xD6F1: 0x7AF9, - 0xD6F2: 0x70DB, - 0xD6F3: 0x716E, - 0xD6F4: 0x62C4, - 0xD6F5: 0x77A9, - 0xD6F6: 0x5631, - 0xD6F7: 0x4E3B, - 0xD6F8: 0x8457, - 0xD6F9: 0x67F1, - 0xD6FA: 0x52A9, - 0xD6FB: 0x86C0, - 0xD6FC: 0x8D2E, - 0xD6FD: 0x94F8, - 0xD6FE: 0x7B51, - 0xD740: 0x8B46, - 0xD741: 0x8B47, - 0xD742: 0x8B48, - 0xD743: 0x8B49, - 0xD744: 0x8B4A, - 0xD745: 0x8B4B, - 0xD746: 0x8B4C, - 0xD747: 0x8B4D, - 0xD748: 0x8B4E, - 0xD749: 0x8B4F, - 0xD74A: 0x8B50, - 0xD74B: 0x8B51, - 0xD74C: 0x8B52, - 0xD74D: 0x8B53, - 0xD74E: 0x8B54, - 0xD74F: 0x8B55, - 0xD750: 0x8B56, - 0xD751: 0x8B57, - 0xD752: 0x8B58, - 0xD753: 0x8B59, - 0xD754: 0x8B5A, - 0xD755: 0x8B5B, - 0xD756: 0x8B5C, - 0xD757: 0x8B5D, - 0xD758: 0x8B5E, - 0xD759: 0x8B5F, - 0xD75A: 0x8B60, - 0xD75B: 0x8B61, - 0xD75C: 0x8B62, - 0xD75D: 0x8B63, - 0xD75E: 0x8B64, - 0xD75F: 0x8B65, - 0xD760: 0x8B67, - 0xD761: 0x8B68, - 0xD762: 0x8B69, - 0xD763: 0x8B6A, - 0xD764: 0x8B6B, - 0xD765: 0x8B6D, - 0xD766: 0x8B6E, - 0xD767: 0x8B6F, - 0xD768: 0x8B70, - 0xD769: 0x8B71, - 0xD76A: 0x8B72, - 0xD76B: 0x8B73, - 0xD76C: 0x8B74, - 0xD76D: 0x8B75, - 0xD76E: 0x8B76, - 0xD76F: 0x8B77, - 0xD770: 0x8B78, - 0xD771: 0x8B79, - 0xD772: 0x8B7A, - 0xD773: 0x8B7B, - 0xD774: 0x8B7C, - 0xD775: 0x8B7D, - 0xD776: 0x8B7E, - 0xD777: 0x8B7F, - 0xD778: 0x8B80, - 0xD779: 0x8B81, - 0xD77A: 0x8B82, - 0xD77B: 0x8B83, - 0xD77C: 0x8B84, - 0xD77D: 0x8B85, - 0xD77E: 0x8B86, - 0xD780: 0x8B87, - 0xD781: 0x8B88, - 0xD782: 0x8B89, - 0xD783: 0x8B8A, - 0xD784: 0x8B8B, - 0xD785: 0x8B8C, - 0xD786: 0x8B8D, - 0xD787: 0x8B8E, - 0xD788: 0x8B8F, - 0xD789: 0x8B90, - 0xD78A: 0x8B91, - 0xD78B: 0x8B92, - 0xD78C: 0x8B93, - 0xD78D: 0x8B94, - 0xD78E: 0x8B95, - 0xD78F: 0x8B96, - 0xD790: 0x8B97, - 0xD791: 0x8B98, - 0xD792: 0x8B99, - 0xD793: 0x8B9A, - 0xD794: 0x8B9B, - 0xD795: 0x8B9C, - 0xD796: 0x8B9D, - 0xD797: 0x8B9E, - 0xD798: 0x8B9F, - 0xD799: 0x8BAC, - 0xD79A: 0x8BB1, - 0xD79B: 0x8BBB, - 0xD79C: 0x8BC7, - 0xD79D: 0x8BD0, - 0xD79E: 0x8BEA, - 0xD79F: 0x8C09, - 0xD7A0: 0x8C1E, - 0xD7A1: 0x4F4F, - 0xD7A2: 0x6CE8, - 0xD7A3: 0x795D, - 0xD7A4: 0x9A7B, - 0xD7A5: 0x6293, - 0xD7A6: 0x722A, - 0xD7A7: 0x62FD, - 0xD7A8: 0x4E13, - 0xD7A9: 0x7816, - 0xD7AA: 0x8F6C, - 0xD7AB: 0x64B0, - 0xD7AC: 0x8D5A, - 0xD7AD: 0x7BC6, - 0xD7AE: 0x6869, - 0xD7AF: 0x5E84, - 0xD7B0: 0x88C5, - 0xD7B1: 0x5986, - 0xD7B2: 0x649E, - 0xD7B3: 0x58EE, - 0xD7B4: 0x72B6, - 0xD7B5: 0x690E, - 0xD7B6: 0x9525, - 0xD7B7: 0x8FFD, - 0xD7B8: 0x8D58, - 0xD7B9: 0x5760, - 0xD7BA: 0x7F00, - 0xD7BB: 0x8C06, - 0xD7BC: 0x51C6, - 0xD7BD: 0x6349, - 0xD7BE: 0x62D9, - 0xD7BF: 0x5353, - 0xD7C0: 0x684C, - 0xD7C1: 0x7422, - 0xD7C2: 0x8301, - 0xD7C3: 0x914C, - 0xD7C4: 0x5544, - 0xD7C5: 0x7740, - 0xD7C6: 0x707C, - 0xD7C7: 0x6D4A, - 0xD7C8: 0x5179, - 0xD7C9: 0x54A8, - 0xD7CA: 0x8D44, - 0xD7CB: 0x59FF, - 0xD7CC: 0x6ECB, - 0xD7CD: 0x6DC4, - 0xD7CE: 0x5B5C, - 0xD7CF: 0x7D2B, - 0xD7D0: 0x4ED4, - 0xD7D1: 0x7C7D, - 0xD7D2: 0x6ED3, - 0xD7D3: 0x5B50, - 0xD7D4: 0x81EA, - 0xD7D5: 0x6E0D, - 0xD7D6: 0x5B57, - 0xD7D7: 0x9B03, - 0xD7D8: 0x68D5, - 0xD7D9: 0x8E2A, - 0xD7DA: 0x5B97, - 0xD7DB: 0x7EFC, - 0xD7DC: 0x603B, - 0xD7DD: 0x7EB5, - 0xD7DE: 0x90B9, - 0xD7DF: 0x8D70, - 0xD7E0: 0x594F, - 0xD7E1: 0x63CD, - 0xD7E2: 0x79DF, - 0xD7E3: 0x8DB3, - 0xD7E4: 0x5352, - 0xD7E5: 0x65CF, - 0xD7E6: 0x7956, - 0xD7E7: 0x8BC5, - 0xD7E8: 0x963B, - 0xD7E9: 0x7EC4, - 0xD7EA: 0x94BB, - 0xD7EB: 0x7E82, - 0xD7EC: 0x5634, - 0xD7ED: 0x9189, - 0xD7EE: 0x6700, - 0xD7EF: 0x7F6A, - 0xD7F0: 0x5C0A, - 0xD7F1: 0x9075, - 0xD7F2: 0x6628, - 0xD7F3: 0x5DE6, - 0xD7F4: 0x4F50, - 0xD7F5: 0x67DE, - 0xD7F6: 0x505A, - 0xD7F7: 0x4F5C, - 0xD7F8: 0x5750, - 0xD7F9: 0x5EA7, - 0xD7FA: 0xE810, - 0xD7FB: 0xE811, - 0xD7FC: 0xE812, - 0xD7FD: 0xE813, - 0xD7FE: 0xE814, - 0xD840: 0x8C38, - 0xD841: 0x8C39, - 0xD842: 0x8C3A, - 0xD843: 0x8C3B, - 0xD844: 0x8C3C, - 0xD845: 0x8C3D, - 0xD846: 0x8C3E, - 0xD847: 0x8C3F, - 0xD848: 0x8C40, - 0xD849: 0x8C42, - 0xD84A: 0x8C43, - 0xD84B: 0x8C44, - 0xD84C: 0x8C45, - 0xD84D: 0x8C48, - 0xD84E: 0x8C4A, - 0xD84F: 0x8C4B, - 0xD850: 0x8C4D, - 0xD851: 0x8C4E, - 0xD852: 0x8C4F, - 0xD853: 0x8C50, - 0xD854: 0x8C51, - 0xD855: 0x8C52, - 0xD856: 0x8C53, - 0xD857: 0x8C54, - 0xD858: 0x8C56, - 0xD859: 0x8C57, - 0xD85A: 0x8C58, - 0xD85B: 0x8C59, - 0xD85C: 0x8C5B, - 0xD85D: 0x8C5C, - 0xD85E: 0x8C5D, - 0xD85F: 0x8C5E, - 0xD860: 0x8C5F, - 0xD861: 0x8C60, - 0xD862: 0x8C63, - 0xD863: 0x8C64, - 0xD864: 0x8C65, - 0xD865: 0x8C66, - 0xD866: 0x8C67, - 0xD867: 0x8C68, - 0xD868: 0x8C69, - 0xD869: 0x8C6C, - 0xD86A: 0x8C6D, - 0xD86B: 0x8C6E, - 0xD86C: 0x8C6F, - 0xD86D: 0x8C70, - 0xD86E: 0x8C71, - 0xD86F: 0x8C72, - 0xD870: 0x8C74, - 0xD871: 0x8C75, - 0xD872: 0x8C76, - 0xD873: 0x8C77, - 0xD874: 0x8C7B, - 0xD875: 0x8C7C, - 0xD876: 0x8C7D, - 0xD877: 0x8C7E, - 0xD878: 0x8C7F, - 0xD879: 0x8C80, - 0xD87A: 0x8C81, - 0xD87B: 0x8C83, - 0xD87C: 0x8C84, - 0xD87D: 0x8C86, - 0xD87E: 0x8C87, - 0xD880: 0x8C88, - 0xD881: 0x8C8B, - 0xD882: 0x8C8D, - 0xD883: 0x8C8E, - 0xD884: 0x8C8F, - 0xD885: 0x8C90, - 0xD886: 0x8C91, - 0xD887: 0x8C92, - 0xD888: 0x8C93, - 0xD889: 0x8C95, - 0xD88A: 0x8C96, - 0xD88B: 0x8C97, - 0xD88C: 0x8C99, - 0xD88D: 0x8C9A, - 0xD88E: 0x8C9B, - 0xD88F: 0x8C9C, - 0xD890: 0x8C9D, - 0xD891: 0x8C9E, - 0xD892: 0x8C9F, - 0xD893: 0x8CA0, - 0xD894: 0x8CA1, - 0xD895: 0x8CA2, - 0xD896: 0x8CA3, - 0xD897: 0x8CA4, - 0xD898: 0x8CA5, - 0xD899: 0x8CA6, - 0xD89A: 0x8CA7, - 0xD89B: 0x8CA8, - 0xD89C: 0x8CA9, - 0xD89D: 0x8CAA, - 0xD89E: 0x8CAB, - 0xD89F: 0x8CAC, - 0xD8A0: 0x8CAD, - 0xD8A1: 0x4E8D, - 0xD8A2: 0x4E0C, - 0xD8A3: 0x5140, - 0xD8A4: 0x4E10, - 0xD8A5: 0x5EFF, - 0xD8A6: 0x5345, - 0xD8A7: 0x4E15, - 0xD8A8: 0x4E98, - 0xD8A9: 0x4E1E, - 0xD8AA: 0x9B32, - 0xD8AB: 0x5B6C, - 0xD8AC: 0x5669, - 0xD8AD: 0x4E28, - 0xD8AE: 0x79BA, - 0xD8AF: 0x4E3F, - 0xD8B0: 0x5315, - 0xD8B1: 0x4E47, - 0xD8B2: 0x592D, - 0xD8B3: 0x723B, - 0xD8B4: 0x536E, - 0xD8B5: 0x6C10, - 0xD8B6: 0x56DF, - 0xD8B7: 0x80E4, - 0xD8B8: 0x9997, - 0xD8B9: 0x6BD3, - 0xD8BA: 0x777E, - 0xD8BB: 0x9F17, - 0xD8BC: 0x4E36, - 0xD8BD: 0x4E9F, - 0xD8BE: 0x9F10, - 0xD8BF: 0x4E5C, - 0xD8C0: 0x4E69, - 0xD8C1: 0x4E93, - 0xD8C2: 0x8288, - 0xD8C3: 0x5B5B, - 0xD8C4: 0x556C, - 0xD8C5: 0x560F, - 0xD8C6: 0x4EC4, - 0xD8C7: 0x538D, - 0xD8C8: 0x539D, - 0xD8C9: 0x53A3, - 0xD8CA: 0x53A5, - 0xD8CB: 0x53AE, - 0xD8CC: 0x9765, - 0xD8CD: 0x8D5D, - 0xD8CE: 0x531A, - 0xD8CF: 0x53F5, - 0xD8D0: 0x5326, - 0xD8D1: 0x532E, - 0xD8D2: 0x533E, - 0xD8D3: 0x8D5C, - 0xD8D4: 0x5366, - 0xD8D5: 0x5363, - 0xD8D6: 0x5202, - 0xD8D7: 0x5208, - 0xD8D8: 0x520E, - 0xD8D9: 0x522D, - 0xD8DA: 0x5233, - 0xD8DB: 0x523F, - 0xD8DC: 0x5240, - 0xD8DD: 0x524C, - 0xD8DE: 0x525E, - 0xD8DF: 0x5261, - 0xD8E0: 0x525C, - 0xD8E1: 0x84AF, - 0xD8E2: 0x527D, - 0xD8E3: 0x5282, - 0xD8E4: 0x5281, - 0xD8E5: 0x5290, - 0xD8E6: 0x5293, - 0xD8E7: 0x5182, - 0xD8E8: 0x7F54, - 0xD8E9: 0x4EBB, - 0xD8EA: 0x4EC3, - 0xD8EB: 0x4EC9, - 0xD8EC: 0x4EC2, - 0xD8ED: 0x4EE8, - 0xD8EE: 0x4EE1, - 0xD8EF: 0x4EEB, - 0xD8F0: 0x4EDE, - 0xD8F1: 0x4F1B, - 0xD8F2: 0x4EF3, - 0xD8F3: 0x4F22, - 0xD8F4: 0x4F64, - 0xD8F5: 0x4EF5, - 0xD8F6: 0x4F25, - 0xD8F7: 0x4F27, - 0xD8F8: 0x4F09, - 0xD8F9: 0x4F2B, - 0xD8FA: 0x4F5E, - 0xD8FB: 0x4F67, - 0xD8FC: 0x6538, - 0xD8FD: 0x4F5A, - 0xD8FE: 0x4F5D, - 0xD940: 0x8CAE, - 0xD941: 0x8CAF, - 0xD942: 0x8CB0, - 0xD943: 0x8CB1, - 0xD944: 0x8CB2, - 0xD945: 0x8CB3, - 0xD946: 0x8CB4, - 0xD947: 0x8CB5, - 0xD948: 0x8CB6, - 0xD949: 0x8CB7, - 0xD94A: 0x8CB8, - 0xD94B: 0x8CB9, - 0xD94C: 0x8CBA, - 0xD94D: 0x8CBB, - 0xD94E: 0x8CBC, - 0xD94F: 0x8CBD, - 0xD950: 0x8CBE, - 0xD951: 0x8CBF, - 0xD952: 0x8CC0, - 0xD953: 0x8CC1, - 0xD954: 0x8CC2, - 0xD955: 0x8CC3, - 0xD956: 0x8CC4, - 0xD957: 0x8CC5, - 0xD958: 0x8CC6, - 0xD959: 0x8CC7, - 0xD95A: 0x8CC8, - 0xD95B: 0x8CC9, - 0xD95C: 0x8CCA, - 0xD95D: 0x8CCB, - 0xD95E: 0x8CCC, - 0xD95F: 0x8CCD, - 0xD960: 0x8CCE, - 0xD961: 0x8CCF, - 0xD962: 0x8CD0, - 0xD963: 0x8CD1, - 0xD964: 0x8CD2, - 0xD965: 0x8CD3, - 0xD966: 0x8CD4, - 0xD967: 0x8CD5, - 0xD968: 0x8CD6, - 0xD969: 0x8CD7, - 0xD96A: 0x8CD8, - 0xD96B: 0x8CD9, - 0xD96C: 0x8CDA, - 0xD96D: 0x8CDB, - 0xD96E: 0x8CDC, - 0xD96F: 0x8CDD, - 0xD970: 0x8CDE, - 0xD971: 0x8CDF, - 0xD972: 0x8CE0, - 0xD973: 0x8CE1, - 0xD974: 0x8CE2, - 0xD975: 0x8CE3, - 0xD976: 0x8CE4, - 0xD977: 0x8CE5, - 0xD978: 0x8CE6, - 0xD979: 0x8CE7, - 0xD97A: 0x8CE8, - 0xD97B: 0x8CE9, - 0xD97C: 0x8CEA, - 0xD97D: 0x8CEB, - 0xD97E: 0x8CEC, - 0xD980: 0x8CED, - 0xD981: 0x8CEE, - 0xD982: 0x8CEF, - 0xD983: 0x8CF0, - 0xD984: 0x8CF1, - 0xD985: 0x8CF2, - 0xD986: 0x8CF3, - 0xD987: 0x8CF4, - 0xD988: 0x8CF5, - 0xD989: 0x8CF6, - 0xD98A: 0x8CF7, - 0xD98B: 0x8CF8, - 0xD98C: 0x8CF9, - 0xD98D: 0x8CFA, - 0xD98E: 0x8CFB, - 0xD98F: 0x8CFC, - 0xD990: 0x8CFD, - 0xD991: 0x8CFE, - 0xD992: 0x8CFF, - 0xD993: 0x8D00, - 0xD994: 0x8D01, - 0xD995: 0x8D02, - 0xD996: 0x8D03, - 0xD997: 0x8D04, - 0xD998: 0x8D05, - 0xD999: 0x8D06, - 0xD99A: 0x8D07, - 0xD99B: 0x8D08, - 0xD99C: 0x8D09, - 0xD99D: 0x8D0A, - 0xD99E: 0x8D0B, - 0xD99F: 0x8D0C, - 0xD9A0: 0x8D0D, - 0xD9A1: 0x4F5F, - 0xD9A2: 0x4F57, - 0xD9A3: 0x4F32, - 0xD9A4: 0x4F3D, - 0xD9A5: 0x4F76, - 0xD9A6: 0x4F74, - 0xD9A7: 0x4F91, - 0xD9A8: 0x4F89, - 0xD9A9: 0x4F83, - 0xD9AA: 0x4F8F, - 0xD9AB: 0x4F7E, - 0xD9AC: 0x4F7B, - 0xD9AD: 0x4FAA, - 0xD9AE: 0x4F7C, - 0xD9AF: 0x4FAC, - 0xD9B0: 0x4F94, - 0xD9B1: 0x4FE6, - 0xD9B2: 0x4FE8, - 0xD9B3: 0x4FEA, - 0xD9B4: 0x4FC5, - 0xD9B5: 0x4FDA, - 0xD9B6: 0x4FE3, - 0xD9B7: 0x4FDC, - 0xD9B8: 0x4FD1, - 0xD9B9: 0x4FDF, - 0xD9BA: 0x4FF8, - 0xD9BB: 0x5029, - 0xD9BC: 0x504C, - 0xD9BD: 0x4FF3, - 0xD9BE: 0x502C, - 0xD9BF: 0x500F, - 0xD9C0: 0x502E, - 0xD9C1: 0x502D, - 0xD9C2: 0x4FFE, - 0xD9C3: 0x501C, - 0xD9C4: 0x500C, - 0xD9C5: 0x5025, - 0xD9C6: 0x5028, - 0xD9C7: 0x507E, - 0xD9C8: 0x5043, - 0xD9C9: 0x5055, - 0xD9CA: 0x5048, - 0xD9CB: 0x504E, - 0xD9CC: 0x506C, - 0xD9CD: 0x507B, - 0xD9CE: 0x50A5, - 0xD9CF: 0x50A7, - 0xD9D0: 0x50A9, - 0xD9D1: 0x50BA, - 0xD9D2: 0x50D6, - 0xD9D3: 0x5106, - 0xD9D4: 0x50ED, - 0xD9D5: 0x50EC, - 0xD9D6: 0x50E6, - 0xD9D7: 0x50EE, - 0xD9D8: 0x5107, - 0xD9D9: 0x510B, - 0xD9DA: 0x4EDD, - 0xD9DB: 0x6C3D, - 0xD9DC: 0x4F58, - 0xD9DD: 0x4F65, - 0xD9DE: 0x4FCE, - 0xD9DF: 0x9FA0, - 0xD9E0: 0x6C46, - 0xD9E1: 0x7C74, - 0xD9E2: 0x516E, - 0xD9E3: 0x5DFD, - 0xD9E4: 0x9EC9, - 0xD9E5: 0x9998, - 0xD9E6: 0x5181, - 0xD9E7: 0x5914, - 0xD9E8: 0x52F9, - 0xD9E9: 0x530D, - 0xD9EA: 0x8A07, - 0xD9EB: 0x5310, - 0xD9EC: 0x51EB, - 0xD9ED: 0x5919, - 0xD9EE: 0x5155, - 0xD9EF: 0x4EA0, - 0xD9F0: 0x5156, - 0xD9F1: 0x4EB3, - 0xD9F2: 0x886E, - 0xD9F3: 0x88A4, - 0xD9F4: 0x4EB5, - 0xD9F5: 0x8114, - 0xD9F6: 0x88D2, - 0xD9F7: 0x7980, - 0xD9F8: 0x5B34, - 0xD9F9: 0x8803, - 0xD9FA: 0x7FB8, - 0xD9FB: 0x51AB, - 0xD9FC: 0x51B1, - 0xD9FD: 0x51BD, - 0xD9FE: 0x51BC, - 0xDA40: 0x8D0E, - 0xDA41: 0x8D0F, - 0xDA42: 0x8D10, - 0xDA43: 0x8D11, - 0xDA44: 0x8D12, - 0xDA45: 0x8D13, - 0xDA46: 0x8D14, - 0xDA47: 0x8D15, - 0xDA48: 0x8D16, - 0xDA49: 0x8D17, - 0xDA4A: 0x8D18, - 0xDA4B: 0x8D19, - 0xDA4C: 0x8D1A, - 0xDA4D: 0x8D1B, - 0xDA4E: 0x8D1C, - 0xDA4F: 0x8D20, - 0xDA50: 0x8D51, - 0xDA51: 0x8D52, - 0xDA52: 0x8D57, - 0xDA53: 0x8D5F, - 0xDA54: 0x8D65, - 0xDA55: 0x8D68, - 0xDA56: 0x8D69, - 0xDA57: 0x8D6A, - 0xDA58: 0x8D6C, - 0xDA59: 0x8D6E, - 0xDA5A: 0x8D6F, - 0xDA5B: 0x8D71, - 0xDA5C: 0x8D72, - 0xDA5D: 0x8D78, - 0xDA5E: 0x8D79, - 0xDA5F: 0x8D7A, - 0xDA60: 0x8D7B, - 0xDA61: 0x8D7C, - 0xDA62: 0x8D7D, - 0xDA63: 0x8D7E, - 0xDA64: 0x8D7F, - 0xDA65: 0x8D80, - 0xDA66: 0x8D82, - 0xDA67: 0x8D83, - 0xDA68: 0x8D86, - 0xDA69: 0x8D87, - 0xDA6A: 0x8D88, - 0xDA6B: 0x8D89, - 0xDA6C: 0x8D8C, - 0xDA6D: 0x8D8D, - 0xDA6E: 0x8D8E, - 0xDA6F: 0x8D8F, - 0xDA70: 0x8D90, - 0xDA71: 0x8D92, - 0xDA72: 0x8D93, - 0xDA73: 0x8D95, - 0xDA74: 0x8D96, - 0xDA75: 0x8D97, - 0xDA76: 0x8D98, - 0xDA77: 0x8D99, - 0xDA78: 0x8D9A, - 0xDA79: 0x8D9B, - 0xDA7A: 0x8D9C, - 0xDA7B: 0x8D9D, - 0xDA7C: 0x8D9E, - 0xDA7D: 0x8DA0, - 0xDA7E: 0x8DA1, - 0xDA80: 0x8DA2, - 0xDA81: 0x8DA4, - 0xDA82: 0x8DA5, - 0xDA83: 0x8DA6, - 0xDA84: 0x8DA7, - 0xDA85: 0x8DA8, - 0xDA86: 0x8DA9, - 0xDA87: 0x8DAA, - 0xDA88: 0x8DAB, - 0xDA89: 0x8DAC, - 0xDA8A: 0x8DAD, - 0xDA8B: 0x8DAE, - 0xDA8C: 0x8DAF, - 0xDA8D: 0x8DB0, - 0xDA8E: 0x8DB2, - 0xDA8F: 0x8DB6, - 0xDA90: 0x8DB7, - 0xDA91: 0x8DB9, - 0xDA92: 0x8DBB, - 0xDA93: 0x8DBD, - 0xDA94: 0x8DC0, - 0xDA95: 0x8DC1, - 0xDA96: 0x8DC2, - 0xDA97: 0x8DC5, - 0xDA98: 0x8DC7, - 0xDA99: 0x8DC8, - 0xDA9A: 0x8DC9, - 0xDA9B: 0x8DCA, - 0xDA9C: 0x8DCD, - 0xDA9D: 0x8DD0, - 0xDA9E: 0x8DD2, - 0xDA9F: 0x8DD3, - 0xDAA0: 0x8DD4, - 0xDAA1: 0x51C7, - 0xDAA2: 0x5196, - 0xDAA3: 0x51A2, - 0xDAA4: 0x51A5, - 0xDAA5: 0x8BA0, - 0xDAA6: 0x8BA6, - 0xDAA7: 0x8BA7, - 0xDAA8: 0x8BAA, - 0xDAA9: 0x8BB4, - 0xDAAA: 0x8BB5, - 0xDAAB: 0x8BB7, - 0xDAAC: 0x8BC2, - 0xDAAD: 0x8BC3, - 0xDAAE: 0x8BCB, - 0xDAAF: 0x8BCF, - 0xDAB0: 0x8BCE, - 0xDAB1: 0x8BD2, - 0xDAB2: 0x8BD3, - 0xDAB3: 0x8BD4, - 0xDAB4: 0x8BD6, - 0xDAB5: 0x8BD8, - 0xDAB6: 0x8BD9, - 0xDAB7: 0x8BDC, - 0xDAB8: 0x8BDF, - 0xDAB9: 0x8BE0, - 0xDABA: 0x8BE4, - 0xDABB: 0x8BE8, - 0xDABC: 0x8BE9, - 0xDABD: 0x8BEE, - 0xDABE: 0x8BF0, - 0xDABF: 0x8BF3, - 0xDAC0: 0x8BF6, - 0xDAC1: 0x8BF9, - 0xDAC2: 0x8BFC, - 0xDAC3: 0x8BFF, - 0xDAC4: 0x8C00, - 0xDAC5: 0x8C02, - 0xDAC6: 0x8C04, - 0xDAC7: 0x8C07, - 0xDAC8: 0x8C0C, - 0xDAC9: 0x8C0F, - 0xDACA: 0x8C11, - 0xDACB: 0x8C12, - 0xDACC: 0x8C14, - 0xDACD: 0x8C15, - 0xDACE: 0x8C16, - 0xDACF: 0x8C19, - 0xDAD0: 0x8C1B, - 0xDAD1: 0x8C18, - 0xDAD2: 0x8C1D, - 0xDAD3: 0x8C1F, - 0xDAD4: 0x8C20, - 0xDAD5: 0x8C21, - 0xDAD6: 0x8C25, - 0xDAD7: 0x8C27, - 0xDAD8: 0x8C2A, - 0xDAD9: 0x8C2B, - 0xDADA: 0x8C2E, - 0xDADB: 0x8C2F, - 0xDADC: 0x8C32, - 0xDADD: 0x8C33, - 0xDADE: 0x8C35, - 0xDADF: 0x8C36, - 0xDAE0: 0x5369, - 0xDAE1: 0x537A, - 0xDAE2: 0x961D, - 0xDAE3: 0x9622, - 0xDAE4: 0x9621, - 0xDAE5: 0x9631, - 0xDAE6: 0x962A, - 0xDAE7: 0x963D, - 0xDAE8: 0x963C, - 0xDAE9: 0x9642, - 0xDAEA: 0x9649, - 0xDAEB: 0x9654, - 0xDAEC: 0x965F, - 0xDAED: 0x9667, - 0xDAEE: 0x966C, - 0xDAEF: 0x9672, - 0xDAF0: 0x9674, - 0xDAF1: 0x9688, - 0xDAF2: 0x968D, - 0xDAF3: 0x9697, - 0xDAF4: 0x96B0, - 0xDAF5: 0x9097, - 0xDAF6: 0x909B, - 0xDAF7: 0x909D, - 0xDAF8: 0x9099, - 0xDAF9: 0x90AC, - 0xDAFA: 0x90A1, - 0xDAFB: 0x90B4, - 0xDAFC: 0x90B3, - 0xDAFD: 0x90B6, - 0xDAFE: 0x90BA, - 0xDB40: 0x8DD5, - 0xDB41: 0x8DD8, - 0xDB42: 0x8DD9, - 0xDB43: 0x8DDC, - 0xDB44: 0x8DE0, - 0xDB45: 0x8DE1, - 0xDB46: 0x8DE2, - 0xDB47: 0x8DE5, - 0xDB48: 0x8DE6, - 0xDB49: 0x8DE7, - 0xDB4A: 0x8DE9, - 0xDB4B: 0x8DED, - 0xDB4C: 0x8DEE, - 0xDB4D: 0x8DF0, - 0xDB4E: 0x8DF1, - 0xDB4F: 0x8DF2, - 0xDB50: 0x8DF4, - 0xDB51: 0x8DF6, - 0xDB52: 0x8DFC, - 0xDB53: 0x8DFE, - 0xDB54: 0x8DFF, - 0xDB55: 0x8E00, - 0xDB56: 0x8E01, - 0xDB57: 0x8E02, - 0xDB58: 0x8E03, - 0xDB59: 0x8E04, - 0xDB5A: 0x8E06, - 0xDB5B: 0x8E07, - 0xDB5C: 0x8E08, - 0xDB5D: 0x8E0B, - 0xDB5E: 0x8E0D, - 0xDB5F: 0x8E0E, - 0xDB60: 0x8E10, - 0xDB61: 0x8E11, - 0xDB62: 0x8E12, - 0xDB63: 0x8E13, - 0xDB64: 0x8E15, - 0xDB65: 0x8E16, - 0xDB66: 0x8E17, - 0xDB67: 0x8E18, - 0xDB68: 0x8E19, - 0xDB69: 0x8E1A, - 0xDB6A: 0x8E1B, - 0xDB6B: 0x8E1C, - 0xDB6C: 0x8E20, - 0xDB6D: 0x8E21, - 0xDB6E: 0x8E24, - 0xDB6F: 0x8E25, - 0xDB70: 0x8E26, - 0xDB71: 0x8E27, - 0xDB72: 0x8E28, - 0xDB73: 0x8E2B, - 0xDB74: 0x8E2D, - 0xDB75: 0x8E30, - 0xDB76: 0x8E32, - 0xDB77: 0x8E33, - 0xDB78: 0x8E34, - 0xDB79: 0x8E36, - 0xDB7A: 0x8E37, - 0xDB7B: 0x8E38, - 0xDB7C: 0x8E3B, - 0xDB7D: 0x8E3C, - 0xDB7E: 0x8E3E, - 0xDB80: 0x8E3F, - 0xDB81: 0x8E43, - 0xDB82: 0x8E45, - 0xDB83: 0x8E46, - 0xDB84: 0x8E4C, - 0xDB85: 0x8E4D, - 0xDB86: 0x8E4E, - 0xDB87: 0x8E4F, - 0xDB88: 0x8E50, - 0xDB89: 0x8E53, - 0xDB8A: 0x8E54, - 0xDB8B: 0x8E55, - 0xDB8C: 0x8E56, - 0xDB8D: 0x8E57, - 0xDB8E: 0x8E58, - 0xDB8F: 0x8E5A, - 0xDB90: 0x8E5B, - 0xDB91: 0x8E5C, - 0xDB92: 0x8E5D, - 0xDB93: 0x8E5E, - 0xDB94: 0x8E5F, - 0xDB95: 0x8E60, - 0xDB96: 0x8E61, - 0xDB97: 0x8E62, - 0xDB98: 0x8E63, - 0xDB99: 0x8E64, - 0xDB9A: 0x8E65, - 0xDB9B: 0x8E67, - 0xDB9C: 0x8E68, - 0xDB9D: 0x8E6A, - 0xDB9E: 0x8E6B, - 0xDB9F: 0x8E6E, - 0xDBA0: 0x8E71, - 0xDBA1: 0x90B8, - 0xDBA2: 0x90B0, - 0xDBA3: 0x90CF, - 0xDBA4: 0x90C5, - 0xDBA5: 0x90BE, - 0xDBA6: 0x90D0, - 0xDBA7: 0x90C4, - 0xDBA8: 0x90C7, - 0xDBA9: 0x90D3, - 0xDBAA: 0x90E6, - 0xDBAB: 0x90E2, - 0xDBAC: 0x90DC, - 0xDBAD: 0x90D7, - 0xDBAE: 0x90DB, - 0xDBAF: 0x90EB, - 0xDBB0: 0x90EF, - 0xDBB1: 0x90FE, - 0xDBB2: 0x9104, - 0xDBB3: 0x9122, - 0xDBB4: 0x911E, - 0xDBB5: 0x9123, - 0xDBB6: 0x9131, - 0xDBB7: 0x912F, - 0xDBB8: 0x9139, - 0xDBB9: 0x9143, - 0xDBBA: 0x9146, - 0xDBBB: 0x520D, - 0xDBBC: 0x5942, - 0xDBBD: 0x52A2, - 0xDBBE: 0x52AC, - 0xDBBF: 0x52AD, - 0xDBC0: 0x52BE, - 0xDBC1: 0x54FF, - 0xDBC2: 0x52D0, - 0xDBC3: 0x52D6, - 0xDBC4: 0x52F0, - 0xDBC5: 0x53DF, - 0xDBC6: 0x71EE, - 0xDBC7: 0x77CD, - 0xDBC8: 0x5EF4, - 0xDBC9: 0x51F5, - 0xDBCA: 0x51FC, - 0xDBCB: 0x9B2F, - 0xDBCC: 0x53B6, - 0xDBCD: 0x5F01, - 0xDBCE: 0x755A, - 0xDBCF: 0x5DEF, - 0xDBD0: 0x574C, - 0xDBD1: 0x57A9, - 0xDBD2: 0x57A1, - 0xDBD3: 0x587E, - 0xDBD4: 0x58BC, - 0xDBD5: 0x58C5, - 0xDBD6: 0x58D1, - 0xDBD7: 0x5729, - 0xDBD8: 0x572C, - 0xDBD9: 0x572A, - 0xDBDA: 0x5733, - 0xDBDB: 0x5739, - 0xDBDC: 0x572E, - 0xDBDD: 0x572F, - 0xDBDE: 0x575C, - 0xDBDF: 0x573B, - 0xDBE0: 0x5742, - 0xDBE1: 0x5769, - 0xDBE2: 0x5785, - 0xDBE3: 0x576B, - 0xDBE4: 0x5786, - 0xDBE5: 0x577C, - 0xDBE6: 0x577B, - 0xDBE7: 0x5768, - 0xDBE8: 0x576D, - 0xDBE9: 0x5776, - 0xDBEA: 0x5773, - 0xDBEB: 0x57AD, - 0xDBEC: 0x57A4, - 0xDBED: 0x578C, - 0xDBEE: 0x57B2, - 0xDBEF: 0x57CF, - 0xDBF0: 0x57A7, - 0xDBF1: 0x57B4, - 0xDBF2: 0x5793, - 0xDBF3: 0x57A0, - 0xDBF4: 0x57D5, - 0xDBF5: 0x57D8, - 0xDBF6: 0x57DA, - 0xDBF7: 0x57D9, - 0xDBF8: 0x57D2, - 0xDBF9: 0x57B8, - 0xDBFA: 0x57F4, - 0xDBFB: 0x57EF, - 0xDBFC: 0x57F8, - 0xDBFD: 0x57E4, - 0xDBFE: 0x57DD, - 0xDC40: 0x8E73, - 0xDC41: 0x8E75, - 0xDC42: 0x8E77, - 0xDC43: 0x8E78, - 0xDC44: 0x8E79, - 0xDC45: 0x8E7A, - 0xDC46: 0x8E7B, - 0xDC47: 0x8E7D, - 0xDC48: 0x8E7E, - 0xDC49: 0x8E80, - 0xDC4A: 0x8E82, - 0xDC4B: 0x8E83, - 0xDC4C: 0x8E84, - 0xDC4D: 0x8E86, - 0xDC4E: 0x8E88, - 0xDC4F: 0x8E89, - 0xDC50: 0x8E8A, - 0xDC51: 0x8E8B, - 0xDC52: 0x8E8C, - 0xDC53: 0x8E8D, - 0xDC54: 0x8E8E, - 0xDC55: 0x8E91, - 0xDC56: 0x8E92, - 0xDC57: 0x8E93, - 0xDC58: 0x8E95, - 0xDC59: 0x8E96, - 0xDC5A: 0x8E97, - 0xDC5B: 0x8E98, - 0xDC5C: 0x8E99, - 0xDC5D: 0x8E9A, - 0xDC5E: 0x8E9B, - 0xDC5F: 0x8E9D, - 0xDC60: 0x8E9F, - 0xDC61: 0x8EA0, - 0xDC62: 0x8EA1, - 0xDC63: 0x8EA2, - 0xDC64: 0x8EA3, - 0xDC65: 0x8EA4, - 0xDC66: 0x8EA5, - 0xDC67: 0x8EA6, - 0xDC68: 0x8EA7, - 0xDC69: 0x8EA8, - 0xDC6A: 0x8EA9, - 0xDC6B: 0x8EAA, - 0xDC6C: 0x8EAD, - 0xDC6D: 0x8EAE, - 0xDC6E: 0x8EB0, - 0xDC6F: 0x8EB1, - 0xDC70: 0x8EB3, - 0xDC71: 0x8EB4, - 0xDC72: 0x8EB5, - 0xDC73: 0x8EB6, - 0xDC74: 0x8EB7, - 0xDC75: 0x8EB8, - 0xDC76: 0x8EB9, - 0xDC77: 0x8EBB, - 0xDC78: 0x8EBC, - 0xDC79: 0x8EBD, - 0xDC7A: 0x8EBE, - 0xDC7B: 0x8EBF, - 0xDC7C: 0x8EC0, - 0xDC7D: 0x8EC1, - 0xDC7E: 0x8EC2, - 0xDC80: 0x8EC3, - 0xDC81: 0x8EC4, - 0xDC82: 0x8EC5, - 0xDC83: 0x8EC6, - 0xDC84: 0x8EC7, - 0xDC85: 0x8EC8, - 0xDC86: 0x8EC9, - 0xDC87: 0x8ECA, - 0xDC88: 0x8ECB, - 0xDC89: 0x8ECC, - 0xDC8A: 0x8ECD, - 0xDC8B: 0x8ECF, - 0xDC8C: 0x8ED0, - 0xDC8D: 0x8ED1, - 0xDC8E: 0x8ED2, - 0xDC8F: 0x8ED3, - 0xDC90: 0x8ED4, - 0xDC91: 0x8ED5, - 0xDC92: 0x8ED6, - 0xDC93: 0x8ED7, - 0xDC94: 0x8ED8, - 0xDC95: 0x8ED9, - 0xDC96: 0x8EDA, - 0xDC97: 0x8EDB, - 0xDC98: 0x8EDC, - 0xDC99: 0x8EDD, - 0xDC9A: 0x8EDE, - 0xDC9B: 0x8EDF, - 0xDC9C: 0x8EE0, - 0xDC9D: 0x8EE1, - 0xDC9E: 0x8EE2, - 0xDC9F: 0x8EE3, - 0xDCA0: 0x8EE4, - 0xDCA1: 0x580B, - 0xDCA2: 0x580D, - 0xDCA3: 0x57FD, - 0xDCA4: 0x57ED, - 0xDCA5: 0x5800, - 0xDCA6: 0x581E, - 0xDCA7: 0x5819, - 0xDCA8: 0x5844, - 0xDCA9: 0x5820, - 0xDCAA: 0x5865, - 0xDCAB: 0x586C, - 0xDCAC: 0x5881, - 0xDCAD: 0x5889, - 0xDCAE: 0x589A, - 0xDCAF: 0x5880, - 0xDCB0: 0x99A8, - 0xDCB1: 0x9F19, - 0xDCB2: 0x61FF, - 0xDCB3: 0x8279, - 0xDCB4: 0x827D, - 0xDCB5: 0x827F, - 0xDCB6: 0x828F, - 0xDCB7: 0x828A, - 0xDCB8: 0x82A8, - 0xDCB9: 0x8284, - 0xDCBA: 0x828E, - 0xDCBB: 0x8291, - 0xDCBC: 0x8297, - 0xDCBD: 0x8299, - 0xDCBE: 0x82AB, - 0xDCBF: 0x82B8, - 0xDCC0: 0x82BE, - 0xDCC1: 0x82B0, - 0xDCC2: 0x82C8, - 0xDCC3: 0x82CA, - 0xDCC4: 0x82E3, - 0xDCC5: 0x8298, - 0xDCC6: 0x82B7, - 0xDCC7: 0x82AE, - 0xDCC8: 0x82CB, - 0xDCC9: 0x82CC, - 0xDCCA: 0x82C1, - 0xDCCB: 0x82A9, - 0xDCCC: 0x82B4, - 0xDCCD: 0x82A1, - 0xDCCE: 0x82AA, - 0xDCCF: 0x829F, - 0xDCD0: 0x82C4, - 0xDCD1: 0x82CE, - 0xDCD2: 0x82A4, - 0xDCD3: 0x82E1, - 0xDCD4: 0x8309, - 0xDCD5: 0x82F7, - 0xDCD6: 0x82E4, - 0xDCD7: 0x830F, - 0xDCD8: 0x8307, - 0xDCD9: 0x82DC, - 0xDCDA: 0x82F4, - 0xDCDB: 0x82D2, - 0xDCDC: 0x82D8, - 0xDCDD: 0x830C, - 0xDCDE: 0x82FB, - 0xDCDF: 0x82D3, - 0xDCE0: 0x8311, - 0xDCE1: 0x831A, - 0xDCE2: 0x8306, - 0xDCE3: 0x8314, - 0xDCE4: 0x8315, - 0xDCE5: 0x82E0, - 0xDCE6: 0x82D5, - 0xDCE7: 0x831C, - 0xDCE8: 0x8351, - 0xDCE9: 0x835B, - 0xDCEA: 0x835C, - 0xDCEB: 0x8308, - 0xDCEC: 0x8392, - 0xDCED: 0x833C, - 0xDCEE: 0x8334, - 0xDCEF: 0x8331, - 0xDCF0: 0x839B, - 0xDCF1: 0x835E, - 0xDCF2: 0x832F, - 0xDCF3: 0x834F, - 0xDCF4: 0x8347, - 0xDCF5: 0x8343, - 0xDCF6: 0x835F, - 0xDCF7: 0x8340, - 0xDCF8: 0x8317, - 0xDCF9: 0x8360, - 0xDCFA: 0x832D, - 0xDCFB: 0x833A, - 0xDCFC: 0x8333, - 0xDCFD: 0x8366, - 0xDCFE: 0x8365, - 0xDD40: 0x8EE5, - 0xDD41: 0x8EE6, - 0xDD42: 0x8EE7, - 0xDD43: 0x8EE8, - 0xDD44: 0x8EE9, - 0xDD45: 0x8EEA, - 0xDD46: 0x8EEB, - 0xDD47: 0x8EEC, - 0xDD48: 0x8EED, - 0xDD49: 0x8EEE, - 0xDD4A: 0x8EEF, - 0xDD4B: 0x8EF0, - 0xDD4C: 0x8EF1, - 0xDD4D: 0x8EF2, - 0xDD4E: 0x8EF3, - 0xDD4F: 0x8EF4, - 0xDD50: 0x8EF5, - 0xDD51: 0x8EF6, - 0xDD52: 0x8EF7, - 0xDD53: 0x8EF8, - 0xDD54: 0x8EF9, - 0xDD55: 0x8EFA, - 0xDD56: 0x8EFB, - 0xDD57: 0x8EFC, - 0xDD58: 0x8EFD, - 0xDD59: 0x8EFE, - 0xDD5A: 0x8EFF, - 0xDD5B: 0x8F00, - 0xDD5C: 0x8F01, - 0xDD5D: 0x8F02, - 0xDD5E: 0x8F03, - 0xDD5F: 0x8F04, - 0xDD60: 0x8F05, - 0xDD61: 0x8F06, - 0xDD62: 0x8F07, - 0xDD63: 0x8F08, - 0xDD64: 0x8F09, - 0xDD65: 0x8F0A, - 0xDD66: 0x8F0B, - 0xDD67: 0x8F0C, - 0xDD68: 0x8F0D, - 0xDD69: 0x8F0E, - 0xDD6A: 0x8F0F, - 0xDD6B: 0x8F10, - 0xDD6C: 0x8F11, - 0xDD6D: 0x8F12, - 0xDD6E: 0x8F13, - 0xDD6F: 0x8F14, - 0xDD70: 0x8F15, - 0xDD71: 0x8F16, - 0xDD72: 0x8F17, - 0xDD73: 0x8F18, - 0xDD74: 0x8F19, - 0xDD75: 0x8F1A, - 0xDD76: 0x8F1B, - 0xDD77: 0x8F1C, - 0xDD78: 0x8F1D, - 0xDD79: 0x8F1E, - 0xDD7A: 0x8F1F, - 0xDD7B: 0x8F20, - 0xDD7C: 0x8F21, - 0xDD7D: 0x8F22, - 0xDD7E: 0x8F23, - 0xDD80: 0x8F24, - 0xDD81: 0x8F25, - 0xDD82: 0x8F26, - 0xDD83: 0x8F27, - 0xDD84: 0x8F28, - 0xDD85: 0x8F29, - 0xDD86: 0x8F2A, - 0xDD87: 0x8F2B, - 0xDD88: 0x8F2C, - 0xDD89: 0x8F2D, - 0xDD8A: 0x8F2E, - 0xDD8B: 0x8F2F, - 0xDD8C: 0x8F30, - 0xDD8D: 0x8F31, - 0xDD8E: 0x8F32, - 0xDD8F: 0x8F33, - 0xDD90: 0x8F34, - 0xDD91: 0x8F35, - 0xDD92: 0x8F36, - 0xDD93: 0x8F37, - 0xDD94: 0x8F38, - 0xDD95: 0x8F39, - 0xDD96: 0x8F3A, - 0xDD97: 0x8F3B, - 0xDD98: 0x8F3C, - 0xDD99: 0x8F3D, - 0xDD9A: 0x8F3E, - 0xDD9B: 0x8F3F, - 0xDD9C: 0x8F40, - 0xDD9D: 0x8F41, - 0xDD9E: 0x8F42, - 0xDD9F: 0x8F43, - 0xDDA0: 0x8F44, - 0xDDA1: 0x8368, - 0xDDA2: 0x831B, - 0xDDA3: 0x8369, - 0xDDA4: 0x836C, - 0xDDA5: 0x836A, - 0xDDA6: 0x836D, - 0xDDA7: 0x836E, - 0xDDA8: 0x83B0, - 0xDDA9: 0x8378, - 0xDDAA: 0x83B3, - 0xDDAB: 0x83B4, - 0xDDAC: 0x83A0, - 0xDDAD: 0x83AA, - 0xDDAE: 0x8393, - 0xDDAF: 0x839C, - 0xDDB0: 0x8385, - 0xDDB1: 0x837C, - 0xDDB2: 0x83B6, - 0xDDB3: 0x83A9, - 0xDDB4: 0x837D, - 0xDDB5: 0x83B8, - 0xDDB6: 0x837B, - 0xDDB7: 0x8398, - 0xDDB8: 0x839E, - 0xDDB9: 0x83A8, - 0xDDBA: 0x83BA, - 0xDDBB: 0x83BC, - 0xDDBC: 0x83C1, - 0xDDBD: 0x8401, - 0xDDBE: 0x83E5, - 0xDDBF: 0x83D8, - 0xDDC0: 0x5807, - 0xDDC1: 0x8418, - 0xDDC2: 0x840B, - 0xDDC3: 0x83DD, - 0xDDC4: 0x83FD, - 0xDDC5: 0x83D6, - 0xDDC6: 0x841C, - 0xDDC7: 0x8438, - 0xDDC8: 0x8411, - 0xDDC9: 0x8406, - 0xDDCA: 0x83D4, - 0xDDCB: 0x83DF, - 0xDDCC: 0x840F, - 0xDDCD: 0x8403, - 0xDDCE: 0x83F8, - 0xDDCF: 0x83F9, - 0xDDD0: 0x83EA, - 0xDDD1: 0x83C5, - 0xDDD2: 0x83C0, - 0xDDD3: 0x8426, - 0xDDD4: 0x83F0, - 0xDDD5: 0x83E1, - 0xDDD6: 0x845C, - 0xDDD7: 0x8451, - 0xDDD8: 0x845A, - 0xDDD9: 0x8459, - 0xDDDA: 0x8473, - 0xDDDB: 0x8487, - 0xDDDC: 0x8488, - 0xDDDD: 0x847A, - 0xDDDE: 0x8489, - 0xDDDF: 0x8478, - 0xDDE0: 0x843C, - 0xDDE1: 0x8446, - 0xDDE2: 0x8469, - 0xDDE3: 0x8476, - 0xDDE4: 0x848C, - 0xDDE5: 0x848E, - 0xDDE6: 0x8431, - 0xDDE7: 0x846D, - 0xDDE8: 0x84C1, - 0xDDE9: 0x84CD, - 0xDDEA: 0x84D0, - 0xDDEB: 0x84E6, - 0xDDEC: 0x84BD, - 0xDDED: 0x84D3, - 0xDDEE: 0x84CA, - 0xDDEF: 0x84BF, - 0xDDF0: 0x84BA, - 0xDDF1: 0x84E0, - 0xDDF2: 0x84A1, - 0xDDF3: 0x84B9, - 0xDDF4: 0x84B4, - 0xDDF5: 0x8497, - 0xDDF6: 0x84E5, - 0xDDF7: 0x84E3, - 0xDDF8: 0x850C, - 0xDDF9: 0x750D, - 0xDDFA: 0x8538, - 0xDDFB: 0x84F0, - 0xDDFC: 0x8539, - 0xDDFD: 0x851F, - 0xDDFE: 0x853A, - 0xDE40: 0x8F45, - 0xDE41: 0x8F46, - 0xDE42: 0x8F47, - 0xDE43: 0x8F48, - 0xDE44: 0x8F49, - 0xDE45: 0x8F4A, - 0xDE46: 0x8F4B, - 0xDE47: 0x8F4C, - 0xDE48: 0x8F4D, - 0xDE49: 0x8F4E, - 0xDE4A: 0x8F4F, - 0xDE4B: 0x8F50, - 0xDE4C: 0x8F51, - 0xDE4D: 0x8F52, - 0xDE4E: 0x8F53, - 0xDE4F: 0x8F54, - 0xDE50: 0x8F55, - 0xDE51: 0x8F56, - 0xDE52: 0x8F57, - 0xDE53: 0x8F58, - 0xDE54: 0x8F59, - 0xDE55: 0x8F5A, - 0xDE56: 0x8F5B, - 0xDE57: 0x8F5C, - 0xDE58: 0x8F5D, - 0xDE59: 0x8F5E, - 0xDE5A: 0x8F5F, - 0xDE5B: 0x8F60, - 0xDE5C: 0x8F61, - 0xDE5D: 0x8F62, - 0xDE5E: 0x8F63, - 0xDE5F: 0x8F64, - 0xDE60: 0x8F65, - 0xDE61: 0x8F6A, - 0xDE62: 0x8F80, - 0xDE63: 0x8F8C, - 0xDE64: 0x8F92, - 0xDE65: 0x8F9D, - 0xDE66: 0x8FA0, - 0xDE67: 0x8FA1, - 0xDE68: 0x8FA2, - 0xDE69: 0x8FA4, - 0xDE6A: 0x8FA5, - 0xDE6B: 0x8FA6, - 0xDE6C: 0x8FA7, - 0xDE6D: 0x8FAA, - 0xDE6E: 0x8FAC, - 0xDE6F: 0x8FAD, - 0xDE70: 0x8FAE, - 0xDE71: 0x8FAF, - 0xDE72: 0x8FB2, - 0xDE73: 0x8FB3, - 0xDE74: 0x8FB4, - 0xDE75: 0x8FB5, - 0xDE76: 0x8FB7, - 0xDE77: 0x8FB8, - 0xDE78: 0x8FBA, - 0xDE79: 0x8FBB, - 0xDE7A: 0x8FBC, - 0xDE7B: 0x8FBF, - 0xDE7C: 0x8FC0, - 0xDE7D: 0x8FC3, - 0xDE7E: 0x8FC6, - 0xDE80: 0x8FC9, - 0xDE81: 0x8FCA, - 0xDE82: 0x8FCB, - 0xDE83: 0x8FCC, - 0xDE84: 0x8FCD, - 0xDE85: 0x8FCF, - 0xDE86: 0x8FD2, - 0xDE87: 0x8FD6, - 0xDE88: 0x8FD7, - 0xDE89: 0x8FDA, - 0xDE8A: 0x8FE0, - 0xDE8B: 0x8FE1, - 0xDE8C: 0x8FE3, - 0xDE8D: 0x8FE7, - 0xDE8E: 0x8FEC, - 0xDE8F: 0x8FEF, - 0xDE90: 0x8FF1, - 0xDE91: 0x8FF2, - 0xDE92: 0x8FF4, - 0xDE93: 0x8FF5, - 0xDE94: 0x8FF6, - 0xDE95: 0x8FFA, - 0xDE96: 0x8FFB, - 0xDE97: 0x8FFC, - 0xDE98: 0x8FFE, - 0xDE99: 0x8FFF, - 0xDE9A: 0x9007, - 0xDE9B: 0x9008, - 0xDE9C: 0x900C, - 0xDE9D: 0x900E, - 0xDE9E: 0x9013, - 0xDE9F: 0x9015, - 0xDEA0: 0x9018, - 0xDEA1: 0x8556, - 0xDEA2: 0x853B, - 0xDEA3: 0x84FF, - 0xDEA4: 0x84FC, - 0xDEA5: 0x8559, - 0xDEA6: 0x8548, - 0xDEA7: 0x8568, - 0xDEA8: 0x8564, - 0xDEA9: 0x855E, - 0xDEAA: 0x857A, - 0xDEAB: 0x77A2, - 0xDEAC: 0x8543, - 0xDEAD: 0x8572, - 0xDEAE: 0x857B, - 0xDEAF: 0x85A4, - 0xDEB0: 0x85A8, - 0xDEB1: 0x8587, - 0xDEB2: 0x858F, - 0xDEB3: 0x8579, - 0xDEB4: 0x85AE, - 0xDEB5: 0x859C, - 0xDEB6: 0x8585, - 0xDEB7: 0x85B9, - 0xDEB8: 0x85B7, - 0xDEB9: 0x85B0, - 0xDEBA: 0x85D3, - 0xDEBB: 0x85C1, - 0xDEBC: 0x85DC, - 0xDEBD: 0x85FF, - 0xDEBE: 0x8627, - 0xDEBF: 0x8605, - 0xDEC0: 0x8629, - 0xDEC1: 0x8616, - 0xDEC2: 0x863C, - 0xDEC3: 0x5EFE, - 0xDEC4: 0x5F08, - 0xDEC5: 0x593C, - 0xDEC6: 0x5941, - 0xDEC7: 0x8037, - 0xDEC8: 0x5955, - 0xDEC9: 0x595A, - 0xDECA: 0x5958, - 0xDECB: 0x530F, - 0xDECC: 0x5C22, - 0xDECD: 0x5C25, - 0xDECE: 0x5C2C, - 0xDECF: 0x5C34, - 0xDED0: 0x624C, - 0xDED1: 0x626A, - 0xDED2: 0x629F, - 0xDED3: 0x62BB, - 0xDED4: 0x62CA, - 0xDED5: 0x62DA, - 0xDED6: 0x62D7, - 0xDED7: 0x62EE, - 0xDED8: 0x6322, - 0xDED9: 0x62F6, - 0xDEDA: 0x6339, - 0xDEDB: 0x634B, - 0xDEDC: 0x6343, - 0xDEDD: 0x63AD, - 0xDEDE: 0x63F6, - 0xDEDF: 0x6371, - 0xDEE0: 0x637A, - 0xDEE1: 0x638E, - 0xDEE2: 0x63B4, - 0xDEE3: 0x636D, - 0xDEE4: 0x63AC, - 0xDEE5: 0x638A, - 0xDEE6: 0x6369, - 0xDEE7: 0x63AE, - 0xDEE8: 0x63BC, - 0xDEE9: 0x63F2, - 0xDEEA: 0x63F8, - 0xDEEB: 0x63E0, - 0xDEEC: 0x63FF, - 0xDEED: 0x63C4, - 0xDEEE: 0x63DE, - 0xDEEF: 0x63CE, - 0xDEF0: 0x6452, - 0xDEF1: 0x63C6, - 0xDEF2: 0x63BE, - 0xDEF3: 0x6445, - 0xDEF4: 0x6441, - 0xDEF5: 0x640B, - 0xDEF6: 0x641B, - 0xDEF7: 0x6420, - 0xDEF8: 0x640C, - 0xDEF9: 0x6426, - 0xDEFA: 0x6421, - 0xDEFB: 0x645E, - 0xDEFC: 0x6484, - 0xDEFD: 0x646D, - 0xDEFE: 0x6496, - 0xDF40: 0x9019, - 0xDF41: 0x901C, - 0xDF42: 0x9023, - 0xDF43: 0x9024, - 0xDF44: 0x9025, - 0xDF45: 0x9027, - 0xDF46: 0x9028, - 0xDF47: 0x9029, - 0xDF48: 0x902A, - 0xDF49: 0x902B, - 0xDF4A: 0x902C, - 0xDF4B: 0x9030, - 0xDF4C: 0x9031, - 0xDF4D: 0x9032, - 0xDF4E: 0x9033, - 0xDF4F: 0x9034, - 0xDF50: 0x9037, - 0xDF51: 0x9039, - 0xDF52: 0x903A, - 0xDF53: 0x903D, - 0xDF54: 0x903F, - 0xDF55: 0x9040, - 0xDF56: 0x9043, - 0xDF57: 0x9045, - 0xDF58: 0x9046, - 0xDF59: 0x9048, - 0xDF5A: 0x9049, - 0xDF5B: 0x904A, - 0xDF5C: 0x904B, - 0xDF5D: 0x904C, - 0xDF5E: 0x904E, - 0xDF5F: 0x9054, - 0xDF60: 0x9055, - 0xDF61: 0x9056, - 0xDF62: 0x9059, - 0xDF63: 0x905A, - 0xDF64: 0x905C, - 0xDF65: 0x905D, - 0xDF66: 0x905E, - 0xDF67: 0x905F, - 0xDF68: 0x9060, - 0xDF69: 0x9061, - 0xDF6A: 0x9064, - 0xDF6B: 0x9066, - 0xDF6C: 0x9067, - 0xDF6D: 0x9069, - 0xDF6E: 0x906A, - 0xDF6F: 0x906B, - 0xDF70: 0x906C, - 0xDF71: 0x906F, - 0xDF72: 0x9070, - 0xDF73: 0x9071, - 0xDF74: 0x9072, - 0xDF75: 0x9073, - 0xDF76: 0x9076, - 0xDF77: 0x9077, - 0xDF78: 0x9078, - 0xDF79: 0x9079, - 0xDF7A: 0x907A, - 0xDF7B: 0x907B, - 0xDF7C: 0x907C, - 0xDF7D: 0x907E, - 0xDF7E: 0x9081, - 0xDF80: 0x9084, - 0xDF81: 0x9085, - 0xDF82: 0x9086, - 0xDF83: 0x9087, - 0xDF84: 0x9089, - 0xDF85: 0x908A, - 0xDF86: 0x908C, - 0xDF87: 0x908D, - 0xDF88: 0x908E, - 0xDF89: 0x908F, - 0xDF8A: 0x9090, - 0xDF8B: 0x9092, - 0xDF8C: 0x9094, - 0xDF8D: 0x9096, - 0xDF8E: 0x9098, - 0xDF8F: 0x909A, - 0xDF90: 0x909C, - 0xDF91: 0x909E, - 0xDF92: 0x909F, - 0xDF93: 0x90A0, - 0xDF94: 0x90A4, - 0xDF95: 0x90A5, - 0xDF96: 0x90A7, - 0xDF97: 0x90A8, - 0xDF98: 0x90A9, - 0xDF99: 0x90AB, - 0xDF9A: 0x90AD, - 0xDF9B: 0x90B2, - 0xDF9C: 0x90B7, - 0xDF9D: 0x90BC, - 0xDF9E: 0x90BD, - 0xDF9F: 0x90BF, - 0xDFA0: 0x90C0, - 0xDFA1: 0x647A, - 0xDFA2: 0x64B7, - 0xDFA3: 0x64B8, - 0xDFA4: 0x6499, - 0xDFA5: 0x64BA, - 0xDFA6: 0x64C0, - 0xDFA7: 0x64D0, - 0xDFA8: 0x64D7, - 0xDFA9: 0x64E4, - 0xDFAA: 0x64E2, - 0xDFAB: 0x6509, - 0xDFAC: 0x6525, - 0xDFAD: 0x652E, - 0xDFAE: 0x5F0B, - 0xDFAF: 0x5FD2, - 0xDFB0: 0x7519, - 0xDFB1: 0x5F11, - 0xDFB2: 0x535F, - 0xDFB3: 0x53F1, - 0xDFB4: 0x53FD, - 0xDFB5: 0x53E9, - 0xDFB6: 0x53E8, - 0xDFB7: 0x53FB, - 0xDFB8: 0x5412, - 0xDFB9: 0x5416, - 0xDFBA: 0x5406, - 0xDFBB: 0x544B, - 0xDFBC: 0x5452, - 0xDFBD: 0x5453, - 0xDFBE: 0x5454, - 0xDFBF: 0x5456, - 0xDFC0: 0x5443, - 0xDFC1: 0x5421, - 0xDFC2: 0x5457, - 0xDFC3: 0x5459, - 0xDFC4: 0x5423, - 0xDFC5: 0x5432, - 0xDFC6: 0x5482, - 0xDFC7: 0x5494, - 0xDFC8: 0x5477, - 0xDFC9: 0x5471, - 0xDFCA: 0x5464, - 0xDFCB: 0x549A, - 0xDFCC: 0x549B, - 0xDFCD: 0x5484, - 0xDFCE: 0x5476, - 0xDFCF: 0x5466, - 0xDFD0: 0x549D, - 0xDFD1: 0x54D0, - 0xDFD2: 0x54AD, - 0xDFD3: 0x54C2, - 0xDFD4: 0x54B4, - 0xDFD5: 0x54D2, - 0xDFD6: 0x54A7, - 0xDFD7: 0x54A6, - 0xDFD8: 0x54D3, - 0xDFD9: 0x54D4, - 0xDFDA: 0x5472, - 0xDFDB: 0x54A3, - 0xDFDC: 0x54D5, - 0xDFDD: 0x54BB, - 0xDFDE: 0x54BF, - 0xDFDF: 0x54CC, - 0xDFE0: 0x54D9, - 0xDFE1: 0x54DA, - 0xDFE2: 0x54DC, - 0xDFE3: 0x54A9, - 0xDFE4: 0x54AA, - 0xDFE5: 0x54A4, - 0xDFE6: 0x54DD, - 0xDFE7: 0x54CF, - 0xDFE8: 0x54DE, - 0xDFE9: 0x551B, - 0xDFEA: 0x54E7, - 0xDFEB: 0x5520, - 0xDFEC: 0x54FD, - 0xDFED: 0x5514, - 0xDFEE: 0x54F3, - 0xDFEF: 0x5522, - 0xDFF0: 0x5523, - 0xDFF1: 0x550F, - 0xDFF2: 0x5511, - 0xDFF3: 0x5527, - 0xDFF4: 0x552A, - 0xDFF5: 0x5567, - 0xDFF6: 0x558F, - 0xDFF7: 0x55B5, - 0xDFF8: 0x5549, - 0xDFF9: 0x556D, - 0xDFFA: 0x5541, - 0xDFFB: 0x5555, - 0xDFFC: 0x553F, - 0xDFFD: 0x5550, - 0xDFFE: 0x553C, - 0xE040: 0x90C2, - 0xE041: 0x90C3, - 0xE042: 0x90C6, - 0xE043: 0x90C8, - 0xE044: 0x90C9, - 0xE045: 0x90CB, - 0xE046: 0x90CC, - 0xE047: 0x90CD, - 0xE048: 0x90D2, - 0xE049: 0x90D4, - 0xE04A: 0x90D5, - 0xE04B: 0x90D6, - 0xE04C: 0x90D8, - 0xE04D: 0x90D9, - 0xE04E: 0x90DA, - 0xE04F: 0x90DE, - 0xE050: 0x90DF, - 0xE051: 0x90E0, - 0xE052: 0x90E3, - 0xE053: 0x90E4, - 0xE054: 0x90E5, - 0xE055: 0x90E9, - 0xE056: 0x90EA, - 0xE057: 0x90EC, - 0xE058: 0x90EE, - 0xE059: 0x90F0, - 0xE05A: 0x90F1, - 0xE05B: 0x90F2, - 0xE05C: 0x90F3, - 0xE05D: 0x90F5, - 0xE05E: 0x90F6, - 0xE05F: 0x90F7, - 0xE060: 0x90F9, - 0xE061: 0x90FA, - 0xE062: 0x90FB, - 0xE063: 0x90FC, - 0xE064: 0x90FF, - 0xE065: 0x9100, - 0xE066: 0x9101, - 0xE067: 0x9103, - 0xE068: 0x9105, - 0xE069: 0x9106, - 0xE06A: 0x9107, - 0xE06B: 0x9108, - 0xE06C: 0x9109, - 0xE06D: 0x910A, - 0xE06E: 0x910B, - 0xE06F: 0x910C, - 0xE070: 0x910D, - 0xE071: 0x910E, - 0xE072: 0x910F, - 0xE073: 0x9110, - 0xE074: 0x9111, - 0xE075: 0x9112, - 0xE076: 0x9113, - 0xE077: 0x9114, - 0xE078: 0x9115, - 0xE079: 0x9116, - 0xE07A: 0x9117, - 0xE07B: 0x9118, - 0xE07C: 0x911A, - 0xE07D: 0x911B, - 0xE07E: 0x911C, - 0xE080: 0x911D, - 0xE081: 0x911F, - 0xE082: 0x9120, - 0xE083: 0x9121, - 0xE084: 0x9124, - 0xE085: 0x9125, - 0xE086: 0x9126, - 0xE087: 0x9127, - 0xE088: 0x9128, - 0xE089: 0x9129, - 0xE08A: 0x912A, - 0xE08B: 0x912B, - 0xE08C: 0x912C, - 0xE08D: 0x912D, - 0xE08E: 0x912E, - 0xE08F: 0x9130, - 0xE090: 0x9132, - 0xE091: 0x9133, - 0xE092: 0x9134, - 0xE093: 0x9135, - 0xE094: 0x9136, - 0xE095: 0x9137, - 0xE096: 0x9138, - 0xE097: 0x913A, - 0xE098: 0x913B, - 0xE099: 0x913C, - 0xE09A: 0x913D, - 0xE09B: 0x913E, - 0xE09C: 0x913F, - 0xE09D: 0x9140, - 0xE09E: 0x9141, - 0xE09F: 0x9142, - 0xE0A0: 0x9144, - 0xE0A1: 0x5537, - 0xE0A2: 0x5556, - 0xE0A3: 0x5575, - 0xE0A4: 0x5576, - 0xE0A5: 0x5577, - 0xE0A6: 0x5533, - 0xE0A7: 0x5530, - 0xE0A8: 0x555C, - 0xE0A9: 0x558B, - 0xE0AA: 0x55D2, - 0xE0AB: 0x5583, - 0xE0AC: 0x55B1, - 0xE0AD: 0x55B9, - 0xE0AE: 0x5588, - 0xE0AF: 0x5581, - 0xE0B0: 0x559F, - 0xE0B1: 0x557E, - 0xE0B2: 0x55D6, - 0xE0B3: 0x5591, - 0xE0B4: 0x557B, - 0xE0B5: 0x55DF, - 0xE0B6: 0x55BD, - 0xE0B7: 0x55BE, - 0xE0B8: 0x5594, - 0xE0B9: 0x5599, - 0xE0BA: 0x55EA, - 0xE0BB: 0x55F7, - 0xE0BC: 0x55C9, - 0xE0BD: 0x561F, - 0xE0BE: 0x55D1, - 0xE0BF: 0x55EB, - 0xE0C0: 0x55EC, - 0xE0C1: 0x55D4, - 0xE0C2: 0x55E6, - 0xE0C3: 0x55DD, - 0xE0C4: 0x55C4, - 0xE0C5: 0x55EF, - 0xE0C6: 0x55E5, - 0xE0C7: 0x55F2, - 0xE0C8: 0x55F3, - 0xE0C9: 0x55CC, - 0xE0CA: 0x55CD, - 0xE0CB: 0x55E8, - 0xE0CC: 0x55F5, - 0xE0CD: 0x55E4, - 0xE0CE: 0x8F94, - 0xE0CF: 0x561E, - 0xE0D0: 0x5608, - 0xE0D1: 0x560C, - 0xE0D2: 0x5601, - 0xE0D3: 0x5624, - 0xE0D4: 0x5623, - 0xE0D5: 0x55FE, - 0xE0D6: 0x5600, - 0xE0D7: 0x5627, - 0xE0D8: 0x562D, - 0xE0D9: 0x5658, - 0xE0DA: 0x5639, - 0xE0DB: 0x5657, - 0xE0DC: 0x562C, - 0xE0DD: 0x564D, - 0xE0DE: 0x5662, - 0xE0DF: 0x5659, - 0xE0E0: 0x565C, - 0xE0E1: 0x564C, - 0xE0E2: 0x5654, - 0xE0E3: 0x5686, - 0xE0E4: 0x5664, - 0xE0E5: 0x5671, - 0xE0E6: 0x566B, - 0xE0E7: 0x567B, - 0xE0E8: 0x567C, - 0xE0E9: 0x5685, - 0xE0EA: 0x5693, - 0xE0EB: 0x56AF, - 0xE0EC: 0x56D4, - 0xE0ED: 0x56D7, - 0xE0EE: 0x56DD, - 0xE0EF: 0x56E1, - 0xE0F0: 0x56F5, - 0xE0F1: 0x56EB, - 0xE0F2: 0x56F9, - 0xE0F3: 0x56FF, - 0xE0F4: 0x5704, - 0xE0F5: 0x570A, - 0xE0F6: 0x5709, - 0xE0F7: 0x571C, - 0xE0F8: 0x5E0F, - 0xE0F9: 0x5E19, - 0xE0FA: 0x5E14, - 0xE0FB: 0x5E11, - 0xE0FC: 0x5E31, - 0xE0FD: 0x5E3B, - 0xE0FE: 0x5E3C, - 0xE140: 0x9145, - 0xE141: 0x9147, - 0xE142: 0x9148, - 0xE143: 0x9151, - 0xE144: 0x9153, - 0xE145: 0x9154, - 0xE146: 0x9155, - 0xE147: 0x9156, - 0xE148: 0x9158, - 0xE149: 0x9159, - 0xE14A: 0x915B, - 0xE14B: 0x915C, - 0xE14C: 0x915F, - 0xE14D: 0x9160, - 0xE14E: 0x9166, - 0xE14F: 0x9167, - 0xE150: 0x9168, - 0xE151: 0x916B, - 0xE152: 0x916D, - 0xE153: 0x9173, - 0xE154: 0x917A, - 0xE155: 0x917B, - 0xE156: 0x917C, - 0xE157: 0x9180, - 0xE158: 0x9181, - 0xE159: 0x9182, - 0xE15A: 0x9183, - 0xE15B: 0x9184, - 0xE15C: 0x9186, - 0xE15D: 0x9188, - 0xE15E: 0x918A, - 0xE15F: 0x918E, - 0xE160: 0x918F, - 0xE161: 0x9193, - 0xE162: 0x9194, - 0xE163: 0x9195, - 0xE164: 0x9196, - 0xE165: 0x9197, - 0xE166: 0x9198, - 0xE167: 0x9199, - 0xE168: 0x919C, - 0xE169: 0x919D, - 0xE16A: 0x919E, - 0xE16B: 0x919F, - 0xE16C: 0x91A0, - 0xE16D: 0x91A1, - 0xE16E: 0x91A4, - 0xE16F: 0x91A5, - 0xE170: 0x91A6, - 0xE171: 0x91A7, - 0xE172: 0x91A8, - 0xE173: 0x91A9, - 0xE174: 0x91AB, - 0xE175: 0x91AC, - 0xE176: 0x91B0, - 0xE177: 0x91B1, - 0xE178: 0x91B2, - 0xE179: 0x91B3, - 0xE17A: 0x91B6, - 0xE17B: 0x91B7, - 0xE17C: 0x91B8, - 0xE17D: 0x91B9, - 0xE17E: 0x91BB, - 0xE180: 0x91BC, - 0xE181: 0x91BD, - 0xE182: 0x91BE, - 0xE183: 0x91BF, - 0xE184: 0x91C0, - 0xE185: 0x91C1, - 0xE186: 0x91C2, - 0xE187: 0x91C3, - 0xE188: 0x91C4, - 0xE189: 0x91C5, - 0xE18A: 0x91C6, - 0xE18B: 0x91C8, - 0xE18C: 0x91CB, - 0xE18D: 0x91D0, - 0xE18E: 0x91D2, - 0xE18F: 0x91D3, - 0xE190: 0x91D4, - 0xE191: 0x91D5, - 0xE192: 0x91D6, - 0xE193: 0x91D7, - 0xE194: 0x91D8, - 0xE195: 0x91D9, - 0xE196: 0x91DA, - 0xE197: 0x91DB, - 0xE198: 0x91DD, - 0xE199: 0x91DE, - 0xE19A: 0x91DF, - 0xE19B: 0x91E0, - 0xE19C: 0x91E1, - 0xE19D: 0x91E2, - 0xE19E: 0x91E3, - 0xE19F: 0x91E4, - 0xE1A0: 0x91E5, - 0xE1A1: 0x5E37, - 0xE1A2: 0x5E44, - 0xE1A3: 0x5E54, - 0xE1A4: 0x5E5B, - 0xE1A5: 0x5E5E, - 0xE1A6: 0x5E61, - 0xE1A7: 0x5C8C, - 0xE1A8: 0x5C7A, - 0xE1A9: 0x5C8D, - 0xE1AA: 0x5C90, - 0xE1AB: 0x5C96, - 0xE1AC: 0x5C88, - 0xE1AD: 0x5C98, - 0xE1AE: 0x5C99, - 0xE1AF: 0x5C91, - 0xE1B0: 0x5C9A, - 0xE1B1: 0x5C9C, - 0xE1B2: 0x5CB5, - 0xE1B3: 0x5CA2, - 0xE1B4: 0x5CBD, - 0xE1B5: 0x5CAC, - 0xE1B6: 0x5CAB, - 0xE1B7: 0x5CB1, - 0xE1B8: 0x5CA3, - 0xE1B9: 0x5CC1, - 0xE1BA: 0x5CB7, - 0xE1BB: 0x5CC4, - 0xE1BC: 0x5CD2, - 0xE1BD: 0x5CE4, - 0xE1BE: 0x5CCB, - 0xE1BF: 0x5CE5, - 0xE1C0: 0x5D02, - 0xE1C1: 0x5D03, - 0xE1C2: 0x5D27, - 0xE1C3: 0x5D26, - 0xE1C4: 0x5D2E, - 0xE1C5: 0x5D24, - 0xE1C6: 0x5D1E, - 0xE1C7: 0x5D06, - 0xE1C8: 0x5D1B, - 0xE1C9: 0x5D58, - 0xE1CA: 0x5D3E, - 0xE1CB: 0x5D34, - 0xE1CC: 0x5D3D, - 0xE1CD: 0x5D6C, - 0xE1CE: 0x5D5B, - 0xE1CF: 0x5D6F, - 0xE1D0: 0x5D5D, - 0xE1D1: 0x5D6B, - 0xE1D2: 0x5D4B, - 0xE1D3: 0x5D4A, - 0xE1D4: 0x5D69, - 0xE1D5: 0x5D74, - 0xE1D6: 0x5D82, - 0xE1D7: 0x5D99, - 0xE1D8: 0x5D9D, - 0xE1D9: 0x8C73, - 0xE1DA: 0x5DB7, - 0xE1DB: 0x5DC5, - 0xE1DC: 0x5F73, - 0xE1DD: 0x5F77, - 0xE1DE: 0x5F82, - 0xE1DF: 0x5F87, - 0xE1E0: 0x5F89, - 0xE1E1: 0x5F8C, - 0xE1E2: 0x5F95, - 0xE1E3: 0x5F99, - 0xE1E4: 0x5F9C, - 0xE1E5: 0x5FA8, - 0xE1E6: 0x5FAD, - 0xE1E7: 0x5FB5, - 0xE1E8: 0x5FBC, - 0xE1E9: 0x8862, - 0xE1EA: 0x5F61, - 0xE1EB: 0x72AD, - 0xE1EC: 0x72B0, - 0xE1ED: 0x72B4, - 0xE1EE: 0x72B7, - 0xE1EF: 0x72B8, - 0xE1F0: 0x72C3, - 0xE1F1: 0x72C1, - 0xE1F2: 0x72CE, - 0xE1F3: 0x72CD, - 0xE1F4: 0x72D2, - 0xE1F5: 0x72E8, - 0xE1F6: 0x72EF, - 0xE1F7: 0x72E9, - 0xE1F8: 0x72F2, - 0xE1F9: 0x72F4, - 0xE1FA: 0x72F7, - 0xE1FB: 0x7301, - 0xE1FC: 0x72F3, - 0xE1FD: 0x7303, - 0xE1FE: 0x72FA, - 0xE240: 0x91E6, - 0xE241: 0x91E7, - 0xE242: 0x91E8, - 0xE243: 0x91E9, - 0xE244: 0x91EA, - 0xE245: 0x91EB, - 0xE246: 0x91EC, - 0xE247: 0x91ED, - 0xE248: 0x91EE, - 0xE249: 0x91EF, - 0xE24A: 0x91F0, - 0xE24B: 0x91F1, - 0xE24C: 0x91F2, - 0xE24D: 0x91F3, - 0xE24E: 0x91F4, - 0xE24F: 0x91F5, - 0xE250: 0x91F6, - 0xE251: 0x91F7, - 0xE252: 0x91F8, - 0xE253: 0x91F9, - 0xE254: 0x91FA, - 0xE255: 0x91FB, - 0xE256: 0x91FC, - 0xE257: 0x91FD, - 0xE258: 0x91FE, - 0xE259: 0x91FF, - 0xE25A: 0x9200, - 0xE25B: 0x9201, - 0xE25C: 0x9202, - 0xE25D: 0x9203, - 0xE25E: 0x9204, - 0xE25F: 0x9205, - 0xE260: 0x9206, - 0xE261: 0x9207, - 0xE262: 0x9208, - 0xE263: 0x9209, - 0xE264: 0x920A, - 0xE265: 0x920B, - 0xE266: 0x920C, - 0xE267: 0x920D, - 0xE268: 0x920E, - 0xE269: 0x920F, - 0xE26A: 0x9210, - 0xE26B: 0x9211, - 0xE26C: 0x9212, - 0xE26D: 0x9213, - 0xE26E: 0x9214, - 0xE26F: 0x9215, - 0xE270: 0x9216, - 0xE271: 0x9217, - 0xE272: 0x9218, - 0xE273: 0x9219, - 0xE274: 0x921A, - 0xE275: 0x921B, - 0xE276: 0x921C, - 0xE277: 0x921D, - 0xE278: 0x921E, - 0xE279: 0x921F, - 0xE27A: 0x9220, - 0xE27B: 0x9221, - 0xE27C: 0x9222, - 0xE27D: 0x9223, - 0xE27E: 0x9224, - 0xE280: 0x9225, - 0xE281: 0x9226, - 0xE282: 0x9227, - 0xE283: 0x9228, - 0xE284: 0x9229, - 0xE285: 0x922A, - 0xE286: 0x922B, - 0xE287: 0x922C, - 0xE288: 0x922D, - 0xE289: 0x922E, - 0xE28A: 0x922F, - 0xE28B: 0x9230, - 0xE28C: 0x9231, - 0xE28D: 0x9232, - 0xE28E: 0x9233, - 0xE28F: 0x9234, - 0xE290: 0x9235, - 0xE291: 0x9236, - 0xE292: 0x9237, - 0xE293: 0x9238, - 0xE294: 0x9239, - 0xE295: 0x923A, - 0xE296: 0x923B, - 0xE297: 0x923C, - 0xE298: 0x923D, - 0xE299: 0x923E, - 0xE29A: 0x923F, - 0xE29B: 0x9240, - 0xE29C: 0x9241, - 0xE29D: 0x9242, - 0xE29E: 0x9243, - 0xE29F: 0x9244, - 0xE2A0: 0x9245, - 0xE2A1: 0x72FB, - 0xE2A2: 0x7317, - 0xE2A3: 0x7313, - 0xE2A4: 0x7321, - 0xE2A5: 0x730A, - 0xE2A6: 0x731E, - 0xE2A7: 0x731D, - 0xE2A8: 0x7315, - 0xE2A9: 0x7322, - 0xE2AA: 0x7339, - 0xE2AB: 0x7325, - 0xE2AC: 0x732C, - 0xE2AD: 0x7338, - 0xE2AE: 0x7331, - 0xE2AF: 0x7350, - 0xE2B0: 0x734D, - 0xE2B1: 0x7357, - 0xE2B2: 0x7360, - 0xE2B3: 0x736C, - 0xE2B4: 0x736F, - 0xE2B5: 0x737E, - 0xE2B6: 0x821B, - 0xE2B7: 0x5925, - 0xE2B8: 0x98E7, - 0xE2B9: 0x5924, - 0xE2BA: 0x5902, - 0xE2BB: 0x9963, - 0xE2BC: 0x9967, - 0xE2BD: 0x9968, - 0xE2BE: 0x9969, - 0xE2BF: 0x996A, - 0xE2C0: 0x996B, - 0xE2C1: 0x996C, - 0xE2C2: 0x9974, - 0xE2C3: 0x9977, - 0xE2C4: 0x997D, - 0xE2C5: 0x9980, - 0xE2C6: 0x9984, - 0xE2C7: 0x9987, - 0xE2C8: 0x998A, - 0xE2C9: 0x998D, - 0xE2CA: 0x9990, - 0xE2CB: 0x9991, - 0xE2CC: 0x9993, - 0xE2CD: 0x9994, - 0xE2CE: 0x9995, - 0xE2CF: 0x5E80, - 0xE2D0: 0x5E91, - 0xE2D1: 0x5E8B, - 0xE2D2: 0x5E96, - 0xE2D3: 0x5EA5, - 0xE2D4: 0x5EA0, - 0xE2D5: 0x5EB9, - 0xE2D6: 0x5EB5, - 0xE2D7: 0x5EBE, - 0xE2D8: 0x5EB3, - 0xE2D9: 0x8D53, - 0xE2DA: 0x5ED2, - 0xE2DB: 0x5ED1, - 0xE2DC: 0x5EDB, - 0xE2DD: 0x5EE8, - 0xE2DE: 0x5EEA, - 0xE2DF: 0x81BA, - 0xE2E0: 0x5FC4, - 0xE2E1: 0x5FC9, - 0xE2E2: 0x5FD6, - 0xE2E3: 0x5FCF, - 0xE2E4: 0x6003, - 0xE2E5: 0x5FEE, - 0xE2E6: 0x6004, - 0xE2E7: 0x5FE1, - 0xE2E8: 0x5FE4, - 0xE2E9: 0x5FFE, - 0xE2EA: 0x6005, - 0xE2EB: 0x6006, - 0xE2EC: 0x5FEA, - 0xE2ED: 0x5FED, - 0xE2EE: 0x5FF8, - 0xE2EF: 0x6019, - 0xE2F0: 0x6035, - 0xE2F1: 0x6026, - 0xE2F2: 0x601B, - 0xE2F3: 0x600F, - 0xE2F4: 0x600D, - 0xE2F5: 0x6029, - 0xE2F6: 0x602B, - 0xE2F7: 0x600A, - 0xE2F8: 0x603F, - 0xE2F9: 0x6021, - 0xE2FA: 0x6078, - 0xE2FB: 0x6079, - 0xE2FC: 0x607B, - 0xE2FD: 0x607A, - 0xE2FE: 0x6042, - 0xE340: 0x9246, - 0xE341: 0x9247, - 0xE342: 0x9248, - 0xE343: 0x9249, - 0xE344: 0x924A, - 0xE345: 0x924B, - 0xE346: 0x924C, - 0xE347: 0x924D, - 0xE348: 0x924E, - 0xE349: 0x924F, - 0xE34A: 0x9250, - 0xE34B: 0x9251, - 0xE34C: 0x9252, - 0xE34D: 0x9253, - 0xE34E: 0x9254, - 0xE34F: 0x9255, - 0xE350: 0x9256, - 0xE351: 0x9257, - 0xE352: 0x9258, - 0xE353: 0x9259, - 0xE354: 0x925A, - 0xE355: 0x925B, - 0xE356: 0x925C, - 0xE357: 0x925D, - 0xE358: 0x925E, - 0xE359: 0x925F, - 0xE35A: 0x9260, - 0xE35B: 0x9261, - 0xE35C: 0x9262, - 0xE35D: 0x9263, - 0xE35E: 0x9264, - 0xE35F: 0x9265, - 0xE360: 0x9266, - 0xE361: 0x9267, - 0xE362: 0x9268, - 0xE363: 0x9269, - 0xE364: 0x926A, - 0xE365: 0x926B, - 0xE366: 0x926C, - 0xE367: 0x926D, - 0xE368: 0x926E, - 0xE369: 0x926F, - 0xE36A: 0x9270, - 0xE36B: 0x9271, - 0xE36C: 0x9272, - 0xE36D: 0x9273, - 0xE36E: 0x9275, - 0xE36F: 0x9276, - 0xE370: 0x9277, - 0xE371: 0x9278, - 0xE372: 0x9279, - 0xE373: 0x927A, - 0xE374: 0x927B, - 0xE375: 0x927C, - 0xE376: 0x927D, - 0xE377: 0x927E, - 0xE378: 0x927F, - 0xE379: 0x9280, - 0xE37A: 0x9281, - 0xE37B: 0x9282, - 0xE37C: 0x9283, - 0xE37D: 0x9284, - 0xE37E: 0x9285, - 0xE380: 0x9286, - 0xE381: 0x9287, - 0xE382: 0x9288, - 0xE383: 0x9289, - 0xE384: 0x928A, - 0xE385: 0x928B, - 0xE386: 0x928C, - 0xE387: 0x928D, - 0xE388: 0x928F, - 0xE389: 0x9290, - 0xE38A: 0x9291, - 0xE38B: 0x9292, - 0xE38C: 0x9293, - 0xE38D: 0x9294, - 0xE38E: 0x9295, - 0xE38F: 0x9296, - 0xE390: 0x9297, - 0xE391: 0x9298, - 0xE392: 0x9299, - 0xE393: 0x929A, - 0xE394: 0x929B, - 0xE395: 0x929C, - 0xE396: 0x929D, - 0xE397: 0x929E, - 0xE398: 0x929F, - 0xE399: 0x92A0, - 0xE39A: 0x92A1, - 0xE39B: 0x92A2, - 0xE39C: 0x92A3, - 0xE39D: 0x92A4, - 0xE39E: 0x92A5, - 0xE39F: 0x92A6, - 0xE3A0: 0x92A7, - 0xE3A1: 0x606A, - 0xE3A2: 0x607D, - 0xE3A3: 0x6096, - 0xE3A4: 0x609A, - 0xE3A5: 0x60AD, - 0xE3A6: 0x609D, - 0xE3A7: 0x6083, - 0xE3A8: 0x6092, - 0xE3A9: 0x608C, - 0xE3AA: 0x609B, - 0xE3AB: 0x60EC, - 0xE3AC: 0x60BB, - 0xE3AD: 0x60B1, - 0xE3AE: 0x60DD, - 0xE3AF: 0x60D8, - 0xE3B0: 0x60C6, - 0xE3B1: 0x60DA, - 0xE3B2: 0x60B4, - 0xE3B3: 0x6120, - 0xE3B4: 0x6126, - 0xE3B5: 0x6115, - 0xE3B6: 0x6123, - 0xE3B7: 0x60F4, - 0xE3B8: 0x6100, - 0xE3B9: 0x610E, - 0xE3BA: 0x612B, - 0xE3BB: 0x614A, - 0xE3BC: 0x6175, - 0xE3BD: 0x61AC, - 0xE3BE: 0x6194, - 0xE3BF: 0x61A7, - 0xE3C0: 0x61B7, - 0xE3C1: 0x61D4, - 0xE3C2: 0x61F5, - 0xE3C3: 0x5FDD, - 0xE3C4: 0x96B3, - 0xE3C5: 0x95E9, - 0xE3C6: 0x95EB, - 0xE3C7: 0x95F1, - 0xE3C8: 0x95F3, - 0xE3C9: 0x95F5, - 0xE3CA: 0x95F6, - 0xE3CB: 0x95FC, - 0xE3CC: 0x95FE, - 0xE3CD: 0x9603, - 0xE3CE: 0x9604, - 0xE3CF: 0x9606, - 0xE3D0: 0x9608, - 0xE3D1: 0x960A, - 0xE3D2: 0x960B, - 0xE3D3: 0x960C, - 0xE3D4: 0x960D, - 0xE3D5: 0x960F, - 0xE3D6: 0x9612, - 0xE3D7: 0x9615, - 0xE3D8: 0x9616, - 0xE3D9: 0x9617, - 0xE3DA: 0x9619, - 0xE3DB: 0x961A, - 0xE3DC: 0x4E2C, - 0xE3DD: 0x723F, - 0xE3DE: 0x6215, - 0xE3DF: 0x6C35, - 0xE3E0: 0x6C54, - 0xE3E1: 0x6C5C, - 0xE3E2: 0x6C4A, - 0xE3E3: 0x6CA3, - 0xE3E4: 0x6C85, - 0xE3E5: 0x6C90, - 0xE3E6: 0x6C94, - 0xE3E7: 0x6C8C, - 0xE3E8: 0x6C68, - 0xE3E9: 0x6C69, - 0xE3EA: 0x6C74, - 0xE3EB: 0x6C76, - 0xE3EC: 0x6C86, - 0xE3ED: 0x6CA9, - 0xE3EE: 0x6CD0, - 0xE3EF: 0x6CD4, - 0xE3F0: 0x6CAD, - 0xE3F1: 0x6CF7, - 0xE3F2: 0x6CF8, - 0xE3F3: 0x6CF1, - 0xE3F4: 0x6CD7, - 0xE3F5: 0x6CB2, - 0xE3F6: 0x6CE0, - 0xE3F7: 0x6CD6, - 0xE3F8: 0x6CFA, - 0xE3F9: 0x6CEB, - 0xE3FA: 0x6CEE, - 0xE3FB: 0x6CB1, - 0xE3FC: 0x6CD3, - 0xE3FD: 0x6CEF, - 0xE3FE: 0x6CFE, - 0xE440: 0x92A8, - 0xE441: 0x92A9, - 0xE442: 0x92AA, - 0xE443: 0x92AB, - 0xE444: 0x92AC, - 0xE445: 0x92AD, - 0xE446: 0x92AF, - 0xE447: 0x92B0, - 0xE448: 0x92B1, - 0xE449: 0x92B2, - 0xE44A: 0x92B3, - 0xE44B: 0x92B4, - 0xE44C: 0x92B5, - 0xE44D: 0x92B6, - 0xE44E: 0x92B7, - 0xE44F: 0x92B8, - 0xE450: 0x92B9, - 0xE451: 0x92BA, - 0xE452: 0x92BB, - 0xE453: 0x92BC, - 0xE454: 0x92BD, - 0xE455: 0x92BE, - 0xE456: 0x92BF, - 0xE457: 0x92C0, - 0xE458: 0x92C1, - 0xE459: 0x92C2, - 0xE45A: 0x92C3, - 0xE45B: 0x92C4, - 0xE45C: 0x92C5, - 0xE45D: 0x92C6, - 0xE45E: 0x92C7, - 0xE45F: 0x92C9, - 0xE460: 0x92CA, - 0xE461: 0x92CB, - 0xE462: 0x92CC, - 0xE463: 0x92CD, - 0xE464: 0x92CE, - 0xE465: 0x92CF, - 0xE466: 0x92D0, - 0xE467: 0x92D1, - 0xE468: 0x92D2, - 0xE469: 0x92D3, - 0xE46A: 0x92D4, - 0xE46B: 0x92D5, - 0xE46C: 0x92D6, - 0xE46D: 0x92D7, - 0xE46E: 0x92D8, - 0xE46F: 0x92D9, - 0xE470: 0x92DA, - 0xE471: 0x92DB, - 0xE472: 0x92DC, - 0xE473: 0x92DD, - 0xE474: 0x92DE, - 0xE475: 0x92DF, - 0xE476: 0x92E0, - 0xE477: 0x92E1, - 0xE478: 0x92E2, - 0xE479: 0x92E3, - 0xE47A: 0x92E4, - 0xE47B: 0x92E5, - 0xE47C: 0x92E6, - 0xE47D: 0x92E7, - 0xE47E: 0x92E8, - 0xE480: 0x92E9, - 0xE481: 0x92EA, - 0xE482: 0x92EB, - 0xE483: 0x92EC, - 0xE484: 0x92ED, - 0xE485: 0x92EE, - 0xE486: 0x92EF, - 0xE487: 0x92F0, - 0xE488: 0x92F1, - 0xE489: 0x92F2, - 0xE48A: 0x92F3, - 0xE48B: 0x92F4, - 0xE48C: 0x92F5, - 0xE48D: 0x92F6, - 0xE48E: 0x92F7, - 0xE48F: 0x92F8, - 0xE490: 0x92F9, - 0xE491: 0x92FA, - 0xE492: 0x92FB, - 0xE493: 0x92FC, - 0xE494: 0x92FD, - 0xE495: 0x92FE, - 0xE496: 0x92FF, - 0xE497: 0x9300, - 0xE498: 0x9301, - 0xE499: 0x9302, - 0xE49A: 0x9303, - 0xE49B: 0x9304, - 0xE49C: 0x9305, - 0xE49D: 0x9306, - 0xE49E: 0x9307, - 0xE49F: 0x9308, - 0xE4A0: 0x9309, - 0xE4A1: 0x6D39, - 0xE4A2: 0x6D27, - 0xE4A3: 0x6D0C, - 0xE4A4: 0x6D43, - 0xE4A5: 0x6D48, - 0xE4A6: 0x6D07, - 0xE4A7: 0x6D04, - 0xE4A8: 0x6D19, - 0xE4A9: 0x6D0E, - 0xE4AA: 0x6D2B, - 0xE4AB: 0x6D4D, - 0xE4AC: 0x6D2E, - 0xE4AD: 0x6D35, - 0xE4AE: 0x6D1A, - 0xE4AF: 0x6D4F, - 0xE4B0: 0x6D52, - 0xE4B1: 0x6D54, - 0xE4B2: 0x6D33, - 0xE4B3: 0x6D91, - 0xE4B4: 0x6D6F, - 0xE4B5: 0x6D9E, - 0xE4B6: 0x6DA0, - 0xE4B7: 0x6D5E, - 0xE4B8: 0x6D93, - 0xE4B9: 0x6D94, - 0xE4BA: 0x6D5C, - 0xE4BB: 0x6D60, - 0xE4BC: 0x6D7C, - 0xE4BD: 0x6D63, - 0xE4BE: 0x6E1A, - 0xE4BF: 0x6DC7, - 0xE4C0: 0x6DC5, - 0xE4C1: 0x6DDE, - 0xE4C2: 0x6E0E, - 0xE4C3: 0x6DBF, - 0xE4C4: 0x6DE0, - 0xE4C5: 0x6E11, - 0xE4C6: 0x6DE6, - 0xE4C7: 0x6DDD, - 0xE4C8: 0x6DD9, - 0xE4C9: 0x6E16, - 0xE4CA: 0x6DAB, - 0xE4CB: 0x6E0C, - 0xE4CC: 0x6DAE, - 0xE4CD: 0x6E2B, - 0xE4CE: 0x6E6E, - 0xE4CF: 0x6E4E, - 0xE4D0: 0x6E6B, - 0xE4D1: 0x6EB2, - 0xE4D2: 0x6E5F, - 0xE4D3: 0x6E86, - 0xE4D4: 0x6E53, - 0xE4D5: 0x6E54, - 0xE4D6: 0x6E32, - 0xE4D7: 0x6E25, - 0xE4D8: 0x6E44, - 0xE4D9: 0x6EDF, - 0xE4DA: 0x6EB1, - 0xE4DB: 0x6E98, - 0xE4DC: 0x6EE0, - 0xE4DD: 0x6F2D, - 0xE4DE: 0x6EE2, - 0xE4DF: 0x6EA5, - 0xE4E0: 0x6EA7, - 0xE4E1: 0x6EBD, - 0xE4E2: 0x6EBB, - 0xE4E3: 0x6EB7, - 0xE4E4: 0x6ED7, - 0xE4E5: 0x6EB4, - 0xE4E6: 0x6ECF, - 0xE4E7: 0x6E8F, - 0xE4E8: 0x6EC2, - 0xE4E9: 0x6E9F, - 0xE4EA: 0x6F62, - 0xE4EB: 0x6F46, - 0xE4EC: 0x6F47, - 0xE4ED: 0x6F24, - 0xE4EE: 0x6F15, - 0xE4EF: 0x6EF9, - 0xE4F0: 0x6F2F, - 0xE4F1: 0x6F36, - 0xE4F2: 0x6F4B, - 0xE4F3: 0x6F74, - 0xE4F4: 0x6F2A, - 0xE4F5: 0x6F09, - 0xE4F6: 0x6F29, - 0xE4F7: 0x6F89, - 0xE4F8: 0x6F8D, - 0xE4F9: 0x6F8C, - 0xE4FA: 0x6F78, - 0xE4FB: 0x6F72, - 0xE4FC: 0x6F7C, - 0xE4FD: 0x6F7A, - 0xE4FE: 0x6FD1, - 0xE540: 0x930A, - 0xE541: 0x930B, - 0xE542: 0x930C, - 0xE543: 0x930D, - 0xE544: 0x930E, - 0xE545: 0x930F, - 0xE546: 0x9310, - 0xE547: 0x9311, - 0xE548: 0x9312, - 0xE549: 0x9313, - 0xE54A: 0x9314, - 0xE54B: 0x9315, - 0xE54C: 0x9316, - 0xE54D: 0x9317, - 0xE54E: 0x9318, - 0xE54F: 0x9319, - 0xE550: 0x931A, - 0xE551: 0x931B, - 0xE552: 0x931C, - 0xE553: 0x931D, - 0xE554: 0x931E, - 0xE555: 0x931F, - 0xE556: 0x9320, - 0xE557: 0x9321, - 0xE558: 0x9322, - 0xE559: 0x9323, - 0xE55A: 0x9324, - 0xE55B: 0x9325, - 0xE55C: 0x9326, - 0xE55D: 0x9327, - 0xE55E: 0x9328, - 0xE55F: 0x9329, - 0xE560: 0x932A, - 0xE561: 0x932B, - 0xE562: 0x932C, - 0xE563: 0x932D, - 0xE564: 0x932E, - 0xE565: 0x932F, - 0xE566: 0x9330, - 0xE567: 0x9331, - 0xE568: 0x9332, - 0xE569: 0x9333, - 0xE56A: 0x9334, - 0xE56B: 0x9335, - 0xE56C: 0x9336, - 0xE56D: 0x9337, - 0xE56E: 0x9338, - 0xE56F: 0x9339, - 0xE570: 0x933A, - 0xE571: 0x933B, - 0xE572: 0x933C, - 0xE573: 0x933D, - 0xE574: 0x933F, - 0xE575: 0x9340, - 0xE576: 0x9341, - 0xE577: 0x9342, - 0xE578: 0x9343, - 0xE579: 0x9344, - 0xE57A: 0x9345, - 0xE57B: 0x9346, - 0xE57C: 0x9347, - 0xE57D: 0x9348, - 0xE57E: 0x9349, - 0xE580: 0x934A, - 0xE581: 0x934B, - 0xE582: 0x934C, - 0xE583: 0x934D, - 0xE584: 0x934E, - 0xE585: 0x934F, - 0xE586: 0x9350, - 0xE587: 0x9351, - 0xE588: 0x9352, - 0xE589: 0x9353, - 0xE58A: 0x9354, - 0xE58B: 0x9355, - 0xE58C: 0x9356, - 0xE58D: 0x9357, - 0xE58E: 0x9358, - 0xE58F: 0x9359, - 0xE590: 0x935A, - 0xE591: 0x935B, - 0xE592: 0x935C, - 0xE593: 0x935D, - 0xE594: 0x935E, - 0xE595: 0x935F, - 0xE596: 0x9360, - 0xE597: 0x9361, - 0xE598: 0x9362, - 0xE599: 0x9363, - 0xE59A: 0x9364, - 0xE59B: 0x9365, - 0xE59C: 0x9366, - 0xE59D: 0x9367, - 0xE59E: 0x9368, - 0xE59F: 0x9369, - 0xE5A0: 0x936B, - 0xE5A1: 0x6FC9, - 0xE5A2: 0x6FA7, - 0xE5A3: 0x6FB9, - 0xE5A4: 0x6FB6, - 0xE5A5: 0x6FC2, - 0xE5A6: 0x6FE1, - 0xE5A7: 0x6FEE, - 0xE5A8: 0x6FDE, - 0xE5A9: 0x6FE0, - 0xE5AA: 0x6FEF, - 0xE5AB: 0x701A, - 0xE5AC: 0x7023, - 0xE5AD: 0x701B, - 0xE5AE: 0x7039, - 0xE5AF: 0x7035, - 0xE5B0: 0x704F, - 0xE5B1: 0x705E, - 0xE5B2: 0x5B80, - 0xE5B3: 0x5B84, - 0xE5B4: 0x5B95, - 0xE5B5: 0x5B93, - 0xE5B6: 0x5BA5, - 0xE5B7: 0x5BB8, - 0xE5B8: 0x752F, - 0xE5B9: 0x9A9E, - 0xE5BA: 0x6434, - 0xE5BB: 0x5BE4, - 0xE5BC: 0x5BEE, - 0xE5BD: 0x8930, - 0xE5BE: 0x5BF0, - 0xE5BF: 0x8E47, - 0xE5C0: 0x8B07, - 0xE5C1: 0x8FB6, - 0xE5C2: 0x8FD3, - 0xE5C3: 0x8FD5, - 0xE5C4: 0x8FE5, - 0xE5C5: 0x8FEE, - 0xE5C6: 0x8FE4, - 0xE5C7: 0x8FE9, - 0xE5C8: 0x8FE6, - 0xE5C9: 0x8FF3, - 0xE5CA: 0x8FE8, - 0xE5CB: 0x9005, - 0xE5CC: 0x9004, - 0xE5CD: 0x900B, - 0xE5CE: 0x9026, - 0xE5CF: 0x9011, - 0xE5D0: 0x900D, - 0xE5D1: 0x9016, - 0xE5D2: 0x9021, - 0xE5D3: 0x9035, - 0xE5D4: 0x9036, - 0xE5D5: 0x902D, - 0xE5D6: 0x902F, - 0xE5D7: 0x9044, - 0xE5D8: 0x9051, - 0xE5D9: 0x9052, - 0xE5DA: 0x9050, - 0xE5DB: 0x9068, - 0xE5DC: 0x9058, - 0xE5DD: 0x9062, - 0xE5DE: 0x905B, - 0xE5DF: 0x66B9, - 0xE5E0: 0x9074, - 0xE5E1: 0x907D, - 0xE5E2: 0x9082, - 0xE5E3: 0x9088, - 0xE5E4: 0x9083, - 0xE5E5: 0x908B, - 0xE5E6: 0x5F50, - 0xE5E7: 0x5F57, - 0xE5E8: 0x5F56, - 0xE5E9: 0x5F58, - 0xE5EA: 0x5C3B, - 0xE5EB: 0x54AB, - 0xE5EC: 0x5C50, - 0xE5ED: 0x5C59, - 0xE5EE: 0x5B71, - 0xE5EF: 0x5C63, - 0xE5F0: 0x5C66, - 0xE5F1: 0x7FBC, - 0xE5F2: 0x5F2A, - 0xE5F3: 0x5F29, - 0xE5F4: 0x5F2D, - 0xE5F5: 0x8274, - 0xE5F6: 0x5F3C, - 0xE5F7: 0x9B3B, - 0xE5F8: 0x5C6E, - 0xE5F9: 0x5981, - 0xE5FA: 0x5983, - 0xE5FB: 0x598D, - 0xE5FC: 0x59A9, - 0xE5FD: 0x59AA, - 0xE5FE: 0x59A3, - 0xE640: 0x936C, - 0xE641: 0x936D, - 0xE642: 0x936E, - 0xE643: 0x936F, - 0xE644: 0x9370, - 0xE645: 0x9371, - 0xE646: 0x9372, - 0xE647: 0x9373, - 0xE648: 0x9374, - 0xE649: 0x9375, - 0xE64A: 0x9376, - 0xE64B: 0x9377, - 0xE64C: 0x9378, - 0xE64D: 0x9379, - 0xE64E: 0x937A, - 0xE64F: 0x937B, - 0xE650: 0x937C, - 0xE651: 0x937D, - 0xE652: 0x937E, - 0xE653: 0x937F, - 0xE654: 0x9380, - 0xE655: 0x9381, - 0xE656: 0x9382, - 0xE657: 0x9383, - 0xE658: 0x9384, - 0xE659: 0x9385, - 0xE65A: 0x9386, - 0xE65B: 0x9387, - 0xE65C: 0x9388, - 0xE65D: 0x9389, - 0xE65E: 0x938A, - 0xE65F: 0x938B, - 0xE660: 0x938C, - 0xE661: 0x938D, - 0xE662: 0x938E, - 0xE663: 0x9390, - 0xE664: 0x9391, - 0xE665: 0x9392, - 0xE666: 0x9393, - 0xE667: 0x9394, - 0xE668: 0x9395, - 0xE669: 0x9396, - 0xE66A: 0x9397, - 0xE66B: 0x9398, - 0xE66C: 0x9399, - 0xE66D: 0x939A, - 0xE66E: 0x939B, - 0xE66F: 0x939C, - 0xE670: 0x939D, - 0xE671: 0x939E, - 0xE672: 0x939F, - 0xE673: 0x93A0, - 0xE674: 0x93A1, - 0xE675: 0x93A2, - 0xE676: 0x93A3, - 0xE677: 0x93A4, - 0xE678: 0x93A5, - 0xE679: 0x93A6, - 0xE67A: 0x93A7, - 0xE67B: 0x93A8, - 0xE67C: 0x93A9, - 0xE67D: 0x93AA, - 0xE67E: 0x93AB, - 0xE680: 0x93AC, - 0xE681: 0x93AD, - 0xE682: 0x93AE, - 0xE683: 0x93AF, - 0xE684: 0x93B0, - 0xE685: 0x93B1, - 0xE686: 0x93B2, - 0xE687: 0x93B3, - 0xE688: 0x93B4, - 0xE689: 0x93B5, - 0xE68A: 0x93B6, - 0xE68B: 0x93B7, - 0xE68C: 0x93B8, - 0xE68D: 0x93B9, - 0xE68E: 0x93BA, - 0xE68F: 0x93BB, - 0xE690: 0x93BC, - 0xE691: 0x93BD, - 0xE692: 0x93BE, - 0xE693: 0x93BF, - 0xE694: 0x93C0, - 0xE695: 0x93C1, - 0xE696: 0x93C2, - 0xE697: 0x93C3, - 0xE698: 0x93C4, - 0xE699: 0x93C5, - 0xE69A: 0x93C6, - 0xE69B: 0x93C7, - 0xE69C: 0x93C8, - 0xE69D: 0x93C9, - 0xE69E: 0x93CB, - 0xE69F: 0x93CC, - 0xE6A0: 0x93CD, - 0xE6A1: 0x5997, - 0xE6A2: 0x59CA, - 0xE6A3: 0x59AB, - 0xE6A4: 0x599E, - 0xE6A5: 0x59A4, - 0xE6A6: 0x59D2, - 0xE6A7: 0x59B2, - 0xE6A8: 0x59AF, - 0xE6A9: 0x59D7, - 0xE6AA: 0x59BE, - 0xE6AB: 0x5A05, - 0xE6AC: 0x5A06, - 0xE6AD: 0x59DD, - 0xE6AE: 0x5A08, - 0xE6AF: 0x59E3, - 0xE6B0: 0x59D8, - 0xE6B1: 0x59F9, - 0xE6B2: 0x5A0C, - 0xE6B3: 0x5A09, - 0xE6B4: 0x5A32, - 0xE6B5: 0x5A34, - 0xE6B6: 0x5A11, - 0xE6B7: 0x5A23, - 0xE6B8: 0x5A13, - 0xE6B9: 0x5A40, - 0xE6BA: 0x5A67, - 0xE6BB: 0x5A4A, - 0xE6BC: 0x5A55, - 0xE6BD: 0x5A3C, - 0xE6BE: 0x5A62, - 0xE6BF: 0x5A75, - 0xE6C0: 0x80EC, - 0xE6C1: 0x5AAA, - 0xE6C2: 0x5A9B, - 0xE6C3: 0x5A77, - 0xE6C4: 0x5A7A, - 0xE6C5: 0x5ABE, - 0xE6C6: 0x5AEB, - 0xE6C7: 0x5AB2, - 0xE6C8: 0x5AD2, - 0xE6C9: 0x5AD4, - 0xE6CA: 0x5AB8, - 0xE6CB: 0x5AE0, - 0xE6CC: 0x5AE3, - 0xE6CD: 0x5AF1, - 0xE6CE: 0x5AD6, - 0xE6CF: 0x5AE6, - 0xE6D0: 0x5AD8, - 0xE6D1: 0x5ADC, - 0xE6D2: 0x5B09, - 0xE6D3: 0x5B17, - 0xE6D4: 0x5B16, - 0xE6D5: 0x5B32, - 0xE6D6: 0x5B37, - 0xE6D7: 0x5B40, - 0xE6D8: 0x5C15, - 0xE6D9: 0x5C1C, - 0xE6DA: 0x5B5A, - 0xE6DB: 0x5B65, - 0xE6DC: 0x5B73, - 0xE6DD: 0x5B51, - 0xE6DE: 0x5B53, - 0xE6DF: 0x5B62, - 0xE6E0: 0x9A75, - 0xE6E1: 0x9A77, - 0xE6E2: 0x9A78, - 0xE6E3: 0x9A7A, - 0xE6E4: 0x9A7F, - 0xE6E5: 0x9A7D, - 0xE6E6: 0x9A80, - 0xE6E7: 0x9A81, - 0xE6E8: 0x9A85, - 0xE6E9: 0x9A88, - 0xE6EA: 0x9A8A, - 0xE6EB: 0x9A90, - 0xE6EC: 0x9A92, - 0xE6ED: 0x9A93, - 0xE6EE: 0x9A96, - 0xE6EF: 0x9A98, - 0xE6F0: 0x9A9B, - 0xE6F1: 0x9A9C, - 0xE6F2: 0x9A9D, - 0xE6F3: 0x9A9F, - 0xE6F4: 0x9AA0, - 0xE6F5: 0x9AA2, - 0xE6F6: 0x9AA3, - 0xE6F7: 0x9AA5, - 0xE6F8: 0x9AA7, - 0xE6F9: 0x7E9F, - 0xE6FA: 0x7EA1, - 0xE6FB: 0x7EA3, - 0xE6FC: 0x7EA5, - 0xE6FD: 0x7EA8, - 0xE6FE: 0x7EA9, - 0xE740: 0x93CE, - 0xE741: 0x93CF, - 0xE742: 0x93D0, - 0xE743: 0x93D1, - 0xE744: 0x93D2, - 0xE745: 0x93D3, - 0xE746: 0x93D4, - 0xE747: 0x93D5, - 0xE748: 0x93D7, - 0xE749: 0x93D8, - 0xE74A: 0x93D9, - 0xE74B: 0x93DA, - 0xE74C: 0x93DB, - 0xE74D: 0x93DC, - 0xE74E: 0x93DD, - 0xE74F: 0x93DE, - 0xE750: 0x93DF, - 0xE751: 0x93E0, - 0xE752: 0x93E1, - 0xE753: 0x93E2, - 0xE754: 0x93E3, - 0xE755: 0x93E4, - 0xE756: 0x93E5, - 0xE757: 0x93E6, - 0xE758: 0x93E7, - 0xE759: 0x93E8, - 0xE75A: 0x93E9, - 0xE75B: 0x93EA, - 0xE75C: 0x93EB, - 0xE75D: 0x93EC, - 0xE75E: 0x93ED, - 0xE75F: 0x93EE, - 0xE760: 0x93EF, - 0xE761: 0x93F0, - 0xE762: 0x93F1, - 0xE763: 0x93F2, - 0xE764: 0x93F3, - 0xE765: 0x93F4, - 0xE766: 0x93F5, - 0xE767: 0x93F6, - 0xE768: 0x93F7, - 0xE769: 0x93F8, - 0xE76A: 0x93F9, - 0xE76B: 0x93FA, - 0xE76C: 0x93FB, - 0xE76D: 0x93FC, - 0xE76E: 0x93FD, - 0xE76F: 0x93FE, - 0xE770: 0x93FF, - 0xE771: 0x9400, - 0xE772: 0x9401, - 0xE773: 0x9402, - 0xE774: 0x9403, - 0xE775: 0x9404, - 0xE776: 0x9405, - 0xE777: 0x9406, - 0xE778: 0x9407, - 0xE779: 0x9408, - 0xE77A: 0x9409, - 0xE77B: 0x940A, - 0xE77C: 0x940B, - 0xE77D: 0x940C, - 0xE77E: 0x940D, - 0xE780: 0x940E, - 0xE781: 0x940F, - 0xE782: 0x9410, - 0xE783: 0x9411, - 0xE784: 0x9412, - 0xE785: 0x9413, - 0xE786: 0x9414, - 0xE787: 0x9415, - 0xE788: 0x9416, - 0xE789: 0x9417, - 0xE78A: 0x9418, - 0xE78B: 0x9419, - 0xE78C: 0x941A, - 0xE78D: 0x941B, - 0xE78E: 0x941C, - 0xE78F: 0x941D, - 0xE790: 0x941E, - 0xE791: 0x941F, - 0xE792: 0x9420, - 0xE793: 0x9421, - 0xE794: 0x9422, - 0xE795: 0x9423, - 0xE796: 0x9424, - 0xE797: 0x9425, - 0xE798: 0x9426, - 0xE799: 0x9427, - 0xE79A: 0x9428, - 0xE79B: 0x9429, - 0xE79C: 0x942A, - 0xE79D: 0x942B, - 0xE79E: 0x942C, - 0xE79F: 0x942D, - 0xE7A0: 0x942E, - 0xE7A1: 0x7EAD, - 0xE7A2: 0x7EB0, - 0xE7A3: 0x7EBE, - 0xE7A4: 0x7EC0, - 0xE7A5: 0x7EC1, - 0xE7A6: 0x7EC2, - 0xE7A7: 0x7EC9, - 0xE7A8: 0x7ECB, - 0xE7A9: 0x7ECC, - 0xE7AA: 0x7ED0, - 0xE7AB: 0x7ED4, - 0xE7AC: 0x7ED7, - 0xE7AD: 0x7EDB, - 0xE7AE: 0x7EE0, - 0xE7AF: 0x7EE1, - 0xE7B0: 0x7EE8, - 0xE7B1: 0x7EEB, - 0xE7B2: 0x7EEE, - 0xE7B3: 0x7EEF, - 0xE7B4: 0x7EF1, - 0xE7B5: 0x7EF2, - 0xE7B6: 0x7F0D, - 0xE7B7: 0x7EF6, - 0xE7B8: 0x7EFA, - 0xE7B9: 0x7EFB, - 0xE7BA: 0x7EFE, - 0xE7BB: 0x7F01, - 0xE7BC: 0x7F02, - 0xE7BD: 0x7F03, - 0xE7BE: 0x7F07, - 0xE7BF: 0x7F08, - 0xE7C0: 0x7F0B, - 0xE7C1: 0x7F0C, - 0xE7C2: 0x7F0F, - 0xE7C3: 0x7F11, - 0xE7C4: 0x7F12, - 0xE7C5: 0x7F17, - 0xE7C6: 0x7F19, - 0xE7C7: 0x7F1C, - 0xE7C8: 0x7F1B, - 0xE7C9: 0x7F1F, - 0xE7CA: 0x7F21, - 0xE7CB: 0x7F22, - 0xE7CC: 0x7F23, - 0xE7CD: 0x7F24, - 0xE7CE: 0x7F25, - 0xE7CF: 0x7F26, - 0xE7D0: 0x7F27, - 0xE7D1: 0x7F2A, - 0xE7D2: 0x7F2B, - 0xE7D3: 0x7F2C, - 0xE7D4: 0x7F2D, - 0xE7D5: 0x7F2F, - 0xE7D6: 0x7F30, - 0xE7D7: 0x7F31, - 0xE7D8: 0x7F32, - 0xE7D9: 0x7F33, - 0xE7DA: 0x7F35, - 0xE7DB: 0x5E7A, - 0xE7DC: 0x757F, - 0xE7DD: 0x5DDB, - 0xE7DE: 0x753E, - 0xE7DF: 0x9095, - 0xE7E0: 0x738E, - 0xE7E1: 0x7391, - 0xE7E2: 0x73AE, - 0xE7E3: 0x73A2, - 0xE7E4: 0x739F, - 0xE7E5: 0x73CF, - 0xE7E6: 0x73C2, - 0xE7E7: 0x73D1, - 0xE7E8: 0x73B7, - 0xE7E9: 0x73B3, - 0xE7EA: 0x73C0, - 0xE7EB: 0x73C9, - 0xE7EC: 0x73C8, - 0xE7ED: 0x73E5, - 0xE7EE: 0x73D9, - 0xE7EF: 0x987C, - 0xE7F0: 0x740A, - 0xE7F1: 0x73E9, - 0xE7F2: 0x73E7, - 0xE7F3: 0x73DE, - 0xE7F4: 0x73BA, - 0xE7F5: 0x73F2, - 0xE7F6: 0x740F, - 0xE7F7: 0x742A, - 0xE7F8: 0x745B, - 0xE7F9: 0x7426, - 0xE7FA: 0x7425, - 0xE7FB: 0x7428, - 0xE7FC: 0x7430, - 0xE7FD: 0x742E, - 0xE7FE: 0x742C, - 0xE840: 0x942F, - 0xE841: 0x9430, - 0xE842: 0x9431, - 0xE843: 0x9432, - 0xE844: 0x9433, - 0xE845: 0x9434, - 0xE846: 0x9435, - 0xE847: 0x9436, - 0xE848: 0x9437, - 0xE849: 0x9438, - 0xE84A: 0x9439, - 0xE84B: 0x943A, - 0xE84C: 0x943B, - 0xE84D: 0x943C, - 0xE84E: 0x943D, - 0xE84F: 0x943F, - 0xE850: 0x9440, - 0xE851: 0x9441, - 0xE852: 0x9442, - 0xE853: 0x9443, - 0xE854: 0x9444, - 0xE855: 0x9445, - 0xE856: 0x9446, - 0xE857: 0x9447, - 0xE858: 0x9448, - 0xE859: 0x9449, - 0xE85A: 0x944A, - 0xE85B: 0x944B, - 0xE85C: 0x944C, - 0xE85D: 0x944D, - 0xE85E: 0x944E, - 0xE85F: 0x944F, - 0xE860: 0x9450, - 0xE861: 0x9451, - 0xE862: 0x9452, - 0xE863: 0x9453, - 0xE864: 0x9454, - 0xE865: 0x9455, - 0xE866: 0x9456, - 0xE867: 0x9457, - 0xE868: 0x9458, - 0xE869: 0x9459, - 0xE86A: 0x945A, - 0xE86B: 0x945B, - 0xE86C: 0x945C, - 0xE86D: 0x945D, - 0xE86E: 0x945E, - 0xE86F: 0x945F, - 0xE870: 0x9460, - 0xE871: 0x9461, - 0xE872: 0x9462, - 0xE873: 0x9463, - 0xE874: 0x9464, - 0xE875: 0x9465, - 0xE876: 0x9466, - 0xE877: 0x9467, - 0xE878: 0x9468, - 0xE879: 0x9469, - 0xE87A: 0x946A, - 0xE87B: 0x946C, - 0xE87C: 0x946D, - 0xE87D: 0x946E, - 0xE87E: 0x946F, - 0xE880: 0x9470, - 0xE881: 0x9471, - 0xE882: 0x9472, - 0xE883: 0x9473, - 0xE884: 0x9474, - 0xE885: 0x9475, - 0xE886: 0x9476, - 0xE887: 0x9477, - 0xE888: 0x9478, - 0xE889: 0x9479, - 0xE88A: 0x947A, - 0xE88B: 0x947B, - 0xE88C: 0x947C, - 0xE88D: 0x947D, - 0xE88E: 0x947E, - 0xE88F: 0x947F, - 0xE890: 0x9480, - 0xE891: 0x9481, - 0xE892: 0x9482, - 0xE893: 0x9483, - 0xE894: 0x9484, - 0xE895: 0x9491, - 0xE896: 0x9496, - 0xE897: 0x9498, - 0xE898: 0x94C7, - 0xE899: 0x94CF, - 0xE89A: 0x94D3, - 0xE89B: 0x94D4, - 0xE89C: 0x94DA, - 0xE89D: 0x94E6, - 0xE89E: 0x94FB, - 0xE89F: 0x951C, - 0xE8A0: 0x9520, - 0xE8A1: 0x741B, - 0xE8A2: 0x741A, - 0xE8A3: 0x7441, - 0xE8A4: 0x745C, - 0xE8A5: 0x7457, - 0xE8A6: 0x7455, - 0xE8A7: 0x7459, - 0xE8A8: 0x7477, - 0xE8A9: 0x746D, - 0xE8AA: 0x747E, - 0xE8AB: 0x749C, - 0xE8AC: 0x748E, - 0xE8AD: 0x7480, - 0xE8AE: 0x7481, - 0xE8AF: 0x7487, - 0xE8B0: 0x748B, - 0xE8B1: 0x749E, - 0xE8B2: 0x74A8, - 0xE8B3: 0x74A9, - 0xE8B4: 0x7490, - 0xE8B5: 0x74A7, - 0xE8B6: 0x74D2, - 0xE8B7: 0x74BA, - 0xE8B8: 0x97EA, - 0xE8B9: 0x97EB, - 0xE8BA: 0x97EC, - 0xE8BB: 0x674C, - 0xE8BC: 0x6753, - 0xE8BD: 0x675E, - 0xE8BE: 0x6748, - 0xE8BF: 0x6769, - 0xE8C0: 0x67A5, - 0xE8C1: 0x6787, - 0xE8C2: 0x676A, - 0xE8C3: 0x6773, - 0xE8C4: 0x6798, - 0xE8C5: 0x67A7, - 0xE8C6: 0x6775, - 0xE8C7: 0x67A8, - 0xE8C8: 0x679E, - 0xE8C9: 0x67AD, - 0xE8CA: 0x678B, - 0xE8CB: 0x6777, - 0xE8CC: 0x677C, - 0xE8CD: 0x67F0, - 0xE8CE: 0x6809, - 0xE8CF: 0x67D8, - 0xE8D0: 0x680A, - 0xE8D1: 0x67E9, - 0xE8D2: 0x67B0, - 0xE8D3: 0x680C, - 0xE8D4: 0x67D9, - 0xE8D5: 0x67B5, - 0xE8D6: 0x67DA, - 0xE8D7: 0x67B3, - 0xE8D8: 0x67DD, - 0xE8D9: 0x6800, - 0xE8DA: 0x67C3, - 0xE8DB: 0x67B8, - 0xE8DC: 0x67E2, - 0xE8DD: 0x680E, - 0xE8DE: 0x67C1, - 0xE8DF: 0x67FD, - 0xE8E0: 0x6832, - 0xE8E1: 0x6833, - 0xE8E2: 0x6860, - 0xE8E3: 0x6861, - 0xE8E4: 0x684E, - 0xE8E5: 0x6862, - 0xE8E6: 0x6844, - 0xE8E7: 0x6864, - 0xE8E8: 0x6883, - 0xE8E9: 0x681D, - 0xE8EA: 0x6855, - 0xE8EB: 0x6866, - 0xE8EC: 0x6841, - 0xE8ED: 0x6867, - 0xE8EE: 0x6840, - 0xE8EF: 0x683E, - 0xE8F0: 0x684A, - 0xE8F1: 0x6849, - 0xE8F2: 0x6829, - 0xE8F3: 0x68B5, - 0xE8F4: 0x688F, - 0xE8F5: 0x6874, - 0xE8F6: 0x6877, - 0xE8F7: 0x6893, - 0xE8F8: 0x686B, - 0xE8F9: 0x68C2, - 0xE8FA: 0x696E, - 0xE8FB: 0x68FC, - 0xE8FC: 0x691F, - 0xE8FD: 0x6920, - 0xE8FE: 0x68F9, - 0xE940: 0x9527, - 0xE941: 0x9533, - 0xE942: 0x953D, - 0xE943: 0x9543, - 0xE944: 0x9548, - 0xE945: 0x954B, - 0xE946: 0x9555, - 0xE947: 0x955A, - 0xE948: 0x9560, - 0xE949: 0x956E, - 0xE94A: 0x9574, - 0xE94B: 0x9575, - 0xE94C: 0x9577, - 0xE94D: 0x9578, - 0xE94E: 0x9579, - 0xE94F: 0x957A, - 0xE950: 0x957B, - 0xE951: 0x957C, - 0xE952: 0x957D, - 0xE953: 0x957E, - 0xE954: 0x9580, - 0xE955: 0x9581, - 0xE956: 0x9582, - 0xE957: 0x9583, - 0xE958: 0x9584, - 0xE959: 0x9585, - 0xE95A: 0x9586, - 0xE95B: 0x9587, - 0xE95C: 0x9588, - 0xE95D: 0x9589, - 0xE95E: 0x958A, - 0xE95F: 0x958B, - 0xE960: 0x958C, - 0xE961: 0x958D, - 0xE962: 0x958E, - 0xE963: 0x958F, - 0xE964: 0x9590, - 0xE965: 0x9591, - 0xE966: 0x9592, - 0xE967: 0x9593, - 0xE968: 0x9594, - 0xE969: 0x9595, - 0xE96A: 0x9596, - 0xE96B: 0x9597, - 0xE96C: 0x9598, - 0xE96D: 0x9599, - 0xE96E: 0x959A, - 0xE96F: 0x959B, - 0xE970: 0x959C, - 0xE971: 0x959D, - 0xE972: 0x959E, - 0xE973: 0x959F, - 0xE974: 0x95A0, - 0xE975: 0x95A1, - 0xE976: 0x95A2, - 0xE977: 0x95A3, - 0xE978: 0x95A4, - 0xE979: 0x95A5, - 0xE97A: 0x95A6, - 0xE97B: 0x95A7, - 0xE97C: 0x95A8, - 0xE97D: 0x95A9, - 0xE97E: 0x95AA, - 0xE980: 0x95AB, - 0xE981: 0x95AC, - 0xE982: 0x95AD, - 0xE983: 0x95AE, - 0xE984: 0x95AF, - 0xE985: 0x95B0, - 0xE986: 0x95B1, - 0xE987: 0x95B2, - 0xE988: 0x95B3, - 0xE989: 0x95B4, - 0xE98A: 0x95B5, - 0xE98B: 0x95B6, - 0xE98C: 0x95B7, - 0xE98D: 0x95B8, - 0xE98E: 0x95B9, - 0xE98F: 0x95BA, - 0xE990: 0x95BB, - 0xE991: 0x95BC, - 0xE992: 0x95BD, - 0xE993: 0x95BE, - 0xE994: 0x95BF, - 0xE995: 0x95C0, - 0xE996: 0x95C1, - 0xE997: 0x95C2, - 0xE998: 0x95C3, - 0xE999: 0x95C4, - 0xE99A: 0x95C5, - 0xE99B: 0x95C6, - 0xE99C: 0x95C7, - 0xE99D: 0x95C8, - 0xE99E: 0x95C9, - 0xE99F: 0x95CA, - 0xE9A0: 0x95CB, - 0xE9A1: 0x6924, - 0xE9A2: 0x68F0, - 0xE9A3: 0x690B, - 0xE9A4: 0x6901, - 0xE9A5: 0x6957, - 0xE9A6: 0x68E3, - 0xE9A7: 0x6910, - 0xE9A8: 0x6971, - 0xE9A9: 0x6939, - 0xE9AA: 0x6960, - 0xE9AB: 0x6942, - 0xE9AC: 0x695D, - 0xE9AD: 0x6984, - 0xE9AE: 0x696B, - 0xE9AF: 0x6980, - 0xE9B0: 0x6998, - 0xE9B1: 0x6978, - 0xE9B2: 0x6934, - 0xE9B3: 0x69CC, - 0xE9B4: 0x6987, - 0xE9B5: 0x6988, - 0xE9B6: 0x69CE, - 0xE9B7: 0x6989, - 0xE9B8: 0x6966, - 0xE9B9: 0x6963, - 0xE9BA: 0x6979, - 0xE9BB: 0x699B, - 0xE9BC: 0x69A7, - 0xE9BD: 0x69BB, - 0xE9BE: 0x69AB, - 0xE9BF: 0x69AD, - 0xE9C0: 0x69D4, - 0xE9C1: 0x69B1, - 0xE9C2: 0x69C1, - 0xE9C3: 0x69CA, - 0xE9C4: 0x69DF, - 0xE9C5: 0x6995, - 0xE9C6: 0x69E0, - 0xE9C7: 0x698D, - 0xE9C8: 0x69FF, - 0xE9C9: 0x6A2F, - 0xE9CA: 0x69ED, - 0xE9CB: 0x6A17, - 0xE9CC: 0x6A18, - 0xE9CD: 0x6A65, - 0xE9CE: 0x69F2, - 0xE9CF: 0x6A44, - 0xE9D0: 0x6A3E, - 0xE9D1: 0x6AA0, - 0xE9D2: 0x6A50, - 0xE9D3: 0x6A5B, - 0xE9D4: 0x6A35, - 0xE9D5: 0x6A8E, - 0xE9D6: 0x6A79, - 0xE9D7: 0x6A3D, - 0xE9D8: 0x6A28, - 0xE9D9: 0x6A58, - 0xE9DA: 0x6A7C, - 0xE9DB: 0x6A91, - 0xE9DC: 0x6A90, - 0xE9DD: 0x6AA9, - 0xE9DE: 0x6A97, - 0xE9DF: 0x6AAB, - 0xE9E0: 0x7337, - 0xE9E1: 0x7352, - 0xE9E2: 0x6B81, - 0xE9E3: 0x6B82, - 0xE9E4: 0x6B87, - 0xE9E5: 0x6B84, - 0xE9E6: 0x6B92, - 0xE9E7: 0x6B93, - 0xE9E8: 0x6B8D, - 0xE9E9: 0x6B9A, - 0xE9EA: 0x6B9B, - 0xE9EB: 0x6BA1, - 0xE9EC: 0x6BAA, - 0xE9ED: 0x8F6B, - 0xE9EE: 0x8F6D, - 0xE9EF: 0x8F71, - 0xE9F0: 0x8F72, - 0xE9F1: 0x8F73, - 0xE9F2: 0x8F75, - 0xE9F3: 0x8F76, - 0xE9F4: 0x8F78, - 0xE9F5: 0x8F77, - 0xE9F6: 0x8F79, - 0xE9F7: 0x8F7A, - 0xE9F8: 0x8F7C, - 0xE9F9: 0x8F7E, - 0xE9FA: 0x8F81, - 0xE9FB: 0x8F82, - 0xE9FC: 0x8F84, - 0xE9FD: 0x8F87, - 0xE9FE: 0x8F8B, - 0xEA40: 0x95CC, - 0xEA41: 0x95CD, - 0xEA42: 0x95CE, - 0xEA43: 0x95CF, - 0xEA44: 0x95D0, - 0xEA45: 0x95D1, - 0xEA46: 0x95D2, - 0xEA47: 0x95D3, - 0xEA48: 0x95D4, - 0xEA49: 0x95D5, - 0xEA4A: 0x95D6, - 0xEA4B: 0x95D7, - 0xEA4C: 0x95D8, - 0xEA4D: 0x95D9, - 0xEA4E: 0x95DA, - 0xEA4F: 0x95DB, - 0xEA50: 0x95DC, - 0xEA51: 0x95DD, - 0xEA52: 0x95DE, - 0xEA53: 0x95DF, - 0xEA54: 0x95E0, - 0xEA55: 0x95E1, - 0xEA56: 0x95E2, - 0xEA57: 0x95E3, - 0xEA58: 0x95E4, - 0xEA59: 0x95E5, - 0xEA5A: 0x95E6, - 0xEA5B: 0x95E7, - 0xEA5C: 0x95EC, - 0xEA5D: 0x95FF, - 0xEA5E: 0x9607, - 0xEA5F: 0x9613, - 0xEA60: 0x9618, - 0xEA61: 0x961B, - 0xEA62: 0x961E, - 0xEA63: 0x9620, - 0xEA64: 0x9623, - 0xEA65: 0x9624, - 0xEA66: 0x9625, - 0xEA67: 0x9626, - 0xEA68: 0x9627, - 0xEA69: 0x9628, - 0xEA6A: 0x9629, - 0xEA6B: 0x962B, - 0xEA6C: 0x962C, - 0xEA6D: 0x962D, - 0xEA6E: 0x962F, - 0xEA6F: 0x9630, - 0xEA70: 0x9637, - 0xEA71: 0x9638, - 0xEA72: 0x9639, - 0xEA73: 0x963A, - 0xEA74: 0x963E, - 0xEA75: 0x9641, - 0xEA76: 0x9643, - 0xEA77: 0x964A, - 0xEA78: 0x964E, - 0xEA79: 0x964F, - 0xEA7A: 0x9651, - 0xEA7B: 0x9652, - 0xEA7C: 0x9653, - 0xEA7D: 0x9656, - 0xEA7E: 0x9657, - 0xEA80: 0x9658, - 0xEA81: 0x9659, - 0xEA82: 0x965A, - 0xEA83: 0x965C, - 0xEA84: 0x965D, - 0xEA85: 0x965E, - 0xEA86: 0x9660, - 0xEA87: 0x9663, - 0xEA88: 0x9665, - 0xEA89: 0x9666, - 0xEA8A: 0x966B, - 0xEA8B: 0x966D, - 0xEA8C: 0x966E, - 0xEA8D: 0x966F, - 0xEA8E: 0x9670, - 0xEA8F: 0x9671, - 0xEA90: 0x9673, - 0xEA91: 0x9678, - 0xEA92: 0x9679, - 0xEA93: 0x967A, - 0xEA94: 0x967B, - 0xEA95: 0x967C, - 0xEA96: 0x967D, - 0xEA97: 0x967E, - 0xEA98: 0x967F, - 0xEA99: 0x9680, - 0xEA9A: 0x9681, - 0xEA9B: 0x9682, - 0xEA9C: 0x9683, - 0xEA9D: 0x9684, - 0xEA9E: 0x9687, - 0xEA9F: 0x9689, - 0xEAA0: 0x968A, - 0xEAA1: 0x8F8D, - 0xEAA2: 0x8F8E, - 0xEAA3: 0x8F8F, - 0xEAA4: 0x8F98, - 0xEAA5: 0x8F9A, - 0xEAA6: 0x8ECE, - 0xEAA7: 0x620B, - 0xEAA8: 0x6217, - 0xEAA9: 0x621B, - 0xEAAA: 0x621F, - 0xEAAB: 0x6222, - 0xEAAC: 0x6221, - 0xEAAD: 0x6225, - 0xEAAE: 0x6224, - 0xEAAF: 0x622C, - 0xEAB0: 0x81E7, - 0xEAB1: 0x74EF, - 0xEAB2: 0x74F4, - 0xEAB3: 0x74FF, - 0xEAB4: 0x750F, - 0xEAB5: 0x7511, - 0xEAB6: 0x7513, - 0xEAB7: 0x6534, - 0xEAB8: 0x65EE, - 0xEAB9: 0x65EF, - 0xEABA: 0x65F0, - 0xEABB: 0x660A, - 0xEABC: 0x6619, - 0xEABD: 0x6772, - 0xEABE: 0x6603, - 0xEABF: 0x6615, - 0xEAC0: 0x6600, - 0xEAC1: 0x7085, - 0xEAC2: 0x66F7, - 0xEAC3: 0x661D, - 0xEAC4: 0x6634, - 0xEAC5: 0x6631, - 0xEAC6: 0x6636, - 0xEAC7: 0x6635, - 0xEAC8: 0x8006, - 0xEAC9: 0x665F, - 0xEACA: 0x6654, - 0xEACB: 0x6641, - 0xEACC: 0x664F, - 0xEACD: 0x6656, - 0xEACE: 0x6661, - 0xEACF: 0x6657, - 0xEAD0: 0x6677, - 0xEAD1: 0x6684, - 0xEAD2: 0x668C, - 0xEAD3: 0x66A7, - 0xEAD4: 0x669D, - 0xEAD5: 0x66BE, - 0xEAD6: 0x66DB, - 0xEAD7: 0x66DC, - 0xEAD8: 0x66E6, - 0xEAD9: 0x66E9, - 0xEADA: 0x8D32, - 0xEADB: 0x8D33, - 0xEADC: 0x8D36, - 0xEADD: 0x8D3B, - 0xEADE: 0x8D3D, - 0xEADF: 0x8D40, - 0xEAE0: 0x8D45, - 0xEAE1: 0x8D46, - 0xEAE2: 0x8D48, - 0xEAE3: 0x8D49, - 0xEAE4: 0x8D47, - 0xEAE5: 0x8D4D, - 0xEAE6: 0x8D55, - 0xEAE7: 0x8D59, - 0xEAE8: 0x89C7, - 0xEAE9: 0x89CA, - 0xEAEA: 0x89CB, - 0xEAEB: 0x89CC, - 0xEAEC: 0x89CE, - 0xEAED: 0x89CF, - 0xEAEE: 0x89D0, - 0xEAEF: 0x89D1, - 0xEAF0: 0x726E, - 0xEAF1: 0x729F, - 0xEAF2: 0x725D, - 0xEAF3: 0x7266, - 0xEAF4: 0x726F, - 0xEAF5: 0x727E, - 0xEAF6: 0x727F, - 0xEAF7: 0x7284, - 0xEAF8: 0x728B, - 0xEAF9: 0x728D, - 0xEAFA: 0x728F, - 0xEAFB: 0x7292, - 0xEAFC: 0x6308, - 0xEAFD: 0x6332, - 0xEAFE: 0x63B0, - 0xEB40: 0x968C, - 0xEB41: 0x968E, - 0xEB42: 0x9691, - 0xEB43: 0x9692, - 0xEB44: 0x9693, - 0xEB45: 0x9695, - 0xEB46: 0x9696, - 0xEB47: 0x969A, - 0xEB48: 0x969B, - 0xEB49: 0x969D, - 0xEB4A: 0x969E, - 0xEB4B: 0x969F, - 0xEB4C: 0x96A0, - 0xEB4D: 0x96A1, - 0xEB4E: 0x96A2, - 0xEB4F: 0x96A3, - 0xEB50: 0x96A4, - 0xEB51: 0x96A5, - 0xEB52: 0x96A6, - 0xEB53: 0x96A8, - 0xEB54: 0x96A9, - 0xEB55: 0x96AA, - 0xEB56: 0x96AB, - 0xEB57: 0x96AC, - 0xEB58: 0x96AD, - 0xEB59: 0x96AE, - 0xEB5A: 0x96AF, - 0xEB5B: 0x96B1, - 0xEB5C: 0x96B2, - 0xEB5D: 0x96B4, - 0xEB5E: 0x96B5, - 0xEB5F: 0x96B7, - 0xEB60: 0x96B8, - 0xEB61: 0x96BA, - 0xEB62: 0x96BB, - 0xEB63: 0x96BF, - 0xEB64: 0x96C2, - 0xEB65: 0x96C3, - 0xEB66: 0x96C8, - 0xEB67: 0x96CA, - 0xEB68: 0x96CB, - 0xEB69: 0x96D0, - 0xEB6A: 0x96D1, - 0xEB6B: 0x96D3, - 0xEB6C: 0x96D4, - 0xEB6D: 0x96D6, - 0xEB6E: 0x96D7, - 0xEB6F: 0x96D8, - 0xEB70: 0x96D9, - 0xEB71: 0x96DA, - 0xEB72: 0x96DB, - 0xEB73: 0x96DC, - 0xEB74: 0x96DD, - 0xEB75: 0x96DE, - 0xEB76: 0x96DF, - 0xEB77: 0x96E1, - 0xEB78: 0x96E2, - 0xEB79: 0x96E3, - 0xEB7A: 0x96E4, - 0xEB7B: 0x96E5, - 0xEB7C: 0x96E6, - 0xEB7D: 0x96E7, - 0xEB7E: 0x96EB, - 0xEB80: 0x96EC, - 0xEB81: 0x96ED, - 0xEB82: 0x96EE, - 0xEB83: 0x96F0, - 0xEB84: 0x96F1, - 0xEB85: 0x96F2, - 0xEB86: 0x96F4, - 0xEB87: 0x96F5, - 0xEB88: 0x96F8, - 0xEB89: 0x96FA, - 0xEB8A: 0x96FB, - 0xEB8B: 0x96FC, - 0xEB8C: 0x96FD, - 0xEB8D: 0x96FF, - 0xEB8E: 0x9702, - 0xEB8F: 0x9703, - 0xEB90: 0x9705, - 0xEB91: 0x970A, - 0xEB92: 0x970B, - 0xEB93: 0x970C, - 0xEB94: 0x9710, - 0xEB95: 0x9711, - 0xEB96: 0x9712, - 0xEB97: 0x9714, - 0xEB98: 0x9715, - 0xEB99: 0x9717, - 0xEB9A: 0x9718, - 0xEB9B: 0x9719, - 0xEB9C: 0x971A, - 0xEB9D: 0x971B, - 0xEB9E: 0x971D, - 0xEB9F: 0x971F, - 0xEBA0: 0x9720, - 0xEBA1: 0x643F, - 0xEBA2: 0x64D8, - 0xEBA3: 0x8004, - 0xEBA4: 0x6BEA, - 0xEBA5: 0x6BF3, - 0xEBA6: 0x6BFD, - 0xEBA7: 0x6BF5, - 0xEBA8: 0x6BF9, - 0xEBA9: 0x6C05, - 0xEBAA: 0x6C07, - 0xEBAB: 0x6C06, - 0xEBAC: 0x6C0D, - 0xEBAD: 0x6C15, - 0xEBAE: 0x6C18, - 0xEBAF: 0x6C19, - 0xEBB0: 0x6C1A, - 0xEBB1: 0x6C21, - 0xEBB2: 0x6C29, - 0xEBB3: 0x6C24, - 0xEBB4: 0x6C2A, - 0xEBB5: 0x6C32, - 0xEBB6: 0x6535, - 0xEBB7: 0x6555, - 0xEBB8: 0x656B, - 0xEBB9: 0x724D, - 0xEBBA: 0x7252, - 0xEBBB: 0x7256, - 0xEBBC: 0x7230, - 0xEBBD: 0x8662, - 0xEBBE: 0x5216, - 0xEBBF: 0x809F, - 0xEBC0: 0x809C, - 0xEBC1: 0x8093, - 0xEBC2: 0x80BC, - 0xEBC3: 0x670A, - 0xEBC4: 0x80BD, - 0xEBC5: 0x80B1, - 0xEBC6: 0x80AB, - 0xEBC7: 0x80AD, - 0xEBC8: 0x80B4, - 0xEBC9: 0x80B7, - 0xEBCA: 0x80E7, - 0xEBCB: 0x80E8, - 0xEBCC: 0x80E9, - 0xEBCD: 0x80EA, - 0xEBCE: 0x80DB, - 0xEBCF: 0x80C2, - 0xEBD0: 0x80C4, - 0xEBD1: 0x80D9, - 0xEBD2: 0x80CD, - 0xEBD3: 0x80D7, - 0xEBD4: 0x6710, - 0xEBD5: 0x80DD, - 0xEBD6: 0x80EB, - 0xEBD7: 0x80F1, - 0xEBD8: 0x80F4, - 0xEBD9: 0x80ED, - 0xEBDA: 0x810D, - 0xEBDB: 0x810E, - 0xEBDC: 0x80F2, - 0xEBDD: 0x80FC, - 0xEBDE: 0x6715, - 0xEBDF: 0x8112, - 0xEBE0: 0x8C5A, - 0xEBE1: 0x8136, - 0xEBE2: 0x811E, - 0xEBE3: 0x812C, - 0xEBE4: 0x8118, - 0xEBE5: 0x8132, - 0xEBE6: 0x8148, - 0xEBE7: 0x814C, - 0xEBE8: 0x8153, - 0xEBE9: 0x8174, - 0xEBEA: 0x8159, - 0xEBEB: 0x815A, - 0xEBEC: 0x8171, - 0xEBED: 0x8160, - 0xEBEE: 0x8169, - 0xEBEF: 0x817C, - 0xEBF0: 0x817D, - 0xEBF1: 0x816D, - 0xEBF2: 0x8167, - 0xEBF3: 0x584D, - 0xEBF4: 0x5AB5, - 0xEBF5: 0x8188, - 0xEBF6: 0x8182, - 0xEBF7: 0x8191, - 0xEBF8: 0x6ED5, - 0xEBF9: 0x81A3, - 0xEBFA: 0x81AA, - 0xEBFB: 0x81CC, - 0xEBFC: 0x6726, - 0xEBFD: 0x81CA, - 0xEBFE: 0x81BB, - 0xEC40: 0x9721, - 0xEC41: 0x9722, - 0xEC42: 0x9723, - 0xEC43: 0x9724, - 0xEC44: 0x9725, - 0xEC45: 0x9726, - 0xEC46: 0x9727, - 0xEC47: 0x9728, - 0xEC48: 0x9729, - 0xEC49: 0x972B, - 0xEC4A: 0x972C, - 0xEC4B: 0x972E, - 0xEC4C: 0x972F, - 0xEC4D: 0x9731, - 0xEC4E: 0x9733, - 0xEC4F: 0x9734, - 0xEC50: 0x9735, - 0xEC51: 0x9736, - 0xEC52: 0x9737, - 0xEC53: 0x973A, - 0xEC54: 0x973B, - 0xEC55: 0x973C, - 0xEC56: 0x973D, - 0xEC57: 0x973F, - 0xEC58: 0x9740, - 0xEC59: 0x9741, - 0xEC5A: 0x9742, - 0xEC5B: 0x9743, - 0xEC5C: 0x9744, - 0xEC5D: 0x9745, - 0xEC5E: 0x9746, - 0xEC5F: 0x9747, - 0xEC60: 0x9748, - 0xEC61: 0x9749, - 0xEC62: 0x974A, - 0xEC63: 0x974B, - 0xEC64: 0x974C, - 0xEC65: 0x974D, - 0xEC66: 0x974E, - 0xEC67: 0x974F, - 0xEC68: 0x9750, - 0xEC69: 0x9751, - 0xEC6A: 0x9754, - 0xEC6B: 0x9755, - 0xEC6C: 0x9757, - 0xEC6D: 0x9758, - 0xEC6E: 0x975A, - 0xEC6F: 0x975C, - 0xEC70: 0x975D, - 0xEC71: 0x975F, - 0xEC72: 0x9763, - 0xEC73: 0x9764, - 0xEC74: 0x9766, - 0xEC75: 0x9767, - 0xEC76: 0x9768, - 0xEC77: 0x976A, - 0xEC78: 0x976B, - 0xEC79: 0x976C, - 0xEC7A: 0x976D, - 0xEC7B: 0x976E, - 0xEC7C: 0x976F, - 0xEC7D: 0x9770, - 0xEC7E: 0x9771, - 0xEC80: 0x9772, - 0xEC81: 0x9775, - 0xEC82: 0x9777, - 0xEC83: 0x9778, - 0xEC84: 0x9779, - 0xEC85: 0x977A, - 0xEC86: 0x977B, - 0xEC87: 0x977D, - 0xEC88: 0x977E, - 0xEC89: 0x977F, - 0xEC8A: 0x9780, - 0xEC8B: 0x9781, - 0xEC8C: 0x9782, - 0xEC8D: 0x9783, - 0xEC8E: 0x9784, - 0xEC8F: 0x9786, - 0xEC90: 0x9787, - 0xEC91: 0x9788, - 0xEC92: 0x9789, - 0xEC93: 0x978A, - 0xEC94: 0x978C, - 0xEC95: 0x978E, - 0xEC96: 0x978F, - 0xEC97: 0x9790, - 0xEC98: 0x9793, - 0xEC99: 0x9795, - 0xEC9A: 0x9796, - 0xEC9B: 0x9797, - 0xEC9C: 0x9799, - 0xEC9D: 0x979A, - 0xEC9E: 0x979B, - 0xEC9F: 0x979C, - 0xECA0: 0x979D, - 0xECA1: 0x81C1, - 0xECA2: 0x81A6, - 0xECA3: 0x6B24, - 0xECA4: 0x6B37, - 0xECA5: 0x6B39, - 0xECA6: 0x6B43, - 0xECA7: 0x6B46, - 0xECA8: 0x6B59, - 0xECA9: 0x98D1, - 0xECAA: 0x98D2, - 0xECAB: 0x98D3, - 0xECAC: 0x98D5, - 0xECAD: 0x98D9, - 0xECAE: 0x98DA, - 0xECAF: 0x6BB3, - 0xECB0: 0x5F40, - 0xECB1: 0x6BC2, - 0xECB2: 0x89F3, - 0xECB3: 0x6590, - 0xECB4: 0x9F51, - 0xECB5: 0x6593, - 0xECB6: 0x65BC, - 0xECB7: 0x65C6, - 0xECB8: 0x65C4, - 0xECB9: 0x65C3, - 0xECBA: 0x65CC, - 0xECBB: 0x65CE, - 0xECBC: 0x65D2, - 0xECBD: 0x65D6, - 0xECBE: 0x7080, - 0xECBF: 0x709C, - 0xECC0: 0x7096, - 0xECC1: 0x709D, - 0xECC2: 0x70BB, - 0xECC3: 0x70C0, - 0xECC4: 0x70B7, - 0xECC5: 0x70AB, - 0xECC6: 0x70B1, - 0xECC7: 0x70E8, - 0xECC8: 0x70CA, - 0xECC9: 0x7110, - 0xECCA: 0x7113, - 0xECCB: 0x7116, - 0xECCC: 0x712F, - 0xECCD: 0x7131, - 0xECCE: 0x7173, - 0xECCF: 0x715C, - 0xECD0: 0x7168, - 0xECD1: 0x7145, - 0xECD2: 0x7172, - 0xECD3: 0x714A, - 0xECD4: 0x7178, - 0xECD5: 0x717A, - 0xECD6: 0x7198, - 0xECD7: 0x71B3, - 0xECD8: 0x71B5, - 0xECD9: 0x71A8, - 0xECDA: 0x71A0, - 0xECDB: 0x71E0, - 0xECDC: 0x71D4, - 0xECDD: 0x71E7, - 0xECDE: 0x71F9, - 0xECDF: 0x721D, - 0xECE0: 0x7228, - 0xECE1: 0x706C, - 0xECE2: 0x7118, - 0xECE3: 0x7166, - 0xECE4: 0x71B9, - 0xECE5: 0x623E, - 0xECE6: 0x623D, - 0xECE7: 0x6243, - 0xECE8: 0x6248, - 0xECE9: 0x6249, - 0xECEA: 0x793B, - 0xECEB: 0x7940, - 0xECEC: 0x7946, - 0xECED: 0x7949, - 0xECEE: 0x795B, - 0xECEF: 0x795C, - 0xECF0: 0x7953, - 0xECF1: 0x795A, - 0xECF2: 0x7962, - 0xECF3: 0x7957, - 0xECF4: 0x7960, - 0xECF5: 0x796F, - 0xECF6: 0x7967, - 0xECF7: 0x797A, - 0xECF8: 0x7985, - 0xECF9: 0x798A, - 0xECFA: 0x799A, - 0xECFB: 0x79A7, - 0xECFC: 0x79B3, - 0xECFD: 0x5FD1, - 0xECFE: 0x5FD0, - 0xED40: 0x979E, - 0xED41: 0x979F, - 0xED42: 0x97A1, - 0xED43: 0x97A2, - 0xED44: 0x97A4, - 0xED45: 0x97A5, - 0xED46: 0x97A6, - 0xED47: 0x97A7, - 0xED48: 0x97A8, - 0xED49: 0x97A9, - 0xED4A: 0x97AA, - 0xED4B: 0x97AC, - 0xED4C: 0x97AE, - 0xED4D: 0x97B0, - 0xED4E: 0x97B1, - 0xED4F: 0x97B3, - 0xED50: 0x97B5, - 0xED51: 0x97B6, - 0xED52: 0x97B7, - 0xED53: 0x97B8, - 0xED54: 0x97B9, - 0xED55: 0x97BA, - 0xED56: 0x97BB, - 0xED57: 0x97BC, - 0xED58: 0x97BD, - 0xED59: 0x97BE, - 0xED5A: 0x97BF, - 0xED5B: 0x97C0, - 0xED5C: 0x97C1, - 0xED5D: 0x97C2, - 0xED5E: 0x97C3, - 0xED5F: 0x97C4, - 0xED60: 0x97C5, - 0xED61: 0x97C6, - 0xED62: 0x97C7, - 0xED63: 0x97C8, - 0xED64: 0x97C9, - 0xED65: 0x97CA, - 0xED66: 0x97CB, - 0xED67: 0x97CC, - 0xED68: 0x97CD, - 0xED69: 0x97CE, - 0xED6A: 0x97CF, - 0xED6B: 0x97D0, - 0xED6C: 0x97D1, - 0xED6D: 0x97D2, - 0xED6E: 0x97D3, - 0xED6F: 0x97D4, - 0xED70: 0x97D5, - 0xED71: 0x97D6, - 0xED72: 0x97D7, - 0xED73: 0x97D8, - 0xED74: 0x97D9, - 0xED75: 0x97DA, - 0xED76: 0x97DB, - 0xED77: 0x97DC, - 0xED78: 0x97DD, - 0xED79: 0x97DE, - 0xED7A: 0x97DF, - 0xED7B: 0x97E0, - 0xED7C: 0x97E1, - 0xED7D: 0x97E2, - 0xED7E: 0x97E3, - 0xED80: 0x97E4, - 0xED81: 0x97E5, - 0xED82: 0x97E8, - 0xED83: 0x97EE, - 0xED84: 0x97EF, - 0xED85: 0x97F0, - 0xED86: 0x97F1, - 0xED87: 0x97F2, - 0xED88: 0x97F4, - 0xED89: 0x97F7, - 0xED8A: 0x97F8, - 0xED8B: 0x97F9, - 0xED8C: 0x97FA, - 0xED8D: 0x97FB, - 0xED8E: 0x97FC, - 0xED8F: 0x97FD, - 0xED90: 0x97FE, - 0xED91: 0x97FF, - 0xED92: 0x9800, - 0xED93: 0x9801, - 0xED94: 0x9802, - 0xED95: 0x9803, - 0xED96: 0x9804, - 0xED97: 0x9805, - 0xED98: 0x9806, - 0xED99: 0x9807, - 0xED9A: 0x9808, - 0xED9B: 0x9809, - 0xED9C: 0x980A, - 0xED9D: 0x980B, - 0xED9E: 0x980C, - 0xED9F: 0x980D, - 0xEDA0: 0x980E, - 0xEDA1: 0x603C, - 0xEDA2: 0x605D, - 0xEDA3: 0x605A, - 0xEDA4: 0x6067, - 0xEDA5: 0x6041, - 0xEDA6: 0x6059, - 0xEDA7: 0x6063, - 0xEDA8: 0x60AB, - 0xEDA9: 0x6106, - 0xEDAA: 0x610D, - 0xEDAB: 0x615D, - 0xEDAC: 0x61A9, - 0xEDAD: 0x619D, - 0xEDAE: 0x61CB, - 0xEDAF: 0x61D1, - 0xEDB0: 0x6206, - 0xEDB1: 0x8080, - 0xEDB2: 0x807F, - 0xEDB3: 0x6C93, - 0xEDB4: 0x6CF6, - 0xEDB5: 0x6DFC, - 0xEDB6: 0x77F6, - 0xEDB7: 0x77F8, - 0xEDB8: 0x7800, - 0xEDB9: 0x7809, - 0xEDBA: 0x7817, - 0xEDBB: 0x7818, - 0xEDBC: 0x7811, - 0xEDBD: 0x65AB, - 0xEDBE: 0x782D, - 0xEDBF: 0x781C, - 0xEDC0: 0x781D, - 0xEDC1: 0x7839, - 0xEDC2: 0x783A, - 0xEDC3: 0x783B, - 0xEDC4: 0x781F, - 0xEDC5: 0x783C, - 0xEDC6: 0x7825, - 0xEDC7: 0x782C, - 0xEDC8: 0x7823, - 0xEDC9: 0x7829, - 0xEDCA: 0x784E, - 0xEDCB: 0x786D, - 0xEDCC: 0x7856, - 0xEDCD: 0x7857, - 0xEDCE: 0x7826, - 0xEDCF: 0x7850, - 0xEDD0: 0x7847, - 0xEDD1: 0x784C, - 0xEDD2: 0x786A, - 0xEDD3: 0x789B, - 0xEDD4: 0x7893, - 0xEDD5: 0x789A, - 0xEDD6: 0x7887, - 0xEDD7: 0x789C, - 0xEDD8: 0x78A1, - 0xEDD9: 0x78A3, - 0xEDDA: 0x78B2, - 0xEDDB: 0x78B9, - 0xEDDC: 0x78A5, - 0xEDDD: 0x78D4, - 0xEDDE: 0x78D9, - 0xEDDF: 0x78C9, - 0xEDE0: 0x78EC, - 0xEDE1: 0x78F2, - 0xEDE2: 0x7905, - 0xEDE3: 0x78F4, - 0xEDE4: 0x7913, - 0xEDE5: 0x7924, - 0xEDE6: 0x791E, - 0xEDE7: 0x7934, - 0xEDE8: 0x9F9B, - 0xEDE9: 0x9EF9, - 0xEDEA: 0x9EFB, - 0xEDEB: 0x9EFC, - 0xEDEC: 0x76F1, - 0xEDED: 0x7704, - 0xEDEE: 0x770D, - 0xEDEF: 0x76F9, - 0xEDF0: 0x7707, - 0xEDF1: 0x7708, - 0xEDF2: 0x771A, - 0xEDF3: 0x7722, - 0xEDF4: 0x7719, - 0xEDF5: 0x772D, - 0xEDF6: 0x7726, - 0xEDF7: 0x7735, - 0xEDF8: 0x7738, - 0xEDF9: 0x7750, - 0xEDFA: 0x7751, - 0xEDFB: 0x7747, - 0xEDFC: 0x7743, - 0xEDFD: 0x775A, - 0xEDFE: 0x7768, - 0xEE40: 0x980F, - 0xEE41: 0x9810, - 0xEE42: 0x9811, - 0xEE43: 0x9812, - 0xEE44: 0x9813, - 0xEE45: 0x9814, - 0xEE46: 0x9815, - 0xEE47: 0x9816, - 0xEE48: 0x9817, - 0xEE49: 0x9818, - 0xEE4A: 0x9819, - 0xEE4B: 0x981A, - 0xEE4C: 0x981B, - 0xEE4D: 0x981C, - 0xEE4E: 0x981D, - 0xEE4F: 0x981E, - 0xEE50: 0x981F, - 0xEE51: 0x9820, - 0xEE52: 0x9821, - 0xEE53: 0x9822, - 0xEE54: 0x9823, - 0xEE55: 0x9824, - 0xEE56: 0x9825, - 0xEE57: 0x9826, - 0xEE58: 0x9827, - 0xEE59: 0x9828, - 0xEE5A: 0x9829, - 0xEE5B: 0x982A, - 0xEE5C: 0x982B, - 0xEE5D: 0x982C, - 0xEE5E: 0x982D, - 0xEE5F: 0x982E, - 0xEE60: 0x982F, - 0xEE61: 0x9830, - 0xEE62: 0x9831, - 0xEE63: 0x9832, - 0xEE64: 0x9833, - 0xEE65: 0x9834, - 0xEE66: 0x9835, - 0xEE67: 0x9836, - 0xEE68: 0x9837, - 0xEE69: 0x9838, - 0xEE6A: 0x9839, - 0xEE6B: 0x983A, - 0xEE6C: 0x983B, - 0xEE6D: 0x983C, - 0xEE6E: 0x983D, - 0xEE6F: 0x983E, - 0xEE70: 0x983F, - 0xEE71: 0x9840, - 0xEE72: 0x9841, - 0xEE73: 0x9842, - 0xEE74: 0x9843, - 0xEE75: 0x9844, - 0xEE76: 0x9845, - 0xEE77: 0x9846, - 0xEE78: 0x9847, - 0xEE79: 0x9848, - 0xEE7A: 0x9849, - 0xEE7B: 0x984A, - 0xEE7C: 0x984B, - 0xEE7D: 0x984C, - 0xEE7E: 0x984D, - 0xEE80: 0x984E, - 0xEE81: 0x984F, - 0xEE82: 0x9850, - 0xEE83: 0x9851, - 0xEE84: 0x9852, - 0xEE85: 0x9853, - 0xEE86: 0x9854, - 0xEE87: 0x9855, - 0xEE88: 0x9856, - 0xEE89: 0x9857, - 0xEE8A: 0x9858, - 0xEE8B: 0x9859, - 0xEE8C: 0x985A, - 0xEE8D: 0x985B, - 0xEE8E: 0x985C, - 0xEE8F: 0x985D, - 0xEE90: 0x985E, - 0xEE91: 0x985F, - 0xEE92: 0x9860, - 0xEE93: 0x9861, - 0xEE94: 0x9862, - 0xEE95: 0x9863, - 0xEE96: 0x9864, - 0xEE97: 0x9865, - 0xEE98: 0x9866, - 0xEE99: 0x9867, - 0xEE9A: 0x9868, - 0xEE9B: 0x9869, - 0xEE9C: 0x986A, - 0xEE9D: 0x986B, - 0xEE9E: 0x986C, - 0xEE9F: 0x986D, - 0xEEA0: 0x986E, - 0xEEA1: 0x7762, - 0xEEA2: 0x7765, - 0xEEA3: 0x777F, - 0xEEA4: 0x778D, - 0xEEA5: 0x777D, - 0xEEA6: 0x7780, - 0xEEA7: 0x778C, - 0xEEA8: 0x7791, - 0xEEA9: 0x779F, - 0xEEAA: 0x77A0, - 0xEEAB: 0x77B0, - 0xEEAC: 0x77B5, - 0xEEAD: 0x77BD, - 0xEEAE: 0x753A, - 0xEEAF: 0x7540, - 0xEEB0: 0x754E, - 0xEEB1: 0x754B, - 0xEEB2: 0x7548, - 0xEEB3: 0x755B, - 0xEEB4: 0x7572, - 0xEEB5: 0x7579, - 0xEEB6: 0x7583, - 0xEEB7: 0x7F58, - 0xEEB8: 0x7F61, - 0xEEB9: 0x7F5F, - 0xEEBA: 0x8A48, - 0xEEBB: 0x7F68, - 0xEEBC: 0x7F74, - 0xEEBD: 0x7F71, - 0xEEBE: 0x7F79, - 0xEEBF: 0x7F81, - 0xEEC0: 0x7F7E, - 0xEEC1: 0x76CD, - 0xEEC2: 0x76E5, - 0xEEC3: 0x8832, - 0xEEC4: 0x9485, - 0xEEC5: 0x9486, - 0xEEC6: 0x9487, - 0xEEC7: 0x948B, - 0xEEC8: 0x948A, - 0xEEC9: 0x948C, - 0xEECA: 0x948D, - 0xEECB: 0x948F, - 0xEECC: 0x9490, - 0xEECD: 0x9494, - 0xEECE: 0x9497, - 0xEECF: 0x9495, - 0xEED0: 0x949A, - 0xEED1: 0x949B, - 0xEED2: 0x949C, - 0xEED3: 0x94A3, - 0xEED4: 0x94A4, - 0xEED5: 0x94AB, - 0xEED6: 0x94AA, - 0xEED7: 0x94AD, - 0xEED8: 0x94AC, - 0xEED9: 0x94AF, - 0xEEDA: 0x94B0, - 0xEEDB: 0x94B2, - 0xEEDC: 0x94B4, - 0xEEDD: 0x94B6, - 0xEEDE: 0x94B7, - 0xEEDF: 0x94B8, - 0xEEE0: 0x94B9, - 0xEEE1: 0x94BA, - 0xEEE2: 0x94BC, - 0xEEE3: 0x94BD, - 0xEEE4: 0x94BF, - 0xEEE5: 0x94C4, - 0xEEE6: 0x94C8, - 0xEEE7: 0x94C9, - 0xEEE8: 0x94CA, - 0xEEE9: 0x94CB, - 0xEEEA: 0x94CC, - 0xEEEB: 0x94CD, - 0xEEEC: 0x94CE, - 0xEEED: 0x94D0, - 0xEEEE: 0x94D1, - 0xEEEF: 0x94D2, - 0xEEF0: 0x94D5, - 0xEEF1: 0x94D6, - 0xEEF2: 0x94D7, - 0xEEF3: 0x94D9, - 0xEEF4: 0x94D8, - 0xEEF5: 0x94DB, - 0xEEF6: 0x94DE, - 0xEEF7: 0x94DF, - 0xEEF8: 0x94E0, - 0xEEF9: 0x94E2, - 0xEEFA: 0x94E4, - 0xEEFB: 0x94E5, - 0xEEFC: 0x94E7, - 0xEEFD: 0x94E8, - 0xEEFE: 0x94EA, - 0xEF40: 0x986F, - 0xEF41: 0x9870, - 0xEF42: 0x9871, - 0xEF43: 0x9872, - 0xEF44: 0x9873, - 0xEF45: 0x9874, - 0xEF46: 0x988B, - 0xEF47: 0x988E, - 0xEF48: 0x9892, - 0xEF49: 0x9895, - 0xEF4A: 0x9899, - 0xEF4B: 0x98A3, - 0xEF4C: 0x98A8, - 0xEF4D: 0x98A9, - 0xEF4E: 0x98AA, - 0xEF4F: 0x98AB, - 0xEF50: 0x98AC, - 0xEF51: 0x98AD, - 0xEF52: 0x98AE, - 0xEF53: 0x98AF, - 0xEF54: 0x98B0, - 0xEF55: 0x98B1, - 0xEF56: 0x98B2, - 0xEF57: 0x98B3, - 0xEF58: 0x98B4, - 0xEF59: 0x98B5, - 0xEF5A: 0x98B6, - 0xEF5B: 0x98B7, - 0xEF5C: 0x98B8, - 0xEF5D: 0x98B9, - 0xEF5E: 0x98BA, - 0xEF5F: 0x98BB, - 0xEF60: 0x98BC, - 0xEF61: 0x98BD, - 0xEF62: 0x98BE, - 0xEF63: 0x98BF, - 0xEF64: 0x98C0, - 0xEF65: 0x98C1, - 0xEF66: 0x98C2, - 0xEF67: 0x98C3, - 0xEF68: 0x98C4, - 0xEF69: 0x98C5, - 0xEF6A: 0x98C6, - 0xEF6B: 0x98C7, - 0xEF6C: 0x98C8, - 0xEF6D: 0x98C9, - 0xEF6E: 0x98CA, - 0xEF6F: 0x98CB, - 0xEF70: 0x98CC, - 0xEF71: 0x98CD, - 0xEF72: 0x98CF, - 0xEF73: 0x98D0, - 0xEF74: 0x98D4, - 0xEF75: 0x98D6, - 0xEF76: 0x98D7, - 0xEF77: 0x98DB, - 0xEF78: 0x98DC, - 0xEF79: 0x98DD, - 0xEF7A: 0x98E0, - 0xEF7B: 0x98E1, - 0xEF7C: 0x98E2, - 0xEF7D: 0x98E3, - 0xEF7E: 0x98E4, - 0xEF80: 0x98E5, - 0xEF81: 0x98E6, - 0xEF82: 0x98E9, - 0xEF83: 0x98EA, - 0xEF84: 0x98EB, - 0xEF85: 0x98EC, - 0xEF86: 0x98ED, - 0xEF87: 0x98EE, - 0xEF88: 0x98EF, - 0xEF89: 0x98F0, - 0xEF8A: 0x98F1, - 0xEF8B: 0x98F2, - 0xEF8C: 0x98F3, - 0xEF8D: 0x98F4, - 0xEF8E: 0x98F5, - 0xEF8F: 0x98F6, - 0xEF90: 0x98F7, - 0xEF91: 0x98F8, - 0xEF92: 0x98F9, - 0xEF93: 0x98FA, - 0xEF94: 0x98FB, - 0xEF95: 0x98FC, - 0xEF96: 0x98FD, - 0xEF97: 0x98FE, - 0xEF98: 0x98FF, - 0xEF99: 0x9900, - 0xEF9A: 0x9901, - 0xEF9B: 0x9902, - 0xEF9C: 0x9903, - 0xEF9D: 0x9904, - 0xEF9E: 0x9905, - 0xEF9F: 0x9906, - 0xEFA0: 0x9907, - 0xEFA1: 0x94E9, - 0xEFA2: 0x94EB, - 0xEFA3: 0x94EE, - 0xEFA4: 0x94EF, - 0xEFA5: 0x94F3, - 0xEFA6: 0x94F4, - 0xEFA7: 0x94F5, - 0xEFA8: 0x94F7, - 0xEFA9: 0x94F9, - 0xEFAA: 0x94FC, - 0xEFAB: 0x94FD, - 0xEFAC: 0x94FF, - 0xEFAD: 0x9503, - 0xEFAE: 0x9502, - 0xEFAF: 0x9506, - 0xEFB0: 0x9507, - 0xEFB1: 0x9509, - 0xEFB2: 0x950A, - 0xEFB3: 0x950D, - 0xEFB4: 0x950E, - 0xEFB5: 0x950F, - 0xEFB6: 0x9512, - 0xEFB7: 0x9513, - 0xEFB8: 0x9514, - 0xEFB9: 0x9515, - 0xEFBA: 0x9516, - 0xEFBB: 0x9518, - 0xEFBC: 0x951B, - 0xEFBD: 0x951D, - 0xEFBE: 0x951E, - 0xEFBF: 0x951F, - 0xEFC0: 0x9522, - 0xEFC1: 0x952A, - 0xEFC2: 0x952B, - 0xEFC3: 0x9529, - 0xEFC4: 0x952C, - 0xEFC5: 0x9531, - 0xEFC6: 0x9532, - 0xEFC7: 0x9534, - 0xEFC8: 0x9536, - 0xEFC9: 0x9537, - 0xEFCA: 0x9538, - 0xEFCB: 0x953C, - 0xEFCC: 0x953E, - 0xEFCD: 0x953F, - 0xEFCE: 0x9542, - 0xEFCF: 0x9535, - 0xEFD0: 0x9544, - 0xEFD1: 0x9545, - 0xEFD2: 0x9546, - 0xEFD3: 0x9549, - 0xEFD4: 0x954C, - 0xEFD5: 0x954E, - 0xEFD6: 0x954F, - 0xEFD7: 0x9552, - 0xEFD8: 0x9553, - 0xEFD9: 0x9554, - 0xEFDA: 0x9556, - 0xEFDB: 0x9557, - 0xEFDC: 0x9558, - 0xEFDD: 0x9559, - 0xEFDE: 0x955B, - 0xEFDF: 0x955E, - 0xEFE0: 0x955F, - 0xEFE1: 0x955D, - 0xEFE2: 0x9561, - 0xEFE3: 0x9562, - 0xEFE4: 0x9564, - 0xEFE5: 0x9565, - 0xEFE6: 0x9566, - 0xEFE7: 0x9567, - 0xEFE8: 0x9568, - 0xEFE9: 0x9569, - 0xEFEA: 0x956A, - 0xEFEB: 0x956B, - 0xEFEC: 0x956C, - 0xEFED: 0x956F, - 0xEFEE: 0x9571, - 0xEFEF: 0x9572, - 0xEFF0: 0x9573, - 0xEFF1: 0x953A, - 0xEFF2: 0x77E7, - 0xEFF3: 0x77EC, - 0xEFF4: 0x96C9, - 0xEFF5: 0x79D5, - 0xEFF6: 0x79ED, - 0xEFF7: 0x79E3, - 0xEFF8: 0x79EB, - 0xEFF9: 0x7A06, - 0xEFFA: 0x5D47, - 0xEFFB: 0x7A03, - 0xEFFC: 0x7A02, - 0xEFFD: 0x7A1E, - 0xEFFE: 0x7A14, - 0xF040: 0x9908, - 0xF041: 0x9909, - 0xF042: 0x990A, - 0xF043: 0x990B, - 0xF044: 0x990C, - 0xF045: 0x990E, - 0xF046: 0x990F, - 0xF047: 0x9911, - 0xF048: 0x9912, - 0xF049: 0x9913, - 0xF04A: 0x9914, - 0xF04B: 0x9915, - 0xF04C: 0x9916, - 0xF04D: 0x9917, - 0xF04E: 0x9918, - 0xF04F: 0x9919, - 0xF050: 0x991A, - 0xF051: 0x991B, - 0xF052: 0x991C, - 0xF053: 0x991D, - 0xF054: 0x991E, - 0xF055: 0x991F, - 0xF056: 0x9920, - 0xF057: 0x9921, - 0xF058: 0x9922, - 0xF059: 0x9923, - 0xF05A: 0x9924, - 0xF05B: 0x9925, - 0xF05C: 0x9926, - 0xF05D: 0x9927, - 0xF05E: 0x9928, - 0xF05F: 0x9929, - 0xF060: 0x992A, - 0xF061: 0x992B, - 0xF062: 0x992C, - 0xF063: 0x992D, - 0xF064: 0x992F, - 0xF065: 0x9930, - 0xF066: 0x9931, - 0xF067: 0x9932, - 0xF068: 0x9933, - 0xF069: 0x9934, - 0xF06A: 0x9935, - 0xF06B: 0x9936, - 0xF06C: 0x9937, - 0xF06D: 0x9938, - 0xF06E: 0x9939, - 0xF06F: 0x993A, - 0xF070: 0x993B, - 0xF071: 0x993C, - 0xF072: 0x993D, - 0xF073: 0x993E, - 0xF074: 0x993F, - 0xF075: 0x9940, - 0xF076: 0x9941, - 0xF077: 0x9942, - 0xF078: 0x9943, - 0xF079: 0x9944, - 0xF07A: 0x9945, - 0xF07B: 0x9946, - 0xF07C: 0x9947, - 0xF07D: 0x9948, - 0xF07E: 0x9949, - 0xF080: 0x994A, - 0xF081: 0x994B, - 0xF082: 0x994C, - 0xF083: 0x994D, - 0xF084: 0x994E, - 0xF085: 0x994F, - 0xF086: 0x9950, - 0xF087: 0x9951, - 0xF088: 0x9952, - 0xF089: 0x9953, - 0xF08A: 0x9956, - 0xF08B: 0x9957, - 0xF08C: 0x9958, - 0xF08D: 0x9959, - 0xF08E: 0x995A, - 0xF08F: 0x995B, - 0xF090: 0x995C, - 0xF091: 0x995D, - 0xF092: 0x995E, - 0xF093: 0x995F, - 0xF094: 0x9960, - 0xF095: 0x9961, - 0xF096: 0x9962, - 0xF097: 0x9964, - 0xF098: 0x9966, - 0xF099: 0x9973, - 0xF09A: 0x9978, - 0xF09B: 0x9979, - 0xF09C: 0x997B, - 0xF09D: 0x997E, - 0xF09E: 0x9982, - 0xF09F: 0x9983, - 0xF0A0: 0x9989, - 0xF0A1: 0x7A39, - 0xF0A2: 0x7A37, - 0xF0A3: 0x7A51, - 0xF0A4: 0x9ECF, - 0xF0A5: 0x99A5, - 0xF0A6: 0x7A70, - 0xF0A7: 0x7688, - 0xF0A8: 0x768E, - 0xF0A9: 0x7693, - 0xF0AA: 0x7699, - 0xF0AB: 0x76A4, - 0xF0AC: 0x74DE, - 0xF0AD: 0x74E0, - 0xF0AE: 0x752C, - 0xF0AF: 0x9E20, - 0xF0B0: 0x9E22, - 0xF0B1: 0x9E28, - 0xF0B2: 0x9E29, - 0xF0B3: 0x9E2A, - 0xF0B4: 0x9E2B, - 0xF0B5: 0x9E2C, - 0xF0B6: 0x9E32, - 0xF0B7: 0x9E31, - 0xF0B8: 0x9E36, - 0xF0B9: 0x9E38, - 0xF0BA: 0x9E37, - 0xF0BB: 0x9E39, - 0xF0BC: 0x9E3A, - 0xF0BD: 0x9E3E, - 0xF0BE: 0x9E41, - 0xF0BF: 0x9E42, - 0xF0C0: 0x9E44, - 0xF0C1: 0x9E46, - 0xF0C2: 0x9E47, - 0xF0C3: 0x9E48, - 0xF0C4: 0x9E49, - 0xF0C5: 0x9E4B, - 0xF0C6: 0x9E4C, - 0xF0C7: 0x9E4E, - 0xF0C8: 0x9E51, - 0xF0C9: 0x9E55, - 0xF0CA: 0x9E57, - 0xF0CB: 0x9E5A, - 0xF0CC: 0x9E5B, - 0xF0CD: 0x9E5C, - 0xF0CE: 0x9E5E, - 0xF0CF: 0x9E63, - 0xF0D0: 0x9E66, - 0xF0D1: 0x9E67, - 0xF0D2: 0x9E68, - 0xF0D3: 0x9E69, - 0xF0D4: 0x9E6A, - 0xF0D5: 0x9E6B, - 0xF0D6: 0x9E6C, - 0xF0D7: 0x9E71, - 0xF0D8: 0x9E6D, - 0xF0D9: 0x9E73, - 0xF0DA: 0x7592, - 0xF0DB: 0x7594, - 0xF0DC: 0x7596, - 0xF0DD: 0x75A0, - 0xF0DE: 0x759D, - 0xF0DF: 0x75AC, - 0xF0E0: 0x75A3, - 0xF0E1: 0x75B3, - 0xF0E2: 0x75B4, - 0xF0E3: 0x75B8, - 0xF0E4: 0x75C4, - 0xF0E5: 0x75B1, - 0xF0E6: 0x75B0, - 0xF0E7: 0x75C3, - 0xF0E8: 0x75C2, - 0xF0E9: 0x75D6, - 0xF0EA: 0x75CD, - 0xF0EB: 0x75E3, - 0xF0EC: 0x75E8, - 0xF0ED: 0x75E6, - 0xF0EE: 0x75E4, - 0xF0EF: 0x75EB, - 0xF0F0: 0x75E7, - 0xF0F1: 0x7603, - 0xF0F2: 0x75F1, - 0xF0F3: 0x75FC, - 0xF0F4: 0x75FF, - 0xF0F5: 0x7610, - 0xF0F6: 0x7600, - 0xF0F7: 0x7605, - 0xF0F8: 0x760C, - 0xF0F9: 0x7617, - 0xF0FA: 0x760A, - 0xF0FB: 0x7625, - 0xF0FC: 0x7618, - 0xF0FD: 0x7615, - 0xF0FE: 0x7619, - 0xF140: 0x998C, - 0xF141: 0x998E, - 0xF142: 0x999A, - 0xF143: 0x999B, - 0xF144: 0x999C, - 0xF145: 0x999D, - 0xF146: 0x999E, - 0xF147: 0x999F, - 0xF148: 0x99A0, - 0xF149: 0x99A1, - 0xF14A: 0x99A2, - 0xF14B: 0x99A3, - 0xF14C: 0x99A4, - 0xF14D: 0x99A6, - 0xF14E: 0x99A7, - 0xF14F: 0x99A9, - 0xF150: 0x99AA, - 0xF151: 0x99AB, - 0xF152: 0x99AC, - 0xF153: 0x99AD, - 0xF154: 0x99AE, - 0xF155: 0x99AF, - 0xF156: 0x99B0, - 0xF157: 0x99B1, - 0xF158: 0x99B2, - 0xF159: 0x99B3, - 0xF15A: 0x99B4, - 0xF15B: 0x99B5, - 0xF15C: 0x99B6, - 0xF15D: 0x99B7, - 0xF15E: 0x99B8, - 0xF15F: 0x99B9, - 0xF160: 0x99BA, - 0xF161: 0x99BB, - 0xF162: 0x99BC, - 0xF163: 0x99BD, - 0xF164: 0x99BE, - 0xF165: 0x99BF, - 0xF166: 0x99C0, - 0xF167: 0x99C1, - 0xF168: 0x99C2, - 0xF169: 0x99C3, - 0xF16A: 0x99C4, - 0xF16B: 0x99C5, - 0xF16C: 0x99C6, - 0xF16D: 0x99C7, - 0xF16E: 0x99C8, - 0xF16F: 0x99C9, - 0xF170: 0x99CA, - 0xF171: 0x99CB, - 0xF172: 0x99CC, - 0xF173: 0x99CD, - 0xF174: 0x99CE, - 0xF175: 0x99CF, - 0xF176: 0x99D0, - 0xF177: 0x99D1, - 0xF178: 0x99D2, - 0xF179: 0x99D3, - 0xF17A: 0x99D4, - 0xF17B: 0x99D5, - 0xF17C: 0x99D6, - 0xF17D: 0x99D7, - 0xF17E: 0x99D8, - 0xF180: 0x99D9, - 0xF181: 0x99DA, - 0xF182: 0x99DB, - 0xF183: 0x99DC, - 0xF184: 0x99DD, - 0xF185: 0x99DE, - 0xF186: 0x99DF, - 0xF187: 0x99E0, - 0xF188: 0x99E1, - 0xF189: 0x99E2, - 0xF18A: 0x99E3, - 0xF18B: 0x99E4, - 0xF18C: 0x99E5, - 0xF18D: 0x99E6, - 0xF18E: 0x99E7, - 0xF18F: 0x99E8, - 0xF190: 0x99E9, - 0xF191: 0x99EA, - 0xF192: 0x99EB, - 0xF193: 0x99EC, - 0xF194: 0x99ED, - 0xF195: 0x99EE, - 0xF196: 0x99EF, - 0xF197: 0x99F0, - 0xF198: 0x99F1, - 0xF199: 0x99F2, - 0xF19A: 0x99F3, - 0xF19B: 0x99F4, - 0xF19C: 0x99F5, - 0xF19D: 0x99F6, - 0xF19E: 0x99F7, - 0xF19F: 0x99F8, - 0xF1A0: 0x99F9, - 0xF1A1: 0x761B, - 0xF1A2: 0x763C, - 0xF1A3: 0x7622, - 0xF1A4: 0x7620, - 0xF1A5: 0x7640, - 0xF1A6: 0x762D, - 0xF1A7: 0x7630, - 0xF1A8: 0x763F, - 0xF1A9: 0x7635, - 0xF1AA: 0x7643, - 0xF1AB: 0x763E, - 0xF1AC: 0x7633, - 0xF1AD: 0x764D, - 0xF1AE: 0x765E, - 0xF1AF: 0x7654, - 0xF1B0: 0x765C, - 0xF1B1: 0x7656, - 0xF1B2: 0x766B, - 0xF1B3: 0x766F, - 0xF1B4: 0x7FCA, - 0xF1B5: 0x7AE6, - 0xF1B6: 0x7A78, - 0xF1B7: 0x7A79, - 0xF1B8: 0x7A80, - 0xF1B9: 0x7A86, - 0xF1BA: 0x7A88, - 0xF1BB: 0x7A95, - 0xF1BC: 0x7AA6, - 0xF1BD: 0x7AA0, - 0xF1BE: 0x7AAC, - 0xF1BF: 0x7AA8, - 0xF1C0: 0x7AAD, - 0xF1C1: 0x7AB3, - 0xF1C2: 0x8864, - 0xF1C3: 0x8869, - 0xF1C4: 0x8872, - 0xF1C5: 0x887D, - 0xF1C6: 0x887F, - 0xF1C7: 0x8882, - 0xF1C8: 0x88A2, - 0xF1C9: 0x88C6, - 0xF1CA: 0x88B7, - 0xF1CB: 0x88BC, - 0xF1CC: 0x88C9, - 0xF1CD: 0x88E2, - 0xF1CE: 0x88CE, - 0xF1CF: 0x88E3, - 0xF1D0: 0x88E5, - 0xF1D1: 0x88F1, - 0xF1D2: 0x891A, - 0xF1D3: 0x88FC, - 0xF1D4: 0x88E8, - 0xF1D5: 0x88FE, - 0xF1D6: 0x88F0, - 0xF1D7: 0x8921, - 0xF1D8: 0x8919, - 0xF1D9: 0x8913, - 0xF1DA: 0x891B, - 0xF1DB: 0x890A, - 0xF1DC: 0x8934, - 0xF1DD: 0x892B, - 0xF1DE: 0x8936, - 0xF1DF: 0x8941, - 0xF1E0: 0x8966, - 0xF1E1: 0x897B, - 0xF1E2: 0x758B, - 0xF1E3: 0x80E5, - 0xF1E4: 0x76B2, - 0xF1E5: 0x76B4, - 0xF1E6: 0x77DC, - 0xF1E7: 0x8012, - 0xF1E8: 0x8014, - 0xF1E9: 0x8016, - 0xF1EA: 0x801C, - 0xF1EB: 0x8020, - 0xF1EC: 0x8022, - 0xF1ED: 0x8025, - 0xF1EE: 0x8026, - 0xF1EF: 0x8027, - 0xF1F0: 0x8029, - 0xF1F1: 0x8028, - 0xF1F2: 0x8031, - 0xF1F3: 0x800B, - 0xF1F4: 0x8035, - 0xF1F5: 0x8043, - 0xF1F6: 0x8046, - 0xF1F7: 0x804D, - 0xF1F8: 0x8052, - 0xF1F9: 0x8069, - 0xF1FA: 0x8071, - 0xF1FB: 0x8983, - 0xF1FC: 0x9878, - 0xF1FD: 0x9880, - 0xF1FE: 0x9883, - 0xF240: 0x99FA, - 0xF241: 0x99FB, - 0xF242: 0x99FC, - 0xF243: 0x99FD, - 0xF244: 0x99FE, - 0xF245: 0x99FF, - 0xF246: 0x9A00, - 0xF247: 0x9A01, - 0xF248: 0x9A02, - 0xF249: 0x9A03, - 0xF24A: 0x9A04, - 0xF24B: 0x9A05, - 0xF24C: 0x9A06, - 0xF24D: 0x9A07, - 0xF24E: 0x9A08, - 0xF24F: 0x9A09, - 0xF250: 0x9A0A, - 0xF251: 0x9A0B, - 0xF252: 0x9A0C, - 0xF253: 0x9A0D, - 0xF254: 0x9A0E, - 0xF255: 0x9A0F, - 0xF256: 0x9A10, - 0xF257: 0x9A11, - 0xF258: 0x9A12, - 0xF259: 0x9A13, - 0xF25A: 0x9A14, - 0xF25B: 0x9A15, - 0xF25C: 0x9A16, - 0xF25D: 0x9A17, - 0xF25E: 0x9A18, - 0xF25F: 0x9A19, - 0xF260: 0x9A1A, - 0xF261: 0x9A1B, - 0xF262: 0x9A1C, - 0xF263: 0x9A1D, - 0xF264: 0x9A1E, - 0xF265: 0x9A1F, - 0xF266: 0x9A20, - 0xF267: 0x9A21, - 0xF268: 0x9A22, - 0xF269: 0x9A23, - 0xF26A: 0x9A24, - 0xF26B: 0x9A25, - 0xF26C: 0x9A26, - 0xF26D: 0x9A27, - 0xF26E: 0x9A28, - 0xF26F: 0x9A29, - 0xF270: 0x9A2A, - 0xF271: 0x9A2B, - 0xF272: 0x9A2C, - 0xF273: 0x9A2D, - 0xF274: 0x9A2E, - 0xF275: 0x9A2F, - 0xF276: 0x9A30, - 0xF277: 0x9A31, - 0xF278: 0x9A32, - 0xF279: 0x9A33, - 0xF27A: 0x9A34, - 0xF27B: 0x9A35, - 0xF27C: 0x9A36, - 0xF27D: 0x9A37, - 0xF27E: 0x9A38, - 0xF280: 0x9A39, - 0xF281: 0x9A3A, - 0xF282: 0x9A3B, - 0xF283: 0x9A3C, - 0xF284: 0x9A3D, - 0xF285: 0x9A3E, - 0xF286: 0x9A3F, - 0xF287: 0x9A40, - 0xF288: 0x9A41, - 0xF289: 0x9A42, - 0xF28A: 0x9A43, - 0xF28B: 0x9A44, - 0xF28C: 0x9A45, - 0xF28D: 0x9A46, - 0xF28E: 0x9A47, - 0xF28F: 0x9A48, - 0xF290: 0x9A49, - 0xF291: 0x9A4A, - 0xF292: 0x9A4B, - 0xF293: 0x9A4C, - 0xF294: 0x9A4D, - 0xF295: 0x9A4E, - 0xF296: 0x9A4F, - 0xF297: 0x9A50, - 0xF298: 0x9A51, - 0xF299: 0x9A52, - 0xF29A: 0x9A53, - 0xF29B: 0x9A54, - 0xF29C: 0x9A55, - 0xF29D: 0x9A56, - 0xF29E: 0x9A57, - 0xF29F: 0x9A58, - 0xF2A0: 0x9A59, - 0xF2A1: 0x9889, - 0xF2A2: 0x988C, - 0xF2A3: 0x988D, - 0xF2A4: 0x988F, - 0xF2A5: 0x9894, - 0xF2A6: 0x989A, - 0xF2A7: 0x989B, - 0xF2A8: 0x989E, - 0xF2A9: 0x989F, - 0xF2AA: 0x98A1, - 0xF2AB: 0x98A2, - 0xF2AC: 0x98A5, - 0xF2AD: 0x98A6, - 0xF2AE: 0x864D, - 0xF2AF: 0x8654, - 0xF2B0: 0x866C, - 0xF2B1: 0x866E, - 0xF2B2: 0x867F, - 0xF2B3: 0x867A, - 0xF2B4: 0x867C, - 0xF2B5: 0x867B, - 0xF2B6: 0x86A8, - 0xF2B7: 0x868D, - 0xF2B8: 0x868B, - 0xF2B9: 0x86AC, - 0xF2BA: 0x869D, - 0xF2BB: 0x86A7, - 0xF2BC: 0x86A3, - 0xF2BD: 0x86AA, - 0xF2BE: 0x8693, - 0xF2BF: 0x86A9, - 0xF2C0: 0x86B6, - 0xF2C1: 0x86C4, - 0xF2C2: 0x86B5, - 0xF2C3: 0x86CE, - 0xF2C4: 0x86B0, - 0xF2C5: 0x86BA, - 0xF2C6: 0x86B1, - 0xF2C7: 0x86AF, - 0xF2C8: 0x86C9, - 0xF2C9: 0x86CF, - 0xF2CA: 0x86B4, - 0xF2CB: 0x86E9, - 0xF2CC: 0x86F1, - 0xF2CD: 0x86F2, - 0xF2CE: 0x86ED, - 0xF2CF: 0x86F3, - 0xF2D0: 0x86D0, - 0xF2D1: 0x8713, - 0xF2D2: 0x86DE, - 0xF2D3: 0x86F4, - 0xF2D4: 0x86DF, - 0xF2D5: 0x86D8, - 0xF2D6: 0x86D1, - 0xF2D7: 0x8703, - 0xF2D8: 0x8707, - 0xF2D9: 0x86F8, - 0xF2DA: 0x8708, - 0xF2DB: 0x870A, - 0xF2DC: 0x870D, - 0xF2DD: 0x8709, - 0xF2DE: 0x8723, - 0xF2DF: 0x873B, - 0xF2E0: 0x871E, - 0xF2E1: 0x8725, - 0xF2E2: 0x872E, - 0xF2E3: 0x871A, - 0xF2E4: 0x873E, - 0xF2E5: 0x8748, - 0xF2E6: 0x8734, - 0xF2E7: 0x8731, - 0xF2E8: 0x8729, - 0xF2E9: 0x8737, - 0xF2EA: 0x873F, - 0xF2EB: 0x8782, - 0xF2EC: 0x8722, - 0xF2ED: 0x877D, - 0xF2EE: 0x877E, - 0xF2EF: 0x877B, - 0xF2F0: 0x8760, - 0xF2F1: 0x8770, - 0xF2F2: 0x874C, - 0xF2F3: 0x876E, - 0xF2F4: 0x878B, - 0xF2F5: 0x8753, - 0xF2F6: 0x8763, - 0xF2F7: 0x877C, - 0xF2F8: 0x8764, - 0xF2F9: 0x8759, - 0xF2FA: 0x8765, - 0xF2FB: 0x8793, - 0xF2FC: 0x87AF, - 0xF2FD: 0x87A8, - 0xF2FE: 0x87D2, - 0xF340: 0x9A5A, - 0xF341: 0x9A5B, - 0xF342: 0x9A5C, - 0xF343: 0x9A5D, - 0xF344: 0x9A5E, - 0xF345: 0x9A5F, - 0xF346: 0x9A60, - 0xF347: 0x9A61, - 0xF348: 0x9A62, - 0xF349: 0x9A63, - 0xF34A: 0x9A64, - 0xF34B: 0x9A65, - 0xF34C: 0x9A66, - 0xF34D: 0x9A67, - 0xF34E: 0x9A68, - 0xF34F: 0x9A69, - 0xF350: 0x9A6A, - 0xF351: 0x9A6B, - 0xF352: 0x9A72, - 0xF353: 0x9A83, - 0xF354: 0x9A89, - 0xF355: 0x9A8D, - 0xF356: 0x9A8E, - 0xF357: 0x9A94, - 0xF358: 0x9A95, - 0xF359: 0x9A99, - 0xF35A: 0x9AA6, - 0xF35B: 0x9AA9, - 0xF35C: 0x9AAA, - 0xF35D: 0x9AAB, - 0xF35E: 0x9AAC, - 0xF35F: 0x9AAD, - 0xF360: 0x9AAE, - 0xF361: 0x9AAF, - 0xF362: 0x9AB2, - 0xF363: 0x9AB3, - 0xF364: 0x9AB4, - 0xF365: 0x9AB5, - 0xF366: 0x9AB9, - 0xF367: 0x9ABB, - 0xF368: 0x9ABD, - 0xF369: 0x9ABE, - 0xF36A: 0x9ABF, - 0xF36B: 0x9AC3, - 0xF36C: 0x9AC4, - 0xF36D: 0x9AC6, - 0xF36E: 0x9AC7, - 0xF36F: 0x9AC8, - 0xF370: 0x9AC9, - 0xF371: 0x9ACA, - 0xF372: 0x9ACD, - 0xF373: 0x9ACE, - 0xF374: 0x9ACF, - 0xF375: 0x9AD0, - 0xF376: 0x9AD2, - 0xF377: 0x9AD4, - 0xF378: 0x9AD5, - 0xF379: 0x9AD6, - 0xF37A: 0x9AD7, - 0xF37B: 0x9AD9, - 0xF37C: 0x9ADA, - 0xF37D: 0x9ADB, - 0xF37E: 0x9ADC, - 0xF380: 0x9ADD, - 0xF381: 0x9ADE, - 0xF382: 0x9AE0, - 0xF383: 0x9AE2, - 0xF384: 0x9AE3, - 0xF385: 0x9AE4, - 0xF386: 0x9AE5, - 0xF387: 0x9AE7, - 0xF388: 0x9AE8, - 0xF389: 0x9AE9, - 0xF38A: 0x9AEA, - 0xF38B: 0x9AEC, - 0xF38C: 0x9AEE, - 0xF38D: 0x9AF0, - 0xF38E: 0x9AF1, - 0xF38F: 0x9AF2, - 0xF390: 0x9AF3, - 0xF391: 0x9AF4, - 0xF392: 0x9AF5, - 0xF393: 0x9AF6, - 0xF394: 0x9AF7, - 0xF395: 0x9AF8, - 0xF396: 0x9AFA, - 0xF397: 0x9AFC, - 0xF398: 0x9AFD, - 0xF399: 0x9AFE, - 0xF39A: 0x9AFF, - 0xF39B: 0x9B00, - 0xF39C: 0x9B01, - 0xF39D: 0x9B02, - 0xF39E: 0x9B04, - 0xF39F: 0x9B05, - 0xF3A0: 0x9B06, - 0xF3A1: 0x87C6, - 0xF3A2: 0x8788, - 0xF3A3: 0x8785, - 0xF3A4: 0x87AD, - 0xF3A5: 0x8797, - 0xF3A6: 0x8783, - 0xF3A7: 0x87AB, - 0xF3A8: 0x87E5, - 0xF3A9: 0x87AC, - 0xF3AA: 0x87B5, - 0xF3AB: 0x87B3, - 0xF3AC: 0x87CB, - 0xF3AD: 0x87D3, - 0xF3AE: 0x87BD, - 0xF3AF: 0x87D1, - 0xF3B0: 0x87C0, - 0xF3B1: 0x87CA, - 0xF3B2: 0x87DB, - 0xF3B3: 0x87EA, - 0xF3B4: 0x87E0, - 0xF3B5: 0x87EE, - 0xF3B6: 0x8816, - 0xF3B7: 0x8813, - 0xF3B8: 0x87FE, - 0xF3B9: 0x880A, - 0xF3BA: 0x881B, - 0xF3BB: 0x8821, - 0xF3BC: 0x8839, - 0xF3BD: 0x883C, - 0xF3BE: 0x7F36, - 0xF3BF: 0x7F42, - 0xF3C0: 0x7F44, - 0xF3C1: 0x7F45, - 0xF3C2: 0x8210, - 0xF3C3: 0x7AFA, - 0xF3C4: 0x7AFD, - 0xF3C5: 0x7B08, - 0xF3C6: 0x7B03, - 0xF3C7: 0x7B04, - 0xF3C8: 0x7B15, - 0xF3C9: 0x7B0A, - 0xF3CA: 0x7B2B, - 0xF3CB: 0x7B0F, - 0xF3CC: 0x7B47, - 0xF3CD: 0x7B38, - 0xF3CE: 0x7B2A, - 0xF3CF: 0x7B19, - 0xF3D0: 0x7B2E, - 0xF3D1: 0x7B31, - 0xF3D2: 0x7B20, - 0xF3D3: 0x7B25, - 0xF3D4: 0x7B24, - 0xF3D5: 0x7B33, - 0xF3D6: 0x7B3E, - 0xF3D7: 0x7B1E, - 0xF3D8: 0x7B58, - 0xF3D9: 0x7B5A, - 0xF3DA: 0x7B45, - 0xF3DB: 0x7B75, - 0xF3DC: 0x7B4C, - 0xF3DD: 0x7B5D, - 0xF3DE: 0x7B60, - 0xF3DF: 0x7B6E, - 0xF3E0: 0x7B7B, - 0xF3E1: 0x7B62, - 0xF3E2: 0x7B72, - 0xF3E3: 0x7B71, - 0xF3E4: 0x7B90, - 0xF3E5: 0x7BA6, - 0xF3E6: 0x7BA7, - 0xF3E7: 0x7BB8, - 0xF3E8: 0x7BAC, - 0xF3E9: 0x7B9D, - 0xF3EA: 0x7BA8, - 0xF3EB: 0x7B85, - 0xF3EC: 0x7BAA, - 0xF3ED: 0x7B9C, - 0xF3EE: 0x7BA2, - 0xF3EF: 0x7BAB, - 0xF3F0: 0x7BB4, - 0xF3F1: 0x7BD1, - 0xF3F2: 0x7BC1, - 0xF3F3: 0x7BCC, - 0xF3F4: 0x7BDD, - 0xF3F5: 0x7BDA, - 0xF3F6: 0x7BE5, - 0xF3F7: 0x7BE6, - 0xF3F8: 0x7BEA, - 0xF3F9: 0x7C0C, - 0xF3FA: 0x7BFE, - 0xF3FB: 0x7BFC, - 0xF3FC: 0x7C0F, - 0xF3FD: 0x7C16, - 0xF3FE: 0x7C0B, - 0xF440: 0x9B07, - 0xF441: 0x9B09, - 0xF442: 0x9B0A, - 0xF443: 0x9B0B, - 0xF444: 0x9B0C, - 0xF445: 0x9B0D, - 0xF446: 0x9B0E, - 0xF447: 0x9B10, - 0xF448: 0x9B11, - 0xF449: 0x9B12, - 0xF44A: 0x9B14, - 0xF44B: 0x9B15, - 0xF44C: 0x9B16, - 0xF44D: 0x9B17, - 0xF44E: 0x9B18, - 0xF44F: 0x9B19, - 0xF450: 0x9B1A, - 0xF451: 0x9B1B, - 0xF452: 0x9B1C, - 0xF453: 0x9B1D, - 0xF454: 0x9B1E, - 0xF455: 0x9B20, - 0xF456: 0x9B21, - 0xF457: 0x9B22, - 0xF458: 0x9B24, - 0xF459: 0x9B25, - 0xF45A: 0x9B26, - 0xF45B: 0x9B27, - 0xF45C: 0x9B28, - 0xF45D: 0x9B29, - 0xF45E: 0x9B2A, - 0xF45F: 0x9B2B, - 0xF460: 0x9B2C, - 0xF461: 0x9B2D, - 0xF462: 0x9B2E, - 0xF463: 0x9B30, - 0xF464: 0x9B31, - 0xF465: 0x9B33, - 0xF466: 0x9B34, - 0xF467: 0x9B35, - 0xF468: 0x9B36, - 0xF469: 0x9B37, - 0xF46A: 0x9B38, - 0xF46B: 0x9B39, - 0xF46C: 0x9B3A, - 0xF46D: 0x9B3D, - 0xF46E: 0x9B3E, - 0xF46F: 0x9B3F, - 0xF470: 0x9B40, - 0xF471: 0x9B46, - 0xF472: 0x9B4A, - 0xF473: 0x9B4B, - 0xF474: 0x9B4C, - 0xF475: 0x9B4E, - 0xF476: 0x9B50, - 0xF477: 0x9B52, - 0xF478: 0x9B53, - 0xF479: 0x9B55, - 0xF47A: 0x9B56, - 0xF47B: 0x9B57, - 0xF47C: 0x9B58, - 0xF47D: 0x9B59, - 0xF47E: 0x9B5A, - 0xF480: 0x9B5B, - 0xF481: 0x9B5C, - 0xF482: 0x9B5D, - 0xF483: 0x9B5E, - 0xF484: 0x9B5F, - 0xF485: 0x9B60, - 0xF486: 0x9B61, - 0xF487: 0x9B62, - 0xF488: 0x9B63, - 0xF489: 0x9B64, - 0xF48A: 0x9B65, - 0xF48B: 0x9B66, - 0xF48C: 0x9B67, - 0xF48D: 0x9B68, - 0xF48E: 0x9B69, - 0xF48F: 0x9B6A, - 0xF490: 0x9B6B, - 0xF491: 0x9B6C, - 0xF492: 0x9B6D, - 0xF493: 0x9B6E, - 0xF494: 0x9B6F, - 0xF495: 0x9B70, - 0xF496: 0x9B71, - 0xF497: 0x9B72, - 0xF498: 0x9B73, - 0xF499: 0x9B74, - 0xF49A: 0x9B75, - 0xF49B: 0x9B76, - 0xF49C: 0x9B77, - 0xF49D: 0x9B78, - 0xF49E: 0x9B79, - 0xF49F: 0x9B7A, - 0xF4A0: 0x9B7B, - 0xF4A1: 0x7C1F, - 0xF4A2: 0x7C2A, - 0xF4A3: 0x7C26, - 0xF4A4: 0x7C38, - 0xF4A5: 0x7C41, - 0xF4A6: 0x7C40, - 0xF4A7: 0x81FE, - 0xF4A8: 0x8201, - 0xF4A9: 0x8202, - 0xF4AA: 0x8204, - 0xF4AB: 0x81EC, - 0xF4AC: 0x8844, - 0xF4AD: 0x8221, - 0xF4AE: 0x8222, - 0xF4AF: 0x8223, - 0xF4B0: 0x822D, - 0xF4B1: 0x822F, - 0xF4B2: 0x8228, - 0xF4B3: 0x822B, - 0xF4B4: 0x8238, - 0xF4B5: 0x823B, - 0xF4B6: 0x8233, - 0xF4B7: 0x8234, - 0xF4B8: 0x823E, - 0xF4B9: 0x8244, - 0xF4BA: 0x8249, - 0xF4BB: 0x824B, - 0xF4BC: 0x824F, - 0xF4BD: 0x825A, - 0xF4BE: 0x825F, - 0xF4BF: 0x8268, - 0xF4C0: 0x887E, - 0xF4C1: 0x8885, - 0xF4C2: 0x8888, - 0xF4C3: 0x88D8, - 0xF4C4: 0x88DF, - 0xF4C5: 0x895E, - 0xF4C6: 0x7F9D, - 0xF4C7: 0x7F9F, - 0xF4C8: 0x7FA7, - 0xF4C9: 0x7FAF, - 0xF4CA: 0x7FB0, - 0xF4CB: 0x7FB2, - 0xF4CC: 0x7C7C, - 0xF4CD: 0x6549, - 0xF4CE: 0x7C91, - 0xF4CF: 0x7C9D, - 0xF4D0: 0x7C9C, - 0xF4D1: 0x7C9E, - 0xF4D2: 0x7CA2, - 0xF4D3: 0x7CB2, - 0xF4D4: 0x7CBC, - 0xF4D5: 0x7CBD, - 0xF4D6: 0x7CC1, - 0xF4D7: 0x7CC7, - 0xF4D8: 0x7CCC, - 0xF4D9: 0x7CCD, - 0xF4DA: 0x7CC8, - 0xF4DB: 0x7CC5, - 0xF4DC: 0x7CD7, - 0xF4DD: 0x7CE8, - 0xF4DE: 0x826E, - 0xF4DF: 0x66A8, - 0xF4E0: 0x7FBF, - 0xF4E1: 0x7FCE, - 0xF4E2: 0x7FD5, - 0xF4E3: 0x7FE5, - 0xF4E4: 0x7FE1, - 0xF4E5: 0x7FE6, - 0xF4E6: 0x7FE9, - 0xF4E7: 0x7FEE, - 0xF4E8: 0x7FF3, - 0xF4E9: 0x7CF8, - 0xF4EA: 0x7D77, - 0xF4EB: 0x7DA6, - 0xF4EC: 0x7DAE, - 0xF4ED: 0x7E47, - 0xF4EE: 0x7E9B, - 0xF4EF: 0x9EB8, - 0xF4F0: 0x9EB4, - 0xF4F1: 0x8D73, - 0xF4F2: 0x8D84, - 0xF4F3: 0x8D94, - 0xF4F4: 0x8D91, - 0xF4F5: 0x8DB1, - 0xF4F6: 0x8D67, - 0xF4F7: 0x8D6D, - 0xF4F8: 0x8C47, - 0xF4F9: 0x8C49, - 0xF4FA: 0x914A, - 0xF4FB: 0x9150, - 0xF4FC: 0x914E, - 0xF4FD: 0x914F, - 0xF4FE: 0x9164, - 0xF540: 0x9B7C, - 0xF541: 0x9B7D, - 0xF542: 0x9B7E, - 0xF543: 0x9B7F, - 0xF544: 0x9B80, - 0xF545: 0x9B81, - 0xF546: 0x9B82, - 0xF547: 0x9B83, - 0xF548: 0x9B84, - 0xF549: 0x9B85, - 0xF54A: 0x9B86, - 0xF54B: 0x9B87, - 0xF54C: 0x9B88, - 0xF54D: 0x9B89, - 0xF54E: 0x9B8A, - 0xF54F: 0x9B8B, - 0xF550: 0x9B8C, - 0xF551: 0x9B8D, - 0xF552: 0x9B8E, - 0xF553: 0x9B8F, - 0xF554: 0x9B90, - 0xF555: 0x9B91, - 0xF556: 0x9B92, - 0xF557: 0x9B93, - 0xF558: 0x9B94, - 0xF559: 0x9B95, - 0xF55A: 0x9B96, - 0xF55B: 0x9B97, - 0xF55C: 0x9B98, - 0xF55D: 0x9B99, - 0xF55E: 0x9B9A, - 0xF55F: 0x9B9B, - 0xF560: 0x9B9C, - 0xF561: 0x9B9D, - 0xF562: 0x9B9E, - 0xF563: 0x9B9F, - 0xF564: 0x9BA0, - 0xF565: 0x9BA1, - 0xF566: 0x9BA2, - 0xF567: 0x9BA3, - 0xF568: 0x9BA4, - 0xF569: 0x9BA5, - 0xF56A: 0x9BA6, - 0xF56B: 0x9BA7, - 0xF56C: 0x9BA8, - 0xF56D: 0x9BA9, - 0xF56E: 0x9BAA, - 0xF56F: 0x9BAB, - 0xF570: 0x9BAC, - 0xF571: 0x9BAD, - 0xF572: 0x9BAE, - 0xF573: 0x9BAF, - 0xF574: 0x9BB0, - 0xF575: 0x9BB1, - 0xF576: 0x9BB2, - 0xF577: 0x9BB3, - 0xF578: 0x9BB4, - 0xF579: 0x9BB5, - 0xF57A: 0x9BB6, - 0xF57B: 0x9BB7, - 0xF57C: 0x9BB8, - 0xF57D: 0x9BB9, - 0xF57E: 0x9BBA, - 0xF580: 0x9BBB, - 0xF581: 0x9BBC, - 0xF582: 0x9BBD, - 0xF583: 0x9BBE, - 0xF584: 0x9BBF, - 0xF585: 0x9BC0, - 0xF586: 0x9BC1, - 0xF587: 0x9BC2, - 0xF588: 0x9BC3, - 0xF589: 0x9BC4, - 0xF58A: 0x9BC5, - 0xF58B: 0x9BC6, - 0xF58C: 0x9BC7, - 0xF58D: 0x9BC8, - 0xF58E: 0x9BC9, - 0xF58F: 0x9BCA, - 0xF590: 0x9BCB, - 0xF591: 0x9BCC, - 0xF592: 0x9BCD, - 0xF593: 0x9BCE, - 0xF594: 0x9BCF, - 0xF595: 0x9BD0, - 0xF596: 0x9BD1, - 0xF597: 0x9BD2, - 0xF598: 0x9BD3, - 0xF599: 0x9BD4, - 0xF59A: 0x9BD5, - 0xF59B: 0x9BD6, - 0xF59C: 0x9BD7, - 0xF59D: 0x9BD8, - 0xF59E: 0x9BD9, - 0xF59F: 0x9BDA, - 0xF5A0: 0x9BDB, - 0xF5A1: 0x9162, - 0xF5A2: 0x9161, - 0xF5A3: 0x9170, - 0xF5A4: 0x9169, - 0xF5A5: 0x916F, - 0xF5A6: 0x917D, - 0xF5A7: 0x917E, - 0xF5A8: 0x9172, - 0xF5A9: 0x9174, - 0xF5AA: 0x9179, - 0xF5AB: 0x918C, - 0xF5AC: 0x9185, - 0xF5AD: 0x9190, - 0xF5AE: 0x918D, - 0xF5AF: 0x9191, - 0xF5B0: 0x91A2, - 0xF5B1: 0x91A3, - 0xF5B2: 0x91AA, - 0xF5B3: 0x91AD, - 0xF5B4: 0x91AE, - 0xF5B5: 0x91AF, - 0xF5B6: 0x91B5, - 0xF5B7: 0x91B4, - 0xF5B8: 0x91BA, - 0xF5B9: 0x8C55, - 0xF5BA: 0x9E7E, - 0xF5BB: 0x8DB8, - 0xF5BC: 0x8DEB, - 0xF5BD: 0x8E05, - 0xF5BE: 0x8E59, - 0xF5BF: 0x8E69, - 0xF5C0: 0x8DB5, - 0xF5C1: 0x8DBF, - 0xF5C2: 0x8DBC, - 0xF5C3: 0x8DBA, - 0xF5C4: 0x8DC4, - 0xF5C5: 0x8DD6, - 0xF5C6: 0x8DD7, - 0xF5C7: 0x8DDA, - 0xF5C8: 0x8DDE, - 0xF5C9: 0x8DCE, - 0xF5CA: 0x8DCF, - 0xF5CB: 0x8DDB, - 0xF5CC: 0x8DC6, - 0xF5CD: 0x8DEC, - 0xF5CE: 0x8DF7, - 0xF5CF: 0x8DF8, - 0xF5D0: 0x8DE3, - 0xF5D1: 0x8DF9, - 0xF5D2: 0x8DFB, - 0xF5D3: 0x8DE4, - 0xF5D4: 0x8E09, - 0xF5D5: 0x8DFD, - 0xF5D6: 0x8E14, - 0xF5D7: 0x8E1D, - 0xF5D8: 0x8E1F, - 0xF5D9: 0x8E2C, - 0xF5DA: 0x8E2E, - 0xF5DB: 0x8E23, - 0xF5DC: 0x8E2F, - 0xF5DD: 0x8E3A, - 0xF5DE: 0x8E40, - 0xF5DF: 0x8E39, - 0xF5E0: 0x8E35, - 0xF5E1: 0x8E3D, - 0xF5E2: 0x8E31, - 0xF5E3: 0x8E49, - 0xF5E4: 0x8E41, - 0xF5E5: 0x8E42, - 0xF5E6: 0x8E51, - 0xF5E7: 0x8E52, - 0xF5E8: 0x8E4A, - 0xF5E9: 0x8E70, - 0xF5EA: 0x8E76, - 0xF5EB: 0x8E7C, - 0xF5EC: 0x8E6F, - 0xF5ED: 0x8E74, - 0xF5EE: 0x8E85, - 0xF5EF: 0x8E8F, - 0xF5F0: 0x8E94, - 0xF5F1: 0x8E90, - 0xF5F2: 0x8E9C, - 0xF5F3: 0x8E9E, - 0xF5F4: 0x8C78, - 0xF5F5: 0x8C82, - 0xF5F6: 0x8C8A, - 0xF5F7: 0x8C85, - 0xF5F8: 0x8C98, - 0xF5F9: 0x8C94, - 0xF5FA: 0x659B, - 0xF5FB: 0x89D6, - 0xF5FC: 0x89DE, - 0xF5FD: 0x89DA, - 0xF5FE: 0x89DC, - 0xF640: 0x9BDC, - 0xF641: 0x9BDD, - 0xF642: 0x9BDE, - 0xF643: 0x9BDF, - 0xF644: 0x9BE0, - 0xF645: 0x9BE1, - 0xF646: 0x9BE2, - 0xF647: 0x9BE3, - 0xF648: 0x9BE4, - 0xF649: 0x9BE5, - 0xF64A: 0x9BE6, - 0xF64B: 0x9BE7, - 0xF64C: 0x9BE8, - 0xF64D: 0x9BE9, - 0xF64E: 0x9BEA, - 0xF64F: 0x9BEB, - 0xF650: 0x9BEC, - 0xF651: 0x9BED, - 0xF652: 0x9BEE, - 0xF653: 0x9BEF, - 0xF654: 0x9BF0, - 0xF655: 0x9BF1, - 0xF656: 0x9BF2, - 0xF657: 0x9BF3, - 0xF658: 0x9BF4, - 0xF659: 0x9BF5, - 0xF65A: 0x9BF6, - 0xF65B: 0x9BF7, - 0xF65C: 0x9BF8, - 0xF65D: 0x9BF9, - 0xF65E: 0x9BFA, - 0xF65F: 0x9BFB, - 0xF660: 0x9BFC, - 0xF661: 0x9BFD, - 0xF662: 0x9BFE, - 0xF663: 0x9BFF, - 0xF664: 0x9C00, - 0xF665: 0x9C01, - 0xF666: 0x9C02, - 0xF667: 0x9C03, - 0xF668: 0x9C04, - 0xF669: 0x9C05, - 0xF66A: 0x9C06, - 0xF66B: 0x9C07, - 0xF66C: 0x9C08, - 0xF66D: 0x9C09, - 0xF66E: 0x9C0A, - 0xF66F: 0x9C0B, - 0xF670: 0x9C0C, - 0xF671: 0x9C0D, - 0xF672: 0x9C0E, - 0xF673: 0x9C0F, - 0xF674: 0x9C10, - 0xF675: 0x9C11, - 0xF676: 0x9C12, - 0xF677: 0x9C13, - 0xF678: 0x9C14, - 0xF679: 0x9C15, - 0xF67A: 0x9C16, - 0xF67B: 0x9C17, - 0xF67C: 0x9C18, - 0xF67D: 0x9C19, - 0xF67E: 0x9C1A, - 0xF680: 0x9C1B, - 0xF681: 0x9C1C, - 0xF682: 0x9C1D, - 0xF683: 0x9C1E, - 0xF684: 0x9C1F, - 0xF685: 0x9C20, - 0xF686: 0x9C21, - 0xF687: 0x9C22, - 0xF688: 0x9C23, - 0xF689: 0x9C24, - 0xF68A: 0x9C25, - 0xF68B: 0x9C26, - 0xF68C: 0x9C27, - 0xF68D: 0x9C28, - 0xF68E: 0x9C29, - 0xF68F: 0x9C2A, - 0xF690: 0x9C2B, - 0xF691: 0x9C2C, - 0xF692: 0x9C2D, - 0xF693: 0x9C2E, - 0xF694: 0x9C2F, - 0xF695: 0x9C30, - 0xF696: 0x9C31, - 0xF697: 0x9C32, - 0xF698: 0x9C33, - 0xF699: 0x9C34, - 0xF69A: 0x9C35, - 0xF69B: 0x9C36, - 0xF69C: 0x9C37, - 0xF69D: 0x9C38, - 0xF69E: 0x9C39, - 0xF69F: 0x9C3A, - 0xF6A0: 0x9C3B, - 0xF6A1: 0x89E5, - 0xF6A2: 0x89EB, - 0xF6A3: 0x89EF, - 0xF6A4: 0x8A3E, - 0xF6A5: 0x8B26, - 0xF6A6: 0x9753, - 0xF6A7: 0x96E9, - 0xF6A8: 0x96F3, - 0xF6A9: 0x96EF, - 0xF6AA: 0x9706, - 0xF6AB: 0x9701, - 0xF6AC: 0x9708, - 0xF6AD: 0x970F, - 0xF6AE: 0x970E, - 0xF6AF: 0x972A, - 0xF6B0: 0x972D, - 0xF6B1: 0x9730, - 0xF6B2: 0x973E, - 0xF6B3: 0x9F80, - 0xF6B4: 0x9F83, - 0xF6B5: 0x9F85, - 0xF6B6: 0x9F86, - 0xF6B7: 0x9F87, - 0xF6B8: 0x9F88, - 0xF6B9: 0x9F89, - 0xF6BA: 0x9F8A, - 0xF6BB: 0x9F8C, - 0xF6BC: 0x9EFE, - 0xF6BD: 0x9F0B, - 0xF6BE: 0x9F0D, - 0xF6BF: 0x96B9, - 0xF6C0: 0x96BC, - 0xF6C1: 0x96BD, - 0xF6C2: 0x96CE, - 0xF6C3: 0x96D2, - 0xF6C4: 0x77BF, - 0xF6C5: 0x96E0, - 0xF6C6: 0x928E, - 0xF6C7: 0x92AE, - 0xF6C8: 0x92C8, - 0xF6C9: 0x933E, - 0xF6CA: 0x936A, - 0xF6CB: 0x93CA, - 0xF6CC: 0x938F, - 0xF6CD: 0x943E, - 0xF6CE: 0x946B, - 0xF6CF: 0x9C7F, - 0xF6D0: 0x9C82, - 0xF6D1: 0x9C85, - 0xF6D2: 0x9C86, - 0xF6D3: 0x9C87, - 0xF6D4: 0x9C88, - 0xF6D5: 0x7A23, - 0xF6D6: 0x9C8B, - 0xF6D7: 0x9C8E, - 0xF6D8: 0x9C90, - 0xF6D9: 0x9C91, - 0xF6DA: 0x9C92, - 0xF6DB: 0x9C94, - 0xF6DC: 0x9C95, - 0xF6DD: 0x9C9A, - 0xF6DE: 0x9C9B, - 0xF6DF: 0x9C9E, - 0xF6E0: 0x9C9F, - 0xF6E1: 0x9CA0, - 0xF6E2: 0x9CA1, - 0xF6E3: 0x9CA2, - 0xF6E4: 0x9CA3, - 0xF6E5: 0x9CA5, - 0xF6E6: 0x9CA6, - 0xF6E7: 0x9CA7, - 0xF6E8: 0x9CA8, - 0xF6E9: 0x9CA9, - 0xF6EA: 0x9CAB, - 0xF6EB: 0x9CAD, - 0xF6EC: 0x9CAE, - 0xF6ED: 0x9CB0, - 0xF6EE: 0x9CB1, - 0xF6EF: 0x9CB2, - 0xF6F0: 0x9CB3, - 0xF6F1: 0x9CB4, - 0xF6F2: 0x9CB5, - 0xF6F3: 0x9CB6, - 0xF6F4: 0x9CB7, - 0xF6F5: 0x9CBA, - 0xF6F6: 0x9CBB, - 0xF6F7: 0x9CBC, - 0xF6F8: 0x9CBD, - 0xF6F9: 0x9CC4, - 0xF6FA: 0x9CC5, - 0xF6FB: 0x9CC6, - 0xF6FC: 0x9CC7, - 0xF6FD: 0x9CCA, - 0xF6FE: 0x9CCB, - 0xF740: 0x9C3C, - 0xF741: 0x9C3D, - 0xF742: 0x9C3E, - 0xF743: 0x9C3F, - 0xF744: 0x9C40, - 0xF745: 0x9C41, - 0xF746: 0x9C42, - 0xF747: 0x9C43, - 0xF748: 0x9C44, - 0xF749: 0x9C45, - 0xF74A: 0x9C46, - 0xF74B: 0x9C47, - 0xF74C: 0x9C48, - 0xF74D: 0x9C49, - 0xF74E: 0x9C4A, - 0xF74F: 0x9C4B, - 0xF750: 0x9C4C, - 0xF751: 0x9C4D, - 0xF752: 0x9C4E, - 0xF753: 0x9C4F, - 0xF754: 0x9C50, - 0xF755: 0x9C51, - 0xF756: 0x9C52, - 0xF757: 0x9C53, - 0xF758: 0x9C54, - 0xF759: 0x9C55, - 0xF75A: 0x9C56, - 0xF75B: 0x9C57, - 0xF75C: 0x9C58, - 0xF75D: 0x9C59, - 0xF75E: 0x9C5A, - 0xF75F: 0x9C5B, - 0xF760: 0x9C5C, - 0xF761: 0x9C5D, - 0xF762: 0x9C5E, - 0xF763: 0x9C5F, - 0xF764: 0x9C60, - 0xF765: 0x9C61, - 0xF766: 0x9C62, - 0xF767: 0x9C63, - 0xF768: 0x9C64, - 0xF769: 0x9C65, - 0xF76A: 0x9C66, - 0xF76B: 0x9C67, - 0xF76C: 0x9C68, - 0xF76D: 0x9C69, - 0xF76E: 0x9C6A, - 0xF76F: 0x9C6B, - 0xF770: 0x9C6C, - 0xF771: 0x9C6D, - 0xF772: 0x9C6E, - 0xF773: 0x9C6F, - 0xF774: 0x9C70, - 0xF775: 0x9C71, - 0xF776: 0x9C72, - 0xF777: 0x9C73, - 0xF778: 0x9C74, - 0xF779: 0x9C75, - 0xF77A: 0x9C76, - 0xF77B: 0x9C77, - 0xF77C: 0x9C78, - 0xF77D: 0x9C79, - 0xF77E: 0x9C7A, - 0xF780: 0x9C7B, - 0xF781: 0x9C7D, - 0xF782: 0x9C7E, - 0xF783: 0x9C80, - 0xF784: 0x9C83, - 0xF785: 0x9C84, - 0xF786: 0x9C89, - 0xF787: 0x9C8A, - 0xF788: 0x9C8C, - 0xF789: 0x9C8F, - 0xF78A: 0x9C93, - 0xF78B: 0x9C96, - 0xF78C: 0x9C97, - 0xF78D: 0x9C98, - 0xF78E: 0x9C99, - 0xF78F: 0x9C9D, - 0xF790: 0x9CAA, - 0xF791: 0x9CAC, - 0xF792: 0x9CAF, - 0xF793: 0x9CB9, - 0xF794: 0x9CBE, - 0xF795: 0x9CBF, - 0xF796: 0x9CC0, - 0xF797: 0x9CC1, - 0xF798: 0x9CC2, - 0xF799: 0x9CC8, - 0xF79A: 0x9CC9, - 0xF79B: 0x9CD1, - 0xF79C: 0x9CD2, - 0xF79D: 0x9CDA, - 0xF79E: 0x9CDB, - 0xF79F: 0x9CE0, - 0xF7A0: 0x9CE1, - 0xF7A1: 0x9CCC, - 0xF7A2: 0x9CCD, - 0xF7A3: 0x9CCE, - 0xF7A4: 0x9CCF, - 0xF7A5: 0x9CD0, - 0xF7A6: 0x9CD3, - 0xF7A7: 0x9CD4, - 0xF7A8: 0x9CD5, - 0xF7A9: 0x9CD7, - 0xF7AA: 0x9CD8, - 0xF7AB: 0x9CD9, - 0xF7AC: 0x9CDC, - 0xF7AD: 0x9CDD, - 0xF7AE: 0x9CDF, - 0xF7AF: 0x9CE2, - 0xF7B0: 0x977C, - 0xF7B1: 0x9785, - 0xF7B2: 0x9791, - 0xF7B3: 0x9792, - 0xF7B4: 0x9794, - 0xF7B5: 0x97AF, - 0xF7B6: 0x97AB, - 0xF7B7: 0x97A3, - 0xF7B8: 0x97B2, - 0xF7B9: 0x97B4, - 0xF7BA: 0x9AB1, - 0xF7BB: 0x9AB0, - 0xF7BC: 0x9AB7, - 0xF7BD: 0x9E58, - 0xF7BE: 0x9AB6, - 0xF7BF: 0x9ABA, - 0xF7C0: 0x9ABC, - 0xF7C1: 0x9AC1, - 0xF7C2: 0x9AC0, - 0xF7C3: 0x9AC5, - 0xF7C4: 0x9AC2, - 0xF7C5: 0x9ACB, - 0xF7C6: 0x9ACC, - 0xF7C7: 0x9AD1, - 0xF7C8: 0x9B45, - 0xF7C9: 0x9B43, - 0xF7CA: 0x9B47, - 0xF7CB: 0x9B49, - 0xF7CC: 0x9B48, - 0xF7CD: 0x9B4D, - 0xF7CE: 0x9B51, - 0xF7CF: 0x98E8, - 0xF7D0: 0x990D, - 0xF7D1: 0x992E, - 0xF7D2: 0x9955, - 0xF7D3: 0x9954, - 0xF7D4: 0x9ADF, - 0xF7D5: 0x9AE1, - 0xF7D6: 0x9AE6, - 0xF7D7: 0x9AEF, - 0xF7D8: 0x9AEB, - 0xF7D9: 0x9AFB, - 0xF7DA: 0x9AED, - 0xF7DB: 0x9AF9, - 0xF7DC: 0x9B08, - 0xF7DD: 0x9B0F, - 0xF7DE: 0x9B13, - 0xF7DF: 0x9B1F, - 0xF7E0: 0x9B23, - 0xF7E1: 0x9EBD, - 0xF7E2: 0x9EBE, - 0xF7E3: 0x7E3B, - 0xF7E4: 0x9E82, - 0xF7E5: 0x9E87, - 0xF7E6: 0x9E88, - 0xF7E7: 0x9E8B, - 0xF7E8: 0x9E92, - 0xF7E9: 0x93D6, - 0xF7EA: 0x9E9D, - 0xF7EB: 0x9E9F, - 0xF7EC: 0x9EDB, - 0xF7ED: 0x9EDC, - 0xF7EE: 0x9EDD, - 0xF7EF: 0x9EE0, - 0xF7F0: 0x9EDF, - 0xF7F1: 0x9EE2, - 0xF7F2: 0x9EE9, - 0xF7F3: 0x9EE7, - 0xF7F4: 0x9EE5, - 0xF7F5: 0x9EEA, - 0xF7F6: 0x9EEF, - 0xF7F7: 0x9F22, - 0xF7F8: 0x9F2C, - 0xF7F9: 0x9F2F, - 0xF7FA: 0x9F39, - 0xF7FB: 0x9F37, - 0xF7FC: 0x9F3D, - 0xF7FD: 0x9F3E, - 0xF7FE: 0x9F44, - 0xF840: 0x9CE3, - 0xF841: 0x9CE4, - 0xF842: 0x9CE5, - 0xF843: 0x9CE6, - 0xF844: 0x9CE7, - 0xF845: 0x9CE8, - 0xF846: 0x9CE9, - 0xF847: 0x9CEA, - 0xF848: 0x9CEB, - 0xF849: 0x9CEC, - 0xF84A: 0x9CED, - 0xF84B: 0x9CEE, - 0xF84C: 0x9CEF, - 0xF84D: 0x9CF0, - 0xF84E: 0x9CF1, - 0xF84F: 0x9CF2, - 0xF850: 0x9CF3, - 0xF851: 0x9CF4, - 0xF852: 0x9CF5, - 0xF853: 0x9CF6, - 0xF854: 0x9CF7, - 0xF855: 0x9CF8, - 0xF856: 0x9CF9, - 0xF857: 0x9CFA, - 0xF858: 0x9CFB, - 0xF859: 0x9CFC, - 0xF85A: 0x9CFD, - 0xF85B: 0x9CFE, - 0xF85C: 0x9CFF, - 0xF85D: 0x9D00, - 0xF85E: 0x9D01, - 0xF85F: 0x9D02, - 0xF860: 0x9D03, - 0xF861: 0x9D04, - 0xF862: 0x9D05, - 0xF863: 0x9D06, - 0xF864: 0x9D07, - 0xF865: 0x9D08, - 0xF866: 0x9D09, - 0xF867: 0x9D0A, - 0xF868: 0x9D0B, - 0xF869: 0x9D0C, - 0xF86A: 0x9D0D, - 0xF86B: 0x9D0E, - 0xF86C: 0x9D0F, - 0xF86D: 0x9D10, - 0xF86E: 0x9D11, - 0xF86F: 0x9D12, - 0xF870: 0x9D13, - 0xF871: 0x9D14, - 0xF872: 0x9D15, - 0xF873: 0x9D16, - 0xF874: 0x9D17, - 0xF875: 0x9D18, - 0xF876: 0x9D19, - 0xF877: 0x9D1A, - 0xF878: 0x9D1B, - 0xF879: 0x9D1C, - 0xF87A: 0x9D1D, - 0xF87B: 0x9D1E, - 0xF87C: 0x9D1F, - 0xF87D: 0x9D20, - 0xF87E: 0x9D21, - 0xF880: 0x9D22, - 0xF881: 0x9D23, - 0xF882: 0x9D24, - 0xF883: 0x9D25, - 0xF884: 0x9D26, - 0xF885: 0x9D27, - 0xF886: 0x9D28, - 0xF887: 0x9D29, - 0xF888: 0x9D2A, - 0xF889: 0x9D2B, - 0xF88A: 0x9D2C, - 0xF88B: 0x9D2D, - 0xF88C: 0x9D2E, - 0xF88D: 0x9D2F, - 0xF88E: 0x9D30, - 0xF88F: 0x9D31, - 0xF890: 0x9D32, - 0xF891: 0x9D33, - 0xF892: 0x9D34, - 0xF893: 0x9D35, - 0xF894: 0x9D36, - 0xF895: 0x9D37, - 0xF896: 0x9D38, - 0xF897: 0x9D39, - 0xF898: 0x9D3A, - 0xF899: 0x9D3B, - 0xF89A: 0x9D3C, - 0xF89B: 0x9D3D, - 0xF89C: 0x9D3E, - 0xF89D: 0x9D3F, - 0xF89E: 0x9D40, - 0xF89F: 0x9D41, - 0xF8A0: 0x9D42, - 0xF8A1: 0xE234, - 0xF8A2: 0xE235, - 0xF8A3: 0xE236, - 0xF8A4: 0xE237, - 0xF8A5: 0xE238, - 0xF8A6: 0xE239, - 0xF8A7: 0xE23A, - 0xF8A8: 0xE23B, - 0xF8A9: 0xE23C, - 0xF8AA: 0xE23D, - 0xF8AB: 0xE23E, - 0xF8AC: 0xE23F, - 0xF8AD: 0xE240, - 0xF8AE: 0xE241, - 0xF8AF: 0xE242, - 0xF8B0: 0xE243, - 0xF8B1: 0xE244, - 0xF8B2: 0xE245, - 0xF8B3: 0xE246, - 0xF8B4: 0xE247, - 0xF8B5: 0xE248, - 0xF8B6: 0xE249, - 0xF8B7: 0xE24A, - 0xF8B8: 0xE24B, - 0xF8B9: 0xE24C, - 0xF8BA: 0xE24D, - 0xF8BB: 0xE24E, - 0xF8BC: 0xE24F, - 0xF8BD: 0xE250, - 0xF8BE: 0xE251, - 0xF8BF: 0xE252, - 0xF8C0: 0xE253, - 0xF8C1: 0xE254, - 0xF8C2: 0xE255, - 0xF8C3: 0xE256, - 0xF8C4: 0xE257, - 0xF8C5: 0xE258, - 0xF8C6: 0xE259, - 0xF8C7: 0xE25A, - 0xF8C8: 0xE25B, - 0xF8C9: 0xE25C, - 0xF8CA: 0xE25D, - 0xF8CB: 0xE25E, - 0xF8CC: 0xE25F, - 0xF8CD: 0xE260, - 0xF8CE: 0xE261, - 0xF8CF: 0xE262, - 0xF8D0: 0xE263, - 0xF8D1: 0xE264, - 0xF8D2: 0xE265, - 0xF8D3: 0xE266, - 0xF8D4: 0xE267, - 0xF8D5: 0xE268, - 0xF8D6: 0xE269, - 0xF8D7: 0xE26A, - 0xF8D8: 0xE26B, - 0xF8D9: 0xE26C, - 0xF8DA: 0xE26D, - 0xF8DB: 0xE26E, - 0xF8DC: 0xE26F, - 0xF8DD: 0xE270, - 0xF8DE: 0xE271, - 0xF8DF: 0xE272, - 0xF8E0: 0xE273, - 0xF8E1: 0xE274, - 0xF8E2: 0xE275, - 0xF8E3: 0xE276, - 0xF8E4: 0xE277, - 0xF8E5: 0xE278, - 0xF8E6: 0xE279, - 0xF8E7: 0xE27A, - 0xF8E8: 0xE27B, - 0xF8E9: 0xE27C, - 0xF8EA: 0xE27D, - 0xF8EB: 0xE27E, - 0xF8EC: 0xE27F, - 0xF8ED: 0xE280, - 0xF8EE: 0xE281, - 0xF8EF: 0xE282, - 0xF8F0: 0xE283, - 0xF8F1: 0xE284, - 0xF8F2: 0xE285, - 0xF8F3: 0xE286, - 0xF8F4: 0xE287, - 0xF8F5: 0xE288, - 0xF8F6: 0xE289, - 0xF8F7: 0xE28A, - 0xF8F8: 0xE28B, - 0xF8F9: 0xE28C, - 0xF8FA: 0xE28D, - 0xF8FB: 0xE28E, - 0xF8FC: 0xE28F, - 0xF8FD: 0xE290, - 0xF8FE: 0xE291, - 0xF940: 0x9D43, - 0xF941: 0x9D44, - 0xF942: 0x9D45, - 0xF943: 0x9D46, - 0xF944: 0x9D47, - 0xF945: 0x9D48, - 0xF946: 0x9D49, - 0xF947: 0x9D4A, - 0xF948: 0x9D4B, - 0xF949: 0x9D4C, - 0xF94A: 0x9D4D, - 0xF94B: 0x9D4E, - 0xF94C: 0x9D4F, - 0xF94D: 0x9D50, - 0xF94E: 0x9D51, - 0xF94F: 0x9D52, - 0xF950: 0x9D53, - 0xF951: 0x9D54, - 0xF952: 0x9D55, - 0xF953: 0x9D56, - 0xF954: 0x9D57, - 0xF955: 0x9D58, - 0xF956: 0x9D59, - 0xF957: 0x9D5A, - 0xF958: 0x9D5B, - 0xF959: 0x9D5C, - 0xF95A: 0x9D5D, - 0xF95B: 0x9D5E, - 0xF95C: 0x9D5F, - 0xF95D: 0x9D60, - 0xF95E: 0x9D61, - 0xF95F: 0x9D62, - 0xF960: 0x9D63, - 0xF961: 0x9D64, - 0xF962: 0x9D65, - 0xF963: 0x9D66, - 0xF964: 0x9D67, - 0xF965: 0x9D68, - 0xF966: 0x9D69, - 0xF967: 0x9D6A, - 0xF968: 0x9D6B, - 0xF969: 0x9D6C, - 0xF96A: 0x9D6D, - 0xF96B: 0x9D6E, - 0xF96C: 0x9D6F, - 0xF96D: 0x9D70, - 0xF96E: 0x9D71, - 0xF96F: 0x9D72, - 0xF970: 0x9D73, - 0xF971: 0x9D74, - 0xF972: 0x9D75, - 0xF973: 0x9D76, - 0xF974: 0x9D77, - 0xF975: 0x9D78, - 0xF976: 0x9D79, - 0xF977: 0x9D7A, - 0xF978: 0x9D7B, - 0xF979: 0x9D7C, - 0xF97A: 0x9D7D, - 0xF97B: 0x9D7E, - 0xF97C: 0x9D7F, - 0xF97D: 0x9D80, - 0xF97E: 0x9D81, - 0xF980: 0x9D82, - 0xF981: 0x9D83, - 0xF982: 0x9D84, - 0xF983: 0x9D85, - 0xF984: 0x9D86, - 0xF985: 0x9D87, - 0xF986: 0x9D88, - 0xF987: 0x9D89, - 0xF988: 0x9D8A, - 0xF989: 0x9D8B, - 0xF98A: 0x9D8C, - 0xF98B: 0x9D8D, - 0xF98C: 0x9D8E, - 0xF98D: 0x9D8F, - 0xF98E: 0x9D90, - 0xF98F: 0x9D91, - 0xF990: 0x9D92, - 0xF991: 0x9D93, - 0xF992: 0x9D94, - 0xF993: 0x9D95, - 0xF994: 0x9D96, - 0xF995: 0x9D97, - 0xF996: 0x9D98, - 0xF997: 0x9D99, - 0xF998: 0x9D9A, - 0xF999: 0x9D9B, - 0xF99A: 0x9D9C, - 0xF99B: 0x9D9D, - 0xF99C: 0x9D9E, - 0xF99D: 0x9D9F, - 0xF99E: 0x9DA0, - 0xF99F: 0x9DA1, - 0xF9A0: 0x9DA2, - 0xF9A1: 0xE292, - 0xF9A2: 0xE293, - 0xF9A3: 0xE294, - 0xF9A4: 0xE295, - 0xF9A5: 0xE296, - 0xF9A6: 0xE297, - 0xF9A7: 0xE298, - 0xF9A8: 0xE299, - 0xF9A9: 0xE29A, - 0xF9AA: 0xE29B, - 0xF9AB: 0xE29C, - 0xF9AC: 0xE29D, - 0xF9AD: 0xE29E, - 0xF9AE: 0xE29F, - 0xF9AF: 0xE2A0, - 0xF9B0: 0xE2A1, - 0xF9B1: 0xE2A2, - 0xF9B2: 0xE2A3, - 0xF9B3: 0xE2A4, - 0xF9B4: 0xE2A5, - 0xF9B5: 0xE2A6, - 0xF9B6: 0xE2A7, - 0xF9B7: 0xE2A8, - 0xF9B8: 0xE2A9, - 0xF9B9: 0xE2AA, - 0xF9BA: 0xE2AB, - 0xF9BB: 0xE2AC, - 0xF9BC: 0xE2AD, - 0xF9BD: 0xE2AE, - 0xF9BE: 0xE2AF, - 0xF9BF: 0xE2B0, - 0xF9C0: 0xE2B1, - 0xF9C1: 0xE2B2, - 0xF9C2: 0xE2B3, - 0xF9C3: 0xE2B4, - 0xF9C4: 0xE2B5, - 0xF9C5: 0xE2B6, - 0xF9C6: 0xE2B7, - 0xF9C7: 0xE2B8, - 0xF9C8: 0xE2B9, - 0xF9C9: 0xE2BA, - 0xF9CA: 0xE2BB, - 0xF9CB: 0xE2BC, - 0xF9CC: 0xE2BD, - 0xF9CD: 0xE2BE, - 0xF9CE: 0xE2BF, - 0xF9CF: 0xE2C0, - 0xF9D0: 0xE2C1, - 0xF9D1: 0xE2C2, - 0xF9D2: 0xE2C3, - 0xF9D3: 0xE2C4, - 0xF9D4: 0xE2C5, - 0xF9D5: 0xE2C6, - 0xF9D6: 0xE2C7, - 0xF9D7: 0xE2C8, - 0xF9D8: 0xE2C9, - 0xF9D9: 0xE2CA, - 0xF9DA: 0xE2CB, - 0xF9DB: 0xE2CC, - 0xF9DC: 0xE2CD, - 0xF9DD: 0xE2CE, - 0xF9DE: 0xE2CF, - 0xF9DF: 0xE2D0, - 0xF9E0: 0xE2D1, - 0xF9E1: 0xE2D2, - 0xF9E2: 0xE2D3, - 0xF9E3: 0xE2D4, - 0xF9E4: 0xE2D5, - 0xF9E5: 0xE2D6, - 0xF9E6: 0xE2D7, - 0xF9E7: 0xE2D8, - 0xF9E8: 0xE2D9, - 0xF9E9: 0xE2DA, - 0xF9EA: 0xE2DB, - 0xF9EB: 0xE2DC, - 0xF9EC: 0xE2DD, - 0xF9ED: 0xE2DE, - 0xF9EE: 0xE2DF, - 0xF9EF: 0xE2E0, - 0xF9F0: 0xE2E1, - 0xF9F1: 0xE2E2, - 0xF9F2: 0xE2E3, - 0xF9F3: 0xE2E4, - 0xF9F4: 0xE2E5, - 0xF9F5: 0xE2E6, - 0xF9F6: 0xE2E7, - 0xF9F7: 0xE2E8, - 0xF9F8: 0xE2E9, - 0xF9F9: 0xE2EA, - 0xF9FA: 0xE2EB, - 0xF9FB: 0xE2EC, - 0xF9FC: 0xE2ED, - 0xF9FD: 0xE2EE, - 0xF9FE: 0xE2EF, - 0xFA40: 0x9DA3, - 0xFA41: 0x9DA4, - 0xFA42: 0x9DA5, - 0xFA43: 0x9DA6, - 0xFA44: 0x9DA7, - 0xFA45: 0x9DA8, - 0xFA46: 0x9DA9, - 0xFA47: 0x9DAA, - 0xFA48: 0x9DAB, - 0xFA49: 0x9DAC, - 0xFA4A: 0x9DAD, - 0xFA4B: 0x9DAE, - 0xFA4C: 0x9DAF, - 0xFA4D: 0x9DB0, - 0xFA4E: 0x9DB1, - 0xFA4F: 0x9DB2, - 0xFA50: 0x9DB3, - 0xFA51: 0x9DB4, - 0xFA52: 0x9DB5, - 0xFA53: 0x9DB6, - 0xFA54: 0x9DB7, - 0xFA55: 0x9DB8, - 0xFA56: 0x9DB9, - 0xFA57: 0x9DBA, - 0xFA58: 0x9DBB, - 0xFA59: 0x9DBC, - 0xFA5A: 0x9DBD, - 0xFA5B: 0x9DBE, - 0xFA5C: 0x9DBF, - 0xFA5D: 0x9DC0, - 0xFA5E: 0x9DC1, - 0xFA5F: 0x9DC2, - 0xFA60: 0x9DC3, - 0xFA61: 0x9DC4, - 0xFA62: 0x9DC5, - 0xFA63: 0x9DC6, - 0xFA64: 0x9DC7, - 0xFA65: 0x9DC8, - 0xFA66: 0x9DC9, - 0xFA67: 0x9DCA, - 0xFA68: 0x9DCB, - 0xFA69: 0x9DCC, - 0xFA6A: 0x9DCD, - 0xFA6B: 0x9DCE, - 0xFA6C: 0x9DCF, - 0xFA6D: 0x9DD0, - 0xFA6E: 0x9DD1, - 0xFA6F: 0x9DD2, - 0xFA70: 0x9DD3, - 0xFA71: 0x9DD4, - 0xFA72: 0x9DD5, - 0xFA73: 0x9DD6, - 0xFA74: 0x9DD7, - 0xFA75: 0x9DD8, - 0xFA76: 0x9DD9, - 0xFA77: 0x9DDA, - 0xFA78: 0x9DDB, - 0xFA79: 0x9DDC, - 0xFA7A: 0x9DDD, - 0xFA7B: 0x9DDE, - 0xFA7C: 0x9DDF, - 0xFA7D: 0x9DE0, - 0xFA7E: 0x9DE1, - 0xFA80: 0x9DE2, - 0xFA81: 0x9DE3, - 0xFA82: 0x9DE4, - 0xFA83: 0x9DE5, - 0xFA84: 0x9DE6, - 0xFA85: 0x9DE7, - 0xFA86: 0x9DE8, - 0xFA87: 0x9DE9, - 0xFA88: 0x9DEA, - 0xFA89: 0x9DEB, - 0xFA8A: 0x9DEC, - 0xFA8B: 0x9DED, - 0xFA8C: 0x9DEE, - 0xFA8D: 0x9DEF, - 0xFA8E: 0x9DF0, - 0xFA8F: 0x9DF1, - 0xFA90: 0x9DF2, - 0xFA91: 0x9DF3, - 0xFA92: 0x9DF4, - 0xFA93: 0x9DF5, - 0xFA94: 0x9DF6, - 0xFA95: 0x9DF7, - 0xFA96: 0x9DF8, - 0xFA97: 0x9DF9, - 0xFA98: 0x9DFA, - 0xFA99: 0x9DFB, - 0xFA9A: 0x9DFC, - 0xFA9B: 0x9DFD, - 0xFA9C: 0x9DFE, - 0xFA9D: 0x9DFF, - 0xFA9E: 0x9E00, - 0xFA9F: 0x9E01, - 0xFAA0: 0x9E02, - 0xFAA1: 0xE2F0, - 0xFAA2: 0xE2F1, - 0xFAA3: 0xE2F2, - 0xFAA4: 0xE2F3, - 0xFAA5: 0xE2F4, - 0xFAA6: 0xE2F5, - 0xFAA7: 0xE2F6, - 0xFAA8: 0xE2F7, - 0xFAA9: 0xE2F8, - 0xFAAA: 0xE2F9, - 0xFAAB: 0xE2FA, - 0xFAAC: 0xE2FB, - 0xFAAD: 0xE2FC, - 0xFAAE: 0xE2FD, - 0xFAAF: 0xE2FE, - 0xFAB0: 0xE2FF, - 0xFAB1: 0xE300, - 0xFAB2: 0xE301, - 0xFAB3: 0xE302, - 0xFAB4: 0xE303, - 0xFAB5: 0xE304, - 0xFAB6: 0xE305, - 0xFAB7: 0xE306, - 0xFAB8: 0xE307, - 0xFAB9: 0xE308, - 0xFABA: 0xE309, - 0xFABB: 0xE30A, - 0xFABC: 0xE30B, - 0xFABD: 0xE30C, - 0xFABE: 0xE30D, - 0xFABF: 0xE30E, - 0xFAC0: 0xE30F, - 0xFAC1: 0xE310, - 0xFAC2: 0xE311, - 0xFAC3: 0xE312, - 0xFAC4: 0xE313, - 0xFAC5: 0xE314, - 0xFAC6: 0xE315, - 0xFAC7: 0xE316, - 0xFAC8: 0xE317, - 0xFAC9: 0xE318, - 0xFACA: 0xE319, - 0xFACB: 0xE31A, - 0xFACC: 0xE31B, - 0xFACD: 0xE31C, - 0xFACE: 0xE31D, - 0xFACF: 0xE31E, - 0xFAD0: 0xE31F, - 0xFAD1: 0xE320, - 0xFAD2: 0xE321, - 0xFAD3: 0xE322, - 0xFAD4: 0xE323, - 0xFAD5: 0xE324, - 0xFAD6: 0xE325, - 0xFAD7: 0xE326, - 0xFAD8: 0xE327, - 0xFAD9: 0xE328, - 0xFADA: 0xE329, - 0xFADB: 0xE32A, - 0xFADC: 0xE32B, - 0xFADD: 0xE32C, - 0xFADE: 0xE32D, - 0xFADF: 0xE32E, - 0xFAE0: 0xE32F, - 0xFAE1: 0xE330, - 0xFAE2: 0xE331, - 0xFAE3: 0xE332, - 0xFAE4: 0xE333, - 0xFAE5: 0xE334, - 0xFAE6: 0xE335, - 0xFAE7: 0xE336, - 0xFAE8: 0xE337, - 0xFAE9: 0xE338, - 0xFAEA: 0xE339, - 0xFAEB: 0xE33A, - 0xFAEC: 0xE33B, - 0xFAED: 0xE33C, - 0xFAEE: 0xE33D, - 0xFAEF: 0xE33E, - 0xFAF0: 0xE33F, - 0xFAF1: 0xE340, - 0xFAF2: 0xE341, - 0xFAF3: 0xE342, - 0xFAF4: 0xE343, - 0xFAF5: 0xE344, - 0xFAF6: 0xE345, - 0xFAF7: 0xE346, - 0xFAF8: 0xE347, - 0xFAF9: 0xE348, - 0xFAFA: 0xE349, - 0xFAFB: 0xE34A, - 0xFAFC: 0xE34B, - 0xFAFD: 0xE34C, - 0xFAFE: 0xE34D, - 0xFB40: 0x9E03, - 0xFB41: 0x9E04, - 0xFB42: 0x9E05, - 0xFB43: 0x9E06, - 0xFB44: 0x9E07, - 0xFB45: 0x9E08, - 0xFB46: 0x9E09, - 0xFB47: 0x9E0A, - 0xFB48: 0x9E0B, - 0xFB49: 0x9E0C, - 0xFB4A: 0x9E0D, - 0xFB4B: 0x9E0E, - 0xFB4C: 0x9E0F, - 0xFB4D: 0x9E10, - 0xFB4E: 0x9E11, - 0xFB4F: 0x9E12, - 0xFB50: 0x9E13, - 0xFB51: 0x9E14, - 0xFB52: 0x9E15, - 0xFB53: 0x9E16, - 0xFB54: 0x9E17, - 0xFB55: 0x9E18, - 0xFB56: 0x9E19, - 0xFB57: 0x9E1A, - 0xFB58: 0x9E1B, - 0xFB59: 0x9E1C, - 0xFB5A: 0x9E1D, - 0xFB5B: 0x9E1E, - 0xFB5C: 0x9E24, - 0xFB5D: 0x9E27, - 0xFB5E: 0x9E2E, - 0xFB5F: 0x9E30, - 0xFB60: 0x9E34, - 0xFB61: 0x9E3B, - 0xFB62: 0x9E3C, - 0xFB63: 0x9E40, - 0xFB64: 0x9E4D, - 0xFB65: 0x9E50, - 0xFB66: 0x9E52, - 0xFB67: 0x9E53, - 0xFB68: 0x9E54, - 0xFB69: 0x9E56, - 0xFB6A: 0x9E59, - 0xFB6B: 0x9E5D, - 0xFB6C: 0x9E5F, - 0xFB6D: 0x9E60, - 0xFB6E: 0x9E61, - 0xFB6F: 0x9E62, - 0xFB70: 0x9E65, - 0xFB71: 0x9E6E, - 0xFB72: 0x9E6F, - 0xFB73: 0x9E72, - 0xFB74: 0x9E74, - 0xFB75: 0x9E75, - 0xFB76: 0x9E76, - 0xFB77: 0x9E77, - 0xFB78: 0x9E78, - 0xFB79: 0x9E79, - 0xFB7A: 0x9E7A, - 0xFB7B: 0x9E7B, - 0xFB7C: 0x9E7C, - 0xFB7D: 0x9E7D, - 0xFB7E: 0x9E80, - 0xFB80: 0x9E81, - 0xFB81: 0x9E83, - 0xFB82: 0x9E84, - 0xFB83: 0x9E85, - 0xFB84: 0x9E86, - 0xFB85: 0x9E89, - 0xFB86: 0x9E8A, - 0xFB87: 0x9E8C, - 0xFB88: 0x9E8D, - 0xFB89: 0x9E8E, - 0xFB8A: 0x9E8F, - 0xFB8B: 0x9E90, - 0xFB8C: 0x9E91, - 0xFB8D: 0x9E94, - 0xFB8E: 0x9E95, - 0xFB8F: 0x9E96, - 0xFB90: 0x9E97, - 0xFB91: 0x9E98, - 0xFB92: 0x9E99, - 0xFB93: 0x9E9A, - 0xFB94: 0x9E9B, - 0xFB95: 0x9E9C, - 0xFB96: 0x9E9E, - 0xFB97: 0x9EA0, - 0xFB98: 0x9EA1, - 0xFB99: 0x9EA2, - 0xFB9A: 0x9EA3, - 0xFB9B: 0x9EA4, - 0xFB9C: 0x9EA5, - 0xFB9D: 0x9EA7, - 0xFB9E: 0x9EA8, - 0xFB9F: 0x9EA9, - 0xFBA0: 0x9EAA, - 0xFBA1: 0xE34E, - 0xFBA2: 0xE34F, - 0xFBA3: 0xE350, - 0xFBA4: 0xE351, - 0xFBA5: 0xE352, - 0xFBA6: 0xE353, - 0xFBA7: 0xE354, - 0xFBA8: 0xE355, - 0xFBA9: 0xE356, - 0xFBAA: 0xE357, - 0xFBAB: 0xE358, - 0xFBAC: 0xE359, - 0xFBAD: 0xE35A, - 0xFBAE: 0xE35B, - 0xFBAF: 0xE35C, - 0xFBB0: 0xE35D, - 0xFBB1: 0xE35E, - 0xFBB2: 0xE35F, - 0xFBB3: 0xE360, - 0xFBB4: 0xE361, - 0xFBB5: 0xE362, - 0xFBB6: 0xE363, - 0xFBB7: 0xE364, - 0xFBB8: 0xE365, - 0xFBB9: 0xE366, - 0xFBBA: 0xE367, - 0xFBBB: 0xE368, - 0xFBBC: 0xE369, - 0xFBBD: 0xE36A, - 0xFBBE: 0xE36B, - 0xFBBF: 0xE36C, - 0xFBC0: 0xE36D, - 0xFBC1: 0xE36E, - 0xFBC2: 0xE36F, - 0xFBC3: 0xE370, - 0xFBC4: 0xE371, - 0xFBC5: 0xE372, - 0xFBC6: 0xE373, - 0xFBC7: 0xE374, - 0xFBC8: 0xE375, - 0xFBC9: 0xE376, - 0xFBCA: 0xE377, - 0xFBCB: 0xE378, - 0xFBCC: 0xE379, - 0xFBCD: 0xE37A, - 0xFBCE: 0xE37B, - 0xFBCF: 0xE37C, - 0xFBD0: 0xE37D, - 0xFBD1: 0xE37E, - 0xFBD2: 0xE37F, - 0xFBD3: 0xE380, - 0xFBD4: 0xE381, - 0xFBD5: 0xE382, - 0xFBD6: 0xE383, - 0xFBD7: 0xE384, - 0xFBD8: 0xE385, - 0xFBD9: 0xE386, - 0xFBDA: 0xE387, - 0xFBDB: 0xE388, - 0xFBDC: 0xE389, - 0xFBDD: 0xE38A, - 0xFBDE: 0xE38B, - 0xFBDF: 0xE38C, - 0xFBE0: 0xE38D, - 0xFBE1: 0xE38E, - 0xFBE2: 0xE38F, - 0xFBE3: 0xE390, - 0xFBE4: 0xE391, - 0xFBE5: 0xE392, - 0xFBE6: 0xE393, - 0xFBE7: 0xE394, - 0xFBE8: 0xE395, - 0xFBE9: 0xE396, - 0xFBEA: 0xE397, - 0xFBEB: 0xE398, - 0xFBEC: 0xE399, - 0xFBED: 0xE39A, - 0xFBEE: 0xE39B, - 0xFBEF: 0xE39C, - 0xFBF0: 0xE39D, - 0xFBF1: 0xE39E, - 0xFBF2: 0xE39F, - 0xFBF3: 0xE3A0, - 0xFBF4: 0xE3A1, - 0xFBF5: 0xE3A2, - 0xFBF6: 0xE3A3, - 0xFBF7: 0xE3A4, - 0xFBF8: 0xE3A5, - 0xFBF9: 0xE3A6, - 0xFBFA: 0xE3A7, - 0xFBFB: 0xE3A8, - 0xFBFC: 0xE3A9, - 0xFBFD: 0xE3AA, - 0xFBFE: 0xE3AB, - 0xFC40: 0x9EAB, - 0xFC41: 0x9EAC, - 0xFC42: 0x9EAD, - 0xFC43: 0x9EAE, - 0xFC44: 0x9EAF, - 0xFC45: 0x9EB0, - 0xFC46: 0x9EB1, - 0xFC47: 0x9EB2, - 0xFC48: 0x9EB3, - 0xFC49: 0x9EB5, - 0xFC4A: 0x9EB6, - 0xFC4B: 0x9EB7, - 0xFC4C: 0x9EB9, - 0xFC4D: 0x9EBA, - 0xFC4E: 0x9EBC, - 0xFC4F: 0x9EBF, - 0xFC50: 0x9EC0, - 0xFC51: 0x9EC1, - 0xFC52: 0x9EC2, - 0xFC53: 0x9EC3, - 0xFC54: 0x9EC5, - 0xFC55: 0x9EC6, - 0xFC56: 0x9EC7, - 0xFC57: 0x9EC8, - 0xFC58: 0x9ECA, - 0xFC59: 0x9ECB, - 0xFC5A: 0x9ECC, - 0xFC5B: 0x9ED0, - 0xFC5C: 0x9ED2, - 0xFC5D: 0x9ED3, - 0xFC5E: 0x9ED5, - 0xFC5F: 0x9ED6, - 0xFC60: 0x9ED7, - 0xFC61: 0x9ED9, - 0xFC62: 0x9EDA, - 0xFC63: 0x9EDE, - 0xFC64: 0x9EE1, - 0xFC65: 0x9EE3, - 0xFC66: 0x9EE4, - 0xFC67: 0x9EE6, - 0xFC68: 0x9EE8, - 0xFC69: 0x9EEB, - 0xFC6A: 0x9EEC, - 0xFC6B: 0x9EED, - 0xFC6C: 0x9EEE, - 0xFC6D: 0x9EF0, - 0xFC6E: 0x9EF1, - 0xFC6F: 0x9EF2, - 0xFC70: 0x9EF3, - 0xFC71: 0x9EF4, - 0xFC72: 0x9EF5, - 0xFC73: 0x9EF6, - 0xFC74: 0x9EF7, - 0xFC75: 0x9EF8, - 0xFC76: 0x9EFA, - 0xFC77: 0x9EFD, - 0xFC78: 0x9EFF, - 0xFC79: 0x9F00, - 0xFC7A: 0x9F01, - 0xFC7B: 0x9F02, - 0xFC7C: 0x9F03, - 0xFC7D: 0x9F04, - 0xFC7E: 0x9F05, - 0xFC80: 0x9F06, - 0xFC81: 0x9F07, - 0xFC82: 0x9F08, - 0xFC83: 0x9F09, - 0xFC84: 0x9F0A, - 0xFC85: 0x9F0C, - 0xFC86: 0x9F0F, - 0xFC87: 0x9F11, - 0xFC88: 0x9F12, - 0xFC89: 0x9F14, - 0xFC8A: 0x9F15, - 0xFC8B: 0x9F16, - 0xFC8C: 0x9F18, - 0xFC8D: 0x9F1A, - 0xFC8E: 0x9F1B, - 0xFC8F: 0x9F1C, - 0xFC90: 0x9F1D, - 0xFC91: 0x9F1E, - 0xFC92: 0x9F1F, - 0xFC93: 0x9F21, - 0xFC94: 0x9F23, - 0xFC95: 0x9F24, - 0xFC96: 0x9F25, - 0xFC97: 0x9F26, - 0xFC98: 0x9F27, - 0xFC99: 0x9F28, - 0xFC9A: 0x9F29, - 0xFC9B: 0x9F2A, - 0xFC9C: 0x9F2B, - 0xFC9D: 0x9F2D, - 0xFC9E: 0x9F2E, - 0xFC9F: 0x9F30, - 0xFCA0: 0x9F31, - 0xFCA1: 0xE3AC, - 0xFCA2: 0xE3AD, - 0xFCA3: 0xE3AE, - 0xFCA4: 0xE3AF, - 0xFCA5: 0xE3B0, - 0xFCA6: 0xE3B1, - 0xFCA7: 0xE3B2, - 0xFCA8: 0xE3B3, - 0xFCA9: 0xE3B4, - 0xFCAA: 0xE3B5, - 0xFCAB: 0xE3B6, - 0xFCAC: 0xE3B7, - 0xFCAD: 0xE3B8, - 0xFCAE: 0xE3B9, - 0xFCAF: 0xE3BA, - 0xFCB0: 0xE3BB, - 0xFCB1: 0xE3BC, - 0xFCB2: 0xE3BD, - 0xFCB3: 0xE3BE, - 0xFCB4: 0xE3BF, - 0xFCB5: 0xE3C0, - 0xFCB6: 0xE3C1, - 0xFCB7: 0xE3C2, - 0xFCB8: 0xE3C3, - 0xFCB9: 0xE3C4, - 0xFCBA: 0xE3C5, - 0xFCBB: 0xE3C6, - 0xFCBC: 0xE3C7, - 0xFCBD: 0xE3C8, - 0xFCBE: 0xE3C9, - 0xFCBF: 0xE3CA, - 0xFCC0: 0xE3CB, - 0xFCC1: 0xE3CC, - 0xFCC2: 0xE3CD, - 0xFCC3: 0xE3CE, - 0xFCC4: 0xE3CF, - 0xFCC5: 0xE3D0, - 0xFCC6: 0xE3D1, - 0xFCC7: 0xE3D2, - 0xFCC8: 0xE3D3, - 0xFCC9: 0xE3D4, - 0xFCCA: 0xE3D5, - 0xFCCB: 0xE3D6, - 0xFCCC: 0xE3D7, - 0xFCCD: 0xE3D8, - 0xFCCE: 0xE3D9, - 0xFCCF: 0xE3DA, - 0xFCD0: 0xE3DB, - 0xFCD1: 0xE3DC, - 0xFCD2: 0xE3DD, - 0xFCD3: 0xE3DE, - 0xFCD4: 0xE3DF, - 0xFCD5: 0xE3E0, - 0xFCD6: 0xE3E1, - 0xFCD7: 0xE3E2, - 0xFCD8: 0xE3E3, - 0xFCD9: 0xE3E4, - 0xFCDA: 0xE3E5, - 0xFCDB: 0xE3E6, - 0xFCDC: 0xE3E7, - 0xFCDD: 0xE3E8, - 0xFCDE: 0xE3E9, - 0xFCDF: 0xE3EA, - 0xFCE0: 0xE3EB, - 0xFCE1: 0xE3EC, - 0xFCE2: 0xE3ED, - 0xFCE3: 0xE3EE, - 0xFCE4: 0xE3EF, - 0xFCE5: 0xE3F0, - 0xFCE6: 0xE3F1, - 0xFCE7: 0xE3F2, - 0xFCE8: 0xE3F3, - 0xFCE9: 0xE3F4, - 0xFCEA: 0xE3F5, - 0xFCEB: 0xE3F6, - 0xFCEC: 0xE3F7, - 0xFCED: 0xE3F8, - 0xFCEE: 0xE3F9, - 0xFCEF: 0xE3FA, - 0xFCF0: 0xE3FB, - 0xFCF1: 0xE3FC, - 0xFCF2: 0xE3FD, - 0xFCF3: 0xE3FE, - 0xFCF4: 0xE3FF, - 0xFCF5: 0xE400, - 0xFCF6: 0xE401, - 0xFCF7: 0xE402, - 0xFCF8: 0xE403, - 0xFCF9: 0xE404, - 0xFCFA: 0xE405, - 0xFCFB: 0xE406, - 0xFCFC: 0xE407, - 0xFCFD: 0xE408, - 0xFCFE: 0xE409, - 0xFD40: 0x9F32, - 0xFD41: 0x9F33, - 0xFD42: 0x9F34, - 0xFD43: 0x9F35, - 0xFD44: 0x9F36, - 0xFD45: 0x9F38, - 0xFD46: 0x9F3A, - 0xFD47: 0x9F3C, - 0xFD48: 0x9F3F, - 0xFD49: 0x9F40, - 0xFD4A: 0x9F41, - 0xFD4B: 0x9F42, - 0xFD4C: 0x9F43, - 0xFD4D: 0x9F45, - 0xFD4E: 0x9F46, - 0xFD4F: 0x9F47, - 0xFD50: 0x9F48, - 0xFD51: 0x9F49, - 0xFD52: 0x9F4A, - 0xFD53: 0x9F4B, - 0xFD54: 0x9F4C, - 0xFD55: 0x9F4D, - 0xFD56: 0x9F4E, - 0xFD57: 0x9F4F, - 0xFD58: 0x9F52, - 0xFD59: 0x9F53, - 0xFD5A: 0x9F54, - 0xFD5B: 0x9F55, - 0xFD5C: 0x9F56, - 0xFD5D: 0x9F57, - 0xFD5E: 0x9F58, - 0xFD5F: 0x9F59, - 0xFD60: 0x9F5A, - 0xFD61: 0x9F5B, - 0xFD62: 0x9F5C, - 0xFD63: 0x9F5D, - 0xFD64: 0x9F5E, - 0xFD65: 0x9F5F, - 0xFD66: 0x9F60, - 0xFD67: 0x9F61, - 0xFD68: 0x9F62, - 0xFD69: 0x9F63, - 0xFD6A: 0x9F64, - 0xFD6B: 0x9F65, - 0xFD6C: 0x9F66, - 0xFD6D: 0x9F67, - 0xFD6E: 0x9F68, - 0xFD6F: 0x9F69, - 0xFD70: 0x9F6A, - 0xFD71: 0x9F6B, - 0xFD72: 0x9F6C, - 0xFD73: 0x9F6D, - 0xFD74: 0x9F6E, - 0xFD75: 0x9F6F, - 0xFD76: 0x9F70, - 0xFD77: 0x9F71, - 0xFD78: 0x9F72, - 0xFD79: 0x9F73, - 0xFD7A: 0x9F74, - 0xFD7B: 0x9F75, - 0xFD7C: 0x9F76, - 0xFD7D: 0x9F77, - 0xFD7E: 0x9F78, - 0xFD80: 0x9F79, - 0xFD81: 0x9F7A, - 0xFD82: 0x9F7B, - 0xFD83: 0x9F7C, - 0xFD84: 0x9F7D, - 0xFD85: 0x9F7E, - 0xFD86: 0x9F81, - 0xFD87: 0x9F82, - 0xFD88: 0x9F8D, - 0xFD89: 0x9F8E, - 0xFD8A: 0x9F8F, - 0xFD8B: 0x9F90, - 0xFD8C: 0x9F91, - 0xFD8D: 0x9F92, - 0xFD8E: 0x9F93, - 0xFD8F: 0x9F94, - 0xFD90: 0x9F95, - 0xFD91: 0x9F96, - 0xFD92: 0x9F97, - 0xFD93: 0x9F98, - 0xFD94: 0x9F9C, - 0xFD95: 0x9F9D, - 0xFD96: 0x9F9E, - 0xFD97: 0x9FA1, - 0xFD98: 0x9FA2, - 0xFD99: 0x9FA3, - 0xFD9A: 0x9FA4, - 0xFD9B: 0x9FA5, - 0xFD9C: 0xF92C, - 0xFD9D: 0xF979, - 0xFD9E: 0xF995, - 0xFD9F: 0xF9E7, - 0xFDA0: 0xF9F1, - 0xFDA1: 0xE40A, - 0xFDA2: 0xE40B, - 0xFDA3: 0xE40C, - 0xFDA4: 0xE40D, - 0xFDA5: 0xE40E, - 0xFDA6: 0xE40F, - 0xFDA7: 0xE410, - 0xFDA8: 0xE411, - 0xFDA9: 0xE412, - 0xFDAA: 0xE413, - 0xFDAB: 0xE414, - 0xFDAC: 0xE415, - 0xFDAD: 0xE416, - 0xFDAE: 0xE417, - 0xFDAF: 0xE418, - 0xFDB0: 0xE419, - 0xFDB1: 0xE41A, - 0xFDB2: 0xE41B, - 0xFDB3: 0xE41C, - 0xFDB4: 0xE41D, - 0xFDB5: 0xE41E, - 0xFDB6: 0xE41F, - 0xFDB7: 0xE420, - 0xFDB8: 0xE421, - 0xFDB9: 0xE422, - 0xFDBA: 0xE423, - 0xFDBB: 0xE424, - 0xFDBC: 0xE425, - 0xFDBD: 0xE426, - 0xFDBE: 0xE427, - 0xFDBF: 0xE428, - 0xFDC0: 0xE429, - 0xFDC1: 0xE42A, - 0xFDC2: 0xE42B, - 0xFDC3: 0xE42C, - 0xFDC4: 0xE42D, - 0xFDC5: 0xE42E, - 0xFDC6: 0xE42F, - 0xFDC7: 0xE430, - 0xFDC8: 0xE431, - 0xFDC9: 0xE432, - 0xFDCA: 0xE433, - 0xFDCB: 0xE434, - 0xFDCC: 0xE435, - 0xFDCD: 0xE436, - 0xFDCE: 0xE437, - 0xFDCF: 0xE438, - 0xFDD0: 0xE439, - 0xFDD1: 0xE43A, - 0xFDD2: 0xE43B, - 0xFDD3: 0xE43C, - 0xFDD4: 0xE43D, - 0xFDD5: 0xE43E, - 0xFDD6: 0xE43F, - 0xFDD7: 0xE440, - 0xFDD8: 0xE441, - 0xFDD9: 0xE442, - 0xFDDA: 0xE443, - 0xFDDB: 0xE444, - 0xFDDC: 0xE445, - 0xFDDD: 0xE446, - 0xFDDE: 0xE447, - 0xFDDF: 0xE448, - 0xFDE0: 0xE449, - 0xFDE1: 0xE44A, - 0xFDE2: 0xE44B, - 0xFDE3: 0xE44C, - 0xFDE4: 0xE44D, - 0xFDE5: 0xE44E, - 0xFDE6: 0xE44F, - 0xFDE7: 0xE450, - 0xFDE8: 0xE451, - 0xFDE9: 0xE452, - 0xFDEA: 0xE453, - 0xFDEB: 0xE454, - 0xFDEC: 0xE455, - 0xFDED: 0xE456, - 0xFDEE: 0xE457, - 0xFDEF: 0xE458, - 0xFDF0: 0xE459, - 0xFDF1: 0xE45A, - 0xFDF2: 0xE45B, - 0xFDF3: 0xE45C, - 0xFDF4: 0xE45D, - 0xFDF5: 0xE45E, - 0xFDF6: 0xE45F, - 0xFDF7: 0xE460, - 0xFDF8: 0xE461, - 0xFDF9: 0xE462, - 0xFDFA: 0xE463, - 0xFDFB: 0xE464, - 0xFDFC: 0xE465, - 0xFDFD: 0xE466, - 0xFDFE: 0xE467, - 0xFE40: 0xFA0C, - 0xFE41: 0xFA0D, - 0xFE42: 0xFA0E, - 0xFE43: 0xFA0F, - 0xFE44: 0xFA11, - 0xFE45: 0xFA13, - 0xFE46: 0xFA14, - 0xFE47: 0xFA18, - 0xFE48: 0xFA1F, - 0xFE49: 0xFA20, - 0xFE4A: 0xFA21, - 0xFE4B: 0xFA23, - 0xFE4C: 0xFA24, - 0xFE4D: 0xFA27, - 0xFE4E: 0xFA28, - 0xFE4F: 0xFA29, - 0xFE50: 0x2E81, - 0xFE54: 0x2E84, - 0xFE55: 0x3473, - 0xFE56: 0x3447, - 0xFE57: 0x2E88, - 0xFE58: 0x2E8B, - 0xFE59: 0x9FB4, - 0xFE5A: 0x359E, - 0xFE5B: 0x361A, - 0xFE5C: 0x360E, - 0xFE5D: 0x2E8C, - 0xFE5E: 0x2E97, - 0xFE5F: 0x396E, - 0xFE60: 0x3918, - 0xFE61: 0x9FB5, - 0xFE62: 0x39CF, - 0xFE63: 0x39DF, - 0xFE64: 0x3A73, - 0xFE65: 0x39D0, - 0xFE66: 0x9FB6, - 0xFE67: 0x9FB7, - 0xFE68: 0x3B4E, - 0xFE69: 0x3C6E, - 0xFE6A: 0x3CE0, - 0xFE6B: 0x2EA7, - 0xFE6D: 0x9FB8, - 0xFE6E: 0x2EAA, - 0xFE6F: 0x4056, - 0xFE70: 0x415F, - 0xFE71: 0x2EAE, - 0xFE72: 0x4337, - 0xFE73: 0x2EB3, - 0xFE74: 0x2EB6, - 0xFE75: 0x2EB7, - 0xFE77: 0x43B1, - 0xFE78: 0x43AC, - 0xFE79: 0x2EBB, - 0xFE7A: 0x43DD, - 0xFE7B: 0x44D6, - 0xFE7C: 0x4661, - 0xFE7D: 0x464C, - 0xFE7E: 0x9FB9, - 0xFE80: 0x4723, - 0xFE81: 0x4729, - 0xFE82: 0x477C, - 0xFE83: 0x478D, - 0xFE84: 0x2ECA, - 0xFE85: 0x4947, - 0xFE86: 0x497A, - 0xFE87: 0x497D, - 0xFE88: 0x4982, - 0xFE89: 0x4983, - 0xFE8A: 0x4985, - 0xFE8B: 0x4986, - 0xFE8C: 0x499F, - 0xFE8D: 0x499B, - 0xFE8E: 0x49B7, - 0xFE8F: 0x49B6, - 0xFE90: 0x9FBA, - 0xFE92: 0x4CA3, - 0xFE93: 0x4C9F, - 0xFE94: 0x4CA0, - 0xFE95: 0x4CA1, - 0xFE96: 0x4C77, - 0xFE97: 0x4CA2, - 0xFE98: 0x4D13, - 0xFE99: 0x4D14, - 0xFE9A: 0x4D15, - 0xFE9B: 0x4D16, - 0xFE9C: 0x4D17, - 0xFE9D: 0x4D18, - 0xFE9E: 0x4D19, - 0xFE9F: 0x4DAE, - 0xFEA0: 0x9FBB, - 0xFEA1: 0xE468, - 0xFEA2: 0xE469, - 0xFEA3: 0xE46A, - 0xFEA4: 0xE46B, - 0xFEA5: 0xE46C, - 0xFEA6: 0xE46D, - 0xFEA7: 0xE46E, - 0xFEA8: 0xE46F, - 0xFEA9: 0xE470, - 0xFEAA: 0xE471, - 0xFEAB: 0xE472, - 0xFEAC: 0xE473, - 0xFEAD: 0xE474, - 0xFEAE: 0xE475, - 0xFEAF: 0xE476, - 0xFEB0: 0xE477, - 0xFEB1: 0xE478, - 0xFEB2: 0xE479, - 0xFEB3: 0xE47A, - 0xFEB4: 0xE47B, - 0xFEB5: 0xE47C, - 0xFEB6: 0xE47D, - 0xFEB7: 0xE47E, - 0xFEB8: 0xE47F, - 0xFEB9: 0xE480, - 0xFEBA: 0xE481, - 0xFEBB: 0xE482, - 0xFEBC: 0xE483, - 0xFEBD: 0xE484, - 0xFEBE: 0xE485, - 0xFEBF: 0xE486, - 0xFEC0: 0xE487, - 0xFEC1: 0xE488, - 0xFEC2: 0xE489, - 0xFEC3: 0xE48A, - 0xFEC4: 0xE48B, - 0xFEC5: 0xE48C, - 0xFEC6: 0xE48D, - 0xFEC7: 0xE48E, - 0xFEC8: 0xE48F, - 0xFEC9: 0xE490, - 0xFECA: 0xE491, - 0xFECB: 0xE492, - 0xFECC: 0xE493, - 0xFECD: 0xE494, - 0xFECE: 0xE495, - 0xFECF: 0xE496, - 0xFED0: 0xE497, - 0xFED1: 0xE498, - 0xFED2: 0xE499, - 0xFED3: 0xE49A, - 0xFED4: 0xE49B, - 0xFED5: 0xE49C, - 0xFED6: 0xE49D, - 0xFED7: 0xE49E, - 0xFED8: 0xE49F, - 0xFED9: 0xE4A0, - 0xFEDA: 0xE4A1, - 0xFEDB: 0xE4A2, - 0xFEDC: 0xE4A3, - 0xFEDD: 0xE4A4, - 0xFEDE: 0xE4A5, - 0xFEDF: 0xE4A6, - 0xFEE0: 0xE4A7, - 0xFEE1: 0xE4A8, - 0xFEE2: 0xE4A9, - 0xFEE3: 0xE4AA, - 0xFEE4: 0xE4AB, - 0xFEE5: 0xE4AC, - 0xFEE6: 0xE4AD, - 0xFEE7: 0xE4AE, - 0xFEE8: 0xE4AF, - 0xFEE9: 0xE4B0, - 0xFEEA: 0xE4B1, - 0xFEEB: 0xE4B2, - 0xFEEC: 0xE4B3, - 0xFEED: 0xE4B4, - 0xFEEE: 0xE4B5, - 0xFEEF: 0xE4B6, - 0xFEF0: 0xE4B7, - 0xFEF1: 0xE4B8, - 0xFEF2: 0xE4B9, - 0xFEF3: 0xE4BA, - 0xFEF4: 0xE4BB, - 0xFEF5: 0xE4BC, - 0xFEF6: 0xE4BD, - 0xFEF7: 0xE4BE, - 0xFEF8: 0xE4BF, - 0xFEF9: 0xE4C0, - 0xFEFA: 0xE4C1, - 0xFEFB: 0xE4C2, - 0xFEFC: 0xE4C3, - 0xFEFD: 0xE4C4, - 0xFEFE: 0xE4C5, -} diff --git a/vendor/github.com/axgle/mahonia/gbk.go b/vendor/github.com/axgle/mahonia/gbk.go deleted file mode 100644 index c7617c6..0000000 --- a/vendor/github.com/axgle/mahonia/gbk.go +++ /dev/null @@ -1,77 +0,0 @@ -package mahonia - -// Converters for GBK encoding. - -func init() { - RegisterCharset(&Charset{ - Name: "GBK", - NewDecoder: func() Decoder { - return decodeGBKRune - }, - NewEncoder: func() Encoder { - return encodeGBKRune - }, - }) -} - -func decodeGBKRune(p []byte) (r rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - b := p[0] - if b < 128 { - return rune(b), 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - c := uint16(p[0])<<8 + uint16(p[1]) - r = rune(gbkToUnicode[c]) - if r == 0 { - r = gbkToUnicodeExtra[c] - } - - if r != 0 { - return r, 2, SUCCESS - } - - return 0xfffd, 1, INVALID_CHAR -} - -func encodeGBKRune(p []byte, r rune) (size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if r < 128 { - p[0] = byte(r) - return 1, SUCCESS - } - - if len(p) < 2 { - status = NO_ROOM - return - } - - var c uint16 - if r < 0x10000 { - c = unicodeToGBK[r] - } else { - c = unicodeToGBKExtra[r] - } - - if c != 0 { - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - - p[0] = 0x1a - return 1, INVALID_CHAR -} diff --git a/vendor/github.com/axgle/mahonia/jis0201-data.go b/vendor/github.com/axgle/mahonia/jis0201-data.go deleted file mode 100644 index e46a3ad..0000000 --- a/vendor/github.com/axgle/mahonia/jis0201-data.go +++ /dev/null @@ -1,162 +0,0 @@ -package mahonia - -var jis0201ToUnicode = [256]uint16{ - 0x20: 0x0020, // SPACE - 0x21: 0x0021, // EXCLAMATION MARK - 0x22: 0x0022, // QUOTATION MARK - 0x23: 0x0023, // NUMBER SIGN - 0x24: 0x0024, // DOLLAR SIGN - 0x25: 0x0025, // PERCENT SIGN - 0x26: 0x0026, // AMPERSAND - 0x27: 0x0027, // APOSTROPHE - 0x28: 0x0028, // LEFT PARENTHESIS - 0x29: 0x0029, // RIGHT PARENTHESIS - 0x2A: 0x002A, // ASTERISK - 0x2B: 0x002B, // PLUS SIGN - 0x2C: 0x002C, // COMMA - 0x2D: 0x002D, // HYPHEN-MINUS - 0x2E: 0x002E, // FULL STOP - 0x2F: 0x002F, // SOLIDUS - 0x30: 0x0030, // DIGIT ZERO - 0x31: 0x0031, // DIGIT ONE - 0x32: 0x0032, // DIGIT TWO - 0x33: 0x0033, // DIGIT THREE - 0x34: 0x0034, // DIGIT FOUR - 0x35: 0x0035, // DIGIT FIVE - 0x36: 0x0036, // DIGIT SIX - 0x37: 0x0037, // DIGIT SEVEN - 0x38: 0x0038, // DIGIT EIGHT - 0x39: 0x0039, // DIGIT NINE - 0x3A: 0x003A, // COLON - 0x3B: 0x003B, // SEMICOLON - 0x3C: 0x003C, // LESS-THAN SIGN - 0x3D: 0x003D, // EQUALS SIGN - 0x3E: 0x003E, // GREATER-THAN SIGN - 0x3F: 0x003F, // QUESTION MARK - 0x40: 0x0040, // COMMERCIAL AT - 0x41: 0x0041, // LATIN CAPITAL LETTER A - 0x42: 0x0042, // LATIN CAPITAL LETTER B - 0x43: 0x0043, // LATIN CAPITAL LETTER C - 0x44: 0x0044, // LATIN CAPITAL LETTER D - 0x45: 0x0045, // LATIN CAPITAL LETTER E - 0x46: 0x0046, // LATIN CAPITAL LETTER F - 0x47: 0x0047, // LATIN CAPITAL LETTER G - 0x48: 0x0048, // LATIN CAPITAL LETTER H - 0x49: 0x0049, // LATIN CAPITAL LETTER I - 0x4A: 0x004A, // LATIN CAPITAL LETTER J - 0x4B: 0x004B, // LATIN CAPITAL LETTER K - 0x4C: 0x004C, // LATIN CAPITAL LETTER L - 0x4D: 0x004D, // LATIN CAPITAL LETTER M - 0x4E: 0x004E, // LATIN CAPITAL LETTER N - 0x4F: 0x004F, // LATIN CAPITAL LETTER O - 0x50: 0x0050, // LATIN CAPITAL LETTER P - 0x51: 0x0051, // LATIN CAPITAL LETTER Q - 0x52: 0x0052, // LATIN CAPITAL LETTER R - 0x53: 0x0053, // LATIN CAPITAL LETTER S - 0x54: 0x0054, // LATIN CAPITAL LETTER T - 0x55: 0x0055, // LATIN CAPITAL LETTER U - 0x56: 0x0056, // LATIN CAPITAL LETTER V - 0x57: 0x0057, // LATIN CAPITAL LETTER W - 0x58: 0x0058, // LATIN CAPITAL LETTER X - 0x59: 0x0059, // LATIN CAPITAL LETTER Y - 0x5A: 0x005A, // LATIN CAPITAL LETTER Z - 0x5B: 0x005B, // LEFT SQUARE BRACKET - 0x5C: 0x00A5, // YEN SIGN - 0x5D: 0x005D, // RIGHT SQUARE BRACKET - 0x5E: 0x005E, // CIRCUMFLEX ACCENT - 0x5F: 0x005F, // LOW LINE - 0x60: 0x0060, // GRAVE ACCENT - 0x61: 0x0061, // LATIN SMALL LETTER A - 0x62: 0x0062, // LATIN SMALL LETTER B - 0x63: 0x0063, // LATIN SMALL LETTER C - 0x64: 0x0064, // LATIN SMALL LETTER D - 0x65: 0x0065, // LATIN SMALL LETTER E - 0x66: 0x0066, // LATIN SMALL LETTER F - 0x67: 0x0067, // LATIN SMALL LETTER G - 0x68: 0x0068, // LATIN SMALL LETTER H - 0x69: 0x0069, // LATIN SMALL LETTER I - 0x6A: 0x006A, // LATIN SMALL LETTER J - 0x6B: 0x006B, // LATIN SMALL LETTER K - 0x6C: 0x006C, // LATIN SMALL LETTER L - 0x6D: 0x006D, // LATIN SMALL LETTER M - 0x6E: 0x006E, // LATIN SMALL LETTER N - 0x6F: 0x006F, // LATIN SMALL LETTER O - 0x70: 0x0070, // LATIN SMALL LETTER P - 0x71: 0x0071, // LATIN SMALL LETTER Q - 0x72: 0x0072, // LATIN SMALL LETTER R - 0x73: 0x0073, // LATIN SMALL LETTER S - 0x74: 0x0074, // LATIN SMALL LETTER T - 0x75: 0x0075, // LATIN SMALL LETTER U - 0x76: 0x0076, // LATIN SMALL LETTER V - 0x77: 0x0077, // LATIN SMALL LETTER W - 0x78: 0x0078, // LATIN SMALL LETTER X - 0x79: 0x0079, // LATIN SMALL LETTER Y - 0x7A: 0x007A, // LATIN SMALL LETTER Z - 0x7B: 0x007B, // LEFT CURLY BRACKET - 0x7C: 0x007C, // VERTICAL LINE - 0x7D: 0x007D, // RIGHT CURLY BRACKET - 0x7E: 0x203E, // OVERLINE - 0xA1: 0xFF61, // HALFWIDTH IDEOGRAPHIC FULL STOP - 0xA2: 0xFF62, // HALFWIDTH LEFT CORNER BRACKET - 0xA3: 0xFF63, // HALFWIDTH RIGHT CORNER BRACKET - 0xA4: 0xFF64, // HALFWIDTH IDEOGRAPHIC COMMA - 0xA5: 0xFF65, // HALFWIDTH KATAKANA MIDDLE DOT - 0xA6: 0xFF66, // HALFWIDTH KATAKANA LETTER WO - 0xA7: 0xFF67, // HALFWIDTH KATAKANA LETTER SMALL A - 0xA8: 0xFF68, // HALFWIDTH KATAKANA LETTER SMALL I - 0xA9: 0xFF69, // HALFWIDTH KATAKANA LETTER SMALL U - 0xAA: 0xFF6A, // HALFWIDTH KATAKANA LETTER SMALL E - 0xAB: 0xFF6B, // HALFWIDTH KATAKANA LETTER SMALL O - 0xAC: 0xFF6C, // HALFWIDTH KATAKANA LETTER SMALL YA - 0xAD: 0xFF6D, // HALFWIDTH KATAKANA LETTER SMALL YU - 0xAE: 0xFF6E, // HALFWIDTH KATAKANA LETTER SMALL YO - 0xAF: 0xFF6F, // HALFWIDTH KATAKANA LETTER SMALL TU - 0xB0: 0xFF70, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK - 0xB1: 0xFF71, // HALFWIDTH KATAKANA LETTER A - 0xB2: 0xFF72, // HALFWIDTH KATAKANA LETTER I - 0xB3: 0xFF73, // HALFWIDTH KATAKANA LETTER U - 0xB4: 0xFF74, // HALFWIDTH KATAKANA LETTER E - 0xB5: 0xFF75, // HALFWIDTH KATAKANA LETTER O - 0xB6: 0xFF76, // HALFWIDTH KATAKANA LETTER KA - 0xB7: 0xFF77, // HALFWIDTH KATAKANA LETTER KI - 0xB8: 0xFF78, // HALFWIDTH KATAKANA LETTER KU - 0xB9: 0xFF79, // HALFWIDTH KATAKANA LETTER KE - 0xBA: 0xFF7A, // HALFWIDTH KATAKANA LETTER KO - 0xBB: 0xFF7B, // HALFWIDTH KATAKANA LETTER SA - 0xBC: 0xFF7C, // HALFWIDTH KATAKANA LETTER SI - 0xBD: 0xFF7D, // HALFWIDTH KATAKANA LETTER SU - 0xBE: 0xFF7E, // HALFWIDTH KATAKANA LETTER SE - 0xBF: 0xFF7F, // HALFWIDTH KATAKANA LETTER SO - 0xC0: 0xFF80, // HALFWIDTH KATAKANA LETTER TA - 0xC1: 0xFF81, // HALFWIDTH KATAKANA LETTER TI - 0xC2: 0xFF82, // HALFWIDTH KATAKANA LETTER TU - 0xC3: 0xFF83, // HALFWIDTH KATAKANA LETTER TE - 0xC4: 0xFF84, // HALFWIDTH KATAKANA LETTER TO - 0xC5: 0xFF85, // HALFWIDTH KATAKANA LETTER NA - 0xC6: 0xFF86, // HALFWIDTH KATAKANA LETTER NI - 0xC7: 0xFF87, // HALFWIDTH KATAKANA LETTER NU - 0xC8: 0xFF88, // HALFWIDTH KATAKANA LETTER NE - 0xC9: 0xFF89, // HALFWIDTH KATAKANA LETTER NO - 0xCA: 0xFF8A, // HALFWIDTH KATAKANA LETTER HA - 0xCB: 0xFF8B, // HALFWIDTH KATAKANA LETTER HI - 0xCC: 0xFF8C, // HALFWIDTH KATAKANA LETTER HU - 0xCD: 0xFF8D, // HALFWIDTH KATAKANA LETTER HE - 0xCE: 0xFF8E, // HALFWIDTH KATAKANA LETTER HO - 0xCF: 0xFF8F, // HALFWIDTH KATAKANA LETTER MA - 0xD0: 0xFF90, // HALFWIDTH KATAKANA LETTER MI - 0xD1: 0xFF91, // HALFWIDTH KATAKANA LETTER MU - 0xD2: 0xFF92, // HALFWIDTH KATAKANA LETTER ME - 0xD3: 0xFF93, // HALFWIDTH KATAKANA LETTER MO - 0xD4: 0xFF94, // HALFWIDTH KATAKANA LETTER YA - 0xD5: 0xFF95, // HALFWIDTH KATAKANA LETTER YU - 0xD6: 0xFF96, // HALFWIDTH KATAKANA LETTER YO - 0xD7: 0xFF97, // HALFWIDTH KATAKANA LETTER RA - 0xD8: 0xFF98, // HALFWIDTH KATAKANA LETTER RI - 0xD9: 0xFF99, // HALFWIDTH KATAKANA LETTER RU - 0xDA: 0xFF9A, // HALFWIDTH KATAKANA LETTER RE - 0xDB: 0xFF9B, // HALFWIDTH KATAKANA LETTER RO - 0xDC: 0xFF9C, // HALFWIDTH KATAKANA LETTER WA - 0xDD: 0xFF9D, // HALFWIDTH KATAKANA LETTER N - 0xDE: 0xFF9E, // HALFWIDTH KATAKANA VOICED SOUND MARK - 0xDF: 0xFF9F, // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -} diff --git a/vendor/github.com/axgle/mahonia/jis0208-data.go b/vendor/github.com/axgle/mahonia/jis0208-data.go deleted file mode 100644 index 66571dc..0000000 --- a/vendor/github.com/axgle/mahonia/jis0208-data.go +++ /dev/null @@ -1,6883 +0,0 @@ -package mahonia - -var jis0208ToUnicode = [65536]uint16{ - 0x2121: 0x3000, // IDEOGRAPHIC SPACE - 0x2122: 0x3001, // IDEOGRAPHIC COMMA - 0x2123: 0x3002, // IDEOGRAPHIC FULL STOP - 0x2124: 0xFF0C, // FULLWIDTH COMMA - 0x2125: 0xFF0E, // FULLWIDTH FULL STOP - 0x2126: 0x30FB, // KATAKANA MIDDLE DOT - 0x2127: 0xFF1A, // FULLWIDTH COLON - 0x2128: 0xFF1B, // FULLWIDTH SEMICOLON - 0x2129: 0xFF1F, // FULLWIDTH QUESTION MARK - 0x212A: 0xFF01, // FULLWIDTH EXCLAMATION MARK - 0x212B: 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK - 0x212C: 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - 0x212D: 0x00B4, // ACUTE ACCENT - 0x212E: 0xFF40, // FULLWIDTH GRAVE ACCENT - 0x212F: 0x00A8, // DIAERESIS - 0x2130: 0xFF3E, // FULLWIDTH CIRCUMFLEX ACCENT - 0x2131: 0xFFE3, // FULLWIDTH MACRON - 0x2132: 0xFF3F, // FULLWIDTH LOW LINE - 0x2133: 0x30FD, // KATAKANA ITERATION MARK - 0x2134: 0x30FE, // KATAKANA VOICED ITERATION MARK - 0x2135: 0x309D, // HIRAGANA ITERATION MARK - 0x2136: 0x309E, // HIRAGANA VOICED ITERATION MARK - 0x2137: 0x3003, // DITTO MARK - 0x2138: 0x4EDD, - 0x2139: 0x3005, // IDEOGRAPHIC ITERATION MARK - 0x213A: 0x3006, // IDEOGRAPHIC CLOSING MARK - 0x213B: 0x3007, // IDEOGRAPHIC NUMBER ZERO - 0x213C: 0x30FC, // KATAKANA-HIRAGANA PROLONGED SOUND MARK - 0x213D: 0x2015, // HORIZONTAL BAR - 0x213E: 0x2010, // HYPHEN - 0x213F: 0xFF0F, // FULLWIDTH SOLIDUS - 0x2140: 0x005C, // REVERSE SOLIDUS - 0x2141: 0x301C, // WAVE DASH - 0x2142: 0x2016, // DOUBLE VERTICAL LINE - 0x2143: 0xFF5C, // FULLWIDTH VERTICAL LINE - 0x2144: 0x2026, // HORIZONTAL ELLIPSIS - 0x2145: 0x2025, // TWO DOT LEADER - 0x2146: 0x2018, // LEFT SINGLE QUOTATION MARK - 0x2147: 0x2019, // RIGHT SINGLE QUOTATION MARK - 0x2148: 0x201C, // LEFT DOUBLE QUOTATION MARK - 0x2149: 0x201D, // RIGHT DOUBLE QUOTATION MARK - 0x214A: 0xFF08, // FULLWIDTH LEFT PARENTHESIS - 0x214B: 0xFF09, // FULLWIDTH RIGHT PARENTHESIS - 0x214C: 0x3014, // LEFT TORTOISE SHELL BRACKET - 0x214D: 0x3015, // RIGHT TORTOISE SHELL BRACKET - 0x214E: 0xFF3B, // FULLWIDTH LEFT SQUARE BRACKET - 0x214F: 0xFF3D, // FULLWIDTH RIGHT SQUARE BRACKET - 0x2150: 0xFF5B, // FULLWIDTH LEFT CURLY BRACKET - 0x2151: 0xFF5D, // FULLWIDTH RIGHT CURLY BRACKET - 0x2152: 0x3008, // LEFT ANGLE BRACKET - 0x2153: 0x3009, // RIGHT ANGLE BRACKET - 0x2154: 0x300A, // LEFT DOUBLE ANGLE BRACKET - 0x2155: 0x300B, // RIGHT DOUBLE ANGLE BRACKET - 0x2156: 0x300C, // LEFT CORNER BRACKET - 0x2157: 0x300D, // RIGHT CORNER BRACKET - 0x2158: 0x300E, // LEFT WHITE CORNER BRACKET - 0x2159: 0x300F, // RIGHT WHITE CORNER BRACKET - 0x215A: 0x3010, // LEFT BLACK LENTICULAR BRACKET - 0x215B: 0x3011, // RIGHT BLACK LENTICULAR BRACKET - 0x215C: 0xFF0B, // FULLWIDTH PLUS SIGN - 0x215D: 0x2212, // MINUS SIGN - 0x215E: 0x00B1, // PLUS-MINUS SIGN - 0x215F: 0x00D7, // MULTIPLICATION SIGN - 0x2160: 0x00F7, // DIVISION SIGN - 0x2161: 0xFF1D, // FULLWIDTH EQUALS SIGN - 0x2162: 0x2260, // NOT EQUAL TO - 0x2163: 0xFF1C, // FULLWIDTH LESS-THAN SIGN - 0x2164: 0xFF1E, // FULLWIDTH GREATER-THAN SIGN - 0x2165: 0x2266, // LESS-THAN OVER EQUAL TO - 0x2166: 0x2267, // GREATER-THAN OVER EQUAL TO - 0x2167: 0x221E, // INFINITY - 0x2168: 0x2234, // THEREFORE - 0x2169: 0x2642, // MALE SIGN - 0x216A: 0x2640, // FEMALE SIGN - 0x216B: 0x00B0, // DEGREE SIGN - 0x216C: 0x2032, // PRIME - 0x216D: 0x2033, // DOUBLE PRIME - 0x216E: 0x2103, // DEGREE CELSIUS - 0x216F: 0xFFE5, // FULLWIDTH YEN SIGN - 0x2170: 0xFF04, // FULLWIDTH DOLLAR SIGN - 0x2171: 0x00A2, // CENT SIGN - 0x2172: 0x00A3, // POUND SIGN - 0x2173: 0xFF05, // FULLWIDTH PERCENT SIGN - 0x2174: 0xFF03, // FULLWIDTH NUMBER SIGN - 0x2175: 0xFF06, // FULLWIDTH AMPERSAND - 0x2176: 0xFF0A, // FULLWIDTH ASTERISK - 0x2177: 0xFF20, // FULLWIDTH COMMERCIAL AT - 0x2178: 0x00A7, // SECTION SIGN - 0x2179: 0x2606, // WHITE STAR - 0x217A: 0x2605, // BLACK STAR - 0x217B: 0x25CB, // WHITE CIRCLE - 0x217C: 0x25CF, // BLACK CIRCLE - 0x217D: 0x25CE, // BULLSEYE - 0x217E: 0x25C7, // WHITE DIAMOND - 0x2221: 0x25C6, // BLACK DIAMOND - 0x2222: 0x25A1, // WHITE SQUARE - 0x2223: 0x25A0, // BLACK SQUARE - 0x2224: 0x25B3, // WHITE UP-POINTING TRIANGLE - 0x2225: 0x25B2, // BLACK UP-POINTING TRIANGLE - 0x2226: 0x25BD, // WHITE DOWN-POINTING TRIANGLE - 0x2227: 0x25BC, // BLACK DOWN-POINTING TRIANGLE - 0x2228: 0x203B, // REFERENCE MARK - 0x2229: 0x3012, // POSTAL MARK - 0x222A: 0x2192, // RIGHTWARDS ARROW - 0x222B: 0x2190, // LEFTWARDS ARROW - 0x222C: 0x2191, // UPWARDS ARROW - 0x222D: 0x2193, // DOWNWARDS ARROW - 0x222E: 0x3013, // GETA MARK - 0x223A: 0x2208, // ELEMENT OF - 0x223B: 0x220B, // CONTAINS AS MEMBER - 0x223C: 0x2286, // SUBSET OF OR EQUAL TO - 0x223D: 0x2287, // SUPERSET OF OR EQUAL TO - 0x223E: 0x2282, // SUBSET OF - 0x223F: 0x2283, // SUPERSET OF - 0x2240: 0x222A, // UNION - 0x2241: 0x2229, // INTERSECTION - 0x224A: 0x2227, // LOGICAL AND - 0x224B: 0x2228, // LOGICAL OR - 0x224C: 0x00AC, // NOT SIGN - 0x224D: 0x21D2, // RIGHTWARDS DOUBLE ARROW - 0x224E: 0x21D4, // LEFT RIGHT DOUBLE ARROW - 0x224F: 0x2200, // FOR ALL - 0x2250: 0x2203, // THERE EXISTS - 0x225C: 0x2220, // ANGLE - 0x225D: 0x22A5, // UP TACK - 0x225E: 0x2312, // ARC - 0x225F: 0x2202, // PARTIAL DIFFERENTIAL - 0x2260: 0x2207, // NABLA - 0x2261: 0x2261, // IDENTICAL TO - 0x2262: 0x2252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF - 0x2263: 0x226A, // MUCH LESS-THAN - 0x2264: 0x226B, // MUCH GREATER-THAN - 0x2265: 0x221A, // SQUARE ROOT - 0x2266: 0x223D, // REVERSED TILDE - 0x2267: 0x221D, // PROPORTIONAL TO - 0x2268: 0x2235, // BECAUSE - 0x2269: 0x222B, // INTEGRAL - 0x226A: 0x222C, // DOUBLE INTEGRAL - 0x2272: 0x212B, // ANGSTROM SIGN - 0x2273: 0x2030, // PER MILLE SIGN - 0x2274: 0x266F, // MUSIC SHARP SIGN - 0x2275: 0x266D, // MUSIC FLAT SIGN - 0x2276: 0x266A, // EIGHTH NOTE - 0x2277: 0x2020, // DAGGER - 0x2278: 0x2021, // DOUBLE DAGGER - 0x2279: 0x00B6, // PILCROW SIGN - 0x227E: 0x25EF, // LARGE CIRCLE - 0x2330: 0xFF10, // FULLWIDTH DIGIT ZERO - 0x2331: 0xFF11, // FULLWIDTH DIGIT ONE - 0x2332: 0xFF12, // FULLWIDTH DIGIT TWO - 0x2333: 0xFF13, // FULLWIDTH DIGIT THREE - 0x2334: 0xFF14, // FULLWIDTH DIGIT FOUR - 0x2335: 0xFF15, // FULLWIDTH DIGIT FIVE - 0x2336: 0xFF16, // FULLWIDTH DIGIT SIX - 0x2337: 0xFF17, // FULLWIDTH DIGIT SEVEN - 0x2338: 0xFF18, // FULLWIDTH DIGIT EIGHT - 0x2339: 0xFF19, // FULLWIDTH DIGIT NINE - 0x2341: 0xFF21, // FULLWIDTH LATIN CAPITAL LETTER A - 0x2342: 0xFF22, // FULLWIDTH LATIN CAPITAL LETTER B - 0x2343: 0xFF23, // FULLWIDTH LATIN CAPITAL LETTER C - 0x2344: 0xFF24, // FULLWIDTH LATIN CAPITAL LETTER D - 0x2345: 0xFF25, // FULLWIDTH LATIN CAPITAL LETTER E - 0x2346: 0xFF26, // FULLWIDTH LATIN CAPITAL LETTER F - 0x2347: 0xFF27, // FULLWIDTH LATIN CAPITAL LETTER G - 0x2348: 0xFF28, // FULLWIDTH LATIN CAPITAL LETTER H - 0x2349: 0xFF29, // FULLWIDTH LATIN CAPITAL LETTER I - 0x234A: 0xFF2A, // FULLWIDTH LATIN CAPITAL LETTER J - 0x234B: 0xFF2B, // FULLWIDTH LATIN CAPITAL LETTER K - 0x234C: 0xFF2C, // FULLWIDTH LATIN CAPITAL LETTER L - 0x234D: 0xFF2D, // FULLWIDTH LATIN CAPITAL LETTER M - 0x234E: 0xFF2E, // FULLWIDTH LATIN CAPITAL LETTER N - 0x234F: 0xFF2F, // FULLWIDTH LATIN CAPITAL LETTER O - 0x2350: 0xFF30, // FULLWIDTH LATIN CAPITAL LETTER P - 0x2351: 0xFF31, // FULLWIDTH LATIN CAPITAL LETTER Q - 0x2352: 0xFF32, // FULLWIDTH LATIN CAPITAL LETTER R - 0x2353: 0xFF33, // FULLWIDTH LATIN CAPITAL LETTER S - 0x2354: 0xFF34, // FULLWIDTH LATIN CAPITAL LETTER T - 0x2355: 0xFF35, // FULLWIDTH LATIN CAPITAL LETTER U - 0x2356: 0xFF36, // FULLWIDTH LATIN CAPITAL LETTER V - 0x2357: 0xFF37, // FULLWIDTH LATIN CAPITAL LETTER W - 0x2358: 0xFF38, // FULLWIDTH LATIN CAPITAL LETTER X - 0x2359: 0xFF39, // FULLWIDTH LATIN CAPITAL LETTER Y - 0x235A: 0xFF3A, // FULLWIDTH LATIN CAPITAL LETTER Z - 0x2361: 0xFF41, // FULLWIDTH LATIN SMALL LETTER A - 0x2362: 0xFF42, // FULLWIDTH LATIN SMALL LETTER B - 0x2363: 0xFF43, // FULLWIDTH LATIN SMALL LETTER C - 0x2364: 0xFF44, // FULLWIDTH LATIN SMALL LETTER D - 0x2365: 0xFF45, // FULLWIDTH LATIN SMALL LETTER E - 0x2366: 0xFF46, // FULLWIDTH LATIN SMALL LETTER F - 0x2367: 0xFF47, // FULLWIDTH LATIN SMALL LETTER G - 0x2368: 0xFF48, // FULLWIDTH LATIN SMALL LETTER H - 0x2369: 0xFF49, // FULLWIDTH LATIN SMALL LETTER I - 0x236A: 0xFF4A, // FULLWIDTH LATIN SMALL LETTER J - 0x236B: 0xFF4B, // FULLWIDTH LATIN SMALL LETTER K - 0x236C: 0xFF4C, // FULLWIDTH LATIN SMALL LETTER L - 0x236D: 0xFF4D, // FULLWIDTH LATIN SMALL LETTER M - 0x236E: 0xFF4E, // FULLWIDTH LATIN SMALL LETTER N - 0x236F: 0xFF4F, // FULLWIDTH LATIN SMALL LETTER O - 0x2370: 0xFF50, // FULLWIDTH LATIN SMALL LETTER P - 0x2371: 0xFF51, // FULLWIDTH LATIN SMALL LETTER Q - 0x2372: 0xFF52, // FULLWIDTH LATIN SMALL LETTER R - 0x2373: 0xFF53, // FULLWIDTH LATIN SMALL LETTER S - 0x2374: 0xFF54, // FULLWIDTH LATIN SMALL LETTER T - 0x2375: 0xFF55, // FULLWIDTH LATIN SMALL LETTER U - 0x2376: 0xFF56, // FULLWIDTH LATIN SMALL LETTER V - 0x2377: 0xFF57, // FULLWIDTH LATIN SMALL LETTER W - 0x2378: 0xFF58, // FULLWIDTH LATIN SMALL LETTER X - 0x2379: 0xFF59, // FULLWIDTH LATIN SMALL LETTER Y - 0x237A: 0xFF5A, // FULLWIDTH LATIN SMALL LETTER Z - 0x2421: 0x3041, // HIRAGANA LETTER SMALL A - 0x2422: 0x3042, // HIRAGANA LETTER A - 0x2423: 0x3043, // HIRAGANA LETTER SMALL I - 0x2424: 0x3044, // HIRAGANA LETTER I - 0x2425: 0x3045, // HIRAGANA LETTER SMALL U - 0x2426: 0x3046, // HIRAGANA LETTER U - 0x2427: 0x3047, // HIRAGANA LETTER SMALL E - 0x2428: 0x3048, // HIRAGANA LETTER E - 0x2429: 0x3049, // HIRAGANA LETTER SMALL O - 0x242A: 0x304A, // HIRAGANA LETTER O - 0x242B: 0x304B, // HIRAGANA LETTER KA - 0x242C: 0x304C, // HIRAGANA LETTER GA - 0x242D: 0x304D, // HIRAGANA LETTER KI - 0x242E: 0x304E, // HIRAGANA LETTER GI - 0x242F: 0x304F, // HIRAGANA LETTER KU - 0x2430: 0x3050, // HIRAGANA LETTER GU - 0x2431: 0x3051, // HIRAGANA LETTER KE - 0x2432: 0x3052, // HIRAGANA LETTER GE - 0x2433: 0x3053, // HIRAGANA LETTER KO - 0x2434: 0x3054, // HIRAGANA LETTER GO - 0x2435: 0x3055, // HIRAGANA LETTER SA - 0x2436: 0x3056, // HIRAGANA LETTER ZA - 0x2437: 0x3057, // HIRAGANA LETTER SI - 0x2438: 0x3058, // HIRAGANA LETTER ZI - 0x2439: 0x3059, // HIRAGANA LETTER SU - 0x243A: 0x305A, // HIRAGANA LETTER ZU - 0x243B: 0x305B, // HIRAGANA LETTER SE - 0x243C: 0x305C, // HIRAGANA LETTER ZE - 0x243D: 0x305D, // HIRAGANA LETTER SO - 0x243E: 0x305E, // HIRAGANA LETTER ZO - 0x243F: 0x305F, // HIRAGANA LETTER TA - 0x2440: 0x3060, // HIRAGANA LETTER DA - 0x2441: 0x3061, // HIRAGANA LETTER TI - 0x2442: 0x3062, // HIRAGANA LETTER DI - 0x2443: 0x3063, // HIRAGANA LETTER SMALL TU - 0x2444: 0x3064, // HIRAGANA LETTER TU - 0x2445: 0x3065, // HIRAGANA LETTER DU - 0x2446: 0x3066, // HIRAGANA LETTER TE - 0x2447: 0x3067, // HIRAGANA LETTER DE - 0x2448: 0x3068, // HIRAGANA LETTER TO - 0x2449: 0x3069, // HIRAGANA LETTER DO - 0x244A: 0x306A, // HIRAGANA LETTER NA - 0x244B: 0x306B, // HIRAGANA LETTER NI - 0x244C: 0x306C, // HIRAGANA LETTER NU - 0x244D: 0x306D, // HIRAGANA LETTER NE - 0x244E: 0x306E, // HIRAGANA LETTER NO - 0x244F: 0x306F, // HIRAGANA LETTER HA - 0x2450: 0x3070, // HIRAGANA LETTER BA - 0x2451: 0x3071, // HIRAGANA LETTER PA - 0x2452: 0x3072, // HIRAGANA LETTER HI - 0x2453: 0x3073, // HIRAGANA LETTER BI - 0x2454: 0x3074, // HIRAGANA LETTER PI - 0x2455: 0x3075, // HIRAGANA LETTER HU - 0x2456: 0x3076, // HIRAGANA LETTER BU - 0x2457: 0x3077, // HIRAGANA LETTER PU - 0x2458: 0x3078, // HIRAGANA LETTER HE - 0x2459: 0x3079, // HIRAGANA LETTER BE - 0x245A: 0x307A, // HIRAGANA LETTER PE - 0x245B: 0x307B, // HIRAGANA LETTER HO - 0x245C: 0x307C, // HIRAGANA LETTER BO - 0x245D: 0x307D, // HIRAGANA LETTER PO - 0x245E: 0x307E, // HIRAGANA LETTER MA - 0x245F: 0x307F, // HIRAGANA LETTER MI - 0x2460: 0x3080, // HIRAGANA LETTER MU - 0x2461: 0x3081, // HIRAGANA LETTER ME - 0x2462: 0x3082, // HIRAGANA LETTER MO - 0x2463: 0x3083, // HIRAGANA LETTER SMALL YA - 0x2464: 0x3084, // HIRAGANA LETTER YA - 0x2465: 0x3085, // HIRAGANA LETTER SMALL YU - 0x2466: 0x3086, // HIRAGANA LETTER YU - 0x2467: 0x3087, // HIRAGANA LETTER SMALL YO - 0x2468: 0x3088, // HIRAGANA LETTER YO - 0x2469: 0x3089, // HIRAGANA LETTER RA - 0x246A: 0x308A, // HIRAGANA LETTER RI - 0x246B: 0x308B, // HIRAGANA LETTER RU - 0x246C: 0x308C, // HIRAGANA LETTER RE - 0x246D: 0x308D, // HIRAGANA LETTER RO - 0x246E: 0x308E, // HIRAGANA LETTER SMALL WA - 0x246F: 0x308F, // HIRAGANA LETTER WA - 0x2470: 0x3090, // HIRAGANA LETTER WI - 0x2471: 0x3091, // HIRAGANA LETTER WE - 0x2472: 0x3092, // HIRAGANA LETTER WO - 0x2473: 0x3093, // HIRAGANA LETTER N - 0x2521: 0x30A1, // KATAKANA LETTER SMALL A - 0x2522: 0x30A2, // KATAKANA LETTER A - 0x2523: 0x30A3, // KATAKANA LETTER SMALL I - 0x2524: 0x30A4, // KATAKANA LETTER I - 0x2525: 0x30A5, // KATAKANA LETTER SMALL U - 0x2526: 0x30A6, // KATAKANA LETTER U - 0x2527: 0x30A7, // KATAKANA LETTER SMALL E - 0x2528: 0x30A8, // KATAKANA LETTER E - 0x2529: 0x30A9, // KATAKANA LETTER SMALL O - 0x252A: 0x30AA, // KATAKANA LETTER O - 0x252B: 0x30AB, // KATAKANA LETTER KA - 0x252C: 0x30AC, // KATAKANA LETTER GA - 0x252D: 0x30AD, // KATAKANA LETTER KI - 0x252E: 0x30AE, // KATAKANA LETTER GI - 0x252F: 0x30AF, // KATAKANA LETTER KU - 0x2530: 0x30B0, // KATAKANA LETTER GU - 0x2531: 0x30B1, // KATAKANA LETTER KE - 0x2532: 0x30B2, // KATAKANA LETTER GE - 0x2533: 0x30B3, // KATAKANA LETTER KO - 0x2534: 0x30B4, // KATAKANA LETTER GO - 0x2535: 0x30B5, // KATAKANA LETTER SA - 0x2536: 0x30B6, // KATAKANA LETTER ZA - 0x2537: 0x30B7, // KATAKANA LETTER SI - 0x2538: 0x30B8, // KATAKANA LETTER ZI - 0x2539: 0x30B9, // KATAKANA LETTER SU - 0x253A: 0x30BA, // KATAKANA LETTER ZU - 0x253B: 0x30BB, // KATAKANA LETTER SE - 0x253C: 0x30BC, // KATAKANA LETTER ZE - 0x253D: 0x30BD, // KATAKANA LETTER SO - 0x253E: 0x30BE, // KATAKANA LETTER ZO - 0x253F: 0x30BF, // KATAKANA LETTER TA - 0x2540: 0x30C0, // KATAKANA LETTER DA - 0x2541: 0x30C1, // KATAKANA LETTER TI - 0x2542: 0x30C2, // KATAKANA LETTER DI - 0x2543: 0x30C3, // KATAKANA LETTER SMALL TU - 0x2544: 0x30C4, // KATAKANA LETTER TU - 0x2545: 0x30C5, // KATAKANA LETTER DU - 0x2546: 0x30C6, // KATAKANA LETTER TE - 0x2547: 0x30C7, // KATAKANA LETTER DE - 0x2548: 0x30C8, // KATAKANA LETTER TO - 0x2549: 0x30C9, // KATAKANA LETTER DO - 0x254A: 0x30CA, // KATAKANA LETTER NA - 0x254B: 0x30CB, // KATAKANA LETTER NI - 0x254C: 0x30CC, // KATAKANA LETTER NU - 0x254D: 0x30CD, // KATAKANA LETTER NE - 0x254E: 0x30CE, // KATAKANA LETTER NO - 0x254F: 0x30CF, // KATAKANA LETTER HA - 0x2550: 0x30D0, // KATAKANA LETTER BA - 0x2551: 0x30D1, // KATAKANA LETTER PA - 0x2552: 0x30D2, // KATAKANA LETTER HI - 0x2553: 0x30D3, // KATAKANA LETTER BI - 0x2554: 0x30D4, // KATAKANA LETTER PI - 0x2555: 0x30D5, // KATAKANA LETTER HU - 0x2556: 0x30D6, // KATAKANA LETTER BU - 0x2557: 0x30D7, // KATAKANA LETTER PU - 0x2558: 0x30D8, // KATAKANA LETTER HE - 0x2559: 0x30D9, // KATAKANA LETTER BE - 0x255A: 0x30DA, // KATAKANA LETTER PE - 0x255B: 0x30DB, // KATAKANA LETTER HO - 0x255C: 0x30DC, // KATAKANA LETTER BO - 0x255D: 0x30DD, // KATAKANA LETTER PO - 0x255E: 0x30DE, // KATAKANA LETTER MA - 0x255F: 0x30DF, // KATAKANA LETTER MI - 0x2560: 0x30E0, // KATAKANA LETTER MU - 0x2561: 0x30E1, // KATAKANA LETTER ME - 0x2562: 0x30E2, // KATAKANA LETTER MO - 0x2563: 0x30E3, // KATAKANA LETTER SMALL YA - 0x2564: 0x30E4, // KATAKANA LETTER YA - 0x2565: 0x30E5, // KATAKANA LETTER SMALL YU - 0x2566: 0x30E6, // KATAKANA LETTER YU - 0x2567: 0x30E7, // KATAKANA LETTER SMALL YO - 0x2568: 0x30E8, // KATAKANA LETTER YO - 0x2569: 0x30E9, // KATAKANA LETTER RA - 0x256A: 0x30EA, // KATAKANA LETTER RI - 0x256B: 0x30EB, // KATAKANA LETTER RU - 0x256C: 0x30EC, // KATAKANA LETTER RE - 0x256D: 0x30ED, // KATAKANA LETTER RO - 0x256E: 0x30EE, // KATAKANA LETTER SMALL WA - 0x256F: 0x30EF, // KATAKANA LETTER WA - 0x2570: 0x30F0, // KATAKANA LETTER WI - 0x2571: 0x30F1, // KATAKANA LETTER WE - 0x2572: 0x30F2, // KATAKANA LETTER WO - 0x2573: 0x30F3, // KATAKANA LETTER N - 0x2574: 0x30F4, // KATAKANA LETTER VU - 0x2575: 0x30F5, // KATAKANA LETTER SMALL KA - 0x2576: 0x30F6, // KATAKANA LETTER SMALL KE - 0x2621: 0x0391, // GREEK CAPITAL LETTER ALPHA - 0x2622: 0x0392, // GREEK CAPITAL LETTER BETA - 0x2623: 0x0393, // GREEK CAPITAL LETTER GAMMA - 0x2624: 0x0394, // GREEK CAPITAL LETTER DELTA - 0x2625: 0x0395, // GREEK CAPITAL LETTER EPSILON - 0x2626: 0x0396, // GREEK CAPITAL LETTER ZETA - 0x2627: 0x0397, // GREEK CAPITAL LETTER ETA - 0x2628: 0x0398, // GREEK CAPITAL LETTER THETA - 0x2629: 0x0399, // GREEK CAPITAL LETTER IOTA - 0x262A: 0x039A, // GREEK CAPITAL LETTER KAPPA - 0x262B: 0x039B, // GREEK CAPITAL LETTER LAMDA - 0x262C: 0x039C, // GREEK CAPITAL LETTER MU - 0x262D: 0x039D, // GREEK CAPITAL LETTER NU - 0x262E: 0x039E, // GREEK CAPITAL LETTER XI - 0x262F: 0x039F, // GREEK CAPITAL LETTER OMICRON - 0x2630: 0x03A0, // GREEK CAPITAL LETTER PI - 0x2631: 0x03A1, // GREEK CAPITAL LETTER RHO - 0x2632: 0x03A3, // GREEK CAPITAL LETTER SIGMA - 0x2633: 0x03A4, // GREEK CAPITAL LETTER TAU - 0x2634: 0x03A5, // GREEK CAPITAL LETTER UPSILON - 0x2635: 0x03A6, // GREEK CAPITAL LETTER PHI - 0x2636: 0x03A7, // GREEK CAPITAL LETTER CHI - 0x2637: 0x03A8, // GREEK CAPITAL LETTER PSI - 0x2638: 0x03A9, // GREEK CAPITAL LETTER OMEGA - 0x2641: 0x03B1, // GREEK SMALL LETTER ALPHA - 0x2642: 0x03B2, // GREEK SMALL LETTER BETA - 0x2643: 0x03B3, // GREEK SMALL LETTER GAMMA - 0x2644: 0x03B4, // GREEK SMALL LETTER DELTA - 0x2645: 0x03B5, // GREEK SMALL LETTER EPSILON - 0x2646: 0x03B6, // GREEK SMALL LETTER ZETA - 0x2647: 0x03B7, // GREEK SMALL LETTER ETA - 0x2648: 0x03B8, // GREEK SMALL LETTER THETA - 0x2649: 0x03B9, // GREEK SMALL LETTER IOTA - 0x264A: 0x03BA, // GREEK SMALL LETTER KAPPA - 0x264B: 0x03BB, // GREEK SMALL LETTER LAMDA - 0x264C: 0x03BC, // GREEK SMALL LETTER MU - 0x264D: 0x03BD, // GREEK SMALL LETTER NU - 0x264E: 0x03BE, // GREEK SMALL LETTER XI - 0x264F: 0x03BF, // GREEK SMALL LETTER OMICRON - 0x2650: 0x03C0, // GREEK SMALL LETTER PI - 0x2651: 0x03C1, // GREEK SMALL LETTER RHO - 0x2652: 0x03C3, // GREEK SMALL LETTER SIGMA - 0x2653: 0x03C4, // GREEK SMALL LETTER TAU - 0x2654: 0x03C5, // GREEK SMALL LETTER UPSILON - 0x2655: 0x03C6, // GREEK SMALL LETTER PHI - 0x2656: 0x03C7, // GREEK SMALL LETTER CHI - 0x2657: 0x03C8, // GREEK SMALL LETTER PSI - 0x2658: 0x03C9, // GREEK SMALL LETTER OMEGA - 0x2721: 0x0410, // CYRILLIC CAPITAL LETTER A - 0x2722: 0x0411, // CYRILLIC CAPITAL LETTER BE - 0x2723: 0x0412, // CYRILLIC CAPITAL LETTER VE - 0x2724: 0x0413, // CYRILLIC CAPITAL LETTER GHE - 0x2725: 0x0414, // CYRILLIC CAPITAL LETTER DE - 0x2726: 0x0415, // CYRILLIC CAPITAL LETTER IE - 0x2727: 0x0401, // CYRILLIC CAPITAL LETTER IO - 0x2728: 0x0416, // CYRILLIC CAPITAL LETTER ZHE - 0x2729: 0x0417, // CYRILLIC CAPITAL LETTER ZE - 0x272A: 0x0418, // CYRILLIC CAPITAL LETTER I - 0x272B: 0x0419, // CYRILLIC CAPITAL LETTER SHORT I - 0x272C: 0x041A, // CYRILLIC CAPITAL LETTER KA - 0x272D: 0x041B, // CYRILLIC CAPITAL LETTER EL - 0x272E: 0x041C, // CYRILLIC CAPITAL LETTER EM - 0x272F: 0x041D, // CYRILLIC CAPITAL LETTER EN - 0x2730: 0x041E, // CYRILLIC CAPITAL LETTER O - 0x2731: 0x041F, // CYRILLIC CAPITAL LETTER PE - 0x2732: 0x0420, // CYRILLIC CAPITAL LETTER ER - 0x2733: 0x0421, // CYRILLIC CAPITAL LETTER ES - 0x2734: 0x0422, // CYRILLIC CAPITAL LETTER TE - 0x2735: 0x0423, // CYRILLIC CAPITAL LETTER U - 0x2736: 0x0424, // CYRILLIC CAPITAL LETTER EF - 0x2737: 0x0425, // CYRILLIC CAPITAL LETTER HA - 0x2738: 0x0426, // CYRILLIC CAPITAL LETTER TSE - 0x2739: 0x0427, // CYRILLIC CAPITAL LETTER CHE - 0x273A: 0x0428, // CYRILLIC CAPITAL LETTER SHA - 0x273B: 0x0429, // CYRILLIC CAPITAL LETTER SHCHA - 0x273C: 0x042A, // CYRILLIC CAPITAL LETTER HARD SIGN - 0x273D: 0x042B, // CYRILLIC CAPITAL LETTER YERU - 0x273E: 0x042C, // CYRILLIC CAPITAL LETTER SOFT SIGN - 0x273F: 0x042D, // CYRILLIC CAPITAL LETTER E - 0x2740: 0x042E, // CYRILLIC CAPITAL LETTER YU - 0x2741: 0x042F, // CYRILLIC CAPITAL LETTER YA - 0x2751: 0x0430, // CYRILLIC SMALL LETTER A - 0x2752: 0x0431, // CYRILLIC SMALL LETTER BE - 0x2753: 0x0432, // CYRILLIC SMALL LETTER VE - 0x2754: 0x0433, // CYRILLIC SMALL LETTER GHE - 0x2755: 0x0434, // CYRILLIC SMALL LETTER DE - 0x2756: 0x0435, // CYRILLIC SMALL LETTER IE - 0x2757: 0x0451, // CYRILLIC SMALL LETTER IO - 0x2758: 0x0436, // CYRILLIC SMALL LETTER ZHE - 0x2759: 0x0437, // CYRILLIC SMALL LETTER ZE - 0x275A: 0x0438, // CYRILLIC SMALL LETTER I - 0x275B: 0x0439, // CYRILLIC SMALL LETTER SHORT I - 0x275C: 0x043A, // CYRILLIC SMALL LETTER KA - 0x275D: 0x043B, // CYRILLIC SMALL LETTER EL - 0x275E: 0x043C, // CYRILLIC SMALL LETTER EM - 0x275F: 0x043D, // CYRILLIC SMALL LETTER EN - 0x2760: 0x043E, // CYRILLIC SMALL LETTER O - 0x2761: 0x043F, // CYRILLIC SMALL LETTER PE - 0x2762: 0x0440, // CYRILLIC SMALL LETTER ER - 0x2763: 0x0441, // CYRILLIC SMALL LETTER ES - 0x2764: 0x0442, // CYRILLIC SMALL LETTER TE - 0x2765: 0x0443, // CYRILLIC SMALL LETTER U - 0x2766: 0x0444, // CYRILLIC SMALL LETTER EF - 0x2767: 0x0445, // CYRILLIC SMALL LETTER HA - 0x2768: 0x0446, // CYRILLIC SMALL LETTER TSE - 0x2769: 0x0447, // CYRILLIC SMALL LETTER CHE - 0x276A: 0x0448, // CYRILLIC SMALL LETTER SHA - 0x276B: 0x0449, // CYRILLIC SMALL LETTER SHCHA - 0x276C: 0x044A, // CYRILLIC SMALL LETTER HARD SIGN - 0x276D: 0x044B, // CYRILLIC SMALL LETTER YERU - 0x276E: 0x044C, // CYRILLIC SMALL LETTER SOFT SIGN - 0x276F: 0x044D, // CYRILLIC SMALL LETTER E - 0x2770: 0x044E, // CYRILLIC SMALL LETTER YU - 0x2771: 0x044F, // CYRILLIC SMALL LETTER YA - 0x2821: 0x2500, // BOX DRAWINGS LIGHT HORIZONTAL - 0x2822: 0x2502, // BOX DRAWINGS LIGHT VERTICAL - 0x2823: 0x250C, // BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2824: 0x2510, // BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2825: 0x2518, // BOX DRAWINGS LIGHT UP AND LEFT - 0x2826: 0x2514, // BOX DRAWINGS LIGHT UP AND RIGHT - 0x2827: 0x251C, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2828: 0x252C, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2829: 0x2524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x282A: 0x2534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x282B: 0x253C, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x282C: 0x2501, // BOX DRAWINGS HEAVY HORIZONTAL - 0x282D: 0x2503, // BOX DRAWINGS HEAVY VERTICAL - 0x282E: 0x250F, // BOX DRAWINGS HEAVY DOWN AND RIGHT - 0x282F: 0x2513, // BOX DRAWINGS HEAVY DOWN AND LEFT - 0x2830: 0x251B, // BOX DRAWINGS HEAVY UP AND LEFT - 0x2831: 0x2517, // BOX DRAWINGS HEAVY UP AND RIGHT - 0x2832: 0x2523, // BOX DRAWINGS HEAVY VERTICAL AND RIGHT - 0x2833: 0x2533, // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL - 0x2834: 0x252B, // BOX DRAWINGS HEAVY VERTICAL AND LEFT - 0x2835: 0x253B, // BOX DRAWINGS HEAVY UP AND HORIZONTAL - 0x2836: 0x254B, // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL - 0x2837: 0x2520, // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT - 0x2838: 0x252F, // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY - 0x2839: 0x2528, // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT - 0x283A: 0x2537, // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY - 0x283B: 0x253F, // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY - 0x283C: 0x251D, // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY - 0x283D: 0x2530, // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT - 0x283E: 0x2525, // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY - 0x283F: 0x2538, // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT - 0x2840: 0x2542, // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT - 0x3021: 0x4E9C, - 0x3022: 0x5516, - 0x3023: 0x5A03, - 0x3024: 0x963F, - 0x3025: 0x54C0, - 0x3026: 0x611B, - 0x3027: 0x6328, - 0x3028: 0x59F6, - 0x3029: 0x9022, - 0x302A: 0x8475, - 0x302B: 0x831C, - 0x302C: 0x7A50, - 0x302D: 0x60AA, - 0x302E: 0x63E1, - 0x302F: 0x6E25, - 0x3030: 0x65ED, - 0x3031: 0x8466, - 0x3032: 0x82A6, - 0x3033: 0x9BF5, - 0x3034: 0x6893, - 0x3035: 0x5727, - 0x3036: 0x65A1, - 0x3037: 0x6271, - 0x3038: 0x5B9B, - 0x3039: 0x59D0, - 0x303A: 0x867B, - 0x303B: 0x98F4, - 0x303C: 0x7D62, - 0x303D: 0x7DBE, - 0x303E: 0x9B8E, - 0x303F: 0x6216, - 0x3040: 0x7C9F, - 0x3041: 0x88B7, - 0x3042: 0x5B89, - 0x3043: 0x5EB5, - 0x3044: 0x6309, - 0x3045: 0x6697, - 0x3046: 0x6848, - 0x3047: 0x95C7, - 0x3048: 0x978D, - 0x3049: 0x674F, - 0x304A: 0x4EE5, - 0x304B: 0x4F0A, - 0x304C: 0x4F4D, - 0x304D: 0x4F9D, - 0x304E: 0x5049, - 0x304F: 0x56F2, - 0x3050: 0x5937, - 0x3051: 0x59D4, - 0x3052: 0x5A01, - 0x3053: 0x5C09, - 0x3054: 0x60DF, - 0x3055: 0x610F, - 0x3056: 0x6170, - 0x3057: 0x6613, - 0x3058: 0x6905, - 0x3059: 0x70BA, - 0x305A: 0x754F, - 0x305B: 0x7570, - 0x305C: 0x79FB, - 0x305D: 0x7DAD, - 0x305E: 0x7DEF, - 0x305F: 0x80C3, - 0x3060: 0x840E, - 0x3061: 0x8863, - 0x3062: 0x8B02, - 0x3063: 0x9055, - 0x3064: 0x907A, - 0x3065: 0x533B, - 0x3066: 0x4E95, - 0x3067: 0x4EA5, - 0x3068: 0x57DF, - 0x3069: 0x80B2, - 0x306A: 0x90C1, - 0x306B: 0x78EF, - 0x306C: 0x4E00, - 0x306D: 0x58F1, - 0x306E: 0x6EA2, - 0x306F: 0x9038, - 0x3070: 0x7A32, - 0x3071: 0x8328, - 0x3072: 0x828B, - 0x3073: 0x9C2F, - 0x3074: 0x5141, - 0x3075: 0x5370, - 0x3076: 0x54BD, - 0x3077: 0x54E1, - 0x3078: 0x56E0, - 0x3079: 0x59FB, - 0x307A: 0x5F15, - 0x307B: 0x98F2, - 0x307C: 0x6DEB, - 0x307D: 0x80E4, - 0x307E: 0x852D, - 0x3121: 0x9662, - 0x3122: 0x9670, - 0x3123: 0x96A0, - 0x3124: 0x97FB, - 0x3125: 0x540B, - 0x3126: 0x53F3, - 0x3127: 0x5B87, - 0x3128: 0x70CF, - 0x3129: 0x7FBD, - 0x312A: 0x8FC2, - 0x312B: 0x96E8, - 0x312C: 0x536F, - 0x312D: 0x9D5C, - 0x312E: 0x7ABA, - 0x312F: 0x4E11, - 0x3130: 0x7893, - 0x3131: 0x81FC, - 0x3132: 0x6E26, - 0x3133: 0x5618, - 0x3134: 0x5504, - 0x3135: 0x6B1D, - 0x3136: 0x851A, - 0x3137: 0x9C3B, - 0x3138: 0x59E5, - 0x3139: 0x53A9, - 0x313A: 0x6D66, - 0x313B: 0x74DC, - 0x313C: 0x958F, - 0x313D: 0x5642, - 0x313E: 0x4E91, - 0x313F: 0x904B, - 0x3140: 0x96F2, - 0x3141: 0x834F, - 0x3142: 0x990C, - 0x3143: 0x53E1, - 0x3144: 0x55B6, - 0x3145: 0x5B30, - 0x3146: 0x5F71, - 0x3147: 0x6620, - 0x3148: 0x66F3, - 0x3149: 0x6804, - 0x314A: 0x6C38, - 0x314B: 0x6CF3, - 0x314C: 0x6D29, - 0x314D: 0x745B, - 0x314E: 0x76C8, - 0x314F: 0x7A4E, - 0x3150: 0x9834, - 0x3151: 0x82F1, - 0x3152: 0x885B, - 0x3153: 0x8A60, - 0x3154: 0x92ED, - 0x3155: 0x6DB2, - 0x3156: 0x75AB, - 0x3157: 0x76CA, - 0x3158: 0x99C5, - 0x3159: 0x60A6, - 0x315A: 0x8B01, - 0x315B: 0x8D8A, - 0x315C: 0x95B2, - 0x315D: 0x698E, - 0x315E: 0x53AD, - 0x315F: 0x5186, - 0x3160: 0x5712, - 0x3161: 0x5830, - 0x3162: 0x5944, - 0x3163: 0x5BB4, - 0x3164: 0x5EF6, - 0x3165: 0x6028, - 0x3166: 0x63A9, - 0x3167: 0x63F4, - 0x3168: 0x6CBF, - 0x3169: 0x6F14, - 0x316A: 0x708E, - 0x316B: 0x7114, - 0x316C: 0x7159, - 0x316D: 0x71D5, - 0x316E: 0x733F, - 0x316F: 0x7E01, - 0x3170: 0x8276, - 0x3171: 0x82D1, - 0x3172: 0x8597, - 0x3173: 0x9060, - 0x3174: 0x925B, - 0x3175: 0x9D1B, - 0x3176: 0x5869, - 0x3177: 0x65BC, - 0x3178: 0x6C5A, - 0x3179: 0x7525, - 0x317A: 0x51F9, - 0x317B: 0x592E, - 0x317C: 0x5965, - 0x317D: 0x5F80, - 0x317E: 0x5FDC, - 0x3221: 0x62BC, - 0x3222: 0x65FA, - 0x3223: 0x6A2A, - 0x3224: 0x6B27, - 0x3225: 0x6BB4, - 0x3226: 0x738B, - 0x3227: 0x7FC1, - 0x3228: 0x8956, - 0x3229: 0x9D2C, - 0x322A: 0x9D0E, - 0x322B: 0x9EC4, - 0x322C: 0x5CA1, - 0x322D: 0x6C96, - 0x322E: 0x837B, - 0x322F: 0x5104, - 0x3230: 0x5C4B, - 0x3231: 0x61B6, - 0x3232: 0x81C6, - 0x3233: 0x6876, - 0x3234: 0x7261, - 0x3235: 0x4E59, - 0x3236: 0x4FFA, - 0x3237: 0x5378, - 0x3238: 0x6069, - 0x3239: 0x6E29, - 0x323A: 0x7A4F, - 0x323B: 0x97F3, - 0x323C: 0x4E0B, - 0x323D: 0x5316, - 0x323E: 0x4EEE, - 0x323F: 0x4F55, - 0x3240: 0x4F3D, - 0x3241: 0x4FA1, - 0x3242: 0x4F73, - 0x3243: 0x52A0, - 0x3244: 0x53EF, - 0x3245: 0x5609, - 0x3246: 0x590F, - 0x3247: 0x5AC1, - 0x3248: 0x5BB6, - 0x3249: 0x5BE1, - 0x324A: 0x79D1, - 0x324B: 0x6687, - 0x324C: 0x679C, - 0x324D: 0x67B6, - 0x324E: 0x6B4C, - 0x324F: 0x6CB3, - 0x3250: 0x706B, - 0x3251: 0x73C2, - 0x3252: 0x798D, - 0x3253: 0x79BE, - 0x3254: 0x7A3C, - 0x3255: 0x7B87, - 0x3256: 0x82B1, - 0x3257: 0x82DB, - 0x3258: 0x8304, - 0x3259: 0x8377, - 0x325A: 0x83EF, - 0x325B: 0x83D3, - 0x325C: 0x8766, - 0x325D: 0x8AB2, - 0x325E: 0x5629, - 0x325F: 0x8CA8, - 0x3260: 0x8FE6, - 0x3261: 0x904E, - 0x3262: 0x971E, - 0x3263: 0x868A, - 0x3264: 0x4FC4, - 0x3265: 0x5CE8, - 0x3266: 0x6211, - 0x3267: 0x7259, - 0x3268: 0x753B, - 0x3269: 0x81E5, - 0x326A: 0x82BD, - 0x326B: 0x86FE, - 0x326C: 0x8CC0, - 0x326D: 0x96C5, - 0x326E: 0x9913, - 0x326F: 0x99D5, - 0x3270: 0x4ECB, - 0x3271: 0x4F1A, - 0x3272: 0x89E3, - 0x3273: 0x56DE, - 0x3274: 0x584A, - 0x3275: 0x58CA, - 0x3276: 0x5EFB, - 0x3277: 0x5FEB, - 0x3278: 0x602A, - 0x3279: 0x6094, - 0x327A: 0x6062, - 0x327B: 0x61D0, - 0x327C: 0x6212, - 0x327D: 0x62D0, - 0x327E: 0x6539, - 0x3321: 0x9B41, - 0x3322: 0x6666, - 0x3323: 0x68B0, - 0x3324: 0x6D77, - 0x3325: 0x7070, - 0x3326: 0x754C, - 0x3327: 0x7686, - 0x3328: 0x7D75, - 0x3329: 0x82A5, - 0x332A: 0x87F9, - 0x332B: 0x958B, - 0x332C: 0x968E, - 0x332D: 0x8C9D, - 0x332E: 0x51F1, - 0x332F: 0x52BE, - 0x3330: 0x5916, - 0x3331: 0x54B3, - 0x3332: 0x5BB3, - 0x3333: 0x5D16, - 0x3334: 0x6168, - 0x3335: 0x6982, - 0x3336: 0x6DAF, - 0x3337: 0x788D, - 0x3338: 0x84CB, - 0x3339: 0x8857, - 0x333A: 0x8A72, - 0x333B: 0x93A7, - 0x333C: 0x9AB8, - 0x333D: 0x6D6C, - 0x333E: 0x99A8, - 0x333F: 0x86D9, - 0x3340: 0x57A3, - 0x3341: 0x67FF, - 0x3342: 0x86CE, - 0x3343: 0x920E, - 0x3344: 0x5283, - 0x3345: 0x5687, - 0x3346: 0x5404, - 0x3347: 0x5ED3, - 0x3348: 0x62E1, - 0x3349: 0x64B9, - 0x334A: 0x683C, - 0x334B: 0x6838, - 0x334C: 0x6BBB, - 0x334D: 0x7372, - 0x334E: 0x78BA, - 0x334F: 0x7A6B, - 0x3350: 0x899A, - 0x3351: 0x89D2, - 0x3352: 0x8D6B, - 0x3353: 0x8F03, - 0x3354: 0x90ED, - 0x3355: 0x95A3, - 0x3356: 0x9694, - 0x3357: 0x9769, - 0x3358: 0x5B66, - 0x3359: 0x5CB3, - 0x335A: 0x697D, - 0x335B: 0x984D, - 0x335C: 0x984E, - 0x335D: 0x639B, - 0x335E: 0x7B20, - 0x335F: 0x6A2B, - 0x3360: 0x6A7F, - 0x3361: 0x68B6, - 0x3362: 0x9C0D, - 0x3363: 0x6F5F, - 0x3364: 0x5272, - 0x3365: 0x559D, - 0x3366: 0x6070, - 0x3367: 0x62EC, - 0x3368: 0x6D3B, - 0x3369: 0x6E07, - 0x336A: 0x6ED1, - 0x336B: 0x845B, - 0x336C: 0x8910, - 0x336D: 0x8F44, - 0x336E: 0x4E14, - 0x336F: 0x9C39, - 0x3370: 0x53F6, - 0x3371: 0x691B, - 0x3372: 0x6A3A, - 0x3373: 0x9784, - 0x3374: 0x682A, - 0x3375: 0x515C, - 0x3376: 0x7AC3, - 0x3377: 0x84B2, - 0x3378: 0x91DC, - 0x3379: 0x938C, - 0x337A: 0x565B, - 0x337B: 0x9D28, - 0x337C: 0x6822, - 0x337D: 0x8305, - 0x337E: 0x8431, - 0x3421: 0x7CA5, - 0x3422: 0x5208, - 0x3423: 0x82C5, - 0x3424: 0x74E6, - 0x3425: 0x4E7E, - 0x3426: 0x4F83, - 0x3427: 0x51A0, - 0x3428: 0x5BD2, - 0x3429: 0x520A, - 0x342A: 0x52D8, - 0x342B: 0x52E7, - 0x342C: 0x5DFB, - 0x342D: 0x559A, - 0x342E: 0x582A, - 0x342F: 0x59E6, - 0x3430: 0x5B8C, - 0x3431: 0x5B98, - 0x3432: 0x5BDB, - 0x3433: 0x5E72, - 0x3434: 0x5E79, - 0x3435: 0x60A3, - 0x3436: 0x611F, - 0x3437: 0x6163, - 0x3438: 0x61BE, - 0x3439: 0x63DB, - 0x343A: 0x6562, - 0x343B: 0x67D1, - 0x343C: 0x6853, - 0x343D: 0x68FA, - 0x343E: 0x6B3E, - 0x343F: 0x6B53, - 0x3440: 0x6C57, - 0x3441: 0x6F22, - 0x3442: 0x6F97, - 0x3443: 0x6F45, - 0x3444: 0x74B0, - 0x3445: 0x7518, - 0x3446: 0x76E3, - 0x3447: 0x770B, - 0x3448: 0x7AFF, - 0x3449: 0x7BA1, - 0x344A: 0x7C21, - 0x344B: 0x7DE9, - 0x344C: 0x7F36, - 0x344D: 0x7FF0, - 0x344E: 0x809D, - 0x344F: 0x8266, - 0x3450: 0x839E, - 0x3451: 0x89B3, - 0x3452: 0x8ACC, - 0x3453: 0x8CAB, - 0x3454: 0x9084, - 0x3455: 0x9451, - 0x3456: 0x9593, - 0x3457: 0x9591, - 0x3458: 0x95A2, - 0x3459: 0x9665, - 0x345A: 0x97D3, - 0x345B: 0x9928, - 0x345C: 0x8218, - 0x345D: 0x4E38, - 0x345E: 0x542B, - 0x345F: 0x5CB8, - 0x3460: 0x5DCC, - 0x3461: 0x73A9, - 0x3462: 0x764C, - 0x3463: 0x773C, - 0x3464: 0x5CA9, - 0x3465: 0x7FEB, - 0x3466: 0x8D0B, - 0x3467: 0x96C1, - 0x3468: 0x9811, - 0x3469: 0x9854, - 0x346A: 0x9858, - 0x346B: 0x4F01, - 0x346C: 0x4F0E, - 0x346D: 0x5371, - 0x346E: 0x559C, - 0x346F: 0x5668, - 0x3470: 0x57FA, - 0x3471: 0x5947, - 0x3472: 0x5B09, - 0x3473: 0x5BC4, - 0x3474: 0x5C90, - 0x3475: 0x5E0C, - 0x3476: 0x5E7E, - 0x3477: 0x5FCC, - 0x3478: 0x63EE, - 0x3479: 0x673A, - 0x347A: 0x65D7, - 0x347B: 0x65E2, - 0x347C: 0x671F, - 0x347D: 0x68CB, - 0x347E: 0x68C4, - 0x3521: 0x6A5F, - 0x3522: 0x5E30, - 0x3523: 0x6BC5, - 0x3524: 0x6C17, - 0x3525: 0x6C7D, - 0x3526: 0x757F, - 0x3527: 0x7948, - 0x3528: 0x5B63, - 0x3529: 0x7A00, - 0x352A: 0x7D00, - 0x352B: 0x5FBD, - 0x352C: 0x898F, - 0x352D: 0x8A18, - 0x352E: 0x8CB4, - 0x352F: 0x8D77, - 0x3530: 0x8ECC, - 0x3531: 0x8F1D, - 0x3532: 0x98E2, - 0x3533: 0x9A0E, - 0x3534: 0x9B3C, - 0x3535: 0x4E80, - 0x3536: 0x507D, - 0x3537: 0x5100, - 0x3538: 0x5993, - 0x3539: 0x5B9C, - 0x353A: 0x622F, - 0x353B: 0x6280, - 0x353C: 0x64EC, - 0x353D: 0x6B3A, - 0x353E: 0x72A0, - 0x353F: 0x7591, - 0x3540: 0x7947, - 0x3541: 0x7FA9, - 0x3542: 0x87FB, - 0x3543: 0x8ABC, - 0x3544: 0x8B70, - 0x3545: 0x63AC, - 0x3546: 0x83CA, - 0x3547: 0x97A0, - 0x3548: 0x5409, - 0x3549: 0x5403, - 0x354A: 0x55AB, - 0x354B: 0x6854, - 0x354C: 0x6A58, - 0x354D: 0x8A70, - 0x354E: 0x7827, - 0x354F: 0x6775, - 0x3550: 0x9ECD, - 0x3551: 0x5374, - 0x3552: 0x5BA2, - 0x3553: 0x811A, - 0x3554: 0x8650, - 0x3555: 0x9006, - 0x3556: 0x4E18, - 0x3557: 0x4E45, - 0x3558: 0x4EC7, - 0x3559: 0x4F11, - 0x355A: 0x53CA, - 0x355B: 0x5438, - 0x355C: 0x5BAE, - 0x355D: 0x5F13, - 0x355E: 0x6025, - 0x355F: 0x6551, - 0x3560: 0x673D, - 0x3561: 0x6C42, - 0x3562: 0x6C72, - 0x3563: 0x6CE3, - 0x3564: 0x7078, - 0x3565: 0x7403, - 0x3566: 0x7A76, - 0x3567: 0x7AAE, - 0x3568: 0x7B08, - 0x3569: 0x7D1A, - 0x356A: 0x7CFE, - 0x356B: 0x7D66, - 0x356C: 0x65E7, - 0x356D: 0x725B, - 0x356E: 0x53BB, - 0x356F: 0x5C45, - 0x3570: 0x5DE8, - 0x3571: 0x62D2, - 0x3572: 0x62E0, - 0x3573: 0x6319, - 0x3574: 0x6E20, - 0x3575: 0x865A, - 0x3576: 0x8A31, - 0x3577: 0x8DDD, - 0x3578: 0x92F8, - 0x3579: 0x6F01, - 0x357A: 0x79A6, - 0x357B: 0x9B5A, - 0x357C: 0x4EA8, - 0x357D: 0x4EAB, - 0x357E: 0x4EAC, - 0x3621: 0x4F9B, - 0x3622: 0x4FA0, - 0x3623: 0x50D1, - 0x3624: 0x5147, - 0x3625: 0x7AF6, - 0x3626: 0x5171, - 0x3627: 0x51F6, - 0x3628: 0x5354, - 0x3629: 0x5321, - 0x362A: 0x537F, - 0x362B: 0x53EB, - 0x362C: 0x55AC, - 0x362D: 0x5883, - 0x362E: 0x5CE1, - 0x362F: 0x5F37, - 0x3630: 0x5F4A, - 0x3631: 0x602F, - 0x3632: 0x6050, - 0x3633: 0x606D, - 0x3634: 0x631F, - 0x3635: 0x6559, - 0x3636: 0x6A4B, - 0x3637: 0x6CC1, - 0x3638: 0x72C2, - 0x3639: 0x72ED, - 0x363A: 0x77EF, - 0x363B: 0x80F8, - 0x363C: 0x8105, - 0x363D: 0x8208, - 0x363E: 0x854E, - 0x363F: 0x90F7, - 0x3640: 0x93E1, - 0x3641: 0x97FF, - 0x3642: 0x9957, - 0x3643: 0x9A5A, - 0x3644: 0x4EF0, - 0x3645: 0x51DD, - 0x3646: 0x5C2D, - 0x3647: 0x6681, - 0x3648: 0x696D, - 0x3649: 0x5C40, - 0x364A: 0x66F2, - 0x364B: 0x6975, - 0x364C: 0x7389, - 0x364D: 0x6850, - 0x364E: 0x7C81, - 0x364F: 0x50C5, - 0x3650: 0x52E4, - 0x3651: 0x5747, - 0x3652: 0x5DFE, - 0x3653: 0x9326, - 0x3654: 0x65A4, - 0x3655: 0x6B23, - 0x3656: 0x6B3D, - 0x3657: 0x7434, - 0x3658: 0x7981, - 0x3659: 0x79BD, - 0x365A: 0x7B4B, - 0x365B: 0x7DCA, - 0x365C: 0x82B9, - 0x365D: 0x83CC, - 0x365E: 0x887F, - 0x365F: 0x895F, - 0x3660: 0x8B39, - 0x3661: 0x8FD1, - 0x3662: 0x91D1, - 0x3663: 0x541F, - 0x3664: 0x9280, - 0x3665: 0x4E5D, - 0x3666: 0x5036, - 0x3667: 0x53E5, - 0x3668: 0x533A, - 0x3669: 0x72D7, - 0x366A: 0x7396, - 0x366B: 0x77E9, - 0x366C: 0x82E6, - 0x366D: 0x8EAF, - 0x366E: 0x99C6, - 0x366F: 0x99C8, - 0x3670: 0x99D2, - 0x3671: 0x5177, - 0x3672: 0x611A, - 0x3673: 0x865E, - 0x3674: 0x55B0, - 0x3675: 0x7A7A, - 0x3676: 0x5076, - 0x3677: 0x5BD3, - 0x3678: 0x9047, - 0x3679: 0x9685, - 0x367A: 0x4E32, - 0x367B: 0x6ADB, - 0x367C: 0x91E7, - 0x367D: 0x5C51, - 0x367E: 0x5C48, - 0x3721: 0x6398, - 0x3722: 0x7A9F, - 0x3723: 0x6C93, - 0x3724: 0x9774, - 0x3725: 0x8F61, - 0x3726: 0x7AAA, - 0x3727: 0x718A, - 0x3728: 0x9688, - 0x3729: 0x7C82, - 0x372A: 0x6817, - 0x372B: 0x7E70, - 0x372C: 0x6851, - 0x372D: 0x936C, - 0x372E: 0x52F2, - 0x372F: 0x541B, - 0x3730: 0x85AB, - 0x3731: 0x8A13, - 0x3732: 0x7FA4, - 0x3733: 0x8ECD, - 0x3734: 0x90E1, - 0x3735: 0x5366, - 0x3736: 0x8888, - 0x3737: 0x7941, - 0x3738: 0x4FC2, - 0x3739: 0x50BE, - 0x373A: 0x5211, - 0x373B: 0x5144, - 0x373C: 0x5553, - 0x373D: 0x572D, - 0x373E: 0x73EA, - 0x373F: 0x578B, - 0x3740: 0x5951, - 0x3741: 0x5F62, - 0x3742: 0x5F84, - 0x3743: 0x6075, - 0x3744: 0x6176, - 0x3745: 0x6167, - 0x3746: 0x61A9, - 0x3747: 0x63B2, - 0x3748: 0x643A, - 0x3749: 0x656C, - 0x374A: 0x666F, - 0x374B: 0x6842, - 0x374C: 0x6E13, - 0x374D: 0x7566, - 0x374E: 0x7A3D, - 0x374F: 0x7CFB, - 0x3750: 0x7D4C, - 0x3751: 0x7D99, - 0x3752: 0x7E4B, - 0x3753: 0x7F6B, - 0x3754: 0x830E, - 0x3755: 0x834A, - 0x3756: 0x86CD, - 0x3757: 0x8A08, - 0x3758: 0x8A63, - 0x3759: 0x8B66, - 0x375A: 0x8EFD, - 0x375B: 0x981A, - 0x375C: 0x9D8F, - 0x375D: 0x82B8, - 0x375E: 0x8FCE, - 0x375F: 0x9BE8, - 0x3760: 0x5287, - 0x3761: 0x621F, - 0x3762: 0x6483, - 0x3763: 0x6FC0, - 0x3764: 0x9699, - 0x3765: 0x6841, - 0x3766: 0x5091, - 0x3767: 0x6B20, - 0x3768: 0x6C7A, - 0x3769: 0x6F54, - 0x376A: 0x7A74, - 0x376B: 0x7D50, - 0x376C: 0x8840, - 0x376D: 0x8A23, - 0x376E: 0x6708, - 0x376F: 0x4EF6, - 0x3770: 0x5039, - 0x3771: 0x5026, - 0x3772: 0x5065, - 0x3773: 0x517C, - 0x3774: 0x5238, - 0x3775: 0x5263, - 0x3776: 0x55A7, - 0x3777: 0x570F, - 0x3778: 0x5805, - 0x3779: 0x5ACC, - 0x377A: 0x5EFA, - 0x377B: 0x61B2, - 0x377C: 0x61F8, - 0x377D: 0x62F3, - 0x377E: 0x6372, - 0x3821: 0x691C, - 0x3822: 0x6A29, - 0x3823: 0x727D, - 0x3824: 0x72AC, - 0x3825: 0x732E, - 0x3826: 0x7814, - 0x3827: 0x786F, - 0x3828: 0x7D79, - 0x3829: 0x770C, - 0x382A: 0x80A9, - 0x382B: 0x898B, - 0x382C: 0x8B19, - 0x382D: 0x8CE2, - 0x382E: 0x8ED2, - 0x382F: 0x9063, - 0x3830: 0x9375, - 0x3831: 0x967A, - 0x3832: 0x9855, - 0x3833: 0x9A13, - 0x3834: 0x9E78, - 0x3835: 0x5143, - 0x3836: 0x539F, - 0x3837: 0x53B3, - 0x3838: 0x5E7B, - 0x3839: 0x5F26, - 0x383A: 0x6E1B, - 0x383B: 0x6E90, - 0x383C: 0x7384, - 0x383D: 0x73FE, - 0x383E: 0x7D43, - 0x383F: 0x8237, - 0x3840: 0x8A00, - 0x3841: 0x8AFA, - 0x3842: 0x9650, - 0x3843: 0x4E4E, - 0x3844: 0x500B, - 0x3845: 0x53E4, - 0x3846: 0x547C, - 0x3847: 0x56FA, - 0x3848: 0x59D1, - 0x3849: 0x5B64, - 0x384A: 0x5DF1, - 0x384B: 0x5EAB, - 0x384C: 0x5F27, - 0x384D: 0x6238, - 0x384E: 0x6545, - 0x384F: 0x67AF, - 0x3850: 0x6E56, - 0x3851: 0x72D0, - 0x3852: 0x7CCA, - 0x3853: 0x88B4, - 0x3854: 0x80A1, - 0x3855: 0x80E1, - 0x3856: 0x83F0, - 0x3857: 0x864E, - 0x3858: 0x8A87, - 0x3859: 0x8DE8, - 0x385A: 0x9237, - 0x385B: 0x96C7, - 0x385C: 0x9867, - 0x385D: 0x9F13, - 0x385E: 0x4E94, - 0x385F: 0x4E92, - 0x3860: 0x4F0D, - 0x3861: 0x5348, - 0x3862: 0x5449, - 0x3863: 0x543E, - 0x3864: 0x5A2F, - 0x3865: 0x5F8C, - 0x3866: 0x5FA1, - 0x3867: 0x609F, - 0x3868: 0x68A7, - 0x3869: 0x6A8E, - 0x386A: 0x745A, - 0x386B: 0x7881, - 0x386C: 0x8A9E, - 0x386D: 0x8AA4, - 0x386E: 0x8B77, - 0x386F: 0x9190, - 0x3870: 0x4E5E, - 0x3871: 0x9BC9, - 0x3872: 0x4EA4, - 0x3873: 0x4F7C, - 0x3874: 0x4FAF, - 0x3875: 0x5019, - 0x3876: 0x5016, - 0x3877: 0x5149, - 0x3878: 0x516C, - 0x3879: 0x529F, - 0x387A: 0x52B9, - 0x387B: 0x52FE, - 0x387C: 0x539A, - 0x387D: 0x53E3, - 0x387E: 0x5411, - 0x3921: 0x540E, - 0x3922: 0x5589, - 0x3923: 0x5751, - 0x3924: 0x57A2, - 0x3925: 0x597D, - 0x3926: 0x5B54, - 0x3927: 0x5B5D, - 0x3928: 0x5B8F, - 0x3929: 0x5DE5, - 0x392A: 0x5DE7, - 0x392B: 0x5DF7, - 0x392C: 0x5E78, - 0x392D: 0x5E83, - 0x392E: 0x5E9A, - 0x392F: 0x5EB7, - 0x3930: 0x5F18, - 0x3931: 0x6052, - 0x3932: 0x614C, - 0x3933: 0x6297, - 0x3934: 0x62D8, - 0x3935: 0x63A7, - 0x3936: 0x653B, - 0x3937: 0x6602, - 0x3938: 0x6643, - 0x3939: 0x66F4, - 0x393A: 0x676D, - 0x393B: 0x6821, - 0x393C: 0x6897, - 0x393D: 0x69CB, - 0x393E: 0x6C5F, - 0x393F: 0x6D2A, - 0x3940: 0x6D69, - 0x3941: 0x6E2F, - 0x3942: 0x6E9D, - 0x3943: 0x7532, - 0x3944: 0x7687, - 0x3945: 0x786C, - 0x3946: 0x7A3F, - 0x3947: 0x7CE0, - 0x3948: 0x7D05, - 0x3949: 0x7D18, - 0x394A: 0x7D5E, - 0x394B: 0x7DB1, - 0x394C: 0x8015, - 0x394D: 0x8003, - 0x394E: 0x80AF, - 0x394F: 0x80B1, - 0x3950: 0x8154, - 0x3951: 0x818F, - 0x3952: 0x822A, - 0x3953: 0x8352, - 0x3954: 0x884C, - 0x3955: 0x8861, - 0x3956: 0x8B1B, - 0x3957: 0x8CA2, - 0x3958: 0x8CFC, - 0x3959: 0x90CA, - 0x395A: 0x9175, - 0x395B: 0x9271, - 0x395C: 0x783F, - 0x395D: 0x92FC, - 0x395E: 0x95A4, - 0x395F: 0x964D, - 0x3960: 0x9805, - 0x3961: 0x9999, - 0x3962: 0x9AD8, - 0x3963: 0x9D3B, - 0x3964: 0x525B, - 0x3965: 0x52AB, - 0x3966: 0x53F7, - 0x3967: 0x5408, - 0x3968: 0x58D5, - 0x3969: 0x62F7, - 0x396A: 0x6FE0, - 0x396B: 0x8C6A, - 0x396C: 0x8F5F, - 0x396D: 0x9EB9, - 0x396E: 0x514B, - 0x396F: 0x523B, - 0x3970: 0x544A, - 0x3971: 0x56FD, - 0x3972: 0x7A40, - 0x3973: 0x9177, - 0x3974: 0x9D60, - 0x3975: 0x9ED2, - 0x3976: 0x7344, - 0x3977: 0x6F09, - 0x3978: 0x8170, - 0x3979: 0x7511, - 0x397A: 0x5FFD, - 0x397B: 0x60DA, - 0x397C: 0x9AA8, - 0x397D: 0x72DB, - 0x397E: 0x8FBC, - 0x3A21: 0x6B64, - 0x3A22: 0x9803, - 0x3A23: 0x4ECA, - 0x3A24: 0x56F0, - 0x3A25: 0x5764, - 0x3A26: 0x58BE, - 0x3A27: 0x5A5A, - 0x3A28: 0x6068, - 0x3A29: 0x61C7, - 0x3A2A: 0x660F, - 0x3A2B: 0x6606, - 0x3A2C: 0x6839, - 0x3A2D: 0x68B1, - 0x3A2E: 0x6DF7, - 0x3A2F: 0x75D5, - 0x3A30: 0x7D3A, - 0x3A31: 0x826E, - 0x3A32: 0x9B42, - 0x3A33: 0x4E9B, - 0x3A34: 0x4F50, - 0x3A35: 0x53C9, - 0x3A36: 0x5506, - 0x3A37: 0x5D6F, - 0x3A38: 0x5DE6, - 0x3A39: 0x5DEE, - 0x3A3A: 0x67FB, - 0x3A3B: 0x6C99, - 0x3A3C: 0x7473, - 0x3A3D: 0x7802, - 0x3A3E: 0x8A50, - 0x3A3F: 0x9396, - 0x3A40: 0x88DF, - 0x3A41: 0x5750, - 0x3A42: 0x5EA7, - 0x3A43: 0x632B, - 0x3A44: 0x50B5, - 0x3A45: 0x50AC, - 0x3A46: 0x518D, - 0x3A47: 0x6700, - 0x3A48: 0x54C9, - 0x3A49: 0x585E, - 0x3A4A: 0x59BB, - 0x3A4B: 0x5BB0, - 0x3A4C: 0x5F69, - 0x3A4D: 0x624D, - 0x3A4E: 0x63A1, - 0x3A4F: 0x683D, - 0x3A50: 0x6B73, - 0x3A51: 0x6E08, - 0x3A52: 0x707D, - 0x3A53: 0x91C7, - 0x3A54: 0x7280, - 0x3A55: 0x7815, - 0x3A56: 0x7826, - 0x3A57: 0x796D, - 0x3A58: 0x658E, - 0x3A59: 0x7D30, - 0x3A5A: 0x83DC, - 0x3A5B: 0x88C1, - 0x3A5C: 0x8F09, - 0x3A5D: 0x969B, - 0x3A5E: 0x5264, - 0x3A5F: 0x5728, - 0x3A60: 0x6750, - 0x3A61: 0x7F6A, - 0x3A62: 0x8CA1, - 0x3A63: 0x51B4, - 0x3A64: 0x5742, - 0x3A65: 0x962A, - 0x3A66: 0x583A, - 0x3A67: 0x698A, - 0x3A68: 0x80B4, - 0x3A69: 0x54B2, - 0x3A6A: 0x5D0E, - 0x3A6B: 0x57FC, - 0x3A6C: 0x7895, - 0x3A6D: 0x9DFA, - 0x3A6E: 0x4F5C, - 0x3A6F: 0x524A, - 0x3A70: 0x548B, - 0x3A71: 0x643E, - 0x3A72: 0x6628, - 0x3A73: 0x6714, - 0x3A74: 0x67F5, - 0x3A75: 0x7A84, - 0x3A76: 0x7B56, - 0x3A77: 0x7D22, - 0x3A78: 0x932F, - 0x3A79: 0x685C, - 0x3A7A: 0x9BAD, - 0x3A7B: 0x7B39, - 0x3A7C: 0x5319, - 0x3A7D: 0x518A, - 0x3A7E: 0x5237, - 0x3B21: 0x5BDF, - 0x3B22: 0x62F6, - 0x3B23: 0x64AE, - 0x3B24: 0x64E6, - 0x3B25: 0x672D, - 0x3B26: 0x6BBA, - 0x3B27: 0x85A9, - 0x3B28: 0x96D1, - 0x3B29: 0x7690, - 0x3B2A: 0x9BD6, - 0x3B2B: 0x634C, - 0x3B2C: 0x9306, - 0x3B2D: 0x9BAB, - 0x3B2E: 0x76BF, - 0x3B2F: 0x6652, - 0x3B30: 0x4E09, - 0x3B31: 0x5098, - 0x3B32: 0x53C2, - 0x3B33: 0x5C71, - 0x3B34: 0x60E8, - 0x3B35: 0x6492, - 0x3B36: 0x6563, - 0x3B37: 0x685F, - 0x3B38: 0x71E6, - 0x3B39: 0x73CA, - 0x3B3A: 0x7523, - 0x3B3B: 0x7B97, - 0x3B3C: 0x7E82, - 0x3B3D: 0x8695, - 0x3B3E: 0x8B83, - 0x3B3F: 0x8CDB, - 0x3B40: 0x9178, - 0x3B41: 0x9910, - 0x3B42: 0x65AC, - 0x3B43: 0x66AB, - 0x3B44: 0x6B8B, - 0x3B45: 0x4ED5, - 0x3B46: 0x4ED4, - 0x3B47: 0x4F3A, - 0x3B48: 0x4F7F, - 0x3B49: 0x523A, - 0x3B4A: 0x53F8, - 0x3B4B: 0x53F2, - 0x3B4C: 0x55E3, - 0x3B4D: 0x56DB, - 0x3B4E: 0x58EB, - 0x3B4F: 0x59CB, - 0x3B50: 0x59C9, - 0x3B51: 0x59FF, - 0x3B52: 0x5B50, - 0x3B53: 0x5C4D, - 0x3B54: 0x5E02, - 0x3B55: 0x5E2B, - 0x3B56: 0x5FD7, - 0x3B57: 0x601D, - 0x3B58: 0x6307, - 0x3B59: 0x652F, - 0x3B5A: 0x5B5C, - 0x3B5B: 0x65AF, - 0x3B5C: 0x65BD, - 0x3B5D: 0x65E8, - 0x3B5E: 0x679D, - 0x3B5F: 0x6B62, - 0x3B60: 0x6B7B, - 0x3B61: 0x6C0F, - 0x3B62: 0x7345, - 0x3B63: 0x7949, - 0x3B64: 0x79C1, - 0x3B65: 0x7CF8, - 0x3B66: 0x7D19, - 0x3B67: 0x7D2B, - 0x3B68: 0x80A2, - 0x3B69: 0x8102, - 0x3B6A: 0x81F3, - 0x3B6B: 0x8996, - 0x3B6C: 0x8A5E, - 0x3B6D: 0x8A69, - 0x3B6E: 0x8A66, - 0x3B6F: 0x8A8C, - 0x3B70: 0x8AEE, - 0x3B71: 0x8CC7, - 0x3B72: 0x8CDC, - 0x3B73: 0x96CC, - 0x3B74: 0x98FC, - 0x3B75: 0x6B6F, - 0x3B76: 0x4E8B, - 0x3B77: 0x4F3C, - 0x3B78: 0x4F8D, - 0x3B79: 0x5150, - 0x3B7A: 0x5B57, - 0x3B7B: 0x5BFA, - 0x3B7C: 0x6148, - 0x3B7D: 0x6301, - 0x3B7E: 0x6642, - 0x3C21: 0x6B21, - 0x3C22: 0x6ECB, - 0x3C23: 0x6CBB, - 0x3C24: 0x723E, - 0x3C25: 0x74BD, - 0x3C26: 0x75D4, - 0x3C27: 0x78C1, - 0x3C28: 0x793A, - 0x3C29: 0x800C, - 0x3C2A: 0x8033, - 0x3C2B: 0x81EA, - 0x3C2C: 0x8494, - 0x3C2D: 0x8F9E, - 0x3C2E: 0x6C50, - 0x3C2F: 0x9E7F, - 0x3C30: 0x5F0F, - 0x3C31: 0x8B58, - 0x3C32: 0x9D2B, - 0x3C33: 0x7AFA, - 0x3C34: 0x8EF8, - 0x3C35: 0x5B8D, - 0x3C36: 0x96EB, - 0x3C37: 0x4E03, - 0x3C38: 0x53F1, - 0x3C39: 0x57F7, - 0x3C3A: 0x5931, - 0x3C3B: 0x5AC9, - 0x3C3C: 0x5BA4, - 0x3C3D: 0x6089, - 0x3C3E: 0x6E7F, - 0x3C3F: 0x6F06, - 0x3C40: 0x75BE, - 0x3C41: 0x8CEA, - 0x3C42: 0x5B9F, - 0x3C43: 0x8500, - 0x3C44: 0x7BE0, - 0x3C45: 0x5072, - 0x3C46: 0x67F4, - 0x3C47: 0x829D, - 0x3C48: 0x5C61, - 0x3C49: 0x854A, - 0x3C4A: 0x7E1E, - 0x3C4B: 0x820E, - 0x3C4C: 0x5199, - 0x3C4D: 0x5C04, - 0x3C4E: 0x6368, - 0x3C4F: 0x8D66, - 0x3C50: 0x659C, - 0x3C51: 0x716E, - 0x3C52: 0x793E, - 0x3C53: 0x7D17, - 0x3C54: 0x8005, - 0x3C55: 0x8B1D, - 0x3C56: 0x8ECA, - 0x3C57: 0x906E, - 0x3C58: 0x86C7, - 0x3C59: 0x90AA, - 0x3C5A: 0x501F, - 0x3C5B: 0x52FA, - 0x3C5C: 0x5C3A, - 0x3C5D: 0x6753, - 0x3C5E: 0x707C, - 0x3C5F: 0x7235, - 0x3C60: 0x914C, - 0x3C61: 0x91C8, - 0x3C62: 0x932B, - 0x3C63: 0x82E5, - 0x3C64: 0x5BC2, - 0x3C65: 0x5F31, - 0x3C66: 0x60F9, - 0x3C67: 0x4E3B, - 0x3C68: 0x53D6, - 0x3C69: 0x5B88, - 0x3C6A: 0x624B, - 0x3C6B: 0x6731, - 0x3C6C: 0x6B8A, - 0x3C6D: 0x72E9, - 0x3C6E: 0x73E0, - 0x3C6F: 0x7A2E, - 0x3C70: 0x816B, - 0x3C71: 0x8DA3, - 0x3C72: 0x9152, - 0x3C73: 0x9996, - 0x3C74: 0x5112, - 0x3C75: 0x53D7, - 0x3C76: 0x546A, - 0x3C77: 0x5BFF, - 0x3C78: 0x6388, - 0x3C79: 0x6A39, - 0x3C7A: 0x7DAC, - 0x3C7B: 0x9700, - 0x3C7C: 0x56DA, - 0x3C7D: 0x53CE, - 0x3C7E: 0x5468, - 0x3D21: 0x5B97, - 0x3D22: 0x5C31, - 0x3D23: 0x5DDE, - 0x3D24: 0x4FEE, - 0x3D25: 0x6101, - 0x3D26: 0x62FE, - 0x3D27: 0x6D32, - 0x3D28: 0x79C0, - 0x3D29: 0x79CB, - 0x3D2A: 0x7D42, - 0x3D2B: 0x7E4D, - 0x3D2C: 0x7FD2, - 0x3D2D: 0x81ED, - 0x3D2E: 0x821F, - 0x3D2F: 0x8490, - 0x3D30: 0x8846, - 0x3D31: 0x8972, - 0x3D32: 0x8B90, - 0x3D33: 0x8E74, - 0x3D34: 0x8F2F, - 0x3D35: 0x9031, - 0x3D36: 0x914B, - 0x3D37: 0x916C, - 0x3D38: 0x96C6, - 0x3D39: 0x919C, - 0x3D3A: 0x4EC0, - 0x3D3B: 0x4F4F, - 0x3D3C: 0x5145, - 0x3D3D: 0x5341, - 0x3D3E: 0x5F93, - 0x3D3F: 0x620E, - 0x3D40: 0x67D4, - 0x3D41: 0x6C41, - 0x3D42: 0x6E0B, - 0x3D43: 0x7363, - 0x3D44: 0x7E26, - 0x3D45: 0x91CD, - 0x3D46: 0x9283, - 0x3D47: 0x53D4, - 0x3D48: 0x5919, - 0x3D49: 0x5BBF, - 0x3D4A: 0x6DD1, - 0x3D4B: 0x795D, - 0x3D4C: 0x7E2E, - 0x3D4D: 0x7C9B, - 0x3D4E: 0x587E, - 0x3D4F: 0x719F, - 0x3D50: 0x51FA, - 0x3D51: 0x8853, - 0x3D52: 0x8FF0, - 0x3D53: 0x4FCA, - 0x3D54: 0x5CFB, - 0x3D55: 0x6625, - 0x3D56: 0x77AC, - 0x3D57: 0x7AE3, - 0x3D58: 0x821C, - 0x3D59: 0x99FF, - 0x3D5A: 0x51C6, - 0x3D5B: 0x5FAA, - 0x3D5C: 0x65EC, - 0x3D5D: 0x696F, - 0x3D5E: 0x6B89, - 0x3D5F: 0x6DF3, - 0x3D60: 0x6E96, - 0x3D61: 0x6F64, - 0x3D62: 0x76FE, - 0x3D63: 0x7D14, - 0x3D64: 0x5DE1, - 0x3D65: 0x9075, - 0x3D66: 0x9187, - 0x3D67: 0x9806, - 0x3D68: 0x51E6, - 0x3D69: 0x521D, - 0x3D6A: 0x6240, - 0x3D6B: 0x6691, - 0x3D6C: 0x66D9, - 0x3D6D: 0x6E1A, - 0x3D6E: 0x5EB6, - 0x3D6F: 0x7DD2, - 0x3D70: 0x7F72, - 0x3D71: 0x66F8, - 0x3D72: 0x85AF, - 0x3D73: 0x85F7, - 0x3D74: 0x8AF8, - 0x3D75: 0x52A9, - 0x3D76: 0x53D9, - 0x3D77: 0x5973, - 0x3D78: 0x5E8F, - 0x3D79: 0x5F90, - 0x3D7A: 0x6055, - 0x3D7B: 0x92E4, - 0x3D7C: 0x9664, - 0x3D7D: 0x50B7, - 0x3D7E: 0x511F, - 0x3E21: 0x52DD, - 0x3E22: 0x5320, - 0x3E23: 0x5347, - 0x3E24: 0x53EC, - 0x3E25: 0x54E8, - 0x3E26: 0x5546, - 0x3E27: 0x5531, - 0x3E28: 0x5617, - 0x3E29: 0x5968, - 0x3E2A: 0x59BE, - 0x3E2B: 0x5A3C, - 0x3E2C: 0x5BB5, - 0x3E2D: 0x5C06, - 0x3E2E: 0x5C0F, - 0x3E2F: 0x5C11, - 0x3E30: 0x5C1A, - 0x3E31: 0x5E84, - 0x3E32: 0x5E8A, - 0x3E33: 0x5EE0, - 0x3E34: 0x5F70, - 0x3E35: 0x627F, - 0x3E36: 0x6284, - 0x3E37: 0x62DB, - 0x3E38: 0x638C, - 0x3E39: 0x6377, - 0x3E3A: 0x6607, - 0x3E3B: 0x660C, - 0x3E3C: 0x662D, - 0x3E3D: 0x6676, - 0x3E3E: 0x677E, - 0x3E3F: 0x68A2, - 0x3E40: 0x6A1F, - 0x3E41: 0x6A35, - 0x3E42: 0x6CBC, - 0x3E43: 0x6D88, - 0x3E44: 0x6E09, - 0x3E45: 0x6E58, - 0x3E46: 0x713C, - 0x3E47: 0x7126, - 0x3E48: 0x7167, - 0x3E49: 0x75C7, - 0x3E4A: 0x7701, - 0x3E4B: 0x785D, - 0x3E4C: 0x7901, - 0x3E4D: 0x7965, - 0x3E4E: 0x79F0, - 0x3E4F: 0x7AE0, - 0x3E50: 0x7B11, - 0x3E51: 0x7CA7, - 0x3E52: 0x7D39, - 0x3E53: 0x8096, - 0x3E54: 0x83D6, - 0x3E55: 0x848B, - 0x3E56: 0x8549, - 0x3E57: 0x885D, - 0x3E58: 0x88F3, - 0x3E59: 0x8A1F, - 0x3E5A: 0x8A3C, - 0x3E5B: 0x8A54, - 0x3E5C: 0x8A73, - 0x3E5D: 0x8C61, - 0x3E5E: 0x8CDE, - 0x3E5F: 0x91A4, - 0x3E60: 0x9266, - 0x3E61: 0x937E, - 0x3E62: 0x9418, - 0x3E63: 0x969C, - 0x3E64: 0x9798, - 0x3E65: 0x4E0A, - 0x3E66: 0x4E08, - 0x3E67: 0x4E1E, - 0x3E68: 0x4E57, - 0x3E69: 0x5197, - 0x3E6A: 0x5270, - 0x3E6B: 0x57CE, - 0x3E6C: 0x5834, - 0x3E6D: 0x58CC, - 0x3E6E: 0x5B22, - 0x3E6F: 0x5E38, - 0x3E70: 0x60C5, - 0x3E71: 0x64FE, - 0x3E72: 0x6761, - 0x3E73: 0x6756, - 0x3E74: 0x6D44, - 0x3E75: 0x72B6, - 0x3E76: 0x7573, - 0x3E77: 0x7A63, - 0x3E78: 0x84B8, - 0x3E79: 0x8B72, - 0x3E7A: 0x91B8, - 0x3E7B: 0x9320, - 0x3E7C: 0x5631, - 0x3E7D: 0x57F4, - 0x3E7E: 0x98FE, - 0x3F21: 0x62ED, - 0x3F22: 0x690D, - 0x3F23: 0x6B96, - 0x3F24: 0x71ED, - 0x3F25: 0x7E54, - 0x3F26: 0x8077, - 0x3F27: 0x8272, - 0x3F28: 0x89E6, - 0x3F29: 0x98DF, - 0x3F2A: 0x8755, - 0x3F2B: 0x8FB1, - 0x3F2C: 0x5C3B, - 0x3F2D: 0x4F38, - 0x3F2E: 0x4FE1, - 0x3F2F: 0x4FB5, - 0x3F30: 0x5507, - 0x3F31: 0x5A20, - 0x3F32: 0x5BDD, - 0x3F33: 0x5BE9, - 0x3F34: 0x5FC3, - 0x3F35: 0x614E, - 0x3F36: 0x632F, - 0x3F37: 0x65B0, - 0x3F38: 0x664B, - 0x3F39: 0x68EE, - 0x3F3A: 0x699B, - 0x3F3B: 0x6D78, - 0x3F3C: 0x6DF1, - 0x3F3D: 0x7533, - 0x3F3E: 0x75B9, - 0x3F3F: 0x771F, - 0x3F40: 0x795E, - 0x3F41: 0x79E6, - 0x3F42: 0x7D33, - 0x3F43: 0x81E3, - 0x3F44: 0x82AF, - 0x3F45: 0x85AA, - 0x3F46: 0x89AA, - 0x3F47: 0x8A3A, - 0x3F48: 0x8EAB, - 0x3F49: 0x8F9B, - 0x3F4A: 0x9032, - 0x3F4B: 0x91DD, - 0x3F4C: 0x9707, - 0x3F4D: 0x4EBA, - 0x3F4E: 0x4EC1, - 0x3F4F: 0x5203, - 0x3F50: 0x5875, - 0x3F51: 0x58EC, - 0x3F52: 0x5C0B, - 0x3F53: 0x751A, - 0x3F54: 0x5C3D, - 0x3F55: 0x814E, - 0x3F56: 0x8A0A, - 0x3F57: 0x8FC5, - 0x3F58: 0x9663, - 0x3F59: 0x976D, - 0x3F5A: 0x7B25, - 0x3F5B: 0x8ACF, - 0x3F5C: 0x9808, - 0x3F5D: 0x9162, - 0x3F5E: 0x56F3, - 0x3F5F: 0x53A8, - 0x3F60: 0x9017, - 0x3F61: 0x5439, - 0x3F62: 0x5782, - 0x3F63: 0x5E25, - 0x3F64: 0x63A8, - 0x3F65: 0x6C34, - 0x3F66: 0x708A, - 0x3F67: 0x7761, - 0x3F68: 0x7C8B, - 0x3F69: 0x7FE0, - 0x3F6A: 0x8870, - 0x3F6B: 0x9042, - 0x3F6C: 0x9154, - 0x3F6D: 0x9310, - 0x3F6E: 0x9318, - 0x3F6F: 0x968F, - 0x3F70: 0x745E, - 0x3F71: 0x9AC4, - 0x3F72: 0x5D07, - 0x3F73: 0x5D69, - 0x3F74: 0x6570, - 0x3F75: 0x67A2, - 0x3F76: 0x8DA8, - 0x3F77: 0x96DB, - 0x3F78: 0x636E, - 0x3F79: 0x6749, - 0x3F7A: 0x6919, - 0x3F7B: 0x83C5, - 0x3F7C: 0x9817, - 0x3F7D: 0x96C0, - 0x3F7E: 0x88FE, - 0x4021: 0x6F84, - 0x4022: 0x647A, - 0x4023: 0x5BF8, - 0x4024: 0x4E16, - 0x4025: 0x702C, - 0x4026: 0x755D, - 0x4027: 0x662F, - 0x4028: 0x51C4, - 0x4029: 0x5236, - 0x402A: 0x52E2, - 0x402B: 0x59D3, - 0x402C: 0x5F81, - 0x402D: 0x6027, - 0x402E: 0x6210, - 0x402F: 0x653F, - 0x4030: 0x6574, - 0x4031: 0x661F, - 0x4032: 0x6674, - 0x4033: 0x68F2, - 0x4034: 0x6816, - 0x4035: 0x6B63, - 0x4036: 0x6E05, - 0x4037: 0x7272, - 0x4038: 0x751F, - 0x4039: 0x76DB, - 0x403A: 0x7CBE, - 0x403B: 0x8056, - 0x403C: 0x58F0, - 0x403D: 0x88FD, - 0x403E: 0x897F, - 0x403F: 0x8AA0, - 0x4040: 0x8A93, - 0x4041: 0x8ACB, - 0x4042: 0x901D, - 0x4043: 0x9192, - 0x4044: 0x9752, - 0x4045: 0x9759, - 0x4046: 0x6589, - 0x4047: 0x7A0E, - 0x4048: 0x8106, - 0x4049: 0x96BB, - 0x404A: 0x5E2D, - 0x404B: 0x60DC, - 0x404C: 0x621A, - 0x404D: 0x65A5, - 0x404E: 0x6614, - 0x404F: 0x6790, - 0x4050: 0x77F3, - 0x4051: 0x7A4D, - 0x4052: 0x7C4D, - 0x4053: 0x7E3E, - 0x4054: 0x810A, - 0x4055: 0x8CAC, - 0x4056: 0x8D64, - 0x4057: 0x8DE1, - 0x4058: 0x8E5F, - 0x4059: 0x78A9, - 0x405A: 0x5207, - 0x405B: 0x62D9, - 0x405C: 0x63A5, - 0x405D: 0x6442, - 0x405E: 0x6298, - 0x405F: 0x8A2D, - 0x4060: 0x7A83, - 0x4061: 0x7BC0, - 0x4062: 0x8AAC, - 0x4063: 0x96EA, - 0x4064: 0x7D76, - 0x4065: 0x820C, - 0x4066: 0x8749, - 0x4067: 0x4ED9, - 0x4068: 0x5148, - 0x4069: 0x5343, - 0x406A: 0x5360, - 0x406B: 0x5BA3, - 0x406C: 0x5C02, - 0x406D: 0x5C16, - 0x406E: 0x5DDD, - 0x406F: 0x6226, - 0x4070: 0x6247, - 0x4071: 0x64B0, - 0x4072: 0x6813, - 0x4073: 0x6834, - 0x4074: 0x6CC9, - 0x4075: 0x6D45, - 0x4076: 0x6D17, - 0x4077: 0x67D3, - 0x4078: 0x6F5C, - 0x4079: 0x714E, - 0x407A: 0x717D, - 0x407B: 0x65CB, - 0x407C: 0x7A7F, - 0x407D: 0x7BAD, - 0x407E: 0x7DDA, - 0x4121: 0x7E4A, - 0x4122: 0x7FA8, - 0x4123: 0x817A, - 0x4124: 0x821B, - 0x4125: 0x8239, - 0x4126: 0x85A6, - 0x4127: 0x8A6E, - 0x4128: 0x8CCE, - 0x4129: 0x8DF5, - 0x412A: 0x9078, - 0x412B: 0x9077, - 0x412C: 0x92AD, - 0x412D: 0x9291, - 0x412E: 0x9583, - 0x412F: 0x9BAE, - 0x4130: 0x524D, - 0x4131: 0x5584, - 0x4132: 0x6F38, - 0x4133: 0x7136, - 0x4134: 0x5168, - 0x4135: 0x7985, - 0x4136: 0x7E55, - 0x4137: 0x81B3, - 0x4138: 0x7CCE, - 0x4139: 0x564C, - 0x413A: 0x5851, - 0x413B: 0x5CA8, - 0x413C: 0x63AA, - 0x413D: 0x66FE, - 0x413E: 0x66FD, - 0x413F: 0x695A, - 0x4140: 0x72D9, - 0x4141: 0x758F, - 0x4142: 0x758E, - 0x4143: 0x790E, - 0x4144: 0x7956, - 0x4145: 0x79DF, - 0x4146: 0x7C97, - 0x4147: 0x7D20, - 0x4148: 0x7D44, - 0x4149: 0x8607, - 0x414A: 0x8A34, - 0x414B: 0x963B, - 0x414C: 0x9061, - 0x414D: 0x9F20, - 0x414E: 0x50E7, - 0x414F: 0x5275, - 0x4150: 0x53CC, - 0x4151: 0x53E2, - 0x4152: 0x5009, - 0x4153: 0x55AA, - 0x4154: 0x58EE, - 0x4155: 0x594F, - 0x4156: 0x723D, - 0x4157: 0x5B8B, - 0x4158: 0x5C64, - 0x4159: 0x531D, - 0x415A: 0x60E3, - 0x415B: 0x60F3, - 0x415C: 0x635C, - 0x415D: 0x6383, - 0x415E: 0x633F, - 0x415F: 0x63BB, - 0x4160: 0x64CD, - 0x4161: 0x65E9, - 0x4162: 0x66F9, - 0x4163: 0x5DE3, - 0x4164: 0x69CD, - 0x4165: 0x69FD, - 0x4166: 0x6F15, - 0x4167: 0x71E5, - 0x4168: 0x4E89, - 0x4169: 0x75E9, - 0x416A: 0x76F8, - 0x416B: 0x7A93, - 0x416C: 0x7CDF, - 0x416D: 0x7DCF, - 0x416E: 0x7D9C, - 0x416F: 0x8061, - 0x4170: 0x8349, - 0x4171: 0x8358, - 0x4172: 0x846C, - 0x4173: 0x84BC, - 0x4174: 0x85FB, - 0x4175: 0x88C5, - 0x4176: 0x8D70, - 0x4177: 0x9001, - 0x4178: 0x906D, - 0x4179: 0x9397, - 0x417A: 0x971C, - 0x417B: 0x9A12, - 0x417C: 0x50CF, - 0x417D: 0x5897, - 0x417E: 0x618E, - 0x4221: 0x81D3, - 0x4222: 0x8535, - 0x4223: 0x8D08, - 0x4224: 0x9020, - 0x4225: 0x4FC3, - 0x4226: 0x5074, - 0x4227: 0x5247, - 0x4228: 0x5373, - 0x4229: 0x606F, - 0x422A: 0x6349, - 0x422B: 0x675F, - 0x422C: 0x6E2C, - 0x422D: 0x8DB3, - 0x422E: 0x901F, - 0x422F: 0x4FD7, - 0x4230: 0x5C5E, - 0x4231: 0x8CCA, - 0x4232: 0x65CF, - 0x4233: 0x7D9A, - 0x4234: 0x5352, - 0x4235: 0x8896, - 0x4236: 0x5176, - 0x4237: 0x63C3, - 0x4238: 0x5B58, - 0x4239: 0x5B6B, - 0x423A: 0x5C0A, - 0x423B: 0x640D, - 0x423C: 0x6751, - 0x423D: 0x905C, - 0x423E: 0x4ED6, - 0x423F: 0x591A, - 0x4240: 0x592A, - 0x4241: 0x6C70, - 0x4242: 0x8A51, - 0x4243: 0x553E, - 0x4244: 0x5815, - 0x4245: 0x59A5, - 0x4246: 0x60F0, - 0x4247: 0x6253, - 0x4248: 0x67C1, - 0x4249: 0x8235, - 0x424A: 0x6955, - 0x424B: 0x9640, - 0x424C: 0x99C4, - 0x424D: 0x9A28, - 0x424E: 0x4F53, - 0x424F: 0x5806, - 0x4250: 0x5BFE, - 0x4251: 0x8010, - 0x4252: 0x5CB1, - 0x4253: 0x5E2F, - 0x4254: 0x5F85, - 0x4255: 0x6020, - 0x4256: 0x614B, - 0x4257: 0x6234, - 0x4258: 0x66FF, - 0x4259: 0x6CF0, - 0x425A: 0x6EDE, - 0x425B: 0x80CE, - 0x425C: 0x817F, - 0x425D: 0x82D4, - 0x425E: 0x888B, - 0x425F: 0x8CB8, - 0x4260: 0x9000, - 0x4261: 0x902E, - 0x4262: 0x968A, - 0x4263: 0x9EDB, - 0x4264: 0x9BDB, - 0x4265: 0x4EE3, - 0x4266: 0x53F0, - 0x4267: 0x5927, - 0x4268: 0x7B2C, - 0x4269: 0x918D, - 0x426A: 0x984C, - 0x426B: 0x9DF9, - 0x426C: 0x6EDD, - 0x426D: 0x7027, - 0x426E: 0x5353, - 0x426F: 0x5544, - 0x4270: 0x5B85, - 0x4271: 0x6258, - 0x4272: 0x629E, - 0x4273: 0x62D3, - 0x4274: 0x6CA2, - 0x4275: 0x6FEF, - 0x4276: 0x7422, - 0x4277: 0x8A17, - 0x4278: 0x9438, - 0x4279: 0x6FC1, - 0x427A: 0x8AFE, - 0x427B: 0x8338, - 0x427C: 0x51E7, - 0x427D: 0x86F8, - 0x427E: 0x53EA, - 0x4321: 0x53E9, - 0x4322: 0x4F46, - 0x4323: 0x9054, - 0x4324: 0x8FB0, - 0x4325: 0x596A, - 0x4326: 0x8131, - 0x4327: 0x5DFD, - 0x4328: 0x7AEA, - 0x4329: 0x8FBF, - 0x432A: 0x68DA, - 0x432B: 0x8C37, - 0x432C: 0x72F8, - 0x432D: 0x9C48, - 0x432E: 0x6A3D, - 0x432F: 0x8AB0, - 0x4330: 0x4E39, - 0x4331: 0x5358, - 0x4332: 0x5606, - 0x4333: 0x5766, - 0x4334: 0x62C5, - 0x4335: 0x63A2, - 0x4336: 0x65E6, - 0x4337: 0x6B4E, - 0x4338: 0x6DE1, - 0x4339: 0x6E5B, - 0x433A: 0x70AD, - 0x433B: 0x77ED, - 0x433C: 0x7AEF, - 0x433D: 0x7BAA, - 0x433E: 0x7DBB, - 0x433F: 0x803D, - 0x4340: 0x80C6, - 0x4341: 0x86CB, - 0x4342: 0x8A95, - 0x4343: 0x935B, - 0x4344: 0x56E3, - 0x4345: 0x58C7, - 0x4346: 0x5F3E, - 0x4347: 0x65AD, - 0x4348: 0x6696, - 0x4349: 0x6A80, - 0x434A: 0x6BB5, - 0x434B: 0x7537, - 0x434C: 0x8AC7, - 0x434D: 0x5024, - 0x434E: 0x77E5, - 0x434F: 0x5730, - 0x4350: 0x5F1B, - 0x4351: 0x6065, - 0x4352: 0x667A, - 0x4353: 0x6C60, - 0x4354: 0x75F4, - 0x4355: 0x7A1A, - 0x4356: 0x7F6E, - 0x4357: 0x81F4, - 0x4358: 0x8718, - 0x4359: 0x9045, - 0x435A: 0x99B3, - 0x435B: 0x7BC9, - 0x435C: 0x755C, - 0x435D: 0x7AF9, - 0x435E: 0x7B51, - 0x435F: 0x84C4, - 0x4360: 0x9010, - 0x4361: 0x79E9, - 0x4362: 0x7A92, - 0x4363: 0x8336, - 0x4364: 0x5AE1, - 0x4365: 0x7740, - 0x4366: 0x4E2D, - 0x4367: 0x4EF2, - 0x4368: 0x5B99, - 0x4369: 0x5FE0, - 0x436A: 0x62BD, - 0x436B: 0x663C, - 0x436C: 0x67F1, - 0x436D: 0x6CE8, - 0x436E: 0x866B, - 0x436F: 0x8877, - 0x4370: 0x8A3B, - 0x4371: 0x914E, - 0x4372: 0x92F3, - 0x4373: 0x99D0, - 0x4374: 0x6A17, - 0x4375: 0x7026, - 0x4376: 0x732A, - 0x4377: 0x82E7, - 0x4378: 0x8457, - 0x4379: 0x8CAF, - 0x437A: 0x4E01, - 0x437B: 0x5146, - 0x437C: 0x51CB, - 0x437D: 0x558B, - 0x437E: 0x5BF5, - 0x4421: 0x5E16, - 0x4422: 0x5E33, - 0x4423: 0x5E81, - 0x4424: 0x5F14, - 0x4425: 0x5F35, - 0x4426: 0x5F6B, - 0x4427: 0x5FB4, - 0x4428: 0x61F2, - 0x4429: 0x6311, - 0x442A: 0x66A2, - 0x442B: 0x671D, - 0x442C: 0x6F6E, - 0x442D: 0x7252, - 0x442E: 0x753A, - 0x442F: 0x773A, - 0x4430: 0x8074, - 0x4431: 0x8139, - 0x4432: 0x8178, - 0x4433: 0x8776, - 0x4434: 0x8ABF, - 0x4435: 0x8ADC, - 0x4436: 0x8D85, - 0x4437: 0x8DF3, - 0x4438: 0x929A, - 0x4439: 0x9577, - 0x443A: 0x9802, - 0x443B: 0x9CE5, - 0x443C: 0x52C5, - 0x443D: 0x6357, - 0x443E: 0x76F4, - 0x443F: 0x6715, - 0x4440: 0x6C88, - 0x4441: 0x73CD, - 0x4442: 0x8CC3, - 0x4443: 0x93AE, - 0x4444: 0x9673, - 0x4445: 0x6D25, - 0x4446: 0x589C, - 0x4447: 0x690E, - 0x4448: 0x69CC, - 0x4449: 0x8FFD, - 0x444A: 0x939A, - 0x444B: 0x75DB, - 0x444C: 0x901A, - 0x444D: 0x585A, - 0x444E: 0x6802, - 0x444F: 0x63B4, - 0x4450: 0x69FB, - 0x4451: 0x4F43, - 0x4452: 0x6F2C, - 0x4453: 0x67D8, - 0x4454: 0x8FBB, - 0x4455: 0x8526, - 0x4456: 0x7DB4, - 0x4457: 0x9354, - 0x4458: 0x693F, - 0x4459: 0x6F70, - 0x445A: 0x576A, - 0x445B: 0x58F7, - 0x445C: 0x5B2C, - 0x445D: 0x7D2C, - 0x445E: 0x722A, - 0x445F: 0x540A, - 0x4460: 0x91E3, - 0x4461: 0x9DB4, - 0x4462: 0x4EAD, - 0x4463: 0x4F4E, - 0x4464: 0x505C, - 0x4465: 0x5075, - 0x4466: 0x5243, - 0x4467: 0x8C9E, - 0x4468: 0x5448, - 0x4469: 0x5824, - 0x446A: 0x5B9A, - 0x446B: 0x5E1D, - 0x446C: 0x5E95, - 0x446D: 0x5EAD, - 0x446E: 0x5EF7, - 0x446F: 0x5F1F, - 0x4470: 0x608C, - 0x4471: 0x62B5, - 0x4472: 0x633A, - 0x4473: 0x63D0, - 0x4474: 0x68AF, - 0x4475: 0x6C40, - 0x4476: 0x7887, - 0x4477: 0x798E, - 0x4478: 0x7A0B, - 0x4479: 0x7DE0, - 0x447A: 0x8247, - 0x447B: 0x8A02, - 0x447C: 0x8AE6, - 0x447D: 0x8E44, - 0x447E: 0x9013, - 0x4521: 0x90B8, - 0x4522: 0x912D, - 0x4523: 0x91D8, - 0x4524: 0x9F0E, - 0x4525: 0x6CE5, - 0x4526: 0x6458, - 0x4527: 0x64E2, - 0x4528: 0x6575, - 0x4529: 0x6EF4, - 0x452A: 0x7684, - 0x452B: 0x7B1B, - 0x452C: 0x9069, - 0x452D: 0x93D1, - 0x452E: 0x6EBA, - 0x452F: 0x54F2, - 0x4530: 0x5FB9, - 0x4531: 0x64A4, - 0x4532: 0x8F4D, - 0x4533: 0x8FED, - 0x4534: 0x9244, - 0x4535: 0x5178, - 0x4536: 0x586B, - 0x4537: 0x5929, - 0x4538: 0x5C55, - 0x4539: 0x5E97, - 0x453A: 0x6DFB, - 0x453B: 0x7E8F, - 0x453C: 0x751C, - 0x453D: 0x8CBC, - 0x453E: 0x8EE2, - 0x453F: 0x985B, - 0x4540: 0x70B9, - 0x4541: 0x4F1D, - 0x4542: 0x6BBF, - 0x4543: 0x6FB1, - 0x4544: 0x7530, - 0x4545: 0x96FB, - 0x4546: 0x514E, - 0x4547: 0x5410, - 0x4548: 0x5835, - 0x4549: 0x5857, - 0x454A: 0x59AC, - 0x454B: 0x5C60, - 0x454C: 0x5F92, - 0x454D: 0x6597, - 0x454E: 0x675C, - 0x454F: 0x6E21, - 0x4550: 0x767B, - 0x4551: 0x83DF, - 0x4552: 0x8CED, - 0x4553: 0x9014, - 0x4554: 0x90FD, - 0x4555: 0x934D, - 0x4556: 0x7825, - 0x4557: 0x783A, - 0x4558: 0x52AA, - 0x4559: 0x5EA6, - 0x455A: 0x571F, - 0x455B: 0x5974, - 0x455C: 0x6012, - 0x455D: 0x5012, - 0x455E: 0x515A, - 0x455F: 0x51AC, - 0x4560: 0x51CD, - 0x4561: 0x5200, - 0x4562: 0x5510, - 0x4563: 0x5854, - 0x4564: 0x5858, - 0x4565: 0x5957, - 0x4566: 0x5B95, - 0x4567: 0x5CF6, - 0x4568: 0x5D8B, - 0x4569: 0x60BC, - 0x456A: 0x6295, - 0x456B: 0x642D, - 0x456C: 0x6771, - 0x456D: 0x6843, - 0x456E: 0x68BC, - 0x456F: 0x68DF, - 0x4570: 0x76D7, - 0x4571: 0x6DD8, - 0x4572: 0x6E6F, - 0x4573: 0x6D9B, - 0x4574: 0x706F, - 0x4575: 0x71C8, - 0x4576: 0x5F53, - 0x4577: 0x75D8, - 0x4578: 0x7977, - 0x4579: 0x7B49, - 0x457A: 0x7B54, - 0x457B: 0x7B52, - 0x457C: 0x7CD6, - 0x457D: 0x7D71, - 0x457E: 0x5230, - 0x4621: 0x8463, - 0x4622: 0x8569, - 0x4623: 0x85E4, - 0x4624: 0x8A0E, - 0x4625: 0x8B04, - 0x4626: 0x8C46, - 0x4627: 0x8E0F, - 0x4628: 0x9003, - 0x4629: 0x900F, - 0x462A: 0x9419, - 0x462B: 0x9676, - 0x462C: 0x982D, - 0x462D: 0x9A30, - 0x462E: 0x95D8, - 0x462F: 0x50CD, - 0x4630: 0x52D5, - 0x4631: 0x540C, - 0x4632: 0x5802, - 0x4633: 0x5C0E, - 0x4634: 0x61A7, - 0x4635: 0x649E, - 0x4636: 0x6D1E, - 0x4637: 0x77B3, - 0x4638: 0x7AE5, - 0x4639: 0x80F4, - 0x463A: 0x8404, - 0x463B: 0x9053, - 0x463C: 0x9285, - 0x463D: 0x5CE0, - 0x463E: 0x9D07, - 0x463F: 0x533F, - 0x4640: 0x5F97, - 0x4641: 0x5FB3, - 0x4642: 0x6D9C, - 0x4643: 0x7279, - 0x4644: 0x7763, - 0x4645: 0x79BF, - 0x4646: 0x7BE4, - 0x4647: 0x6BD2, - 0x4648: 0x72EC, - 0x4649: 0x8AAD, - 0x464A: 0x6803, - 0x464B: 0x6A61, - 0x464C: 0x51F8, - 0x464D: 0x7A81, - 0x464E: 0x6934, - 0x464F: 0x5C4A, - 0x4650: 0x9CF6, - 0x4651: 0x82EB, - 0x4652: 0x5BC5, - 0x4653: 0x9149, - 0x4654: 0x701E, - 0x4655: 0x5678, - 0x4656: 0x5C6F, - 0x4657: 0x60C7, - 0x4658: 0x6566, - 0x4659: 0x6C8C, - 0x465A: 0x8C5A, - 0x465B: 0x9041, - 0x465C: 0x9813, - 0x465D: 0x5451, - 0x465E: 0x66C7, - 0x465F: 0x920D, - 0x4660: 0x5948, - 0x4661: 0x90A3, - 0x4662: 0x5185, - 0x4663: 0x4E4D, - 0x4664: 0x51EA, - 0x4665: 0x8599, - 0x4666: 0x8B0E, - 0x4667: 0x7058, - 0x4668: 0x637A, - 0x4669: 0x934B, - 0x466A: 0x6962, - 0x466B: 0x99B4, - 0x466C: 0x7E04, - 0x466D: 0x7577, - 0x466E: 0x5357, - 0x466F: 0x6960, - 0x4670: 0x8EDF, - 0x4671: 0x96E3, - 0x4672: 0x6C5D, - 0x4673: 0x4E8C, - 0x4674: 0x5C3C, - 0x4675: 0x5F10, - 0x4676: 0x8FE9, - 0x4677: 0x5302, - 0x4678: 0x8CD1, - 0x4679: 0x8089, - 0x467A: 0x8679, - 0x467B: 0x5EFF, - 0x467C: 0x65E5, - 0x467D: 0x4E73, - 0x467E: 0x5165, - 0x4721: 0x5982, - 0x4722: 0x5C3F, - 0x4723: 0x97EE, - 0x4724: 0x4EFB, - 0x4725: 0x598A, - 0x4726: 0x5FCD, - 0x4727: 0x8A8D, - 0x4728: 0x6FE1, - 0x4729: 0x79B0, - 0x472A: 0x7962, - 0x472B: 0x5BE7, - 0x472C: 0x8471, - 0x472D: 0x732B, - 0x472E: 0x71B1, - 0x472F: 0x5E74, - 0x4730: 0x5FF5, - 0x4731: 0x637B, - 0x4732: 0x649A, - 0x4733: 0x71C3, - 0x4734: 0x7C98, - 0x4735: 0x4E43, - 0x4736: 0x5EFC, - 0x4737: 0x4E4B, - 0x4738: 0x57DC, - 0x4739: 0x56A2, - 0x473A: 0x60A9, - 0x473B: 0x6FC3, - 0x473C: 0x7D0D, - 0x473D: 0x80FD, - 0x473E: 0x8133, - 0x473F: 0x81BF, - 0x4740: 0x8FB2, - 0x4741: 0x8997, - 0x4742: 0x86A4, - 0x4743: 0x5DF4, - 0x4744: 0x628A, - 0x4745: 0x64AD, - 0x4746: 0x8987, - 0x4747: 0x6777, - 0x4748: 0x6CE2, - 0x4749: 0x6D3E, - 0x474A: 0x7436, - 0x474B: 0x7834, - 0x474C: 0x5A46, - 0x474D: 0x7F75, - 0x474E: 0x82AD, - 0x474F: 0x99AC, - 0x4750: 0x4FF3, - 0x4751: 0x5EC3, - 0x4752: 0x62DD, - 0x4753: 0x6392, - 0x4754: 0x6557, - 0x4755: 0x676F, - 0x4756: 0x76C3, - 0x4757: 0x724C, - 0x4758: 0x80CC, - 0x4759: 0x80BA, - 0x475A: 0x8F29, - 0x475B: 0x914D, - 0x475C: 0x500D, - 0x475D: 0x57F9, - 0x475E: 0x5A92, - 0x475F: 0x6885, - 0x4760: 0x6973, - 0x4761: 0x7164, - 0x4762: 0x72FD, - 0x4763: 0x8CB7, - 0x4764: 0x58F2, - 0x4765: 0x8CE0, - 0x4766: 0x966A, - 0x4767: 0x9019, - 0x4768: 0x877F, - 0x4769: 0x79E4, - 0x476A: 0x77E7, - 0x476B: 0x8429, - 0x476C: 0x4F2F, - 0x476D: 0x5265, - 0x476E: 0x535A, - 0x476F: 0x62CD, - 0x4770: 0x67CF, - 0x4771: 0x6CCA, - 0x4772: 0x767D, - 0x4773: 0x7B94, - 0x4774: 0x7C95, - 0x4775: 0x8236, - 0x4776: 0x8584, - 0x4777: 0x8FEB, - 0x4778: 0x66DD, - 0x4779: 0x6F20, - 0x477A: 0x7206, - 0x477B: 0x7E1B, - 0x477C: 0x83AB, - 0x477D: 0x99C1, - 0x477E: 0x9EA6, - 0x4821: 0x51FD, - 0x4822: 0x7BB1, - 0x4823: 0x7872, - 0x4824: 0x7BB8, - 0x4825: 0x8087, - 0x4826: 0x7B48, - 0x4827: 0x6AE8, - 0x4828: 0x5E61, - 0x4829: 0x808C, - 0x482A: 0x7551, - 0x482B: 0x7560, - 0x482C: 0x516B, - 0x482D: 0x9262, - 0x482E: 0x6E8C, - 0x482F: 0x767A, - 0x4830: 0x9197, - 0x4831: 0x9AEA, - 0x4832: 0x4F10, - 0x4833: 0x7F70, - 0x4834: 0x629C, - 0x4835: 0x7B4F, - 0x4836: 0x95A5, - 0x4837: 0x9CE9, - 0x4838: 0x567A, - 0x4839: 0x5859, - 0x483A: 0x86E4, - 0x483B: 0x96BC, - 0x483C: 0x4F34, - 0x483D: 0x5224, - 0x483E: 0x534A, - 0x483F: 0x53CD, - 0x4840: 0x53DB, - 0x4841: 0x5E06, - 0x4842: 0x642C, - 0x4843: 0x6591, - 0x4844: 0x677F, - 0x4845: 0x6C3E, - 0x4846: 0x6C4E, - 0x4847: 0x7248, - 0x4848: 0x72AF, - 0x4849: 0x73ED, - 0x484A: 0x7554, - 0x484B: 0x7E41, - 0x484C: 0x822C, - 0x484D: 0x85E9, - 0x484E: 0x8CA9, - 0x484F: 0x7BC4, - 0x4850: 0x91C6, - 0x4851: 0x7169, - 0x4852: 0x9812, - 0x4853: 0x98EF, - 0x4854: 0x633D, - 0x4855: 0x6669, - 0x4856: 0x756A, - 0x4857: 0x76E4, - 0x4858: 0x78D0, - 0x4859: 0x8543, - 0x485A: 0x86EE, - 0x485B: 0x532A, - 0x485C: 0x5351, - 0x485D: 0x5426, - 0x485E: 0x5983, - 0x485F: 0x5E87, - 0x4860: 0x5F7C, - 0x4861: 0x60B2, - 0x4862: 0x6249, - 0x4863: 0x6279, - 0x4864: 0x62AB, - 0x4865: 0x6590, - 0x4866: 0x6BD4, - 0x4867: 0x6CCC, - 0x4868: 0x75B2, - 0x4869: 0x76AE, - 0x486A: 0x7891, - 0x486B: 0x79D8, - 0x486C: 0x7DCB, - 0x486D: 0x7F77, - 0x486E: 0x80A5, - 0x486F: 0x88AB, - 0x4870: 0x8AB9, - 0x4871: 0x8CBB, - 0x4872: 0x907F, - 0x4873: 0x975E, - 0x4874: 0x98DB, - 0x4875: 0x6A0B, - 0x4876: 0x7C38, - 0x4877: 0x5099, - 0x4878: 0x5C3E, - 0x4879: 0x5FAE, - 0x487A: 0x6787, - 0x487B: 0x6BD8, - 0x487C: 0x7435, - 0x487D: 0x7709, - 0x487E: 0x7F8E, - 0x4921: 0x9F3B, - 0x4922: 0x67CA, - 0x4923: 0x7A17, - 0x4924: 0x5339, - 0x4925: 0x758B, - 0x4926: 0x9AED, - 0x4927: 0x5F66, - 0x4928: 0x819D, - 0x4929: 0x83F1, - 0x492A: 0x8098, - 0x492B: 0x5F3C, - 0x492C: 0x5FC5, - 0x492D: 0x7562, - 0x492E: 0x7B46, - 0x492F: 0x903C, - 0x4930: 0x6867, - 0x4931: 0x59EB, - 0x4932: 0x5A9B, - 0x4933: 0x7D10, - 0x4934: 0x767E, - 0x4935: 0x8B2C, - 0x4936: 0x4FF5, - 0x4937: 0x5F6A, - 0x4938: 0x6A19, - 0x4939: 0x6C37, - 0x493A: 0x6F02, - 0x493B: 0x74E2, - 0x493C: 0x7968, - 0x493D: 0x8868, - 0x493E: 0x8A55, - 0x493F: 0x8C79, - 0x4940: 0x5EDF, - 0x4941: 0x63CF, - 0x4942: 0x75C5, - 0x4943: 0x79D2, - 0x4944: 0x82D7, - 0x4945: 0x9328, - 0x4946: 0x92F2, - 0x4947: 0x849C, - 0x4948: 0x86ED, - 0x4949: 0x9C2D, - 0x494A: 0x54C1, - 0x494B: 0x5F6C, - 0x494C: 0x658C, - 0x494D: 0x6D5C, - 0x494E: 0x7015, - 0x494F: 0x8CA7, - 0x4950: 0x8CD3, - 0x4951: 0x983B, - 0x4952: 0x654F, - 0x4953: 0x74F6, - 0x4954: 0x4E0D, - 0x4955: 0x4ED8, - 0x4956: 0x57E0, - 0x4957: 0x592B, - 0x4958: 0x5A66, - 0x4959: 0x5BCC, - 0x495A: 0x51A8, - 0x495B: 0x5E03, - 0x495C: 0x5E9C, - 0x495D: 0x6016, - 0x495E: 0x6276, - 0x495F: 0x6577, - 0x4960: 0x65A7, - 0x4961: 0x666E, - 0x4962: 0x6D6E, - 0x4963: 0x7236, - 0x4964: 0x7B26, - 0x4965: 0x8150, - 0x4966: 0x819A, - 0x4967: 0x8299, - 0x4968: 0x8B5C, - 0x4969: 0x8CA0, - 0x496A: 0x8CE6, - 0x496B: 0x8D74, - 0x496C: 0x961C, - 0x496D: 0x9644, - 0x496E: 0x4FAE, - 0x496F: 0x64AB, - 0x4970: 0x6B66, - 0x4971: 0x821E, - 0x4972: 0x8461, - 0x4973: 0x856A, - 0x4974: 0x90E8, - 0x4975: 0x5C01, - 0x4976: 0x6953, - 0x4977: 0x98A8, - 0x4978: 0x847A, - 0x4979: 0x8557, - 0x497A: 0x4F0F, - 0x497B: 0x526F, - 0x497C: 0x5FA9, - 0x497D: 0x5E45, - 0x497E: 0x670D, - 0x4A21: 0x798F, - 0x4A22: 0x8179, - 0x4A23: 0x8907, - 0x4A24: 0x8986, - 0x4A25: 0x6DF5, - 0x4A26: 0x5F17, - 0x4A27: 0x6255, - 0x4A28: 0x6CB8, - 0x4A29: 0x4ECF, - 0x4A2A: 0x7269, - 0x4A2B: 0x9B92, - 0x4A2C: 0x5206, - 0x4A2D: 0x543B, - 0x4A2E: 0x5674, - 0x4A2F: 0x58B3, - 0x4A30: 0x61A4, - 0x4A31: 0x626E, - 0x4A32: 0x711A, - 0x4A33: 0x596E, - 0x4A34: 0x7C89, - 0x4A35: 0x7CDE, - 0x4A36: 0x7D1B, - 0x4A37: 0x96F0, - 0x4A38: 0x6587, - 0x4A39: 0x805E, - 0x4A3A: 0x4E19, - 0x4A3B: 0x4F75, - 0x4A3C: 0x5175, - 0x4A3D: 0x5840, - 0x4A3E: 0x5E63, - 0x4A3F: 0x5E73, - 0x4A40: 0x5F0A, - 0x4A41: 0x67C4, - 0x4A42: 0x4E26, - 0x4A43: 0x853D, - 0x4A44: 0x9589, - 0x4A45: 0x965B, - 0x4A46: 0x7C73, - 0x4A47: 0x9801, - 0x4A48: 0x50FB, - 0x4A49: 0x58C1, - 0x4A4A: 0x7656, - 0x4A4B: 0x78A7, - 0x4A4C: 0x5225, - 0x4A4D: 0x77A5, - 0x4A4E: 0x8511, - 0x4A4F: 0x7B86, - 0x4A50: 0x504F, - 0x4A51: 0x5909, - 0x4A52: 0x7247, - 0x4A53: 0x7BC7, - 0x4A54: 0x7DE8, - 0x4A55: 0x8FBA, - 0x4A56: 0x8FD4, - 0x4A57: 0x904D, - 0x4A58: 0x4FBF, - 0x4A59: 0x52C9, - 0x4A5A: 0x5A29, - 0x4A5B: 0x5F01, - 0x4A5C: 0x97AD, - 0x4A5D: 0x4FDD, - 0x4A5E: 0x8217, - 0x4A5F: 0x92EA, - 0x4A60: 0x5703, - 0x4A61: 0x6355, - 0x4A62: 0x6B69, - 0x4A63: 0x752B, - 0x4A64: 0x88DC, - 0x4A65: 0x8F14, - 0x4A66: 0x7A42, - 0x4A67: 0x52DF, - 0x4A68: 0x5893, - 0x4A69: 0x6155, - 0x4A6A: 0x620A, - 0x4A6B: 0x66AE, - 0x4A6C: 0x6BCD, - 0x4A6D: 0x7C3F, - 0x4A6E: 0x83E9, - 0x4A6F: 0x5023, - 0x4A70: 0x4FF8, - 0x4A71: 0x5305, - 0x4A72: 0x5446, - 0x4A73: 0x5831, - 0x4A74: 0x5949, - 0x4A75: 0x5B9D, - 0x4A76: 0x5CF0, - 0x4A77: 0x5CEF, - 0x4A78: 0x5D29, - 0x4A79: 0x5E96, - 0x4A7A: 0x62B1, - 0x4A7B: 0x6367, - 0x4A7C: 0x653E, - 0x4A7D: 0x65B9, - 0x4A7E: 0x670B, - 0x4B21: 0x6CD5, - 0x4B22: 0x6CE1, - 0x4B23: 0x70F9, - 0x4B24: 0x7832, - 0x4B25: 0x7E2B, - 0x4B26: 0x80DE, - 0x4B27: 0x82B3, - 0x4B28: 0x840C, - 0x4B29: 0x84EC, - 0x4B2A: 0x8702, - 0x4B2B: 0x8912, - 0x4B2C: 0x8A2A, - 0x4B2D: 0x8C4A, - 0x4B2E: 0x90A6, - 0x4B2F: 0x92D2, - 0x4B30: 0x98FD, - 0x4B31: 0x9CF3, - 0x4B32: 0x9D6C, - 0x4B33: 0x4E4F, - 0x4B34: 0x4EA1, - 0x4B35: 0x508D, - 0x4B36: 0x5256, - 0x4B37: 0x574A, - 0x4B38: 0x59A8, - 0x4B39: 0x5E3D, - 0x4B3A: 0x5FD8, - 0x4B3B: 0x5FD9, - 0x4B3C: 0x623F, - 0x4B3D: 0x66B4, - 0x4B3E: 0x671B, - 0x4B3F: 0x67D0, - 0x4B40: 0x68D2, - 0x4B41: 0x5192, - 0x4B42: 0x7D21, - 0x4B43: 0x80AA, - 0x4B44: 0x81A8, - 0x4B45: 0x8B00, - 0x4B46: 0x8C8C, - 0x4B47: 0x8CBF, - 0x4B48: 0x927E, - 0x4B49: 0x9632, - 0x4B4A: 0x5420, - 0x4B4B: 0x982C, - 0x4B4C: 0x5317, - 0x4B4D: 0x50D5, - 0x4B4E: 0x535C, - 0x4B4F: 0x58A8, - 0x4B50: 0x64B2, - 0x4B51: 0x6734, - 0x4B52: 0x7267, - 0x4B53: 0x7766, - 0x4B54: 0x7A46, - 0x4B55: 0x91E6, - 0x4B56: 0x52C3, - 0x4B57: 0x6CA1, - 0x4B58: 0x6B86, - 0x4B59: 0x5800, - 0x4B5A: 0x5E4C, - 0x4B5B: 0x5954, - 0x4B5C: 0x672C, - 0x4B5D: 0x7FFB, - 0x4B5E: 0x51E1, - 0x4B5F: 0x76C6, - 0x4B60: 0x6469, - 0x4B61: 0x78E8, - 0x4B62: 0x9B54, - 0x4B63: 0x9EBB, - 0x4B64: 0x57CB, - 0x4B65: 0x59B9, - 0x4B66: 0x6627, - 0x4B67: 0x679A, - 0x4B68: 0x6BCE, - 0x4B69: 0x54E9, - 0x4B6A: 0x69D9, - 0x4B6B: 0x5E55, - 0x4B6C: 0x819C, - 0x4B6D: 0x6795, - 0x4B6E: 0x9BAA, - 0x4B6F: 0x67FE, - 0x4B70: 0x9C52, - 0x4B71: 0x685D, - 0x4B72: 0x4EA6, - 0x4B73: 0x4FE3, - 0x4B74: 0x53C8, - 0x4B75: 0x62B9, - 0x4B76: 0x672B, - 0x4B77: 0x6CAB, - 0x4B78: 0x8FC4, - 0x4B79: 0x4FAD, - 0x4B7A: 0x7E6D, - 0x4B7B: 0x9EBF, - 0x4B7C: 0x4E07, - 0x4B7D: 0x6162, - 0x4B7E: 0x6E80, - 0x4C21: 0x6F2B, - 0x4C22: 0x8513, - 0x4C23: 0x5473, - 0x4C24: 0x672A, - 0x4C25: 0x9B45, - 0x4C26: 0x5DF3, - 0x4C27: 0x7B95, - 0x4C28: 0x5CAC, - 0x4C29: 0x5BC6, - 0x4C2A: 0x871C, - 0x4C2B: 0x6E4A, - 0x4C2C: 0x84D1, - 0x4C2D: 0x7A14, - 0x4C2E: 0x8108, - 0x4C2F: 0x5999, - 0x4C30: 0x7C8D, - 0x4C31: 0x6C11, - 0x4C32: 0x7720, - 0x4C33: 0x52D9, - 0x4C34: 0x5922, - 0x4C35: 0x7121, - 0x4C36: 0x725F, - 0x4C37: 0x77DB, - 0x4C38: 0x9727, - 0x4C39: 0x9D61, - 0x4C3A: 0x690B, - 0x4C3B: 0x5A7F, - 0x4C3C: 0x5A18, - 0x4C3D: 0x51A5, - 0x4C3E: 0x540D, - 0x4C3F: 0x547D, - 0x4C40: 0x660E, - 0x4C41: 0x76DF, - 0x4C42: 0x8FF7, - 0x4C43: 0x9298, - 0x4C44: 0x9CF4, - 0x4C45: 0x59EA, - 0x4C46: 0x725D, - 0x4C47: 0x6EC5, - 0x4C48: 0x514D, - 0x4C49: 0x68C9, - 0x4C4A: 0x7DBF, - 0x4C4B: 0x7DEC, - 0x4C4C: 0x9762, - 0x4C4D: 0x9EBA, - 0x4C4E: 0x6478, - 0x4C4F: 0x6A21, - 0x4C50: 0x8302, - 0x4C51: 0x5984, - 0x4C52: 0x5B5F, - 0x4C53: 0x6BDB, - 0x4C54: 0x731B, - 0x4C55: 0x76F2, - 0x4C56: 0x7DB2, - 0x4C57: 0x8017, - 0x4C58: 0x8499, - 0x4C59: 0x5132, - 0x4C5A: 0x6728, - 0x4C5B: 0x9ED9, - 0x4C5C: 0x76EE, - 0x4C5D: 0x6762, - 0x4C5E: 0x52FF, - 0x4C5F: 0x9905, - 0x4C60: 0x5C24, - 0x4C61: 0x623B, - 0x4C62: 0x7C7E, - 0x4C63: 0x8CB0, - 0x4C64: 0x554F, - 0x4C65: 0x60B6, - 0x4C66: 0x7D0B, - 0x4C67: 0x9580, - 0x4C68: 0x5301, - 0x4C69: 0x4E5F, - 0x4C6A: 0x51B6, - 0x4C6B: 0x591C, - 0x4C6C: 0x723A, - 0x4C6D: 0x8036, - 0x4C6E: 0x91CE, - 0x4C6F: 0x5F25, - 0x4C70: 0x77E2, - 0x4C71: 0x5384, - 0x4C72: 0x5F79, - 0x4C73: 0x7D04, - 0x4C74: 0x85AC, - 0x4C75: 0x8A33, - 0x4C76: 0x8E8D, - 0x4C77: 0x9756, - 0x4C78: 0x67F3, - 0x4C79: 0x85AE, - 0x4C7A: 0x9453, - 0x4C7B: 0x6109, - 0x4C7C: 0x6108, - 0x4C7D: 0x6CB9, - 0x4C7E: 0x7652, - 0x4D21: 0x8AED, - 0x4D22: 0x8F38, - 0x4D23: 0x552F, - 0x4D24: 0x4F51, - 0x4D25: 0x512A, - 0x4D26: 0x52C7, - 0x4D27: 0x53CB, - 0x4D28: 0x5BA5, - 0x4D29: 0x5E7D, - 0x4D2A: 0x60A0, - 0x4D2B: 0x6182, - 0x4D2C: 0x63D6, - 0x4D2D: 0x6709, - 0x4D2E: 0x67DA, - 0x4D2F: 0x6E67, - 0x4D30: 0x6D8C, - 0x4D31: 0x7336, - 0x4D32: 0x7337, - 0x4D33: 0x7531, - 0x4D34: 0x7950, - 0x4D35: 0x88D5, - 0x4D36: 0x8A98, - 0x4D37: 0x904A, - 0x4D38: 0x9091, - 0x4D39: 0x90F5, - 0x4D3A: 0x96C4, - 0x4D3B: 0x878D, - 0x4D3C: 0x5915, - 0x4D3D: 0x4E88, - 0x4D3E: 0x4F59, - 0x4D3F: 0x4E0E, - 0x4D40: 0x8A89, - 0x4D41: 0x8F3F, - 0x4D42: 0x9810, - 0x4D43: 0x50AD, - 0x4D44: 0x5E7C, - 0x4D45: 0x5996, - 0x4D46: 0x5BB9, - 0x4D47: 0x5EB8, - 0x4D48: 0x63DA, - 0x4D49: 0x63FA, - 0x4D4A: 0x64C1, - 0x4D4B: 0x66DC, - 0x4D4C: 0x694A, - 0x4D4D: 0x69D8, - 0x4D4E: 0x6D0B, - 0x4D4F: 0x6EB6, - 0x4D50: 0x7194, - 0x4D51: 0x7528, - 0x4D52: 0x7AAF, - 0x4D53: 0x7F8A, - 0x4D54: 0x8000, - 0x4D55: 0x8449, - 0x4D56: 0x84C9, - 0x4D57: 0x8981, - 0x4D58: 0x8B21, - 0x4D59: 0x8E0A, - 0x4D5A: 0x9065, - 0x4D5B: 0x967D, - 0x4D5C: 0x990A, - 0x4D5D: 0x617E, - 0x4D5E: 0x6291, - 0x4D5F: 0x6B32, - 0x4D60: 0x6C83, - 0x4D61: 0x6D74, - 0x4D62: 0x7FCC, - 0x4D63: 0x7FFC, - 0x4D64: 0x6DC0, - 0x4D65: 0x7F85, - 0x4D66: 0x87BA, - 0x4D67: 0x88F8, - 0x4D68: 0x6765, - 0x4D69: 0x83B1, - 0x4D6A: 0x983C, - 0x4D6B: 0x96F7, - 0x4D6C: 0x6D1B, - 0x4D6D: 0x7D61, - 0x4D6E: 0x843D, - 0x4D6F: 0x916A, - 0x4D70: 0x4E71, - 0x4D71: 0x5375, - 0x4D72: 0x5D50, - 0x4D73: 0x6B04, - 0x4D74: 0x6FEB, - 0x4D75: 0x85CD, - 0x4D76: 0x862D, - 0x4D77: 0x89A7, - 0x4D78: 0x5229, - 0x4D79: 0x540F, - 0x4D7A: 0x5C65, - 0x4D7B: 0x674E, - 0x4D7C: 0x68A8, - 0x4D7D: 0x7406, - 0x4D7E: 0x7483, - 0x4E21: 0x75E2, - 0x4E22: 0x88CF, - 0x4E23: 0x88E1, - 0x4E24: 0x91CC, - 0x4E25: 0x96E2, - 0x4E26: 0x9678, - 0x4E27: 0x5F8B, - 0x4E28: 0x7387, - 0x4E29: 0x7ACB, - 0x4E2A: 0x844E, - 0x4E2B: 0x63A0, - 0x4E2C: 0x7565, - 0x4E2D: 0x5289, - 0x4E2E: 0x6D41, - 0x4E2F: 0x6E9C, - 0x4E30: 0x7409, - 0x4E31: 0x7559, - 0x4E32: 0x786B, - 0x4E33: 0x7C92, - 0x4E34: 0x9686, - 0x4E35: 0x7ADC, - 0x4E36: 0x9F8D, - 0x4E37: 0x4FB6, - 0x4E38: 0x616E, - 0x4E39: 0x65C5, - 0x4E3A: 0x865C, - 0x4E3B: 0x4E86, - 0x4E3C: 0x4EAE, - 0x4E3D: 0x50DA, - 0x4E3E: 0x4E21, - 0x4E3F: 0x51CC, - 0x4E40: 0x5BEE, - 0x4E41: 0x6599, - 0x4E42: 0x6881, - 0x4E43: 0x6DBC, - 0x4E44: 0x731F, - 0x4E45: 0x7642, - 0x4E46: 0x77AD, - 0x4E47: 0x7A1C, - 0x4E48: 0x7CE7, - 0x4E49: 0x826F, - 0x4E4A: 0x8AD2, - 0x4E4B: 0x907C, - 0x4E4C: 0x91CF, - 0x4E4D: 0x9675, - 0x4E4E: 0x9818, - 0x4E4F: 0x529B, - 0x4E50: 0x7DD1, - 0x4E51: 0x502B, - 0x4E52: 0x5398, - 0x4E53: 0x6797, - 0x4E54: 0x6DCB, - 0x4E55: 0x71D0, - 0x4E56: 0x7433, - 0x4E57: 0x81E8, - 0x4E58: 0x8F2A, - 0x4E59: 0x96A3, - 0x4E5A: 0x9C57, - 0x4E5B: 0x9E9F, - 0x4E5C: 0x7460, - 0x4E5D: 0x5841, - 0x4E5E: 0x6D99, - 0x4E5F: 0x7D2F, - 0x4E60: 0x985E, - 0x4E61: 0x4EE4, - 0x4E62: 0x4F36, - 0x4E63: 0x4F8B, - 0x4E64: 0x51B7, - 0x4E65: 0x52B1, - 0x4E66: 0x5DBA, - 0x4E67: 0x601C, - 0x4E68: 0x73B2, - 0x4E69: 0x793C, - 0x4E6A: 0x82D3, - 0x4E6B: 0x9234, - 0x4E6C: 0x96B7, - 0x4E6D: 0x96F6, - 0x4E6E: 0x970A, - 0x4E6F: 0x9E97, - 0x4E70: 0x9F62, - 0x4E71: 0x66A6, - 0x4E72: 0x6B74, - 0x4E73: 0x5217, - 0x4E74: 0x52A3, - 0x4E75: 0x70C8, - 0x4E76: 0x88C2, - 0x4E77: 0x5EC9, - 0x4E78: 0x604B, - 0x4E79: 0x6190, - 0x4E7A: 0x6F23, - 0x4E7B: 0x7149, - 0x4E7C: 0x7C3E, - 0x4E7D: 0x7DF4, - 0x4E7E: 0x806F, - 0x4F21: 0x84EE, - 0x4F22: 0x9023, - 0x4F23: 0x932C, - 0x4F24: 0x5442, - 0x4F25: 0x9B6F, - 0x4F26: 0x6AD3, - 0x4F27: 0x7089, - 0x4F28: 0x8CC2, - 0x4F29: 0x8DEF, - 0x4F2A: 0x9732, - 0x4F2B: 0x52B4, - 0x4F2C: 0x5A41, - 0x4F2D: 0x5ECA, - 0x4F2E: 0x5F04, - 0x4F2F: 0x6717, - 0x4F30: 0x697C, - 0x4F31: 0x6994, - 0x4F32: 0x6D6A, - 0x4F33: 0x6F0F, - 0x4F34: 0x7262, - 0x4F35: 0x72FC, - 0x4F36: 0x7BED, - 0x4F37: 0x8001, - 0x4F38: 0x807E, - 0x4F39: 0x874B, - 0x4F3A: 0x90CE, - 0x4F3B: 0x516D, - 0x4F3C: 0x9E93, - 0x4F3D: 0x7984, - 0x4F3E: 0x808B, - 0x4F3F: 0x9332, - 0x4F40: 0x8AD6, - 0x4F41: 0x502D, - 0x4F42: 0x548C, - 0x4F43: 0x8A71, - 0x4F44: 0x6B6A, - 0x4F45: 0x8CC4, - 0x4F46: 0x8107, - 0x4F47: 0x60D1, - 0x4F48: 0x67A0, - 0x4F49: 0x9DF2, - 0x4F4A: 0x4E99, - 0x4F4B: 0x4E98, - 0x4F4C: 0x9C10, - 0x4F4D: 0x8A6B, - 0x4F4E: 0x85C1, - 0x4F4F: 0x8568, - 0x4F50: 0x6900, - 0x4F51: 0x6E7E, - 0x4F52: 0x7897, - 0x4F53: 0x8155, - 0x5021: 0x5F0C, - 0x5022: 0x4E10, - 0x5023: 0x4E15, - 0x5024: 0x4E2A, - 0x5025: 0x4E31, - 0x5026: 0x4E36, - 0x5027: 0x4E3C, - 0x5028: 0x4E3F, - 0x5029: 0x4E42, - 0x502A: 0x4E56, - 0x502B: 0x4E58, - 0x502C: 0x4E82, - 0x502D: 0x4E85, - 0x502E: 0x8C6B, - 0x502F: 0x4E8A, - 0x5030: 0x8212, - 0x5031: 0x5F0D, - 0x5032: 0x4E8E, - 0x5033: 0x4E9E, - 0x5034: 0x4E9F, - 0x5035: 0x4EA0, - 0x5036: 0x4EA2, - 0x5037: 0x4EB0, - 0x5038: 0x4EB3, - 0x5039: 0x4EB6, - 0x503A: 0x4ECE, - 0x503B: 0x4ECD, - 0x503C: 0x4EC4, - 0x503D: 0x4EC6, - 0x503E: 0x4EC2, - 0x503F: 0x4ED7, - 0x5040: 0x4EDE, - 0x5041: 0x4EED, - 0x5042: 0x4EDF, - 0x5043: 0x4EF7, - 0x5044: 0x4F09, - 0x5045: 0x4F5A, - 0x5046: 0x4F30, - 0x5047: 0x4F5B, - 0x5048: 0x4F5D, - 0x5049: 0x4F57, - 0x504A: 0x4F47, - 0x504B: 0x4F76, - 0x504C: 0x4F88, - 0x504D: 0x4F8F, - 0x504E: 0x4F98, - 0x504F: 0x4F7B, - 0x5050: 0x4F69, - 0x5051: 0x4F70, - 0x5052: 0x4F91, - 0x5053: 0x4F6F, - 0x5054: 0x4F86, - 0x5055: 0x4F96, - 0x5056: 0x5118, - 0x5057: 0x4FD4, - 0x5058: 0x4FDF, - 0x5059: 0x4FCE, - 0x505A: 0x4FD8, - 0x505B: 0x4FDB, - 0x505C: 0x4FD1, - 0x505D: 0x4FDA, - 0x505E: 0x4FD0, - 0x505F: 0x4FE4, - 0x5060: 0x4FE5, - 0x5061: 0x501A, - 0x5062: 0x5028, - 0x5063: 0x5014, - 0x5064: 0x502A, - 0x5065: 0x5025, - 0x5066: 0x5005, - 0x5067: 0x4F1C, - 0x5068: 0x4FF6, - 0x5069: 0x5021, - 0x506A: 0x5029, - 0x506B: 0x502C, - 0x506C: 0x4FFE, - 0x506D: 0x4FEF, - 0x506E: 0x5011, - 0x506F: 0x5006, - 0x5070: 0x5043, - 0x5071: 0x5047, - 0x5072: 0x6703, - 0x5073: 0x5055, - 0x5074: 0x5050, - 0x5075: 0x5048, - 0x5076: 0x505A, - 0x5077: 0x5056, - 0x5078: 0x506C, - 0x5079: 0x5078, - 0x507A: 0x5080, - 0x507B: 0x509A, - 0x507C: 0x5085, - 0x507D: 0x50B4, - 0x507E: 0x50B2, - 0x5121: 0x50C9, - 0x5122: 0x50CA, - 0x5123: 0x50B3, - 0x5124: 0x50C2, - 0x5125: 0x50D6, - 0x5126: 0x50DE, - 0x5127: 0x50E5, - 0x5128: 0x50ED, - 0x5129: 0x50E3, - 0x512A: 0x50EE, - 0x512B: 0x50F9, - 0x512C: 0x50F5, - 0x512D: 0x5109, - 0x512E: 0x5101, - 0x512F: 0x5102, - 0x5130: 0x5116, - 0x5131: 0x5115, - 0x5132: 0x5114, - 0x5133: 0x511A, - 0x5134: 0x5121, - 0x5135: 0x513A, - 0x5136: 0x5137, - 0x5137: 0x513C, - 0x5138: 0x513B, - 0x5139: 0x513F, - 0x513A: 0x5140, - 0x513B: 0x5152, - 0x513C: 0x514C, - 0x513D: 0x5154, - 0x513E: 0x5162, - 0x513F: 0x7AF8, - 0x5140: 0x5169, - 0x5141: 0x516A, - 0x5142: 0x516E, - 0x5143: 0x5180, - 0x5144: 0x5182, - 0x5145: 0x56D8, - 0x5146: 0x518C, - 0x5147: 0x5189, - 0x5148: 0x518F, - 0x5149: 0x5191, - 0x514A: 0x5193, - 0x514B: 0x5195, - 0x514C: 0x5196, - 0x514D: 0x51A4, - 0x514E: 0x51A6, - 0x514F: 0x51A2, - 0x5150: 0x51A9, - 0x5151: 0x51AA, - 0x5152: 0x51AB, - 0x5153: 0x51B3, - 0x5154: 0x51B1, - 0x5155: 0x51B2, - 0x5156: 0x51B0, - 0x5157: 0x51B5, - 0x5158: 0x51BD, - 0x5159: 0x51C5, - 0x515A: 0x51C9, - 0x515B: 0x51DB, - 0x515C: 0x51E0, - 0x515D: 0x8655, - 0x515E: 0x51E9, - 0x515F: 0x51ED, - 0x5160: 0x51F0, - 0x5161: 0x51F5, - 0x5162: 0x51FE, - 0x5163: 0x5204, - 0x5164: 0x520B, - 0x5165: 0x5214, - 0x5166: 0x520E, - 0x5167: 0x5227, - 0x5168: 0x522A, - 0x5169: 0x522E, - 0x516A: 0x5233, - 0x516B: 0x5239, - 0x516C: 0x524F, - 0x516D: 0x5244, - 0x516E: 0x524B, - 0x516F: 0x524C, - 0x5170: 0x525E, - 0x5171: 0x5254, - 0x5172: 0x526A, - 0x5173: 0x5274, - 0x5174: 0x5269, - 0x5175: 0x5273, - 0x5176: 0x527F, - 0x5177: 0x527D, - 0x5178: 0x528D, - 0x5179: 0x5294, - 0x517A: 0x5292, - 0x517B: 0x5271, - 0x517C: 0x5288, - 0x517D: 0x5291, - 0x517E: 0x8FA8, - 0x5221: 0x8FA7, - 0x5222: 0x52AC, - 0x5223: 0x52AD, - 0x5224: 0x52BC, - 0x5225: 0x52B5, - 0x5226: 0x52C1, - 0x5227: 0x52CD, - 0x5228: 0x52D7, - 0x5229: 0x52DE, - 0x522A: 0x52E3, - 0x522B: 0x52E6, - 0x522C: 0x98ED, - 0x522D: 0x52E0, - 0x522E: 0x52F3, - 0x522F: 0x52F5, - 0x5230: 0x52F8, - 0x5231: 0x52F9, - 0x5232: 0x5306, - 0x5233: 0x5308, - 0x5234: 0x7538, - 0x5235: 0x530D, - 0x5236: 0x5310, - 0x5237: 0x530F, - 0x5238: 0x5315, - 0x5239: 0x531A, - 0x523A: 0x5323, - 0x523B: 0x532F, - 0x523C: 0x5331, - 0x523D: 0x5333, - 0x523E: 0x5338, - 0x523F: 0x5340, - 0x5240: 0x5346, - 0x5241: 0x5345, - 0x5242: 0x4E17, - 0x5243: 0x5349, - 0x5244: 0x534D, - 0x5245: 0x51D6, - 0x5246: 0x535E, - 0x5247: 0x5369, - 0x5248: 0x536E, - 0x5249: 0x5918, - 0x524A: 0x537B, - 0x524B: 0x5377, - 0x524C: 0x5382, - 0x524D: 0x5396, - 0x524E: 0x53A0, - 0x524F: 0x53A6, - 0x5250: 0x53A5, - 0x5251: 0x53AE, - 0x5252: 0x53B0, - 0x5253: 0x53B6, - 0x5254: 0x53C3, - 0x5255: 0x7C12, - 0x5256: 0x96D9, - 0x5257: 0x53DF, - 0x5258: 0x66FC, - 0x5259: 0x71EE, - 0x525A: 0x53EE, - 0x525B: 0x53E8, - 0x525C: 0x53ED, - 0x525D: 0x53FA, - 0x525E: 0x5401, - 0x525F: 0x543D, - 0x5260: 0x5440, - 0x5261: 0x542C, - 0x5262: 0x542D, - 0x5263: 0x543C, - 0x5264: 0x542E, - 0x5265: 0x5436, - 0x5266: 0x5429, - 0x5267: 0x541D, - 0x5268: 0x544E, - 0x5269: 0x548F, - 0x526A: 0x5475, - 0x526B: 0x548E, - 0x526C: 0x545F, - 0x526D: 0x5471, - 0x526E: 0x5477, - 0x526F: 0x5470, - 0x5270: 0x5492, - 0x5271: 0x547B, - 0x5272: 0x5480, - 0x5273: 0x5476, - 0x5274: 0x5484, - 0x5275: 0x5490, - 0x5276: 0x5486, - 0x5277: 0x54C7, - 0x5278: 0x54A2, - 0x5279: 0x54B8, - 0x527A: 0x54A5, - 0x527B: 0x54AC, - 0x527C: 0x54C4, - 0x527D: 0x54C8, - 0x527E: 0x54A8, - 0x5321: 0x54AB, - 0x5322: 0x54C2, - 0x5323: 0x54A4, - 0x5324: 0x54BE, - 0x5325: 0x54BC, - 0x5326: 0x54D8, - 0x5327: 0x54E5, - 0x5328: 0x54E6, - 0x5329: 0x550F, - 0x532A: 0x5514, - 0x532B: 0x54FD, - 0x532C: 0x54EE, - 0x532D: 0x54ED, - 0x532E: 0x54FA, - 0x532F: 0x54E2, - 0x5330: 0x5539, - 0x5331: 0x5540, - 0x5332: 0x5563, - 0x5333: 0x554C, - 0x5334: 0x552E, - 0x5335: 0x555C, - 0x5336: 0x5545, - 0x5337: 0x5556, - 0x5338: 0x5557, - 0x5339: 0x5538, - 0x533A: 0x5533, - 0x533B: 0x555D, - 0x533C: 0x5599, - 0x533D: 0x5580, - 0x533E: 0x54AF, - 0x533F: 0x558A, - 0x5340: 0x559F, - 0x5341: 0x557B, - 0x5342: 0x557E, - 0x5343: 0x5598, - 0x5344: 0x559E, - 0x5345: 0x55AE, - 0x5346: 0x557C, - 0x5347: 0x5583, - 0x5348: 0x55A9, - 0x5349: 0x5587, - 0x534A: 0x55A8, - 0x534B: 0x55DA, - 0x534C: 0x55C5, - 0x534D: 0x55DF, - 0x534E: 0x55C4, - 0x534F: 0x55DC, - 0x5350: 0x55E4, - 0x5351: 0x55D4, - 0x5352: 0x5614, - 0x5353: 0x55F7, - 0x5354: 0x5616, - 0x5355: 0x55FE, - 0x5356: 0x55FD, - 0x5357: 0x561B, - 0x5358: 0x55F9, - 0x5359: 0x564E, - 0x535A: 0x5650, - 0x535B: 0x71DF, - 0x535C: 0x5634, - 0x535D: 0x5636, - 0x535E: 0x5632, - 0x535F: 0x5638, - 0x5360: 0x566B, - 0x5361: 0x5664, - 0x5362: 0x562F, - 0x5363: 0x566C, - 0x5364: 0x566A, - 0x5365: 0x5686, - 0x5366: 0x5680, - 0x5367: 0x568A, - 0x5368: 0x56A0, - 0x5369: 0x5694, - 0x536A: 0x568F, - 0x536B: 0x56A5, - 0x536C: 0x56AE, - 0x536D: 0x56B6, - 0x536E: 0x56B4, - 0x536F: 0x56C2, - 0x5370: 0x56BC, - 0x5371: 0x56C1, - 0x5372: 0x56C3, - 0x5373: 0x56C0, - 0x5374: 0x56C8, - 0x5375: 0x56CE, - 0x5376: 0x56D1, - 0x5377: 0x56D3, - 0x5378: 0x56D7, - 0x5379: 0x56EE, - 0x537A: 0x56F9, - 0x537B: 0x5700, - 0x537C: 0x56FF, - 0x537D: 0x5704, - 0x537E: 0x5709, - 0x5421: 0x5708, - 0x5422: 0x570B, - 0x5423: 0x570D, - 0x5424: 0x5713, - 0x5425: 0x5718, - 0x5426: 0x5716, - 0x5427: 0x55C7, - 0x5428: 0x571C, - 0x5429: 0x5726, - 0x542A: 0x5737, - 0x542B: 0x5738, - 0x542C: 0x574E, - 0x542D: 0x573B, - 0x542E: 0x5740, - 0x542F: 0x574F, - 0x5430: 0x5769, - 0x5431: 0x57C0, - 0x5432: 0x5788, - 0x5433: 0x5761, - 0x5434: 0x577F, - 0x5435: 0x5789, - 0x5436: 0x5793, - 0x5437: 0x57A0, - 0x5438: 0x57B3, - 0x5439: 0x57A4, - 0x543A: 0x57AA, - 0x543B: 0x57B0, - 0x543C: 0x57C3, - 0x543D: 0x57C6, - 0x543E: 0x57D4, - 0x543F: 0x57D2, - 0x5440: 0x57D3, - 0x5441: 0x580A, - 0x5442: 0x57D6, - 0x5443: 0x57E3, - 0x5444: 0x580B, - 0x5445: 0x5819, - 0x5446: 0x581D, - 0x5447: 0x5872, - 0x5448: 0x5821, - 0x5449: 0x5862, - 0x544A: 0x584B, - 0x544B: 0x5870, - 0x544C: 0x6BC0, - 0x544D: 0x5852, - 0x544E: 0x583D, - 0x544F: 0x5879, - 0x5450: 0x5885, - 0x5451: 0x58B9, - 0x5452: 0x589F, - 0x5453: 0x58AB, - 0x5454: 0x58BA, - 0x5455: 0x58DE, - 0x5456: 0x58BB, - 0x5457: 0x58B8, - 0x5458: 0x58AE, - 0x5459: 0x58C5, - 0x545A: 0x58D3, - 0x545B: 0x58D1, - 0x545C: 0x58D7, - 0x545D: 0x58D9, - 0x545E: 0x58D8, - 0x545F: 0x58E5, - 0x5460: 0x58DC, - 0x5461: 0x58E4, - 0x5462: 0x58DF, - 0x5463: 0x58EF, - 0x5464: 0x58FA, - 0x5465: 0x58F9, - 0x5466: 0x58FB, - 0x5467: 0x58FC, - 0x5468: 0x58FD, - 0x5469: 0x5902, - 0x546A: 0x590A, - 0x546B: 0x5910, - 0x546C: 0x591B, - 0x546D: 0x68A6, - 0x546E: 0x5925, - 0x546F: 0x592C, - 0x5470: 0x592D, - 0x5471: 0x5932, - 0x5472: 0x5938, - 0x5473: 0x593E, - 0x5474: 0x7AD2, - 0x5475: 0x5955, - 0x5476: 0x5950, - 0x5477: 0x594E, - 0x5478: 0x595A, - 0x5479: 0x5958, - 0x547A: 0x5962, - 0x547B: 0x5960, - 0x547C: 0x5967, - 0x547D: 0x596C, - 0x547E: 0x5969, - 0x5521: 0x5978, - 0x5522: 0x5981, - 0x5523: 0x599D, - 0x5524: 0x4F5E, - 0x5525: 0x4FAB, - 0x5526: 0x59A3, - 0x5527: 0x59B2, - 0x5528: 0x59C6, - 0x5529: 0x59E8, - 0x552A: 0x59DC, - 0x552B: 0x598D, - 0x552C: 0x59D9, - 0x552D: 0x59DA, - 0x552E: 0x5A25, - 0x552F: 0x5A1F, - 0x5530: 0x5A11, - 0x5531: 0x5A1C, - 0x5532: 0x5A09, - 0x5533: 0x5A1A, - 0x5534: 0x5A40, - 0x5535: 0x5A6C, - 0x5536: 0x5A49, - 0x5537: 0x5A35, - 0x5538: 0x5A36, - 0x5539: 0x5A62, - 0x553A: 0x5A6A, - 0x553B: 0x5A9A, - 0x553C: 0x5ABC, - 0x553D: 0x5ABE, - 0x553E: 0x5ACB, - 0x553F: 0x5AC2, - 0x5540: 0x5ABD, - 0x5541: 0x5AE3, - 0x5542: 0x5AD7, - 0x5543: 0x5AE6, - 0x5544: 0x5AE9, - 0x5545: 0x5AD6, - 0x5546: 0x5AFA, - 0x5547: 0x5AFB, - 0x5548: 0x5B0C, - 0x5549: 0x5B0B, - 0x554A: 0x5B16, - 0x554B: 0x5B32, - 0x554C: 0x5AD0, - 0x554D: 0x5B2A, - 0x554E: 0x5B36, - 0x554F: 0x5B3E, - 0x5550: 0x5B43, - 0x5551: 0x5B45, - 0x5552: 0x5B40, - 0x5553: 0x5B51, - 0x5554: 0x5B55, - 0x5555: 0x5B5A, - 0x5556: 0x5B5B, - 0x5557: 0x5B65, - 0x5558: 0x5B69, - 0x5559: 0x5B70, - 0x555A: 0x5B73, - 0x555B: 0x5B75, - 0x555C: 0x5B78, - 0x555D: 0x6588, - 0x555E: 0x5B7A, - 0x555F: 0x5B80, - 0x5560: 0x5B83, - 0x5561: 0x5BA6, - 0x5562: 0x5BB8, - 0x5563: 0x5BC3, - 0x5564: 0x5BC7, - 0x5565: 0x5BC9, - 0x5566: 0x5BD4, - 0x5567: 0x5BD0, - 0x5568: 0x5BE4, - 0x5569: 0x5BE6, - 0x556A: 0x5BE2, - 0x556B: 0x5BDE, - 0x556C: 0x5BE5, - 0x556D: 0x5BEB, - 0x556E: 0x5BF0, - 0x556F: 0x5BF6, - 0x5570: 0x5BF3, - 0x5571: 0x5C05, - 0x5572: 0x5C07, - 0x5573: 0x5C08, - 0x5574: 0x5C0D, - 0x5575: 0x5C13, - 0x5576: 0x5C20, - 0x5577: 0x5C22, - 0x5578: 0x5C28, - 0x5579: 0x5C38, - 0x557A: 0x5C39, - 0x557B: 0x5C41, - 0x557C: 0x5C46, - 0x557D: 0x5C4E, - 0x557E: 0x5C53, - 0x5621: 0x5C50, - 0x5622: 0x5C4F, - 0x5623: 0x5B71, - 0x5624: 0x5C6C, - 0x5625: 0x5C6E, - 0x5626: 0x4E62, - 0x5627: 0x5C76, - 0x5628: 0x5C79, - 0x5629: 0x5C8C, - 0x562A: 0x5C91, - 0x562B: 0x5C94, - 0x562C: 0x599B, - 0x562D: 0x5CAB, - 0x562E: 0x5CBB, - 0x562F: 0x5CB6, - 0x5630: 0x5CBC, - 0x5631: 0x5CB7, - 0x5632: 0x5CC5, - 0x5633: 0x5CBE, - 0x5634: 0x5CC7, - 0x5635: 0x5CD9, - 0x5636: 0x5CE9, - 0x5637: 0x5CFD, - 0x5638: 0x5CFA, - 0x5639: 0x5CED, - 0x563A: 0x5D8C, - 0x563B: 0x5CEA, - 0x563C: 0x5D0B, - 0x563D: 0x5D15, - 0x563E: 0x5D17, - 0x563F: 0x5D5C, - 0x5640: 0x5D1F, - 0x5641: 0x5D1B, - 0x5642: 0x5D11, - 0x5643: 0x5D14, - 0x5644: 0x5D22, - 0x5645: 0x5D1A, - 0x5646: 0x5D19, - 0x5647: 0x5D18, - 0x5648: 0x5D4C, - 0x5649: 0x5D52, - 0x564A: 0x5D4E, - 0x564B: 0x5D4B, - 0x564C: 0x5D6C, - 0x564D: 0x5D73, - 0x564E: 0x5D76, - 0x564F: 0x5D87, - 0x5650: 0x5D84, - 0x5651: 0x5D82, - 0x5652: 0x5DA2, - 0x5653: 0x5D9D, - 0x5654: 0x5DAC, - 0x5655: 0x5DAE, - 0x5656: 0x5DBD, - 0x5657: 0x5D90, - 0x5658: 0x5DB7, - 0x5659: 0x5DBC, - 0x565A: 0x5DC9, - 0x565B: 0x5DCD, - 0x565C: 0x5DD3, - 0x565D: 0x5DD2, - 0x565E: 0x5DD6, - 0x565F: 0x5DDB, - 0x5660: 0x5DEB, - 0x5661: 0x5DF2, - 0x5662: 0x5DF5, - 0x5663: 0x5E0B, - 0x5664: 0x5E1A, - 0x5665: 0x5E19, - 0x5666: 0x5E11, - 0x5667: 0x5E1B, - 0x5668: 0x5E36, - 0x5669: 0x5E37, - 0x566A: 0x5E44, - 0x566B: 0x5E43, - 0x566C: 0x5E40, - 0x566D: 0x5E4E, - 0x566E: 0x5E57, - 0x566F: 0x5E54, - 0x5670: 0x5E5F, - 0x5671: 0x5E62, - 0x5672: 0x5E64, - 0x5673: 0x5E47, - 0x5674: 0x5E75, - 0x5675: 0x5E76, - 0x5676: 0x5E7A, - 0x5677: 0x9EBC, - 0x5678: 0x5E7F, - 0x5679: 0x5EA0, - 0x567A: 0x5EC1, - 0x567B: 0x5EC2, - 0x567C: 0x5EC8, - 0x567D: 0x5ED0, - 0x567E: 0x5ECF, - 0x5721: 0x5ED6, - 0x5722: 0x5EE3, - 0x5723: 0x5EDD, - 0x5724: 0x5EDA, - 0x5725: 0x5EDB, - 0x5726: 0x5EE2, - 0x5727: 0x5EE1, - 0x5728: 0x5EE8, - 0x5729: 0x5EE9, - 0x572A: 0x5EEC, - 0x572B: 0x5EF1, - 0x572C: 0x5EF3, - 0x572D: 0x5EF0, - 0x572E: 0x5EF4, - 0x572F: 0x5EF8, - 0x5730: 0x5EFE, - 0x5731: 0x5F03, - 0x5732: 0x5F09, - 0x5733: 0x5F5D, - 0x5734: 0x5F5C, - 0x5735: 0x5F0B, - 0x5736: 0x5F11, - 0x5737: 0x5F16, - 0x5738: 0x5F29, - 0x5739: 0x5F2D, - 0x573A: 0x5F38, - 0x573B: 0x5F41, - 0x573C: 0x5F48, - 0x573D: 0x5F4C, - 0x573E: 0x5F4E, - 0x573F: 0x5F2F, - 0x5740: 0x5F51, - 0x5741: 0x5F56, - 0x5742: 0x5F57, - 0x5743: 0x5F59, - 0x5744: 0x5F61, - 0x5745: 0x5F6D, - 0x5746: 0x5F73, - 0x5747: 0x5F77, - 0x5748: 0x5F83, - 0x5749: 0x5F82, - 0x574A: 0x5F7F, - 0x574B: 0x5F8A, - 0x574C: 0x5F88, - 0x574D: 0x5F91, - 0x574E: 0x5F87, - 0x574F: 0x5F9E, - 0x5750: 0x5F99, - 0x5751: 0x5F98, - 0x5752: 0x5FA0, - 0x5753: 0x5FA8, - 0x5754: 0x5FAD, - 0x5755: 0x5FBC, - 0x5756: 0x5FD6, - 0x5757: 0x5FFB, - 0x5758: 0x5FE4, - 0x5759: 0x5FF8, - 0x575A: 0x5FF1, - 0x575B: 0x5FDD, - 0x575C: 0x60B3, - 0x575D: 0x5FFF, - 0x575E: 0x6021, - 0x575F: 0x6060, - 0x5760: 0x6019, - 0x5761: 0x6010, - 0x5762: 0x6029, - 0x5763: 0x600E, - 0x5764: 0x6031, - 0x5765: 0x601B, - 0x5766: 0x6015, - 0x5767: 0x602B, - 0x5768: 0x6026, - 0x5769: 0x600F, - 0x576A: 0x603A, - 0x576B: 0x605A, - 0x576C: 0x6041, - 0x576D: 0x606A, - 0x576E: 0x6077, - 0x576F: 0x605F, - 0x5770: 0x604A, - 0x5771: 0x6046, - 0x5772: 0x604D, - 0x5773: 0x6063, - 0x5774: 0x6043, - 0x5775: 0x6064, - 0x5776: 0x6042, - 0x5777: 0x606C, - 0x5778: 0x606B, - 0x5779: 0x6059, - 0x577A: 0x6081, - 0x577B: 0x608D, - 0x577C: 0x60E7, - 0x577D: 0x6083, - 0x577E: 0x609A, - 0x5821: 0x6084, - 0x5822: 0x609B, - 0x5823: 0x6096, - 0x5824: 0x6097, - 0x5825: 0x6092, - 0x5826: 0x60A7, - 0x5827: 0x608B, - 0x5828: 0x60E1, - 0x5829: 0x60B8, - 0x582A: 0x60E0, - 0x582B: 0x60D3, - 0x582C: 0x60B4, - 0x582D: 0x5FF0, - 0x582E: 0x60BD, - 0x582F: 0x60C6, - 0x5830: 0x60B5, - 0x5831: 0x60D8, - 0x5832: 0x614D, - 0x5833: 0x6115, - 0x5834: 0x6106, - 0x5835: 0x60F6, - 0x5836: 0x60F7, - 0x5837: 0x6100, - 0x5838: 0x60F4, - 0x5839: 0x60FA, - 0x583A: 0x6103, - 0x583B: 0x6121, - 0x583C: 0x60FB, - 0x583D: 0x60F1, - 0x583E: 0x610D, - 0x583F: 0x610E, - 0x5840: 0x6147, - 0x5841: 0x613E, - 0x5842: 0x6128, - 0x5843: 0x6127, - 0x5844: 0x614A, - 0x5845: 0x613F, - 0x5846: 0x613C, - 0x5847: 0x612C, - 0x5848: 0x6134, - 0x5849: 0x613D, - 0x584A: 0x6142, - 0x584B: 0x6144, - 0x584C: 0x6173, - 0x584D: 0x6177, - 0x584E: 0x6158, - 0x584F: 0x6159, - 0x5850: 0x615A, - 0x5851: 0x616B, - 0x5852: 0x6174, - 0x5853: 0x616F, - 0x5854: 0x6165, - 0x5855: 0x6171, - 0x5856: 0x615F, - 0x5857: 0x615D, - 0x5858: 0x6153, - 0x5859: 0x6175, - 0x585A: 0x6199, - 0x585B: 0x6196, - 0x585C: 0x6187, - 0x585D: 0x61AC, - 0x585E: 0x6194, - 0x585F: 0x619A, - 0x5860: 0x618A, - 0x5861: 0x6191, - 0x5862: 0x61AB, - 0x5863: 0x61AE, - 0x5864: 0x61CC, - 0x5865: 0x61CA, - 0x5866: 0x61C9, - 0x5867: 0x61F7, - 0x5868: 0x61C8, - 0x5869: 0x61C3, - 0x586A: 0x61C6, - 0x586B: 0x61BA, - 0x586C: 0x61CB, - 0x586D: 0x7F79, - 0x586E: 0x61CD, - 0x586F: 0x61E6, - 0x5870: 0x61E3, - 0x5871: 0x61F6, - 0x5872: 0x61FA, - 0x5873: 0x61F4, - 0x5874: 0x61FF, - 0x5875: 0x61FD, - 0x5876: 0x61FC, - 0x5877: 0x61FE, - 0x5878: 0x6200, - 0x5879: 0x6208, - 0x587A: 0x6209, - 0x587B: 0x620D, - 0x587C: 0x620C, - 0x587D: 0x6214, - 0x587E: 0x621B, - 0x5921: 0x621E, - 0x5922: 0x6221, - 0x5923: 0x622A, - 0x5924: 0x622E, - 0x5925: 0x6230, - 0x5926: 0x6232, - 0x5927: 0x6233, - 0x5928: 0x6241, - 0x5929: 0x624E, - 0x592A: 0x625E, - 0x592B: 0x6263, - 0x592C: 0x625B, - 0x592D: 0x6260, - 0x592E: 0x6268, - 0x592F: 0x627C, - 0x5930: 0x6282, - 0x5931: 0x6289, - 0x5932: 0x627E, - 0x5933: 0x6292, - 0x5934: 0x6293, - 0x5935: 0x6296, - 0x5936: 0x62D4, - 0x5937: 0x6283, - 0x5938: 0x6294, - 0x5939: 0x62D7, - 0x593A: 0x62D1, - 0x593B: 0x62BB, - 0x593C: 0x62CF, - 0x593D: 0x62FF, - 0x593E: 0x62C6, - 0x593F: 0x64D4, - 0x5940: 0x62C8, - 0x5941: 0x62DC, - 0x5942: 0x62CC, - 0x5943: 0x62CA, - 0x5944: 0x62C2, - 0x5945: 0x62C7, - 0x5946: 0x629B, - 0x5947: 0x62C9, - 0x5948: 0x630C, - 0x5949: 0x62EE, - 0x594A: 0x62F1, - 0x594B: 0x6327, - 0x594C: 0x6302, - 0x594D: 0x6308, - 0x594E: 0x62EF, - 0x594F: 0x62F5, - 0x5950: 0x6350, - 0x5951: 0x633E, - 0x5952: 0x634D, - 0x5953: 0x641C, - 0x5954: 0x634F, - 0x5955: 0x6396, - 0x5956: 0x638E, - 0x5957: 0x6380, - 0x5958: 0x63AB, - 0x5959: 0x6376, - 0x595A: 0x63A3, - 0x595B: 0x638F, - 0x595C: 0x6389, - 0x595D: 0x639F, - 0x595E: 0x63B5, - 0x595F: 0x636B, - 0x5960: 0x6369, - 0x5961: 0x63BE, - 0x5962: 0x63E9, - 0x5963: 0x63C0, - 0x5964: 0x63C6, - 0x5965: 0x63E3, - 0x5966: 0x63C9, - 0x5967: 0x63D2, - 0x5968: 0x63F6, - 0x5969: 0x63C4, - 0x596A: 0x6416, - 0x596B: 0x6434, - 0x596C: 0x6406, - 0x596D: 0x6413, - 0x596E: 0x6426, - 0x596F: 0x6436, - 0x5970: 0x651D, - 0x5971: 0x6417, - 0x5972: 0x6428, - 0x5973: 0x640F, - 0x5974: 0x6467, - 0x5975: 0x646F, - 0x5976: 0x6476, - 0x5977: 0x644E, - 0x5978: 0x652A, - 0x5979: 0x6495, - 0x597A: 0x6493, - 0x597B: 0x64A5, - 0x597C: 0x64A9, - 0x597D: 0x6488, - 0x597E: 0x64BC, - 0x5A21: 0x64DA, - 0x5A22: 0x64D2, - 0x5A23: 0x64C5, - 0x5A24: 0x64C7, - 0x5A25: 0x64BB, - 0x5A26: 0x64D8, - 0x5A27: 0x64C2, - 0x5A28: 0x64F1, - 0x5A29: 0x64E7, - 0x5A2A: 0x8209, - 0x5A2B: 0x64E0, - 0x5A2C: 0x64E1, - 0x5A2D: 0x62AC, - 0x5A2E: 0x64E3, - 0x5A2F: 0x64EF, - 0x5A30: 0x652C, - 0x5A31: 0x64F6, - 0x5A32: 0x64F4, - 0x5A33: 0x64F2, - 0x5A34: 0x64FA, - 0x5A35: 0x6500, - 0x5A36: 0x64FD, - 0x5A37: 0x6518, - 0x5A38: 0x651C, - 0x5A39: 0x6505, - 0x5A3A: 0x6524, - 0x5A3B: 0x6523, - 0x5A3C: 0x652B, - 0x5A3D: 0x6534, - 0x5A3E: 0x6535, - 0x5A3F: 0x6537, - 0x5A40: 0x6536, - 0x5A41: 0x6538, - 0x5A42: 0x754B, - 0x5A43: 0x6548, - 0x5A44: 0x6556, - 0x5A45: 0x6555, - 0x5A46: 0x654D, - 0x5A47: 0x6558, - 0x5A48: 0x655E, - 0x5A49: 0x655D, - 0x5A4A: 0x6572, - 0x5A4B: 0x6578, - 0x5A4C: 0x6582, - 0x5A4D: 0x6583, - 0x5A4E: 0x8B8A, - 0x5A4F: 0x659B, - 0x5A50: 0x659F, - 0x5A51: 0x65AB, - 0x5A52: 0x65B7, - 0x5A53: 0x65C3, - 0x5A54: 0x65C6, - 0x5A55: 0x65C1, - 0x5A56: 0x65C4, - 0x5A57: 0x65CC, - 0x5A58: 0x65D2, - 0x5A59: 0x65DB, - 0x5A5A: 0x65D9, - 0x5A5B: 0x65E0, - 0x5A5C: 0x65E1, - 0x5A5D: 0x65F1, - 0x5A5E: 0x6772, - 0x5A5F: 0x660A, - 0x5A60: 0x6603, - 0x5A61: 0x65FB, - 0x5A62: 0x6773, - 0x5A63: 0x6635, - 0x5A64: 0x6636, - 0x5A65: 0x6634, - 0x5A66: 0x661C, - 0x5A67: 0x664F, - 0x5A68: 0x6644, - 0x5A69: 0x6649, - 0x5A6A: 0x6641, - 0x5A6B: 0x665E, - 0x5A6C: 0x665D, - 0x5A6D: 0x6664, - 0x5A6E: 0x6667, - 0x5A6F: 0x6668, - 0x5A70: 0x665F, - 0x5A71: 0x6662, - 0x5A72: 0x6670, - 0x5A73: 0x6683, - 0x5A74: 0x6688, - 0x5A75: 0x668E, - 0x5A76: 0x6689, - 0x5A77: 0x6684, - 0x5A78: 0x6698, - 0x5A79: 0x669D, - 0x5A7A: 0x66C1, - 0x5A7B: 0x66B9, - 0x5A7C: 0x66C9, - 0x5A7D: 0x66BE, - 0x5A7E: 0x66BC, - 0x5B21: 0x66C4, - 0x5B22: 0x66B8, - 0x5B23: 0x66D6, - 0x5B24: 0x66DA, - 0x5B25: 0x66E0, - 0x5B26: 0x663F, - 0x5B27: 0x66E6, - 0x5B28: 0x66E9, - 0x5B29: 0x66F0, - 0x5B2A: 0x66F5, - 0x5B2B: 0x66F7, - 0x5B2C: 0x670F, - 0x5B2D: 0x6716, - 0x5B2E: 0x671E, - 0x5B2F: 0x6726, - 0x5B30: 0x6727, - 0x5B31: 0x9738, - 0x5B32: 0x672E, - 0x5B33: 0x673F, - 0x5B34: 0x6736, - 0x5B35: 0x6741, - 0x5B36: 0x6738, - 0x5B37: 0x6737, - 0x5B38: 0x6746, - 0x5B39: 0x675E, - 0x5B3A: 0x6760, - 0x5B3B: 0x6759, - 0x5B3C: 0x6763, - 0x5B3D: 0x6764, - 0x5B3E: 0x6789, - 0x5B3F: 0x6770, - 0x5B40: 0x67A9, - 0x5B41: 0x677C, - 0x5B42: 0x676A, - 0x5B43: 0x678C, - 0x5B44: 0x678B, - 0x5B45: 0x67A6, - 0x5B46: 0x67A1, - 0x5B47: 0x6785, - 0x5B48: 0x67B7, - 0x5B49: 0x67EF, - 0x5B4A: 0x67B4, - 0x5B4B: 0x67EC, - 0x5B4C: 0x67B3, - 0x5B4D: 0x67E9, - 0x5B4E: 0x67B8, - 0x5B4F: 0x67E4, - 0x5B50: 0x67DE, - 0x5B51: 0x67DD, - 0x5B52: 0x67E2, - 0x5B53: 0x67EE, - 0x5B54: 0x67B9, - 0x5B55: 0x67CE, - 0x5B56: 0x67C6, - 0x5B57: 0x67E7, - 0x5B58: 0x6A9C, - 0x5B59: 0x681E, - 0x5B5A: 0x6846, - 0x5B5B: 0x6829, - 0x5B5C: 0x6840, - 0x5B5D: 0x684D, - 0x5B5E: 0x6832, - 0x5B5F: 0x684E, - 0x5B60: 0x68B3, - 0x5B61: 0x682B, - 0x5B62: 0x6859, - 0x5B63: 0x6863, - 0x5B64: 0x6877, - 0x5B65: 0x687F, - 0x5B66: 0x689F, - 0x5B67: 0x688F, - 0x5B68: 0x68AD, - 0x5B69: 0x6894, - 0x5B6A: 0x689D, - 0x5B6B: 0x689B, - 0x5B6C: 0x6883, - 0x5B6D: 0x6AAE, - 0x5B6E: 0x68B9, - 0x5B6F: 0x6874, - 0x5B70: 0x68B5, - 0x5B71: 0x68A0, - 0x5B72: 0x68BA, - 0x5B73: 0x690F, - 0x5B74: 0x688D, - 0x5B75: 0x687E, - 0x5B76: 0x6901, - 0x5B77: 0x68CA, - 0x5B78: 0x6908, - 0x5B79: 0x68D8, - 0x5B7A: 0x6922, - 0x5B7B: 0x6926, - 0x5B7C: 0x68E1, - 0x5B7D: 0x690C, - 0x5B7E: 0x68CD, - 0x5C21: 0x68D4, - 0x5C22: 0x68E7, - 0x5C23: 0x68D5, - 0x5C24: 0x6936, - 0x5C25: 0x6912, - 0x5C26: 0x6904, - 0x5C27: 0x68D7, - 0x5C28: 0x68E3, - 0x5C29: 0x6925, - 0x5C2A: 0x68F9, - 0x5C2B: 0x68E0, - 0x5C2C: 0x68EF, - 0x5C2D: 0x6928, - 0x5C2E: 0x692A, - 0x5C2F: 0x691A, - 0x5C30: 0x6923, - 0x5C31: 0x6921, - 0x5C32: 0x68C6, - 0x5C33: 0x6979, - 0x5C34: 0x6977, - 0x5C35: 0x695C, - 0x5C36: 0x6978, - 0x5C37: 0x696B, - 0x5C38: 0x6954, - 0x5C39: 0x697E, - 0x5C3A: 0x696E, - 0x5C3B: 0x6939, - 0x5C3C: 0x6974, - 0x5C3D: 0x693D, - 0x5C3E: 0x6959, - 0x5C3F: 0x6930, - 0x5C40: 0x6961, - 0x5C41: 0x695E, - 0x5C42: 0x695D, - 0x5C43: 0x6981, - 0x5C44: 0x696A, - 0x5C45: 0x69B2, - 0x5C46: 0x69AE, - 0x5C47: 0x69D0, - 0x5C48: 0x69BF, - 0x5C49: 0x69C1, - 0x5C4A: 0x69D3, - 0x5C4B: 0x69BE, - 0x5C4C: 0x69CE, - 0x5C4D: 0x5BE8, - 0x5C4E: 0x69CA, - 0x5C4F: 0x69DD, - 0x5C50: 0x69BB, - 0x5C51: 0x69C3, - 0x5C52: 0x69A7, - 0x5C53: 0x6A2E, - 0x5C54: 0x6991, - 0x5C55: 0x69A0, - 0x5C56: 0x699C, - 0x5C57: 0x6995, - 0x5C58: 0x69B4, - 0x5C59: 0x69DE, - 0x5C5A: 0x69E8, - 0x5C5B: 0x6A02, - 0x5C5C: 0x6A1B, - 0x5C5D: 0x69FF, - 0x5C5E: 0x6B0A, - 0x5C5F: 0x69F9, - 0x5C60: 0x69F2, - 0x5C61: 0x69E7, - 0x5C62: 0x6A05, - 0x5C63: 0x69B1, - 0x5C64: 0x6A1E, - 0x5C65: 0x69ED, - 0x5C66: 0x6A14, - 0x5C67: 0x69EB, - 0x5C68: 0x6A0A, - 0x5C69: 0x6A12, - 0x5C6A: 0x6AC1, - 0x5C6B: 0x6A23, - 0x5C6C: 0x6A13, - 0x5C6D: 0x6A44, - 0x5C6E: 0x6A0C, - 0x5C6F: 0x6A72, - 0x5C70: 0x6A36, - 0x5C71: 0x6A78, - 0x5C72: 0x6A47, - 0x5C73: 0x6A62, - 0x5C74: 0x6A59, - 0x5C75: 0x6A66, - 0x5C76: 0x6A48, - 0x5C77: 0x6A38, - 0x5C78: 0x6A22, - 0x5C79: 0x6A90, - 0x5C7A: 0x6A8D, - 0x5C7B: 0x6AA0, - 0x5C7C: 0x6A84, - 0x5C7D: 0x6AA2, - 0x5C7E: 0x6AA3, - 0x5D21: 0x6A97, - 0x5D22: 0x8617, - 0x5D23: 0x6ABB, - 0x5D24: 0x6AC3, - 0x5D25: 0x6AC2, - 0x5D26: 0x6AB8, - 0x5D27: 0x6AB3, - 0x5D28: 0x6AAC, - 0x5D29: 0x6ADE, - 0x5D2A: 0x6AD1, - 0x5D2B: 0x6ADF, - 0x5D2C: 0x6AAA, - 0x5D2D: 0x6ADA, - 0x5D2E: 0x6AEA, - 0x5D2F: 0x6AFB, - 0x5D30: 0x6B05, - 0x5D31: 0x8616, - 0x5D32: 0x6AFA, - 0x5D33: 0x6B12, - 0x5D34: 0x6B16, - 0x5D35: 0x9B31, - 0x5D36: 0x6B1F, - 0x5D37: 0x6B38, - 0x5D38: 0x6B37, - 0x5D39: 0x76DC, - 0x5D3A: 0x6B39, - 0x5D3B: 0x98EE, - 0x5D3C: 0x6B47, - 0x5D3D: 0x6B43, - 0x5D3E: 0x6B49, - 0x5D3F: 0x6B50, - 0x5D40: 0x6B59, - 0x5D41: 0x6B54, - 0x5D42: 0x6B5B, - 0x5D43: 0x6B5F, - 0x5D44: 0x6B61, - 0x5D45: 0x6B78, - 0x5D46: 0x6B79, - 0x5D47: 0x6B7F, - 0x5D48: 0x6B80, - 0x5D49: 0x6B84, - 0x5D4A: 0x6B83, - 0x5D4B: 0x6B8D, - 0x5D4C: 0x6B98, - 0x5D4D: 0x6B95, - 0x5D4E: 0x6B9E, - 0x5D4F: 0x6BA4, - 0x5D50: 0x6BAA, - 0x5D51: 0x6BAB, - 0x5D52: 0x6BAF, - 0x5D53: 0x6BB2, - 0x5D54: 0x6BB1, - 0x5D55: 0x6BB3, - 0x5D56: 0x6BB7, - 0x5D57: 0x6BBC, - 0x5D58: 0x6BC6, - 0x5D59: 0x6BCB, - 0x5D5A: 0x6BD3, - 0x5D5B: 0x6BDF, - 0x5D5C: 0x6BEC, - 0x5D5D: 0x6BEB, - 0x5D5E: 0x6BF3, - 0x5D5F: 0x6BEF, - 0x5D60: 0x9EBE, - 0x5D61: 0x6C08, - 0x5D62: 0x6C13, - 0x5D63: 0x6C14, - 0x5D64: 0x6C1B, - 0x5D65: 0x6C24, - 0x5D66: 0x6C23, - 0x5D67: 0x6C5E, - 0x5D68: 0x6C55, - 0x5D69: 0x6C62, - 0x5D6A: 0x6C6A, - 0x5D6B: 0x6C82, - 0x5D6C: 0x6C8D, - 0x5D6D: 0x6C9A, - 0x5D6E: 0x6C81, - 0x5D6F: 0x6C9B, - 0x5D70: 0x6C7E, - 0x5D71: 0x6C68, - 0x5D72: 0x6C73, - 0x5D73: 0x6C92, - 0x5D74: 0x6C90, - 0x5D75: 0x6CC4, - 0x5D76: 0x6CF1, - 0x5D77: 0x6CD3, - 0x5D78: 0x6CBD, - 0x5D79: 0x6CD7, - 0x5D7A: 0x6CC5, - 0x5D7B: 0x6CDD, - 0x5D7C: 0x6CAE, - 0x5D7D: 0x6CB1, - 0x5D7E: 0x6CBE, - 0x5E21: 0x6CBA, - 0x5E22: 0x6CDB, - 0x5E23: 0x6CEF, - 0x5E24: 0x6CD9, - 0x5E25: 0x6CEA, - 0x5E26: 0x6D1F, - 0x5E27: 0x884D, - 0x5E28: 0x6D36, - 0x5E29: 0x6D2B, - 0x5E2A: 0x6D3D, - 0x5E2B: 0x6D38, - 0x5E2C: 0x6D19, - 0x5E2D: 0x6D35, - 0x5E2E: 0x6D33, - 0x5E2F: 0x6D12, - 0x5E30: 0x6D0C, - 0x5E31: 0x6D63, - 0x5E32: 0x6D93, - 0x5E33: 0x6D64, - 0x5E34: 0x6D5A, - 0x5E35: 0x6D79, - 0x5E36: 0x6D59, - 0x5E37: 0x6D8E, - 0x5E38: 0x6D95, - 0x5E39: 0x6FE4, - 0x5E3A: 0x6D85, - 0x5E3B: 0x6DF9, - 0x5E3C: 0x6E15, - 0x5E3D: 0x6E0A, - 0x5E3E: 0x6DB5, - 0x5E3F: 0x6DC7, - 0x5E40: 0x6DE6, - 0x5E41: 0x6DB8, - 0x5E42: 0x6DC6, - 0x5E43: 0x6DEC, - 0x5E44: 0x6DDE, - 0x5E45: 0x6DCC, - 0x5E46: 0x6DE8, - 0x5E47: 0x6DD2, - 0x5E48: 0x6DC5, - 0x5E49: 0x6DFA, - 0x5E4A: 0x6DD9, - 0x5E4B: 0x6DE4, - 0x5E4C: 0x6DD5, - 0x5E4D: 0x6DEA, - 0x5E4E: 0x6DEE, - 0x5E4F: 0x6E2D, - 0x5E50: 0x6E6E, - 0x5E51: 0x6E2E, - 0x5E52: 0x6E19, - 0x5E53: 0x6E72, - 0x5E54: 0x6E5F, - 0x5E55: 0x6E3E, - 0x5E56: 0x6E23, - 0x5E57: 0x6E6B, - 0x5E58: 0x6E2B, - 0x5E59: 0x6E76, - 0x5E5A: 0x6E4D, - 0x5E5B: 0x6E1F, - 0x5E5C: 0x6E43, - 0x5E5D: 0x6E3A, - 0x5E5E: 0x6E4E, - 0x5E5F: 0x6E24, - 0x5E60: 0x6EFF, - 0x5E61: 0x6E1D, - 0x5E62: 0x6E38, - 0x5E63: 0x6E82, - 0x5E64: 0x6EAA, - 0x5E65: 0x6E98, - 0x5E66: 0x6EC9, - 0x5E67: 0x6EB7, - 0x5E68: 0x6ED3, - 0x5E69: 0x6EBD, - 0x5E6A: 0x6EAF, - 0x5E6B: 0x6EC4, - 0x5E6C: 0x6EB2, - 0x5E6D: 0x6ED4, - 0x5E6E: 0x6ED5, - 0x5E6F: 0x6E8F, - 0x5E70: 0x6EA5, - 0x5E71: 0x6EC2, - 0x5E72: 0x6E9F, - 0x5E73: 0x6F41, - 0x5E74: 0x6F11, - 0x5E75: 0x704C, - 0x5E76: 0x6EEC, - 0x5E77: 0x6EF8, - 0x5E78: 0x6EFE, - 0x5E79: 0x6F3F, - 0x5E7A: 0x6EF2, - 0x5E7B: 0x6F31, - 0x5E7C: 0x6EEF, - 0x5E7D: 0x6F32, - 0x5E7E: 0x6ECC, - 0x5F21: 0x6F3E, - 0x5F22: 0x6F13, - 0x5F23: 0x6EF7, - 0x5F24: 0x6F86, - 0x5F25: 0x6F7A, - 0x5F26: 0x6F78, - 0x5F27: 0x6F81, - 0x5F28: 0x6F80, - 0x5F29: 0x6F6F, - 0x5F2A: 0x6F5B, - 0x5F2B: 0x6FF3, - 0x5F2C: 0x6F6D, - 0x5F2D: 0x6F82, - 0x5F2E: 0x6F7C, - 0x5F2F: 0x6F58, - 0x5F30: 0x6F8E, - 0x5F31: 0x6F91, - 0x5F32: 0x6FC2, - 0x5F33: 0x6F66, - 0x5F34: 0x6FB3, - 0x5F35: 0x6FA3, - 0x5F36: 0x6FA1, - 0x5F37: 0x6FA4, - 0x5F38: 0x6FB9, - 0x5F39: 0x6FC6, - 0x5F3A: 0x6FAA, - 0x5F3B: 0x6FDF, - 0x5F3C: 0x6FD5, - 0x5F3D: 0x6FEC, - 0x5F3E: 0x6FD4, - 0x5F3F: 0x6FD8, - 0x5F40: 0x6FF1, - 0x5F41: 0x6FEE, - 0x5F42: 0x6FDB, - 0x5F43: 0x7009, - 0x5F44: 0x700B, - 0x5F45: 0x6FFA, - 0x5F46: 0x7011, - 0x5F47: 0x7001, - 0x5F48: 0x700F, - 0x5F49: 0x6FFE, - 0x5F4A: 0x701B, - 0x5F4B: 0x701A, - 0x5F4C: 0x6F74, - 0x5F4D: 0x701D, - 0x5F4E: 0x7018, - 0x5F4F: 0x701F, - 0x5F50: 0x7030, - 0x5F51: 0x703E, - 0x5F52: 0x7032, - 0x5F53: 0x7051, - 0x5F54: 0x7063, - 0x5F55: 0x7099, - 0x5F56: 0x7092, - 0x5F57: 0x70AF, - 0x5F58: 0x70F1, - 0x5F59: 0x70AC, - 0x5F5A: 0x70B8, - 0x5F5B: 0x70B3, - 0x5F5C: 0x70AE, - 0x5F5D: 0x70DF, - 0x5F5E: 0x70CB, - 0x5F5F: 0x70DD, - 0x5F60: 0x70D9, - 0x5F61: 0x7109, - 0x5F62: 0x70FD, - 0x5F63: 0x711C, - 0x5F64: 0x7119, - 0x5F65: 0x7165, - 0x5F66: 0x7155, - 0x5F67: 0x7188, - 0x5F68: 0x7166, - 0x5F69: 0x7162, - 0x5F6A: 0x714C, - 0x5F6B: 0x7156, - 0x5F6C: 0x716C, - 0x5F6D: 0x718F, - 0x5F6E: 0x71FB, - 0x5F6F: 0x7184, - 0x5F70: 0x7195, - 0x5F71: 0x71A8, - 0x5F72: 0x71AC, - 0x5F73: 0x71D7, - 0x5F74: 0x71B9, - 0x5F75: 0x71BE, - 0x5F76: 0x71D2, - 0x5F77: 0x71C9, - 0x5F78: 0x71D4, - 0x5F79: 0x71CE, - 0x5F7A: 0x71E0, - 0x5F7B: 0x71EC, - 0x5F7C: 0x71E7, - 0x5F7D: 0x71F5, - 0x5F7E: 0x71FC, - 0x6021: 0x71F9, - 0x6022: 0x71FF, - 0x6023: 0x720D, - 0x6024: 0x7210, - 0x6025: 0x721B, - 0x6026: 0x7228, - 0x6027: 0x722D, - 0x6028: 0x722C, - 0x6029: 0x7230, - 0x602A: 0x7232, - 0x602B: 0x723B, - 0x602C: 0x723C, - 0x602D: 0x723F, - 0x602E: 0x7240, - 0x602F: 0x7246, - 0x6030: 0x724B, - 0x6031: 0x7258, - 0x6032: 0x7274, - 0x6033: 0x727E, - 0x6034: 0x7282, - 0x6035: 0x7281, - 0x6036: 0x7287, - 0x6037: 0x7292, - 0x6038: 0x7296, - 0x6039: 0x72A2, - 0x603A: 0x72A7, - 0x603B: 0x72B9, - 0x603C: 0x72B2, - 0x603D: 0x72C3, - 0x603E: 0x72C6, - 0x603F: 0x72C4, - 0x6040: 0x72CE, - 0x6041: 0x72D2, - 0x6042: 0x72E2, - 0x6043: 0x72E0, - 0x6044: 0x72E1, - 0x6045: 0x72F9, - 0x6046: 0x72F7, - 0x6047: 0x500F, - 0x6048: 0x7317, - 0x6049: 0x730A, - 0x604A: 0x731C, - 0x604B: 0x7316, - 0x604C: 0x731D, - 0x604D: 0x7334, - 0x604E: 0x732F, - 0x604F: 0x7329, - 0x6050: 0x7325, - 0x6051: 0x733E, - 0x6052: 0x734E, - 0x6053: 0x734F, - 0x6054: 0x9ED8, - 0x6055: 0x7357, - 0x6056: 0x736A, - 0x6057: 0x7368, - 0x6058: 0x7370, - 0x6059: 0x7378, - 0x605A: 0x7375, - 0x605B: 0x737B, - 0x605C: 0x737A, - 0x605D: 0x73C8, - 0x605E: 0x73B3, - 0x605F: 0x73CE, - 0x6060: 0x73BB, - 0x6061: 0x73C0, - 0x6062: 0x73E5, - 0x6063: 0x73EE, - 0x6064: 0x73DE, - 0x6065: 0x74A2, - 0x6066: 0x7405, - 0x6067: 0x746F, - 0x6068: 0x7425, - 0x6069: 0x73F8, - 0x606A: 0x7432, - 0x606B: 0x743A, - 0x606C: 0x7455, - 0x606D: 0x743F, - 0x606E: 0x745F, - 0x606F: 0x7459, - 0x6070: 0x7441, - 0x6071: 0x745C, - 0x6072: 0x7469, - 0x6073: 0x7470, - 0x6074: 0x7463, - 0x6075: 0x746A, - 0x6076: 0x7476, - 0x6077: 0x747E, - 0x6078: 0x748B, - 0x6079: 0x749E, - 0x607A: 0x74A7, - 0x607B: 0x74CA, - 0x607C: 0x74CF, - 0x607D: 0x74D4, - 0x607E: 0x73F1, - 0x6121: 0x74E0, - 0x6122: 0x74E3, - 0x6123: 0x74E7, - 0x6124: 0x74E9, - 0x6125: 0x74EE, - 0x6126: 0x74F2, - 0x6127: 0x74F0, - 0x6128: 0x74F1, - 0x6129: 0x74F8, - 0x612A: 0x74F7, - 0x612B: 0x7504, - 0x612C: 0x7503, - 0x612D: 0x7505, - 0x612E: 0x750C, - 0x612F: 0x750E, - 0x6130: 0x750D, - 0x6131: 0x7515, - 0x6132: 0x7513, - 0x6133: 0x751E, - 0x6134: 0x7526, - 0x6135: 0x752C, - 0x6136: 0x753C, - 0x6137: 0x7544, - 0x6138: 0x754D, - 0x6139: 0x754A, - 0x613A: 0x7549, - 0x613B: 0x755B, - 0x613C: 0x7546, - 0x613D: 0x755A, - 0x613E: 0x7569, - 0x613F: 0x7564, - 0x6140: 0x7567, - 0x6141: 0x756B, - 0x6142: 0x756D, - 0x6143: 0x7578, - 0x6144: 0x7576, - 0x6145: 0x7586, - 0x6146: 0x7587, - 0x6147: 0x7574, - 0x6148: 0x758A, - 0x6149: 0x7589, - 0x614A: 0x7582, - 0x614B: 0x7594, - 0x614C: 0x759A, - 0x614D: 0x759D, - 0x614E: 0x75A5, - 0x614F: 0x75A3, - 0x6150: 0x75C2, - 0x6151: 0x75B3, - 0x6152: 0x75C3, - 0x6153: 0x75B5, - 0x6154: 0x75BD, - 0x6155: 0x75B8, - 0x6156: 0x75BC, - 0x6157: 0x75B1, - 0x6158: 0x75CD, - 0x6159: 0x75CA, - 0x615A: 0x75D2, - 0x615B: 0x75D9, - 0x615C: 0x75E3, - 0x615D: 0x75DE, - 0x615E: 0x75FE, - 0x615F: 0x75FF, - 0x6160: 0x75FC, - 0x6161: 0x7601, - 0x6162: 0x75F0, - 0x6163: 0x75FA, - 0x6164: 0x75F2, - 0x6165: 0x75F3, - 0x6166: 0x760B, - 0x6167: 0x760D, - 0x6168: 0x7609, - 0x6169: 0x761F, - 0x616A: 0x7627, - 0x616B: 0x7620, - 0x616C: 0x7621, - 0x616D: 0x7622, - 0x616E: 0x7624, - 0x616F: 0x7634, - 0x6170: 0x7630, - 0x6171: 0x763B, - 0x6172: 0x7647, - 0x6173: 0x7648, - 0x6174: 0x7646, - 0x6175: 0x765C, - 0x6176: 0x7658, - 0x6177: 0x7661, - 0x6178: 0x7662, - 0x6179: 0x7668, - 0x617A: 0x7669, - 0x617B: 0x766A, - 0x617C: 0x7667, - 0x617D: 0x766C, - 0x617E: 0x7670, - 0x6221: 0x7672, - 0x6222: 0x7676, - 0x6223: 0x7678, - 0x6224: 0x767C, - 0x6225: 0x7680, - 0x6226: 0x7683, - 0x6227: 0x7688, - 0x6228: 0x768B, - 0x6229: 0x768E, - 0x622A: 0x7696, - 0x622B: 0x7693, - 0x622C: 0x7699, - 0x622D: 0x769A, - 0x622E: 0x76B0, - 0x622F: 0x76B4, - 0x6230: 0x76B8, - 0x6231: 0x76B9, - 0x6232: 0x76BA, - 0x6233: 0x76C2, - 0x6234: 0x76CD, - 0x6235: 0x76D6, - 0x6236: 0x76D2, - 0x6237: 0x76DE, - 0x6238: 0x76E1, - 0x6239: 0x76E5, - 0x623A: 0x76E7, - 0x623B: 0x76EA, - 0x623C: 0x862F, - 0x623D: 0x76FB, - 0x623E: 0x7708, - 0x623F: 0x7707, - 0x6240: 0x7704, - 0x6241: 0x7729, - 0x6242: 0x7724, - 0x6243: 0x771E, - 0x6244: 0x7725, - 0x6245: 0x7726, - 0x6246: 0x771B, - 0x6247: 0x7737, - 0x6248: 0x7738, - 0x6249: 0x7747, - 0x624A: 0x775A, - 0x624B: 0x7768, - 0x624C: 0x776B, - 0x624D: 0x775B, - 0x624E: 0x7765, - 0x624F: 0x777F, - 0x6250: 0x777E, - 0x6251: 0x7779, - 0x6252: 0x778E, - 0x6253: 0x778B, - 0x6254: 0x7791, - 0x6255: 0x77A0, - 0x6256: 0x779E, - 0x6257: 0x77B0, - 0x6258: 0x77B6, - 0x6259: 0x77B9, - 0x625A: 0x77BF, - 0x625B: 0x77BC, - 0x625C: 0x77BD, - 0x625D: 0x77BB, - 0x625E: 0x77C7, - 0x625F: 0x77CD, - 0x6260: 0x77D7, - 0x6261: 0x77DA, - 0x6262: 0x77DC, - 0x6263: 0x77E3, - 0x6264: 0x77EE, - 0x6265: 0x77FC, - 0x6266: 0x780C, - 0x6267: 0x7812, - 0x6268: 0x7926, - 0x6269: 0x7820, - 0x626A: 0x792A, - 0x626B: 0x7845, - 0x626C: 0x788E, - 0x626D: 0x7874, - 0x626E: 0x7886, - 0x626F: 0x787C, - 0x6270: 0x789A, - 0x6271: 0x788C, - 0x6272: 0x78A3, - 0x6273: 0x78B5, - 0x6274: 0x78AA, - 0x6275: 0x78AF, - 0x6276: 0x78D1, - 0x6277: 0x78C6, - 0x6278: 0x78CB, - 0x6279: 0x78D4, - 0x627A: 0x78BE, - 0x627B: 0x78BC, - 0x627C: 0x78C5, - 0x627D: 0x78CA, - 0x627E: 0x78EC, - 0x6321: 0x78E7, - 0x6322: 0x78DA, - 0x6323: 0x78FD, - 0x6324: 0x78F4, - 0x6325: 0x7907, - 0x6326: 0x7912, - 0x6327: 0x7911, - 0x6328: 0x7919, - 0x6329: 0x792C, - 0x632A: 0x792B, - 0x632B: 0x7940, - 0x632C: 0x7960, - 0x632D: 0x7957, - 0x632E: 0x795F, - 0x632F: 0x795A, - 0x6330: 0x7955, - 0x6331: 0x7953, - 0x6332: 0x797A, - 0x6333: 0x797F, - 0x6334: 0x798A, - 0x6335: 0x799D, - 0x6336: 0x79A7, - 0x6337: 0x9F4B, - 0x6338: 0x79AA, - 0x6339: 0x79AE, - 0x633A: 0x79B3, - 0x633B: 0x79B9, - 0x633C: 0x79BA, - 0x633D: 0x79C9, - 0x633E: 0x79D5, - 0x633F: 0x79E7, - 0x6340: 0x79EC, - 0x6341: 0x79E1, - 0x6342: 0x79E3, - 0x6343: 0x7A08, - 0x6344: 0x7A0D, - 0x6345: 0x7A18, - 0x6346: 0x7A19, - 0x6347: 0x7A20, - 0x6348: 0x7A1F, - 0x6349: 0x7980, - 0x634A: 0x7A31, - 0x634B: 0x7A3B, - 0x634C: 0x7A3E, - 0x634D: 0x7A37, - 0x634E: 0x7A43, - 0x634F: 0x7A57, - 0x6350: 0x7A49, - 0x6351: 0x7A61, - 0x6352: 0x7A62, - 0x6353: 0x7A69, - 0x6354: 0x9F9D, - 0x6355: 0x7A70, - 0x6356: 0x7A79, - 0x6357: 0x7A7D, - 0x6358: 0x7A88, - 0x6359: 0x7A97, - 0x635A: 0x7A95, - 0x635B: 0x7A98, - 0x635C: 0x7A96, - 0x635D: 0x7AA9, - 0x635E: 0x7AC8, - 0x635F: 0x7AB0, - 0x6360: 0x7AB6, - 0x6361: 0x7AC5, - 0x6362: 0x7AC4, - 0x6363: 0x7ABF, - 0x6364: 0x9083, - 0x6365: 0x7AC7, - 0x6366: 0x7ACA, - 0x6367: 0x7ACD, - 0x6368: 0x7ACF, - 0x6369: 0x7AD5, - 0x636A: 0x7AD3, - 0x636B: 0x7AD9, - 0x636C: 0x7ADA, - 0x636D: 0x7ADD, - 0x636E: 0x7AE1, - 0x636F: 0x7AE2, - 0x6370: 0x7AE6, - 0x6371: 0x7AED, - 0x6372: 0x7AF0, - 0x6373: 0x7B02, - 0x6374: 0x7B0F, - 0x6375: 0x7B0A, - 0x6376: 0x7B06, - 0x6377: 0x7B33, - 0x6378: 0x7B18, - 0x6379: 0x7B19, - 0x637A: 0x7B1E, - 0x637B: 0x7B35, - 0x637C: 0x7B28, - 0x637D: 0x7B36, - 0x637E: 0x7B50, - 0x6421: 0x7B7A, - 0x6422: 0x7B04, - 0x6423: 0x7B4D, - 0x6424: 0x7B0B, - 0x6425: 0x7B4C, - 0x6426: 0x7B45, - 0x6427: 0x7B75, - 0x6428: 0x7B65, - 0x6429: 0x7B74, - 0x642A: 0x7B67, - 0x642B: 0x7B70, - 0x642C: 0x7B71, - 0x642D: 0x7B6C, - 0x642E: 0x7B6E, - 0x642F: 0x7B9D, - 0x6430: 0x7B98, - 0x6431: 0x7B9F, - 0x6432: 0x7B8D, - 0x6433: 0x7B9C, - 0x6434: 0x7B9A, - 0x6435: 0x7B8B, - 0x6436: 0x7B92, - 0x6437: 0x7B8F, - 0x6438: 0x7B5D, - 0x6439: 0x7B99, - 0x643A: 0x7BCB, - 0x643B: 0x7BC1, - 0x643C: 0x7BCC, - 0x643D: 0x7BCF, - 0x643E: 0x7BB4, - 0x643F: 0x7BC6, - 0x6440: 0x7BDD, - 0x6441: 0x7BE9, - 0x6442: 0x7C11, - 0x6443: 0x7C14, - 0x6444: 0x7BE6, - 0x6445: 0x7BE5, - 0x6446: 0x7C60, - 0x6447: 0x7C00, - 0x6448: 0x7C07, - 0x6449: 0x7C13, - 0x644A: 0x7BF3, - 0x644B: 0x7BF7, - 0x644C: 0x7C17, - 0x644D: 0x7C0D, - 0x644E: 0x7BF6, - 0x644F: 0x7C23, - 0x6450: 0x7C27, - 0x6451: 0x7C2A, - 0x6452: 0x7C1F, - 0x6453: 0x7C37, - 0x6454: 0x7C2B, - 0x6455: 0x7C3D, - 0x6456: 0x7C4C, - 0x6457: 0x7C43, - 0x6458: 0x7C54, - 0x6459: 0x7C4F, - 0x645A: 0x7C40, - 0x645B: 0x7C50, - 0x645C: 0x7C58, - 0x645D: 0x7C5F, - 0x645E: 0x7C64, - 0x645F: 0x7C56, - 0x6460: 0x7C65, - 0x6461: 0x7C6C, - 0x6462: 0x7C75, - 0x6463: 0x7C83, - 0x6464: 0x7C90, - 0x6465: 0x7CA4, - 0x6466: 0x7CAD, - 0x6467: 0x7CA2, - 0x6468: 0x7CAB, - 0x6469: 0x7CA1, - 0x646A: 0x7CA8, - 0x646B: 0x7CB3, - 0x646C: 0x7CB2, - 0x646D: 0x7CB1, - 0x646E: 0x7CAE, - 0x646F: 0x7CB9, - 0x6470: 0x7CBD, - 0x6471: 0x7CC0, - 0x6472: 0x7CC5, - 0x6473: 0x7CC2, - 0x6474: 0x7CD8, - 0x6475: 0x7CD2, - 0x6476: 0x7CDC, - 0x6477: 0x7CE2, - 0x6478: 0x9B3B, - 0x6479: 0x7CEF, - 0x647A: 0x7CF2, - 0x647B: 0x7CF4, - 0x647C: 0x7CF6, - 0x647D: 0x7CFA, - 0x647E: 0x7D06, - 0x6521: 0x7D02, - 0x6522: 0x7D1C, - 0x6523: 0x7D15, - 0x6524: 0x7D0A, - 0x6525: 0x7D45, - 0x6526: 0x7D4B, - 0x6527: 0x7D2E, - 0x6528: 0x7D32, - 0x6529: 0x7D3F, - 0x652A: 0x7D35, - 0x652B: 0x7D46, - 0x652C: 0x7D73, - 0x652D: 0x7D56, - 0x652E: 0x7D4E, - 0x652F: 0x7D72, - 0x6530: 0x7D68, - 0x6531: 0x7D6E, - 0x6532: 0x7D4F, - 0x6533: 0x7D63, - 0x6534: 0x7D93, - 0x6535: 0x7D89, - 0x6536: 0x7D5B, - 0x6537: 0x7D8F, - 0x6538: 0x7D7D, - 0x6539: 0x7D9B, - 0x653A: 0x7DBA, - 0x653B: 0x7DAE, - 0x653C: 0x7DA3, - 0x653D: 0x7DB5, - 0x653E: 0x7DC7, - 0x653F: 0x7DBD, - 0x6540: 0x7DAB, - 0x6541: 0x7E3D, - 0x6542: 0x7DA2, - 0x6543: 0x7DAF, - 0x6544: 0x7DDC, - 0x6545: 0x7DB8, - 0x6546: 0x7D9F, - 0x6547: 0x7DB0, - 0x6548: 0x7DD8, - 0x6549: 0x7DDD, - 0x654A: 0x7DE4, - 0x654B: 0x7DDE, - 0x654C: 0x7DFB, - 0x654D: 0x7DF2, - 0x654E: 0x7DE1, - 0x654F: 0x7E05, - 0x6550: 0x7E0A, - 0x6551: 0x7E23, - 0x6552: 0x7E21, - 0x6553: 0x7E12, - 0x6554: 0x7E31, - 0x6555: 0x7E1F, - 0x6556: 0x7E09, - 0x6557: 0x7E0B, - 0x6558: 0x7E22, - 0x6559: 0x7E46, - 0x655A: 0x7E66, - 0x655B: 0x7E3B, - 0x655C: 0x7E35, - 0x655D: 0x7E39, - 0x655E: 0x7E43, - 0x655F: 0x7E37, - 0x6560: 0x7E32, - 0x6561: 0x7E3A, - 0x6562: 0x7E67, - 0x6563: 0x7E5D, - 0x6564: 0x7E56, - 0x6565: 0x7E5E, - 0x6566: 0x7E59, - 0x6567: 0x7E5A, - 0x6568: 0x7E79, - 0x6569: 0x7E6A, - 0x656A: 0x7E69, - 0x656B: 0x7E7C, - 0x656C: 0x7E7B, - 0x656D: 0x7E83, - 0x656E: 0x7DD5, - 0x656F: 0x7E7D, - 0x6570: 0x8FAE, - 0x6571: 0x7E7F, - 0x6572: 0x7E88, - 0x6573: 0x7E89, - 0x6574: 0x7E8C, - 0x6575: 0x7E92, - 0x6576: 0x7E90, - 0x6577: 0x7E93, - 0x6578: 0x7E94, - 0x6579: 0x7E96, - 0x657A: 0x7E8E, - 0x657B: 0x7E9B, - 0x657C: 0x7E9C, - 0x657D: 0x7F38, - 0x657E: 0x7F3A, - 0x6621: 0x7F45, - 0x6622: 0x7F4C, - 0x6623: 0x7F4D, - 0x6624: 0x7F4E, - 0x6625: 0x7F50, - 0x6626: 0x7F51, - 0x6627: 0x7F55, - 0x6628: 0x7F54, - 0x6629: 0x7F58, - 0x662A: 0x7F5F, - 0x662B: 0x7F60, - 0x662C: 0x7F68, - 0x662D: 0x7F69, - 0x662E: 0x7F67, - 0x662F: 0x7F78, - 0x6630: 0x7F82, - 0x6631: 0x7F86, - 0x6632: 0x7F83, - 0x6633: 0x7F88, - 0x6634: 0x7F87, - 0x6635: 0x7F8C, - 0x6636: 0x7F94, - 0x6637: 0x7F9E, - 0x6638: 0x7F9D, - 0x6639: 0x7F9A, - 0x663A: 0x7FA3, - 0x663B: 0x7FAF, - 0x663C: 0x7FB2, - 0x663D: 0x7FB9, - 0x663E: 0x7FAE, - 0x663F: 0x7FB6, - 0x6640: 0x7FB8, - 0x6641: 0x8B71, - 0x6642: 0x7FC5, - 0x6643: 0x7FC6, - 0x6644: 0x7FCA, - 0x6645: 0x7FD5, - 0x6646: 0x7FD4, - 0x6647: 0x7FE1, - 0x6648: 0x7FE6, - 0x6649: 0x7FE9, - 0x664A: 0x7FF3, - 0x664B: 0x7FF9, - 0x664C: 0x98DC, - 0x664D: 0x8006, - 0x664E: 0x8004, - 0x664F: 0x800B, - 0x6650: 0x8012, - 0x6651: 0x8018, - 0x6652: 0x8019, - 0x6653: 0x801C, - 0x6654: 0x8021, - 0x6655: 0x8028, - 0x6656: 0x803F, - 0x6657: 0x803B, - 0x6658: 0x804A, - 0x6659: 0x8046, - 0x665A: 0x8052, - 0x665B: 0x8058, - 0x665C: 0x805A, - 0x665D: 0x805F, - 0x665E: 0x8062, - 0x665F: 0x8068, - 0x6660: 0x8073, - 0x6661: 0x8072, - 0x6662: 0x8070, - 0x6663: 0x8076, - 0x6664: 0x8079, - 0x6665: 0x807D, - 0x6666: 0x807F, - 0x6667: 0x8084, - 0x6668: 0x8086, - 0x6669: 0x8085, - 0x666A: 0x809B, - 0x666B: 0x8093, - 0x666C: 0x809A, - 0x666D: 0x80AD, - 0x666E: 0x5190, - 0x666F: 0x80AC, - 0x6670: 0x80DB, - 0x6671: 0x80E5, - 0x6672: 0x80D9, - 0x6673: 0x80DD, - 0x6674: 0x80C4, - 0x6675: 0x80DA, - 0x6676: 0x80D6, - 0x6677: 0x8109, - 0x6678: 0x80EF, - 0x6679: 0x80F1, - 0x667A: 0x811B, - 0x667B: 0x8129, - 0x667C: 0x8123, - 0x667D: 0x812F, - 0x667E: 0x814B, - 0x6721: 0x968B, - 0x6722: 0x8146, - 0x6723: 0x813E, - 0x6724: 0x8153, - 0x6725: 0x8151, - 0x6726: 0x80FC, - 0x6727: 0x8171, - 0x6728: 0x816E, - 0x6729: 0x8165, - 0x672A: 0x8166, - 0x672B: 0x8174, - 0x672C: 0x8183, - 0x672D: 0x8188, - 0x672E: 0x818A, - 0x672F: 0x8180, - 0x6730: 0x8182, - 0x6731: 0x81A0, - 0x6732: 0x8195, - 0x6733: 0x81A4, - 0x6734: 0x81A3, - 0x6735: 0x815F, - 0x6736: 0x8193, - 0x6737: 0x81A9, - 0x6738: 0x81B0, - 0x6739: 0x81B5, - 0x673A: 0x81BE, - 0x673B: 0x81B8, - 0x673C: 0x81BD, - 0x673D: 0x81C0, - 0x673E: 0x81C2, - 0x673F: 0x81BA, - 0x6740: 0x81C9, - 0x6741: 0x81CD, - 0x6742: 0x81D1, - 0x6743: 0x81D9, - 0x6744: 0x81D8, - 0x6745: 0x81C8, - 0x6746: 0x81DA, - 0x6747: 0x81DF, - 0x6748: 0x81E0, - 0x6749: 0x81E7, - 0x674A: 0x81FA, - 0x674B: 0x81FB, - 0x674C: 0x81FE, - 0x674D: 0x8201, - 0x674E: 0x8202, - 0x674F: 0x8205, - 0x6750: 0x8207, - 0x6751: 0x820A, - 0x6752: 0x820D, - 0x6753: 0x8210, - 0x6754: 0x8216, - 0x6755: 0x8229, - 0x6756: 0x822B, - 0x6757: 0x8238, - 0x6758: 0x8233, - 0x6759: 0x8240, - 0x675A: 0x8259, - 0x675B: 0x8258, - 0x675C: 0x825D, - 0x675D: 0x825A, - 0x675E: 0x825F, - 0x675F: 0x8264, - 0x6760: 0x8262, - 0x6761: 0x8268, - 0x6762: 0x826A, - 0x6763: 0x826B, - 0x6764: 0x822E, - 0x6765: 0x8271, - 0x6766: 0x8277, - 0x6767: 0x8278, - 0x6768: 0x827E, - 0x6769: 0x828D, - 0x676A: 0x8292, - 0x676B: 0x82AB, - 0x676C: 0x829F, - 0x676D: 0x82BB, - 0x676E: 0x82AC, - 0x676F: 0x82E1, - 0x6770: 0x82E3, - 0x6771: 0x82DF, - 0x6772: 0x82D2, - 0x6773: 0x82F4, - 0x6774: 0x82F3, - 0x6775: 0x82FA, - 0x6776: 0x8393, - 0x6777: 0x8303, - 0x6778: 0x82FB, - 0x6779: 0x82F9, - 0x677A: 0x82DE, - 0x677B: 0x8306, - 0x677C: 0x82DC, - 0x677D: 0x8309, - 0x677E: 0x82D9, - 0x6821: 0x8335, - 0x6822: 0x8334, - 0x6823: 0x8316, - 0x6824: 0x8332, - 0x6825: 0x8331, - 0x6826: 0x8340, - 0x6827: 0x8339, - 0x6828: 0x8350, - 0x6829: 0x8345, - 0x682A: 0x832F, - 0x682B: 0x832B, - 0x682C: 0x8317, - 0x682D: 0x8318, - 0x682E: 0x8385, - 0x682F: 0x839A, - 0x6830: 0x83AA, - 0x6831: 0x839F, - 0x6832: 0x83A2, - 0x6833: 0x8396, - 0x6834: 0x8323, - 0x6835: 0x838E, - 0x6836: 0x8387, - 0x6837: 0x838A, - 0x6838: 0x837C, - 0x6839: 0x83B5, - 0x683A: 0x8373, - 0x683B: 0x8375, - 0x683C: 0x83A0, - 0x683D: 0x8389, - 0x683E: 0x83A8, - 0x683F: 0x83F4, - 0x6840: 0x8413, - 0x6841: 0x83EB, - 0x6842: 0x83CE, - 0x6843: 0x83FD, - 0x6844: 0x8403, - 0x6845: 0x83D8, - 0x6846: 0x840B, - 0x6847: 0x83C1, - 0x6848: 0x83F7, - 0x6849: 0x8407, - 0x684A: 0x83E0, - 0x684B: 0x83F2, - 0x684C: 0x840D, - 0x684D: 0x8422, - 0x684E: 0x8420, - 0x684F: 0x83BD, - 0x6850: 0x8438, - 0x6851: 0x8506, - 0x6852: 0x83FB, - 0x6853: 0x846D, - 0x6854: 0x842A, - 0x6855: 0x843C, - 0x6856: 0x855A, - 0x6857: 0x8484, - 0x6858: 0x8477, - 0x6859: 0x846B, - 0x685A: 0x84AD, - 0x685B: 0x846E, - 0x685C: 0x8482, - 0x685D: 0x8469, - 0x685E: 0x8446, - 0x685F: 0x842C, - 0x6860: 0x846F, - 0x6861: 0x8479, - 0x6862: 0x8435, - 0x6863: 0x84CA, - 0x6864: 0x8462, - 0x6865: 0x84B9, - 0x6866: 0x84BF, - 0x6867: 0x849F, - 0x6868: 0x84D9, - 0x6869: 0x84CD, - 0x686A: 0x84BB, - 0x686B: 0x84DA, - 0x686C: 0x84D0, - 0x686D: 0x84C1, - 0x686E: 0x84C6, - 0x686F: 0x84D6, - 0x6870: 0x84A1, - 0x6871: 0x8521, - 0x6872: 0x84FF, - 0x6873: 0x84F4, - 0x6874: 0x8517, - 0x6875: 0x8518, - 0x6876: 0x852C, - 0x6877: 0x851F, - 0x6878: 0x8515, - 0x6879: 0x8514, - 0x687A: 0x84FC, - 0x687B: 0x8540, - 0x687C: 0x8563, - 0x687D: 0x8558, - 0x687E: 0x8548, - 0x6921: 0x8541, - 0x6922: 0x8602, - 0x6923: 0x854B, - 0x6924: 0x8555, - 0x6925: 0x8580, - 0x6926: 0x85A4, - 0x6927: 0x8588, - 0x6928: 0x8591, - 0x6929: 0x858A, - 0x692A: 0x85A8, - 0x692B: 0x856D, - 0x692C: 0x8594, - 0x692D: 0x859B, - 0x692E: 0x85EA, - 0x692F: 0x8587, - 0x6930: 0x859C, - 0x6931: 0x8577, - 0x6932: 0x857E, - 0x6933: 0x8590, - 0x6934: 0x85C9, - 0x6935: 0x85BA, - 0x6936: 0x85CF, - 0x6937: 0x85B9, - 0x6938: 0x85D0, - 0x6939: 0x85D5, - 0x693A: 0x85DD, - 0x693B: 0x85E5, - 0x693C: 0x85DC, - 0x693D: 0x85F9, - 0x693E: 0x860A, - 0x693F: 0x8613, - 0x6940: 0x860B, - 0x6941: 0x85FE, - 0x6942: 0x85FA, - 0x6943: 0x8606, - 0x6944: 0x8622, - 0x6945: 0x861A, - 0x6946: 0x8630, - 0x6947: 0x863F, - 0x6948: 0x864D, - 0x6949: 0x4E55, - 0x694A: 0x8654, - 0x694B: 0x865F, - 0x694C: 0x8667, - 0x694D: 0x8671, - 0x694E: 0x8693, - 0x694F: 0x86A3, - 0x6950: 0x86A9, - 0x6951: 0x86AA, - 0x6952: 0x868B, - 0x6953: 0x868C, - 0x6954: 0x86B6, - 0x6955: 0x86AF, - 0x6956: 0x86C4, - 0x6957: 0x86C6, - 0x6958: 0x86B0, - 0x6959: 0x86C9, - 0x695A: 0x8823, - 0x695B: 0x86AB, - 0x695C: 0x86D4, - 0x695D: 0x86DE, - 0x695E: 0x86E9, - 0x695F: 0x86EC, - 0x6960: 0x86DF, - 0x6961: 0x86DB, - 0x6962: 0x86EF, - 0x6963: 0x8712, - 0x6964: 0x8706, - 0x6965: 0x8708, - 0x6966: 0x8700, - 0x6967: 0x8703, - 0x6968: 0x86FB, - 0x6969: 0x8711, - 0x696A: 0x8709, - 0x696B: 0x870D, - 0x696C: 0x86F9, - 0x696D: 0x870A, - 0x696E: 0x8734, - 0x696F: 0x873F, - 0x6970: 0x8737, - 0x6971: 0x873B, - 0x6972: 0x8725, - 0x6973: 0x8729, - 0x6974: 0x871A, - 0x6975: 0x8760, - 0x6976: 0x875F, - 0x6977: 0x8778, - 0x6978: 0x874C, - 0x6979: 0x874E, - 0x697A: 0x8774, - 0x697B: 0x8757, - 0x697C: 0x8768, - 0x697D: 0x876E, - 0x697E: 0x8759, - 0x6A21: 0x8753, - 0x6A22: 0x8763, - 0x6A23: 0x876A, - 0x6A24: 0x8805, - 0x6A25: 0x87A2, - 0x6A26: 0x879F, - 0x6A27: 0x8782, - 0x6A28: 0x87AF, - 0x6A29: 0x87CB, - 0x6A2A: 0x87BD, - 0x6A2B: 0x87C0, - 0x6A2C: 0x87D0, - 0x6A2D: 0x96D6, - 0x6A2E: 0x87AB, - 0x6A2F: 0x87C4, - 0x6A30: 0x87B3, - 0x6A31: 0x87C7, - 0x6A32: 0x87C6, - 0x6A33: 0x87BB, - 0x6A34: 0x87EF, - 0x6A35: 0x87F2, - 0x6A36: 0x87E0, - 0x6A37: 0x880F, - 0x6A38: 0x880D, - 0x6A39: 0x87FE, - 0x6A3A: 0x87F6, - 0x6A3B: 0x87F7, - 0x6A3C: 0x880E, - 0x6A3D: 0x87D2, - 0x6A3E: 0x8811, - 0x6A3F: 0x8816, - 0x6A40: 0x8815, - 0x6A41: 0x8822, - 0x6A42: 0x8821, - 0x6A43: 0x8831, - 0x6A44: 0x8836, - 0x6A45: 0x8839, - 0x6A46: 0x8827, - 0x6A47: 0x883B, - 0x6A48: 0x8844, - 0x6A49: 0x8842, - 0x6A4A: 0x8852, - 0x6A4B: 0x8859, - 0x6A4C: 0x885E, - 0x6A4D: 0x8862, - 0x6A4E: 0x886B, - 0x6A4F: 0x8881, - 0x6A50: 0x887E, - 0x6A51: 0x889E, - 0x6A52: 0x8875, - 0x6A53: 0x887D, - 0x6A54: 0x88B5, - 0x6A55: 0x8872, - 0x6A56: 0x8882, - 0x6A57: 0x8897, - 0x6A58: 0x8892, - 0x6A59: 0x88AE, - 0x6A5A: 0x8899, - 0x6A5B: 0x88A2, - 0x6A5C: 0x888D, - 0x6A5D: 0x88A4, - 0x6A5E: 0x88B0, - 0x6A5F: 0x88BF, - 0x6A60: 0x88B1, - 0x6A61: 0x88C3, - 0x6A62: 0x88C4, - 0x6A63: 0x88D4, - 0x6A64: 0x88D8, - 0x6A65: 0x88D9, - 0x6A66: 0x88DD, - 0x6A67: 0x88F9, - 0x6A68: 0x8902, - 0x6A69: 0x88FC, - 0x6A6A: 0x88F4, - 0x6A6B: 0x88E8, - 0x6A6C: 0x88F2, - 0x6A6D: 0x8904, - 0x6A6E: 0x890C, - 0x6A6F: 0x890A, - 0x6A70: 0x8913, - 0x6A71: 0x8943, - 0x6A72: 0x891E, - 0x6A73: 0x8925, - 0x6A74: 0x892A, - 0x6A75: 0x892B, - 0x6A76: 0x8941, - 0x6A77: 0x8944, - 0x6A78: 0x893B, - 0x6A79: 0x8936, - 0x6A7A: 0x8938, - 0x6A7B: 0x894C, - 0x6A7C: 0x891D, - 0x6A7D: 0x8960, - 0x6A7E: 0x895E, - 0x6B21: 0x8966, - 0x6B22: 0x8964, - 0x6B23: 0x896D, - 0x6B24: 0x896A, - 0x6B25: 0x896F, - 0x6B26: 0x8974, - 0x6B27: 0x8977, - 0x6B28: 0x897E, - 0x6B29: 0x8983, - 0x6B2A: 0x8988, - 0x6B2B: 0x898A, - 0x6B2C: 0x8993, - 0x6B2D: 0x8998, - 0x6B2E: 0x89A1, - 0x6B2F: 0x89A9, - 0x6B30: 0x89A6, - 0x6B31: 0x89AC, - 0x6B32: 0x89AF, - 0x6B33: 0x89B2, - 0x6B34: 0x89BA, - 0x6B35: 0x89BD, - 0x6B36: 0x89BF, - 0x6B37: 0x89C0, - 0x6B38: 0x89DA, - 0x6B39: 0x89DC, - 0x6B3A: 0x89DD, - 0x6B3B: 0x89E7, - 0x6B3C: 0x89F4, - 0x6B3D: 0x89F8, - 0x6B3E: 0x8A03, - 0x6B3F: 0x8A16, - 0x6B40: 0x8A10, - 0x6B41: 0x8A0C, - 0x6B42: 0x8A1B, - 0x6B43: 0x8A1D, - 0x6B44: 0x8A25, - 0x6B45: 0x8A36, - 0x6B46: 0x8A41, - 0x6B47: 0x8A5B, - 0x6B48: 0x8A52, - 0x6B49: 0x8A46, - 0x6B4A: 0x8A48, - 0x6B4B: 0x8A7C, - 0x6B4C: 0x8A6D, - 0x6B4D: 0x8A6C, - 0x6B4E: 0x8A62, - 0x6B4F: 0x8A85, - 0x6B50: 0x8A82, - 0x6B51: 0x8A84, - 0x6B52: 0x8AA8, - 0x6B53: 0x8AA1, - 0x6B54: 0x8A91, - 0x6B55: 0x8AA5, - 0x6B56: 0x8AA6, - 0x6B57: 0x8A9A, - 0x6B58: 0x8AA3, - 0x6B59: 0x8AC4, - 0x6B5A: 0x8ACD, - 0x6B5B: 0x8AC2, - 0x6B5C: 0x8ADA, - 0x6B5D: 0x8AEB, - 0x6B5E: 0x8AF3, - 0x6B5F: 0x8AE7, - 0x6B60: 0x8AE4, - 0x6B61: 0x8AF1, - 0x6B62: 0x8B14, - 0x6B63: 0x8AE0, - 0x6B64: 0x8AE2, - 0x6B65: 0x8AF7, - 0x6B66: 0x8ADE, - 0x6B67: 0x8ADB, - 0x6B68: 0x8B0C, - 0x6B69: 0x8B07, - 0x6B6A: 0x8B1A, - 0x6B6B: 0x8AE1, - 0x6B6C: 0x8B16, - 0x6B6D: 0x8B10, - 0x6B6E: 0x8B17, - 0x6B6F: 0x8B20, - 0x6B70: 0x8B33, - 0x6B71: 0x97AB, - 0x6B72: 0x8B26, - 0x6B73: 0x8B2B, - 0x6B74: 0x8B3E, - 0x6B75: 0x8B28, - 0x6B76: 0x8B41, - 0x6B77: 0x8B4C, - 0x6B78: 0x8B4F, - 0x6B79: 0x8B4E, - 0x6B7A: 0x8B49, - 0x6B7B: 0x8B56, - 0x6B7C: 0x8B5B, - 0x6B7D: 0x8B5A, - 0x6B7E: 0x8B6B, - 0x6C21: 0x8B5F, - 0x6C22: 0x8B6C, - 0x6C23: 0x8B6F, - 0x6C24: 0x8B74, - 0x6C25: 0x8B7D, - 0x6C26: 0x8B80, - 0x6C27: 0x8B8C, - 0x6C28: 0x8B8E, - 0x6C29: 0x8B92, - 0x6C2A: 0x8B93, - 0x6C2B: 0x8B96, - 0x6C2C: 0x8B99, - 0x6C2D: 0x8B9A, - 0x6C2E: 0x8C3A, - 0x6C2F: 0x8C41, - 0x6C30: 0x8C3F, - 0x6C31: 0x8C48, - 0x6C32: 0x8C4C, - 0x6C33: 0x8C4E, - 0x6C34: 0x8C50, - 0x6C35: 0x8C55, - 0x6C36: 0x8C62, - 0x6C37: 0x8C6C, - 0x6C38: 0x8C78, - 0x6C39: 0x8C7A, - 0x6C3A: 0x8C82, - 0x6C3B: 0x8C89, - 0x6C3C: 0x8C85, - 0x6C3D: 0x8C8A, - 0x6C3E: 0x8C8D, - 0x6C3F: 0x8C8E, - 0x6C40: 0x8C94, - 0x6C41: 0x8C7C, - 0x6C42: 0x8C98, - 0x6C43: 0x621D, - 0x6C44: 0x8CAD, - 0x6C45: 0x8CAA, - 0x6C46: 0x8CBD, - 0x6C47: 0x8CB2, - 0x6C48: 0x8CB3, - 0x6C49: 0x8CAE, - 0x6C4A: 0x8CB6, - 0x6C4B: 0x8CC8, - 0x6C4C: 0x8CC1, - 0x6C4D: 0x8CE4, - 0x6C4E: 0x8CE3, - 0x6C4F: 0x8CDA, - 0x6C50: 0x8CFD, - 0x6C51: 0x8CFA, - 0x6C52: 0x8CFB, - 0x6C53: 0x8D04, - 0x6C54: 0x8D05, - 0x6C55: 0x8D0A, - 0x6C56: 0x8D07, - 0x6C57: 0x8D0F, - 0x6C58: 0x8D0D, - 0x6C59: 0x8D10, - 0x6C5A: 0x9F4E, - 0x6C5B: 0x8D13, - 0x6C5C: 0x8CCD, - 0x6C5D: 0x8D14, - 0x6C5E: 0x8D16, - 0x6C5F: 0x8D67, - 0x6C60: 0x8D6D, - 0x6C61: 0x8D71, - 0x6C62: 0x8D73, - 0x6C63: 0x8D81, - 0x6C64: 0x8D99, - 0x6C65: 0x8DC2, - 0x6C66: 0x8DBE, - 0x6C67: 0x8DBA, - 0x6C68: 0x8DCF, - 0x6C69: 0x8DDA, - 0x6C6A: 0x8DD6, - 0x6C6B: 0x8DCC, - 0x6C6C: 0x8DDB, - 0x6C6D: 0x8DCB, - 0x6C6E: 0x8DEA, - 0x6C6F: 0x8DEB, - 0x6C70: 0x8DDF, - 0x6C71: 0x8DE3, - 0x6C72: 0x8DFC, - 0x6C73: 0x8E08, - 0x6C74: 0x8E09, - 0x6C75: 0x8DFF, - 0x6C76: 0x8E1D, - 0x6C77: 0x8E1E, - 0x6C78: 0x8E10, - 0x6C79: 0x8E1F, - 0x6C7A: 0x8E42, - 0x6C7B: 0x8E35, - 0x6C7C: 0x8E30, - 0x6C7D: 0x8E34, - 0x6C7E: 0x8E4A, - 0x6D21: 0x8E47, - 0x6D22: 0x8E49, - 0x6D23: 0x8E4C, - 0x6D24: 0x8E50, - 0x6D25: 0x8E48, - 0x6D26: 0x8E59, - 0x6D27: 0x8E64, - 0x6D28: 0x8E60, - 0x6D29: 0x8E2A, - 0x6D2A: 0x8E63, - 0x6D2B: 0x8E55, - 0x6D2C: 0x8E76, - 0x6D2D: 0x8E72, - 0x6D2E: 0x8E7C, - 0x6D2F: 0x8E81, - 0x6D30: 0x8E87, - 0x6D31: 0x8E85, - 0x6D32: 0x8E84, - 0x6D33: 0x8E8B, - 0x6D34: 0x8E8A, - 0x6D35: 0x8E93, - 0x6D36: 0x8E91, - 0x6D37: 0x8E94, - 0x6D38: 0x8E99, - 0x6D39: 0x8EAA, - 0x6D3A: 0x8EA1, - 0x6D3B: 0x8EAC, - 0x6D3C: 0x8EB0, - 0x6D3D: 0x8EC6, - 0x6D3E: 0x8EB1, - 0x6D3F: 0x8EBE, - 0x6D40: 0x8EC5, - 0x6D41: 0x8EC8, - 0x6D42: 0x8ECB, - 0x6D43: 0x8EDB, - 0x6D44: 0x8EE3, - 0x6D45: 0x8EFC, - 0x6D46: 0x8EFB, - 0x6D47: 0x8EEB, - 0x6D48: 0x8EFE, - 0x6D49: 0x8F0A, - 0x6D4A: 0x8F05, - 0x6D4B: 0x8F15, - 0x6D4C: 0x8F12, - 0x6D4D: 0x8F19, - 0x6D4E: 0x8F13, - 0x6D4F: 0x8F1C, - 0x6D50: 0x8F1F, - 0x6D51: 0x8F1B, - 0x6D52: 0x8F0C, - 0x6D53: 0x8F26, - 0x6D54: 0x8F33, - 0x6D55: 0x8F3B, - 0x6D56: 0x8F39, - 0x6D57: 0x8F45, - 0x6D58: 0x8F42, - 0x6D59: 0x8F3E, - 0x6D5A: 0x8F4C, - 0x6D5B: 0x8F49, - 0x6D5C: 0x8F46, - 0x6D5D: 0x8F4E, - 0x6D5E: 0x8F57, - 0x6D5F: 0x8F5C, - 0x6D60: 0x8F62, - 0x6D61: 0x8F63, - 0x6D62: 0x8F64, - 0x6D63: 0x8F9C, - 0x6D64: 0x8F9F, - 0x6D65: 0x8FA3, - 0x6D66: 0x8FAD, - 0x6D67: 0x8FAF, - 0x6D68: 0x8FB7, - 0x6D69: 0x8FDA, - 0x6D6A: 0x8FE5, - 0x6D6B: 0x8FE2, - 0x6D6C: 0x8FEA, - 0x6D6D: 0x8FEF, - 0x6D6E: 0x9087, - 0x6D6F: 0x8FF4, - 0x6D70: 0x9005, - 0x6D71: 0x8FF9, - 0x6D72: 0x8FFA, - 0x6D73: 0x9011, - 0x6D74: 0x9015, - 0x6D75: 0x9021, - 0x6D76: 0x900D, - 0x6D77: 0x901E, - 0x6D78: 0x9016, - 0x6D79: 0x900B, - 0x6D7A: 0x9027, - 0x6D7B: 0x9036, - 0x6D7C: 0x9035, - 0x6D7D: 0x9039, - 0x6D7E: 0x8FF8, - 0x6E21: 0x904F, - 0x6E22: 0x9050, - 0x6E23: 0x9051, - 0x6E24: 0x9052, - 0x6E25: 0x900E, - 0x6E26: 0x9049, - 0x6E27: 0x903E, - 0x6E28: 0x9056, - 0x6E29: 0x9058, - 0x6E2A: 0x905E, - 0x6E2B: 0x9068, - 0x6E2C: 0x906F, - 0x6E2D: 0x9076, - 0x6E2E: 0x96A8, - 0x6E2F: 0x9072, - 0x6E30: 0x9082, - 0x6E31: 0x907D, - 0x6E32: 0x9081, - 0x6E33: 0x9080, - 0x6E34: 0x908A, - 0x6E35: 0x9089, - 0x6E36: 0x908F, - 0x6E37: 0x90A8, - 0x6E38: 0x90AF, - 0x6E39: 0x90B1, - 0x6E3A: 0x90B5, - 0x6E3B: 0x90E2, - 0x6E3C: 0x90E4, - 0x6E3D: 0x6248, - 0x6E3E: 0x90DB, - 0x6E3F: 0x9102, - 0x6E40: 0x9112, - 0x6E41: 0x9119, - 0x6E42: 0x9132, - 0x6E43: 0x9130, - 0x6E44: 0x914A, - 0x6E45: 0x9156, - 0x6E46: 0x9158, - 0x6E47: 0x9163, - 0x6E48: 0x9165, - 0x6E49: 0x9169, - 0x6E4A: 0x9173, - 0x6E4B: 0x9172, - 0x6E4C: 0x918B, - 0x6E4D: 0x9189, - 0x6E4E: 0x9182, - 0x6E4F: 0x91A2, - 0x6E50: 0x91AB, - 0x6E51: 0x91AF, - 0x6E52: 0x91AA, - 0x6E53: 0x91B5, - 0x6E54: 0x91B4, - 0x6E55: 0x91BA, - 0x6E56: 0x91C0, - 0x6E57: 0x91C1, - 0x6E58: 0x91C9, - 0x6E59: 0x91CB, - 0x6E5A: 0x91D0, - 0x6E5B: 0x91D6, - 0x6E5C: 0x91DF, - 0x6E5D: 0x91E1, - 0x6E5E: 0x91DB, - 0x6E5F: 0x91FC, - 0x6E60: 0x91F5, - 0x6E61: 0x91F6, - 0x6E62: 0x921E, - 0x6E63: 0x91FF, - 0x6E64: 0x9214, - 0x6E65: 0x922C, - 0x6E66: 0x9215, - 0x6E67: 0x9211, - 0x6E68: 0x925E, - 0x6E69: 0x9257, - 0x6E6A: 0x9245, - 0x6E6B: 0x9249, - 0x6E6C: 0x9264, - 0x6E6D: 0x9248, - 0x6E6E: 0x9295, - 0x6E6F: 0x923F, - 0x6E70: 0x924B, - 0x6E71: 0x9250, - 0x6E72: 0x929C, - 0x6E73: 0x9296, - 0x6E74: 0x9293, - 0x6E75: 0x929B, - 0x6E76: 0x925A, - 0x6E77: 0x92CF, - 0x6E78: 0x92B9, - 0x6E79: 0x92B7, - 0x6E7A: 0x92E9, - 0x6E7B: 0x930F, - 0x6E7C: 0x92FA, - 0x6E7D: 0x9344, - 0x6E7E: 0x932E, - 0x6F21: 0x9319, - 0x6F22: 0x9322, - 0x6F23: 0x931A, - 0x6F24: 0x9323, - 0x6F25: 0x933A, - 0x6F26: 0x9335, - 0x6F27: 0x933B, - 0x6F28: 0x935C, - 0x6F29: 0x9360, - 0x6F2A: 0x937C, - 0x6F2B: 0x936E, - 0x6F2C: 0x9356, - 0x6F2D: 0x93B0, - 0x6F2E: 0x93AC, - 0x6F2F: 0x93AD, - 0x6F30: 0x9394, - 0x6F31: 0x93B9, - 0x6F32: 0x93D6, - 0x6F33: 0x93D7, - 0x6F34: 0x93E8, - 0x6F35: 0x93E5, - 0x6F36: 0x93D8, - 0x6F37: 0x93C3, - 0x6F38: 0x93DD, - 0x6F39: 0x93D0, - 0x6F3A: 0x93C8, - 0x6F3B: 0x93E4, - 0x6F3C: 0x941A, - 0x6F3D: 0x9414, - 0x6F3E: 0x9413, - 0x6F3F: 0x9403, - 0x6F40: 0x9407, - 0x6F41: 0x9410, - 0x6F42: 0x9436, - 0x6F43: 0x942B, - 0x6F44: 0x9435, - 0x6F45: 0x9421, - 0x6F46: 0x943A, - 0x6F47: 0x9441, - 0x6F48: 0x9452, - 0x6F49: 0x9444, - 0x6F4A: 0x945B, - 0x6F4B: 0x9460, - 0x6F4C: 0x9462, - 0x6F4D: 0x945E, - 0x6F4E: 0x946A, - 0x6F4F: 0x9229, - 0x6F50: 0x9470, - 0x6F51: 0x9475, - 0x6F52: 0x9477, - 0x6F53: 0x947D, - 0x6F54: 0x945A, - 0x6F55: 0x947C, - 0x6F56: 0x947E, - 0x6F57: 0x9481, - 0x6F58: 0x947F, - 0x6F59: 0x9582, - 0x6F5A: 0x9587, - 0x6F5B: 0x958A, - 0x6F5C: 0x9594, - 0x6F5D: 0x9596, - 0x6F5E: 0x9598, - 0x6F5F: 0x9599, - 0x6F60: 0x95A0, - 0x6F61: 0x95A8, - 0x6F62: 0x95A7, - 0x6F63: 0x95AD, - 0x6F64: 0x95BC, - 0x6F65: 0x95BB, - 0x6F66: 0x95B9, - 0x6F67: 0x95BE, - 0x6F68: 0x95CA, - 0x6F69: 0x6FF6, - 0x6F6A: 0x95C3, - 0x6F6B: 0x95CD, - 0x6F6C: 0x95CC, - 0x6F6D: 0x95D5, - 0x6F6E: 0x95D4, - 0x6F6F: 0x95D6, - 0x6F70: 0x95DC, - 0x6F71: 0x95E1, - 0x6F72: 0x95E5, - 0x6F73: 0x95E2, - 0x6F74: 0x9621, - 0x6F75: 0x9628, - 0x6F76: 0x962E, - 0x6F77: 0x962F, - 0x6F78: 0x9642, - 0x6F79: 0x964C, - 0x6F7A: 0x964F, - 0x6F7B: 0x964B, - 0x6F7C: 0x9677, - 0x6F7D: 0x965C, - 0x6F7E: 0x965E, - 0x7021: 0x965D, - 0x7022: 0x965F, - 0x7023: 0x9666, - 0x7024: 0x9672, - 0x7025: 0x966C, - 0x7026: 0x968D, - 0x7027: 0x9698, - 0x7028: 0x9695, - 0x7029: 0x9697, - 0x702A: 0x96AA, - 0x702B: 0x96A7, - 0x702C: 0x96B1, - 0x702D: 0x96B2, - 0x702E: 0x96B0, - 0x702F: 0x96B4, - 0x7030: 0x96B6, - 0x7031: 0x96B8, - 0x7032: 0x96B9, - 0x7033: 0x96CE, - 0x7034: 0x96CB, - 0x7035: 0x96C9, - 0x7036: 0x96CD, - 0x7037: 0x894D, - 0x7038: 0x96DC, - 0x7039: 0x970D, - 0x703A: 0x96D5, - 0x703B: 0x96F9, - 0x703C: 0x9704, - 0x703D: 0x9706, - 0x703E: 0x9708, - 0x703F: 0x9713, - 0x7040: 0x970E, - 0x7041: 0x9711, - 0x7042: 0x970F, - 0x7043: 0x9716, - 0x7044: 0x9719, - 0x7045: 0x9724, - 0x7046: 0x972A, - 0x7047: 0x9730, - 0x7048: 0x9739, - 0x7049: 0x973D, - 0x704A: 0x973E, - 0x704B: 0x9744, - 0x704C: 0x9746, - 0x704D: 0x9748, - 0x704E: 0x9742, - 0x704F: 0x9749, - 0x7050: 0x975C, - 0x7051: 0x9760, - 0x7052: 0x9764, - 0x7053: 0x9766, - 0x7054: 0x9768, - 0x7055: 0x52D2, - 0x7056: 0x976B, - 0x7057: 0x9771, - 0x7058: 0x9779, - 0x7059: 0x9785, - 0x705A: 0x977C, - 0x705B: 0x9781, - 0x705C: 0x977A, - 0x705D: 0x9786, - 0x705E: 0x978B, - 0x705F: 0x978F, - 0x7060: 0x9790, - 0x7061: 0x979C, - 0x7062: 0x97A8, - 0x7063: 0x97A6, - 0x7064: 0x97A3, - 0x7065: 0x97B3, - 0x7066: 0x97B4, - 0x7067: 0x97C3, - 0x7068: 0x97C6, - 0x7069: 0x97C8, - 0x706A: 0x97CB, - 0x706B: 0x97DC, - 0x706C: 0x97ED, - 0x706D: 0x9F4F, - 0x706E: 0x97F2, - 0x706F: 0x7ADF, - 0x7070: 0x97F6, - 0x7071: 0x97F5, - 0x7072: 0x980F, - 0x7073: 0x980C, - 0x7074: 0x9838, - 0x7075: 0x9824, - 0x7076: 0x9821, - 0x7077: 0x9837, - 0x7078: 0x983D, - 0x7079: 0x9846, - 0x707A: 0x984F, - 0x707B: 0x984B, - 0x707C: 0x986B, - 0x707D: 0x986F, - 0x707E: 0x9870, - 0x7121: 0x9871, - 0x7122: 0x9874, - 0x7123: 0x9873, - 0x7124: 0x98AA, - 0x7125: 0x98AF, - 0x7126: 0x98B1, - 0x7127: 0x98B6, - 0x7128: 0x98C4, - 0x7129: 0x98C3, - 0x712A: 0x98C6, - 0x712B: 0x98E9, - 0x712C: 0x98EB, - 0x712D: 0x9903, - 0x712E: 0x9909, - 0x712F: 0x9912, - 0x7130: 0x9914, - 0x7131: 0x9918, - 0x7132: 0x9921, - 0x7133: 0x991D, - 0x7134: 0x991E, - 0x7135: 0x9924, - 0x7136: 0x9920, - 0x7137: 0x992C, - 0x7138: 0x992E, - 0x7139: 0x993D, - 0x713A: 0x993E, - 0x713B: 0x9942, - 0x713C: 0x9949, - 0x713D: 0x9945, - 0x713E: 0x9950, - 0x713F: 0x994B, - 0x7140: 0x9951, - 0x7141: 0x9952, - 0x7142: 0x994C, - 0x7143: 0x9955, - 0x7144: 0x9997, - 0x7145: 0x9998, - 0x7146: 0x99A5, - 0x7147: 0x99AD, - 0x7148: 0x99AE, - 0x7149: 0x99BC, - 0x714A: 0x99DF, - 0x714B: 0x99DB, - 0x714C: 0x99DD, - 0x714D: 0x99D8, - 0x714E: 0x99D1, - 0x714F: 0x99ED, - 0x7150: 0x99EE, - 0x7151: 0x99F1, - 0x7152: 0x99F2, - 0x7153: 0x99FB, - 0x7154: 0x99F8, - 0x7155: 0x9A01, - 0x7156: 0x9A0F, - 0x7157: 0x9A05, - 0x7158: 0x99E2, - 0x7159: 0x9A19, - 0x715A: 0x9A2B, - 0x715B: 0x9A37, - 0x715C: 0x9A45, - 0x715D: 0x9A42, - 0x715E: 0x9A40, - 0x715F: 0x9A43, - 0x7160: 0x9A3E, - 0x7161: 0x9A55, - 0x7162: 0x9A4D, - 0x7163: 0x9A5B, - 0x7164: 0x9A57, - 0x7165: 0x9A5F, - 0x7166: 0x9A62, - 0x7167: 0x9A65, - 0x7168: 0x9A64, - 0x7169: 0x9A69, - 0x716A: 0x9A6B, - 0x716B: 0x9A6A, - 0x716C: 0x9AAD, - 0x716D: 0x9AB0, - 0x716E: 0x9ABC, - 0x716F: 0x9AC0, - 0x7170: 0x9ACF, - 0x7171: 0x9AD1, - 0x7172: 0x9AD3, - 0x7173: 0x9AD4, - 0x7174: 0x9ADE, - 0x7175: 0x9ADF, - 0x7176: 0x9AE2, - 0x7177: 0x9AE3, - 0x7178: 0x9AE6, - 0x7179: 0x9AEF, - 0x717A: 0x9AEB, - 0x717B: 0x9AEE, - 0x717C: 0x9AF4, - 0x717D: 0x9AF1, - 0x717E: 0x9AF7, - 0x7221: 0x9AFB, - 0x7222: 0x9B06, - 0x7223: 0x9B18, - 0x7224: 0x9B1A, - 0x7225: 0x9B1F, - 0x7226: 0x9B22, - 0x7227: 0x9B23, - 0x7228: 0x9B25, - 0x7229: 0x9B27, - 0x722A: 0x9B28, - 0x722B: 0x9B29, - 0x722C: 0x9B2A, - 0x722D: 0x9B2E, - 0x722E: 0x9B2F, - 0x722F: 0x9B32, - 0x7230: 0x9B44, - 0x7231: 0x9B43, - 0x7232: 0x9B4F, - 0x7233: 0x9B4D, - 0x7234: 0x9B4E, - 0x7235: 0x9B51, - 0x7236: 0x9B58, - 0x7237: 0x9B74, - 0x7238: 0x9B93, - 0x7239: 0x9B83, - 0x723A: 0x9B91, - 0x723B: 0x9B96, - 0x723C: 0x9B97, - 0x723D: 0x9B9F, - 0x723E: 0x9BA0, - 0x723F: 0x9BA8, - 0x7240: 0x9BB4, - 0x7241: 0x9BC0, - 0x7242: 0x9BCA, - 0x7243: 0x9BB9, - 0x7244: 0x9BC6, - 0x7245: 0x9BCF, - 0x7246: 0x9BD1, - 0x7247: 0x9BD2, - 0x7248: 0x9BE3, - 0x7249: 0x9BE2, - 0x724A: 0x9BE4, - 0x724B: 0x9BD4, - 0x724C: 0x9BE1, - 0x724D: 0x9C3A, - 0x724E: 0x9BF2, - 0x724F: 0x9BF1, - 0x7250: 0x9BF0, - 0x7251: 0x9C15, - 0x7252: 0x9C14, - 0x7253: 0x9C09, - 0x7254: 0x9C13, - 0x7255: 0x9C0C, - 0x7256: 0x9C06, - 0x7257: 0x9C08, - 0x7258: 0x9C12, - 0x7259: 0x9C0A, - 0x725A: 0x9C04, - 0x725B: 0x9C2E, - 0x725C: 0x9C1B, - 0x725D: 0x9C25, - 0x725E: 0x9C24, - 0x725F: 0x9C21, - 0x7260: 0x9C30, - 0x7261: 0x9C47, - 0x7262: 0x9C32, - 0x7263: 0x9C46, - 0x7264: 0x9C3E, - 0x7265: 0x9C5A, - 0x7266: 0x9C60, - 0x7267: 0x9C67, - 0x7268: 0x9C76, - 0x7269: 0x9C78, - 0x726A: 0x9CE7, - 0x726B: 0x9CEC, - 0x726C: 0x9CF0, - 0x726D: 0x9D09, - 0x726E: 0x9D08, - 0x726F: 0x9CEB, - 0x7270: 0x9D03, - 0x7271: 0x9D06, - 0x7272: 0x9D2A, - 0x7273: 0x9D26, - 0x7274: 0x9DAF, - 0x7275: 0x9D23, - 0x7276: 0x9D1F, - 0x7277: 0x9D44, - 0x7278: 0x9D15, - 0x7279: 0x9D12, - 0x727A: 0x9D41, - 0x727B: 0x9D3F, - 0x727C: 0x9D3E, - 0x727D: 0x9D46, - 0x727E: 0x9D48, - 0x7321: 0x9D5D, - 0x7322: 0x9D5E, - 0x7323: 0x9D64, - 0x7324: 0x9D51, - 0x7325: 0x9D50, - 0x7326: 0x9D59, - 0x7327: 0x9D72, - 0x7328: 0x9D89, - 0x7329: 0x9D87, - 0x732A: 0x9DAB, - 0x732B: 0x9D6F, - 0x732C: 0x9D7A, - 0x732D: 0x9D9A, - 0x732E: 0x9DA4, - 0x732F: 0x9DA9, - 0x7330: 0x9DB2, - 0x7331: 0x9DC4, - 0x7332: 0x9DC1, - 0x7333: 0x9DBB, - 0x7334: 0x9DB8, - 0x7335: 0x9DBA, - 0x7336: 0x9DC6, - 0x7337: 0x9DCF, - 0x7338: 0x9DC2, - 0x7339: 0x9DD9, - 0x733A: 0x9DD3, - 0x733B: 0x9DF8, - 0x733C: 0x9DE6, - 0x733D: 0x9DED, - 0x733E: 0x9DEF, - 0x733F: 0x9DFD, - 0x7340: 0x9E1A, - 0x7341: 0x9E1B, - 0x7342: 0x9E1E, - 0x7343: 0x9E75, - 0x7344: 0x9E79, - 0x7345: 0x9E7D, - 0x7346: 0x9E81, - 0x7347: 0x9E88, - 0x7348: 0x9E8B, - 0x7349: 0x9E8C, - 0x734A: 0x9E92, - 0x734B: 0x9E95, - 0x734C: 0x9E91, - 0x734D: 0x9E9D, - 0x734E: 0x9EA5, - 0x734F: 0x9EA9, - 0x7350: 0x9EB8, - 0x7351: 0x9EAA, - 0x7352: 0x9EAD, - 0x7353: 0x9761, - 0x7354: 0x9ECC, - 0x7355: 0x9ECE, - 0x7356: 0x9ECF, - 0x7357: 0x9ED0, - 0x7358: 0x9ED4, - 0x7359: 0x9EDC, - 0x735A: 0x9EDE, - 0x735B: 0x9EDD, - 0x735C: 0x9EE0, - 0x735D: 0x9EE5, - 0x735E: 0x9EE8, - 0x735F: 0x9EEF, - 0x7360: 0x9EF4, - 0x7361: 0x9EF6, - 0x7362: 0x9EF7, - 0x7363: 0x9EF9, - 0x7364: 0x9EFB, - 0x7365: 0x9EFC, - 0x7366: 0x9EFD, - 0x7367: 0x9F07, - 0x7368: 0x9F08, - 0x7369: 0x76B7, - 0x736A: 0x9F15, - 0x736B: 0x9F21, - 0x736C: 0x9F2C, - 0x736D: 0x9F3E, - 0x736E: 0x9F4A, - 0x736F: 0x9F52, - 0x7370: 0x9F54, - 0x7371: 0x9F63, - 0x7372: 0x9F5F, - 0x7373: 0x9F60, - 0x7374: 0x9F61, - 0x7375: 0x9F66, - 0x7376: 0x9F67, - 0x7377: 0x9F6C, - 0x7378: 0x9F6A, - 0x7379: 0x9F77, - 0x737A: 0x9F72, - 0x737B: 0x9F76, - 0x737C: 0x9F95, - 0x737D: 0x9F9C, - 0x737E: 0x9FA0, - 0x7421: 0x582F, - 0x7422: 0x69C7, - 0x7423: 0x9059, - 0x7424: 0x7464, - 0x7425: 0x51DC, - 0x7426: 0x7199, -} diff --git a/vendor/github.com/axgle/mahonia/jis0212-data.go b/vendor/github.com/axgle/mahonia/jis0212-data.go deleted file mode 100644 index 8970186..0000000 --- a/vendor/github.com/axgle/mahonia/jis0212-data.go +++ /dev/null @@ -1,6071 +0,0 @@ -package mahonia - -var jis0212ToUnicode = [65536]uint16{ - 0x222F: 0x02D8, // BREVE - 0x2230: 0x02C7, // CARON (Mandarin Chinese third tone) - 0x2231: 0x00B8, // CEDILLA - 0x2232: 0x02D9, // DOT ABOVE (Mandarin Chinese light tone) - 0x2233: 0x02DD, // DOUBLE ACUTE ACCENT - 0x2234: 0x00AF, // MACRON - 0x2235: 0x02DB, // OGONEK - 0x2236: 0x02DA, // RING ABOVE - 0x2237: 0x007E, // TILDE - 0x2238: 0x0384, // GREEK TONOS - 0x2239: 0x0385, // GREEK DIALYTIKA TONOS - 0x2242: 0x00A1, // INVERTED EXCLAMATION MARK - 0x2243: 0x00A6, // BROKEN BAR - 0x2244: 0x00BF, // INVERTED QUESTION MARK - 0x226B: 0x00BA, // MASCULINE ORDINAL INDICATOR - 0x226C: 0x00AA, // FEMININE ORDINAL INDICATOR - 0x226D: 0x00A9, // COPYRIGHT SIGN - 0x226E: 0x00AE, // REGISTERED SIGN - 0x226F: 0x2122, // TRADE MARK SIGN - 0x2270: 0x00A4, // CURRENCY SIGN - 0x2271: 0x2116, // NUMERO SIGN - 0x2661: 0x0386, // GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x2662: 0x0388, // GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x2663: 0x0389, // GREEK CAPITAL LETTER ETA WITH TONOS - 0x2664: 0x038A, // GREEK CAPITAL LETTER IOTA WITH TONOS - 0x2665: 0x03AA, // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x2667: 0x038C, // GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x2669: 0x038E, // GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x266A: 0x03AB, // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x266C: 0x038F, // GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x2671: 0x03AC, // GREEK SMALL LETTER ALPHA WITH TONOS - 0x2672: 0x03AD, // GREEK SMALL LETTER EPSILON WITH TONOS - 0x2673: 0x03AE, // GREEK SMALL LETTER ETA WITH TONOS - 0x2674: 0x03AF, // GREEK SMALL LETTER IOTA WITH TONOS - 0x2675: 0x03CA, // GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x2676: 0x0390, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - 0x2677: 0x03CC, // GREEK SMALL LETTER OMICRON WITH TONOS - 0x2678: 0x03C2, // GREEK SMALL LETTER FINAL SIGMA - 0x2679: 0x03CD, // GREEK SMALL LETTER UPSILON WITH TONOS - 0x267A: 0x03CB, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x267B: 0x03B0, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - 0x267C: 0x03CE, // GREEK SMALL LETTER OMEGA WITH TONOS - 0x2742: 0x0402, // CYRILLIC CAPITAL LETTER DJE - 0x2743: 0x0403, // CYRILLIC CAPITAL LETTER GJE - 0x2744: 0x0404, // CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x2745: 0x0405, // CYRILLIC CAPITAL LETTER DZE - 0x2746: 0x0406, // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x2747: 0x0407, // CYRILLIC CAPITAL LETTER YI - 0x2748: 0x0408, // CYRILLIC CAPITAL LETTER JE - 0x2749: 0x0409, // CYRILLIC CAPITAL LETTER LJE - 0x274A: 0x040A, // CYRILLIC CAPITAL LETTER NJE - 0x274B: 0x040B, // CYRILLIC CAPITAL LETTER TSHE - 0x274C: 0x040C, // CYRILLIC CAPITAL LETTER KJE - 0x274D: 0x040E, // CYRILLIC CAPITAL LETTER SHORT U - 0x274E: 0x040F, // CYRILLIC CAPITAL LETTER DZHE - 0x2772: 0x0452, // CYRILLIC SMALL LETTER DJE - 0x2773: 0x0453, // CYRILLIC SMALL LETTER GJE - 0x2774: 0x0454, // CYRILLIC SMALL LETTER UKRAINIAN IE - 0x2775: 0x0455, // CYRILLIC SMALL LETTER DZE - 0x2776: 0x0456, // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x2777: 0x0457, // CYRILLIC SMALL LETTER YI - 0x2778: 0x0458, // CYRILLIC SMALL LETTER JE - 0x2779: 0x0459, // CYRILLIC SMALL LETTER LJE - 0x277A: 0x045A, // CYRILLIC SMALL LETTER NJE - 0x277B: 0x045B, // CYRILLIC SMALL LETTER TSHE - 0x277C: 0x045C, // CYRILLIC SMALL LETTER KJE - 0x277D: 0x045E, // CYRILLIC SMALL LETTER SHORT U - 0x277E: 0x045F, // CYRILLIC SMALL LETTER DZHE - 0x2921: 0x00C6, // LATIN CAPITAL LIGATURE AE - 0x2922: 0x0110, // LATIN CAPITAL LETTER D WITH STROKE - 0x2924: 0x0126, // LATIN CAPITAL LETTER H WITH STROKE - 0x2926: 0x0132, // LATIN CAPITAL LIGATURE IJ - 0x2928: 0x0141, // LATIN CAPITAL LETTER L WITH STROKE - 0x2929: 0x013F, // LATIN CAPITAL LETTER L WITH MIDDLE DOT - 0x292B: 0x014A, // LATIN CAPITAL LETTER ENG - 0x292C: 0x00D8, // LATIN CAPITAL LETTER O WITH STROKE - 0x292D: 0x0152, // LATIN CAPITAL LIGATURE OE - 0x292F: 0x0166, // LATIN CAPITAL LETTER T WITH STROKE - 0x2930: 0x00DE, // LATIN CAPITAL LETTER THORN - 0x2941: 0x00E6, // LATIN SMALL LIGATURE AE - 0x2942: 0x0111, // LATIN SMALL LETTER D WITH STROKE - 0x2943: 0x00F0, // LATIN SMALL LETTER ETH - 0x2944: 0x0127, // LATIN SMALL LETTER H WITH STROKE - 0x2945: 0x0131, // LATIN SMALL LETTER DOTLESS I - 0x2946: 0x0133, // LATIN SMALL LIGATURE IJ - 0x2947: 0x0138, // LATIN SMALL LETTER KRA - 0x2948: 0x0142, // LATIN SMALL LETTER L WITH STROKE - 0x2949: 0x0140, // LATIN SMALL LETTER L WITH MIDDLE DOT - 0x294A: 0x0149, // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE - 0x294B: 0x014B, // LATIN SMALL LETTER ENG - 0x294C: 0x00F8, // LATIN SMALL LETTER O WITH STROKE - 0x294D: 0x0153, // LATIN SMALL LIGATURE OE - 0x294E: 0x00DF, // LATIN SMALL LETTER SHARP S - 0x294F: 0x0167, // LATIN SMALL LETTER T WITH STROKE - 0x2950: 0x00FE, // LATIN SMALL LETTER THORN - 0x2A21: 0x00C1, // LATIN CAPITAL LETTER A WITH ACUTE - 0x2A22: 0x00C0, // LATIN CAPITAL LETTER A WITH GRAVE - 0x2A23: 0x00C4, // LATIN CAPITAL LETTER A WITH DIAERESIS - 0x2A24: 0x00C2, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x2A25: 0x0102, // LATIN CAPITAL LETTER A WITH BREVE - 0x2A26: 0x01CD, // LATIN CAPITAL LETTER A WITH CARON - 0x2A27: 0x0100, // LATIN CAPITAL LETTER A WITH MACRON - 0x2A28: 0x0104, // LATIN CAPITAL LETTER A WITH OGONEK - 0x2A29: 0x00C5, // LATIN CAPITAL LETTER A WITH RING ABOVE - 0x2A2A: 0x00C3, // LATIN CAPITAL LETTER A WITH TILDE - 0x2A2B: 0x0106, // LATIN CAPITAL LETTER C WITH ACUTE - 0x2A2C: 0x0108, // LATIN CAPITAL LETTER C WITH CIRCUMFLEX - 0x2A2D: 0x010C, // LATIN CAPITAL LETTER C WITH CARON - 0x2A2E: 0x00C7, // LATIN CAPITAL LETTER C WITH CEDILLA - 0x2A2F: 0x010A, // LATIN CAPITAL LETTER C WITH DOT ABOVE - 0x2A30: 0x010E, // LATIN CAPITAL LETTER D WITH CARON - 0x2A31: 0x00C9, // LATIN CAPITAL LETTER E WITH ACUTE - 0x2A32: 0x00C8, // LATIN CAPITAL LETTER E WITH GRAVE - 0x2A33: 0x00CB, // LATIN CAPITAL LETTER E WITH DIAERESIS - 0x2A34: 0x00CA, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x2A35: 0x011A, // LATIN CAPITAL LETTER E WITH CARON - 0x2A36: 0x0116, // LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x2A37: 0x0112, // LATIN CAPITAL LETTER E WITH MACRON - 0x2A38: 0x0118, // LATIN CAPITAL LETTER E WITH OGONEK - 0x2A3A: 0x011C, // LATIN CAPITAL LETTER G WITH CIRCUMFLEX - 0x2A3B: 0x011E, // LATIN CAPITAL LETTER G WITH BREVE - 0x2A3C: 0x0122, // LATIN CAPITAL LETTER G WITH CEDILLA - 0x2A3D: 0x0120, // LATIN CAPITAL LETTER G WITH DOT ABOVE - 0x2A3E: 0x0124, // LATIN CAPITAL LETTER H WITH CIRCUMFLEX - 0x2A3F: 0x00CD, // LATIN CAPITAL LETTER I WITH ACUTE - 0x2A40: 0x00CC, // LATIN CAPITAL LETTER I WITH GRAVE - 0x2A41: 0x00CF, // LATIN CAPITAL LETTER I WITH DIAERESIS - 0x2A42: 0x00CE, // LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x2A43: 0x01CF, // LATIN CAPITAL LETTER I WITH CARON - 0x2A44: 0x0130, // LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x2A45: 0x012A, // LATIN CAPITAL LETTER I WITH MACRON - 0x2A46: 0x012E, // LATIN CAPITAL LETTER I WITH OGONEK - 0x2A47: 0x0128, // LATIN CAPITAL LETTER I WITH TILDE - 0x2A48: 0x0134, // LATIN CAPITAL LETTER J WITH CIRCUMFLEX - 0x2A49: 0x0136, // LATIN CAPITAL LETTER K WITH CEDILLA - 0x2A4A: 0x0139, // LATIN CAPITAL LETTER L WITH ACUTE - 0x2A4B: 0x013D, // LATIN CAPITAL LETTER L WITH CARON - 0x2A4C: 0x013B, // LATIN CAPITAL LETTER L WITH CEDILLA - 0x2A4D: 0x0143, // LATIN CAPITAL LETTER N WITH ACUTE - 0x2A4E: 0x0147, // LATIN CAPITAL LETTER N WITH CARON - 0x2A4F: 0x0145, // LATIN CAPITAL LETTER N WITH CEDILLA - 0x2A50: 0x00D1, // LATIN CAPITAL LETTER N WITH TILDE - 0x2A51: 0x00D3, // LATIN CAPITAL LETTER O WITH ACUTE - 0x2A52: 0x00D2, // LATIN CAPITAL LETTER O WITH GRAVE - 0x2A53: 0x00D6, // LATIN CAPITAL LETTER O WITH DIAERESIS - 0x2A54: 0x00D4, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x2A55: 0x01D1, // LATIN CAPITAL LETTER O WITH CARON - 0x2A56: 0x0150, // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 0x2A57: 0x014C, // LATIN CAPITAL LETTER O WITH MACRON - 0x2A58: 0x00D5, // LATIN CAPITAL LETTER O WITH TILDE - 0x2A59: 0x0154, // LATIN CAPITAL LETTER R WITH ACUTE - 0x2A5A: 0x0158, // LATIN CAPITAL LETTER R WITH CARON - 0x2A5B: 0x0156, // LATIN CAPITAL LETTER R WITH CEDILLA - 0x2A5C: 0x015A, // LATIN CAPITAL LETTER S WITH ACUTE - 0x2A5D: 0x015C, // LATIN CAPITAL LETTER S WITH CIRCUMFLEX - 0x2A5E: 0x0160, // LATIN CAPITAL LETTER S WITH CARON - 0x2A5F: 0x015E, // LATIN CAPITAL LETTER S WITH CEDILLA - 0x2A60: 0x0164, // LATIN CAPITAL LETTER T WITH CARON - 0x2A61: 0x0162, // LATIN CAPITAL LETTER T WITH CEDILLA - 0x2A62: 0x00DA, // LATIN CAPITAL LETTER U WITH ACUTE - 0x2A63: 0x00D9, // LATIN CAPITAL LETTER U WITH GRAVE - 0x2A64: 0x00DC, // LATIN CAPITAL LETTER U WITH DIAERESIS - 0x2A65: 0x00DB, // LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x2A66: 0x016C, // LATIN CAPITAL LETTER U WITH BREVE - 0x2A67: 0x01D3, // LATIN CAPITAL LETTER U WITH CARON - 0x2A68: 0x0170, // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 0x2A69: 0x016A, // LATIN CAPITAL LETTER U WITH MACRON - 0x2A6A: 0x0172, // LATIN CAPITAL LETTER U WITH OGONEK - 0x2A6B: 0x016E, // LATIN CAPITAL LETTER U WITH RING ABOVE - 0x2A6C: 0x0168, // LATIN CAPITAL LETTER U WITH TILDE - 0x2A6D: 0x01D7, // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE - 0x2A6E: 0x01DB, // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE - 0x2A6F: 0x01D9, // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON - 0x2A70: 0x01D5, // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - 0x2A71: 0x0174, // LATIN CAPITAL LETTER W WITH CIRCUMFLEX - 0x2A72: 0x00DD, // LATIN CAPITAL LETTER Y WITH ACUTE - 0x2A73: 0x0178, // LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x2A74: 0x0176, // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - 0x2A75: 0x0179, // LATIN CAPITAL LETTER Z WITH ACUTE - 0x2A76: 0x017D, // LATIN CAPITAL LETTER Z WITH CARON - 0x2A77: 0x017B, // LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x2B21: 0x00E1, // LATIN SMALL LETTER A WITH ACUTE - 0x2B22: 0x00E0, // LATIN SMALL LETTER A WITH GRAVE - 0x2B23: 0x00E4, // LATIN SMALL LETTER A WITH DIAERESIS - 0x2B24: 0x00E2, // LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x2B25: 0x0103, // LATIN SMALL LETTER A WITH BREVE - 0x2B26: 0x01CE, // LATIN SMALL LETTER A WITH CARON - 0x2B27: 0x0101, // LATIN SMALL LETTER A WITH MACRON - 0x2B28: 0x0105, // LATIN SMALL LETTER A WITH OGONEK - 0x2B29: 0x00E5, // LATIN SMALL LETTER A WITH RING ABOVE - 0x2B2A: 0x00E3, // LATIN SMALL LETTER A WITH TILDE - 0x2B2B: 0x0107, // LATIN SMALL LETTER C WITH ACUTE - 0x2B2C: 0x0109, // LATIN SMALL LETTER C WITH CIRCUMFLEX - 0x2B2D: 0x010D, // LATIN SMALL LETTER C WITH CARON - 0x2B2E: 0x00E7, // LATIN SMALL LETTER C WITH CEDILLA - 0x2B2F: 0x010B, // LATIN SMALL LETTER C WITH DOT ABOVE - 0x2B30: 0x010F, // LATIN SMALL LETTER D WITH CARON - 0x2B31: 0x00E9, // LATIN SMALL LETTER E WITH ACUTE - 0x2B32: 0x00E8, // LATIN SMALL LETTER E WITH GRAVE - 0x2B33: 0x00EB, // LATIN SMALL LETTER E WITH DIAERESIS - 0x2B34: 0x00EA, // LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x2B35: 0x011B, // LATIN SMALL LETTER E WITH CARON - 0x2B36: 0x0117, // LATIN SMALL LETTER E WITH DOT ABOVE - 0x2B37: 0x0113, // LATIN SMALL LETTER E WITH MACRON - 0x2B38: 0x0119, // LATIN SMALL LETTER E WITH OGONEK - 0x2B39: 0x01F5, // LATIN SMALL LETTER G WITH ACUTE - 0x2B3A: 0x011D, // LATIN SMALL LETTER G WITH CIRCUMFLEX - 0x2B3B: 0x011F, // LATIN SMALL LETTER G WITH BREVE - 0x2B3D: 0x0121, // LATIN SMALL LETTER G WITH DOT ABOVE - 0x2B3E: 0x0125, // LATIN SMALL LETTER H WITH CIRCUMFLEX - 0x2B3F: 0x00ED, // LATIN SMALL LETTER I WITH ACUTE - 0x2B40: 0x00EC, // LATIN SMALL LETTER I WITH GRAVE - 0x2B41: 0x00EF, // LATIN SMALL LETTER I WITH DIAERESIS - 0x2B42: 0x00EE, // LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x2B43: 0x01D0, // LATIN SMALL LETTER I WITH CARON - 0x2B45: 0x012B, // LATIN SMALL LETTER I WITH MACRON - 0x2B46: 0x012F, // LATIN SMALL LETTER I WITH OGONEK - 0x2B47: 0x0129, // LATIN SMALL LETTER I WITH TILDE - 0x2B48: 0x0135, // LATIN SMALL LETTER J WITH CIRCUMFLEX - 0x2B49: 0x0137, // LATIN SMALL LETTER K WITH CEDILLA - 0x2B4A: 0x013A, // LATIN SMALL LETTER L WITH ACUTE - 0x2B4B: 0x013E, // LATIN SMALL LETTER L WITH CARON - 0x2B4C: 0x013C, // LATIN SMALL LETTER L WITH CEDILLA - 0x2B4D: 0x0144, // LATIN SMALL LETTER N WITH ACUTE - 0x2B4E: 0x0148, // LATIN SMALL LETTER N WITH CARON - 0x2B4F: 0x0146, // LATIN SMALL LETTER N WITH CEDILLA - 0x2B50: 0x00F1, // LATIN SMALL LETTER N WITH TILDE - 0x2B51: 0x00F3, // LATIN SMALL LETTER O WITH ACUTE - 0x2B52: 0x00F2, // LATIN SMALL LETTER O WITH GRAVE - 0x2B53: 0x00F6, // LATIN SMALL LETTER O WITH DIAERESIS - 0x2B54: 0x00F4, // LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x2B55: 0x01D2, // LATIN SMALL LETTER O WITH CARON - 0x2B56: 0x0151, // LATIN SMALL LETTER O WITH DOUBLE ACUTE - 0x2B57: 0x014D, // LATIN SMALL LETTER O WITH MACRON - 0x2B58: 0x00F5, // LATIN SMALL LETTER O WITH TILDE - 0x2B59: 0x0155, // LATIN SMALL LETTER R WITH ACUTE - 0x2B5A: 0x0159, // LATIN SMALL LETTER R WITH CARON - 0x2B5B: 0x0157, // LATIN SMALL LETTER R WITH CEDILLA - 0x2B5C: 0x015B, // LATIN SMALL LETTER S WITH ACUTE - 0x2B5D: 0x015D, // LATIN SMALL LETTER S WITH CIRCUMFLEX - 0x2B5E: 0x0161, // LATIN SMALL LETTER S WITH CARON - 0x2B5F: 0x015F, // LATIN SMALL LETTER S WITH CEDILLA - 0x2B60: 0x0165, // LATIN SMALL LETTER T WITH CARON - 0x2B61: 0x0163, // LATIN SMALL LETTER T WITH CEDILLA - 0x2B62: 0x00FA, // LATIN SMALL LETTER U WITH ACUTE - 0x2B63: 0x00F9, // LATIN SMALL LETTER U WITH GRAVE - 0x2B64: 0x00FC, // LATIN SMALL LETTER U WITH DIAERESIS - 0x2B65: 0x00FB, // LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x2B66: 0x016D, // LATIN SMALL LETTER U WITH BREVE - 0x2B67: 0x01D4, // LATIN SMALL LETTER U WITH CARON - 0x2B68: 0x0171, // LATIN SMALL LETTER U WITH DOUBLE ACUTE - 0x2B69: 0x016B, // LATIN SMALL LETTER U WITH MACRON - 0x2B6A: 0x0173, // LATIN SMALL LETTER U WITH OGONEK - 0x2B6B: 0x016F, // LATIN SMALL LETTER U WITH RING ABOVE - 0x2B6C: 0x0169, // LATIN SMALL LETTER U WITH TILDE - 0x2B6D: 0x01D8, // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE - 0x2B6E: 0x01DC, // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE - 0x2B6F: 0x01DA, // LATIN SMALL LETTER U WITH DIAERESIS AND CARON - 0x2B70: 0x01D6, // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON - 0x2B71: 0x0175, // LATIN SMALL LETTER W WITH CIRCUMFLEX - 0x2B72: 0x00FD, // LATIN SMALL LETTER Y WITH ACUTE - 0x2B73: 0x00FF, // LATIN SMALL LETTER Y WITH DIAERESIS - 0x2B74: 0x0177, // LATIN SMALL LETTER Y WITH CIRCUMFLEX - 0x2B75: 0x017A, // LATIN SMALL LETTER Z WITH ACUTE - 0x2B76: 0x017E, // LATIN SMALL LETTER Z WITH CARON - 0x2B77: 0x017C, // LATIN SMALL LETTER Z WITH DOT ABOVE - 0x3021: 0x4E02, - 0x3022: 0x4E04, - 0x3023: 0x4E05, - 0x3024: 0x4E0C, - 0x3025: 0x4E12, - 0x3026: 0x4E1F, - 0x3027: 0x4E23, - 0x3028: 0x4E24, - 0x3029: 0x4E28, - 0x302A: 0x4E2B, - 0x302B: 0x4E2E, - 0x302C: 0x4E2F, - 0x302D: 0x4E30, - 0x302E: 0x4E35, - 0x302F: 0x4E40, - 0x3030: 0x4E41, - 0x3031: 0x4E44, - 0x3032: 0x4E47, - 0x3033: 0x4E51, - 0x3034: 0x4E5A, - 0x3035: 0x4E5C, - 0x3036: 0x4E63, - 0x3037: 0x4E68, - 0x3038: 0x4E69, - 0x3039: 0x4E74, - 0x303A: 0x4E75, - 0x303B: 0x4E79, - 0x303C: 0x4E7F, - 0x303D: 0x4E8D, - 0x303E: 0x4E96, - 0x303F: 0x4E97, - 0x3040: 0x4E9D, - 0x3041: 0x4EAF, - 0x3042: 0x4EB9, - 0x3043: 0x4EC3, - 0x3044: 0x4ED0, - 0x3045: 0x4EDA, - 0x3046: 0x4EDB, - 0x3047: 0x4EE0, - 0x3048: 0x4EE1, - 0x3049: 0x4EE2, - 0x304A: 0x4EE8, - 0x304B: 0x4EEF, - 0x304C: 0x4EF1, - 0x304D: 0x4EF3, - 0x304E: 0x4EF5, - 0x304F: 0x4EFD, - 0x3050: 0x4EFE, - 0x3051: 0x4EFF, - 0x3052: 0x4F00, - 0x3053: 0x4F02, - 0x3054: 0x4F03, - 0x3055: 0x4F08, - 0x3056: 0x4F0B, - 0x3057: 0x4F0C, - 0x3058: 0x4F12, - 0x3059: 0x4F15, - 0x305A: 0x4F16, - 0x305B: 0x4F17, - 0x305C: 0x4F19, - 0x305D: 0x4F2E, - 0x305E: 0x4F31, - 0x305F: 0x4F60, - 0x3060: 0x4F33, - 0x3061: 0x4F35, - 0x3062: 0x4F37, - 0x3063: 0x4F39, - 0x3064: 0x4F3B, - 0x3065: 0x4F3E, - 0x3066: 0x4F40, - 0x3067: 0x4F42, - 0x3068: 0x4F48, - 0x3069: 0x4F49, - 0x306A: 0x4F4B, - 0x306B: 0x4F4C, - 0x306C: 0x4F52, - 0x306D: 0x4F54, - 0x306E: 0x4F56, - 0x306F: 0x4F58, - 0x3070: 0x4F5F, - 0x3071: 0x4F63, - 0x3072: 0x4F6A, - 0x3073: 0x4F6C, - 0x3074: 0x4F6E, - 0x3075: 0x4F71, - 0x3076: 0x4F77, - 0x3077: 0x4F78, - 0x3078: 0x4F79, - 0x3079: 0x4F7A, - 0x307A: 0x4F7D, - 0x307B: 0x4F7E, - 0x307C: 0x4F81, - 0x307D: 0x4F82, - 0x307E: 0x4F84, - 0x3121: 0x4F85, - 0x3122: 0x4F89, - 0x3123: 0x4F8A, - 0x3124: 0x4F8C, - 0x3125: 0x4F8E, - 0x3126: 0x4F90, - 0x3127: 0x4F92, - 0x3128: 0x4F93, - 0x3129: 0x4F94, - 0x312A: 0x4F97, - 0x312B: 0x4F99, - 0x312C: 0x4F9A, - 0x312D: 0x4F9E, - 0x312E: 0x4F9F, - 0x312F: 0x4FB2, - 0x3130: 0x4FB7, - 0x3131: 0x4FB9, - 0x3132: 0x4FBB, - 0x3133: 0x4FBC, - 0x3134: 0x4FBD, - 0x3135: 0x4FBE, - 0x3136: 0x4FC0, - 0x3137: 0x4FC1, - 0x3138: 0x4FC5, - 0x3139: 0x4FC6, - 0x313A: 0x4FC8, - 0x313B: 0x4FC9, - 0x313C: 0x4FCB, - 0x313D: 0x4FCC, - 0x313E: 0x4FCD, - 0x313F: 0x4FCF, - 0x3140: 0x4FD2, - 0x3141: 0x4FDC, - 0x3142: 0x4FE0, - 0x3143: 0x4FE2, - 0x3144: 0x4FF0, - 0x3145: 0x4FF2, - 0x3146: 0x4FFC, - 0x3147: 0x4FFD, - 0x3148: 0x4FFF, - 0x3149: 0x5000, - 0x314A: 0x5001, - 0x314B: 0x5004, - 0x314C: 0x5007, - 0x314D: 0x500A, - 0x314E: 0x500C, - 0x314F: 0x500E, - 0x3150: 0x5010, - 0x3151: 0x5013, - 0x3152: 0x5017, - 0x3153: 0x5018, - 0x3154: 0x501B, - 0x3155: 0x501C, - 0x3156: 0x501D, - 0x3157: 0x501E, - 0x3158: 0x5022, - 0x3159: 0x5027, - 0x315A: 0x502E, - 0x315B: 0x5030, - 0x315C: 0x5032, - 0x315D: 0x5033, - 0x315E: 0x5035, - 0x315F: 0x5040, - 0x3160: 0x5041, - 0x3161: 0x5042, - 0x3162: 0x5045, - 0x3163: 0x5046, - 0x3164: 0x504A, - 0x3165: 0x504C, - 0x3166: 0x504E, - 0x3167: 0x5051, - 0x3168: 0x5052, - 0x3169: 0x5053, - 0x316A: 0x5057, - 0x316B: 0x5059, - 0x316C: 0x505F, - 0x316D: 0x5060, - 0x316E: 0x5062, - 0x316F: 0x5063, - 0x3170: 0x5066, - 0x3171: 0x5067, - 0x3172: 0x506A, - 0x3173: 0x506D, - 0x3174: 0x5070, - 0x3175: 0x5071, - 0x3176: 0x503B, - 0x3177: 0x5081, - 0x3178: 0x5083, - 0x3179: 0x5084, - 0x317A: 0x5086, - 0x317B: 0x508A, - 0x317C: 0x508E, - 0x317D: 0x508F, - 0x317E: 0x5090, - 0x3221: 0x5092, - 0x3222: 0x5093, - 0x3223: 0x5094, - 0x3224: 0x5096, - 0x3225: 0x509B, - 0x3226: 0x509C, - 0x3227: 0x509E, - 0x3228: 0x509F, - 0x3229: 0x50A0, - 0x322A: 0x50A1, - 0x322B: 0x50A2, - 0x322C: 0x50AA, - 0x322D: 0x50AF, - 0x322E: 0x50B0, - 0x322F: 0x50B9, - 0x3230: 0x50BA, - 0x3231: 0x50BD, - 0x3232: 0x50C0, - 0x3233: 0x50C3, - 0x3234: 0x50C4, - 0x3235: 0x50C7, - 0x3236: 0x50CC, - 0x3237: 0x50CE, - 0x3238: 0x50D0, - 0x3239: 0x50D3, - 0x323A: 0x50D4, - 0x323B: 0x50D8, - 0x323C: 0x50DC, - 0x323D: 0x50DD, - 0x323E: 0x50DF, - 0x323F: 0x50E2, - 0x3240: 0x50E4, - 0x3241: 0x50E6, - 0x3242: 0x50E8, - 0x3243: 0x50E9, - 0x3244: 0x50EF, - 0x3245: 0x50F1, - 0x3246: 0x50F6, - 0x3247: 0x50FA, - 0x3248: 0x50FE, - 0x3249: 0x5103, - 0x324A: 0x5106, - 0x324B: 0x5107, - 0x324C: 0x5108, - 0x324D: 0x510B, - 0x324E: 0x510C, - 0x324F: 0x510D, - 0x3250: 0x510E, - 0x3251: 0x50F2, - 0x3252: 0x5110, - 0x3253: 0x5117, - 0x3254: 0x5119, - 0x3255: 0x511B, - 0x3256: 0x511C, - 0x3257: 0x511D, - 0x3258: 0x511E, - 0x3259: 0x5123, - 0x325A: 0x5127, - 0x325B: 0x5128, - 0x325C: 0x512C, - 0x325D: 0x512D, - 0x325E: 0x512F, - 0x325F: 0x5131, - 0x3260: 0x5133, - 0x3261: 0x5134, - 0x3262: 0x5135, - 0x3263: 0x5138, - 0x3264: 0x5139, - 0x3265: 0x5142, - 0x3266: 0x514A, - 0x3267: 0x514F, - 0x3268: 0x5153, - 0x3269: 0x5155, - 0x326A: 0x5157, - 0x326B: 0x5158, - 0x326C: 0x515F, - 0x326D: 0x5164, - 0x326E: 0x5166, - 0x326F: 0x517E, - 0x3270: 0x5183, - 0x3271: 0x5184, - 0x3272: 0x518B, - 0x3273: 0x518E, - 0x3274: 0x5198, - 0x3275: 0x519D, - 0x3276: 0x51A1, - 0x3277: 0x51A3, - 0x3278: 0x51AD, - 0x3279: 0x51B8, - 0x327A: 0x51BA, - 0x327B: 0x51BC, - 0x327C: 0x51BE, - 0x327D: 0x51BF, - 0x327E: 0x51C2, - 0x3321: 0x51C8, - 0x3322: 0x51CF, - 0x3323: 0x51D1, - 0x3324: 0x51D2, - 0x3325: 0x51D3, - 0x3326: 0x51D5, - 0x3327: 0x51D8, - 0x3328: 0x51DE, - 0x3329: 0x51E2, - 0x332A: 0x51E5, - 0x332B: 0x51EE, - 0x332C: 0x51F2, - 0x332D: 0x51F3, - 0x332E: 0x51F4, - 0x332F: 0x51F7, - 0x3330: 0x5201, - 0x3331: 0x5202, - 0x3332: 0x5205, - 0x3333: 0x5212, - 0x3334: 0x5213, - 0x3335: 0x5215, - 0x3336: 0x5216, - 0x3337: 0x5218, - 0x3338: 0x5222, - 0x3339: 0x5228, - 0x333A: 0x5231, - 0x333B: 0x5232, - 0x333C: 0x5235, - 0x333D: 0x523C, - 0x333E: 0x5245, - 0x333F: 0x5249, - 0x3340: 0x5255, - 0x3341: 0x5257, - 0x3342: 0x5258, - 0x3343: 0x525A, - 0x3344: 0x525C, - 0x3345: 0x525F, - 0x3346: 0x5260, - 0x3347: 0x5261, - 0x3348: 0x5266, - 0x3349: 0x526E, - 0x334A: 0x5277, - 0x334B: 0x5278, - 0x334C: 0x5279, - 0x334D: 0x5280, - 0x334E: 0x5282, - 0x334F: 0x5285, - 0x3350: 0x528A, - 0x3351: 0x528C, - 0x3352: 0x5293, - 0x3353: 0x5295, - 0x3354: 0x5296, - 0x3355: 0x5297, - 0x3356: 0x5298, - 0x3357: 0x529A, - 0x3358: 0x529C, - 0x3359: 0x52A4, - 0x335A: 0x52A5, - 0x335B: 0x52A6, - 0x335C: 0x52A7, - 0x335D: 0x52AF, - 0x335E: 0x52B0, - 0x335F: 0x52B6, - 0x3360: 0x52B7, - 0x3361: 0x52B8, - 0x3362: 0x52BA, - 0x3363: 0x52BB, - 0x3364: 0x52BD, - 0x3365: 0x52C0, - 0x3366: 0x52C4, - 0x3367: 0x52C6, - 0x3368: 0x52C8, - 0x3369: 0x52CC, - 0x336A: 0x52CF, - 0x336B: 0x52D1, - 0x336C: 0x52D4, - 0x336D: 0x52D6, - 0x336E: 0x52DB, - 0x336F: 0x52DC, - 0x3370: 0x52E1, - 0x3371: 0x52E5, - 0x3372: 0x52E8, - 0x3373: 0x52E9, - 0x3374: 0x52EA, - 0x3375: 0x52EC, - 0x3376: 0x52F0, - 0x3377: 0x52F1, - 0x3378: 0x52F4, - 0x3379: 0x52F6, - 0x337A: 0x52F7, - 0x337B: 0x5300, - 0x337C: 0x5303, - 0x337D: 0x530A, - 0x337E: 0x530B, - 0x3421: 0x530C, - 0x3422: 0x5311, - 0x3423: 0x5313, - 0x3424: 0x5318, - 0x3425: 0x531B, - 0x3426: 0x531C, - 0x3427: 0x531E, - 0x3428: 0x531F, - 0x3429: 0x5325, - 0x342A: 0x5327, - 0x342B: 0x5328, - 0x342C: 0x5329, - 0x342D: 0x532B, - 0x342E: 0x532C, - 0x342F: 0x532D, - 0x3430: 0x5330, - 0x3431: 0x5332, - 0x3432: 0x5335, - 0x3433: 0x533C, - 0x3434: 0x533D, - 0x3435: 0x533E, - 0x3436: 0x5342, - 0x3437: 0x534C, - 0x3438: 0x534B, - 0x3439: 0x5359, - 0x343A: 0x535B, - 0x343B: 0x5361, - 0x343C: 0x5363, - 0x343D: 0x5365, - 0x343E: 0x536C, - 0x343F: 0x536D, - 0x3440: 0x5372, - 0x3441: 0x5379, - 0x3442: 0x537E, - 0x3443: 0x5383, - 0x3444: 0x5387, - 0x3445: 0x5388, - 0x3446: 0x538E, - 0x3447: 0x5393, - 0x3448: 0x5394, - 0x3449: 0x5399, - 0x344A: 0x539D, - 0x344B: 0x53A1, - 0x344C: 0x53A4, - 0x344D: 0x53AA, - 0x344E: 0x53AB, - 0x344F: 0x53AF, - 0x3450: 0x53B2, - 0x3451: 0x53B4, - 0x3452: 0x53B5, - 0x3453: 0x53B7, - 0x3454: 0x53B8, - 0x3455: 0x53BA, - 0x3456: 0x53BD, - 0x3457: 0x53C0, - 0x3458: 0x53C5, - 0x3459: 0x53CF, - 0x345A: 0x53D2, - 0x345B: 0x53D3, - 0x345C: 0x53D5, - 0x345D: 0x53DA, - 0x345E: 0x53DD, - 0x345F: 0x53DE, - 0x3460: 0x53E0, - 0x3461: 0x53E6, - 0x3462: 0x53E7, - 0x3463: 0x53F5, - 0x3464: 0x5402, - 0x3465: 0x5413, - 0x3466: 0x541A, - 0x3467: 0x5421, - 0x3468: 0x5427, - 0x3469: 0x5428, - 0x346A: 0x542A, - 0x346B: 0x542F, - 0x346C: 0x5431, - 0x346D: 0x5434, - 0x346E: 0x5435, - 0x346F: 0x5443, - 0x3470: 0x5444, - 0x3471: 0x5447, - 0x3472: 0x544D, - 0x3473: 0x544F, - 0x3474: 0x545E, - 0x3475: 0x5462, - 0x3476: 0x5464, - 0x3477: 0x5466, - 0x3478: 0x5467, - 0x3479: 0x5469, - 0x347A: 0x546B, - 0x347B: 0x546D, - 0x347C: 0x546E, - 0x347D: 0x5474, - 0x347E: 0x547F, - 0x3521: 0x5481, - 0x3522: 0x5483, - 0x3523: 0x5485, - 0x3524: 0x5488, - 0x3525: 0x5489, - 0x3526: 0x548D, - 0x3527: 0x5491, - 0x3528: 0x5495, - 0x3529: 0x5496, - 0x352A: 0x549C, - 0x352B: 0x549F, - 0x352C: 0x54A1, - 0x352D: 0x54A6, - 0x352E: 0x54A7, - 0x352F: 0x54A9, - 0x3530: 0x54AA, - 0x3531: 0x54AD, - 0x3532: 0x54AE, - 0x3533: 0x54B1, - 0x3534: 0x54B7, - 0x3535: 0x54B9, - 0x3536: 0x54BA, - 0x3537: 0x54BB, - 0x3538: 0x54BF, - 0x3539: 0x54C6, - 0x353A: 0x54CA, - 0x353B: 0x54CD, - 0x353C: 0x54CE, - 0x353D: 0x54E0, - 0x353E: 0x54EA, - 0x353F: 0x54EC, - 0x3540: 0x54EF, - 0x3541: 0x54F6, - 0x3542: 0x54FC, - 0x3543: 0x54FE, - 0x3544: 0x54FF, - 0x3545: 0x5500, - 0x3546: 0x5501, - 0x3547: 0x5505, - 0x3548: 0x5508, - 0x3549: 0x5509, - 0x354A: 0x550C, - 0x354B: 0x550D, - 0x354C: 0x550E, - 0x354D: 0x5515, - 0x354E: 0x552A, - 0x354F: 0x552B, - 0x3550: 0x5532, - 0x3551: 0x5535, - 0x3552: 0x5536, - 0x3553: 0x553B, - 0x3554: 0x553C, - 0x3555: 0x553D, - 0x3556: 0x5541, - 0x3557: 0x5547, - 0x3558: 0x5549, - 0x3559: 0x554A, - 0x355A: 0x554D, - 0x355B: 0x5550, - 0x355C: 0x5551, - 0x355D: 0x5558, - 0x355E: 0x555A, - 0x355F: 0x555B, - 0x3560: 0x555E, - 0x3561: 0x5560, - 0x3562: 0x5561, - 0x3563: 0x5564, - 0x3564: 0x5566, - 0x3565: 0x557F, - 0x3566: 0x5581, - 0x3567: 0x5582, - 0x3568: 0x5586, - 0x3569: 0x5588, - 0x356A: 0x558E, - 0x356B: 0x558F, - 0x356C: 0x5591, - 0x356D: 0x5592, - 0x356E: 0x5593, - 0x356F: 0x5594, - 0x3570: 0x5597, - 0x3571: 0x55A3, - 0x3572: 0x55A4, - 0x3573: 0x55AD, - 0x3574: 0x55B2, - 0x3575: 0x55BF, - 0x3576: 0x55C1, - 0x3577: 0x55C3, - 0x3578: 0x55C6, - 0x3579: 0x55C9, - 0x357A: 0x55CB, - 0x357B: 0x55CC, - 0x357C: 0x55CE, - 0x357D: 0x55D1, - 0x357E: 0x55D2, - 0x3621: 0x55D3, - 0x3622: 0x55D7, - 0x3623: 0x55D8, - 0x3624: 0x55DB, - 0x3625: 0x55DE, - 0x3626: 0x55E2, - 0x3627: 0x55E9, - 0x3628: 0x55F6, - 0x3629: 0x55FF, - 0x362A: 0x5605, - 0x362B: 0x5608, - 0x362C: 0x560A, - 0x362D: 0x560D, - 0x362E: 0x560E, - 0x362F: 0x560F, - 0x3630: 0x5610, - 0x3631: 0x5611, - 0x3632: 0x5612, - 0x3633: 0x5619, - 0x3634: 0x562C, - 0x3635: 0x5630, - 0x3636: 0x5633, - 0x3637: 0x5635, - 0x3638: 0x5637, - 0x3639: 0x5639, - 0x363A: 0x563B, - 0x363B: 0x563C, - 0x363C: 0x563D, - 0x363D: 0x563F, - 0x363E: 0x5640, - 0x363F: 0x5641, - 0x3640: 0x5643, - 0x3641: 0x5644, - 0x3642: 0x5646, - 0x3643: 0x5649, - 0x3644: 0x564B, - 0x3645: 0x564D, - 0x3646: 0x564F, - 0x3647: 0x5654, - 0x3648: 0x565E, - 0x3649: 0x5660, - 0x364A: 0x5661, - 0x364B: 0x5662, - 0x364C: 0x5663, - 0x364D: 0x5666, - 0x364E: 0x5669, - 0x364F: 0x566D, - 0x3650: 0x566F, - 0x3651: 0x5671, - 0x3652: 0x5672, - 0x3653: 0x5675, - 0x3654: 0x5684, - 0x3655: 0x5685, - 0x3656: 0x5688, - 0x3657: 0x568B, - 0x3658: 0x568C, - 0x3659: 0x5695, - 0x365A: 0x5699, - 0x365B: 0x569A, - 0x365C: 0x569D, - 0x365D: 0x569E, - 0x365E: 0x569F, - 0x365F: 0x56A6, - 0x3660: 0x56A7, - 0x3661: 0x56A8, - 0x3662: 0x56A9, - 0x3663: 0x56AB, - 0x3664: 0x56AC, - 0x3665: 0x56AD, - 0x3666: 0x56B1, - 0x3667: 0x56B3, - 0x3668: 0x56B7, - 0x3669: 0x56BE, - 0x366A: 0x56C5, - 0x366B: 0x56C9, - 0x366C: 0x56CA, - 0x366D: 0x56CB, - 0x366E: 0x56CF, - 0x366F: 0x56D0, - 0x3670: 0x56CC, - 0x3671: 0x56CD, - 0x3672: 0x56D9, - 0x3673: 0x56DC, - 0x3674: 0x56DD, - 0x3675: 0x56DF, - 0x3676: 0x56E1, - 0x3677: 0x56E4, - 0x3678: 0x56E5, - 0x3679: 0x56E6, - 0x367A: 0x56E7, - 0x367B: 0x56E8, - 0x367C: 0x56F1, - 0x367D: 0x56EB, - 0x367E: 0x56ED, - 0x3721: 0x56F6, - 0x3722: 0x56F7, - 0x3723: 0x5701, - 0x3724: 0x5702, - 0x3725: 0x5707, - 0x3726: 0x570A, - 0x3727: 0x570C, - 0x3728: 0x5711, - 0x3729: 0x5715, - 0x372A: 0x571A, - 0x372B: 0x571B, - 0x372C: 0x571D, - 0x372D: 0x5720, - 0x372E: 0x5722, - 0x372F: 0x5723, - 0x3730: 0x5724, - 0x3731: 0x5725, - 0x3732: 0x5729, - 0x3733: 0x572A, - 0x3734: 0x572C, - 0x3735: 0x572E, - 0x3736: 0x572F, - 0x3737: 0x5733, - 0x3738: 0x5734, - 0x3739: 0x573D, - 0x373A: 0x573E, - 0x373B: 0x573F, - 0x373C: 0x5745, - 0x373D: 0x5746, - 0x373E: 0x574C, - 0x373F: 0x574D, - 0x3740: 0x5752, - 0x3741: 0x5762, - 0x3742: 0x5765, - 0x3743: 0x5767, - 0x3744: 0x5768, - 0x3745: 0x576B, - 0x3746: 0x576D, - 0x3747: 0x576E, - 0x3748: 0x576F, - 0x3749: 0x5770, - 0x374A: 0x5771, - 0x374B: 0x5773, - 0x374C: 0x5774, - 0x374D: 0x5775, - 0x374E: 0x5777, - 0x374F: 0x5779, - 0x3750: 0x577A, - 0x3751: 0x577B, - 0x3752: 0x577C, - 0x3753: 0x577E, - 0x3754: 0x5781, - 0x3755: 0x5783, - 0x3756: 0x578C, - 0x3757: 0x5794, - 0x3758: 0x5797, - 0x3759: 0x5799, - 0x375A: 0x579A, - 0x375B: 0x579C, - 0x375C: 0x579D, - 0x375D: 0x579E, - 0x375E: 0x579F, - 0x375F: 0x57A1, - 0x3760: 0x5795, - 0x3761: 0x57A7, - 0x3762: 0x57A8, - 0x3763: 0x57A9, - 0x3764: 0x57AC, - 0x3765: 0x57B8, - 0x3766: 0x57BD, - 0x3767: 0x57C7, - 0x3768: 0x57C8, - 0x3769: 0x57CC, - 0x376A: 0x57CF, - 0x376B: 0x57D5, - 0x376C: 0x57DD, - 0x376D: 0x57DE, - 0x376E: 0x57E4, - 0x376F: 0x57E6, - 0x3770: 0x57E7, - 0x3771: 0x57E9, - 0x3772: 0x57ED, - 0x3773: 0x57F0, - 0x3774: 0x57F5, - 0x3775: 0x57F6, - 0x3776: 0x57F8, - 0x3777: 0x57FD, - 0x3778: 0x57FE, - 0x3779: 0x57FF, - 0x377A: 0x5803, - 0x377B: 0x5804, - 0x377C: 0x5808, - 0x377D: 0x5809, - 0x377E: 0x57E1, - 0x3821: 0x580C, - 0x3822: 0x580D, - 0x3823: 0x581B, - 0x3824: 0x581E, - 0x3825: 0x581F, - 0x3826: 0x5820, - 0x3827: 0x5826, - 0x3828: 0x5827, - 0x3829: 0x582D, - 0x382A: 0x5832, - 0x382B: 0x5839, - 0x382C: 0x583F, - 0x382D: 0x5849, - 0x382E: 0x584C, - 0x382F: 0x584D, - 0x3830: 0x584F, - 0x3831: 0x5850, - 0x3832: 0x5855, - 0x3833: 0x585F, - 0x3834: 0x5861, - 0x3835: 0x5864, - 0x3836: 0x5867, - 0x3837: 0x5868, - 0x3838: 0x5878, - 0x3839: 0x587C, - 0x383A: 0x587F, - 0x383B: 0x5880, - 0x383C: 0x5881, - 0x383D: 0x5887, - 0x383E: 0x5888, - 0x383F: 0x5889, - 0x3840: 0x588A, - 0x3841: 0x588C, - 0x3842: 0x588D, - 0x3843: 0x588F, - 0x3844: 0x5890, - 0x3845: 0x5894, - 0x3846: 0x5896, - 0x3847: 0x589D, - 0x3848: 0x58A0, - 0x3849: 0x58A1, - 0x384A: 0x58A2, - 0x384B: 0x58A6, - 0x384C: 0x58A9, - 0x384D: 0x58B1, - 0x384E: 0x58B2, - 0x384F: 0x58C4, - 0x3850: 0x58BC, - 0x3851: 0x58C2, - 0x3852: 0x58C8, - 0x3853: 0x58CD, - 0x3854: 0x58CE, - 0x3855: 0x58D0, - 0x3856: 0x58D2, - 0x3857: 0x58D4, - 0x3858: 0x58D6, - 0x3859: 0x58DA, - 0x385A: 0x58DD, - 0x385B: 0x58E1, - 0x385C: 0x58E2, - 0x385D: 0x58E9, - 0x385E: 0x58F3, - 0x385F: 0x5905, - 0x3860: 0x5906, - 0x3861: 0x590B, - 0x3862: 0x590C, - 0x3863: 0x5912, - 0x3864: 0x5913, - 0x3865: 0x5914, - 0x3866: 0x8641, - 0x3867: 0x591D, - 0x3868: 0x5921, - 0x3869: 0x5923, - 0x386A: 0x5924, - 0x386B: 0x5928, - 0x386C: 0x592F, - 0x386D: 0x5930, - 0x386E: 0x5933, - 0x386F: 0x5935, - 0x3870: 0x5936, - 0x3871: 0x593F, - 0x3872: 0x5943, - 0x3873: 0x5946, - 0x3874: 0x5952, - 0x3875: 0x5953, - 0x3876: 0x5959, - 0x3877: 0x595B, - 0x3878: 0x595D, - 0x3879: 0x595E, - 0x387A: 0x595F, - 0x387B: 0x5961, - 0x387C: 0x5963, - 0x387D: 0x596B, - 0x387E: 0x596D, - 0x3921: 0x596F, - 0x3922: 0x5972, - 0x3923: 0x5975, - 0x3924: 0x5976, - 0x3925: 0x5979, - 0x3926: 0x597B, - 0x3927: 0x597C, - 0x3928: 0x598B, - 0x3929: 0x598C, - 0x392A: 0x598E, - 0x392B: 0x5992, - 0x392C: 0x5995, - 0x392D: 0x5997, - 0x392E: 0x599F, - 0x392F: 0x59A4, - 0x3930: 0x59A7, - 0x3931: 0x59AD, - 0x3932: 0x59AE, - 0x3933: 0x59AF, - 0x3934: 0x59B0, - 0x3935: 0x59B3, - 0x3936: 0x59B7, - 0x3937: 0x59BA, - 0x3938: 0x59BC, - 0x3939: 0x59C1, - 0x393A: 0x59C3, - 0x393B: 0x59C4, - 0x393C: 0x59C8, - 0x393D: 0x59CA, - 0x393E: 0x59CD, - 0x393F: 0x59D2, - 0x3940: 0x59DD, - 0x3941: 0x59DE, - 0x3942: 0x59DF, - 0x3943: 0x59E3, - 0x3944: 0x59E4, - 0x3945: 0x59E7, - 0x3946: 0x59EE, - 0x3947: 0x59EF, - 0x3948: 0x59F1, - 0x3949: 0x59F2, - 0x394A: 0x59F4, - 0x394B: 0x59F7, - 0x394C: 0x5A00, - 0x394D: 0x5A04, - 0x394E: 0x5A0C, - 0x394F: 0x5A0D, - 0x3950: 0x5A0E, - 0x3951: 0x5A12, - 0x3952: 0x5A13, - 0x3953: 0x5A1E, - 0x3954: 0x5A23, - 0x3955: 0x5A24, - 0x3956: 0x5A27, - 0x3957: 0x5A28, - 0x3958: 0x5A2A, - 0x3959: 0x5A2D, - 0x395A: 0x5A30, - 0x395B: 0x5A44, - 0x395C: 0x5A45, - 0x395D: 0x5A47, - 0x395E: 0x5A48, - 0x395F: 0x5A4C, - 0x3960: 0x5A50, - 0x3961: 0x5A55, - 0x3962: 0x5A5E, - 0x3963: 0x5A63, - 0x3964: 0x5A65, - 0x3965: 0x5A67, - 0x3966: 0x5A6D, - 0x3967: 0x5A77, - 0x3968: 0x5A7A, - 0x3969: 0x5A7B, - 0x396A: 0x5A7E, - 0x396B: 0x5A8B, - 0x396C: 0x5A90, - 0x396D: 0x5A93, - 0x396E: 0x5A96, - 0x396F: 0x5A99, - 0x3970: 0x5A9C, - 0x3971: 0x5A9E, - 0x3972: 0x5A9F, - 0x3973: 0x5AA0, - 0x3974: 0x5AA2, - 0x3975: 0x5AA7, - 0x3976: 0x5AAC, - 0x3977: 0x5AB1, - 0x3978: 0x5AB2, - 0x3979: 0x5AB3, - 0x397A: 0x5AB5, - 0x397B: 0x5AB8, - 0x397C: 0x5ABA, - 0x397D: 0x5ABB, - 0x397E: 0x5ABF, - 0x3A21: 0x5AC4, - 0x3A22: 0x5AC6, - 0x3A23: 0x5AC8, - 0x3A24: 0x5ACF, - 0x3A25: 0x5ADA, - 0x3A26: 0x5ADC, - 0x3A27: 0x5AE0, - 0x3A28: 0x5AE5, - 0x3A29: 0x5AEA, - 0x3A2A: 0x5AEE, - 0x3A2B: 0x5AF5, - 0x3A2C: 0x5AF6, - 0x3A2D: 0x5AFD, - 0x3A2E: 0x5B00, - 0x3A2F: 0x5B01, - 0x3A30: 0x5B08, - 0x3A31: 0x5B17, - 0x3A32: 0x5B34, - 0x3A33: 0x5B19, - 0x3A34: 0x5B1B, - 0x3A35: 0x5B1D, - 0x3A36: 0x5B21, - 0x3A37: 0x5B25, - 0x3A38: 0x5B2D, - 0x3A39: 0x5B38, - 0x3A3A: 0x5B41, - 0x3A3B: 0x5B4B, - 0x3A3C: 0x5B4C, - 0x3A3D: 0x5B52, - 0x3A3E: 0x5B56, - 0x3A3F: 0x5B5E, - 0x3A40: 0x5B68, - 0x3A41: 0x5B6E, - 0x3A42: 0x5B6F, - 0x3A43: 0x5B7C, - 0x3A44: 0x5B7D, - 0x3A45: 0x5B7E, - 0x3A46: 0x5B7F, - 0x3A47: 0x5B81, - 0x3A48: 0x5B84, - 0x3A49: 0x5B86, - 0x3A4A: 0x5B8A, - 0x3A4B: 0x5B8E, - 0x3A4C: 0x5B90, - 0x3A4D: 0x5B91, - 0x3A4E: 0x5B93, - 0x3A4F: 0x5B94, - 0x3A50: 0x5B96, - 0x3A51: 0x5BA8, - 0x3A52: 0x5BA9, - 0x3A53: 0x5BAC, - 0x3A54: 0x5BAD, - 0x3A55: 0x5BAF, - 0x3A56: 0x5BB1, - 0x3A57: 0x5BB2, - 0x3A58: 0x5BB7, - 0x3A59: 0x5BBA, - 0x3A5A: 0x5BBC, - 0x3A5B: 0x5BC0, - 0x3A5C: 0x5BC1, - 0x3A5D: 0x5BCD, - 0x3A5E: 0x5BCF, - 0x3A5F: 0x5BD6, - 0x3A60: 0x5BD7, - 0x3A61: 0x5BD8, - 0x3A62: 0x5BD9, - 0x3A63: 0x5BDA, - 0x3A64: 0x5BE0, - 0x3A65: 0x5BEF, - 0x3A66: 0x5BF1, - 0x3A67: 0x5BF4, - 0x3A68: 0x5BFD, - 0x3A69: 0x5C0C, - 0x3A6A: 0x5C17, - 0x3A6B: 0x5C1E, - 0x3A6C: 0x5C1F, - 0x3A6D: 0x5C23, - 0x3A6E: 0x5C26, - 0x3A6F: 0x5C29, - 0x3A70: 0x5C2B, - 0x3A71: 0x5C2C, - 0x3A72: 0x5C2E, - 0x3A73: 0x5C30, - 0x3A74: 0x5C32, - 0x3A75: 0x5C35, - 0x3A76: 0x5C36, - 0x3A77: 0x5C59, - 0x3A78: 0x5C5A, - 0x3A79: 0x5C5C, - 0x3A7A: 0x5C62, - 0x3A7B: 0x5C63, - 0x3A7C: 0x5C67, - 0x3A7D: 0x5C68, - 0x3A7E: 0x5C69, - 0x3B21: 0x5C6D, - 0x3B22: 0x5C70, - 0x3B23: 0x5C74, - 0x3B24: 0x5C75, - 0x3B25: 0x5C7A, - 0x3B26: 0x5C7B, - 0x3B27: 0x5C7C, - 0x3B28: 0x5C7D, - 0x3B29: 0x5C87, - 0x3B2A: 0x5C88, - 0x3B2B: 0x5C8A, - 0x3B2C: 0x5C8F, - 0x3B2D: 0x5C92, - 0x3B2E: 0x5C9D, - 0x3B2F: 0x5C9F, - 0x3B30: 0x5CA0, - 0x3B31: 0x5CA2, - 0x3B32: 0x5CA3, - 0x3B33: 0x5CA6, - 0x3B34: 0x5CAA, - 0x3B35: 0x5CB2, - 0x3B36: 0x5CB4, - 0x3B37: 0x5CB5, - 0x3B38: 0x5CBA, - 0x3B39: 0x5CC9, - 0x3B3A: 0x5CCB, - 0x3B3B: 0x5CD2, - 0x3B3C: 0x5CDD, - 0x3B3D: 0x5CD7, - 0x3B3E: 0x5CEE, - 0x3B3F: 0x5CF1, - 0x3B40: 0x5CF2, - 0x3B41: 0x5CF4, - 0x3B42: 0x5D01, - 0x3B43: 0x5D06, - 0x3B44: 0x5D0D, - 0x3B45: 0x5D12, - 0x3B46: 0x5D2B, - 0x3B47: 0x5D23, - 0x3B48: 0x5D24, - 0x3B49: 0x5D26, - 0x3B4A: 0x5D27, - 0x3B4B: 0x5D31, - 0x3B4C: 0x5D34, - 0x3B4D: 0x5D39, - 0x3B4E: 0x5D3D, - 0x3B4F: 0x5D3F, - 0x3B50: 0x5D42, - 0x3B51: 0x5D43, - 0x3B52: 0x5D46, - 0x3B53: 0x5D48, - 0x3B54: 0x5D55, - 0x3B55: 0x5D51, - 0x3B56: 0x5D59, - 0x3B57: 0x5D4A, - 0x3B58: 0x5D5F, - 0x3B59: 0x5D60, - 0x3B5A: 0x5D61, - 0x3B5B: 0x5D62, - 0x3B5C: 0x5D64, - 0x3B5D: 0x5D6A, - 0x3B5E: 0x5D6D, - 0x3B5F: 0x5D70, - 0x3B60: 0x5D79, - 0x3B61: 0x5D7A, - 0x3B62: 0x5D7E, - 0x3B63: 0x5D7F, - 0x3B64: 0x5D81, - 0x3B65: 0x5D83, - 0x3B66: 0x5D88, - 0x3B67: 0x5D8A, - 0x3B68: 0x5D92, - 0x3B69: 0x5D93, - 0x3B6A: 0x5D94, - 0x3B6B: 0x5D95, - 0x3B6C: 0x5D99, - 0x3B6D: 0x5D9B, - 0x3B6E: 0x5D9F, - 0x3B6F: 0x5DA0, - 0x3B70: 0x5DA7, - 0x3B71: 0x5DAB, - 0x3B72: 0x5DB0, - 0x3B73: 0x5DB4, - 0x3B74: 0x5DB8, - 0x3B75: 0x5DB9, - 0x3B76: 0x5DC3, - 0x3B77: 0x5DC7, - 0x3B78: 0x5DCB, - 0x3B79: 0x5DD0, - 0x3B7A: 0x5DCE, - 0x3B7B: 0x5DD8, - 0x3B7C: 0x5DD9, - 0x3B7D: 0x5DE0, - 0x3B7E: 0x5DE4, - 0x3C21: 0x5DE9, - 0x3C22: 0x5DF8, - 0x3C23: 0x5DF9, - 0x3C24: 0x5E00, - 0x3C25: 0x5E07, - 0x3C26: 0x5E0D, - 0x3C27: 0x5E12, - 0x3C28: 0x5E14, - 0x3C29: 0x5E15, - 0x3C2A: 0x5E18, - 0x3C2B: 0x5E1F, - 0x3C2C: 0x5E20, - 0x3C2D: 0x5E2E, - 0x3C2E: 0x5E28, - 0x3C2F: 0x5E32, - 0x3C30: 0x5E35, - 0x3C31: 0x5E3E, - 0x3C32: 0x5E4B, - 0x3C33: 0x5E50, - 0x3C34: 0x5E49, - 0x3C35: 0x5E51, - 0x3C36: 0x5E56, - 0x3C37: 0x5E58, - 0x3C38: 0x5E5B, - 0x3C39: 0x5E5C, - 0x3C3A: 0x5E5E, - 0x3C3B: 0x5E68, - 0x3C3C: 0x5E6A, - 0x3C3D: 0x5E6B, - 0x3C3E: 0x5E6C, - 0x3C3F: 0x5E6D, - 0x3C40: 0x5E6E, - 0x3C41: 0x5E70, - 0x3C42: 0x5E80, - 0x3C43: 0x5E8B, - 0x3C44: 0x5E8E, - 0x3C45: 0x5EA2, - 0x3C46: 0x5EA4, - 0x3C47: 0x5EA5, - 0x3C48: 0x5EA8, - 0x3C49: 0x5EAA, - 0x3C4A: 0x5EAC, - 0x3C4B: 0x5EB1, - 0x3C4C: 0x5EB3, - 0x3C4D: 0x5EBD, - 0x3C4E: 0x5EBE, - 0x3C4F: 0x5EBF, - 0x3C50: 0x5EC6, - 0x3C51: 0x5ECC, - 0x3C52: 0x5ECB, - 0x3C53: 0x5ECE, - 0x3C54: 0x5ED1, - 0x3C55: 0x5ED2, - 0x3C56: 0x5ED4, - 0x3C57: 0x5ED5, - 0x3C58: 0x5EDC, - 0x3C59: 0x5EDE, - 0x3C5A: 0x5EE5, - 0x3C5B: 0x5EEB, - 0x3C5C: 0x5F02, - 0x3C5D: 0x5F06, - 0x3C5E: 0x5F07, - 0x3C5F: 0x5F08, - 0x3C60: 0x5F0E, - 0x3C61: 0x5F19, - 0x3C62: 0x5F1C, - 0x3C63: 0x5F1D, - 0x3C64: 0x5F21, - 0x3C65: 0x5F22, - 0x3C66: 0x5F23, - 0x3C67: 0x5F24, - 0x3C68: 0x5F28, - 0x3C69: 0x5F2B, - 0x3C6A: 0x5F2C, - 0x3C6B: 0x5F2E, - 0x3C6C: 0x5F30, - 0x3C6D: 0x5F34, - 0x3C6E: 0x5F36, - 0x3C6F: 0x5F3B, - 0x3C70: 0x5F3D, - 0x3C71: 0x5F3F, - 0x3C72: 0x5F40, - 0x3C73: 0x5F44, - 0x3C74: 0x5F45, - 0x3C75: 0x5F47, - 0x3C76: 0x5F4D, - 0x3C77: 0x5F50, - 0x3C78: 0x5F54, - 0x3C79: 0x5F58, - 0x3C7A: 0x5F5B, - 0x3C7B: 0x5F60, - 0x3C7C: 0x5F63, - 0x3C7D: 0x5F64, - 0x3C7E: 0x5F67, - 0x3D21: 0x5F6F, - 0x3D22: 0x5F72, - 0x3D23: 0x5F74, - 0x3D24: 0x5F75, - 0x3D25: 0x5F78, - 0x3D26: 0x5F7A, - 0x3D27: 0x5F7D, - 0x3D28: 0x5F7E, - 0x3D29: 0x5F89, - 0x3D2A: 0x5F8D, - 0x3D2B: 0x5F8F, - 0x3D2C: 0x5F96, - 0x3D2D: 0x5F9C, - 0x3D2E: 0x5F9D, - 0x3D2F: 0x5FA2, - 0x3D30: 0x5FA7, - 0x3D31: 0x5FAB, - 0x3D32: 0x5FA4, - 0x3D33: 0x5FAC, - 0x3D34: 0x5FAF, - 0x3D35: 0x5FB0, - 0x3D36: 0x5FB1, - 0x3D37: 0x5FB8, - 0x3D38: 0x5FC4, - 0x3D39: 0x5FC7, - 0x3D3A: 0x5FC8, - 0x3D3B: 0x5FC9, - 0x3D3C: 0x5FCB, - 0x3D3D: 0x5FD0, - 0x3D3E: 0x5FD1, - 0x3D3F: 0x5FD2, - 0x3D40: 0x5FD3, - 0x3D41: 0x5FD4, - 0x3D42: 0x5FDE, - 0x3D43: 0x5FE1, - 0x3D44: 0x5FE2, - 0x3D45: 0x5FE8, - 0x3D46: 0x5FE9, - 0x3D47: 0x5FEA, - 0x3D48: 0x5FEC, - 0x3D49: 0x5FED, - 0x3D4A: 0x5FEE, - 0x3D4B: 0x5FEF, - 0x3D4C: 0x5FF2, - 0x3D4D: 0x5FF3, - 0x3D4E: 0x5FF6, - 0x3D4F: 0x5FFA, - 0x3D50: 0x5FFC, - 0x3D51: 0x6007, - 0x3D52: 0x600A, - 0x3D53: 0x600D, - 0x3D54: 0x6013, - 0x3D55: 0x6014, - 0x3D56: 0x6017, - 0x3D57: 0x6018, - 0x3D58: 0x601A, - 0x3D59: 0x601F, - 0x3D5A: 0x6024, - 0x3D5B: 0x602D, - 0x3D5C: 0x6033, - 0x3D5D: 0x6035, - 0x3D5E: 0x6040, - 0x3D5F: 0x6047, - 0x3D60: 0x6048, - 0x3D61: 0x6049, - 0x3D62: 0x604C, - 0x3D63: 0x6051, - 0x3D64: 0x6054, - 0x3D65: 0x6056, - 0x3D66: 0x6057, - 0x3D67: 0x605D, - 0x3D68: 0x6061, - 0x3D69: 0x6067, - 0x3D6A: 0x6071, - 0x3D6B: 0x607E, - 0x3D6C: 0x607F, - 0x3D6D: 0x6082, - 0x3D6E: 0x6086, - 0x3D6F: 0x6088, - 0x3D70: 0x608A, - 0x3D71: 0x608E, - 0x3D72: 0x6091, - 0x3D73: 0x6093, - 0x3D74: 0x6095, - 0x3D75: 0x6098, - 0x3D76: 0x609D, - 0x3D77: 0x609E, - 0x3D78: 0x60A2, - 0x3D79: 0x60A4, - 0x3D7A: 0x60A5, - 0x3D7B: 0x60A8, - 0x3D7C: 0x60B0, - 0x3D7D: 0x60B1, - 0x3D7E: 0x60B7, - 0x3E21: 0x60BB, - 0x3E22: 0x60BE, - 0x3E23: 0x60C2, - 0x3E24: 0x60C4, - 0x3E25: 0x60C8, - 0x3E26: 0x60C9, - 0x3E27: 0x60CA, - 0x3E28: 0x60CB, - 0x3E29: 0x60CE, - 0x3E2A: 0x60CF, - 0x3E2B: 0x60D4, - 0x3E2C: 0x60D5, - 0x3E2D: 0x60D9, - 0x3E2E: 0x60DB, - 0x3E2F: 0x60DD, - 0x3E30: 0x60DE, - 0x3E31: 0x60E2, - 0x3E32: 0x60E5, - 0x3E33: 0x60F2, - 0x3E34: 0x60F5, - 0x3E35: 0x60F8, - 0x3E36: 0x60FC, - 0x3E37: 0x60FD, - 0x3E38: 0x6102, - 0x3E39: 0x6107, - 0x3E3A: 0x610A, - 0x3E3B: 0x610C, - 0x3E3C: 0x6110, - 0x3E3D: 0x6111, - 0x3E3E: 0x6112, - 0x3E3F: 0x6113, - 0x3E40: 0x6114, - 0x3E41: 0x6116, - 0x3E42: 0x6117, - 0x3E43: 0x6119, - 0x3E44: 0x611C, - 0x3E45: 0x611E, - 0x3E46: 0x6122, - 0x3E47: 0x612A, - 0x3E48: 0x612B, - 0x3E49: 0x6130, - 0x3E4A: 0x6131, - 0x3E4B: 0x6135, - 0x3E4C: 0x6136, - 0x3E4D: 0x6137, - 0x3E4E: 0x6139, - 0x3E4F: 0x6141, - 0x3E50: 0x6145, - 0x3E51: 0x6146, - 0x3E52: 0x6149, - 0x3E53: 0x615E, - 0x3E54: 0x6160, - 0x3E55: 0x616C, - 0x3E56: 0x6172, - 0x3E57: 0x6178, - 0x3E58: 0x617B, - 0x3E59: 0x617C, - 0x3E5A: 0x617F, - 0x3E5B: 0x6180, - 0x3E5C: 0x6181, - 0x3E5D: 0x6183, - 0x3E5E: 0x6184, - 0x3E5F: 0x618B, - 0x3E60: 0x618D, - 0x3E61: 0x6192, - 0x3E62: 0x6193, - 0x3E63: 0x6197, - 0x3E64: 0x6198, - 0x3E65: 0x619C, - 0x3E66: 0x619D, - 0x3E67: 0x619F, - 0x3E68: 0x61A0, - 0x3E69: 0x61A5, - 0x3E6A: 0x61A8, - 0x3E6B: 0x61AA, - 0x3E6C: 0x61AD, - 0x3E6D: 0x61B8, - 0x3E6E: 0x61B9, - 0x3E6F: 0x61BC, - 0x3E70: 0x61C0, - 0x3E71: 0x61C1, - 0x3E72: 0x61C2, - 0x3E73: 0x61CE, - 0x3E74: 0x61CF, - 0x3E75: 0x61D5, - 0x3E76: 0x61DC, - 0x3E77: 0x61DD, - 0x3E78: 0x61DE, - 0x3E79: 0x61DF, - 0x3E7A: 0x61E1, - 0x3E7B: 0x61E2, - 0x3E7C: 0x61E7, - 0x3E7D: 0x61E9, - 0x3E7E: 0x61E5, - 0x3F21: 0x61EC, - 0x3F22: 0x61ED, - 0x3F23: 0x61EF, - 0x3F24: 0x6201, - 0x3F25: 0x6203, - 0x3F26: 0x6204, - 0x3F27: 0x6207, - 0x3F28: 0x6213, - 0x3F29: 0x6215, - 0x3F2A: 0x621C, - 0x3F2B: 0x6220, - 0x3F2C: 0x6222, - 0x3F2D: 0x6223, - 0x3F2E: 0x6227, - 0x3F2F: 0x6229, - 0x3F30: 0x622B, - 0x3F31: 0x6239, - 0x3F32: 0x623D, - 0x3F33: 0x6242, - 0x3F34: 0x6243, - 0x3F35: 0x6244, - 0x3F36: 0x6246, - 0x3F37: 0x624C, - 0x3F38: 0x6250, - 0x3F39: 0x6251, - 0x3F3A: 0x6252, - 0x3F3B: 0x6254, - 0x3F3C: 0x6256, - 0x3F3D: 0x625A, - 0x3F3E: 0x625C, - 0x3F3F: 0x6264, - 0x3F40: 0x626D, - 0x3F41: 0x626F, - 0x3F42: 0x6273, - 0x3F43: 0x627A, - 0x3F44: 0x627D, - 0x3F45: 0x628D, - 0x3F46: 0x628E, - 0x3F47: 0x628F, - 0x3F48: 0x6290, - 0x3F49: 0x62A6, - 0x3F4A: 0x62A8, - 0x3F4B: 0x62B3, - 0x3F4C: 0x62B6, - 0x3F4D: 0x62B7, - 0x3F4E: 0x62BA, - 0x3F4F: 0x62BE, - 0x3F50: 0x62BF, - 0x3F51: 0x62C4, - 0x3F52: 0x62CE, - 0x3F53: 0x62D5, - 0x3F54: 0x62D6, - 0x3F55: 0x62DA, - 0x3F56: 0x62EA, - 0x3F57: 0x62F2, - 0x3F58: 0x62F4, - 0x3F59: 0x62FC, - 0x3F5A: 0x62FD, - 0x3F5B: 0x6303, - 0x3F5C: 0x6304, - 0x3F5D: 0x630A, - 0x3F5E: 0x630B, - 0x3F5F: 0x630D, - 0x3F60: 0x6310, - 0x3F61: 0x6313, - 0x3F62: 0x6316, - 0x3F63: 0x6318, - 0x3F64: 0x6329, - 0x3F65: 0x632A, - 0x3F66: 0x632D, - 0x3F67: 0x6335, - 0x3F68: 0x6336, - 0x3F69: 0x6339, - 0x3F6A: 0x633C, - 0x3F6B: 0x6341, - 0x3F6C: 0x6342, - 0x3F6D: 0x6343, - 0x3F6E: 0x6344, - 0x3F6F: 0x6346, - 0x3F70: 0x634A, - 0x3F71: 0x634B, - 0x3F72: 0x634E, - 0x3F73: 0x6352, - 0x3F74: 0x6353, - 0x3F75: 0x6354, - 0x3F76: 0x6358, - 0x3F77: 0x635B, - 0x3F78: 0x6365, - 0x3F79: 0x6366, - 0x3F7A: 0x636C, - 0x3F7B: 0x636D, - 0x3F7C: 0x6371, - 0x3F7D: 0x6374, - 0x3F7E: 0x6375, - 0x4021: 0x6378, - 0x4022: 0x637C, - 0x4023: 0x637D, - 0x4024: 0x637F, - 0x4025: 0x6382, - 0x4026: 0x6384, - 0x4027: 0x6387, - 0x4028: 0x638A, - 0x4029: 0x6390, - 0x402A: 0x6394, - 0x402B: 0x6395, - 0x402C: 0x6399, - 0x402D: 0x639A, - 0x402E: 0x639E, - 0x402F: 0x63A4, - 0x4030: 0x63A6, - 0x4031: 0x63AD, - 0x4032: 0x63AE, - 0x4033: 0x63AF, - 0x4034: 0x63BD, - 0x4035: 0x63C1, - 0x4036: 0x63C5, - 0x4037: 0x63C8, - 0x4038: 0x63CE, - 0x4039: 0x63D1, - 0x403A: 0x63D3, - 0x403B: 0x63D4, - 0x403C: 0x63D5, - 0x403D: 0x63DC, - 0x403E: 0x63E0, - 0x403F: 0x63E5, - 0x4040: 0x63EA, - 0x4041: 0x63EC, - 0x4042: 0x63F2, - 0x4043: 0x63F3, - 0x4044: 0x63F5, - 0x4045: 0x63F8, - 0x4046: 0x63F9, - 0x4047: 0x6409, - 0x4048: 0x640A, - 0x4049: 0x6410, - 0x404A: 0x6412, - 0x404B: 0x6414, - 0x404C: 0x6418, - 0x404D: 0x641E, - 0x404E: 0x6420, - 0x404F: 0x6422, - 0x4050: 0x6424, - 0x4051: 0x6425, - 0x4052: 0x6429, - 0x4053: 0x642A, - 0x4054: 0x642F, - 0x4055: 0x6430, - 0x4056: 0x6435, - 0x4057: 0x643D, - 0x4058: 0x643F, - 0x4059: 0x644B, - 0x405A: 0x644F, - 0x405B: 0x6451, - 0x405C: 0x6452, - 0x405D: 0x6453, - 0x405E: 0x6454, - 0x405F: 0x645A, - 0x4060: 0x645B, - 0x4061: 0x645C, - 0x4062: 0x645D, - 0x4063: 0x645F, - 0x4064: 0x6460, - 0x4065: 0x6461, - 0x4066: 0x6463, - 0x4067: 0x646D, - 0x4068: 0x6473, - 0x4069: 0x6474, - 0x406A: 0x647B, - 0x406B: 0x647D, - 0x406C: 0x6485, - 0x406D: 0x6487, - 0x406E: 0x648F, - 0x406F: 0x6490, - 0x4070: 0x6491, - 0x4071: 0x6498, - 0x4072: 0x6499, - 0x4073: 0x649B, - 0x4074: 0x649D, - 0x4075: 0x649F, - 0x4076: 0x64A1, - 0x4077: 0x64A3, - 0x4078: 0x64A6, - 0x4079: 0x64A8, - 0x407A: 0x64AC, - 0x407B: 0x64B3, - 0x407C: 0x64BD, - 0x407D: 0x64BE, - 0x407E: 0x64BF, - 0x4121: 0x64C4, - 0x4122: 0x64C9, - 0x4123: 0x64CA, - 0x4124: 0x64CB, - 0x4125: 0x64CC, - 0x4126: 0x64CE, - 0x4127: 0x64D0, - 0x4128: 0x64D1, - 0x4129: 0x64D5, - 0x412A: 0x64D7, - 0x412B: 0x64E4, - 0x412C: 0x64E5, - 0x412D: 0x64E9, - 0x412E: 0x64EA, - 0x412F: 0x64ED, - 0x4130: 0x64F0, - 0x4131: 0x64F5, - 0x4132: 0x64F7, - 0x4133: 0x64FB, - 0x4134: 0x64FF, - 0x4135: 0x6501, - 0x4136: 0x6504, - 0x4137: 0x6508, - 0x4138: 0x6509, - 0x4139: 0x650A, - 0x413A: 0x650F, - 0x413B: 0x6513, - 0x413C: 0x6514, - 0x413D: 0x6516, - 0x413E: 0x6519, - 0x413F: 0x651B, - 0x4140: 0x651E, - 0x4141: 0x651F, - 0x4142: 0x6522, - 0x4143: 0x6526, - 0x4144: 0x6529, - 0x4145: 0x652E, - 0x4146: 0x6531, - 0x4147: 0x653A, - 0x4148: 0x653C, - 0x4149: 0x653D, - 0x414A: 0x6543, - 0x414B: 0x6547, - 0x414C: 0x6549, - 0x414D: 0x6550, - 0x414E: 0x6552, - 0x414F: 0x6554, - 0x4150: 0x655F, - 0x4151: 0x6560, - 0x4152: 0x6567, - 0x4153: 0x656B, - 0x4154: 0x657A, - 0x4155: 0x657D, - 0x4156: 0x6581, - 0x4157: 0x6585, - 0x4158: 0x658A, - 0x4159: 0x6592, - 0x415A: 0x6595, - 0x415B: 0x6598, - 0x415C: 0x659D, - 0x415D: 0x65A0, - 0x415E: 0x65A3, - 0x415F: 0x65A6, - 0x4160: 0x65AE, - 0x4161: 0x65B2, - 0x4162: 0x65B3, - 0x4163: 0x65B4, - 0x4164: 0x65BF, - 0x4165: 0x65C2, - 0x4166: 0x65C8, - 0x4167: 0x65C9, - 0x4168: 0x65CE, - 0x4169: 0x65D0, - 0x416A: 0x65D4, - 0x416B: 0x65D6, - 0x416C: 0x65D8, - 0x416D: 0x65DF, - 0x416E: 0x65F0, - 0x416F: 0x65F2, - 0x4170: 0x65F4, - 0x4171: 0x65F5, - 0x4172: 0x65F9, - 0x4173: 0x65FE, - 0x4174: 0x65FF, - 0x4175: 0x6600, - 0x4176: 0x6604, - 0x4177: 0x6608, - 0x4178: 0x6609, - 0x4179: 0x660D, - 0x417A: 0x6611, - 0x417B: 0x6612, - 0x417C: 0x6615, - 0x417D: 0x6616, - 0x417E: 0x661D, - 0x4221: 0x661E, - 0x4222: 0x6621, - 0x4223: 0x6622, - 0x4224: 0x6623, - 0x4225: 0x6624, - 0x4226: 0x6626, - 0x4227: 0x6629, - 0x4228: 0x662A, - 0x4229: 0x662B, - 0x422A: 0x662C, - 0x422B: 0x662E, - 0x422C: 0x6630, - 0x422D: 0x6631, - 0x422E: 0x6633, - 0x422F: 0x6639, - 0x4230: 0x6637, - 0x4231: 0x6640, - 0x4232: 0x6645, - 0x4233: 0x6646, - 0x4234: 0x664A, - 0x4235: 0x664C, - 0x4236: 0x6651, - 0x4237: 0x664E, - 0x4238: 0x6657, - 0x4239: 0x6658, - 0x423A: 0x6659, - 0x423B: 0x665B, - 0x423C: 0x665C, - 0x423D: 0x6660, - 0x423E: 0x6661, - 0x423F: 0x66FB, - 0x4240: 0x666A, - 0x4241: 0x666B, - 0x4242: 0x666C, - 0x4243: 0x667E, - 0x4244: 0x6673, - 0x4245: 0x6675, - 0x4246: 0x667F, - 0x4247: 0x6677, - 0x4248: 0x6678, - 0x4249: 0x6679, - 0x424A: 0x667B, - 0x424B: 0x6680, - 0x424C: 0x667C, - 0x424D: 0x668B, - 0x424E: 0x668C, - 0x424F: 0x668D, - 0x4250: 0x6690, - 0x4251: 0x6692, - 0x4252: 0x6699, - 0x4253: 0x669A, - 0x4254: 0x669B, - 0x4255: 0x669C, - 0x4256: 0x669F, - 0x4257: 0x66A0, - 0x4258: 0x66A4, - 0x4259: 0x66AD, - 0x425A: 0x66B1, - 0x425B: 0x66B2, - 0x425C: 0x66B5, - 0x425D: 0x66BB, - 0x425E: 0x66BF, - 0x425F: 0x66C0, - 0x4260: 0x66C2, - 0x4261: 0x66C3, - 0x4262: 0x66C8, - 0x4263: 0x66CC, - 0x4264: 0x66CE, - 0x4265: 0x66CF, - 0x4266: 0x66D4, - 0x4267: 0x66DB, - 0x4268: 0x66DF, - 0x4269: 0x66E8, - 0x426A: 0x66EB, - 0x426B: 0x66EC, - 0x426C: 0x66EE, - 0x426D: 0x66FA, - 0x426E: 0x6705, - 0x426F: 0x6707, - 0x4270: 0x670E, - 0x4271: 0x6713, - 0x4272: 0x6719, - 0x4273: 0x671C, - 0x4274: 0x6720, - 0x4275: 0x6722, - 0x4276: 0x6733, - 0x4277: 0x673E, - 0x4278: 0x6745, - 0x4279: 0x6747, - 0x427A: 0x6748, - 0x427B: 0x674C, - 0x427C: 0x6754, - 0x427D: 0x6755, - 0x427E: 0x675D, - 0x4321: 0x6766, - 0x4322: 0x676C, - 0x4323: 0x676E, - 0x4324: 0x6774, - 0x4325: 0x6776, - 0x4326: 0x677B, - 0x4327: 0x6781, - 0x4328: 0x6784, - 0x4329: 0x678E, - 0x432A: 0x678F, - 0x432B: 0x6791, - 0x432C: 0x6793, - 0x432D: 0x6796, - 0x432E: 0x6798, - 0x432F: 0x6799, - 0x4330: 0x679B, - 0x4331: 0x67B0, - 0x4332: 0x67B1, - 0x4333: 0x67B2, - 0x4334: 0x67B5, - 0x4335: 0x67BB, - 0x4336: 0x67BC, - 0x4337: 0x67BD, - 0x4338: 0x67F9, - 0x4339: 0x67C0, - 0x433A: 0x67C2, - 0x433B: 0x67C3, - 0x433C: 0x67C5, - 0x433D: 0x67C8, - 0x433E: 0x67C9, - 0x433F: 0x67D2, - 0x4340: 0x67D7, - 0x4341: 0x67D9, - 0x4342: 0x67DC, - 0x4343: 0x67E1, - 0x4344: 0x67E6, - 0x4345: 0x67F0, - 0x4346: 0x67F2, - 0x4347: 0x67F6, - 0x4348: 0x67F7, - 0x4349: 0x6852, - 0x434A: 0x6814, - 0x434B: 0x6819, - 0x434C: 0x681D, - 0x434D: 0x681F, - 0x434E: 0x6828, - 0x434F: 0x6827, - 0x4350: 0x682C, - 0x4351: 0x682D, - 0x4352: 0x682F, - 0x4353: 0x6830, - 0x4354: 0x6831, - 0x4355: 0x6833, - 0x4356: 0x683B, - 0x4357: 0x683F, - 0x4358: 0x6844, - 0x4359: 0x6845, - 0x435A: 0x684A, - 0x435B: 0x684C, - 0x435C: 0x6855, - 0x435D: 0x6857, - 0x435E: 0x6858, - 0x435F: 0x685B, - 0x4360: 0x686B, - 0x4361: 0x686E, - 0x4362: 0x686F, - 0x4363: 0x6870, - 0x4364: 0x6871, - 0x4365: 0x6872, - 0x4366: 0x6875, - 0x4367: 0x6879, - 0x4368: 0x687A, - 0x4369: 0x687B, - 0x436A: 0x687C, - 0x436B: 0x6882, - 0x436C: 0x6884, - 0x436D: 0x6886, - 0x436E: 0x6888, - 0x436F: 0x6896, - 0x4370: 0x6898, - 0x4371: 0x689A, - 0x4372: 0x689C, - 0x4373: 0x68A1, - 0x4374: 0x68A3, - 0x4375: 0x68A5, - 0x4376: 0x68A9, - 0x4377: 0x68AA, - 0x4378: 0x68AE, - 0x4379: 0x68B2, - 0x437A: 0x68BB, - 0x437B: 0x68C5, - 0x437C: 0x68C8, - 0x437D: 0x68CC, - 0x437E: 0x68CF, - 0x4421: 0x68D0, - 0x4422: 0x68D1, - 0x4423: 0x68D3, - 0x4424: 0x68D6, - 0x4425: 0x68D9, - 0x4426: 0x68DC, - 0x4427: 0x68DD, - 0x4428: 0x68E5, - 0x4429: 0x68E8, - 0x442A: 0x68EA, - 0x442B: 0x68EB, - 0x442C: 0x68EC, - 0x442D: 0x68ED, - 0x442E: 0x68F0, - 0x442F: 0x68F1, - 0x4430: 0x68F5, - 0x4431: 0x68F6, - 0x4432: 0x68FB, - 0x4433: 0x68FC, - 0x4434: 0x68FD, - 0x4435: 0x6906, - 0x4436: 0x6909, - 0x4437: 0x690A, - 0x4438: 0x6910, - 0x4439: 0x6911, - 0x443A: 0x6913, - 0x443B: 0x6916, - 0x443C: 0x6917, - 0x443D: 0x6931, - 0x443E: 0x6933, - 0x443F: 0x6935, - 0x4440: 0x6938, - 0x4441: 0x693B, - 0x4442: 0x6942, - 0x4443: 0x6945, - 0x4444: 0x6949, - 0x4445: 0x694E, - 0x4446: 0x6957, - 0x4447: 0x695B, - 0x4448: 0x6963, - 0x4449: 0x6964, - 0x444A: 0x6965, - 0x444B: 0x6966, - 0x444C: 0x6968, - 0x444D: 0x6969, - 0x444E: 0x696C, - 0x444F: 0x6970, - 0x4450: 0x6971, - 0x4451: 0x6972, - 0x4452: 0x697A, - 0x4453: 0x697B, - 0x4454: 0x697F, - 0x4455: 0x6980, - 0x4456: 0x698D, - 0x4457: 0x6992, - 0x4458: 0x6996, - 0x4459: 0x6998, - 0x445A: 0x69A1, - 0x445B: 0x69A5, - 0x445C: 0x69A6, - 0x445D: 0x69A8, - 0x445E: 0x69AB, - 0x445F: 0x69AD, - 0x4460: 0x69AF, - 0x4461: 0x69B7, - 0x4462: 0x69B8, - 0x4463: 0x69BA, - 0x4464: 0x69BC, - 0x4465: 0x69C5, - 0x4466: 0x69C8, - 0x4467: 0x69D1, - 0x4468: 0x69D6, - 0x4469: 0x69D7, - 0x446A: 0x69E2, - 0x446B: 0x69E5, - 0x446C: 0x69EE, - 0x446D: 0x69EF, - 0x446E: 0x69F1, - 0x446F: 0x69F3, - 0x4470: 0x69F5, - 0x4471: 0x69FE, - 0x4472: 0x6A00, - 0x4473: 0x6A01, - 0x4474: 0x6A03, - 0x4475: 0x6A0F, - 0x4476: 0x6A11, - 0x4477: 0x6A15, - 0x4478: 0x6A1A, - 0x4479: 0x6A1D, - 0x447A: 0x6A20, - 0x447B: 0x6A24, - 0x447C: 0x6A28, - 0x447D: 0x6A30, - 0x447E: 0x6A32, - 0x4521: 0x6A34, - 0x4522: 0x6A37, - 0x4523: 0x6A3B, - 0x4524: 0x6A3E, - 0x4525: 0x6A3F, - 0x4526: 0x6A45, - 0x4527: 0x6A46, - 0x4528: 0x6A49, - 0x4529: 0x6A4A, - 0x452A: 0x6A4E, - 0x452B: 0x6A50, - 0x452C: 0x6A51, - 0x452D: 0x6A52, - 0x452E: 0x6A55, - 0x452F: 0x6A56, - 0x4530: 0x6A5B, - 0x4531: 0x6A64, - 0x4532: 0x6A67, - 0x4533: 0x6A6A, - 0x4534: 0x6A71, - 0x4535: 0x6A73, - 0x4536: 0x6A7E, - 0x4537: 0x6A81, - 0x4538: 0x6A83, - 0x4539: 0x6A86, - 0x453A: 0x6A87, - 0x453B: 0x6A89, - 0x453C: 0x6A8B, - 0x453D: 0x6A91, - 0x453E: 0x6A9B, - 0x453F: 0x6A9D, - 0x4540: 0x6A9E, - 0x4541: 0x6A9F, - 0x4542: 0x6AA5, - 0x4543: 0x6AAB, - 0x4544: 0x6AAF, - 0x4545: 0x6AB0, - 0x4546: 0x6AB1, - 0x4547: 0x6AB4, - 0x4548: 0x6ABD, - 0x4549: 0x6ABE, - 0x454A: 0x6ABF, - 0x454B: 0x6AC6, - 0x454C: 0x6AC9, - 0x454D: 0x6AC8, - 0x454E: 0x6ACC, - 0x454F: 0x6AD0, - 0x4550: 0x6AD4, - 0x4551: 0x6AD5, - 0x4552: 0x6AD6, - 0x4553: 0x6ADC, - 0x4554: 0x6ADD, - 0x4555: 0x6AE4, - 0x4556: 0x6AE7, - 0x4557: 0x6AEC, - 0x4558: 0x6AF0, - 0x4559: 0x6AF1, - 0x455A: 0x6AF2, - 0x455B: 0x6AFC, - 0x455C: 0x6AFD, - 0x455D: 0x6B02, - 0x455E: 0x6B03, - 0x455F: 0x6B06, - 0x4560: 0x6B07, - 0x4561: 0x6B09, - 0x4562: 0x6B0F, - 0x4563: 0x6B10, - 0x4564: 0x6B11, - 0x4565: 0x6B17, - 0x4566: 0x6B1B, - 0x4567: 0x6B1E, - 0x4568: 0x6B24, - 0x4569: 0x6B28, - 0x456A: 0x6B2B, - 0x456B: 0x6B2C, - 0x456C: 0x6B2F, - 0x456D: 0x6B35, - 0x456E: 0x6B36, - 0x456F: 0x6B3B, - 0x4570: 0x6B3F, - 0x4571: 0x6B46, - 0x4572: 0x6B4A, - 0x4573: 0x6B4D, - 0x4574: 0x6B52, - 0x4575: 0x6B56, - 0x4576: 0x6B58, - 0x4577: 0x6B5D, - 0x4578: 0x6B60, - 0x4579: 0x6B67, - 0x457A: 0x6B6B, - 0x457B: 0x6B6E, - 0x457C: 0x6B70, - 0x457D: 0x6B75, - 0x457E: 0x6B7D, - 0x4621: 0x6B7E, - 0x4622: 0x6B82, - 0x4623: 0x6B85, - 0x4624: 0x6B97, - 0x4625: 0x6B9B, - 0x4626: 0x6B9F, - 0x4627: 0x6BA0, - 0x4628: 0x6BA2, - 0x4629: 0x6BA3, - 0x462A: 0x6BA8, - 0x462B: 0x6BA9, - 0x462C: 0x6BAC, - 0x462D: 0x6BAD, - 0x462E: 0x6BAE, - 0x462F: 0x6BB0, - 0x4630: 0x6BB8, - 0x4631: 0x6BB9, - 0x4632: 0x6BBD, - 0x4633: 0x6BBE, - 0x4634: 0x6BC3, - 0x4635: 0x6BC4, - 0x4636: 0x6BC9, - 0x4637: 0x6BCC, - 0x4638: 0x6BD6, - 0x4639: 0x6BDA, - 0x463A: 0x6BE1, - 0x463B: 0x6BE3, - 0x463C: 0x6BE6, - 0x463D: 0x6BE7, - 0x463E: 0x6BEE, - 0x463F: 0x6BF1, - 0x4640: 0x6BF7, - 0x4641: 0x6BF9, - 0x4642: 0x6BFF, - 0x4643: 0x6C02, - 0x4644: 0x6C04, - 0x4645: 0x6C05, - 0x4646: 0x6C09, - 0x4647: 0x6C0D, - 0x4648: 0x6C0E, - 0x4649: 0x6C10, - 0x464A: 0x6C12, - 0x464B: 0x6C19, - 0x464C: 0x6C1F, - 0x464D: 0x6C26, - 0x464E: 0x6C27, - 0x464F: 0x6C28, - 0x4650: 0x6C2C, - 0x4651: 0x6C2E, - 0x4652: 0x6C33, - 0x4653: 0x6C35, - 0x4654: 0x6C36, - 0x4655: 0x6C3A, - 0x4656: 0x6C3B, - 0x4657: 0x6C3F, - 0x4658: 0x6C4A, - 0x4659: 0x6C4B, - 0x465A: 0x6C4D, - 0x465B: 0x6C4F, - 0x465C: 0x6C52, - 0x465D: 0x6C54, - 0x465E: 0x6C59, - 0x465F: 0x6C5B, - 0x4660: 0x6C5C, - 0x4661: 0x6C6B, - 0x4662: 0x6C6D, - 0x4663: 0x6C6F, - 0x4664: 0x6C74, - 0x4665: 0x6C76, - 0x4666: 0x6C78, - 0x4667: 0x6C79, - 0x4668: 0x6C7B, - 0x4669: 0x6C85, - 0x466A: 0x6C86, - 0x466B: 0x6C87, - 0x466C: 0x6C89, - 0x466D: 0x6C94, - 0x466E: 0x6C95, - 0x466F: 0x6C97, - 0x4670: 0x6C98, - 0x4671: 0x6C9C, - 0x4672: 0x6C9F, - 0x4673: 0x6CB0, - 0x4674: 0x6CB2, - 0x4675: 0x6CB4, - 0x4676: 0x6CC2, - 0x4677: 0x6CC6, - 0x4678: 0x6CCD, - 0x4679: 0x6CCF, - 0x467A: 0x6CD0, - 0x467B: 0x6CD1, - 0x467C: 0x6CD2, - 0x467D: 0x6CD4, - 0x467E: 0x6CD6, - 0x4721: 0x6CDA, - 0x4722: 0x6CDC, - 0x4723: 0x6CE0, - 0x4724: 0x6CE7, - 0x4725: 0x6CE9, - 0x4726: 0x6CEB, - 0x4727: 0x6CEC, - 0x4728: 0x6CEE, - 0x4729: 0x6CF2, - 0x472A: 0x6CF4, - 0x472B: 0x6D04, - 0x472C: 0x6D07, - 0x472D: 0x6D0A, - 0x472E: 0x6D0E, - 0x472F: 0x6D0F, - 0x4730: 0x6D11, - 0x4731: 0x6D13, - 0x4732: 0x6D1A, - 0x4733: 0x6D26, - 0x4734: 0x6D27, - 0x4735: 0x6D28, - 0x4736: 0x6C67, - 0x4737: 0x6D2E, - 0x4738: 0x6D2F, - 0x4739: 0x6D31, - 0x473A: 0x6D39, - 0x473B: 0x6D3C, - 0x473C: 0x6D3F, - 0x473D: 0x6D57, - 0x473E: 0x6D5E, - 0x473F: 0x6D5F, - 0x4740: 0x6D61, - 0x4741: 0x6D65, - 0x4742: 0x6D67, - 0x4743: 0x6D6F, - 0x4744: 0x6D70, - 0x4745: 0x6D7C, - 0x4746: 0x6D82, - 0x4747: 0x6D87, - 0x4748: 0x6D91, - 0x4749: 0x6D92, - 0x474A: 0x6D94, - 0x474B: 0x6D96, - 0x474C: 0x6D97, - 0x474D: 0x6D98, - 0x474E: 0x6DAA, - 0x474F: 0x6DAC, - 0x4750: 0x6DB4, - 0x4751: 0x6DB7, - 0x4752: 0x6DB9, - 0x4753: 0x6DBD, - 0x4754: 0x6DBF, - 0x4755: 0x6DC4, - 0x4756: 0x6DC8, - 0x4757: 0x6DCA, - 0x4758: 0x6DCE, - 0x4759: 0x6DCF, - 0x475A: 0x6DD6, - 0x475B: 0x6DDB, - 0x475C: 0x6DDD, - 0x475D: 0x6DDF, - 0x475E: 0x6DE0, - 0x475F: 0x6DE2, - 0x4760: 0x6DE5, - 0x4761: 0x6DE9, - 0x4762: 0x6DEF, - 0x4763: 0x6DF0, - 0x4764: 0x6DF4, - 0x4765: 0x6DF6, - 0x4766: 0x6DFC, - 0x4767: 0x6E00, - 0x4768: 0x6E04, - 0x4769: 0x6E1E, - 0x476A: 0x6E22, - 0x476B: 0x6E27, - 0x476C: 0x6E32, - 0x476D: 0x6E36, - 0x476E: 0x6E39, - 0x476F: 0x6E3B, - 0x4770: 0x6E3C, - 0x4771: 0x6E44, - 0x4772: 0x6E45, - 0x4773: 0x6E48, - 0x4774: 0x6E49, - 0x4775: 0x6E4B, - 0x4776: 0x6E4F, - 0x4777: 0x6E51, - 0x4778: 0x6E52, - 0x4779: 0x6E53, - 0x477A: 0x6E54, - 0x477B: 0x6E57, - 0x477C: 0x6E5C, - 0x477D: 0x6E5D, - 0x477E: 0x6E5E, - 0x4821: 0x6E62, - 0x4822: 0x6E63, - 0x4823: 0x6E68, - 0x4824: 0x6E73, - 0x4825: 0x6E7B, - 0x4826: 0x6E7D, - 0x4827: 0x6E8D, - 0x4828: 0x6E93, - 0x4829: 0x6E99, - 0x482A: 0x6EA0, - 0x482B: 0x6EA7, - 0x482C: 0x6EAD, - 0x482D: 0x6EAE, - 0x482E: 0x6EB1, - 0x482F: 0x6EB3, - 0x4830: 0x6EBB, - 0x4831: 0x6EBF, - 0x4832: 0x6EC0, - 0x4833: 0x6EC1, - 0x4834: 0x6EC3, - 0x4835: 0x6EC7, - 0x4836: 0x6EC8, - 0x4837: 0x6ECA, - 0x4838: 0x6ECD, - 0x4839: 0x6ECE, - 0x483A: 0x6ECF, - 0x483B: 0x6EEB, - 0x483C: 0x6EED, - 0x483D: 0x6EEE, - 0x483E: 0x6EF9, - 0x483F: 0x6EFB, - 0x4840: 0x6EFD, - 0x4841: 0x6F04, - 0x4842: 0x6F08, - 0x4843: 0x6F0A, - 0x4844: 0x6F0C, - 0x4845: 0x6F0D, - 0x4846: 0x6F16, - 0x4847: 0x6F18, - 0x4848: 0x6F1A, - 0x4849: 0x6F1B, - 0x484A: 0x6F26, - 0x484B: 0x6F29, - 0x484C: 0x6F2A, - 0x484D: 0x6F2F, - 0x484E: 0x6F30, - 0x484F: 0x6F33, - 0x4850: 0x6F36, - 0x4851: 0x6F3B, - 0x4852: 0x6F3C, - 0x4853: 0x6F2D, - 0x4854: 0x6F4F, - 0x4855: 0x6F51, - 0x4856: 0x6F52, - 0x4857: 0x6F53, - 0x4858: 0x6F57, - 0x4859: 0x6F59, - 0x485A: 0x6F5A, - 0x485B: 0x6F5D, - 0x485C: 0x6F5E, - 0x485D: 0x6F61, - 0x485E: 0x6F62, - 0x485F: 0x6F68, - 0x4860: 0x6F6C, - 0x4861: 0x6F7D, - 0x4862: 0x6F7E, - 0x4863: 0x6F83, - 0x4864: 0x6F87, - 0x4865: 0x6F88, - 0x4866: 0x6F8B, - 0x4867: 0x6F8C, - 0x4868: 0x6F8D, - 0x4869: 0x6F90, - 0x486A: 0x6F92, - 0x486B: 0x6F93, - 0x486C: 0x6F94, - 0x486D: 0x6F96, - 0x486E: 0x6F9A, - 0x486F: 0x6F9F, - 0x4870: 0x6FA0, - 0x4871: 0x6FA5, - 0x4872: 0x6FA6, - 0x4873: 0x6FA7, - 0x4874: 0x6FA8, - 0x4875: 0x6FAE, - 0x4876: 0x6FAF, - 0x4877: 0x6FB0, - 0x4878: 0x6FB5, - 0x4879: 0x6FB6, - 0x487A: 0x6FBC, - 0x487B: 0x6FC5, - 0x487C: 0x6FC7, - 0x487D: 0x6FC8, - 0x487E: 0x6FCA, - 0x4921: 0x6FDA, - 0x4922: 0x6FDE, - 0x4923: 0x6FE8, - 0x4924: 0x6FE9, - 0x4925: 0x6FF0, - 0x4926: 0x6FF5, - 0x4927: 0x6FF9, - 0x4928: 0x6FFC, - 0x4929: 0x6FFD, - 0x492A: 0x7000, - 0x492B: 0x7005, - 0x492C: 0x7006, - 0x492D: 0x7007, - 0x492E: 0x700D, - 0x492F: 0x7017, - 0x4930: 0x7020, - 0x4931: 0x7023, - 0x4932: 0x702F, - 0x4933: 0x7034, - 0x4934: 0x7037, - 0x4935: 0x7039, - 0x4936: 0x703C, - 0x4937: 0x7043, - 0x4938: 0x7044, - 0x4939: 0x7048, - 0x493A: 0x7049, - 0x493B: 0x704A, - 0x493C: 0x704B, - 0x493D: 0x7054, - 0x493E: 0x7055, - 0x493F: 0x705D, - 0x4940: 0x705E, - 0x4941: 0x704E, - 0x4942: 0x7064, - 0x4943: 0x7065, - 0x4944: 0x706C, - 0x4945: 0x706E, - 0x4946: 0x7075, - 0x4947: 0x7076, - 0x4948: 0x707E, - 0x4949: 0x7081, - 0x494A: 0x7085, - 0x494B: 0x7086, - 0x494C: 0x7094, - 0x494D: 0x7095, - 0x494E: 0x7096, - 0x494F: 0x7097, - 0x4950: 0x7098, - 0x4951: 0x709B, - 0x4952: 0x70A4, - 0x4953: 0x70AB, - 0x4954: 0x70B0, - 0x4955: 0x70B1, - 0x4956: 0x70B4, - 0x4957: 0x70B7, - 0x4958: 0x70CA, - 0x4959: 0x70D1, - 0x495A: 0x70D3, - 0x495B: 0x70D4, - 0x495C: 0x70D5, - 0x495D: 0x70D6, - 0x495E: 0x70D8, - 0x495F: 0x70DC, - 0x4960: 0x70E4, - 0x4961: 0x70FA, - 0x4962: 0x7103, - 0x4963: 0x7104, - 0x4964: 0x7105, - 0x4965: 0x7106, - 0x4966: 0x7107, - 0x4967: 0x710B, - 0x4968: 0x710C, - 0x4969: 0x710F, - 0x496A: 0x711E, - 0x496B: 0x7120, - 0x496C: 0x712B, - 0x496D: 0x712D, - 0x496E: 0x712F, - 0x496F: 0x7130, - 0x4970: 0x7131, - 0x4971: 0x7138, - 0x4972: 0x7141, - 0x4973: 0x7145, - 0x4974: 0x7146, - 0x4975: 0x7147, - 0x4976: 0x714A, - 0x4977: 0x714B, - 0x4978: 0x7150, - 0x4979: 0x7152, - 0x497A: 0x7157, - 0x497B: 0x715A, - 0x497C: 0x715C, - 0x497D: 0x715E, - 0x497E: 0x7160, - 0x4A21: 0x7168, - 0x4A22: 0x7179, - 0x4A23: 0x7180, - 0x4A24: 0x7185, - 0x4A25: 0x7187, - 0x4A26: 0x718C, - 0x4A27: 0x7192, - 0x4A28: 0x719A, - 0x4A29: 0x719B, - 0x4A2A: 0x71A0, - 0x4A2B: 0x71A2, - 0x4A2C: 0x71AF, - 0x4A2D: 0x71B0, - 0x4A2E: 0x71B2, - 0x4A2F: 0x71B3, - 0x4A30: 0x71BA, - 0x4A31: 0x71BF, - 0x4A32: 0x71C0, - 0x4A33: 0x71C1, - 0x4A34: 0x71C4, - 0x4A35: 0x71CB, - 0x4A36: 0x71CC, - 0x4A37: 0x71D3, - 0x4A38: 0x71D6, - 0x4A39: 0x71D9, - 0x4A3A: 0x71DA, - 0x4A3B: 0x71DC, - 0x4A3C: 0x71F8, - 0x4A3D: 0x71FE, - 0x4A3E: 0x7200, - 0x4A3F: 0x7207, - 0x4A40: 0x7208, - 0x4A41: 0x7209, - 0x4A42: 0x7213, - 0x4A43: 0x7217, - 0x4A44: 0x721A, - 0x4A45: 0x721D, - 0x4A46: 0x721F, - 0x4A47: 0x7224, - 0x4A48: 0x722B, - 0x4A49: 0x722F, - 0x4A4A: 0x7234, - 0x4A4B: 0x7238, - 0x4A4C: 0x7239, - 0x4A4D: 0x7241, - 0x4A4E: 0x7242, - 0x4A4F: 0x7243, - 0x4A50: 0x7245, - 0x4A51: 0x724E, - 0x4A52: 0x724F, - 0x4A53: 0x7250, - 0x4A54: 0x7253, - 0x4A55: 0x7255, - 0x4A56: 0x7256, - 0x4A57: 0x725A, - 0x4A58: 0x725C, - 0x4A59: 0x725E, - 0x4A5A: 0x7260, - 0x4A5B: 0x7263, - 0x4A5C: 0x7268, - 0x4A5D: 0x726B, - 0x4A5E: 0x726E, - 0x4A5F: 0x726F, - 0x4A60: 0x7271, - 0x4A61: 0x7277, - 0x4A62: 0x7278, - 0x4A63: 0x727B, - 0x4A64: 0x727C, - 0x4A65: 0x727F, - 0x4A66: 0x7284, - 0x4A67: 0x7289, - 0x4A68: 0x728D, - 0x4A69: 0x728E, - 0x4A6A: 0x7293, - 0x4A6B: 0x729B, - 0x4A6C: 0x72A8, - 0x4A6D: 0x72AD, - 0x4A6E: 0x72AE, - 0x4A6F: 0x72B1, - 0x4A70: 0x72B4, - 0x4A71: 0x72BE, - 0x4A72: 0x72C1, - 0x4A73: 0x72C7, - 0x4A74: 0x72C9, - 0x4A75: 0x72CC, - 0x4A76: 0x72D5, - 0x4A77: 0x72D6, - 0x4A78: 0x72D8, - 0x4A79: 0x72DF, - 0x4A7A: 0x72E5, - 0x4A7B: 0x72F3, - 0x4A7C: 0x72F4, - 0x4A7D: 0x72FA, - 0x4A7E: 0x72FB, - 0x4B21: 0x72FE, - 0x4B22: 0x7302, - 0x4B23: 0x7304, - 0x4B24: 0x7305, - 0x4B25: 0x7307, - 0x4B26: 0x730B, - 0x4B27: 0x730D, - 0x4B28: 0x7312, - 0x4B29: 0x7313, - 0x4B2A: 0x7318, - 0x4B2B: 0x7319, - 0x4B2C: 0x731E, - 0x4B2D: 0x7322, - 0x4B2E: 0x7324, - 0x4B2F: 0x7327, - 0x4B30: 0x7328, - 0x4B31: 0x732C, - 0x4B32: 0x7331, - 0x4B33: 0x7332, - 0x4B34: 0x7335, - 0x4B35: 0x733A, - 0x4B36: 0x733B, - 0x4B37: 0x733D, - 0x4B38: 0x7343, - 0x4B39: 0x734D, - 0x4B3A: 0x7350, - 0x4B3B: 0x7352, - 0x4B3C: 0x7356, - 0x4B3D: 0x7358, - 0x4B3E: 0x735D, - 0x4B3F: 0x735E, - 0x4B40: 0x735F, - 0x4B41: 0x7360, - 0x4B42: 0x7366, - 0x4B43: 0x7367, - 0x4B44: 0x7369, - 0x4B45: 0x736B, - 0x4B46: 0x736C, - 0x4B47: 0x736E, - 0x4B48: 0x736F, - 0x4B49: 0x7371, - 0x4B4A: 0x7377, - 0x4B4B: 0x7379, - 0x4B4C: 0x737C, - 0x4B4D: 0x7380, - 0x4B4E: 0x7381, - 0x4B4F: 0x7383, - 0x4B50: 0x7385, - 0x4B51: 0x7386, - 0x4B52: 0x738E, - 0x4B53: 0x7390, - 0x4B54: 0x7393, - 0x4B55: 0x7395, - 0x4B56: 0x7397, - 0x4B57: 0x7398, - 0x4B58: 0x739C, - 0x4B59: 0x739E, - 0x4B5A: 0x739F, - 0x4B5B: 0x73A0, - 0x4B5C: 0x73A2, - 0x4B5D: 0x73A5, - 0x4B5E: 0x73A6, - 0x4B5F: 0x73AA, - 0x4B60: 0x73AB, - 0x4B61: 0x73AD, - 0x4B62: 0x73B5, - 0x4B63: 0x73B7, - 0x4B64: 0x73B9, - 0x4B65: 0x73BC, - 0x4B66: 0x73BD, - 0x4B67: 0x73BF, - 0x4B68: 0x73C5, - 0x4B69: 0x73C6, - 0x4B6A: 0x73C9, - 0x4B6B: 0x73CB, - 0x4B6C: 0x73CC, - 0x4B6D: 0x73CF, - 0x4B6E: 0x73D2, - 0x4B6F: 0x73D3, - 0x4B70: 0x73D6, - 0x4B71: 0x73D9, - 0x4B72: 0x73DD, - 0x4B73: 0x73E1, - 0x4B74: 0x73E3, - 0x4B75: 0x73E6, - 0x4B76: 0x73E7, - 0x4B77: 0x73E9, - 0x4B78: 0x73F4, - 0x4B79: 0x73F5, - 0x4B7A: 0x73F7, - 0x4B7B: 0x73F9, - 0x4B7C: 0x73FA, - 0x4B7D: 0x73FB, - 0x4B7E: 0x73FD, - 0x4C21: 0x73FF, - 0x4C22: 0x7400, - 0x4C23: 0x7401, - 0x4C24: 0x7404, - 0x4C25: 0x7407, - 0x4C26: 0x740A, - 0x4C27: 0x7411, - 0x4C28: 0x741A, - 0x4C29: 0x741B, - 0x4C2A: 0x7424, - 0x4C2B: 0x7426, - 0x4C2C: 0x7428, - 0x4C2D: 0x7429, - 0x4C2E: 0x742A, - 0x4C2F: 0x742B, - 0x4C30: 0x742C, - 0x4C31: 0x742D, - 0x4C32: 0x742E, - 0x4C33: 0x742F, - 0x4C34: 0x7430, - 0x4C35: 0x7431, - 0x4C36: 0x7439, - 0x4C37: 0x7440, - 0x4C38: 0x7443, - 0x4C39: 0x7444, - 0x4C3A: 0x7446, - 0x4C3B: 0x7447, - 0x4C3C: 0x744B, - 0x4C3D: 0x744D, - 0x4C3E: 0x7451, - 0x4C3F: 0x7452, - 0x4C40: 0x7457, - 0x4C41: 0x745D, - 0x4C42: 0x7462, - 0x4C43: 0x7466, - 0x4C44: 0x7467, - 0x4C45: 0x7468, - 0x4C46: 0x746B, - 0x4C47: 0x746D, - 0x4C48: 0x746E, - 0x4C49: 0x7471, - 0x4C4A: 0x7472, - 0x4C4B: 0x7480, - 0x4C4C: 0x7481, - 0x4C4D: 0x7485, - 0x4C4E: 0x7486, - 0x4C4F: 0x7487, - 0x4C50: 0x7489, - 0x4C51: 0x748F, - 0x4C52: 0x7490, - 0x4C53: 0x7491, - 0x4C54: 0x7492, - 0x4C55: 0x7498, - 0x4C56: 0x7499, - 0x4C57: 0x749A, - 0x4C58: 0x749C, - 0x4C59: 0x749F, - 0x4C5A: 0x74A0, - 0x4C5B: 0x74A1, - 0x4C5C: 0x74A3, - 0x4C5D: 0x74A6, - 0x4C5E: 0x74A8, - 0x4C5F: 0x74A9, - 0x4C60: 0x74AA, - 0x4C61: 0x74AB, - 0x4C62: 0x74AE, - 0x4C63: 0x74AF, - 0x4C64: 0x74B1, - 0x4C65: 0x74B2, - 0x4C66: 0x74B5, - 0x4C67: 0x74B9, - 0x4C68: 0x74BB, - 0x4C69: 0x74BF, - 0x4C6A: 0x74C8, - 0x4C6B: 0x74C9, - 0x4C6C: 0x74CC, - 0x4C6D: 0x74D0, - 0x4C6E: 0x74D3, - 0x4C6F: 0x74D8, - 0x4C70: 0x74DA, - 0x4C71: 0x74DB, - 0x4C72: 0x74DE, - 0x4C73: 0x74DF, - 0x4C74: 0x74E4, - 0x4C75: 0x74E8, - 0x4C76: 0x74EA, - 0x4C77: 0x74EB, - 0x4C78: 0x74EF, - 0x4C79: 0x74F4, - 0x4C7A: 0x74FA, - 0x4C7B: 0x74FB, - 0x4C7C: 0x74FC, - 0x4C7D: 0x74FF, - 0x4C7E: 0x7506, - 0x4D21: 0x7512, - 0x4D22: 0x7516, - 0x4D23: 0x7517, - 0x4D24: 0x7520, - 0x4D25: 0x7521, - 0x4D26: 0x7524, - 0x4D27: 0x7527, - 0x4D28: 0x7529, - 0x4D29: 0x752A, - 0x4D2A: 0x752F, - 0x4D2B: 0x7536, - 0x4D2C: 0x7539, - 0x4D2D: 0x753D, - 0x4D2E: 0x753E, - 0x4D2F: 0x753F, - 0x4D30: 0x7540, - 0x4D31: 0x7543, - 0x4D32: 0x7547, - 0x4D33: 0x7548, - 0x4D34: 0x754E, - 0x4D35: 0x7550, - 0x4D36: 0x7552, - 0x4D37: 0x7557, - 0x4D38: 0x755E, - 0x4D39: 0x755F, - 0x4D3A: 0x7561, - 0x4D3B: 0x756F, - 0x4D3C: 0x7571, - 0x4D3D: 0x7579, - 0x4D3E: 0x757A, - 0x4D3F: 0x757B, - 0x4D40: 0x757C, - 0x4D41: 0x757D, - 0x4D42: 0x757E, - 0x4D43: 0x7581, - 0x4D44: 0x7585, - 0x4D45: 0x7590, - 0x4D46: 0x7592, - 0x4D47: 0x7593, - 0x4D48: 0x7595, - 0x4D49: 0x7599, - 0x4D4A: 0x759C, - 0x4D4B: 0x75A2, - 0x4D4C: 0x75A4, - 0x4D4D: 0x75B4, - 0x4D4E: 0x75BA, - 0x4D4F: 0x75BF, - 0x4D50: 0x75C0, - 0x4D51: 0x75C1, - 0x4D52: 0x75C4, - 0x4D53: 0x75C6, - 0x4D54: 0x75CC, - 0x4D55: 0x75CE, - 0x4D56: 0x75CF, - 0x4D57: 0x75D7, - 0x4D58: 0x75DC, - 0x4D59: 0x75DF, - 0x4D5A: 0x75E0, - 0x4D5B: 0x75E1, - 0x4D5C: 0x75E4, - 0x4D5D: 0x75E7, - 0x4D5E: 0x75EC, - 0x4D5F: 0x75EE, - 0x4D60: 0x75EF, - 0x4D61: 0x75F1, - 0x4D62: 0x75F9, - 0x4D63: 0x7600, - 0x4D64: 0x7602, - 0x4D65: 0x7603, - 0x4D66: 0x7604, - 0x4D67: 0x7607, - 0x4D68: 0x7608, - 0x4D69: 0x760A, - 0x4D6A: 0x760C, - 0x4D6B: 0x760F, - 0x4D6C: 0x7612, - 0x4D6D: 0x7613, - 0x4D6E: 0x7615, - 0x4D6F: 0x7616, - 0x4D70: 0x7619, - 0x4D71: 0x761B, - 0x4D72: 0x761C, - 0x4D73: 0x761D, - 0x4D74: 0x761E, - 0x4D75: 0x7623, - 0x4D76: 0x7625, - 0x4D77: 0x7626, - 0x4D78: 0x7629, - 0x4D79: 0x762D, - 0x4D7A: 0x7632, - 0x4D7B: 0x7633, - 0x4D7C: 0x7635, - 0x4D7D: 0x7638, - 0x4D7E: 0x7639, - 0x4E21: 0x763A, - 0x4E22: 0x763C, - 0x4E23: 0x764A, - 0x4E24: 0x7640, - 0x4E25: 0x7641, - 0x4E26: 0x7643, - 0x4E27: 0x7644, - 0x4E28: 0x7645, - 0x4E29: 0x7649, - 0x4E2A: 0x764B, - 0x4E2B: 0x7655, - 0x4E2C: 0x7659, - 0x4E2D: 0x765F, - 0x4E2E: 0x7664, - 0x4E2F: 0x7665, - 0x4E30: 0x766D, - 0x4E31: 0x766E, - 0x4E32: 0x766F, - 0x4E33: 0x7671, - 0x4E34: 0x7674, - 0x4E35: 0x7681, - 0x4E36: 0x7685, - 0x4E37: 0x768C, - 0x4E38: 0x768D, - 0x4E39: 0x7695, - 0x4E3A: 0x769B, - 0x4E3B: 0x769C, - 0x4E3C: 0x769D, - 0x4E3D: 0x769F, - 0x4E3E: 0x76A0, - 0x4E3F: 0x76A2, - 0x4E40: 0x76A3, - 0x4E41: 0x76A4, - 0x4E42: 0x76A5, - 0x4E43: 0x76A6, - 0x4E44: 0x76A7, - 0x4E45: 0x76A8, - 0x4E46: 0x76AA, - 0x4E47: 0x76AD, - 0x4E48: 0x76BD, - 0x4E49: 0x76C1, - 0x4E4A: 0x76C5, - 0x4E4B: 0x76C9, - 0x4E4C: 0x76CB, - 0x4E4D: 0x76CC, - 0x4E4E: 0x76CE, - 0x4E4F: 0x76D4, - 0x4E50: 0x76D9, - 0x4E51: 0x76E0, - 0x4E52: 0x76E6, - 0x4E53: 0x76E8, - 0x4E54: 0x76EC, - 0x4E55: 0x76F0, - 0x4E56: 0x76F1, - 0x4E57: 0x76F6, - 0x4E58: 0x76F9, - 0x4E59: 0x76FC, - 0x4E5A: 0x7700, - 0x4E5B: 0x7706, - 0x4E5C: 0x770A, - 0x4E5D: 0x770E, - 0x4E5E: 0x7712, - 0x4E5F: 0x7714, - 0x4E60: 0x7715, - 0x4E61: 0x7717, - 0x4E62: 0x7719, - 0x4E63: 0x771A, - 0x4E64: 0x771C, - 0x4E65: 0x7722, - 0x4E66: 0x7728, - 0x4E67: 0x772D, - 0x4E68: 0x772E, - 0x4E69: 0x772F, - 0x4E6A: 0x7734, - 0x4E6B: 0x7735, - 0x4E6C: 0x7736, - 0x4E6D: 0x7739, - 0x4E6E: 0x773D, - 0x4E6F: 0x773E, - 0x4E70: 0x7742, - 0x4E71: 0x7745, - 0x4E72: 0x7746, - 0x4E73: 0x774A, - 0x4E74: 0x774D, - 0x4E75: 0x774E, - 0x4E76: 0x774F, - 0x4E77: 0x7752, - 0x4E78: 0x7756, - 0x4E79: 0x7757, - 0x4E7A: 0x775C, - 0x4E7B: 0x775E, - 0x4E7C: 0x775F, - 0x4E7D: 0x7760, - 0x4E7E: 0x7762, - 0x4F21: 0x7764, - 0x4F22: 0x7767, - 0x4F23: 0x776A, - 0x4F24: 0x776C, - 0x4F25: 0x7770, - 0x4F26: 0x7772, - 0x4F27: 0x7773, - 0x4F28: 0x7774, - 0x4F29: 0x777A, - 0x4F2A: 0x777D, - 0x4F2B: 0x7780, - 0x4F2C: 0x7784, - 0x4F2D: 0x778C, - 0x4F2E: 0x778D, - 0x4F2F: 0x7794, - 0x4F30: 0x7795, - 0x4F31: 0x7796, - 0x4F32: 0x779A, - 0x4F33: 0x779F, - 0x4F34: 0x77A2, - 0x4F35: 0x77A7, - 0x4F36: 0x77AA, - 0x4F37: 0x77AE, - 0x4F38: 0x77AF, - 0x4F39: 0x77B1, - 0x4F3A: 0x77B5, - 0x4F3B: 0x77BE, - 0x4F3C: 0x77C3, - 0x4F3D: 0x77C9, - 0x4F3E: 0x77D1, - 0x4F3F: 0x77D2, - 0x4F40: 0x77D5, - 0x4F41: 0x77D9, - 0x4F42: 0x77DE, - 0x4F43: 0x77DF, - 0x4F44: 0x77E0, - 0x4F45: 0x77E4, - 0x4F46: 0x77E6, - 0x4F47: 0x77EA, - 0x4F48: 0x77EC, - 0x4F49: 0x77F0, - 0x4F4A: 0x77F1, - 0x4F4B: 0x77F4, - 0x4F4C: 0x77F8, - 0x4F4D: 0x77FB, - 0x4F4E: 0x7805, - 0x4F4F: 0x7806, - 0x4F50: 0x7809, - 0x4F51: 0x780D, - 0x4F52: 0x780E, - 0x4F53: 0x7811, - 0x4F54: 0x781D, - 0x4F55: 0x7821, - 0x4F56: 0x7822, - 0x4F57: 0x7823, - 0x4F58: 0x782D, - 0x4F59: 0x782E, - 0x4F5A: 0x7830, - 0x4F5B: 0x7835, - 0x4F5C: 0x7837, - 0x4F5D: 0x7843, - 0x4F5E: 0x7844, - 0x4F5F: 0x7847, - 0x4F60: 0x7848, - 0x4F61: 0x784C, - 0x4F62: 0x784E, - 0x4F63: 0x7852, - 0x4F64: 0x785C, - 0x4F65: 0x785E, - 0x4F66: 0x7860, - 0x4F67: 0x7861, - 0x4F68: 0x7863, - 0x4F69: 0x7864, - 0x4F6A: 0x7868, - 0x4F6B: 0x786A, - 0x4F6C: 0x786E, - 0x4F6D: 0x787A, - 0x4F6E: 0x787E, - 0x4F6F: 0x788A, - 0x4F70: 0x788F, - 0x4F71: 0x7894, - 0x4F72: 0x7898, - 0x4F73: 0x78A1, - 0x4F74: 0x789D, - 0x4F75: 0x789E, - 0x4F76: 0x789F, - 0x4F77: 0x78A4, - 0x4F78: 0x78A8, - 0x4F79: 0x78AC, - 0x4F7A: 0x78AD, - 0x4F7B: 0x78B0, - 0x4F7C: 0x78B1, - 0x4F7D: 0x78B2, - 0x4F7E: 0x78B3, - 0x5021: 0x78BB, - 0x5022: 0x78BD, - 0x5023: 0x78BF, - 0x5024: 0x78C7, - 0x5025: 0x78C8, - 0x5026: 0x78C9, - 0x5027: 0x78CC, - 0x5028: 0x78CE, - 0x5029: 0x78D2, - 0x502A: 0x78D3, - 0x502B: 0x78D5, - 0x502C: 0x78D6, - 0x502D: 0x78E4, - 0x502E: 0x78DB, - 0x502F: 0x78DF, - 0x5030: 0x78E0, - 0x5031: 0x78E1, - 0x5032: 0x78E6, - 0x5033: 0x78EA, - 0x5034: 0x78F2, - 0x5035: 0x78F3, - 0x5036: 0x7900, - 0x5037: 0x78F6, - 0x5038: 0x78F7, - 0x5039: 0x78FA, - 0x503A: 0x78FB, - 0x503B: 0x78FF, - 0x503C: 0x7906, - 0x503D: 0x790C, - 0x503E: 0x7910, - 0x503F: 0x791A, - 0x5040: 0x791C, - 0x5041: 0x791E, - 0x5042: 0x791F, - 0x5043: 0x7920, - 0x5044: 0x7925, - 0x5045: 0x7927, - 0x5046: 0x7929, - 0x5047: 0x792D, - 0x5048: 0x7931, - 0x5049: 0x7934, - 0x504A: 0x7935, - 0x504B: 0x793B, - 0x504C: 0x793D, - 0x504D: 0x793F, - 0x504E: 0x7944, - 0x504F: 0x7945, - 0x5050: 0x7946, - 0x5051: 0x794A, - 0x5052: 0x794B, - 0x5053: 0x794F, - 0x5054: 0x7951, - 0x5055: 0x7954, - 0x5056: 0x7958, - 0x5057: 0x795B, - 0x5058: 0x795C, - 0x5059: 0x7967, - 0x505A: 0x7969, - 0x505B: 0x796B, - 0x505C: 0x7972, - 0x505D: 0x7979, - 0x505E: 0x797B, - 0x505F: 0x797C, - 0x5060: 0x797E, - 0x5061: 0x798B, - 0x5062: 0x798C, - 0x5063: 0x7991, - 0x5064: 0x7993, - 0x5065: 0x7994, - 0x5066: 0x7995, - 0x5067: 0x7996, - 0x5068: 0x7998, - 0x5069: 0x799B, - 0x506A: 0x799C, - 0x506B: 0x79A1, - 0x506C: 0x79A8, - 0x506D: 0x79A9, - 0x506E: 0x79AB, - 0x506F: 0x79AF, - 0x5070: 0x79B1, - 0x5071: 0x79B4, - 0x5072: 0x79B8, - 0x5073: 0x79BB, - 0x5074: 0x79C2, - 0x5075: 0x79C4, - 0x5076: 0x79C7, - 0x5077: 0x79C8, - 0x5078: 0x79CA, - 0x5079: 0x79CF, - 0x507A: 0x79D4, - 0x507B: 0x79D6, - 0x507C: 0x79DA, - 0x507D: 0x79DD, - 0x507E: 0x79DE, - 0x5121: 0x79E0, - 0x5122: 0x79E2, - 0x5123: 0x79E5, - 0x5124: 0x79EA, - 0x5125: 0x79EB, - 0x5126: 0x79ED, - 0x5127: 0x79F1, - 0x5128: 0x79F8, - 0x5129: 0x79FC, - 0x512A: 0x7A02, - 0x512B: 0x7A03, - 0x512C: 0x7A07, - 0x512D: 0x7A09, - 0x512E: 0x7A0A, - 0x512F: 0x7A0C, - 0x5130: 0x7A11, - 0x5131: 0x7A15, - 0x5132: 0x7A1B, - 0x5133: 0x7A1E, - 0x5134: 0x7A21, - 0x5135: 0x7A27, - 0x5136: 0x7A2B, - 0x5137: 0x7A2D, - 0x5138: 0x7A2F, - 0x5139: 0x7A30, - 0x513A: 0x7A34, - 0x513B: 0x7A35, - 0x513C: 0x7A38, - 0x513D: 0x7A39, - 0x513E: 0x7A3A, - 0x513F: 0x7A44, - 0x5140: 0x7A45, - 0x5141: 0x7A47, - 0x5142: 0x7A48, - 0x5143: 0x7A4C, - 0x5144: 0x7A55, - 0x5145: 0x7A56, - 0x5146: 0x7A59, - 0x5147: 0x7A5C, - 0x5148: 0x7A5D, - 0x5149: 0x7A5F, - 0x514A: 0x7A60, - 0x514B: 0x7A65, - 0x514C: 0x7A67, - 0x514D: 0x7A6A, - 0x514E: 0x7A6D, - 0x514F: 0x7A75, - 0x5150: 0x7A78, - 0x5151: 0x7A7E, - 0x5152: 0x7A80, - 0x5153: 0x7A82, - 0x5154: 0x7A85, - 0x5155: 0x7A86, - 0x5156: 0x7A8A, - 0x5157: 0x7A8B, - 0x5158: 0x7A90, - 0x5159: 0x7A91, - 0x515A: 0x7A94, - 0x515B: 0x7A9E, - 0x515C: 0x7AA0, - 0x515D: 0x7AA3, - 0x515E: 0x7AAC, - 0x515F: 0x7AB3, - 0x5160: 0x7AB5, - 0x5161: 0x7AB9, - 0x5162: 0x7ABB, - 0x5163: 0x7ABC, - 0x5164: 0x7AC6, - 0x5165: 0x7AC9, - 0x5166: 0x7ACC, - 0x5167: 0x7ACE, - 0x5168: 0x7AD1, - 0x5169: 0x7ADB, - 0x516A: 0x7AE8, - 0x516B: 0x7AE9, - 0x516C: 0x7AEB, - 0x516D: 0x7AEC, - 0x516E: 0x7AF1, - 0x516F: 0x7AF4, - 0x5170: 0x7AFB, - 0x5171: 0x7AFD, - 0x5172: 0x7AFE, - 0x5173: 0x7B07, - 0x5174: 0x7B14, - 0x5175: 0x7B1F, - 0x5176: 0x7B23, - 0x5177: 0x7B27, - 0x5178: 0x7B29, - 0x5179: 0x7B2A, - 0x517A: 0x7B2B, - 0x517B: 0x7B2D, - 0x517C: 0x7B2E, - 0x517D: 0x7B2F, - 0x517E: 0x7B30, - 0x5221: 0x7B31, - 0x5222: 0x7B34, - 0x5223: 0x7B3D, - 0x5224: 0x7B3F, - 0x5225: 0x7B40, - 0x5226: 0x7B41, - 0x5227: 0x7B47, - 0x5228: 0x7B4E, - 0x5229: 0x7B55, - 0x522A: 0x7B60, - 0x522B: 0x7B64, - 0x522C: 0x7B66, - 0x522D: 0x7B69, - 0x522E: 0x7B6A, - 0x522F: 0x7B6D, - 0x5230: 0x7B6F, - 0x5231: 0x7B72, - 0x5232: 0x7B73, - 0x5233: 0x7B77, - 0x5234: 0x7B84, - 0x5235: 0x7B89, - 0x5236: 0x7B8E, - 0x5237: 0x7B90, - 0x5238: 0x7B91, - 0x5239: 0x7B96, - 0x523A: 0x7B9B, - 0x523B: 0x7B9E, - 0x523C: 0x7BA0, - 0x523D: 0x7BA5, - 0x523E: 0x7BAC, - 0x523F: 0x7BAF, - 0x5240: 0x7BB0, - 0x5241: 0x7BB2, - 0x5242: 0x7BB5, - 0x5243: 0x7BB6, - 0x5244: 0x7BBA, - 0x5245: 0x7BBB, - 0x5246: 0x7BBC, - 0x5247: 0x7BBD, - 0x5248: 0x7BC2, - 0x5249: 0x7BC5, - 0x524A: 0x7BC8, - 0x524B: 0x7BCA, - 0x524C: 0x7BD4, - 0x524D: 0x7BD6, - 0x524E: 0x7BD7, - 0x524F: 0x7BD9, - 0x5250: 0x7BDA, - 0x5251: 0x7BDB, - 0x5252: 0x7BE8, - 0x5253: 0x7BEA, - 0x5254: 0x7BF2, - 0x5255: 0x7BF4, - 0x5256: 0x7BF5, - 0x5257: 0x7BF8, - 0x5258: 0x7BF9, - 0x5259: 0x7BFA, - 0x525A: 0x7BFC, - 0x525B: 0x7BFE, - 0x525C: 0x7C01, - 0x525D: 0x7C02, - 0x525E: 0x7C03, - 0x525F: 0x7C04, - 0x5260: 0x7C06, - 0x5261: 0x7C09, - 0x5262: 0x7C0B, - 0x5263: 0x7C0C, - 0x5264: 0x7C0E, - 0x5265: 0x7C0F, - 0x5266: 0x7C19, - 0x5267: 0x7C1B, - 0x5268: 0x7C20, - 0x5269: 0x7C25, - 0x526A: 0x7C26, - 0x526B: 0x7C28, - 0x526C: 0x7C2C, - 0x526D: 0x7C31, - 0x526E: 0x7C33, - 0x526F: 0x7C34, - 0x5270: 0x7C36, - 0x5271: 0x7C39, - 0x5272: 0x7C3A, - 0x5273: 0x7C46, - 0x5274: 0x7C4A, - 0x5275: 0x7C55, - 0x5276: 0x7C51, - 0x5277: 0x7C52, - 0x5278: 0x7C53, - 0x5279: 0x7C59, - 0x527A: 0x7C5A, - 0x527B: 0x7C5B, - 0x527C: 0x7C5C, - 0x527D: 0x7C5D, - 0x527E: 0x7C5E, - 0x5321: 0x7C61, - 0x5322: 0x7C63, - 0x5323: 0x7C67, - 0x5324: 0x7C69, - 0x5325: 0x7C6D, - 0x5326: 0x7C6E, - 0x5327: 0x7C70, - 0x5328: 0x7C72, - 0x5329: 0x7C79, - 0x532A: 0x7C7C, - 0x532B: 0x7C7D, - 0x532C: 0x7C86, - 0x532D: 0x7C87, - 0x532E: 0x7C8F, - 0x532F: 0x7C94, - 0x5330: 0x7C9E, - 0x5331: 0x7CA0, - 0x5332: 0x7CA6, - 0x5333: 0x7CB0, - 0x5334: 0x7CB6, - 0x5335: 0x7CB7, - 0x5336: 0x7CBA, - 0x5337: 0x7CBB, - 0x5338: 0x7CBC, - 0x5339: 0x7CBF, - 0x533A: 0x7CC4, - 0x533B: 0x7CC7, - 0x533C: 0x7CC8, - 0x533D: 0x7CC9, - 0x533E: 0x7CCD, - 0x533F: 0x7CCF, - 0x5340: 0x7CD3, - 0x5341: 0x7CD4, - 0x5342: 0x7CD5, - 0x5343: 0x7CD7, - 0x5344: 0x7CD9, - 0x5345: 0x7CDA, - 0x5346: 0x7CDD, - 0x5347: 0x7CE6, - 0x5348: 0x7CE9, - 0x5349: 0x7CEB, - 0x534A: 0x7CF5, - 0x534B: 0x7D03, - 0x534C: 0x7D07, - 0x534D: 0x7D08, - 0x534E: 0x7D09, - 0x534F: 0x7D0F, - 0x5350: 0x7D11, - 0x5351: 0x7D12, - 0x5352: 0x7D13, - 0x5353: 0x7D16, - 0x5354: 0x7D1D, - 0x5355: 0x7D1E, - 0x5356: 0x7D23, - 0x5357: 0x7D26, - 0x5358: 0x7D2A, - 0x5359: 0x7D2D, - 0x535A: 0x7D31, - 0x535B: 0x7D3C, - 0x535C: 0x7D3D, - 0x535D: 0x7D3E, - 0x535E: 0x7D40, - 0x535F: 0x7D41, - 0x5360: 0x7D47, - 0x5361: 0x7D48, - 0x5362: 0x7D4D, - 0x5363: 0x7D51, - 0x5364: 0x7D53, - 0x5365: 0x7D57, - 0x5366: 0x7D59, - 0x5367: 0x7D5A, - 0x5368: 0x7D5C, - 0x5369: 0x7D5D, - 0x536A: 0x7D65, - 0x536B: 0x7D67, - 0x536C: 0x7D6A, - 0x536D: 0x7D70, - 0x536E: 0x7D78, - 0x536F: 0x7D7A, - 0x5370: 0x7D7B, - 0x5371: 0x7D7F, - 0x5372: 0x7D81, - 0x5373: 0x7D82, - 0x5374: 0x7D83, - 0x5375: 0x7D85, - 0x5376: 0x7D86, - 0x5377: 0x7D88, - 0x5378: 0x7D8B, - 0x5379: 0x7D8C, - 0x537A: 0x7D8D, - 0x537B: 0x7D91, - 0x537C: 0x7D96, - 0x537D: 0x7D97, - 0x537E: 0x7D9D, - 0x5421: 0x7D9E, - 0x5422: 0x7DA6, - 0x5423: 0x7DA7, - 0x5424: 0x7DAA, - 0x5425: 0x7DB3, - 0x5426: 0x7DB6, - 0x5427: 0x7DB7, - 0x5428: 0x7DB9, - 0x5429: 0x7DC2, - 0x542A: 0x7DC3, - 0x542B: 0x7DC4, - 0x542C: 0x7DC5, - 0x542D: 0x7DC6, - 0x542E: 0x7DCC, - 0x542F: 0x7DCD, - 0x5430: 0x7DCE, - 0x5431: 0x7DD7, - 0x5432: 0x7DD9, - 0x5433: 0x7E00, - 0x5434: 0x7DE2, - 0x5435: 0x7DE5, - 0x5436: 0x7DE6, - 0x5437: 0x7DEA, - 0x5438: 0x7DEB, - 0x5439: 0x7DED, - 0x543A: 0x7DF1, - 0x543B: 0x7DF5, - 0x543C: 0x7DF6, - 0x543D: 0x7DF9, - 0x543E: 0x7DFA, - 0x543F: 0x7E08, - 0x5440: 0x7E10, - 0x5441: 0x7E11, - 0x5442: 0x7E15, - 0x5443: 0x7E17, - 0x5444: 0x7E1C, - 0x5445: 0x7E1D, - 0x5446: 0x7E20, - 0x5447: 0x7E27, - 0x5448: 0x7E28, - 0x5449: 0x7E2C, - 0x544A: 0x7E2D, - 0x544B: 0x7E2F, - 0x544C: 0x7E33, - 0x544D: 0x7E36, - 0x544E: 0x7E3F, - 0x544F: 0x7E44, - 0x5450: 0x7E45, - 0x5451: 0x7E47, - 0x5452: 0x7E4E, - 0x5453: 0x7E50, - 0x5454: 0x7E52, - 0x5455: 0x7E58, - 0x5456: 0x7E5F, - 0x5457: 0x7E61, - 0x5458: 0x7E62, - 0x5459: 0x7E65, - 0x545A: 0x7E6B, - 0x545B: 0x7E6E, - 0x545C: 0x7E6F, - 0x545D: 0x7E73, - 0x545E: 0x7E78, - 0x545F: 0x7E7E, - 0x5460: 0x7E81, - 0x5461: 0x7E86, - 0x5462: 0x7E87, - 0x5463: 0x7E8A, - 0x5464: 0x7E8D, - 0x5465: 0x7E91, - 0x5466: 0x7E95, - 0x5467: 0x7E98, - 0x5468: 0x7E9A, - 0x5469: 0x7E9D, - 0x546A: 0x7E9E, - 0x546B: 0x7F3C, - 0x546C: 0x7F3B, - 0x546D: 0x7F3D, - 0x546E: 0x7F3E, - 0x546F: 0x7F3F, - 0x5470: 0x7F43, - 0x5471: 0x7F44, - 0x5472: 0x7F47, - 0x5473: 0x7F4F, - 0x5474: 0x7F52, - 0x5475: 0x7F53, - 0x5476: 0x7F5B, - 0x5477: 0x7F5C, - 0x5478: 0x7F5D, - 0x5479: 0x7F61, - 0x547A: 0x7F63, - 0x547B: 0x7F64, - 0x547C: 0x7F65, - 0x547D: 0x7F66, - 0x547E: 0x7F6D, - 0x5521: 0x7F71, - 0x5522: 0x7F7D, - 0x5523: 0x7F7E, - 0x5524: 0x7F7F, - 0x5525: 0x7F80, - 0x5526: 0x7F8B, - 0x5527: 0x7F8D, - 0x5528: 0x7F8F, - 0x5529: 0x7F90, - 0x552A: 0x7F91, - 0x552B: 0x7F96, - 0x552C: 0x7F97, - 0x552D: 0x7F9C, - 0x552E: 0x7FA1, - 0x552F: 0x7FA2, - 0x5530: 0x7FA6, - 0x5531: 0x7FAA, - 0x5532: 0x7FAD, - 0x5533: 0x7FB4, - 0x5534: 0x7FBC, - 0x5535: 0x7FBF, - 0x5536: 0x7FC0, - 0x5537: 0x7FC3, - 0x5538: 0x7FC8, - 0x5539: 0x7FCE, - 0x553A: 0x7FCF, - 0x553B: 0x7FDB, - 0x553C: 0x7FDF, - 0x553D: 0x7FE3, - 0x553E: 0x7FE5, - 0x553F: 0x7FE8, - 0x5540: 0x7FEC, - 0x5541: 0x7FEE, - 0x5542: 0x7FEF, - 0x5543: 0x7FF2, - 0x5544: 0x7FFA, - 0x5545: 0x7FFD, - 0x5546: 0x7FFE, - 0x5547: 0x7FFF, - 0x5548: 0x8007, - 0x5549: 0x8008, - 0x554A: 0x800A, - 0x554B: 0x800D, - 0x554C: 0x800E, - 0x554D: 0x800F, - 0x554E: 0x8011, - 0x554F: 0x8013, - 0x5550: 0x8014, - 0x5551: 0x8016, - 0x5552: 0x801D, - 0x5553: 0x801E, - 0x5554: 0x801F, - 0x5555: 0x8020, - 0x5556: 0x8024, - 0x5557: 0x8026, - 0x5558: 0x802C, - 0x5559: 0x802E, - 0x555A: 0x8030, - 0x555B: 0x8034, - 0x555C: 0x8035, - 0x555D: 0x8037, - 0x555E: 0x8039, - 0x555F: 0x803A, - 0x5560: 0x803C, - 0x5561: 0x803E, - 0x5562: 0x8040, - 0x5563: 0x8044, - 0x5564: 0x8060, - 0x5565: 0x8064, - 0x5566: 0x8066, - 0x5567: 0x806D, - 0x5568: 0x8071, - 0x5569: 0x8075, - 0x556A: 0x8081, - 0x556B: 0x8088, - 0x556C: 0x808E, - 0x556D: 0x809C, - 0x556E: 0x809E, - 0x556F: 0x80A6, - 0x5570: 0x80A7, - 0x5571: 0x80AB, - 0x5572: 0x80B8, - 0x5573: 0x80B9, - 0x5574: 0x80C8, - 0x5575: 0x80CD, - 0x5576: 0x80CF, - 0x5577: 0x80D2, - 0x5578: 0x80D4, - 0x5579: 0x80D5, - 0x557A: 0x80D7, - 0x557B: 0x80D8, - 0x557C: 0x80E0, - 0x557D: 0x80ED, - 0x557E: 0x80EE, - 0x5621: 0x80F0, - 0x5622: 0x80F2, - 0x5623: 0x80F3, - 0x5624: 0x80F6, - 0x5625: 0x80F9, - 0x5626: 0x80FA, - 0x5627: 0x80FE, - 0x5628: 0x8103, - 0x5629: 0x810B, - 0x562A: 0x8116, - 0x562B: 0x8117, - 0x562C: 0x8118, - 0x562D: 0x811C, - 0x562E: 0x811E, - 0x562F: 0x8120, - 0x5630: 0x8124, - 0x5631: 0x8127, - 0x5632: 0x812C, - 0x5633: 0x8130, - 0x5634: 0x8135, - 0x5635: 0x813A, - 0x5636: 0x813C, - 0x5637: 0x8145, - 0x5638: 0x8147, - 0x5639: 0x814A, - 0x563A: 0x814C, - 0x563B: 0x8152, - 0x563C: 0x8157, - 0x563D: 0x8160, - 0x563E: 0x8161, - 0x563F: 0x8167, - 0x5640: 0x8168, - 0x5641: 0x8169, - 0x5642: 0x816D, - 0x5643: 0x816F, - 0x5644: 0x8177, - 0x5645: 0x8181, - 0x5646: 0x8190, - 0x5647: 0x8184, - 0x5648: 0x8185, - 0x5649: 0x8186, - 0x564A: 0x818B, - 0x564B: 0x818E, - 0x564C: 0x8196, - 0x564D: 0x8198, - 0x564E: 0x819B, - 0x564F: 0x819E, - 0x5650: 0x81A2, - 0x5651: 0x81AE, - 0x5652: 0x81B2, - 0x5653: 0x81B4, - 0x5654: 0x81BB, - 0x5655: 0x81CB, - 0x5656: 0x81C3, - 0x5657: 0x81C5, - 0x5658: 0x81CA, - 0x5659: 0x81CE, - 0x565A: 0x81CF, - 0x565B: 0x81D5, - 0x565C: 0x81D7, - 0x565D: 0x81DB, - 0x565E: 0x81DD, - 0x565F: 0x81DE, - 0x5660: 0x81E1, - 0x5661: 0x81E4, - 0x5662: 0x81EB, - 0x5663: 0x81EC, - 0x5664: 0x81F0, - 0x5665: 0x81F1, - 0x5666: 0x81F2, - 0x5667: 0x81F5, - 0x5668: 0x81F6, - 0x5669: 0x81F8, - 0x566A: 0x81F9, - 0x566B: 0x81FD, - 0x566C: 0x81FF, - 0x566D: 0x8200, - 0x566E: 0x8203, - 0x566F: 0x820F, - 0x5670: 0x8213, - 0x5671: 0x8214, - 0x5672: 0x8219, - 0x5673: 0x821A, - 0x5674: 0x821D, - 0x5675: 0x8221, - 0x5676: 0x8222, - 0x5677: 0x8228, - 0x5678: 0x8232, - 0x5679: 0x8234, - 0x567A: 0x823A, - 0x567B: 0x8243, - 0x567C: 0x8244, - 0x567D: 0x8245, - 0x567E: 0x8246, - 0x5721: 0x824B, - 0x5722: 0x824E, - 0x5723: 0x824F, - 0x5724: 0x8251, - 0x5725: 0x8256, - 0x5726: 0x825C, - 0x5727: 0x8260, - 0x5728: 0x8263, - 0x5729: 0x8267, - 0x572A: 0x826D, - 0x572B: 0x8274, - 0x572C: 0x827B, - 0x572D: 0x827D, - 0x572E: 0x827F, - 0x572F: 0x8280, - 0x5730: 0x8281, - 0x5731: 0x8283, - 0x5732: 0x8284, - 0x5733: 0x8287, - 0x5734: 0x8289, - 0x5735: 0x828A, - 0x5736: 0x828E, - 0x5737: 0x8291, - 0x5738: 0x8294, - 0x5739: 0x8296, - 0x573A: 0x8298, - 0x573B: 0x829A, - 0x573C: 0x829B, - 0x573D: 0x82A0, - 0x573E: 0x82A1, - 0x573F: 0x82A3, - 0x5740: 0x82A4, - 0x5741: 0x82A7, - 0x5742: 0x82A8, - 0x5743: 0x82A9, - 0x5744: 0x82AA, - 0x5745: 0x82AE, - 0x5746: 0x82B0, - 0x5747: 0x82B2, - 0x5748: 0x82B4, - 0x5749: 0x82B7, - 0x574A: 0x82BA, - 0x574B: 0x82BC, - 0x574C: 0x82BE, - 0x574D: 0x82BF, - 0x574E: 0x82C6, - 0x574F: 0x82D0, - 0x5750: 0x82D5, - 0x5751: 0x82DA, - 0x5752: 0x82E0, - 0x5753: 0x82E2, - 0x5754: 0x82E4, - 0x5755: 0x82E8, - 0x5756: 0x82EA, - 0x5757: 0x82ED, - 0x5758: 0x82EF, - 0x5759: 0x82F6, - 0x575A: 0x82F7, - 0x575B: 0x82FD, - 0x575C: 0x82FE, - 0x575D: 0x8300, - 0x575E: 0x8301, - 0x575F: 0x8307, - 0x5760: 0x8308, - 0x5761: 0x830A, - 0x5762: 0x830B, - 0x5763: 0x8354, - 0x5764: 0x831B, - 0x5765: 0x831D, - 0x5766: 0x831E, - 0x5767: 0x831F, - 0x5768: 0x8321, - 0x5769: 0x8322, - 0x576A: 0x832C, - 0x576B: 0x832D, - 0x576C: 0x832E, - 0x576D: 0x8330, - 0x576E: 0x8333, - 0x576F: 0x8337, - 0x5770: 0x833A, - 0x5771: 0x833C, - 0x5772: 0x833D, - 0x5773: 0x8342, - 0x5774: 0x8343, - 0x5775: 0x8344, - 0x5776: 0x8347, - 0x5777: 0x834D, - 0x5778: 0x834E, - 0x5779: 0x8351, - 0x577A: 0x8355, - 0x577B: 0x8356, - 0x577C: 0x8357, - 0x577D: 0x8370, - 0x577E: 0x8378, - 0x5821: 0x837D, - 0x5822: 0x837F, - 0x5823: 0x8380, - 0x5824: 0x8382, - 0x5825: 0x8384, - 0x5826: 0x8386, - 0x5827: 0x838D, - 0x5828: 0x8392, - 0x5829: 0x8394, - 0x582A: 0x8395, - 0x582B: 0x8398, - 0x582C: 0x8399, - 0x582D: 0x839B, - 0x582E: 0x839C, - 0x582F: 0x839D, - 0x5830: 0x83A6, - 0x5831: 0x83A7, - 0x5832: 0x83A9, - 0x5833: 0x83AC, - 0x5834: 0x83BE, - 0x5835: 0x83BF, - 0x5836: 0x83C0, - 0x5837: 0x83C7, - 0x5838: 0x83C9, - 0x5839: 0x83CF, - 0x583A: 0x83D0, - 0x583B: 0x83D1, - 0x583C: 0x83D4, - 0x583D: 0x83DD, - 0x583E: 0x8353, - 0x583F: 0x83E8, - 0x5840: 0x83EA, - 0x5841: 0x83F6, - 0x5842: 0x83F8, - 0x5843: 0x83F9, - 0x5844: 0x83FC, - 0x5845: 0x8401, - 0x5846: 0x8406, - 0x5847: 0x840A, - 0x5848: 0x840F, - 0x5849: 0x8411, - 0x584A: 0x8415, - 0x584B: 0x8419, - 0x584C: 0x83AD, - 0x584D: 0x842F, - 0x584E: 0x8439, - 0x584F: 0x8445, - 0x5850: 0x8447, - 0x5851: 0x8448, - 0x5852: 0x844A, - 0x5853: 0x844D, - 0x5854: 0x844F, - 0x5855: 0x8451, - 0x5856: 0x8452, - 0x5857: 0x8456, - 0x5858: 0x8458, - 0x5859: 0x8459, - 0x585A: 0x845A, - 0x585B: 0x845C, - 0x585C: 0x8460, - 0x585D: 0x8464, - 0x585E: 0x8465, - 0x585F: 0x8467, - 0x5860: 0x846A, - 0x5861: 0x8470, - 0x5862: 0x8473, - 0x5863: 0x8474, - 0x5864: 0x8476, - 0x5865: 0x8478, - 0x5866: 0x847C, - 0x5867: 0x847D, - 0x5868: 0x8481, - 0x5869: 0x8485, - 0x586A: 0x8492, - 0x586B: 0x8493, - 0x586C: 0x8495, - 0x586D: 0x849E, - 0x586E: 0x84A6, - 0x586F: 0x84A8, - 0x5870: 0x84A9, - 0x5871: 0x84AA, - 0x5872: 0x84AF, - 0x5873: 0x84B1, - 0x5874: 0x84B4, - 0x5875: 0x84BA, - 0x5876: 0x84BD, - 0x5877: 0x84BE, - 0x5878: 0x84C0, - 0x5879: 0x84C2, - 0x587A: 0x84C7, - 0x587B: 0x84C8, - 0x587C: 0x84CC, - 0x587D: 0x84CF, - 0x587E: 0x84D3, - 0x5921: 0x84DC, - 0x5922: 0x84E7, - 0x5923: 0x84EA, - 0x5924: 0x84EF, - 0x5925: 0x84F0, - 0x5926: 0x84F1, - 0x5927: 0x84F2, - 0x5928: 0x84F7, - 0x5929: 0x8532, - 0x592A: 0x84FA, - 0x592B: 0x84FB, - 0x592C: 0x84FD, - 0x592D: 0x8502, - 0x592E: 0x8503, - 0x592F: 0x8507, - 0x5930: 0x850C, - 0x5931: 0x850E, - 0x5932: 0x8510, - 0x5933: 0x851C, - 0x5934: 0x851E, - 0x5935: 0x8522, - 0x5936: 0x8523, - 0x5937: 0x8524, - 0x5938: 0x8525, - 0x5939: 0x8527, - 0x593A: 0x852A, - 0x593B: 0x852B, - 0x593C: 0x852F, - 0x593D: 0x8533, - 0x593E: 0x8534, - 0x593F: 0x8536, - 0x5940: 0x853F, - 0x5941: 0x8546, - 0x5942: 0x854F, - 0x5943: 0x8550, - 0x5944: 0x8551, - 0x5945: 0x8552, - 0x5946: 0x8553, - 0x5947: 0x8556, - 0x5948: 0x8559, - 0x5949: 0x855C, - 0x594A: 0x855D, - 0x594B: 0x855E, - 0x594C: 0x855F, - 0x594D: 0x8560, - 0x594E: 0x8561, - 0x594F: 0x8562, - 0x5950: 0x8564, - 0x5951: 0x856B, - 0x5952: 0x856F, - 0x5953: 0x8579, - 0x5954: 0x857A, - 0x5955: 0x857B, - 0x5956: 0x857D, - 0x5957: 0x857F, - 0x5958: 0x8581, - 0x5959: 0x8585, - 0x595A: 0x8586, - 0x595B: 0x8589, - 0x595C: 0x858B, - 0x595D: 0x858C, - 0x595E: 0x858F, - 0x595F: 0x8593, - 0x5960: 0x8598, - 0x5961: 0x859D, - 0x5962: 0x859F, - 0x5963: 0x85A0, - 0x5964: 0x85A2, - 0x5965: 0x85A5, - 0x5966: 0x85A7, - 0x5967: 0x85B4, - 0x5968: 0x85B6, - 0x5969: 0x85B7, - 0x596A: 0x85B8, - 0x596B: 0x85BC, - 0x596C: 0x85BD, - 0x596D: 0x85BE, - 0x596E: 0x85BF, - 0x596F: 0x85C2, - 0x5970: 0x85C7, - 0x5971: 0x85CA, - 0x5972: 0x85CB, - 0x5973: 0x85CE, - 0x5974: 0x85AD, - 0x5975: 0x85D8, - 0x5976: 0x85DA, - 0x5977: 0x85DF, - 0x5978: 0x85E0, - 0x5979: 0x85E6, - 0x597A: 0x85E8, - 0x597B: 0x85ED, - 0x597C: 0x85F3, - 0x597D: 0x85F6, - 0x597E: 0x85FC, - 0x5A21: 0x85FF, - 0x5A22: 0x8600, - 0x5A23: 0x8604, - 0x5A24: 0x8605, - 0x5A25: 0x860D, - 0x5A26: 0x860E, - 0x5A27: 0x8610, - 0x5A28: 0x8611, - 0x5A29: 0x8612, - 0x5A2A: 0x8618, - 0x5A2B: 0x8619, - 0x5A2C: 0x861B, - 0x5A2D: 0x861E, - 0x5A2E: 0x8621, - 0x5A2F: 0x8627, - 0x5A30: 0x8629, - 0x5A31: 0x8636, - 0x5A32: 0x8638, - 0x5A33: 0x863A, - 0x5A34: 0x863C, - 0x5A35: 0x863D, - 0x5A36: 0x8640, - 0x5A37: 0x8642, - 0x5A38: 0x8646, - 0x5A39: 0x8652, - 0x5A3A: 0x8653, - 0x5A3B: 0x8656, - 0x5A3C: 0x8657, - 0x5A3D: 0x8658, - 0x5A3E: 0x8659, - 0x5A3F: 0x865D, - 0x5A40: 0x8660, - 0x5A41: 0x8661, - 0x5A42: 0x8662, - 0x5A43: 0x8663, - 0x5A44: 0x8664, - 0x5A45: 0x8669, - 0x5A46: 0x866C, - 0x5A47: 0x866F, - 0x5A48: 0x8675, - 0x5A49: 0x8676, - 0x5A4A: 0x8677, - 0x5A4B: 0x867A, - 0x5A4C: 0x868D, - 0x5A4D: 0x8691, - 0x5A4E: 0x8696, - 0x5A4F: 0x8698, - 0x5A50: 0x869A, - 0x5A51: 0x869C, - 0x5A52: 0x86A1, - 0x5A53: 0x86A6, - 0x5A54: 0x86A7, - 0x5A55: 0x86A8, - 0x5A56: 0x86AD, - 0x5A57: 0x86B1, - 0x5A58: 0x86B3, - 0x5A59: 0x86B4, - 0x5A5A: 0x86B5, - 0x5A5B: 0x86B7, - 0x5A5C: 0x86B8, - 0x5A5D: 0x86B9, - 0x5A5E: 0x86BF, - 0x5A5F: 0x86C0, - 0x5A60: 0x86C1, - 0x5A61: 0x86C3, - 0x5A62: 0x86C5, - 0x5A63: 0x86D1, - 0x5A64: 0x86D2, - 0x5A65: 0x86D5, - 0x5A66: 0x86D7, - 0x5A67: 0x86DA, - 0x5A68: 0x86DC, - 0x5A69: 0x86E0, - 0x5A6A: 0x86E3, - 0x5A6B: 0x86E5, - 0x5A6C: 0x86E7, - 0x5A6D: 0x8688, - 0x5A6E: 0x86FA, - 0x5A6F: 0x86FC, - 0x5A70: 0x86FD, - 0x5A71: 0x8704, - 0x5A72: 0x8705, - 0x5A73: 0x8707, - 0x5A74: 0x870B, - 0x5A75: 0x870E, - 0x5A76: 0x870F, - 0x5A77: 0x8710, - 0x5A78: 0x8713, - 0x5A79: 0x8714, - 0x5A7A: 0x8719, - 0x5A7B: 0x871E, - 0x5A7C: 0x871F, - 0x5A7D: 0x8721, - 0x5A7E: 0x8723, - 0x5B21: 0x8728, - 0x5B22: 0x872E, - 0x5B23: 0x872F, - 0x5B24: 0x8731, - 0x5B25: 0x8732, - 0x5B26: 0x8739, - 0x5B27: 0x873A, - 0x5B28: 0x873C, - 0x5B29: 0x873D, - 0x5B2A: 0x873E, - 0x5B2B: 0x8740, - 0x5B2C: 0x8743, - 0x5B2D: 0x8745, - 0x5B2E: 0x874D, - 0x5B2F: 0x8758, - 0x5B30: 0x875D, - 0x5B31: 0x8761, - 0x5B32: 0x8764, - 0x5B33: 0x8765, - 0x5B34: 0x876F, - 0x5B35: 0x8771, - 0x5B36: 0x8772, - 0x5B37: 0x877B, - 0x5B38: 0x8783, - 0x5B39: 0x8784, - 0x5B3A: 0x8785, - 0x5B3B: 0x8786, - 0x5B3C: 0x8787, - 0x5B3D: 0x8788, - 0x5B3E: 0x8789, - 0x5B3F: 0x878B, - 0x5B40: 0x878C, - 0x5B41: 0x8790, - 0x5B42: 0x8793, - 0x5B43: 0x8795, - 0x5B44: 0x8797, - 0x5B45: 0x8798, - 0x5B46: 0x8799, - 0x5B47: 0x879E, - 0x5B48: 0x87A0, - 0x5B49: 0x87A3, - 0x5B4A: 0x87A7, - 0x5B4B: 0x87AC, - 0x5B4C: 0x87AD, - 0x5B4D: 0x87AE, - 0x5B4E: 0x87B1, - 0x5B4F: 0x87B5, - 0x5B50: 0x87BE, - 0x5B51: 0x87BF, - 0x5B52: 0x87C1, - 0x5B53: 0x87C8, - 0x5B54: 0x87C9, - 0x5B55: 0x87CA, - 0x5B56: 0x87CE, - 0x5B57: 0x87D5, - 0x5B58: 0x87D6, - 0x5B59: 0x87D9, - 0x5B5A: 0x87DA, - 0x5B5B: 0x87DC, - 0x5B5C: 0x87DF, - 0x5B5D: 0x87E2, - 0x5B5E: 0x87E3, - 0x5B5F: 0x87E4, - 0x5B60: 0x87EA, - 0x5B61: 0x87EB, - 0x5B62: 0x87ED, - 0x5B63: 0x87F1, - 0x5B64: 0x87F3, - 0x5B65: 0x87F8, - 0x5B66: 0x87FA, - 0x5B67: 0x87FF, - 0x5B68: 0x8801, - 0x5B69: 0x8803, - 0x5B6A: 0x8806, - 0x5B6B: 0x8809, - 0x5B6C: 0x880A, - 0x5B6D: 0x880B, - 0x5B6E: 0x8810, - 0x5B6F: 0x8819, - 0x5B70: 0x8812, - 0x5B71: 0x8813, - 0x5B72: 0x8814, - 0x5B73: 0x8818, - 0x5B74: 0x881A, - 0x5B75: 0x881B, - 0x5B76: 0x881C, - 0x5B77: 0x881E, - 0x5B78: 0x881F, - 0x5B79: 0x8828, - 0x5B7A: 0x882D, - 0x5B7B: 0x882E, - 0x5B7C: 0x8830, - 0x5B7D: 0x8832, - 0x5B7E: 0x8835, - 0x5C21: 0x883A, - 0x5C22: 0x883C, - 0x5C23: 0x8841, - 0x5C24: 0x8843, - 0x5C25: 0x8845, - 0x5C26: 0x8848, - 0x5C27: 0x8849, - 0x5C28: 0x884A, - 0x5C29: 0x884B, - 0x5C2A: 0x884E, - 0x5C2B: 0x8851, - 0x5C2C: 0x8855, - 0x5C2D: 0x8856, - 0x5C2E: 0x8858, - 0x5C2F: 0x885A, - 0x5C30: 0x885C, - 0x5C31: 0x885F, - 0x5C32: 0x8860, - 0x5C33: 0x8864, - 0x5C34: 0x8869, - 0x5C35: 0x8871, - 0x5C36: 0x8879, - 0x5C37: 0x887B, - 0x5C38: 0x8880, - 0x5C39: 0x8898, - 0x5C3A: 0x889A, - 0x5C3B: 0x889B, - 0x5C3C: 0x889C, - 0x5C3D: 0x889F, - 0x5C3E: 0x88A0, - 0x5C3F: 0x88A8, - 0x5C40: 0x88AA, - 0x5C41: 0x88BA, - 0x5C42: 0x88BD, - 0x5C43: 0x88BE, - 0x5C44: 0x88C0, - 0x5C45: 0x88CA, - 0x5C46: 0x88CB, - 0x5C47: 0x88CC, - 0x5C48: 0x88CD, - 0x5C49: 0x88CE, - 0x5C4A: 0x88D1, - 0x5C4B: 0x88D2, - 0x5C4C: 0x88D3, - 0x5C4D: 0x88DB, - 0x5C4E: 0x88DE, - 0x5C4F: 0x88E7, - 0x5C50: 0x88EF, - 0x5C51: 0x88F0, - 0x5C52: 0x88F1, - 0x5C53: 0x88F5, - 0x5C54: 0x88F7, - 0x5C55: 0x8901, - 0x5C56: 0x8906, - 0x5C57: 0x890D, - 0x5C58: 0x890E, - 0x5C59: 0x890F, - 0x5C5A: 0x8915, - 0x5C5B: 0x8916, - 0x5C5C: 0x8918, - 0x5C5D: 0x8919, - 0x5C5E: 0x891A, - 0x5C5F: 0x891C, - 0x5C60: 0x8920, - 0x5C61: 0x8926, - 0x5C62: 0x8927, - 0x5C63: 0x8928, - 0x5C64: 0x8930, - 0x5C65: 0x8931, - 0x5C66: 0x8932, - 0x5C67: 0x8935, - 0x5C68: 0x8939, - 0x5C69: 0x893A, - 0x5C6A: 0x893E, - 0x5C6B: 0x8940, - 0x5C6C: 0x8942, - 0x5C6D: 0x8945, - 0x5C6E: 0x8946, - 0x5C6F: 0x8949, - 0x5C70: 0x894F, - 0x5C71: 0x8952, - 0x5C72: 0x8957, - 0x5C73: 0x895A, - 0x5C74: 0x895B, - 0x5C75: 0x895C, - 0x5C76: 0x8961, - 0x5C77: 0x8962, - 0x5C78: 0x8963, - 0x5C79: 0x896B, - 0x5C7A: 0x896E, - 0x5C7B: 0x8970, - 0x5C7C: 0x8973, - 0x5C7D: 0x8975, - 0x5C7E: 0x897A, - 0x5D21: 0x897B, - 0x5D22: 0x897C, - 0x5D23: 0x897D, - 0x5D24: 0x8989, - 0x5D25: 0x898D, - 0x5D26: 0x8990, - 0x5D27: 0x8994, - 0x5D28: 0x8995, - 0x5D29: 0x899B, - 0x5D2A: 0x899C, - 0x5D2B: 0x899F, - 0x5D2C: 0x89A0, - 0x5D2D: 0x89A5, - 0x5D2E: 0x89B0, - 0x5D2F: 0x89B4, - 0x5D30: 0x89B5, - 0x5D31: 0x89B6, - 0x5D32: 0x89B7, - 0x5D33: 0x89BC, - 0x5D34: 0x89D4, - 0x5D35: 0x89D5, - 0x5D36: 0x89D6, - 0x5D37: 0x89D7, - 0x5D38: 0x89D8, - 0x5D39: 0x89E5, - 0x5D3A: 0x89E9, - 0x5D3B: 0x89EB, - 0x5D3C: 0x89ED, - 0x5D3D: 0x89F1, - 0x5D3E: 0x89F3, - 0x5D3F: 0x89F6, - 0x5D40: 0x89F9, - 0x5D41: 0x89FD, - 0x5D42: 0x89FF, - 0x5D43: 0x8A04, - 0x5D44: 0x8A05, - 0x5D45: 0x8A07, - 0x5D46: 0x8A0F, - 0x5D47: 0x8A11, - 0x5D48: 0x8A12, - 0x5D49: 0x8A14, - 0x5D4A: 0x8A15, - 0x5D4B: 0x8A1E, - 0x5D4C: 0x8A20, - 0x5D4D: 0x8A22, - 0x5D4E: 0x8A24, - 0x5D4F: 0x8A26, - 0x5D50: 0x8A2B, - 0x5D51: 0x8A2C, - 0x5D52: 0x8A2F, - 0x5D53: 0x8A35, - 0x5D54: 0x8A37, - 0x5D55: 0x8A3D, - 0x5D56: 0x8A3E, - 0x5D57: 0x8A40, - 0x5D58: 0x8A43, - 0x5D59: 0x8A45, - 0x5D5A: 0x8A47, - 0x5D5B: 0x8A49, - 0x5D5C: 0x8A4D, - 0x5D5D: 0x8A4E, - 0x5D5E: 0x8A53, - 0x5D5F: 0x8A56, - 0x5D60: 0x8A57, - 0x5D61: 0x8A58, - 0x5D62: 0x8A5C, - 0x5D63: 0x8A5D, - 0x5D64: 0x8A61, - 0x5D65: 0x8A65, - 0x5D66: 0x8A67, - 0x5D67: 0x8A75, - 0x5D68: 0x8A76, - 0x5D69: 0x8A77, - 0x5D6A: 0x8A79, - 0x5D6B: 0x8A7A, - 0x5D6C: 0x8A7B, - 0x5D6D: 0x8A7E, - 0x5D6E: 0x8A7F, - 0x5D6F: 0x8A80, - 0x5D70: 0x8A83, - 0x5D71: 0x8A86, - 0x5D72: 0x8A8B, - 0x5D73: 0x8A8F, - 0x5D74: 0x8A90, - 0x5D75: 0x8A92, - 0x5D76: 0x8A96, - 0x5D77: 0x8A97, - 0x5D78: 0x8A99, - 0x5D79: 0x8A9F, - 0x5D7A: 0x8AA7, - 0x5D7B: 0x8AA9, - 0x5D7C: 0x8AAE, - 0x5D7D: 0x8AAF, - 0x5D7E: 0x8AB3, - 0x5E21: 0x8AB6, - 0x5E22: 0x8AB7, - 0x5E23: 0x8ABB, - 0x5E24: 0x8ABE, - 0x5E25: 0x8AC3, - 0x5E26: 0x8AC6, - 0x5E27: 0x8AC8, - 0x5E28: 0x8AC9, - 0x5E29: 0x8ACA, - 0x5E2A: 0x8AD1, - 0x5E2B: 0x8AD3, - 0x5E2C: 0x8AD4, - 0x5E2D: 0x8AD5, - 0x5E2E: 0x8AD7, - 0x5E2F: 0x8ADD, - 0x5E30: 0x8ADF, - 0x5E31: 0x8AEC, - 0x5E32: 0x8AF0, - 0x5E33: 0x8AF4, - 0x5E34: 0x8AF5, - 0x5E35: 0x8AF6, - 0x5E36: 0x8AFC, - 0x5E37: 0x8AFF, - 0x5E38: 0x8B05, - 0x5E39: 0x8B06, - 0x5E3A: 0x8B0B, - 0x5E3B: 0x8B11, - 0x5E3C: 0x8B1C, - 0x5E3D: 0x8B1E, - 0x5E3E: 0x8B1F, - 0x5E3F: 0x8B0A, - 0x5E40: 0x8B2D, - 0x5E41: 0x8B30, - 0x5E42: 0x8B37, - 0x5E43: 0x8B3C, - 0x5E44: 0x8B42, - 0x5E45: 0x8B43, - 0x5E46: 0x8B44, - 0x5E47: 0x8B45, - 0x5E48: 0x8B46, - 0x5E49: 0x8B48, - 0x5E4A: 0x8B52, - 0x5E4B: 0x8B53, - 0x5E4C: 0x8B54, - 0x5E4D: 0x8B59, - 0x5E4E: 0x8B4D, - 0x5E4F: 0x8B5E, - 0x5E50: 0x8B63, - 0x5E51: 0x8B6D, - 0x5E52: 0x8B76, - 0x5E53: 0x8B78, - 0x5E54: 0x8B79, - 0x5E55: 0x8B7C, - 0x5E56: 0x8B7E, - 0x5E57: 0x8B81, - 0x5E58: 0x8B84, - 0x5E59: 0x8B85, - 0x5E5A: 0x8B8B, - 0x5E5B: 0x8B8D, - 0x5E5C: 0x8B8F, - 0x5E5D: 0x8B94, - 0x5E5E: 0x8B95, - 0x5E5F: 0x8B9C, - 0x5E60: 0x8B9E, - 0x5E61: 0x8B9F, - 0x5E62: 0x8C38, - 0x5E63: 0x8C39, - 0x5E64: 0x8C3D, - 0x5E65: 0x8C3E, - 0x5E66: 0x8C45, - 0x5E67: 0x8C47, - 0x5E68: 0x8C49, - 0x5E69: 0x8C4B, - 0x5E6A: 0x8C4F, - 0x5E6B: 0x8C51, - 0x5E6C: 0x8C53, - 0x5E6D: 0x8C54, - 0x5E6E: 0x8C57, - 0x5E6F: 0x8C58, - 0x5E70: 0x8C5B, - 0x5E71: 0x8C5D, - 0x5E72: 0x8C59, - 0x5E73: 0x8C63, - 0x5E74: 0x8C64, - 0x5E75: 0x8C66, - 0x5E76: 0x8C68, - 0x5E77: 0x8C69, - 0x5E78: 0x8C6D, - 0x5E79: 0x8C73, - 0x5E7A: 0x8C75, - 0x5E7B: 0x8C76, - 0x5E7C: 0x8C7B, - 0x5E7D: 0x8C7E, - 0x5E7E: 0x8C86, - 0x5F21: 0x8C87, - 0x5F22: 0x8C8B, - 0x5F23: 0x8C90, - 0x5F24: 0x8C92, - 0x5F25: 0x8C93, - 0x5F26: 0x8C99, - 0x5F27: 0x8C9B, - 0x5F28: 0x8C9C, - 0x5F29: 0x8CA4, - 0x5F2A: 0x8CB9, - 0x5F2B: 0x8CBA, - 0x5F2C: 0x8CC5, - 0x5F2D: 0x8CC6, - 0x5F2E: 0x8CC9, - 0x5F2F: 0x8CCB, - 0x5F30: 0x8CCF, - 0x5F31: 0x8CD6, - 0x5F32: 0x8CD5, - 0x5F33: 0x8CD9, - 0x5F34: 0x8CDD, - 0x5F35: 0x8CE1, - 0x5F36: 0x8CE8, - 0x5F37: 0x8CEC, - 0x5F38: 0x8CEF, - 0x5F39: 0x8CF0, - 0x5F3A: 0x8CF2, - 0x5F3B: 0x8CF5, - 0x5F3C: 0x8CF7, - 0x5F3D: 0x8CF8, - 0x5F3E: 0x8CFE, - 0x5F3F: 0x8CFF, - 0x5F40: 0x8D01, - 0x5F41: 0x8D03, - 0x5F42: 0x8D09, - 0x5F43: 0x8D12, - 0x5F44: 0x8D17, - 0x5F45: 0x8D1B, - 0x5F46: 0x8D65, - 0x5F47: 0x8D69, - 0x5F48: 0x8D6C, - 0x5F49: 0x8D6E, - 0x5F4A: 0x8D7F, - 0x5F4B: 0x8D82, - 0x5F4C: 0x8D84, - 0x5F4D: 0x8D88, - 0x5F4E: 0x8D8D, - 0x5F4F: 0x8D90, - 0x5F50: 0x8D91, - 0x5F51: 0x8D95, - 0x5F52: 0x8D9E, - 0x5F53: 0x8D9F, - 0x5F54: 0x8DA0, - 0x5F55: 0x8DA6, - 0x5F56: 0x8DAB, - 0x5F57: 0x8DAC, - 0x5F58: 0x8DAF, - 0x5F59: 0x8DB2, - 0x5F5A: 0x8DB5, - 0x5F5B: 0x8DB7, - 0x5F5C: 0x8DB9, - 0x5F5D: 0x8DBB, - 0x5F5E: 0x8DC0, - 0x5F5F: 0x8DC5, - 0x5F60: 0x8DC6, - 0x5F61: 0x8DC7, - 0x5F62: 0x8DC8, - 0x5F63: 0x8DCA, - 0x5F64: 0x8DCE, - 0x5F65: 0x8DD1, - 0x5F66: 0x8DD4, - 0x5F67: 0x8DD5, - 0x5F68: 0x8DD7, - 0x5F69: 0x8DD9, - 0x5F6A: 0x8DE4, - 0x5F6B: 0x8DE5, - 0x5F6C: 0x8DE7, - 0x5F6D: 0x8DEC, - 0x5F6E: 0x8DF0, - 0x5F6F: 0x8DBC, - 0x5F70: 0x8DF1, - 0x5F71: 0x8DF2, - 0x5F72: 0x8DF4, - 0x5F73: 0x8DFD, - 0x5F74: 0x8E01, - 0x5F75: 0x8E04, - 0x5F76: 0x8E05, - 0x5F77: 0x8E06, - 0x5F78: 0x8E0B, - 0x5F79: 0x8E11, - 0x5F7A: 0x8E14, - 0x5F7B: 0x8E16, - 0x5F7C: 0x8E20, - 0x5F7D: 0x8E21, - 0x5F7E: 0x8E22, - 0x6021: 0x8E23, - 0x6022: 0x8E26, - 0x6023: 0x8E27, - 0x6024: 0x8E31, - 0x6025: 0x8E33, - 0x6026: 0x8E36, - 0x6027: 0x8E37, - 0x6028: 0x8E38, - 0x6029: 0x8E39, - 0x602A: 0x8E3D, - 0x602B: 0x8E40, - 0x602C: 0x8E41, - 0x602D: 0x8E4B, - 0x602E: 0x8E4D, - 0x602F: 0x8E4E, - 0x6030: 0x8E4F, - 0x6031: 0x8E54, - 0x6032: 0x8E5B, - 0x6033: 0x8E5C, - 0x6034: 0x8E5D, - 0x6035: 0x8E5E, - 0x6036: 0x8E61, - 0x6037: 0x8E62, - 0x6038: 0x8E69, - 0x6039: 0x8E6C, - 0x603A: 0x8E6D, - 0x603B: 0x8E6F, - 0x603C: 0x8E70, - 0x603D: 0x8E71, - 0x603E: 0x8E79, - 0x603F: 0x8E7A, - 0x6040: 0x8E7B, - 0x6041: 0x8E82, - 0x6042: 0x8E83, - 0x6043: 0x8E89, - 0x6044: 0x8E90, - 0x6045: 0x8E92, - 0x6046: 0x8E95, - 0x6047: 0x8E9A, - 0x6048: 0x8E9B, - 0x6049: 0x8E9D, - 0x604A: 0x8E9E, - 0x604B: 0x8EA2, - 0x604C: 0x8EA7, - 0x604D: 0x8EA9, - 0x604E: 0x8EAD, - 0x604F: 0x8EAE, - 0x6050: 0x8EB3, - 0x6051: 0x8EB5, - 0x6052: 0x8EBA, - 0x6053: 0x8EBB, - 0x6054: 0x8EC0, - 0x6055: 0x8EC1, - 0x6056: 0x8EC3, - 0x6057: 0x8EC4, - 0x6058: 0x8EC7, - 0x6059: 0x8ECF, - 0x605A: 0x8ED1, - 0x605B: 0x8ED4, - 0x605C: 0x8EDC, - 0x605D: 0x8EE8, - 0x605E: 0x8EEE, - 0x605F: 0x8EF0, - 0x6060: 0x8EF1, - 0x6061: 0x8EF7, - 0x6062: 0x8EF9, - 0x6063: 0x8EFA, - 0x6064: 0x8EED, - 0x6065: 0x8F00, - 0x6066: 0x8F02, - 0x6067: 0x8F07, - 0x6068: 0x8F08, - 0x6069: 0x8F0F, - 0x606A: 0x8F10, - 0x606B: 0x8F16, - 0x606C: 0x8F17, - 0x606D: 0x8F18, - 0x606E: 0x8F1E, - 0x606F: 0x8F20, - 0x6070: 0x8F21, - 0x6071: 0x8F23, - 0x6072: 0x8F25, - 0x6073: 0x8F27, - 0x6074: 0x8F28, - 0x6075: 0x8F2C, - 0x6076: 0x8F2D, - 0x6077: 0x8F2E, - 0x6078: 0x8F34, - 0x6079: 0x8F35, - 0x607A: 0x8F36, - 0x607B: 0x8F37, - 0x607C: 0x8F3A, - 0x607D: 0x8F40, - 0x607E: 0x8F41, - 0x6121: 0x8F43, - 0x6122: 0x8F47, - 0x6123: 0x8F4F, - 0x6124: 0x8F51, - 0x6125: 0x8F52, - 0x6126: 0x8F53, - 0x6127: 0x8F54, - 0x6128: 0x8F55, - 0x6129: 0x8F58, - 0x612A: 0x8F5D, - 0x612B: 0x8F5E, - 0x612C: 0x8F65, - 0x612D: 0x8F9D, - 0x612E: 0x8FA0, - 0x612F: 0x8FA1, - 0x6130: 0x8FA4, - 0x6131: 0x8FA5, - 0x6132: 0x8FA6, - 0x6133: 0x8FB5, - 0x6134: 0x8FB6, - 0x6135: 0x8FB8, - 0x6136: 0x8FBE, - 0x6137: 0x8FC0, - 0x6138: 0x8FC1, - 0x6139: 0x8FC6, - 0x613A: 0x8FCA, - 0x613B: 0x8FCB, - 0x613C: 0x8FCD, - 0x613D: 0x8FD0, - 0x613E: 0x8FD2, - 0x613F: 0x8FD3, - 0x6140: 0x8FD5, - 0x6141: 0x8FE0, - 0x6142: 0x8FE3, - 0x6143: 0x8FE4, - 0x6144: 0x8FE8, - 0x6145: 0x8FEE, - 0x6146: 0x8FF1, - 0x6147: 0x8FF5, - 0x6148: 0x8FF6, - 0x6149: 0x8FFB, - 0x614A: 0x8FFE, - 0x614B: 0x9002, - 0x614C: 0x9004, - 0x614D: 0x9008, - 0x614E: 0x900C, - 0x614F: 0x9018, - 0x6150: 0x901B, - 0x6151: 0x9028, - 0x6152: 0x9029, - 0x6153: 0x902F, - 0x6154: 0x902A, - 0x6155: 0x902C, - 0x6156: 0x902D, - 0x6157: 0x9033, - 0x6158: 0x9034, - 0x6159: 0x9037, - 0x615A: 0x903F, - 0x615B: 0x9043, - 0x615C: 0x9044, - 0x615D: 0x904C, - 0x615E: 0x905B, - 0x615F: 0x905D, - 0x6160: 0x9062, - 0x6161: 0x9066, - 0x6162: 0x9067, - 0x6163: 0x906C, - 0x6164: 0x9070, - 0x6165: 0x9074, - 0x6166: 0x9079, - 0x6167: 0x9085, - 0x6168: 0x9088, - 0x6169: 0x908B, - 0x616A: 0x908C, - 0x616B: 0x908E, - 0x616C: 0x9090, - 0x616D: 0x9095, - 0x616E: 0x9097, - 0x616F: 0x9098, - 0x6170: 0x9099, - 0x6171: 0x909B, - 0x6172: 0x90A0, - 0x6173: 0x90A1, - 0x6174: 0x90A2, - 0x6175: 0x90A5, - 0x6176: 0x90B0, - 0x6177: 0x90B2, - 0x6178: 0x90B3, - 0x6179: 0x90B4, - 0x617A: 0x90B6, - 0x617B: 0x90BD, - 0x617C: 0x90CC, - 0x617D: 0x90BE, - 0x617E: 0x90C3, - 0x6221: 0x90C4, - 0x6222: 0x90C5, - 0x6223: 0x90C7, - 0x6224: 0x90C8, - 0x6225: 0x90D5, - 0x6226: 0x90D7, - 0x6227: 0x90D8, - 0x6228: 0x90D9, - 0x6229: 0x90DC, - 0x622A: 0x90DD, - 0x622B: 0x90DF, - 0x622C: 0x90E5, - 0x622D: 0x90D2, - 0x622E: 0x90F6, - 0x622F: 0x90EB, - 0x6230: 0x90EF, - 0x6231: 0x90F0, - 0x6232: 0x90F4, - 0x6233: 0x90FE, - 0x6234: 0x90FF, - 0x6235: 0x9100, - 0x6236: 0x9104, - 0x6237: 0x9105, - 0x6238: 0x9106, - 0x6239: 0x9108, - 0x623A: 0x910D, - 0x623B: 0x9110, - 0x623C: 0x9114, - 0x623D: 0x9116, - 0x623E: 0x9117, - 0x623F: 0x9118, - 0x6240: 0x911A, - 0x6241: 0x911C, - 0x6242: 0x911E, - 0x6243: 0x9120, - 0x6244: 0x9125, - 0x6245: 0x9122, - 0x6246: 0x9123, - 0x6247: 0x9127, - 0x6248: 0x9129, - 0x6249: 0x912E, - 0x624A: 0x912F, - 0x624B: 0x9131, - 0x624C: 0x9134, - 0x624D: 0x9136, - 0x624E: 0x9137, - 0x624F: 0x9139, - 0x6250: 0x913A, - 0x6251: 0x913C, - 0x6252: 0x913D, - 0x6253: 0x9143, - 0x6254: 0x9147, - 0x6255: 0x9148, - 0x6256: 0x914F, - 0x6257: 0x9153, - 0x6258: 0x9157, - 0x6259: 0x9159, - 0x625A: 0x915A, - 0x625B: 0x915B, - 0x625C: 0x9161, - 0x625D: 0x9164, - 0x625E: 0x9167, - 0x625F: 0x916D, - 0x6260: 0x9174, - 0x6261: 0x9179, - 0x6262: 0x917A, - 0x6263: 0x917B, - 0x6264: 0x9181, - 0x6265: 0x9183, - 0x6266: 0x9185, - 0x6267: 0x9186, - 0x6268: 0x918A, - 0x6269: 0x918E, - 0x626A: 0x9191, - 0x626B: 0x9193, - 0x626C: 0x9194, - 0x626D: 0x9195, - 0x626E: 0x9198, - 0x626F: 0x919E, - 0x6270: 0x91A1, - 0x6271: 0x91A6, - 0x6272: 0x91A8, - 0x6273: 0x91AC, - 0x6274: 0x91AD, - 0x6275: 0x91AE, - 0x6276: 0x91B0, - 0x6277: 0x91B1, - 0x6278: 0x91B2, - 0x6279: 0x91B3, - 0x627A: 0x91B6, - 0x627B: 0x91BB, - 0x627C: 0x91BC, - 0x627D: 0x91BD, - 0x627E: 0x91BF, - 0x6321: 0x91C2, - 0x6322: 0x91C3, - 0x6323: 0x91C5, - 0x6324: 0x91D3, - 0x6325: 0x91D4, - 0x6326: 0x91D7, - 0x6327: 0x91D9, - 0x6328: 0x91DA, - 0x6329: 0x91DE, - 0x632A: 0x91E4, - 0x632B: 0x91E5, - 0x632C: 0x91E9, - 0x632D: 0x91EA, - 0x632E: 0x91EC, - 0x632F: 0x91ED, - 0x6330: 0x91EE, - 0x6331: 0x91EF, - 0x6332: 0x91F0, - 0x6333: 0x91F1, - 0x6334: 0x91F7, - 0x6335: 0x91F9, - 0x6336: 0x91FB, - 0x6337: 0x91FD, - 0x6338: 0x9200, - 0x6339: 0x9201, - 0x633A: 0x9204, - 0x633B: 0x9205, - 0x633C: 0x9206, - 0x633D: 0x9207, - 0x633E: 0x9209, - 0x633F: 0x920A, - 0x6340: 0x920C, - 0x6341: 0x9210, - 0x6342: 0x9212, - 0x6343: 0x9213, - 0x6344: 0x9216, - 0x6345: 0x9218, - 0x6346: 0x921C, - 0x6347: 0x921D, - 0x6348: 0x9223, - 0x6349: 0x9224, - 0x634A: 0x9225, - 0x634B: 0x9226, - 0x634C: 0x9228, - 0x634D: 0x922E, - 0x634E: 0x922F, - 0x634F: 0x9230, - 0x6350: 0x9233, - 0x6351: 0x9235, - 0x6352: 0x9236, - 0x6353: 0x9238, - 0x6354: 0x9239, - 0x6355: 0x923A, - 0x6356: 0x923C, - 0x6357: 0x923E, - 0x6358: 0x9240, - 0x6359: 0x9242, - 0x635A: 0x9243, - 0x635B: 0x9246, - 0x635C: 0x9247, - 0x635D: 0x924A, - 0x635E: 0x924D, - 0x635F: 0x924E, - 0x6360: 0x924F, - 0x6361: 0x9251, - 0x6362: 0x9258, - 0x6363: 0x9259, - 0x6364: 0x925C, - 0x6365: 0x925D, - 0x6366: 0x9260, - 0x6367: 0x9261, - 0x6368: 0x9265, - 0x6369: 0x9267, - 0x636A: 0x9268, - 0x636B: 0x9269, - 0x636C: 0x926E, - 0x636D: 0x926F, - 0x636E: 0x9270, - 0x636F: 0x9275, - 0x6370: 0x9276, - 0x6371: 0x9277, - 0x6372: 0x9278, - 0x6373: 0x9279, - 0x6374: 0x927B, - 0x6375: 0x927C, - 0x6376: 0x927D, - 0x6377: 0x927F, - 0x6378: 0x9288, - 0x6379: 0x9289, - 0x637A: 0x928A, - 0x637B: 0x928D, - 0x637C: 0x928E, - 0x637D: 0x9292, - 0x637E: 0x9297, - 0x6421: 0x9299, - 0x6422: 0x929F, - 0x6423: 0x92A0, - 0x6424: 0x92A4, - 0x6425: 0x92A5, - 0x6426: 0x92A7, - 0x6427: 0x92A8, - 0x6428: 0x92AB, - 0x6429: 0x92AF, - 0x642A: 0x92B2, - 0x642B: 0x92B6, - 0x642C: 0x92B8, - 0x642D: 0x92BA, - 0x642E: 0x92BB, - 0x642F: 0x92BC, - 0x6430: 0x92BD, - 0x6431: 0x92BF, - 0x6432: 0x92C0, - 0x6433: 0x92C1, - 0x6434: 0x92C2, - 0x6435: 0x92C3, - 0x6436: 0x92C5, - 0x6437: 0x92C6, - 0x6438: 0x92C7, - 0x6439: 0x92C8, - 0x643A: 0x92CB, - 0x643B: 0x92CC, - 0x643C: 0x92CD, - 0x643D: 0x92CE, - 0x643E: 0x92D0, - 0x643F: 0x92D3, - 0x6440: 0x92D5, - 0x6441: 0x92D7, - 0x6442: 0x92D8, - 0x6443: 0x92D9, - 0x6444: 0x92DC, - 0x6445: 0x92DD, - 0x6446: 0x92DF, - 0x6447: 0x92E0, - 0x6448: 0x92E1, - 0x6449: 0x92E3, - 0x644A: 0x92E5, - 0x644B: 0x92E7, - 0x644C: 0x92E8, - 0x644D: 0x92EC, - 0x644E: 0x92EE, - 0x644F: 0x92F0, - 0x6450: 0x92F9, - 0x6451: 0x92FB, - 0x6452: 0x92FF, - 0x6453: 0x9300, - 0x6454: 0x9302, - 0x6455: 0x9308, - 0x6456: 0x930D, - 0x6457: 0x9311, - 0x6458: 0x9314, - 0x6459: 0x9315, - 0x645A: 0x931C, - 0x645B: 0x931D, - 0x645C: 0x931E, - 0x645D: 0x931F, - 0x645E: 0x9321, - 0x645F: 0x9324, - 0x6460: 0x9325, - 0x6461: 0x9327, - 0x6462: 0x9329, - 0x6463: 0x932A, - 0x6464: 0x9333, - 0x6465: 0x9334, - 0x6466: 0x9336, - 0x6467: 0x9337, - 0x6468: 0x9347, - 0x6469: 0x9348, - 0x646A: 0x9349, - 0x646B: 0x9350, - 0x646C: 0x9351, - 0x646D: 0x9352, - 0x646E: 0x9355, - 0x646F: 0x9357, - 0x6470: 0x9358, - 0x6471: 0x935A, - 0x6472: 0x935E, - 0x6473: 0x9364, - 0x6474: 0x9365, - 0x6475: 0x9367, - 0x6476: 0x9369, - 0x6477: 0x936A, - 0x6478: 0x936D, - 0x6479: 0x936F, - 0x647A: 0x9370, - 0x647B: 0x9371, - 0x647C: 0x9373, - 0x647D: 0x9374, - 0x647E: 0x9376, - 0x6521: 0x937A, - 0x6522: 0x937D, - 0x6523: 0x937F, - 0x6524: 0x9380, - 0x6525: 0x9381, - 0x6526: 0x9382, - 0x6527: 0x9388, - 0x6528: 0x938A, - 0x6529: 0x938B, - 0x652A: 0x938D, - 0x652B: 0x938F, - 0x652C: 0x9392, - 0x652D: 0x9395, - 0x652E: 0x9398, - 0x652F: 0x939B, - 0x6530: 0x939E, - 0x6531: 0x93A1, - 0x6532: 0x93A3, - 0x6533: 0x93A4, - 0x6534: 0x93A6, - 0x6535: 0x93A8, - 0x6536: 0x93AB, - 0x6537: 0x93B4, - 0x6538: 0x93B5, - 0x6539: 0x93B6, - 0x653A: 0x93BA, - 0x653B: 0x93A9, - 0x653C: 0x93C1, - 0x653D: 0x93C4, - 0x653E: 0x93C5, - 0x653F: 0x93C6, - 0x6540: 0x93C7, - 0x6541: 0x93C9, - 0x6542: 0x93CA, - 0x6543: 0x93CB, - 0x6544: 0x93CC, - 0x6545: 0x93CD, - 0x6546: 0x93D3, - 0x6547: 0x93D9, - 0x6548: 0x93DC, - 0x6549: 0x93DE, - 0x654A: 0x93DF, - 0x654B: 0x93E2, - 0x654C: 0x93E6, - 0x654D: 0x93E7, - 0x654E: 0x93F9, - 0x654F: 0x93F7, - 0x6550: 0x93F8, - 0x6551: 0x93FA, - 0x6552: 0x93FB, - 0x6553: 0x93FD, - 0x6554: 0x9401, - 0x6555: 0x9402, - 0x6556: 0x9404, - 0x6557: 0x9408, - 0x6558: 0x9409, - 0x6559: 0x940D, - 0x655A: 0x940E, - 0x655B: 0x940F, - 0x655C: 0x9415, - 0x655D: 0x9416, - 0x655E: 0x9417, - 0x655F: 0x941F, - 0x6560: 0x942E, - 0x6561: 0x942F, - 0x6562: 0x9431, - 0x6563: 0x9432, - 0x6564: 0x9433, - 0x6565: 0x9434, - 0x6566: 0x943B, - 0x6567: 0x943F, - 0x6568: 0x943D, - 0x6569: 0x9443, - 0x656A: 0x9445, - 0x656B: 0x9448, - 0x656C: 0x944A, - 0x656D: 0x944C, - 0x656E: 0x9455, - 0x656F: 0x9459, - 0x6570: 0x945C, - 0x6571: 0x945F, - 0x6572: 0x9461, - 0x6573: 0x9463, - 0x6574: 0x9468, - 0x6575: 0x946B, - 0x6576: 0x946D, - 0x6577: 0x946E, - 0x6578: 0x946F, - 0x6579: 0x9471, - 0x657A: 0x9472, - 0x657B: 0x9484, - 0x657C: 0x9483, - 0x657D: 0x9578, - 0x657E: 0x9579, - 0x6621: 0x957E, - 0x6622: 0x9584, - 0x6623: 0x9588, - 0x6624: 0x958C, - 0x6625: 0x958D, - 0x6626: 0x958E, - 0x6627: 0x959D, - 0x6628: 0x959E, - 0x6629: 0x959F, - 0x662A: 0x95A1, - 0x662B: 0x95A6, - 0x662C: 0x95A9, - 0x662D: 0x95AB, - 0x662E: 0x95AC, - 0x662F: 0x95B4, - 0x6630: 0x95B6, - 0x6631: 0x95BA, - 0x6632: 0x95BD, - 0x6633: 0x95BF, - 0x6634: 0x95C6, - 0x6635: 0x95C8, - 0x6636: 0x95C9, - 0x6637: 0x95CB, - 0x6638: 0x95D0, - 0x6639: 0x95D1, - 0x663A: 0x95D2, - 0x663B: 0x95D3, - 0x663C: 0x95D9, - 0x663D: 0x95DA, - 0x663E: 0x95DD, - 0x663F: 0x95DE, - 0x6640: 0x95DF, - 0x6641: 0x95E0, - 0x6642: 0x95E4, - 0x6643: 0x95E6, - 0x6644: 0x961D, - 0x6645: 0x961E, - 0x6646: 0x9622, - 0x6647: 0x9624, - 0x6648: 0x9625, - 0x6649: 0x9626, - 0x664A: 0x962C, - 0x664B: 0x9631, - 0x664C: 0x9633, - 0x664D: 0x9637, - 0x664E: 0x9638, - 0x664F: 0x9639, - 0x6650: 0x963A, - 0x6651: 0x963C, - 0x6652: 0x963D, - 0x6653: 0x9641, - 0x6654: 0x9652, - 0x6655: 0x9654, - 0x6656: 0x9656, - 0x6657: 0x9657, - 0x6658: 0x9658, - 0x6659: 0x9661, - 0x665A: 0x966E, - 0x665B: 0x9674, - 0x665C: 0x967B, - 0x665D: 0x967C, - 0x665E: 0x967E, - 0x665F: 0x967F, - 0x6660: 0x9681, - 0x6661: 0x9682, - 0x6662: 0x9683, - 0x6663: 0x9684, - 0x6664: 0x9689, - 0x6665: 0x9691, - 0x6666: 0x9696, - 0x6667: 0x969A, - 0x6668: 0x969D, - 0x6669: 0x969F, - 0x666A: 0x96A4, - 0x666B: 0x96A5, - 0x666C: 0x96A6, - 0x666D: 0x96A9, - 0x666E: 0x96AE, - 0x666F: 0x96AF, - 0x6670: 0x96B3, - 0x6671: 0x96BA, - 0x6672: 0x96CA, - 0x6673: 0x96D2, - 0x6674: 0x5DB2, - 0x6675: 0x96D8, - 0x6676: 0x96DA, - 0x6677: 0x96DD, - 0x6678: 0x96DE, - 0x6679: 0x96DF, - 0x667A: 0x96E9, - 0x667B: 0x96EF, - 0x667C: 0x96F1, - 0x667D: 0x96FA, - 0x667E: 0x9702, - 0x6721: 0x9703, - 0x6722: 0x9705, - 0x6723: 0x9709, - 0x6724: 0x971A, - 0x6725: 0x971B, - 0x6726: 0x971D, - 0x6727: 0x9721, - 0x6728: 0x9722, - 0x6729: 0x9723, - 0x672A: 0x9728, - 0x672B: 0x9731, - 0x672C: 0x9733, - 0x672D: 0x9741, - 0x672E: 0x9743, - 0x672F: 0x974A, - 0x6730: 0x974E, - 0x6731: 0x974F, - 0x6732: 0x9755, - 0x6733: 0x9757, - 0x6734: 0x9758, - 0x6735: 0x975A, - 0x6736: 0x975B, - 0x6737: 0x9763, - 0x6738: 0x9767, - 0x6739: 0x976A, - 0x673A: 0x976E, - 0x673B: 0x9773, - 0x673C: 0x9776, - 0x673D: 0x9777, - 0x673E: 0x9778, - 0x673F: 0x977B, - 0x6740: 0x977D, - 0x6741: 0x977F, - 0x6742: 0x9780, - 0x6743: 0x9789, - 0x6744: 0x9795, - 0x6745: 0x9796, - 0x6746: 0x9797, - 0x6747: 0x9799, - 0x6748: 0x979A, - 0x6749: 0x979E, - 0x674A: 0x979F, - 0x674B: 0x97A2, - 0x674C: 0x97AC, - 0x674D: 0x97AE, - 0x674E: 0x97B1, - 0x674F: 0x97B2, - 0x6750: 0x97B5, - 0x6751: 0x97B6, - 0x6752: 0x97B8, - 0x6753: 0x97B9, - 0x6754: 0x97BA, - 0x6755: 0x97BC, - 0x6756: 0x97BE, - 0x6757: 0x97BF, - 0x6758: 0x97C1, - 0x6759: 0x97C4, - 0x675A: 0x97C5, - 0x675B: 0x97C7, - 0x675C: 0x97C9, - 0x675D: 0x97CA, - 0x675E: 0x97CC, - 0x675F: 0x97CD, - 0x6760: 0x97CE, - 0x6761: 0x97D0, - 0x6762: 0x97D1, - 0x6763: 0x97D4, - 0x6764: 0x97D7, - 0x6765: 0x97D8, - 0x6766: 0x97D9, - 0x6767: 0x97DD, - 0x6768: 0x97DE, - 0x6769: 0x97E0, - 0x676A: 0x97DB, - 0x676B: 0x97E1, - 0x676C: 0x97E4, - 0x676D: 0x97EF, - 0x676E: 0x97F1, - 0x676F: 0x97F4, - 0x6770: 0x97F7, - 0x6771: 0x97F8, - 0x6772: 0x97FA, - 0x6773: 0x9807, - 0x6774: 0x980A, - 0x6775: 0x9819, - 0x6776: 0x980D, - 0x6777: 0x980E, - 0x6778: 0x9814, - 0x6779: 0x9816, - 0x677A: 0x981C, - 0x677B: 0x981E, - 0x677C: 0x9820, - 0x677D: 0x9823, - 0x677E: 0x9826, - 0x6821: 0x982B, - 0x6822: 0x982E, - 0x6823: 0x982F, - 0x6824: 0x9830, - 0x6825: 0x9832, - 0x6826: 0x9833, - 0x6827: 0x9835, - 0x6828: 0x9825, - 0x6829: 0x983E, - 0x682A: 0x9844, - 0x682B: 0x9847, - 0x682C: 0x984A, - 0x682D: 0x9851, - 0x682E: 0x9852, - 0x682F: 0x9853, - 0x6830: 0x9856, - 0x6831: 0x9857, - 0x6832: 0x9859, - 0x6833: 0x985A, - 0x6834: 0x9862, - 0x6835: 0x9863, - 0x6836: 0x9865, - 0x6837: 0x9866, - 0x6838: 0x986A, - 0x6839: 0x986C, - 0x683A: 0x98AB, - 0x683B: 0x98AD, - 0x683C: 0x98AE, - 0x683D: 0x98B0, - 0x683E: 0x98B4, - 0x683F: 0x98B7, - 0x6840: 0x98B8, - 0x6841: 0x98BA, - 0x6842: 0x98BB, - 0x6843: 0x98BF, - 0x6844: 0x98C2, - 0x6845: 0x98C5, - 0x6846: 0x98C8, - 0x6847: 0x98CC, - 0x6848: 0x98E1, - 0x6849: 0x98E3, - 0x684A: 0x98E5, - 0x684B: 0x98E6, - 0x684C: 0x98E7, - 0x684D: 0x98EA, - 0x684E: 0x98F3, - 0x684F: 0x98F6, - 0x6850: 0x9902, - 0x6851: 0x9907, - 0x6852: 0x9908, - 0x6853: 0x9911, - 0x6854: 0x9915, - 0x6855: 0x9916, - 0x6856: 0x9917, - 0x6857: 0x991A, - 0x6858: 0x991B, - 0x6859: 0x991C, - 0x685A: 0x991F, - 0x685B: 0x9922, - 0x685C: 0x9926, - 0x685D: 0x9927, - 0x685E: 0x992B, - 0x685F: 0x9931, - 0x6860: 0x9932, - 0x6861: 0x9933, - 0x6862: 0x9934, - 0x6863: 0x9935, - 0x6864: 0x9939, - 0x6865: 0x993A, - 0x6866: 0x993B, - 0x6867: 0x993C, - 0x6868: 0x9940, - 0x6869: 0x9941, - 0x686A: 0x9946, - 0x686B: 0x9947, - 0x686C: 0x9948, - 0x686D: 0x994D, - 0x686E: 0x994E, - 0x686F: 0x9954, - 0x6870: 0x9958, - 0x6871: 0x9959, - 0x6872: 0x995B, - 0x6873: 0x995C, - 0x6874: 0x995E, - 0x6875: 0x995F, - 0x6876: 0x9960, - 0x6877: 0x999B, - 0x6878: 0x999D, - 0x6879: 0x999F, - 0x687A: 0x99A6, - 0x687B: 0x99B0, - 0x687C: 0x99B1, - 0x687D: 0x99B2, - 0x687E: 0x99B5, - 0x6921: 0x99B9, - 0x6922: 0x99BA, - 0x6923: 0x99BD, - 0x6924: 0x99BF, - 0x6925: 0x99C3, - 0x6926: 0x99C9, - 0x6927: 0x99D3, - 0x6928: 0x99D4, - 0x6929: 0x99D9, - 0x692A: 0x99DA, - 0x692B: 0x99DC, - 0x692C: 0x99DE, - 0x692D: 0x99E7, - 0x692E: 0x99EA, - 0x692F: 0x99EB, - 0x6930: 0x99EC, - 0x6931: 0x99F0, - 0x6932: 0x99F4, - 0x6933: 0x99F5, - 0x6934: 0x99F9, - 0x6935: 0x99FD, - 0x6936: 0x99FE, - 0x6937: 0x9A02, - 0x6938: 0x9A03, - 0x6939: 0x9A04, - 0x693A: 0x9A0B, - 0x693B: 0x9A0C, - 0x693C: 0x9A10, - 0x693D: 0x9A11, - 0x693E: 0x9A16, - 0x693F: 0x9A1E, - 0x6940: 0x9A20, - 0x6941: 0x9A22, - 0x6942: 0x9A23, - 0x6943: 0x9A24, - 0x6944: 0x9A27, - 0x6945: 0x9A2D, - 0x6946: 0x9A2E, - 0x6947: 0x9A33, - 0x6948: 0x9A35, - 0x6949: 0x9A36, - 0x694A: 0x9A38, - 0x694B: 0x9A47, - 0x694C: 0x9A41, - 0x694D: 0x9A44, - 0x694E: 0x9A4A, - 0x694F: 0x9A4B, - 0x6950: 0x9A4C, - 0x6951: 0x9A4E, - 0x6952: 0x9A51, - 0x6953: 0x9A54, - 0x6954: 0x9A56, - 0x6955: 0x9A5D, - 0x6956: 0x9AAA, - 0x6957: 0x9AAC, - 0x6958: 0x9AAE, - 0x6959: 0x9AAF, - 0x695A: 0x9AB2, - 0x695B: 0x9AB4, - 0x695C: 0x9AB5, - 0x695D: 0x9AB6, - 0x695E: 0x9AB9, - 0x695F: 0x9ABB, - 0x6960: 0x9ABE, - 0x6961: 0x9ABF, - 0x6962: 0x9AC1, - 0x6963: 0x9AC3, - 0x6964: 0x9AC6, - 0x6965: 0x9AC8, - 0x6966: 0x9ACE, - 0x6967: 0x9AD0, - 0x6968: 0x9AD2, - 0x6969: 0x9AD5, - 0x696A: 0x9AD6, - 0x696B: 0x9AD7, - 0x696C: 0x9ADB, - 0x696D: 0x9ADC, - 0x696E: 0x9AE0, - 0x696F: 0x9AE4, - 0x6970: 0x9AE5, - 0x6971: 0x9AE7, - 0x6972: 0x9AE9, - 0x6973: 0x9AEC, - 0x6974: 0x9AF2, - 0x6975: 0x9AF3, - 0x6976: 0x9AF5, - 0x6977: 0x9AF9, - 0x6978: 0x9AFA, - 0x6979: 0x9AFD, - 0x697A: 0x9AFF, - 0x697B: 0x9B00, - 0x697C: 0x9B01, - 0x697D: 0x9B02, - 0x697E: 0x9B03, - 0x6A21: 0x9B04, - 0x6A22: 0x9B05, - 0x6A23: 0x9B08, - 0x6A24: 0x9B09, - 0x6A25: 0x9B0B, - 0x6A26: 0x9B0C, - 0x6A27: 0x9B0D, - 0x6A28: 0x9B0E, - 0x6A29: 0x9B10, - 0x6A2A: 0x9B12, - 0x6A2B: 0x9B16, - 0x6A2C: 0x9B19, - 0x6A2D: 0x9B1B, - 0x6A2E: 0x9B1C, - 0x6A2F: 0x9B20, - 0x6A30: 0x9B26, - 0x6A31: 0x9B2B, - 0x6A32: 0x9B2D, - 0x6A33: 0x9B33, - 0x6A34: 0x9B34, - 0x6A35: 0x9B35, - 0x6A36: 0x9B37, - 0x6A37: 0x9B39, - 0x6A38: 0x9B3A, - 0x6A39: 0x9B3D, - 0x6A3A: 0x9B48, - 0x6A3B: 0x9B4B, - 0x6A3C: 0x9B4C, - 0x6A3D: 0x9B55, - 0x6A3E: 0x9B56, - 0x6A3F: 0x9B57, - 0x6A40: 0x9B5B, - 0x6A41: 0x9B5E, - 0x6A42: 0x9B61, - 0x6A43: 0x9B63, - 0x6A44: 0x9B65, - 0x6A45: 0x9B66, - 0x6A46: 0x9B68, - 0x6A47: 0x9B6A, - 0x6A48: 0x9B6B, - 0x6A49: 0x9B6C, - 0x6A4A: 0x9B6D, - 0x6A4B: 0x9B6E, - 0x6A4C: 0x9B73, - 0x6A4D: 0x9B75, - 0x6A4E: 0x9B77, - 0x6A4F: 0x9B78, - 0x6A50: 0x9B79, - 0x6A51: 0x9B7F, - 0x6A52: 0x9B80, - 0x6A53: 0x9B84, - 0x6A54: 0x9B85, - 0x6A55: 0x9B86, - 0x6A56: 0x9B87, - 0x6A57: 0x9B89, - 0x6A58: 0x9B8A, - 0x6A59: 0x9B8B, - 0x6A5A: 0x9B8D, - 0x6A5B: 0x9B8F, - 0x6A5C: 0x9B90, - 0x6A5D: 0x9B94, - 0x6A5E: 0x9B9A, - 0x6A5F: 0x9B9D, - 0x6A60: 0x9B9E, - 0x6A61: 0x9BA6, - 0x6A62: 0x9BA7, - 0x6A63: 0x9BA9, - 0x6A64: 0x9BAC, - 0x6A65: 0x9BB0, - 0x6A66: 0x9BB1, - 0x6A67: 0x9BB2, - 0x6A68: 0x9BB7, - 0x6A69: 0x9BB8, - 0x6A6A: 0x9BBB, - 0x6A6B: 0x9BBC, - 0x6A6C: 0x9BBE, - 0x6A6D: 0x9BBF, - 0x6A6E: 0x9BC1, - 0x6A6F: 0x9BC7, - 0x6A70: 0x9BC8, - 0x6A71: 0x9BCE, - 0x6A72: 0x9BD0, - 0x6A73: 0x9BD7, - 0x6A74: 0x9BD8, - 0x6A75: 0x9BDD, - 0x6A76: 0x9BDF, - 0x6A77: 0x9BE5, - 0x6A78: 0x9BE7, - 0x6A79: 0x9BEA, - 0x6A7A: 0x9BEB, - 0x6A7B: 0x9BEF, - 0x6A7C: 0x9BF3, - 0x6A7D: 0x9BF7, - 0x6A7E: 0x9BF8, - 0x6B21: 0x9BF9, - 0x6B22: 0x9BFA, - 0x6B23: 0x9BFD, - 0x6B24: 0x9BFF, - 0x6B25: 0x9C00, - 0x6B26: 0x9C02, - 0x6B27: 0x9C0B, - 0x6B28: 0x9C0F, - 0x6B29: 0x9C11, - 0x6B2A: 0x9C16, - 0x6B2B: 0x9C18, - 0x6B2C: 0x9C19, - 0x6B2D: 0x9C1A, - 0x6B2E: 0x9C1C, - 0x6B2F: 0x9C1E, - 0x6B30: 0x9C22, - 0x6B31: 0x9C23, - 0x6B32: 0x9C26, - 0x6B33: 0x9C27, - 0x6B34: 0x9C28, - 0x6B35: 0x9C29, - 0x6B36: 0x9C2A, - 0x6B37: 0x9C31, - 0x6B38: 0x9C35, - 0x6B39: 0x9C36, - 0x6B3A: 0x9C37, - 0x6B3B: 0x9C3D, - 0x6B3C: 0x9C41, - 0x6B3D: 0x9C43, - 0x6B3E: 0x9C44, - 0x6B3F: 0x9C45, - 0x6B40: 0x9C49, - 0x6B41: 0x9C4A, - 0x6B42: 0x9C4E, - 0x6B43: 0x9C4F, - 0x6B44: 0x9C50, - 0x6B45: 0x9C53, - 0x6B46: 0x9C54, - 0x6B47: 0x9C56, - 0x6B48: 0x9C58, - 0x6B49: 0x9C5B, - 0x6B4A: 0x9C5D, - 0x6B4B: 0x9C5E, - 0x6B4C: 0x9C5F, - 0x6B4D: 0x9C63, - 0x6B4E: 0x9C69, - 0x6B4F: 0x9C6A, - 0x6B50: 0x9C5C, - 0x6B51: 0x9C6B, - 0x6B52: 0x9C68, - 0x6B53: 0x9C6E, - 0x6B54: 0x9C70, - 0x6B55: 0x9C72, - 0x6B56: 0x9C75, - 0x6B57: 0x9C77, - 0x6B58: 0x9C7B, - 0x6B59: 0x9CE6, - 0x6B5A: 0x9CF2, - 0x6B5B: 0x9CF7, - 0x6B5C: 0x9CF9, - 0x6B5D: 0x9D0B, - 0x6B5E: 0x9D02, - 0x6B5F: 0x9D11, - 0x6B60: 0x9D17, - 0x6B61: 0x9D18, - 0x6B62: 0x9D1C, - 0x6B63: 0x9D1D, - 0x6B64: 0x9D1E, - 0x6B65: 0x9D2F, - 0x6B66: 0x9D30, - 0x6B67: 0x9D32, - 0x6B68: 0x9D33, - 0x6B69: 0x9D34, - 0x6B6A: 0x9D3A, - 0x6B6B: 0x9D3C, - 0x6B6C: 0x9D45, - 0x6B6D: 0x9D3D, - 0x6B6E: 0x9D42, - 0x6B6F: 0x9D43, - 0x6B70: 0x9D47, - 0x6B71: 0x9D4A, - 0x6B72: 0x9D53, - 0x6B73: 0x9D54, - 0x6B74: 0x9D5F, - 0x6B75: 0x9D63, - 0x6B76: 0x9D62, - 0x6B77: 0x9D65, - 0x6B78: 0x9D69, - 0x6B79: 0x9D6A, - 0x6B7A: 0x9D6B, - 0x6B7B: 0x9D70, - 0x6B7C: 0x9D76, - 0x6B7D: 0x9D77, - 0x6B7E: 0x9D7B, - 0x6C21: 0x9D7C, - 0x6C22: 0x9D7E, - 0x6C23: 0x9D83, - 0x6C24: 0x9D84, - 0x6C25: 0x9D86, - 0x6C26: 0x9D8A, - 0x6C27: 0x9D8D, - 0x6C28: 0x9D8E, - 0x6C29: 0x9D92, - 0x6C2A: 0x9D93, - 0x6C2B: 0x9D95, - 0x6C2C: 0x9D96, - 0x6C2D: 0x9D97, - 0x6C2E: 0x9D98, - 0x6C2F: 0x9DA1, - 0x6C30: 0x9DAA, - 0x6C31: 0x9DAC, - 0x6C32: 0x9DAE, - 0x6C33: 0x9DB1, - 0x6C34: 0x9DB5, - 0x6C35: 0x9DB9, - 0x6C36: 0x9DBC, - 0x6C37: 0x9DBF, - 0x6C38: 0x9DC3, - 0x6C39: 0x9DC7, - 0x6C3A: 0x9DC9, - 0x6C3B: 0x9DCA, - 0x6C3C: 0x9DD4, - 0x6C3D: 0x9DD5, - 0x6C3E: 0x9DD6, - 0x6C3F: 0x9DD7, - 0x6C40: 0x9DDA, - 0x6C41: 0x9DDE, - 0x6C42: 0x9DDF, - 0x6C43: 0x9DE0, - 0x6C44: 0x9DE5, - 0x6C45: 0x9DE7, - 0x6C46: 0x9DE9, - 0x6C47: 0x9DEB, - 0x6C48: 0x9DEE, - 0x6C49: 0x9DF0, - 0x6C4A: 0x9DF3, - 0x6C4B: 0x9DF4, - 0x6C4C: 0x9DFE, - 0x6C4D: 0x9E0A, - 0x6C4E: 0x9E02, - 0x6C4F: 0x9E07, - 0x6C50: 0x9E0E, - 0x6C51: 0x9E10, - 0x6C52: 0x9E11, - 0x6C53: 0x9E12, - 0x6C54: 0x9E15, - 0x6C55: 0x9E16, - 0x6C56: 0x9E19, - 0x6C57: 0x9E1C, - 0x6C58: 0x9E1D, - 0x6C59: 0x9E7A, - 0x6C5A: 0x9E7B, - 0x6C5B: 0x9E7C, - 0x6C5C: 0x9E80, - 0x6C5D: 0x9E82, - 0x6C5E: 0x9E83, - 0x6C5F: 0x9E84, - 0x6C60: 0x9E85, - 0x6C61: 0x9E87, - 0x6C62: 0x9E8E, - 0x6C63: 0x9E8F, - 0x6C64: 0x9E96, - 0x6C65: 0x9E98, - 0x6C66: 0x9E9B, - 0x6C67: 0x9E9E, - 0x6C68: 0x9EA4, - 0x6C69: 0x9EA8, - 0x6C6A: 0x9EAC, - 0x6C6B: 0x9EAE, - 0x6C6C: 0x9EAF, - 0x6C6D: 0x9EB0, - 0x6C6E: 0x9EB3, - 0x6C6F: 0x9EB4, - 0x6C70: 0x9EB5, - 0x6C71: 0x9EC6, - 0x6C72: 0x9EC8, - 0x6C73: 0x9ECB, - 0x6C74: 0x9ED5, - 0x6C75: 0x9EDF, - 0x6C76: 0x9EE4, - 0x6C77: 0x9EE7, - 0x6C78: 0x9EEC, - 0x6C79: 0x9EED, - 0x6C7A: 0x9EEE, - 0x6C7B: 0x9EF0, - 0x6C7C: 0x9EF1, - 0x6C7D: 0x9EF2, - 0x6C7E: 0x9EF5, - 0x6D21: 0x9EF8, - 0x6D22: 0x9EFF, - 0x6D23: 0x9F02, - 0x6D24: 0x9F03, - 0x6D25: 0x9F09, - 0x6D26: 0x9F0F, - 0x6D27: 0x9F10, - 0x6D28: 0x9F11, - 0x6D29: 0x9F12, - 0x6D2A: 0x9F14, - 0x6D2B: 0x9F16, - 0x6D2C: 0x9F17, - 0x6D2D: 0x9F19, - 0x6D2E: 0x9F1A, - 0x6D2F: 0x9F1B, - 0x6D30: 0x9F1F, - 0x6D31: 0x9F22, - 0x6D32: 0x9F26, - 0x6D33: 0x9F2A, - 0x6D34: 0x9F2B, - 0x6D35: 0x9F2F, - 0x6D36: 0x9F31, - 0x6D37: 0x9F32, - 0x6D38: 0x9F34, - 0x6D39: 0x9F37, - 0x6D3A: 0x9F39, - 0x6D3B: 0x9F3A, - 0x6D3C: 0x9F3C, - 0x6D3D: 0x9F3D, - 0x6D3E: 0x9F3F, - 0x6D3F: 0x9F41, - 0x6D40: 0x9F43, - 0x6D41: 0x9F44, - 0x6D42: 0x9F45, - 0x6D43: 0x9F46, - 0x6D44: 0x9F47, - 0x6D45: 0x9F53, - 0x6D46: 0x9F55, - 0x6D47: 0x9F56, - 0x6D48: 0x9F57, - 0x6D49: 0x9F58, - 0x6D4A: 0x9F5A, - 0x6D4B: 0x9F5D, - 0x6D4C: 0x9F5E, - 0x6D4D: 0x9F68, - 0x6D4E: 0x9F69, - 0x6D4F: 0x9F6D, - 0x6D50: 0x9F6E, - 0x6D51: 0x9F6F, - 0x6D52: 0x9F70, - 0x6D53: 0x9F71, - 0x6D54: 0x9F73, - 0x6D55: 0x9F75, - 0x6D56: 0x9F7A, - 0x6D57: 0x9F7D, - 0x6D58: 0x9F8F, - 0x6D59: 0x9F90, - 0x6D5A: 0x9F91, - 0x6D5B: 0x9F92, - 0x6D5C: 0x9F94, - 0x6D5D: 0x9F96, - 0x6D5E: 0x9F97, - 0x6D5F: 0x9F9E, - 0x6D60: 0x9FA1, - 0x6D61: 0x9FA2, - 0x6D62: 0x9FA3, - 0x6D63: 0x9FA5, -} diff --git a/vendor/github.com/axgle/mahonia/mbcs.go b/vendor/github.com/axgle/mahonia/mbcs.go deleted file mode 100644 index 0614c0e..0000000 --- a/vendor/github.com/axgle/mahonia/mbcs.go +++ /dev/null @@ -1,92 +0,0 @@ -package mahonia - -// Generic converters for multibyte character sets. - -// An mbcsTrie contains the data to convert from the character set to Unicode. -// If a character would be encoded as "\x01\x02\x03", its unicode value would be found at t.children[1].children[2].children[3].rune -// children either is nil or has 256 elements. -type mbcsTrie struct { - // For leaf nodes, the Unicode character that is represented. - char rune - - // For non-leaf nodes, the trie to decode the remainder of the character. - children []mbcsTrie -} - -// A MBCSTable holds the data to convert to and from Unicode. -type MBCSTable struct { - toUnicode mbcsTrie - fromUnicode map[rune]string -} - -// AddCharacter adds a character to the table. rune is its Unicode code point, -// and bytes contains the bytes used to encode it in the character set. -func (table *MBCSTable) AddCharacter(c rune, bytes string) { - if table.fromUnicode == nil { - table.fromUnicode = make(map[rune]string) - } - - table.fromUnicode[c] = bytes - - trie := &table.toUnicode - for i := 0; i < len(bytes); i++ { - if trie.children == nil { - trie.children = make([]mbcsTrie, 256) - } - - b := bytes[i] - trie = &trie.children[b] - } - - trie.char = c -} - -func (table *MBCSTable) Decoder() Decoder { - return func(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if p[0] == 0 { - return 0, 1, SUCCESS - } - - trie := &table.toUnicode - for trie.char == 0 { - if trie.children == nil { - return 0xfffd, 1, INVALID_CHAR - } - if len(p) < size+1 { - return 0, 0, NO_ROOM - } - - trie = &trie.children[p[size]] - size++ - } - - c = trie.char - status = SUCCESS - return - } -} - -func (table *MBCSTable) Encoder() Encoder { - return func(p []byte, c rune) (size int, status Status) { - bytes := table.fromUnicode[c] - if bytes == "" { - if len(p) > 0 { - p[0] = '?' - return 1, INVALID_CHAR - } else { - return 0, NO_ROOM - } - } - - if len(p) < len(bytes) { - return 0, NO_ROOM - } - - return copy(p, bytes), SUCCESS - } -} diff --git a/vendor/github.com/axgle/mahonia/reader.go b/vendor/github.com/axgle/mahonia/reader.go deleted file mode 100644 index 3514b95..0000000 --- a/vendor/github.com/axgle/mahonia/reader.go +++ /dev/null @@ -1,151 +0,0 @@ -package mahonia - -// This file is based on bufio.Reader in the Go standard library, -// which has the following copyright notice: - -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -import ( - "io" - "unicode/utf8" -) - -const ( - defaultBufSize = 4096 -) - -// Reader implements character-set decoding for an io.Reader object. -type Reader struct { - buf []byte - rd io.Reader - decode Decoder - r, w int - err error -} - -// NewReader creates a new Reader that uses the receiver to decode text. -func (d Decoder) NewReader(rd io.Reader) *Reader { - b := new(Reader) - b.buf = make([]byte, defaultBufSize) - b.rd = rd - b.decode = d - return b -} - -// fill reads a new chunk into the buffer. -func (b *Reader) fill() { - // Slide existing data to beginning. - if b.r > 0 { - copy(b.buf, b.buf[b.r:b.w]) - b.w -= b.r - b.r = 0 - } - - // Read new data. - n, e := b.rd.Read(b.buf[b.w:]) - b.w += n - if e != nil { - b.err = e - } -} - -// Read reads data into p. -// It returns the number of bytes read into p. -// It calls Read at most once on the underlying Reader, -// hence n may be less than len(p). -// At EOF, the count will be zero and err will be os.EOF. -func (b *Reader) Read(p []byte) (n int, err error) { - n = len(p) - filled := false - if n == 0 { - return 0, b.err - } - if b.w == b.r { - if b.err != nil { - return 0, b.err - } - if n > len(b.buf) { - // Large read, empty buffer. - // Allocate a larger buffer for efficiency. - b.buf = make([]byte, n) - } - b.fill() - filled = true - if b.w == b.r { - return 0, b.err - } - } - - i := 0 - for i < n { - rune, size, status := b.decode(b.buf[b.r:b.w]) - - if status == STATE_ONLY { - b.r += size - continue - } - - if status == NO_ROOM { - if b.err != nil { - rune = 0xfffd - size = b.w - b.r - if size == 0 { - break - } - status = INVALID_CHAR - } else if filled { - break - } else { - b.fill() - filled = true - continue - } - } - - if i+utf8.RuneLen(rune) > n { - break - } - - b.r += size - if rune < 128 { - p[i] = byte(rune) - i++ - } else { - i += utf8.EncodeRune(p[i:], rune) - } - } - - return i, nil -} - -// ReadRune reads a single Unicode character and returns the -// rune and its size in bytes. -func (b *Reader) ReadRune() (c rune, size int, err error) { -read: - c, size, status := b.decode(b.buf[b.r:b.w]) - - if status == NO_ROOM && b.err == nil { - b.fill() - goto read - } - - if status == STATE_ONLY { - b.r += size - goto read - } - - if b.r == b.w { - return 0, 0, b.err - } - - if status == NO_ROOM { - c = 0xfffd - size = b.w - b.r - status = INVALID_CHAR - } - - b.r += size - return c, size, nil -} diff --git a/vendor/github.com/axgle/mahonia/shiftjis.go b/vendor/github.com/axgle/mahonia/shiftjis.go deleted file mode 100644 index a5c8e3e..0000000 --- a/vendor/github.com/axgle/mahonia/shiftjis.go +++ /dev/null @@ -1,70 +0,0 @@ -package mahonia - -// Converters for the Shift-JIS encoding. - -import ( - "sync" -) - -func init() { - RegisterCharset(&Charset{ - Name: "Shift_JIS", - Aliases: []string{"MS_Kanji", "csShiftJIS", "SJIS"}, - NewDecoder: func() Decoder { - sjisOnce.Do(makeSjisTable) - return sjisTable.Decoder() - }, - NewEncoder: func() Encoder { - sjisOnce.Do(makeSjisTable) - return sjisTable.Encoder() - }, - }) -} - -var sjisOnce sync.Once - -var sjisTable MBCSTable - -func makeSjisTable() { - var b [2]byte - - for jis0208, unicode := range jis0208ToUnicode { - if unicode == 0 { - continue - } - - j1 := byte(jis0208 >> 8) - j2 := byte(jis0208) - - if j1 < 95 { - b[0] = (j1+1)/2 + 112 - } else { - b[0] = (j1+1)/2 + 176 - } - - if j1&1 == 1 { - b[1] = j2 + 31 - if j2 >= 96 { - b[1]++ - } - } else { - b[1] = j2 + 126 - } - - sjisTable.AddCharacter(rune(unicode), string(b[:])) - } - - for jis0201, unicode := range jis0201ToUnicode { - if unicode == 0 { - continue - } - - sjisTable.AddCharacter(rune(unicode), string(byte(jis0201))) - } - - for i := '\x00'; i < 32; i++ { - sjisTable.AddCharacter(i, string(byte(i))) - } - - sjisTable.AddCharacter(0x7f, "\x7f") -} diff --git a/vendor/github.com/axgle/mahonia/translate.go b/vendor/github.com/axgle/mahonia/translate.go deleted file mode 100644 index ea41584..0000000 --- a/vendor/github.com/axgle/mahonia/translate.go +++ /dev/null @@ -1,50 +0,0 @@ -package mahonia - -import "unicode/utf8" - -// Translate enables a Decoder to implement go-charset's Translator interface. -func (d Decoder) Translate(data []byte, eof bool) (n int, cdata []byte, err error) { - cdata = make([]byte, len(data)+1) - destPos := 0 - - for n < len(data) { - rune, size, status := d(data[n:]) - - switch status { - case STATE_ONLY: - n += size - continue - - case NO_ROOM: - if !eof { - return n, cdata[:destPos], nil - } - rune = 0xfffd - n = len(data) - - default: - n += size - } - - if rune < 128 { - if destPos >= len(cdata) { - cdata = doubleLength(cdata) - } - cdata[destPos] = byte(rune) - destPos++ - } else { - if destPos+utf8.RuneLen(rune) > len(cdata) { - cdata = doubleLength(cdata) - } - destPos += utf8.EncodeRune(cdata[destPos:], rune) - } - } - - return n, cdata[:destPos], nil -} - -func doubleLength(b []byte) []byte { - b2 := make([]byte, 2*len(b)) - copy(b2, b) - return b2 -} diff --git a/vendor/github.com/axgle/mahonia/utf16.go b/vendor/github.com/axgle/mahonia/utf16.go deleted file mode 100644 index 3ec7b77..0000000 --- a/vendor/github.com/axgle/mahonia/utf16.go +++ /dev/null @@ -1,170 +0,0 @@ -package mahonia - -import ( - "unicode/utf16" -) - -func init() { - for i := 0; i < len(utf16Charsets); i++ { - RegisterCharset(&utf16Charsets[i]) - } -} - -var utf16Charsets = []Charset{ - { - Name: "UTF-16", - NewDecoder: func() Decoder { - var decodeRune Decoder - return func(p []byte) (c rune, size int, status Status) { - if decodeRune == nil { - // haven't read the BOM yet - if len(p) < 2 { - status = NO_ROOM - return - } - - switch { - case p[0] == 0xfe && p[1] == 0xff: - decodeRune = decodeUTF16beRune - return 0, 2, STATE_ONLY - case p[0] == 0xff && p[1] == 0xfe: - decodeRune = decodeUTF16leRune - return 0, 2, STATE_ONLY - default: - decodeRune = decodeUTF16beRune - } - } - - return decodeRune(p) - } - }, - NewEncoder: func() Encoder { - wroteBOM := false - return func(p []byte, c rune) (size int, status Status) { - if !wroteBOM { - if len(p) < 2 { - status = NO_ROOM - return - } - - p[0] = 0xfe - p[1] = 0xff - wroteBOM = true - return 2, STATE_ONLY - } - - return encodeUTF16beRune(p, c) - } - }, - }, - { - Name: "UTF-16BE", - NewDecoder: func() Decoder { return decodeUTF16beRune }, - NewEncoder: func() Encoder { return encodeUTF16beRune }, - }, - { - Name: "UTF-16LE", - NewDecoder: func() Decoder { return decodeUTF16leRune }, - NewEncoder: func() Encoder { return encodeUTF16leRune }, - }, -} - -func decodeUTF16beRune(p []byte) (r rune, size int, status Status) { - if len(p) < 2 { - status = NO_ROOM - return - } - - c := rune(p[0])<<8 + rune(p[1]) - - if utf16.IsSurrogate(c) { - if len(p) < 4 { - status = NO_ROOM - return - } - - c2 := rune(p[2])<<8 + rune(p[3]) - c = utf16.DecodeRune(c, c2) - - if c == 0xfffd { - return c, 2, INVALID_CHAR - } else { - return c, 4, SUCCESS - } - } - - return c, 2, SUCCESS -} - -func encodeUTF16beRune(p []byte, c rune) (size int, status Status) { - if c < 0x10000 { - if len(p) < 2 { - status = NO_ROOM - return - } - p[0] = byte(c >> 8) - p[1] = byte(c) - return 2, SUCCESS - } - - if len(p) < 4 { - status = NO_ROOM - return - } - s1, s2 := utf16.EncodeRune(c) - p[0] = byte(s1 >> 8) - p[1] = byte(s1) - p[2] = byte(s2 >> 8) - p[3] = byte(s2) - return 4, SUCCESS -} - -func decodeUTF16leRune(p []byte) (r rune, size int, status Status) { - if len(p) < 2 { - status = NO_ROOM - return - } - - c := rune(p[1])<<8 + rune(p[0]) - - if utf16.IsSurrogate(c) { - if len(p) < 4 { - status = NO_ROOM - return - } - - c2 := rune(p[3])<<8 + rune(p[2]) - c = utf16.DecodeRune(c, c2) - - if c == 0xfffd { - return c, 2, INVALID_CHAR - } else { - return c, 4, SUCCESS - } - } - - return c, 2, SUCCESS -} - -func encodeUTF16leRune(p []byte, c rune) (size int, status Status) { - if c < 0x10000 { - if len(p) < 2 { - status = NO_ROOM - return - } - p[1] = byte(c >> 8) - p[0] = byte(c) - return 2, SUCCESS - } - - if len(p) < 4 { - status = NO_ROOM - return - } - s1, s2 := utf16.EncodeRune(c) - p[1] = byte(s1 >> 8) - p[0] = byte(s1) - p[3] = byte(s2 >> 8) - p[2] = byte(s2) - return 4, SUCCESS -} diff --git a/vendor/github.com/axgle/mahonia/utf8.go b/vendor/github.com/axgle/mahonia/utf8.go deleted file mode 100644 index b140109..0000000 --- a/vendor/github.com/axgle/mahonia/utf8.go +++ /dev/null @@ -1,45 +0,0 @@ -package mahonia - -import "unicode/utf8" - -func init() { - RegisterCharset(&Charset{ - Name: "UTF-8", - NewDecoder: func() Decoder { return decodeUTF8Rune }, - NewEncoder: func() Encoder { return encodeUTF8Rune }, - }) -} - -func decodeUTF8Rune(p []byte) (c rune, size int, status Status) { - if len(p) == 0 { - status = NO_ROOM - return - } - - if p[0] < 128 { - return rune(p[0]), 1, SUCCESS - } - - c, size = utf8.DecodeRune(p) - - if c == 0xfffd { - if utf8.FullRune(p) { - status = INVALID_CHAR - return - } - - return 0, 0, NO_ROOM - } - - status = SUCCESS - return -} - -func encodeUTF8Rune(p []byte, c rune) (size int, status Status) { - size = utf8.RuneLen(c) - if size > len(p) { - return 0, NO_ROOM - } - - return utf8.EncodeRune(p, c), SUCCESS -} diff --git a/vendor/github.com/axgle/mahonia/writer.go b/vendor/github.com/axgle/mahonia/writer.go deleted file mode 100644 index bdeb519..0000000 --- a/vendor/github.com/axgle/mahonia/writer.go +++ /dev/null @@ -1,108 +0,0 @@ -package mahonia - -import ( - "io" - "unicode/utf8" -) - -// Writer implements character-set encoding for an io.Writer object. -type Writer struct { - wr io.Writer - encode Encoder - inbuf []byte - outbuf []byte -} - -// NewWriter creates a new Writer that uses the receiver to encode text. -func (e Encoder) NewWriter(wr io.Writer) *Writer { - w := new(Writer) - w.wr = wr - w.encode = e - return w -} - -// Write encodes and writes the data from p. -func (w *Writer) Write(p []byte) (n int, err error) { - n = len(p) - - if len(w.inbuf) > 0 { - w.inbuf = append(w.inbuf, p...) - p = w.inbuf - } - - if len(w.outbuf) < len(p) { - w.outbuf = make([]byte, len(p)+10) - } - - outpos := 0 - - for len(p) > 0 { - rune, size := utf8.DecodeRune(p) - if rune == 0xfffd && !utf8.FullRune(p) { - break - } - - p = p[size:] - - retry: - size, status := w.encode(w.outbuf[outpos:], rune) - - if status == NO_ROOM { - newDest := make([]byte, len(w.outbuf)*2) - copy(newDest, w.outbuf) - w.outbuf = newDest - goto retry - } - - if status == STATE_ONLY { - outpos += size - goto retry - } - - outpos += size - } - - w.inbuf = w.inbuf[:0] - if len(p) > 0 { - w.inbuf = append(w.inbuf, p...) - } - - n1, err := w.wr.Write(w.outbuf[0:outpos]) - - if err != nil && n1 < n { - n = n1 - } - - return -} - -func (w *Writer) WriteRune(c rune) (size int, err error) { - if len(w.inbuf) > 0 { - // There are leftover bytes, a partial UTF-8 sequence. - w.inbuf = w.inbuf[:0] - w.WriteRune(0xfffd) - } - - if w.outbuf == nil { - w.outbuf = make([]byte, 16) - } - - outpos := 0 - -retry: - size, status := w.encode(w.outbuf[outpos:], c) - - if status == NO_ROOM { - w.outbuf = make([]byte, len(w.outbuf)*2) - goto retry - } - - if status == STATE_ONLY { - outpos += size - goto retry - } - - outpos += size - - return w.wr.Write(w.outbuf[0:outpos]) -} diff --git a/vendor/github.com/chenhg5/collection/.gitignore b/vendor/github.com/chenhg5/collection/.gitignore deleted file mode 100644 index 723ef36..0000000 --- a/vendor/github.com/chenhg5/collection/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea \ No newline at end of file diff --git a/vendor/github.com/chenhg5/collection/.travis.yml b/vendor/github.com/chenhg5/collection/.travis.yml deleted file mode 100644 index e443c76..0000000 --- a/vendor/github.com/chenhg5/collection/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go -go: - - "1.10" -before_script: - - git clone --depth=50 --branch=master https://github.com/chenhg5/collection.git /home/travis/gopath/src/collection -script: - - go test -test.run Test* \ No newline at end of file diff --git a/vendor/github.com/chenhg5/collection/LICENSE b/vendor/github.com/chenhg5/collection/LICENSE deleted file mode 100644 index d6fad03..0000000 --- a/vendor/github.com/chenhg5/collection/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 cg33 - -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. diff --git a/vendor/github.com/chenhg5/collection/README.md b/vendor/github.com/chenhg5/collection/README.md deleted file mode 100644 index def52e4..0000000 --- a/vendor/github.com/chenhg5/collection/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Go Collection - -golang -GoDoc -license -[![Build Status](https://api.travis-ci.org/chenhg5/collection.svg?branch=master)](https://api.travis-ci.org/chenhg5/collection) - -Collection provides a fluent, convenient wrapper for working with arrays of data. - -You can easily convert a map or an array into a Collection with the method ```Collect()```. -And then you can use the powerful and graceful apis of Collection to process the data. - -In general, Collection are immutable, meaning every Collection method returns an entirely new Collection instance - -## doc - -[here](https://godoc.org/github.com/chenhg5/collection#Collection) - -## example - -```golang -a := []int{2,3,4,5,6,7} - -Collect(a).Each(func(item, value interface{}) (interface{}, bool) { - return value.(decimal.Decimal).IntPart() + 2, false -}).ToIntArray() - -// []int{4,5,6,7,8,9} - -b := []map[string]interface{}{ - {"name": "Jack", "sex": 0}, - {"name": "Mary", "sex": 1}, - {"name": "Jane", "sex": 1}, -} - -Collect(b).Where("name", "Jack").ToMapArray()[0] - -// map[string]interface{}{"name": "Jack", "sex": 0} - -``` - -[more examples](https://godoc.org/github.com/chenhg5/collection#pkg-examples) - -## contribution - -pr is very welcome. \ No newline at end of file diff --git a/vendor/github.com/chenhg5/collection/base_collection.go b/vendor/github.com/chenhg5/collection/base_collection.go deleted file mode 100644 index 363e919..0000000 --- a/vendor/github.com/chenhg5/collection/base_collection.go +++ /dev/null @@ -1,446 +0,0 @@ -package collection - -import ( - "encoding/json" - "github.com/shopspring/decimal" -) - -type BaseCollection struct { - value interface{} - length int -} - -func (c BaseCollection) Value() interface{} { - return c.value -} - -// Length return the length of the collection. -func (c BaseCollection) Length() int { - return c.length -} - -// Select select the keys of collection and delete others. -func (c BaseCollection) Select(keys ...string) Collection { - panic("not implement") -} - -// ToStruct turn the collection to the specified struct using mapstructure. -// https://github.com/mitchellh/mapstructure -func (c BaseCollection) ToStruct(dist interface{}) { - panic("not implement") -} - -// All returns the underlying array represented by the collection. -func (c BaseCollection) All() []interface{} { - panic("not implement") -} - -// Avg returns the average value of a given key. -func (c BaseCollection) Avg(key ...string) decimal.Decimal { - return c.Sum(key...).Div(decimal.New(int64(c.length), 0)) -} - -// Sum returns the sum of all items in the collection. -func (c BaseCollection) Sum(key ...string) decimal.Decimal { - panic("not implement") -} - -// Min returns the minimum value of a given key. -func (c BaseCollection) Min(key ...string) decimal.Decimal { - panic("not implement") -} - -// Max returns the maximum value of a given key. -func (c BaseCollection) Max(key ...string) decimal.Decimal { - panic("not implement") -} - -// Join joins the collection's values with a string. -func (c BaseCollection) Join(delimiter string) string { - panic("not implement") -} - -// Combine combines the values of the collection, as keys, with the values of another array or collection. -func (c BaseCollection) Combine(value []interface{}) Collection { - panic("not implement") -} - -// Pluck retrieves all of the values for a given key. -func (c BaseCollection) Pluck(key string) Collection { - panic("not implement") -} - -// ToIntArray converts the collection into a plain golang slice which contains int. -func (c BaseCollection) ToIntArray() []int { - panic("not implement") -} - -// ToInt64Array converts the collection into a plain golang slice which contains int64. -func (c BaseCollection) ToInt64Array() []int64 { - panic("not implement") -} - -// Mode returns the mode value of a given key. -func (c BaseCollection) Mode(key ...string) []interface{} { - panic("not implement") -} - -// Only returns the items in the collection with the specified keys. -func (c BaseCollection) Only(keys []string) Collection { - panic("not implement") -} - -// Prepend adds an item to the beginning of the collection. -func (c BaseCollection) Prepend(values ...interface{}) Collection { - panic("not implement") -} - -// Pull removes and returns an item from the collection by its key. -func (c BaseCollection) Pull(key interface{}) Collection { - panic("not implement") -} - -// Put sets the given key and value in the collection:. -func (c BaseCollection) Put(key string, value interface{}) Collection { - panic("not implement") -} - -// SortBy sorts the collection by the given key. -func (c BaseCollection) SortBy(key string) Collection { - panic("not implement") -} - -// Take returns a new collection with the specified number of items. -func (c BaseCollection) Take(num int) Collection { - panic("not implement") -} - -// Chunk breaks the collection into multiple, smaller collections of a given size. -func (c BaseCollection) Chunk(num int) MultiDimensionalArrayCollection { - panic("not implement") -} - -// Collapse collapses a collection of arrays into a single, flat collection. -func (c BaseCollection) Collapse() Collection { - panic("not implement") -} - -// Concat appends the given array or collection values onto the end of the collection. -func (c BaseCollection) Concat(value interface{}) Collection { - panic("not implement") -} - -// Contains determines whether the collection contains a given item. -func (c BaseCollection) Contains(value ...interface{}) bool { - panic("not implement") -} - -// CountBy counts the occurrences of values in the collection. By default, the method counts the occurrences of every element. -func (c BaseCollection) CountBy(callback ...interface{}) map[interface{}]int { - panic("not implement") -} - -// CrossJoin cross joins the collection's values among the given arrays or collections, returning a Cartesian product with all possible permutations. -func (c BaseCollection) CrossJoin(array ...[]interface{}) MultiDimensionalArrayCollection { - panic("not implement") -} - -// Dd dumps the collection's items and ends execution of the script. -func (c BaseCollection) Dd() { - panic("not implement") -} - -// Diff compares the collection against another collection or a plain PHP array based on its values. -// This method will return the values in the original collection that are not present in the given collection. -func (c BaseCollection) Diff(interface{}) Collection { - panic("not implement") -} - -// DiffAssoc compares the collection against another collection or a plain PHP array based on its keys and values. -// This method will return the key / value pairs in the original collection that are not present in the given collection. -func (c BaseCollection) DiffAssoc(map[string]interface{}) Collection { - panic("not implement") -} - -// DiffKeys compares the collection against another collection or a plain PHP array based on its keys. -// This method will return the key / value pairs in the original collection that are not present in the given collection. -func (c BaseCollection) DiffKeys(map[string]interface{}) Collection { - panic("not implement") -} - -// Dump dumps the collection's items. -func (c BaseCollection) Dump() { - panic("not implement") -} - -// Each iterates over the items in the collection and passes each item to a callback. -func (c BaseCollection) Each(func(item, value interface{}) (interface{}, bool)) Collection { - panic("not implement") -} - -// Every may be used to verify that all elements of a collection pass a given truth test. -func (c BaseCollection) Every(CB) bool { - panic("not implement") -} - -// Except returns all items in the collection except for those with the specified keys. -func (c BaseCollection) Except([]string) Collection { - panic("not implement") -} - -// Filter filters the collection using the given callback, keeping only those items that pass a given truth test. -func (c BaseCollection) Filter(CB) Collection { - panic("not implement") -} - -// First returns the first element in the collection that passes a given truth test. -func (c BaseCollection) First(...CB) interface{} { - panic("not implement") -} - -// FirstWhere returns the first element in the collection with the given key / value pair. -func (c BaseCollection) FirstWhere(key string, values ...interface{}) map[string]interface{} { - panic("not implement") -} - -// FlatMap iterates through the collection and passes each value to the given callback. -func (c BaseCollection) FlatMap(func(value interface{}) interface{}) Collection { - panic("not implement") -} - -// Flip swaps the collection's keys with their corresponding values. -func (c BaseCollection) Flip() Collection { - panic("not implement") -} - -// Forget removes an item from the collection by its key. -func (c BaseCollection) Forget(string) Collection { - panic("not implement") -} - -// ForPage returns a new collection containing the items that would be present on a given page number. -func (c BaseCollection) ForPage(int, int) Collection { - panic("not implement") -} - -// Get returns the item at a given key. If the key does not exist, null is returned. -func (c BaseCollection) Get(string, ...interface{}) interface{} { - panic("not implement") -} - -// GroupBy groups the collection's items by a given key. -func (c BaseCollection) GroupBy(string) Collection { - panic("not implement") -} - -// Has determines if a given key exists in the collection. -func (c BaseCollection) Has(...string) bool { - panic("not implement") -} - -// Implode joins the items in a collection. Its arguments depend on the type of items in the collection. -func (c BaseCollection) Implode(string, string) string { - panic("not implement") -} - -// Intersect removes any values from the original collection that are not present in the given array or collection. -func (c BaseCollection) Intersect([]string) Collection { - panic("not implement") -} - -// IntersectByKeys removes any keys from the original collection that are not present in the given array or collection. -func (c BaseCollection) IntersectByKeys(map[string]interface{}) Collection { - panic("not implement") -} - -// IsEmpty returns true if the collection is empty; otherwise, false is returned. -func (c BaseCollection) IsEmpty() bool { - panic("not implement") -} - -// IsNotEmpty returns true if the collection is not empty; otherwise, false is returned. -func (c BaseCollection) IsNotEmpty() bool { - panic("not implement") -} - -// KeyBy keys the collection by the given key. If multiple items have the same key, only the last one will -// appear in the new collection. -func (c BaseCollection) KeyBy(interface{}) Collection { - panic("not implement") -} - -// Keys returns all of the collection's keys. -func (c BaseCollection) Keys() Collection { - panic("not implement") -} - -// Last returns the last element in the collection that passes a given truth test. -func (c BaseCollection) Last(...CB) interface{} { - panic("not implement") -} - -// MapToGroups groups the collection's items by the given callback. -func (c BaseCollection) MapToGroups(MapCB) Collection { - panic("not implement") -} - -// MapWithKeys iterates through the collection and passes each value to the given callback. -func (c BaseCollection) MapWithKeys(MapCB) Collection { - panic("not implement") -} - -// Median returns the median value of a given key. -func (c BaseCollection) Median(key ...string) decimal.Decimal { - panic("not implement") -} - -// Merge merges the given array or collection with the original collection. If a string key in the given items -// matches a string key in the original collection, the given items's value will overwrite the value in the -// original collection. -func (c BaseCollection) Merge(interface{}) Collection { - panic("not implement") -} - -func (c BaseCollection) Nth(...int) Collection { - panic("not implement") -} - -// Pad will fill the array with the given value until the array reaches the specified size. -func (c BaseCollection) Pad(int, interface{}) Collection { - panic("not implement") -} - -// Partition separate elements that pass a given truth test from those that do not. -func (c BaseCollection) Partition(PartCB) (Collection, Collection) { - panic("not implement") -} - -// Pop removes and returns the last item from the collection. -func (c BaseCollection) Pop() interface{} { - panic("not implement") -} - -// Push appends an item to the end of the collection. -func (c BaseCollection) Push(interface{}) Collection { - panic("not implement") -} - -// Random returns a random item from the collection. -func (c BaseCollection) Random(...int) Collection { - panic("not implement") -} - -// Reduce reduces the collection to a single value, passing the result of each iteration into the subsequent iteration. -func (c BaseCollection) Reduce(ReduceCB) interface{} { - panic("not implement") -} - -// Reject filters the collection using the given callback. -func (c BaseCollection) Reject(CB) Collection { - panic("not implement") -} - -// Reverse reverses the order of the collection's items, preserving the original keys. -func (c BaseCollection) Reverse() Collection { - panic("not implement") -} - -// Search searches the collection for the given value and returns its key if found. If the item is not found, -// -1 is returned. -func (c BaseCollection) Search(interface{}) int { - panic("not implement") -} - -// Shift removes and returns the first item from the collection. -func (c BaseCollection) Shift() Collection { - panic("not implement") -} - -// Shuffle randomly shuffles the items in the collection. -func (c BaseCollection) Shuffle() Collection { - panic("not implement") -} - -// Slice returns a slice of the collection starting at the given index. -func (c BaseCollection) Slice(...int) Collection { - panic("not implement") -} - -// Sort sorts the collection. -func (c BaseCollection) Sort() Collection { - panic("not implement") -} - -// SortByDesc has the same signature as the sortBy method, but will sort the collection in the opposite order. -func (c BaseCollection) SortByDesc() Collection { - panic("not implement") -} - -// Splice removes and returns a slice of items starting at the specified index. -func (c BaseCollection) Split(int) Collection { - panic("not implement") -} - -// Split breaks a collection into the given number of groups. -func (c BaseCollection) Splice(index ...int) Collection { - panic("not implement") -} - -// Unique returns all of the unique items in the collection. -func (c BaseCollection) Unique() Collection { - panic("not implement") -} - -// WhereIn filters the collection by a given key / value contained within the given array. -func (c BaseCollection) WhereIn(string, []interface{}) Collection { - panic("not implement") -} - -// WhereNotIn filters the collection by a given key / value not contained within the given array. -func (c BaseCollection) WhereNotIn(string, []interface{}) Collection { - panic("not implement") -} - -// ToJson converts the collection into a json string. -func (c BaseCollection) ToJson() string { - s, err := json.Marshal(c.value) - if err != nil { - panic(err) - } - return string(s) -} - -// ToNumberArray converts the collection into a plain golang slice which contains decimal.Decimal. -func (c BaseCollection) ToNumberArray() []decimal.Decimal { - panic("not implement") -} - -// ToStringArray converts the collection into a plain golang slice which contains string. -func (c BaseCollection) ToMultiDimensionalArray() [][]interface{} { - panic("not implement") -} - -// ToStringArray converts the collection into a plain golang slice which contains string. -func (c BaseCollection) ToStringArray() []string { - panic("not implement") -} - -// ToMap converts the collection into a plain golang map. -func (c BaseCollection) ToMap() map[string]interface{} { - panic("not implement") -} - -// ToMapArray converts the collection into a plain golang slice which contains map. -func (c BaseCollection) ToMapArray() []map[string]interface{} { - panic("not implement") -} - -// Where filters the collection by a given key / value pair. -func (c BaseCollection) Where(key string, values ...interface{}) Collection { - panic("not implement") -} - -// Count returns the total number of items in the collection. -func (c BaseCollection) Count() int { - return c.length -} diff --git a/vendor/github.com/chenhg5/collection/collection.go b/vendor/github.com/chenhg5/collection/collection.go deleted file mode 100644 index 11208b9..0000000 --- a/vendor/github.com/chenhg5/collection/collection.go +++ /dev/null @@ -1,669 +0,0 @@ -package collection - -import ( - "bytes" - "encoding/gob" - "encoding/json" - "fmt" - "github.com/shopspring/decimal" - "strings" -) - -// Collect transforms src into Collection. The src could be json string, []string, -// []map[string]interface{}, map[string]interface{}, []int, []int16, []int32, []int64, -// []float32, []float64, []interface{}. -func Collect(src interface{}) Collection { - switch src.(type) { - case string: - jsonStr := strings.TrimSpace(src.(string)) - if jsonStr[0] == '[' { - var p []interface{} - if err := json.Unmarshal([]byte(jsonStr), &p); err != nil { - panic(err) - } - return Collect(p) - } - if jsonStr[0] == '{' { - var p map[string]interface{} - if err := json.Unmarshal([]byte(jsonStr), &p); err != nil { - panic(err) - } - var c MapCollection - c.value = p - c.length = len(p) - return c - } - panic("invalid type") - case []string: - var c StringArrayCollection - c.value = src.([]string) - c.length = len(src.([]string)) - return c - case []map[string]interface{}: - var c MapArrayCollection - c.value = src.([]map[string]interface{}) - c.length = len(src.([]map[string]interface{})) - return c - case map[string]interface{}: - var c MapCollection - c.value = src.(map[string]interface{}) - c.length = len(src.(map[string]interface{})) - return c - case []int: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]int))) - for k, v := range src.([]int) { - d[k] = decimal.New(int64(v), 0) - } - c.value = d - c.length = len(src.([]int)) - return c - case []int8: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]int8))) - for k, v := range src.([]int8) { - d[k] = decimal.New(int64(v), 0) - } - c.value = d - c.length = len(src.([]int8)) - return c - case []int16: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]int16))) - for k, v := range src.([]int16) { - d[k] = decimal.New(int64(v), 0) - } - c.value = d - c.length = len(src.([]int16)) - return c - case []int32: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]int32))) - for k, v := range src.([]int32) { - d[k] = decimal.New(int64(v), 0) - } - c.value = d - c.length = len(src.([]int32)) - return c - case []int64: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]int64))) - for k, v := range src.([]int64) { - d[k] = decimal.New(v, 0) - } - c.value = d - c.length = len(src.([]int64)) - return c - case []float32: - var c NumberArrayCollection - var f = make([]decimal.Decimal, len(src.([]float32))) - for k, v := range src.([]float32) { - f[k] = decimal.NewFromFloat32(v) - } - c.value = f - c.length = len(src.([]float32)) - return c - case []float64: - var c NumberArrayCollection - var f = make([]decimal.Decimal, len(src.([]float64))) - for k, v := range src.([]float64) { - f[k] = decimal.NewFromFloat(v) - } - c.value = f - c.length = len(src.([]float64)) - return c - case []interface{}: - if len(src.([]interface{})) == 0 { - panic("wrong value") - } - switch src.([]interface{})[0].(type) { - case map[string]interface{}: - var c MapArrayCollection - var f = make([]map[string]interface{}, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - f[k] = v.(map[string]interface{}) - } - c.value = f - c.length = len(src.([]interface{})) - return c - case decimal.Decimal: - var c NumberArrayCollection - var f = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - f[k] = v.(decimal.Decimal) - } - c.value = f - c.length = len(src.([]interface{})) - return c - case string: - var c StringArrayCollection - var f = make([]string, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - f[k] = v.(string) - } - c.value = f - c.length = len(src.([]interface{})) - return c - case uint8: - var c StringArrayCollection - var f = make([]string, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - f[k] = string(v.([]uint8)) - } - c.value = f - c.length = len(src.([]interface{})) - return c - case int: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - d[k] = decimal.New(int64(v.(int)), 0) - } - c.value = d - c.length = len(src.([]interface{})) - return c - case int8: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - d[k] = decimal.New(int64(v.(int8)), 0) - } - c.value = d - c.length = len(src.([]interface{})) - return c - case int16: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - d[k] = decimal.New(int64(v.(int16)), 0) - } - c.value = d - c.length = len(src.([]interface{})) - return c - case int32: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - d[k] = decimal.New(int64(v.(int32)), 0) - } - c.value = d - c.length = len(src.([]interface{})) - return c - case int64: - var c NumberArrayCollection - var d = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - d[k] = decimal.New(v.(int64), 0) - } - c.value = d - c.length = len(src.([]interface{})) - return c - case float32: - var c NumberArrayCollection - var f = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - f[k] = decimal.NewFromFloat32(v.(float32)) - } - c.value = f - c.length = len(src.([]interface{})) - return c - case float64: - var c NumberArrayCollection - var f = make([]decimal.Decimal, len(src.([]interface{}))) - for k, v := range src.([]interface{}) { - f[k] = decimal.NewFromFloat(v.(float64)) - } - c.value = f - c.length = len(src.([]interface{})) - return c - default: - panic("wrong type") - } - default: - panic("wrong type") - } -} - -type Collection interface { - Value() interface{} - - // All returns the underlying array represented by the collection. - All() []interface{} - - // Length return the length of the collection. - Length() int - - // ToStruct turn the collection to the specified struct using mapstructure. - // https://github.com/mitchellh/mapstructure - ToStruct(dist interface{}) - - // Select select the keys of collection and delete others. - Select(keys ...string) Collection - - // Avg returns the average value of a given key. - Avg(key ...string) decimal.Decimal - - // Sum returns the sum of all items in the collection. - Sum(key ...string) decimal.Decimal - - // Min returns the minimum value of a given key. - Min(key ...string) decimal.Decimal - - // Max returns the maximum value of a given key. - Max(key ...string) decimal.Decimal - - // Join joins the collection's values with a string. - Join(delimiter string) string - - // Combine combines the values of the collection, as keys, with the values of another array or collection. - Combine(value []interface{}) Collection - - // Count returns the total number of items in the collection. - Count() int - - // Pluck retrieves all of the values for a given key. - Pluck(key string) Collection - - // Mode returns the mode value of a given key. - Mode(key ...string) []interface{} - - // Only returns the items in the collection with the specified keys. - Only(keys []string) Collection - - // Prepend adds an item to the beginning of the collection. - Prepend(values ...interface{}) Collection - - // Pull removes and returns an item from the collection by its key. - Pull(key interface{}) Collection - - // Put sets the given key and value in the collection:. - Put(key string, value interface{}) Collection - - // SortBy sorts the collection by the given key. - SortBy(key string) Collection - - // Take returns a new collection with the specified number of items. - Take(num int) Collection - - // Chunk breaks the collection into multiple, smaller collections of a given size. - Chunk(num int) MultiDimensionalArrayCollection - - // Collapse collapses a collection of arrays into a single, flat collection. - Collapse() Collection - - // Concat appends the given array or collection values onto the end of the collection. - Concat(value interface{}) Collection - - // Contains determines whether the collection contains a given item. - Contains(value ...interface{}) bool - - // CountBy counts the occurrences of values in the collection. By default, the method counts the occurrences of every element. - CountBy(callback ...interface{}) map[interface{}]int - - // CrossJoin cross joins the collection's values among the given arrays or collections, returning a Cartesian product with all possible permutations. - CrossJoin(array ...[]interface{}) MultiDimensionalArrayCollection - - // Dd dumps the collection's items and ends execution of the script. - Dd() - - // Diff compares the collection against another collection or a plain PHP array based on its values. - // This method will return the values in the original collection that are not present in the given collection. - Diff(interface{}) Collection - - // DiffAssoc compares the collection against another collection or a plain PHP array based on its keys and values. - // This method will return the key / value pairs in the original collection that are not present in the given collection. - DiffAssoc(map[string]interface{}) Collection - - // DiffKeys compares the collection against another collection or a plain PHP array based on its keys. - // This method will return the key / value pairs in the original collection that are not present in the given collection. - DiffKeys(map[string]interface{}) Collection - - // Dump dumps the collection's items. - Dump() - - // Each iterates over the items in the collection and passes each item to a callback. - Each(func(item, value interface{}) (interface{}, bool)) Collection - - // Every may be used to verify that all elements of a collection pass a given truth test. - Every(CB) bool - - // Except returns all items in the collection except for those with the specified keys. - Except([]string) Collection - - // Filter filters the collection using the given callback, keeping only those items that pass a given truth test. - Filter(CB) Collection - - // First returns the first element in the collection that passes a given truth test. - First(...CB) interface{} - - // FirstWhere returns the first element in the collection with the given key / value pair. - FirstWhere(key string, values ...interface{}) map[string]interface{} - - // FlatMap iterates through the collection and passes each value to the given callback. - FlatMap(func(value interface{}) interface{}) Collection - - // Flip swaps the collection's keys with their corresponding values. - Flip() Collection - - // Forget removes an item from the collection by its key. - Forget(string) Collection - - // ForPage returns a new collection containing the items that would be present on a given page number. - ForPage(int, int) Collection - - // Get returns the item at a given key. If the key does not exist, null is returned. - Get(string, ...interface{}) interface{} - - // GroupBy groups the collection's items by a given key. - GroupBy(string) Collection - - // Has determines if a given key exists in the collection. - Has(...string) bool - - // Implode joins the items in a collection. Its arguments depend on the type of items in the collection. - Implode(string, string) string - - // Intersect removes any values from the original collection that are not present in the given array or collection. - Intersect([]string) Collection - - // IntersectByKeys removes any keys from the original collection that are not present in the given array or collection. - IntersectByKeys(map[string]interface{}) Collection - - // IsEmpty returns true if the collection is empty; otherwise, false is returned. - IsEmpty() bool - - // IsNotEmpty returns true if the collection is not empty; otherwise, false is returned. - IsNotEmpty() bool - - // KeyBy keys the collection by the given key. If multiple items have the same key, only the last one will - // appear in the new collection. - KeyBy(interface{}) Collection - - // Keys returns all of the collection's keys. - Keys() Collection - - // Last returns the last element in the collection that passes a given truth test. - Last(...CB) interface{} - - // MapToGroups groups the collection's items by the given callback. - MapToGroups(MapCB) Collection - - // MapWithKeys iterates through the collection and passes each value to the given callback. - MapWithKeys(MapCB) Collection - - // Median returns the median value of a given key. - Median(...string) decimal.Decimal - - // Merge merges the given array or collection with the original collection. If a string key in the given items - // matches a string key in the original collection, the given items's value will overwrite the value in the - // original collection. - Merge(interface{}) Collection - - // Pad will fill the array with the given value until the array reaches the specified size. - Pad(int, interface{}) Collection - - // Partition separate elements that pass a given truth test from those that do not. - Partition(PartCB) (Collection, Collection) - - // Pop removes and returns the last item from the collection. - Pop() interface{} - - // Push appends an item to the end of the collection. - Push(interface{}) Collection - - // Random returns a random item from the collection. - Random(...int) Collection - - // Reduce reduces the collection to a single value, passing the result of each iteration into the subsequent iteration. - Reduce(ReduceCB) interface{} - - // Reject filters the collection using the given callback. - Reject(CB) Collection - - // Reverse reverses the order of the collection's items, preserving the original keys. - Reverse() Collection - - // Search searches the collection for the given value and returns its key if found. If the item is not found, - // -1 is returned. - Search(interface{}) int - - // Shift removes and returns the first item from the collection. - Shift() Collection - - // Shuffle randomly shuffles the items in the collection. - Shuffle() Collection - - // Slice returns a slice of the collection starting at the given index. - Slice(...int) Collection - - // Sort sorts the collection. - Sort() Collection - - // SortByDesc has the same signature as the sortBy method, but will sort the collection in the opposite order. - SortByDesc() Collection - - // Splice removes and returns a slice of items starting at the specified index. - Splice(index ...int) Collection - - // Split breaks a collection into the given number of groups. - Split(int) Collection - - // Unique returns all of the unique items in the collection. - Unique() Collection - - // WhereIn filters the collection by a given key / value contained within the given array. - WhereIn(string, []interface{}) Collection - - // WhereNotIn filters the collection by a given key / value not contained within the given array. - WhereNotIn(string, []interface{}) Collection - - // ToJson converts the collection into a json string. - ToJson() string - - // ToNumberArray converts the collection into a plain golang slice which contains decimal.Decimal. - ToNumberArray() []decimal.Decimal - - // ToIntArray converts the collection into a plain golang slice which contains int. - ToIntArray() []int - - // ToInt64Array converts the collection into a plain golang slice which contains int. - ToInt64Array() []int64 - - // ToStringArray converts the collection into a plain golang slice which contains string. - ToStringArray() []string - - // ToMultiDimensionalArray converts the collection into a multi dimensional array. - ToMultiDimensionalArray() [][]interface{} - - // ToMap converts the collection into a plain golang map. - ToMap() map[string]interface{} - - // ToMapArray converts the collection into a plain golang slice which contains map. - ToMapArray() []map[string]interface{} - - // Where filters the collection by a given key / value pair. - Where(key string, values ...interface{}) Collection -} - -func newDecimalFromInterface(a interface{}) decimal.Decimal { - var d decimal.Decimal - - switch a.(type) { - case uint: - d = decimal.New(int64(a.(uint)), 0) - case uint8: - d = decimal.New(int64(a.(uint8)), 0) - case uint16: - d = decimal.New(int64(a.(uint16)), 0) - case uint32: - d = decimal.New(int64(a.(uint32)), 0) - case uint64: - d = decimal.New(int64(a.(uint64)), 0) - case int: - d = decimal.New(int64(a.(int)), 0) - case int8: - d = decimal.New(int64(a.(int8)), 0) - case int16: - d = decimal.New(int64(a.(int16)), 0) - case int32: - d = decimal.New(int64(a.(int32)), 0) - case int64: - d = decimal.New(a.(int64), 0) - case float32: - d = decimal.NewFromFloat32(a.(float32)) - case float64: - d = decimal.NewFromFloat(a.(float64)) - default: - panic("wrong type") - } - - return d -} - -func isTrue(a interface{}) bool { - switch a.(type) { - case uint: - return a.(uint) != uint(0) - case uint8: - return a.(uint8) != uint8(0) - case uint16: - return a.(uint16) != uint16(0) - case uint32: - return a.(uint32) != uint32(0) - case uint64: - return a.(uint64) != uint64(0) - case int: - return a.(int) != int(0) - case int8: - return a.(int8) != int8(0) - case int16: - return a.(int16) != int16(0) - case int32: - return a.(int32) != int32(0) - case int64: - return a.(int64) != int64(0) - case float32: - return a.(float32) != float32(0) - case float64: - return a.(float64) != float64(0) - case string: - return a.(string) != "" - case bool: - return a.(bool) - default: - return false - } -} - -func nd(a interface{}) decimal.Decimal { - return newDecimalFromInterface(a) -} - -type CB func(item, value interface{}) bool -type FilterFun func(value interface{}) interface{} -type MapCB func(map[string]interface{}) (string, interface{}) -type PartCB func(int) bool -type ReduceCB func(interface{}, interface{}) interface{} - -func copyMap(m map[string]interface{}) map[string]interface{} { - var buf bytes.Buffer - enc := gob.NewEncoder(&buf) - dec := gob.NewDecoder(&buf) - err := enc.Encode(m) - if err != nil { - panic(err) - } - var cm map[string]interface{} - err = dec.Decode(&cm) - if err != nil { - panic(err) - } - return cm -} - -func dd(c Collection) { - fmt.Println(c) -} - -func dump(c Collection) { - fmt.Println(c) -} - -func newDecimalArray(src interface{}) []decimal.Decimal { - switch src.(type) { - case []int: - var d = make([]decimal.Decimal, len(src.([]int))) - for k, v := range src.([]int) { - d[k] = decimal.New(int64(v), 0) - } - return d - case []int8: - var d = make([]decimal.Decimal, len(src.([]int8))) - for k, v := range src.([]int8) { - d[k] = decimal.New(int64(v), 0) - } - return d - case []int16: - var d = make([]decimal.Decimal, len(src.([]int16))) - for k, v := range src.([]int16) { - d[k] = decimal.New(int64(v), 0) - } - return d - case []int32: - var d = make([]decimal.Decimal, len(src.([]int32))) - for k, v := range src.([]int32) { - d[k] = decimal.New(int64(v), 0) - } - return d - case []int64: - var d = make([]decimal.Decimal, len(src.([]int64))) - for k, v := range src.([]int64) { - d[k] = decimal.New(v, 0) - } - return d - case []float32: - var f = make([]decimal.Decimal, len(src.([]float32))) - for k, v := range src.([]float32) { - f[k] = decimal.NewFromFloat32(v) - } - return f - case []float64: - var f = make([]decimal.Decimal, len(src.([]float64))) - for k, v := range src.([]float64) { - f[k] = decimal.NewFromFloat(v) - } - return f - default: - return nil - } -} - -func qsort(arr []decimal.Decimal, order bool) []decimal.Decimal { - if len(arr) < 2 { - return arr - } else { - pivot := arr[0] - var less []decimal.Decimal - var greater []decimal.Decimal - for _, value := range arr[1:] { - if value.LessThanOrEqual(pivot) { - less = append(less, value) - } else { - greater = append(greater, value) - } - } - - var result []decimal.Decimal - if order { - result = append(result, qsort(less, order)...) - result = append(result, pivot) - result = append(result, qsort(greater, order)...) - } else { - result = append(result, qsort(greater, order)...) - result = append(result, pivot) - result = append(result, qsort(less, order)...) - } - - return result - } -} diff --git a/vendor/github.com/chenhg5/collection/go.mod b/vendor/github.com/chenhg5/collection/go.mod deleted file mode 100644 index 29361e4..0000000 --- a/vendor/github.com/chenhg5/collection/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/chenhg5/collection - -go 1.12 - -require ( - github.com/magiconair/properties v1.8.1 - github.com/mitchellh/mapstructure v1.1.2 - github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 -) diff --git a/vendor/github.com/chenhg5/collection/go.sum b/vendor/github.com/chenhg5/collection/go.sum deleted file mode 100644 index be1d695..0000000 --- a/vendor/github.com/chenhg5/collection/go.sum +++ /dev/null @@ -1,6 +0,0 @@ -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= diff --git a/vendor/github.com/chenhg5/collection/map_array_collection.go b/vendor/github.com/chenhg5/collection/map_array_collection.go deleted file mode 100644 index 0156a7c..0000000 --- a/vendor/github.com/chenhg5/collection/map_array_collection.go +++ /dev/null @@ -1,845 +0,0 @@ -package collection - -import ( - "encoding/json" - "fmt" - "github.com/mitchellh/mapstructure" - "github.com/shopspring/decimal" - "math" - "math/rand" - "time" -) - -type MapArrayCollection struct { - value []map[string]interface{} - BaseCollection -} - -// Sum returns the sum of all items in the collection. -func (c MapArrayCollection) Sum(key ...string) decimal.Decimal { - var sum = decimal.New(0, 0) - - for i := 0; i < len(c.value); i++ { - sum = sum.Add(nd(c.value[i][key[0]])) - } - - return sum -} - -// Length return the length of the collection. -func (c MapArrayCollection) Length() int { - return len(c.value) -} - -// ToStruct turn the collection to the specified struct using mapstructure. -// https://github.com/mitchellh/mapstructure -func (c MapArrayCollection) ToStruct(dist interface{}) { - if err := mapstructure.Decode(c.value, dist); err != nil { - panic(err) - } -} - -// Select select the keys of collection and delete others. -func (c MapArrayCollection) Select(keys ...string) Collection { - var n = make([]map[string]interface{}, len(c.value)) - copy(n, c.value) - - for _, value := range n { - for k := range value { - exist := false - for i := 0; i < len(keys); i++ { - if keys[i] == k { - exist = true - break - } - } - if !exist { - delete(value, k) - } - } - } - - return MapArrayCollection{ - value: n, - } -} - -// Sum returns the sum of all items in the collection. -func (c MapArrayCollection) Avg(key ...string) decimal.Decimal { - var sum = decimal.New(0, 0) - - for i := 0; i < len(c.value); i++ { - sum = sum.Add(nd(c.value[i][key[0]])) - } - - return sum.Div(nd(len(c.value))) -} - -// Median returns the median value of a given key. -func (c MapArrayCollection) Median(key ...string) decimal.Decimal { - var f = make([]decimal.Decimal, len(c.value)) - for i := 0; i < len(c.value); i++ { - f = append(f, nd(c.value[i][key[0]])) - } - f = qsort(f, true) - return f[len(f)/2].Add(f[len(f)/2-1]).Div(nd(2)) -} - -// Min returns the minimum value of a given key. -func (c MapArrayCollection) Min(key ...string) decimal.Decimal { - - var ( - smallest = decimal.New(0, 0) - number decimal.Decimal - ) - - for i := 0; i < len(c.value); i++ { - number = nd(c.value[i][key[0]]) - if i == 0 { - smallest = number - continue - } - if smallest.GreaterThan(number) { - smallest = number - } - } - - return smallest -} - -// Max returns the maximum value of a given key. -func (c MapArrayCollection) Max(key ...string) decimal.Decimal { - - var ( - biggest = decimal.New(0, 0) - number decimal.Decimal - ) - - for i := 0; i < len(c.value); i++ { - number = nd(c.value[i][key[0]]) - if i == 0 { - biggest = number - continue - } - if biggest.LessThan(number) { - biggest = number - } - } - - return biggest -} - -// Pluck retrieves all of the values for a given key. -func (c MapArrayCollection) Pluck(key string) Collection { - var s = make([]interface{}, 0) - for i := 0; i < len(c.value); i++ { - s = append(s, c.value[i][key]) - } - return Collect(s) -} - -// Each iterates over the items in the collection and passes each item to a callback. -func (c MapArrayCollection) Each(cb func(item, value interface{}) (interface{}, bool)) Collection { - var d = make([]map[string]interface{}, 0) - var ( - newValue interface{} - stop = false - ) - for key, value := range c.value { - if !stop { - newValue, stop = cb(key, value) - d = append(d, newValue.(map[string]interface{})) - } else { - d = append(d, value) - } - } - return MapArrayCollection{ - value: d, - } -} - -// Prepend adds an item to the beginning of the collection. -func (c MapArrayCollection) Prepend(values ...interface{}) Collection { - - var d MapArrayCollection - - var n = make([]map[string]interface{}, len(c.value)) - copy(n, c.value) - - d.value = append([]map[string]interface{}{values[0].(map[string]interface{})}, n...) - d.length = len(d.value) - - return d -} - -// Only returns the items in the collection with the specified keys. -func (c MapArrayCollection) Only(keys []string) Collection { - var d MapArrayCollection - - var ma = make([]map[string]interface{}, 0) - for _, k := range keys { - m := make(map[string]interface{}, 0) - for _, v := range c.value { - m[k] = v[k] - } - ma = append(ma, m) - } - d.value = ma - d.length = len(ma) - - return d -} - -// Splice removes and returns a slice of items starting at the specified index. -func (c MapArrayCollection) Splice(index ...int) Collection { - - if len(index) == 1 { - var n = make([]map[string]interface{}, len(c.value)) - copy(n, c.value) - n = n[index[0]:] - - return MapArrayCollection{n, BaseCollection{length: len(n)}} - } else if len(index) > 1 { - var n = make([]map[string]interface{}, len(c.value)) - copy(n, c.value) - n = n[index[0] : index[0]+index[1]] - - return MapArrayCollection{n, BaseCollection{length: len(n)}} - } else { - panic("invalid argument") - } -} - -// Take returns a new collection with the specified number of items. -func (c MapArrayCollection) Take(num int) Collection { - var d MapArrayCollection - if num > c.length { - panic("not enough elements to take") - } - - if num >= 0 { - d.value = c.value[:num] - d.length = num - } else { - d.value = c.value[len(c.value)+num:] - d.length = 0 - num - } - - return d -} - -// All returns the underlying array represented by the collection. -func (c MapArrayCollection) All() []interface{} { - s := make([]interface{}, len(c.value)) - for i := 0; i < len(c.value); i++ { - s[i] = c.value[i] - } - - return s -} - -// Mode returns the mode value of a given key. -func (c MapArrayCollection) Mode(key ...string) []interface{} { - valueCount := make(map[interface{}]int) - for i := 0; i < c.length; i++ { - if v, ok := c.value[i][key[0]]; ok { - valueCount[v]++ - } - } - - maxCount := 0 - maxValue := make([]interface{}, len(valueCount)) - for v, c := range valueCount { - switch { - case c < maxCount: - continue - case c == maxCount: - maxValue = append(maxValue, v) - case c > maxCount: - maxValue = append([]interface{}{}, v) - maxCount = c - } - } - return maxValue -} - -// ToMapArray converts the collection into a plain golang slice which contains map. -func (c MapArrayCollection) ToMapArray() []map[string]interface{} { - return c.value -} - -// Chunk breaks the collection into multiple, smaller collections of a given size. -func (c MapArrayCollection) Chunk(num int) MultiDimensionalArrayCollection { - var d MultiDimensionalArrayCollection - d.length = c.length/num + 1 - d.value = make([][]interface{}, d.length) - - count := 0 - for i := 1; i <= c.length; i++ { - switch { - case i == c.length: - if i%num == 0 { - d.value[count] = c.All()[i-num:] - d.value = d.value[:d.length-1] - } else { - d.value[count] = c.All()[i-i%num:] - } - case i%num != 0 || i < num: - continue - default: - d.value[count] = c.All()[i-num : i] - count++ - } - } - - return d -} - -// Concat appends the given array or collection values onto the end of the collection. -func (c MapArrayCollection) Concat(value interface{}) Collection { - return MapArrayCollection{ - value: append(c.value, value.([]map[string]interface{})...), - BaseCollection: BaseCollection{length: c.length + len(value.([]map[string]interface{}))}, - } -} - -// CrossJoin cross joins the collection's values among the given arrays or collections, returning a Cartesian product with all possible permutations. -func (c MapArrayCollection) CrossJoin(array ...[]interface{}) MultiDimensionalArrayCollection { - var d MultiDimensionalArrayCollection - - // A two-dimensional-slice's initial - length := len(c.value) - for _, s := range array { - length *= len(s) - } - value := make([][]interface{}, length) - for i := range value { - value[i] = make([]interface{}, len(array)+1) - } - - offset := length / c.length - for i := 0; i < length; i++ { - value[i][0] = c.value[i/offset] - } - assignmentToValue(value, array, length, 1, 0, offset) - - d.value = value - d.length = length - return d -} - -// vl: length of value -// ai: index of array -// si: index of value's sub-array -func assignmentToValue(value, array [][]interface{}, vl, si, ai, preOffset int) { - offset := preOffset / len(array[ai]) - times := 0 - - for i := 0; i < vl; i++ { - if i >= preOffset && i%preOffset == 0 { - times++ - } - value[i][si] = array[ai][(i-preOffset*times)/offset] - } - - if ai < len(array)-1 { - assignmentToValue(value, array, vl, si+1, ai+1, offset) - } -} - -// Dd dumps the collection's items and ends execution of the script. -func (c MapArrayCollection) Dd() { - dd(c) -} - -// Dump dumps the collection's items. -func (c MapArrayCollection) Dump() { - dump(c) -} - -// Every may be used to verify that all elements of a collection pass a given truth test. -func (c MapArrayCollection) Every(cb CB) bool { - for key, value := range c.value { - if !cb(key, value) { - return false - } - } - return true -} - -// Filter filters the collection using the given callback, keeping only those items that pass a given truth test. -func (c MapArrayCollection) Filter(cb CB) Collection { - var d = make([]map[string]interface{}, 0) - copy(d, c.value) - for key, value := range c.value { - if !cb(key, value) { - d = append(d[:key], d[key+1:]...) - } - } - return MapArrayCollection{ - value: d, - } -} - -// First returns the first element in the collection that passes a given truth test. -func (c MapArrayCollection) First(cbs ...CB) interface{} { - if len(cbs) > 0 { - for key, value := range c.value { - if cbs[0](key, value) { - return value - } - } - return nil - } else { - if len(c.value) > 0 { - return c.value[0] - } else { - return nil - } - } -} - -// FirstWhere returns the first element in the collection with the given key / value pair. -func (c MapArrayCollection) FirstWhere(key string, values ...interface{}) map[string]interface{} { - if len(values) < 1 { - for _, value := range c.value { - if isTrue(value[key]) { - return value - } - } - } else if len(values) < 2 { - for _, value := range c.value { - if value[key] == values[0] { - return value - } - } - } else { - switch values[0].(string) { - case ">": - for _, value := range c.value { - if nd(value[key]).GreaterThan(nd(values[1])) { - return value - } - } - case ">=": - for _, value := range c.value { - if nd(value[key]).GreaterThanOrEqual(nd(values[1])) { - return value - } - } - case "<": - for _, value := range c.value { - if nd(value[key]).LessThan(nd(values[1])) { - return value - } - } - case "<=": - for _, value := range c.value { - if nd(value[key]).LessThanOrEqual(nd(values[1])) { - return value - } - } - case "=": - for _, value := range c.value { - if value[key] == values[1] { - return value - } - } - } - } - return map[string]interface{}{} -} - -// GroupBy groups the collection's items by a given key. -func (c MapArrayCollection) GroupBy(k string) Collection { - var d = make(map[string]interface{}, 0) - for _, value := range c.value { - for kk, vv := range value { - if kk == k { - vvKey := fmt.Sprintf("%v", vv) - if _, ok := d[vvKey]; ok { - am := d[vvKey].([]map[string]interface{}) - am = append(am, value) - d[vvKey] = am - } else { - d[vvKey] = []map[string]interface{}{value} - } - } - } - } - return MapCollection{ - value: d, - } -} - -// Implode joins the items in a collection. Its arguments depend on the type of items in the collection. -func (c MapArrayCollection) Implode(key string, delimiter string) string { - var res = "" - for _, value := range c.value { - for kk, vv := range value { - if kk == key { - res += fmt.Sprintf("%v", vv) + delimiter - } - } - } - return res[:len(res)-1] -} - -// IsEmpty returns true if the collection is empty; otherwise, false is returned. -func (c MapArrayCollection) IsEmpty() bool { - return len(c.value) == 0 -} - -// IsNotEmpty returns true if the collection is not empty; otherwise, false is returned. -func (c MapArrayCollection) IsNotEmpty() bool { - return len(c.value) != 0 -} - -// KeyBy keys the collection by the given key. If multiple items have the same key, only the last one will -// appear in the new collection. -func (c MapArrayCollection) KeyBy(v interface{}) Collection { - var d = make(map[string]interface{}, 0) - if k, ok := v.(string); ok { - for _, value := range c.value { - for kk, vv := range value { - if kk == k { - d[fmt.Sprintf("%v", vv)] = []map[string]interface{}{value} - } - } - } - } else { - vb := v.(FilterFun) - for _, value := range c.value { - for kk, vv := range value { - if kk == k { - d[fmt.Sprintf("%v", vb(vv))] = []map[string]interface{}{value} - } - } - } - } - return MapCollection{ - value: d, - } -} - -// Last returns the last element in the collection that passes a given truth test. -func (c MapArrayCollection) Last(cbs ...CB) interface{} { - if len(cbs) > 0 { - var last interface{} - for key, value := range c.value { - if cbs[0](key, value) { - last = value - } - } - return last - } else { - if len(c.value) > 0 { - return c.value[len(c.value)-1] - } else { - return nil - } - } -} - -// MapToGroups groups the collection's items by the given callback. -func (c MapArrayCollection) MapToGroups(cb MapCB) Collection { - var d = make(map[string]interface{}, 0) - for _, value := range c.value { - nk, nv := cb(value) - if _, ok := d[nk]; ok { - am := d[nk].([]interface{}) - am = append(am, nv) - d[nk] = am - } else { - d[nk] = []interface{}{nv} - } - } - return MapCollection{ - value: d, - } -} - -// MapWithKeys iterates through the collection and passes each value to the given callback. -func (c MapArrayCollection) MapWithKeys(cb MapCB) Collection { - var d = make(map[string]interface{}, 0) - for _, value := range c.value { - nk, nv := cb(value) - d[nk] = nv - } - return MapCollection{ - value: d, - } -} - -// Partition separate elements that pass a given truth test from those that do not. -func (c MapArrayCollection) Partition(cb PartCB) (Collection, Collection) { - var d1 = make([]map[string]interface{}, 0) - var d2 = make([]map[string]interface{}, 0) - - for i := 0; i < len(c.value); i++ { - if cb(i) { - d1 = append(d1, c.value[i]) - } else { - d2 = append(d2, c.value[i]) - } - } - - return MapArrayCollection{ - value: d1, - }, MapArrayCollection{ - value: d2, - } -} - -// Pop removes and returns the last item from the collection. -func (c MapArrayCollection) Pop() interface{} { - last := c.value[len(c.value)-1] - c.value = c.value[:len(c.value)-1] - return last -} - -// Push appends an item to the end of the collection. -func (c MapArrayCollection) Push(v interface{}) Collection { - var d = make([]map[string]interface{}, len(c.value)+1) - for i := 0; i < len(d); i++ { - if i < len(c.value) { - d[i] = c.value[i] - } else { - d[i] = v.(map[string]interface{}) - } - } - - return MapArrayCollection{ - value: d, - } -} - -// Random returns a random item from the collection. -func (c MapArrayCollection) Random(num ...int) Collection { - if len(num) == 0 { - return BaseCollection{ - value: c.value[rand.Intn(len(c.value))], - } - } else { - if num[0] > len(c.value) { - panic("wrong num") - } - var d = make([]map[string]interface{}, len(c.value)) - copy(d, c.value) - for i := 0; i < len(c.value)-num[0]; i++ { - index := rand.Intn(len(d)) - d = append(d[:index], d[index+1:]...) - } - return MapArrayCollection{ - value: d, - } - } -} - -// Reduce reduces the collection to a single value, passing the result of each iteration into the subsequent iteration. -func (c MapArrayCollection) Reduce(cb ReduceCB) interface{} { - var res interface{} - - for i := 0; i < len(c.value); i++ { - res = cb(res, c.value[i]) - } - - return res -} - -// Reject filters the collection using the given callback. -func (c MapArrayCollection) Reject(cb CB) Collection { - var d = make([]map[string]interface{}, 0) - for key, value := range c.value { - if !cb(key, value) { - d = append(d, value) - } - } - return MapArrayCollection{ - value: d, - } -} - -// Reverse reverses the order of the collection's items, preserving the original keys. -func (c MapArrayCollection) Reverse() Collection { - var d = make([]map[string]interface{}, len(c.value)) - j := 0 - for i := len(c.value) - 1; i > -1; i-- { - d[j] = c.value[i] - j++ - } - return MapArrayCollection{ - value: d, - } -} - -// Search searches the collection for the given value and returns its key if found. If the item is not found, -// -1 is returned. -func (c MapArrayCollection) Search(v interface{}) int { - cb := v.(CB) - for i := 0; i < len(c.value); i++ { - if cb(i, c.value[i]) { - return i - } - } - return -1 -} - -// Shift removes and returns the first item from the collection. -func (c MapArrayCollection) Shift() Collection { - var d = make([]map[string]interface{}, len(c.value)) - copy(d, c.value) - d = d[1:] - return MapArrayCollection{ - value: d, - } -} - -// Shuffle randomly shuffles the items in the collection. -func (c MapArrayCollection) Shuffle() Collection { - var d = make([]map[string]interface{}, len(c.value)) - copy(d, c.value) - rand.Seed(time.Now().UnixNano()) - rand.Shuffle(len(c.value), func(i, j int) { d[i], d[j] = d[j], d[i] }) - return MapArrayCollection{ - value: d, - } -} - -// Slice returns a slice of the collection starting at the given index. -func (c MapArrayCollection) Slice(keys ...int) Collection { - var d = make([]map[string]interface{}, len(c.value)) - copy(d, c.value) - if len(keys) == 1 { - return MapArrayCollection{ - value: d[keys[0]:], - } - } else { - return MapArrayCollection{ - value: d[keys[0] : keys[0]+keys[1]], - } - } -} - -// Split breaks a collection into the given number of groups. -func (c MapArrayCollection) Split(num int) Collection { - var d = make([][]interface{}, int(math.Ceil(float64(len(c.value))/float64(num)))) - - j := -1 - for i := 0; i < len(c.value); i++ { - if i%num == 0 { - j++ - if i+num <= len(c.value) { - d[j] = make([]interface{}, num) - } else { - d[j] = make([]interface{}, len(c.value)-i) - } - d[j][i%num] = c.value[i] - } else { - d[j][i%num] = c.value[i] - } - } - - return MultiDimensionalArrayCollection{ - value: d, - } -} - -// WhereIn filters the collection by a given key / value contained within the given array. -func (c MapArrayCollection) WhereIn(key string, in []interface{}) Collection { - var d = make([]map[string]interface{}, 0) - for i := 0; i < len(c.value); i++ { - for j := 0; j < len(in); j++ { - if c.value[i][key] == in[j] { - d = append(d, copyMap(c.value[i])) - break - } - } - } - return MapArrayCollection{ - value: d, - } -} - -// WhereNotIn filters the collection by a given key / value not contained within the given array. -func (c MapArrayCollection) WhereNotIn(key string, in []interface{}) Collection { - var d = make([]map[string]interface{}, 0) - for i := 0; i < len(c.value); i++ { - isIn := false - for j := 0; j < len(in); j++ { - if c.value[i][key] == in[j] { - isIn = true - break - } - } - if !isIn { - d = append(d, copyMap(c.value[i])) - } - } - return MapArrayCollection{ - value: d, - } -} - -// Where filters the collection by a given key / value pair. -func (c MapArrayCollection) Where(key string, values ...interface{}) Collection { - var d = make([]map[string]interface{}, 0) - if len(values) < 1 { - for _, value := range c.value { - if isTrue(value[key]) { - d = append(d, copyMap(value)) - } - } - } else if len(values) < 2 { - for _, value := range c.value { - if value[key] == values[0] { - d = append(d, copyMap(value)) - } - } - } else { - switch values[0].(string) { - case ">": - for _, value := range c.value { - if nd(value[key]).GreaterThan(nd(values[1])) { - d = append(d, copyMap(value)) - } - } - case ">=": - for _, value := range c.value { - if nd(value[key]).GreaterThanOrEqual(nd(values[1])) { - d = append(d, copyMap(value)) - } - } - case "<": - for _, value := range c.value { - if nd(value[key]).LessThan(nd(values[1])) { - d = append(d, copyMap(value)) - } - } - case "<=": - for _, value := range c.value { - if nd(value[key]).LessThanOrEqual(nd(values[1])) { - d = append(d, copyMap(value)) - } - } - case "=": - for _, value := range c.value { - if value[key] == values[1] { - d = append(d, copyMap(value)) - } - } - } - } - return MapArrayCollection{ - value: d, - } -} - -// ToJson converts the collection into a json string. -func (c MapArrayCollection) ToJson() string { - s, err := json.Marshal(c.value) - if err != nil { - panic(err) - } - return string(s) -} diff --git a/vendor/github.com/chenhg5/collection/map_collection.go b/vendor/github.com/chenhg5/collection/map_collection.go deleted file mode 100644 index 633cbec..0000000 --- a/vendor/github.com/chenhg5/collection/map_collection.go +++ /dev/null @@ -1,301 +0,0 @@ -package collection - -import ( - "encoding/json" - "fmt" - "github.com/mitchellh/mapstructure" -) - -type MapCollection struct { - value map[string]interface{} - BaseCollection -} - -// Only returns the items in the collection with the specified keys. -func (c MapCollection) Only(keys []string) Collection { - var ( - d MapCollection - m = make(map[string]interface{}, 0) - ) - - for _, k := range keys { - m[k] = c.value[k] - } - d.value = m - d.length = len(m) - - return d -} - -// ToStruct turn the collection to the specified struct using mapstructure. -// https://github.com/mitchellh/mapstructure -func (c MapCollection) ToStruct(dist interface{}) { - if err := mapstructure.Decode(c.value, dist); err != nil { - panic(err) - } -} - -// Select select the keys of collection and delete others. -func (c MapCollection) Select(keys ...string) Collection { - n := copyMap(c.value) - - for key := range n { - exist := false - for i := 0; i < len(keys); i++ { - if keys[i] == key { - exist = true - break - } - } - if !exist { - delete(n, key) - } - } - - return MapCollection{ - value: n, - } -} - -// Prepend adds an item to the beginning of the collection. -func (c MapCollection) Prepend(values ...interface{}) Collection { - - var m = copyMap(c.value) - m[values[0].(string)] = values[1] - - return MapCollection{m, BaseCollection{length: len(m)}} -} - -// ToMap converts the collection into a plain golang map. -func (c MapCollection) ToMap() map[string]interface{} { - return c.value -} - -// Contains determines whether the collection contains a given item. -func (c MapCollection) Contains(value ...interface{}) bool { - if callback, ok := value[0].(CB); ok { - for k, v := range c.value { - if callback(k, v) { - return true - } - } - return false - } - - for _, v := range c.value { - if v == value[0] { - return true - } - } - return false -} - -// Dd dumps the collection's items and ends execution of the script. -func (c MapCollection) Dd() { - dd(c) -} - -// Dump dumps the collection's items. -func (c MapCollection) Dump() { - dump(c) -} - -// DiffAssoc compares the collection against another collection or a plain PHP array based on its keys and values. -// This method will return the key / value pairs in the original collection that are not present in the given collection. -func (c MapCollection) DiffAssoc(m map[string]interface{}) Collection { - var d = make(map[string]interface{}, 0) - for key, value := range m { - if v, ok := c.value[key]; ok { - if v != value { - d[key] = value - } - } - } - return MapCollection{ - value: d, - } -} - -// DiffKeys compares the collection against another collection or a plain PHP array based on its keys. -// This method will return the key / value pairs in the original collection that are not present in the given collection. -func (c MapCollection) DiffKeys(m map[string]interface{}) Collection { - var d = make(map[string]interface{}, 0) - for key, value := range c.value { - if _, ok := m[key]; !ok { - d[key] = value - } - } - return MapCollection{ - value: d, - } -} - -// Each iterates over the items in the collection and passes each item to a callback. -func (c MapCollection) Each(cb func(item, value interface{}) (interface{}, bool)) Collection { - var d = make(map[string]interface{}, 0) - var ( - newValue interface{} - stop = false - ) - for key, value := range c.value { - if !stop { - newValue, stop = cb(key, value) - d[key] = newValue - } else { - d[key] = value - } - } - return MapCollection{ - value: d, - } -} - -// Every may be used to verify that all elements of a collection pass a given truth test. -func (c MapCollection) Every(cb CB) bool { - for key, value := range c.value { - if !cb(key, value) { - return false - } - } - return true -} - -// Except returns all items in the collection except for those with the specified keys. -func (c MapCollection) Except(keys []string) Collection { - var d = copyMap(c.value) - - for _, key := range keys { - delete(d, key) - } - return MapCollection{ - value: d, - } -} - -// FlatMap iterates through the collection and passes each value to the given callback. -func (c MapCollection) FlatMap(cb func(value interface{}) interface{}) Collection { - var d = make(map[string]interface{}, 0) - for key, value := range c.value { - d[key] = cb(value) - } - return MapCollection{ - value: d, - } -} - -// Flip swaps the collection's keys with their corresponding values. -func (c MapCollection) Flip() Collection { - var d = make(map[string]interface{}, 0) - for key, value := range c.value { - d[fmt.Sprintf("%v", value)] = key - } - return MapCollection{ - value: d, - } -} - -// Forget removes an item from the collection by its key. -func (c MapCollection) Forget(k string) Collection { - var d = copyMap(c.value) - - for key := range c.value { - if key == k { - delete(d, key) - } - } - - return MapCollection{ - value: d, - } -} - -// Get returns the item at a given key. If the key does not exist, null is returned. -func (c MapCollection) Get(k string, v ...interface{}) interface{} { - if len(v) > 0 { - if value, ok := c.value[k]; ok { - return value - } else { - return v[0] - } - } else { - return c.value[k] - } -} - -// Has determines if a given key exists in the collection. -func (c MapCollection) Has(keys ...string) bool { - for _, key := range keys { - exist := false - for kk := range c.value { - if key == kk { - exist = true - break - } - } - if !exist { - return false - } - } - return true -} - -// IntersectByKeys removes any keys from the original collection that are not present in the given array or collection. -func (c MapCollection) IntersectByKeys(m map[string]interface{}) Collection { - var d = make(map[string]interface{}, 0) - for key, value := range c.value { - for kk := range m { - if kk == key { - d[kk] = value - } - } - } - return MapCollection{ - value: d, - } -} - -// IsEmpty returns true if the collection is empty; otherwise, false is returned. -func (c MapCollection) IsEmpty() bool { - return len(c.value) == 0 -} - -// IsNotEmpty returns true if the collection is not empty; otherwise, false is returned. -func (c MapCollection) IsNotEmpty() bool { - return len(c.value) != 0 -} - -// Keys returns all of the collection's keys. -func (c MapCollection) Keys() Collection { - var d = make([]string, 0) - for key := range c.value { - d = append(d, key) - } - return StringArrayCollection{ - value: d, - } -} - -// Merge merges the given array or collection with the original collection. If a string key in the given items -// matches a string key in the original collection, the given items's value will overwrite the value in the -// original collection. -func (c MapCollection) Merge(i interface{}) Collection { - m := i.(map[string]interface{}) - var d = copyMap(c.value) - - for key, value := range m { - d[key] = value - } - - return MapCollection{ - value: d, - } -} - -// ToJson converts the collection into a json string. -func (c MapCollection) ToJson() string { - s, err := json.Marshal(c.value) - if err != nil { - panic(err) - } - return string(s) -} diff --git a/vendor/github.com/chenhg5/collection/muti_dimensional_array_collection.go b/vendor/github.com/chenhg5/collection/muti_dimensional_array_collection.go deleted file mode 100644 index 4f96775..0000000 --- a/vendor/github.com/chenhg5/collection/muti_dimensional_array_collection.go +++ /dev/null @@ -1,65 +0,0 @@ -package collection - -import "encoding/json" - -type MultiDimensionalArrayCollection struct { - value [][]interface{} - BaseCollection -} - -func (c MultiDimensionalArrayCollection) Value() interface{} { - return c.value -} - -func (c MultiDimensionalArrayCollection) ToMultiDimensionalArray() [][]interface{} { - return c.value -} - -// Collapse collapses a collection of arrays into a single, flat collection. -func (c MultiDimensionalArrayCollection) Collapse() Collection { - if len(c.value[0]) == 0 { - return Collect([]interface{}{}) - } - length := 0 - for _, v := range c.value { - length += len(v) - } - - d := make([]interface{}, length) - index := 0 - for _, innerSlice := range c.value { - for _, v := range innerSlice { - d[index] = v - index++ - } - } - - return Collect(d) -} - -// Concat appends the given array or collection values onto the end of the collection. -func (c MultiDimensionalArrayCollection) Concat(value interface{}) Collection { - return MultiDimensionalArrayCollection{ - value: append(c.value, value.([][]interface{})...), - BaseCollection: BaseCollection{length: c.length + len(value.([][]interface{}))}, - } -} - -// Dd dumps the collection's items and ends execution of the script. -func (c MultiDimensionalArrayCollection) Dd() { - dd(c) -} - -// Dump dumps the collection's items. -func (c MultiDimensionalArrayCollection) Dump() { - dump(c) -} - -// ToJson converts the collection into a json string. -func (c MultiDimensionalArrayCollection) ToJson() string { - s, err := json.Marshal(c.value) - if err != nil { - panic(err) - } - return string(s) -} diff --git a/vendor/github.com/chenhg5/collection/number_array_collection.go b/vendor/github.com/chenhg5/collection/number_array_collection.go deleted file mode 100644 index f18dbce..0000000 --- a/vendor/github.com/chenhg5/collection/number_array_collection.go +++ /dev/null @@ -1,721 +0,0 @@ -package collection - -import ( - "encoding/json" - "github.com/shopspring/decimal" - "math" - "math/rand" - "time" -) - -type NumberArrayCollection struct { - value []decimal.Decimal - BaseCollection -} - -// Sum returns the sum of all items in the collection. -func (c NumberArrayCollection) Sum(key ...string) decimal.Decimal { - - var sum = decimal.New(0, 0) - - for i := 0; i < len(c.value); i++ { - sum = sum.Add(c.value[i]) - } - - return sum -} - -// Length return the length of the collection. -func (c NumberArrayCollection) Length() int { - return len(c.value) -} - -// Avg returns the average value of a given key. -func (c NumberArrayCollection) Avg(key ...string) decimal.Decimal { - - var sum = decimal.New(0, 0) - - for i := 0; i < len(c.value); i++ { - sum = sum.Add(c.value[i]) - } - - return sum.Div(nd(len(c.value))) -} - -// Min returns the minimum value of a given key. -func (c NumberArrayCollection) Min(key ...string) decimal.Decimal { - - var smallest = decimal.New(0, 0) - - for i := 0; i < len(c.value); i++ { - if i == 0 { - smallest = c.value[i] - continue - } - if smallest.GreaterThan(c.value[i]) { - smallest = c.value[i] - } - } - - return smallest -} - -// Max returns the maximum value of a given key. -func (c NumberArrayCollection) Max(key ...string) decimal.Decimal { - - var biggest = decimal.New(0, 0) - - for i := 0; i < len(c.value); i++ { - if i == 0 { - biggest = c.value[i] - continue - } - if biggest.LessThan(c.value[i]) { - biggest = c.value[i] - } - } - - return biggest -} - -// Prepend adds an item to the beginning of the collection. -func (c NumberArrayCollection) Prepend(values ...interface{}) Collection { - var d NumberArrayCollection - - var n = make([]decimal.Decimal, len(c.value)) - copy(n, c.value) - - d.value = append([]decimal.Decimal{newDecimalFromInterface(values[0])}, n...) - d.length = len(d.value) - - return d -} - -// Splice removes and returns a slice of items starting at the specified index. -func (c NumberArrayCollection) Splice(index ...int) Collection { - - if len(index) == 1 { - var n = make([]decimal.Decimal, len(c.value)) - copy(n, c.value) - n = n[index[0]:] - - return NumberArrayCollection{n, BaseCollection{length: len(n)}} - } else if len(index) > 1 { - var n = make([]decimal.Decimal, len(c.value)) - copy(n, c.value) - n = n[index[0] : index[0]+index[1]] - - return NumberArrayCollection{n, BaseCollection{length: len(n)}} - } else { - panic("invalid argument") - } -} - -// Take returns a new collection with the specified number of items. -func (c NumberArrayCollection) Take(num int) Collection { - var d NumberArrayCollection - if num > c.length { - panic("not enough elements to take") - } - - if num >= 0 { - d.value = c.value[:num] - d.length = num - } else { - d.value = c.value[len(c.value)+num:] - d.length = 0 - num - } - - return d -} - -// All returns the underlying array represented by the collection. -func (c NumberArrayCollection) All() []interface{} { - s := make([]interface{}, len(c.value)) - for i := 0; i < len(c.value); i++ { - s[i] = c.value[i] - } - - return s -} - -// Mode returns the mode value of a given key. -func (c NumberArrayCollection) Mode(key ...string) []interface{} { - valueCount := c.CountBy() - maxCount := 0 - maxValue := make([]interface{}, len(valueCount)) - for v, c := range valueCount { - switch { - case c < maxCount: - continue - case c == maxCount: - maxValue = append(maxValue, newDecimalFromInterface(v)) - case c > maxCount: - maxValue = append([]interface{}{}, newDecimalFromInterface(v)) - maxCount = c - } - } - return maxValue -} - -// ToNumberArray converts the collection into a plain golang slice which contains decimal.Decimal. -func (c NumberArrayCollection) ToNumberArray() []decimal.Decimal { - return c.value -} - -// ToIntArray converts the collection into a plain golang slice which contains int. -func (c NumberArrayCollection) ToIntArray() []int { - var v = make([]int, len(c.value)) - for i, value := range c.value { - v[i] = int(value.IntPart()) - } - return v -} - -// ToInt64Array converts the collection into a plain golang slice which contains int64. -func (c NumberArrayCollection) ToInt64Array() []int64 { - var v = make([]int64, len(c.value)) - for i, value := range c.value { - v[i] = value.IntPart() - } - return v -} - -// Chunk breaks the collection into multiple, smaller collections of a given size. -func (c NumberArrayCollection) Chunk(num int) MultiDimensionalArrayCollection { - var d MultiDimensionalArrayCollection - d.length = c.length/num + 1 - d.value = make([][]interface{}, d.length) - - count := 0 - for i := 1; i <= c.length; i++ { - switch { - case i == c.length: - if i%num == 0 { - d.value[count] = c.All()[i-num:] - d.value = d.value[:d.length-1] - } else { - d.value[count] = c.All()[i-i%num:] - } - case i%num != 0 || i < num: - continue - default: - d.value[count] = c.All()[i-num : i] - count++ - } - } - - return d -} - -// Concat appends the given array or collection values onto the end of the collection. -func (c NumberArrayCollection) Concat(value interface{}) Collection { - return NumberArrayCollection{ - value: append(c.value, value.([]decimal.Decimal)...), - BaseCollection: BaseCollection{length: c.length + len(value.([]decimal.Decimal))}, - } -} - -// Contains determines whether the collection contains a given item. -func (c NumberArrayCollection) Contains(value ...interface{}) bool { - if callback, ok := value[0].(CB); ok { - for k, v := range c.value { - if callback(k, v) { - return true - } - } - return false - } - - for _, v := range c.value { - if v.Equal(nd(value[0])) { - return true - } - } - return false -} - -// CountBy counts the occurrences of values in the collection. By default, the method counts the occurrences of every element. -func (c NumberArrayCollection) CountBy(callback ...interface{}) map[interface{}]int { - valueCount := make(map[interface{}]int) - - if len(callback) > 0 { - if cb, ok := callback[0].(FilterFun); ok { - for _, v := range c.value { - valueCount[cb(v)]++ - } - } - } else { - for _, v := range c.value { - vv, _ := v.Float64() - valueCount[vv]++ - } - } - - return valueCount -} - -// CrossJoin cross joins the collection's values among the given arrays or collections, returning a Cartesian product with all possible permutations. -func (c NumberArrayCollection) CrossJoin(array ...[]interface{}) MultiDimensionalArrayCollection { - var d MultiDimensionalArrayCollection - - // A two-dimensional-slice's initial - length := len(c.value) - for _, s := range array { - length *= len(s) - } - value := make([][]interface{}, length) - for i := range value { - value[i] = make([]interface{}, len(array)+1) - } - - offset := length / c.length - for i := 0; i < length; i++ { - value[i][0] = c.value[i/offset] - } - assignmentToValue(value, array, length, 1, 0, offset) - - d.value = value - d.length = length - return d -} - -// Dd dumps the collection's items and ends execution of the script. -func (c NumberArrayCollection) Dd() { - dd(c) -} - -// Dump dumps the collection's items. -func (c NumberArrayCollection) Dump() { - dump(c) -} - -// Diff compares the collection against another collection or a plain PHP array based on its values. -// This method will return the values in the original collection that are not present in the given collection. -func (c NumberArrayCollection) Diff(m interface{}) Collection { - ms := newDecimalArray(m) - var d = make([]decimal.Decimal, 0) - for _, value := range c.value { - exist := false - for i := 0; i < len(ms); i++ { - if ms[i].Equal(value) { - exist = true - break - } - } - if !exist { - d = append(d, value) - } - } - return NumberArrayCollection{ - value: d, - } -} - -// Each iterates over the items in the collection and passes each item to a callback. -func (c NumberArrayCollection) Each(cb func(item, value interface{}) (interface{}, bool)) Collection { - var d = make([]decimal.Decimal, 0) - var ( - newValue interface{} - stop = false - ) - for key, value := range c.value { - if !stop { - newValue, stop = cb(key, value) - d = append(d, newDecimalFromInterface(newValue)) - } else { - d = append(d, value) - } - } - return NumberArrayCollection{ - value: d, - } -} - -// Every may be used to verify that all elements of a collection pass a given truth test. -func (c NumberArrayCollection) Every(cb CB) bool { - for key, value := range c.value { - if !cb(key, value) { - return false - } - } - return true -} - -// Filter filters the collection using the given callback, keeping only those items that pass a given truth test. -func (c NumberArrayCollection) Filter(cb CB) Collection { - var d = make([]decimal.Decimal, 0) - for key, value := range c.value { - if cb(key, value) { - d = append(d, value) - } - } - return NumberArrayCollection{ - value: d, - } -} - -// First returns the first element in the collection that passes a given truth test. -func (c NumberArrayCollection) First(cbs ...CB) interface{} { - if len(cbs) > 0 { - for key, value := range c.value { - if cbs[0](key, value) { - return value - } - } - return nil - } else { - if len(c.value) > 0 { - return c.value[0] - } else { - return nil - } - } -} - -// ForPage returns a new collection containing the items that would be present on a given page number. -func (c NumberArrayCollection) ForPage(page, size int) Collection { - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - if size > len(d) || size*(page-1) > len(d) { - return NumberArrayCollection{ - value: d, - } - } - if (page+1)*size > len(d) { - return NumberArrayCollection{ - value: d[(page-1)*size:], - } - } else { - return NumberArrayCollection{ - value: d[(page-1)*size : (page)*size], - } - } -} - -// IsEmpty returns true if the collection is empty; otherwise, false is returned. -func (c NumberArrayCollection) IsEmpty() bool { - return len(c.value) == 0 -} - -// IsNotEmpty returns true if the collection is not empty; otherwise, false is returned. -func (c NumberArrayCollection) IsNotEmpty() bool { - return len(c.value) != 0 -} - -// Last returns the last element in the collection that passes a given truth test. -func (c NumberArrayCollection) Last(cbs ...CB) interface{} { - if len(cbs) > 0 { - var last interface{} - for key, value := range c.value { - if cbs[0](key, value) { - last = value - } - } - return last - } else { - if len(c.value) > 0 { - return c.value[len(c.value)-1] - } else { - return nil - } - } -} - -// Median returns the median value of a given key. -func (c NumberArrayCollection) Median(key ...string) decimal.Decimal { - - if len(c.value) < 2 { - return c.value[0] - } - - var f = make([]decimal.Decimal, len(c.value)) - copy(f, c.value) - f = qsort(f, true) - return f[len(f)/2].Add(f[len(f)/2-1]).Div(nd(2)) -} - -// Merge merges the given array or collection with the original collection. If a string key in the given items -// matches a string key in the original collection, the given items's value will overwrite the value in the -// original collection. -func (c NumberArrayCollection) Merge(i interface{}) Collection { - m := newDecimalArray(i) - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - d = append(d, m...) - - return NumberArrayCollection{ - value: d, - } -} - -// Pad will fill the array with the given value until the array reaches the specified size. -func (c NumberArrayCollection) Pad(num int, value interface{}) Collection { - if len(c.value) > num { - d := make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - return NumberArrayCollection{ - value: d, - } - } - if num > 0 { - d := make([]decimal.Decimal, num) - for i := 0; i < num; i++ { - if i < len(c.value) { - d[i] = c.value[i] - } else { - d[i] = nd(value) - } - } - return NumberArrayCollection{ - value: d, - } - } else { - d := make([]decimal.Decimal, -num) - for i := 0; i < -num; i++ { - if i < -num-len(c.value) { - d[i] = nd(value) - } else { - d[i] = c.value[i] - } - } - return NumberArrayCollection{ - value: d, - } - } -} - -// Partition separate elements that pass a given truth test from those that do not. -func (c NumberArrayCollection) Partition(cb PartCB) (Collection, Collection) { - var d1 = make([]decimal.Decimal, 0) - var d2 = make([]decimal.Decimal, 0) - - for i := 0; i < len(c.value); i++ { - if cb(i) { - d1 = append(d1, c.value[i]) - } else { - d2 = append(d2, c.value[i]) - } - } - - return NumberArrayCollection{ - value: d1, - }, NumberArrayCollection{ - value: d2, - } -} - -// Pop removes and returns the last item from the collection. -func (c NumberArrayCollection) Pop() interface{} { - last := c.value[len(c.value)-1] - c.value = c.value[:len(c.value)-1] - return last -} - -// Push appends an item to the end of the collection. -func (c NumberArrayCollection) Push(v interface{}) Collection { - var d = make([]decimal.Decimal, len(c.value)+1) - for i := 0; i < len(d); i++ { - if i < len(c.value) { - d[i] = c.value[i] - } else { - d[i] = nd(v) - } - } - - return NumberArrayCollection{ - value: d, - } -} - -// Random returns a random item from the collection. -func (c NumberArrayCollection) Random(num ...int) Collection { - if len(num) == 0 { - return BaseCollection{ - value: c.value[rand.Intn(len(c.value))], - } - } else { - if num[0] > len(c.value) { - panic("wrong num") - } - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - for i := 0; i < len(c.value)-num[0]; i++ { - index := rand.Intn(len(d)) - d = append(d[:index], d[index+1:]...) - } - return NumberArrayCollection{ - value: d, - } - } -} - -// Reduce reduces the collection to a single value, passing the result of each iteration into the subsequent iteration. -func (c NumberArrayCollection) Reduce(cb ReduceCB) interface{} { - var res interface{} - - for i := 0; i < len(c.value); i++ { - res = cb(res, c.value[i]) - } - - return res -} - -// Reject filters the collection using the given callback. -func (c NumberArrayCollection) Reject(cb CB) Collection { - var d = make([]decimal.Decimal, 0) - for key, value := range c.value { - if !cb(key, value) { - d = append(d, value) - } - } - return NumberArrayCollection{ - value: d, - } -} - -// Reverse reverses the order of the collection's items, preserving the original keys. -func (c NumberArrayCollection) Reverse() Collection { - var d = make([]decimal.Decimal, len(c.value)) - j := 0 - for i := len(c.value) - 1; i > -1; i-- { - d[j] = c.value[i] - j++ - } - return NumberArrayCollection{ - value: d, - } -} - -// Search searches the collection for the given value and returns its key if found. If the item is not found, -// -1 is returned. -func (c NumberArrayCollection) Search(v interface{}) int { - if cb, ok := v.(CB); ok { - for i := 0; i < len(c.value); i++ { - if cb(i, c.value[i]) { - return i - } - } - } else { - n := nd(v) - for i := 0; i < len(c.value); i++ { - if n.Equal(c.value[i]) { - return i - } - } - } - return -1 -} - -// Shift removes and returns the first item from the collection. -func (c NumberArrayCollection) Shift() Collection { - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - d = d[1:] - return NumberArrayCollection{ - value: d, - } -} - -// Shuffle randomly shuffles the items in the collection. -func (c NumberArrayCollection) Shuffle() Collection { - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - rand.Seed(time.Now().UnixNano()) - rand.Shuffle(len(c.value), func(i, j int) { d[i], d[j] = d[j], d[i] }) - return NumberArrayCollection{ - value: d, - } -} - -// Slice returns a slice of the collection starting at the given index. -func (c NumberArrayCollection) Slice(keys ...int) Collection { - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - if len(keys) == 1 { - return NumberArrayCollection{ - value: d[keys[0]:], - } - } else { - return NumberArrayCollection{ - value: d[keys[0] : keys[0]+keys[1]], - } - } -} - -// Sort sorts the collection. -func (c NumberArrayCollection) Sort() Collection { - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - d = qsort(d, true) - return NumberArrayCollection{ - value: d, - } -} - -// SortByDesc has the same signature as the sortBy method, but will sort the collection in the opposite order. -func (c NumberArrayCollection) SortByDesc() Collection { - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - d = qsort(d, false) - return NumberArrayCollection{ - value: d, - } -} - -// Split breaks a collection into the given number of groups. -func (c NumberArrayCollection) Split(num int) Collection { - var d = make([][]interface{}, int(math.Ceil(float64(len(c.value))/float64(num)))) - - j := -1 - for i := 0; i < len(c.value); i++ { - if i%num == 0 { - j++ - if i+num <= len(c.value) { - d[j] = make([]interface{}, num) - } else { - d[j] = make([]interface{}, len(c.value)-i) - } - d[j][i%num] = c.value[i] - } else { - d[j][i%num] = c.value[i] - } - } - - return MultiDimensionalArrayCollection{ - value: d, - } -} - -// Unique returns all of the unique items in the collection. -func (c NumberArrayCollection) Unique() Collection { - var d = make([]decimal.Decimal, len(c.value)) - copy(d, c.value) - x := make([]decimal.Decimal, 0) - for _, i := range d { - if len(x) == 0 { - x = append(x, i) - } else { - for k, v := range x { - if i.Equal(v) { - break - } - if k == len(x)-1 { - x = append(x, i) - } - } - } - } - return NumberArrayCollection{ - value: x, - } -} - -// ToJson converts the collection into a json string. -func (c NumberArrayCollection) ToJson() string { - s, err := json.Marshal(c.value) - if err != nil { - panic(err) - } - return string(s) -} diff --git a/vendor/github.com/chenhg5/collection/string_array_collection.go b/vendor/github.com/chenhg5/collection/string_array_collection.go deleted file mode 100644 index 8b2c695..0000000 --- a/vendor/github.com/chenhg5/collection/string_array_collection.go +++ /dev/null @@ -1,672 +0,0 @@ -package collection - -import ( - "encoding/json" - "math" - "math/rand" - "time" -) - -type StringArrayCollection struct { - value []string - BaseCollection -} - -// Join joins the collection's values with a string. -func (c StringArrayCollection) Join(delimiter string) string { - s := "" - for i := 0; i < len(c.value); i++ { - if i != len(c.value)-1 { - s += c.value[i] + delimiter - } else { - s += c.value[i] - } - } - return s -} - -// Length return the length of the collection. -func (c StringArrayCollection) Length() int { - return len(c.value) -} - -// Combine combines the values of the collection, as keys, with the values of another array or collection. -func (c StringArrayCollection) Combine(value []interface{}) Collection { - var ( - m = make(map[string]interface{}, 0) - length = c.length - d MapCollection - ) - - if length > len(value) { - length = len(value) - } - - for i := 0; i < length; i++ { - m[c.value[i]] = value[i] - } - - d.value = m - d.length = len(m) - - return d -} - -// Prepend adds an item to the beginning of the collection. -func (c StringArrayCollection) Prepend(values ...interface{}) Collection { - - var d StringArrayCollection - - var n = make([]string, len(c.value)) - copy(n, c.value) - - d.value = append([]string{values[0].(string)}, n...) - d.length = len(d.value) - - return d -} - -// Splice removes and returns a slice of items starting at the specified index. -func (c StringArrayCollection) Splice(index ...int) Collection { - - if len(index) == 1 { - var n = make([]string, len(c.value)) - copy(n, c.value) - n = n[index[0]:] - - return StringArrayCollection{n, BaseCollection{length: len(n)}} - } else if len(index) > 1 { - var n = make([]string, len(c.value)) - copy(n, c.value) - n = n[index[0] : index[0]+index[1]] - - return StringArrayCollection{n, BaseCollection{length: len(n)}} - } else { - panic("invalid argument") - } -} - -// Take returns a new collection with the specified number of items. -func (c StringArrayCollection) Take(num int) Collection { - var d StringArrayCollection - if num > c.length { - panic("not enough elements to take") - } - - if num >= 0 { - d.value = c.value[:num] - d.length = num - } else { - d.value = c.value[len(c.value)+num:] - d.length = 0 - num - } - - return d -} - -// All returns the underlying array represented by the collection. -func (c StringArrayCollection) All() []interface{} { - s := make([]interface{}, len(c.value)) - for i := 0; i < len(c.value); i++ { - s[i] = c.value[i] - } - - return s -} - -// Mode returns the mode value of a given key. -func (c StringArrayCollection) Mode(key ...string) []interface{} { - valueCount := c.CountBy() - maxCount := 0 - maxValue := make([]interface{}, len(valueCount)) - for v, c := range valueCount { - switch { - case c < maxCount: - continue - case c == maxCount: - maxValue = append(maxValue, v) - case c > maxCount: - maxValue = append([]interface{}{}, v) - maxCount = c - } - } - return maxValue -} - -// ToStringArray converts the collection into a plain golang slice which contains string. -func (c StringArrayCollection) ToStringArray() []string { - return c.value -} - -// Chunk breaks the collection into multiple, smaller collections of a given size. -func (c StringArrayCollection) Chunk(num int) MultiDimensionalArrayCollection { - var d MultiDimensionalArrayCollection - d.length = c.length/num + 1 - d.value = make([][]interface{}, d.length) - - count := 0 - for i := 1; i <= c.length; i++ { - switch { - case i == c.length: - if i%num == 0 { - d.value[count] = c.All()[i-num:] - d.value = d.value[:d.length-1] - } else { - d.value[count] = c.All()[i-i%num:] - } - case i%num != 0 || i < num: - continue - default: - d.value[count] = c.All()[i-num : i] - count++ - } - } - - return d -} - -// Concat appends the given array or collection values onto the end of the collection. -func (c StringArrayCollection) Concat(value interface{}) Collection { - var d = make([]string, len(c.value)) - copy(d, c.value) - return StringArrayCollection{ - value: append(d, value.([]string)...), - BaseCollection: BaseCollection{length: c.length + len(value.([]string))}, - } -} - -// Contains determines whether the collection contains a given item. -func (c StringArrayCollection) Contains(value ...interface{}) bool { - if callback, ok := value[0].(CB); ok { - for k, v := range c.value { - if callback(k, v) { - return true - } - } - return false - } - - for _, v := range c.value { - if v == value[0].(string) { - return true - } - } - return false -} - -// CountBy counts the occurrences of values in the collection. By default, the method counts the occurrences of every element. -func (c StringArrayCollection) CountBy(callback ...interface{}) map[interface{}]int { - valueCount := make(map[interface{}]int) - - if len(callback) > 0 { - if cb, ok := callback[0].(FilterFun); ok { - for _, v := range c.value { - valueCount[cb(v)]++ - } - } - } else { - for _, v := range c.value { - valueCount[v]++ - } - } - - return valueCount -} - -// CrossJoin cross joins the collection's values among the given arrays or collections, returning a Cartesian product with all possible permutations. -func (c StringArrayCollection) CrossJoin(array ...[]interface{}) MultiDimensionalArrayCollection { - var d MultiDimensionalArrayCollection - - length := len(c.value) - for _, s := range array { - length *= len(s) - } - value := make([][]interface{}, length) - for i := range value { - value[i] = make([]interface{}, len(array)+1) - } - - offset := length / c.length - for i := 0; i < length; i++ { - value[i][0] = c.value[i/offset] - } - assignmentToValue(value, array, length, 1, 0, offset) - - d.value = value - d.length = length - return d -} - -// Dd dumps the collection's items and ends execution of the script. -func (c StringArrayCollection) Dd() { - dd(c) -} - -// Dump dumps the collection's items. -func (c StringArrayCollection) Dump() { - dump(c) -} - -// Diff compares the collection against another collection or a plain PHP array based on its values. -// This method will return the values in the original collection that are not present in the given collection. -func (c StringArrayCollection) Diff(m interface{}) Collection { - ms := m.([]string) - var d = make([]string, 0) - for _, value := range c.value { - exist := false - for i := 0; i < len(ms); i++ { - if ms[i] == value { - exist = true - break - } - } - if !exist { - d = append(d, value) - } - } - return StringArrayCollection{ - value: d, - } -} - -// Each iterates over the items in the collection and passes each item to a callback. -func (c StringArrayCollection) Each(cb func(item, value interface{}) (interface{}, bool)) Collection { - var d = make([]string, 0) - var ( - newValue interface{} - stop = false - ) - for key, value := range c.value { - if !stop { - newValue, stop = cb(key, value) - d = append(d, newValue.(string)) - } else { - d = append(d, value) - } - } - return StringArrayCollection{ - value: d, - } -} - -// Every may be used to verify that all elements of a collection pass a given truth test. -func (c StringArrayCollection) Every(cb CB) bool { - for key, value := range c.value { - if !cb(key, value) { - return false - } - } - return true -} - -// Filter filters the collection using the given callback, keeping only those items that pass a given truth test. -func (c StringArrayCollection) Filter(cb CB) Collection { - var d = make([]string, 0) - for key, value := range c.value { - if cb(key, value) { - d = append(d, value) - } - } - return StringArrayCollection{ - value: d, - } -} - -// First returns the first element in the collection that passes a given truth test. -func (c StringArrayCollection) First(cbs ...CB) interface{} { - if len(cbs) > 0 { - for key, value := range c.value { - if cbs[0](key, value) { - return value - } - } - return nil - } else { - if len(c.value) > 0 { - return c.value[0] - } else { - return nil - } - } -} - -// Intersect removes any values from the original collection that are not present in the given array or collection. -func (c StringArrayCollection) Intersect(keys []string) Collection { - var d = make([]string, 0) - for _, value := range c.value { - for _, v := range keys { - if v == value { - d = append(d, value) - break - } - } - } - return StringArrayCollection{ - value: d, - } -} - -// ForPage returns a new collection containing the items that would be present on a given page number. -func (c StringArrayCollection) ForPage(page, size int) Collection { - var d = make([]string, len(c.value)) - copy(d, c.value) - if size > len(d) || size*(page-1) > len(d) { - return StringArrayCollection{ - value: d, - } - } - if (page+1)*size > len(d) { - return StringArrayCollection{ - value: d[(page-1)*size:], - } - } else { - return StringArrayCollection{ - value: d[(page-1)*size : (page)*size], - } - } -} - -// IsEmpty returns true if the collection is empty; otherwise, false is returned. -func (c StringArrayCollection) IsEmpty() bool { - return len(c.value) == 0 -} - -// IsNotEmpty returns true if the collection is not empty; otherwise, false is returned. -func (c StringArrayCollection) IsNotEmpty() bool { - return len(c.value) != 0 -} - -// Last returns the last element in the collection that passes a given truth test. -func (c StringArrayCollection) Last(cbs ...CB) interface{} { - if len(cbs) > 0 { - var last interface{} - for key, value := range c.value { - if cbs[0](key, value) { - last = value - } - } - return last - } else { - if len(c.value) > 0 { - return c.value[len(c.value)-1] - } else { - return nil - } - } -} - -// Merge merges the given array or collection with the original collection. If a string key in the given items -// matches a string key in the original collection, the given items's value will overwrite the value in the -// original collection. -func (c StringArrayCollection) Merge(i interface{}) Collection { - m := i.([]string) - var d = make([]string, len(c.value)) - copy(d, c.value) - - for i := 0; i < len(m); i++ { - exist := false - for j := 0; j < len(d); j++ { - if d[j] == m[i] { - exist = true - break - } - } - if !exist { - d = append(d, m[i]) - } - } - - return StringArrayCollection{ - value: d, - } -} - -// Pad will fill the array with the given value until the array reaches the specified size. -func (c StringArrayCollection) Pad(num int, value interface{}) Collection { - if len(c.value) > num { - d := make([]string, len(c.value)) - copy(d, c.value) - return StringArrayCollection{ - value: d, - } - } - if num > 0 { - d := make([]string, num) - for i := 0; i < num; i++ { - if i < len(c.value) { - d[i] = c.value[i] - } else { - d[i] = value.(string) - } - } - return StringArrayCollection{ - value: d, - } - } else { - d := make([]string, -num) - for i := 0; i < -num; i++ { - if i < -num-len(c.value) { - d[i] = value.(string) - } else { - d[i] = c.value[i] - } - } - return StringArrayCollection{ - value: d, - } - } -} - -// Partition separate elements that pass a given truth test from those that do not. -func (c StringArrayCollection) Partition(cb PartCB) (Collection, Collection) { - var d1 = make([]string, 0) - var d2 = make([]string, 0) - - for i := 0; i < len(c.value); i++ { - if cb(i) { - d1 = append(d1, c.value[i]) - } else { - d2 = append(d2, c.value[i]) - } - } - - return StringArrayCollection{ - value: d1, - }, StringArrayCollection{ - value: d2, - } -} - -// Pop removes and returns the last item from the collection. -func (c StringArrayCollection) Pop() interface{} { - last := c.value[len(c.value)-1] - c.value = c.value[:len(c.value)-1] - return last -} - -// Push appends an item to the end of the collection. -func (c StringArrayCollection) Push(v interface{}) Collection { - var d = make([]string, len(c.value)+1) - for i := 0; i < len(d); i++ { - if i < len(c.value) { - d[i] = c.value[i] - } else { - d[i] = v.(string) - } - } - - return StringArrayCollection{ - value: d, - } -} - -// Random returns a random item from the collection. -func (c StringArrayCollection) Random(num ...int) Collection { - if len(num) == 0 { - return BaseCollection{ - value: c.value[rand.Intn(len(c.value))], - } - } else { - if num[0] > len(c.value) { - panic("wrong num") - } - var d = make([]string, len(c.value)) - copy(d, c.value) - for i := 0; i < len(c.value)-num[0]; i++ { - index := rand.Intn(len(d)) - d = append(d[:index], d[index+1:]...) - } - return StringArrayCollection{ - value: d, - } - } -} - -// Reduce reduces the collection to a single value, passing the result of each iteration into the subsequent iteration. -func (c StringArrayCollection) Reduce(cb ReduceCB) interface{} { - var res interface{} - - for i := 0; i < len(c.value); i++ { - res = cb(res, c.value[i]) - } - - return res -} - -// Reject filters the collection using the given callback. -func (c StringArrayCollection) Reject(cb CB) Collection { - var d = make([]string, 0) - for key, value := range c.value { - if !cb(key, value) { - d = append(d, value) - } - } - return StringArrayCollection{ - value: d, - } -} - -// Reverse reverses the order of the collection's items, preserving the original keys. -func (c StringArrayCollection) Reverse() Collection { - var d = make([]string, len(c.value)) - j := 0 - for i := len(c.value) - 1; i > -1; i-- { - d[j] = c.value[i] - j++ - } - return StringArrayCollection{ - value: d, - } -} - -// Search searches the collection for the given value and returns its key if found. If the item is not found, -// -1 is returned. -func (c StringArrayCollection) Search(v interface{}) int { - if s, ok := v.(string); ok { - for i := 0; i < len(c.value); i++ { - if s == c.value[i] { - return i - } - } - } else { - cb := v.(CB) - for i := 0; i < len(c.value); i++ { - if cb(i, c.value[i]) { - return i - } - } - } - return -1 -} - -// Shift removes and returns the first item from the collection. -func (c StringArrayCollection) Shift() Collection { - var d = make([]string, len(c.value)) - copy(d, c.value) - return StringArrayCollection{ - value: d[1:], - } -} - -// Shuffle randomly shuffles the items in the collection. -func (c StringArrayCollection) Shuffle() Collection { - var d = make([]string, len(c.value)) - copy(d, c.value) - rand.Seed(time.Now().UnixNano()) - rand.Shuffle(len(c.value), func(i, j int) { d[i], d[j] = d[j], d[i] }) - return StringArrayCollection{ - value: d, - } -} - -// Slice returns a slice of the collection starting at the given index. -func (c StringArrayCollection) Slice(keys ...int) Collection { - var d = make([]string, len(c.value)) - copy(d, c.value) - if len(keys) == 1 { - return StringArrayCollection{ - value: d[keys[0]:], - } - } else { - return StringArrayCollection{ - value: d[keys[0] : keys[0]+keys[1]], - } - } -} - -// Split breaks a collection into the given number of groups. -func (c StringArrayCollection) Split(num int) Collection { - var d = make([][]interface{}, int(math.Ceil(float64(len(c.value))/float64(num)))) - - j := -1 - for i := 0; i < len(c.value); i++ { - if i%num == 0 { - j++ - if i+num <= len(c.value) { - d[j] = make([]interface{}, num) - } else { - d[j] = make([]interface{}, len(c.value)-i) - } - d[j][i%num] = c.value[i] - } else { - d[j][i%num] = c.value[i] - } - } - - return MultiDimensionalArrayCollection{ - value: d, - } -} - -// Unique returns all of the unique items in the collection. -func (c StringArrayCollection) Unique() Collection { - var d = make([]string, len(c.value)) - copy(d, c.value) - x := make([]string, 0) - for _, i := range d { - if len(x) == 0 { - x = append(x, i) - } else { - for k, v := range x { - if i == v { - break - } - if k == len(x)-1 { - x = append(x, i) - } - } - } - } - return StringArrayCollection{ - value: x, - } -} - -// ToJson converts the collection into a json string. -func (c StringArrayCollection) ToJson() string { - s, err := json.Marshal(c.value) - if err != nil { - panic(err) - } - return string(s) -} diff --git a/vendor/github.com/fatih/color/LICENSE.md b/vendor/github.com/fatih/color/LICENSE.md deleted file mode 100644 index 25fdaf6..0000000 --- a/vendor/github.com/fatih/color/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Fatih Arslan - -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. diff --git a/vendor/github.com/fatih/color/README.md b/vendor/github.com/fatih/color/README.md deleted file mode 100644 index 42d9abc..0000000 --- a/vendor/github.com/fatih/color/README.md +++ /dev/null @@ -1,182 +0,0 @@ -# Archived project. No maintenance. - -This project is not maintained anymore and is archived. Feel free to fork and -make your own changes if needed. For more detail read my blog post: [Taking an indefinite sabbatical from my projects](https://arslan.io/2018/10/09/taking-an-indefinite-sabbatical-from-my-projects/) - -Thanks to everyone for their valuable feedback and contributions. - - -# Color [![GoDoc](https://godoc.org/github.com/fatih/color?status.svg)](https://godoc.org/github.com/fatih/color) - -Color lets you use colorized outputs in terms of [ANSI Escape -Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It -has support for Windows too! The API can be used in several ways, pick one that -suits you. - - -![Color](https://i.imgur.com/c1JI0lA.png) - - -## Install - -```bash -go get github.com/fatih/color -``` - -## Examples - -### Standard colors - -```go -// Print with default helper functions -color.Cyan("Prints text in cyan.") - -// A newline will be appended automatically -color.Blue("Prints %s in blue.", "text") - -// These are using the default foreground colors -color.Red("We have red") -color.Magenta("And many others ..") - -``` - -### Mix and reuse colors - -```go -// Create a new color object -c := color.New(color.FgCyan).Add(color.Underline) -c.Println("Prints cyan text with an underline.") - -// Or just add them to New() -d := color.New(color.FgCyan, color.Bold) -d.Printf("This prints bold cyan %s\n", "too!.") - -// Mix up foreground and background colors, create new mixes! -red := color.New(color.FgRed) - -boldRed := red.Add(color.Bold) -boldRed.Println("This will print text in bold red.") - -whiteBackground := red.Add(color.BgWhite) -whiteBackground.Println("Red text with white background.") -``` - -### Use your own output (io.Writer) - -```go -// Use your own io.Writer output -color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - -blue := color.New(color.FgBlue) -blue.Fprint(writer, "This will print text in blue.") -``` - -### Custom print functions (PrintFunc) - -```go -// Create a custom print function for convenience -red := color.New(color.FgRed).PrintfFunc() -red("Warning") -red("Error: %s", err) - -// Mix up multiple attributes -notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() -notice("Don't forget this...") -``` - -### Custom fprint functions (FprintFunc) - -```go -blue := color.New(FgBlue).FprintfFunc() -blue(myWriter, "important notice: %s", stars) - -// Mix up with multiple attributes -success := color.New(color.Bold, color.FgGreen).FprintlnFunc() -success(myWriter, "Don't forget this...") -``` - -### Insert into noncolor strings (SprintFunc) - -```go -// Create SprintXxx functions to mix strings with other non-colorized strings: -yellow := color.New(color.FgYellow).SprintFunc() -red := color.New(color.FgRed).SprintFunc() -fmt.Printf("This is a %s and this is %s.\n", yellow("warning"), red("error")) - -info := color.New(color.FgWhite, color.BgGreen).SprintFunc() -fmt.Printf("This %s rocks!\n", info("package")) - -// Use helper functions -fmt.Println("This", color.RedString("warning"), "should be not neglected.") -fmt.Printf("%v %v\n", color.GreenString("Info:"), "an important message.") - -// Windows supported too! Just don't forget to change the output to color.Output -fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) -``` - -### Plug into existing code - -```go -// Use handy standard colors -color.Set(color.FgYellow) - -fmt.Println("Existing text will now be in yellow") -fmt.Printf("This one %s\n", "too") - -color.Unset() // Don't forget to unset - -// You can mix up parameters -color.Set(color.FgMagenta, color.Bold) -defer color.Unset() // Use it in your function - -fmt.Println("All text will now be bold magenta.") -``` - -### Disable/Enable color - -There might be a case where you want to explicitly disable/enable color output. the -`go-isatty` package will automatically disable color output for non-tty output streams -(for example if the output were piped directly to `less`) - -`Color` has support to disable/enable colors both globally and for single color -definitions. For example suppose you have a CLI app and a `--no-color` bool flag. You -can easily disable the color output with: - -```go - -var flagNoColor = flag.Bool("no-color", false, "Disable color output") - -if *flagNoColor { - color.NoColor = true // disables colorized output -} -``` - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - -```go -c := color.New(color.FgCyan) -c.Println("Prints cyan text") - -c.DisableColor() -c.Println("This is printed without any color") - -c.EnableColor() -c.Println("This prints again cyan...") -``` - -## Todo - -* Save/Return previous values -* Evaluate fmt.Formatter interface - - -## Credits - - * [Fatih Arslan](https://github.com/fatih) - * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable) - -## License - -The MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details - diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go deleted file mode 100644 index 91c8e9f..0000000 --- a/vendor/github.com/fatih/color/color.go +++ /dev/null @@ -1,603 +0,0 @@ -package color - -import ( - "fmt" - "io" - "os" - "strconv" - "strings" - "sync" - - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" -) - -var ( - // NoColor defines if the output is colorized or not. It's dynamically set to - // false or true based on the stdout's file descriptor referring to a terminal - // or not. This is a global option and affects all colors. For more control - // over each color block use the methods DisableColor() individually. - NoColor = os.Getenv("TERM") == "dumb" || - (!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd())) - - // Output defines the standard output of the print functions. By default - // os.Stdout is used. - Output = colorable.NewColorableStdout() - - // Error defines a color supporting writer for os.Stderr. - Error = colorable.NewColorableStderr() - - // colorsCache is used to reduce the count of created Color objects and - // allows to reuse already created objects with required Attribute. - colorsCache = make(map[Attribute]*Color) - colorsCacheMu sync.Mutex // protects colorsCache -) - -// Color defines a custom color object which is defined by SGR parameters. -type Color struct { - params []Attribute - noColor *bool -} - -// Attribute defines a single SGR Code -type Attribute int - -const escape = "\x1b" - -// Base attributes -const ( - Reset Attribute = iota - Bold - Faint - Italic - Underline - BlinkSlow - BlinkRapid - ReverseVideo - Concealed - CrossedOut -) - -// Foreground text colors -const ( - FgBlack Attribute = iota + 30 - FgRed - FgGreen - FgYellow - FgBlue - FgMagenta - FgCyan - FgWhite -) - -// Foreground Hi-Intensity text colors -const ( - FgHiBlack Attribute = iota + 90 - FgHiRed - FgHiGreen - FgHiYellow - FgHiBlue - FgHiMagenta - FgHiCyan - FgHiWhite -) - -// Background text colors -const ( - BgBlack Attribute = iota + 40 - BgRed - BgGreen - BgYellow - BgBlue - BgMagenta - BgCyan - BgWhite -) - -// Background Hi-Intensity text colors -const ( - BgHiBlack Attribute = iota + 100 - BgHiRed - BgHiGreen - BgHiYellow - BgHiBlue - BgHiMagenta - BgHiCyan - BgHiWhite -) - -// New returns a newly created color object. -func New(value ...Attribute) *Color { - c := &Color{params: make([]Attribute, 0)} - c.Add(value...) - return c -} - -// Set sets the given parameters immediately. It will change the color of -// output with the given SGR parameters until color.Unset() is called. -func Set(p ...Attribute) *Color { - c := New(p...) - c.Set() - return c -} - -// Unset resets all escape attributes and clears the output. Usually should -// be called after Set(). -func Unset() { - if NoColor { - return - } - - fmt.Fprintf(Output, "%s[%dm", escape, Reset) -} - -// Set sets the SGR sequence. -func (c *Color) Set() *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(Output, c.format()) - return c -} - -func (c *Color) unset() { - if c.isNoColorSet() { - return - } - - Unset() -} - -func (c *Color) setWriter(w io.Writer) *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(w, c.format()) - return c -} - -func (c *Color) unsetWriter(w io.Writer) { - if c.isNoColorSet() { - return - } - - if NoColor { - return - } - - fmt.Fprintf(w, "%s[%dm", escape, Reset) -} - -// Add is used to chain SGR parameters. Use as many as parameters to combine -// and create custom color objects. Example: Add(color.FgRed, color.Underline). -func (c *Color) Add(value ...Attribute) *Color { - c.params = append(c.params, value...) - return c -} - -func (c *Color) prepend(value Attribute) { - c.params = append(c.params, 0) - copy(c.params[1:], c.params[0:]) - c.params[0] = value -} - -// Fprint formats using the default formats for its operands and writes to w. -// Spaces are added between operands when neither is a string. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprint(w, a...) -} - -// Print formats using the default formats for its operands and writes to -// standard output. Spaces are added between operands when neither is a -// string. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Print(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprint(Output, a...) -} - -// Fprintf formats according to a format specifier and writes to w. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintf(w, format, a...) -} - -// Printf formats according to a format specifier and writes to standard output. -// It returns the number of bytes written and any write error encountered. -// This is the standard fmt.Printf() method wrapped with the given color. -func (c *Color) Printf(format string, a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintf(Output, format, a...) -} - -// Fprintln formats using the default formats for its operands and writes to w. -// Spaces are always added between operands and a newline is appended. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintln(w, a...) -} - -// Println formats using the default formats for its operands and writes to -// standard output. Spaces are always added between operands and a newline is -// appended. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Println(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintln(Output, a...) -} - -// Sprint is just like Print, but returns a string instead of printing it. -func (c *Color) Sprint(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) -} - -// Sprintln is just like Println, but returns a string instead of printing it. -func (c *Color) Sprintln(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) -} - -// Sprintf is just like Printf, but returns a string instead of printing it. -func (c *Color) Sprintf(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) -} - -// FprintFunc returns a new function that prints the passed arguments as -// colorized with color.Fprint(). -func (c *Color) FprintFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprint(w, a...) - } -} - -// PrintFunc returns a new function that prints the passed arguments as -// colorized with color.Print(). -func (c *Color) PrintFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Print(a...) - } -} - -// FprintfFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintf(). -func (c *Color) FprintfFunc() func(w io.Writer, format string, a ...interface{}) { - return func(w io.Writer, format string, a ...interface{}) { - c.Fprintf(w, format, a...) - } -} - -// PrintfFunc returns a new function that prints the passed arguments as -// colorized with color.Printf(). -func (c *Color) PrintfFunc() func(format string, a ...interface{}) { - return func(format string, a ...interface{}) { - c.Printf(format, a...) - } -} - -// FprintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintln(). -func (c *Color) FprintlnFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprintln(w, a...) - } -} - -// PrintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Println(). -func (c *Color) PrintlnFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Println(a...) - } -} - -// SprintFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprint(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output, example: -// -// put := New(FgYellow).SprintFunc() -// fmt.Fprintf(color.Output, "This is a %s", put("warning")) -func (c *Color) SprintFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) - } -} - -// SprintfFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintf(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintfFunc() func(format string, a ...interface{}) string { - return func(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) - } -} - -// SprintlnFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintln(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintlnFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) - } -} - -// sequence returns a formatted SGR sequence to be plugged into a "\x1b[...m" -// an example output might be: "1;36" -> bold cyan -func (c *Color) sequence() string { - format := make([]string, len(c.params)) - for i, v := range c.params { - format[i] = strconv.Itoa(int(v)) - } - - return strings.Join(format, ";") -} - -// wrap wraps the s string with the colors attributes. The string is ready to -// be printed. -func (c *Color) wrap(s string) string { - if c.isNoColorSet() { - return s - } - - return c.format() + s + c.unformat() -} - -func (c *Color) format() string { - return fmt.Sprintf("%s[%sm", escape, c.sequence()) -} - -func (c *Color) unformat() string { - return fmt.Sprintf("%s[%dm", escape, Reset) -} - -// DisableColor disables the color output. Useful to not change any existing -// code and still being able to output. Can be used for flags like -// "--no-color". To enable back use EnableColor() method. -func (c *Color) DisableColor() { - c.noColor = boolPtr(true) -} - -// EnableColor enables the color output. Use it in conjunction with -// DisableColor(). Otherwise this method has no side effects. -func (c *Color) EnableColor() { - c.noColor = boolPtr(false) -} - -func (c *Color) isNoColorSet() bool { - // check first if we have user setted action - if c.noColor != nil { - return *c.noColor - } - - // if not return the global option, which is disabled by default - return NoColor -} - -// Equals returns a boolean value indicating whether two colors are equal. -func (c *Color) Equals(c2 *Color) bool { - if len(c.params) != len(c2.params) { - return false - } - - for _, attr := range c.params { - if !c2.attrExists(attr) { - return false - } - } - - return true -} - -func (c *Color) attrExists(a Attribute) bool { - for _, attr := range c.params { - if attr == a { - return true - } - } - - return false -} - -func boolPtr(v bool) *bool { - return &v -} - -func getCachedColor(p Attribute) *Color { - colorsCacheMu.Lock() - defer colorsCacheMu.Unlock() - - c, ok := colorsCache[p] - if !ok { - c = New(p) - colorsCache[p] = c - } - - return c -} - -func colorPrint(format string, p Attribute, a ...interface{}) { - c := getCachedColor(p) - - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - - if len(a) == 0 { - c.Print(format) - } else { - c.Printf(format, a...) - } -} - -func colorString(format string, p Attribute, a ...interface{}) string { - c := getCachedColor(p) - - if len(a) == 0 { - return c.SprintFunc()(format) - } - - return c.SprintfFunc()(format, a...) -} - -// Black is a convenient helper function to print with black foreground. A -// newline is appended to format by default. -func Black(format string, a ...interface{}) { colorPrint(format, FgBlack, a...) } - -// Red is a convenient helper function to print with red foreground. A -// newline is appended to format by default. -func Red(format string, a ...interface{}) { colorPrint(format, FgRed, a...) } - -// Green is a convenient helper function to print with green foreground. A -// newline is appended to format by default. -func Green(format string, a ...interface{}) { colorPrint(format, FgGreen, a...) } - -// Yellow is a convenient helper function to print with yellow foreground. -// A newline is appended to format by default. -func Yellow(format string, a ...interface{}) { colorPrint(format, FgYellow, a...) } - -// Blue is a convenient helper function to print with blue foreground. A -// newline is appended to format by default. -func Blue(format string, a ...interface{}) { colorPrint(format, FgBlue, a...) } - -// Magenta is a convenient helper function to print with magenta foreground. -// A newline is appended to format by default. -func Magenta(format string, a ...interface{}) { colorPrint(format, FgMagenta, a...) } - -// Cyan is a convenient helper function to print with cyan foreground. A -// newline is appended to format by default. -func Cyan(format string, a ...interface{}) { colorPrint(format, FgCyan, a...) } - -// White is a convenient helper function to print with white foreground. A -// newline is appended to format by default. -func White(format string, a ...interface{}) { colorPrint(format, FgWhite, a...) } - -// BlackString is a convenient helper function to return a string with black -// foreground. -func BlackString(format string, a ...interface{}) string { return colorString(format, FgBlack, a...) } - -// RedString is a convenient helper function to return a string with red -// foreground. -func RedString(format string, a ...interface{}) string { return colorString(format, FgRed, a...) } - -// GreenString is a convenient helper function to return a string with green -// foreground. -func GreenString(format string, a ...interface{}) string { return colorString(format, FgGreen, a...) } - -// YellowString is a convenient helper function to return a string with yellow -// foreground. -func YellowString(format string, a ...interface{}) string { return colorString(format, FgYellow, a...) } - -// BlueString is a convenient helper function to return a string with blue -// foreground. -func BlueString(format string, a ...interface{}) string { return colorString(format, FgBlue, a...) } - -// MagentaString is a convenient helper function to return a string with magenta -// foreground. -func MagentaString(format string, a ...interface{}) string { - return colorString(format, FgMagenta, a...) -} - -// CyanString is a convenient helper function to return a string with cyan -// foreground. -func CyanString(format string, a ...interface{}) string { return colorString(format, FgCyan, a...) } - -// WhiteString is a convenient helper function to return a string with white -// foreground. -func WhiteString(format string, a ...interface{}) string { return colorString(format, FgWhite, a...) } - -// HiBlack is a convenient helper function to print with hi-intensity black foreground. A -// newline is appended to format by default. -func HiBlack(format string, a ...interface{}) { colorPrint(format, FgHiBlack, a...) } - -// HiRed is a convenient helper function to print with hi-intensity red foreground. A -// newline is appended to format by default. -func HiRed(format string, a ...interface{}) { colorPrint(format, FgHiRed, a...) } - -// HiGreen is a convenient helper function to print with hi-intensity green foreground. A -// newline is appended to format by default. -func HiGreen(format string, a ...interface{}) { colorPrint(format, FgHiGreen, a...) } - -// HiYellow is a convenient helper function to print with hi-intensity yellow foreground. -// A newline is appended to format by default. -func HiYellow(format string, a ...interface{}) { colorPrint(format, FgHiYellow, a...) } - -// HiBlue is a convenient helper function to print with hi-intensity blue foreground. A -// newline is appended to format by default. -func HiBlue(format string, a ...interface{}) { colorPrint(format, FgHiBlue, a...) } - -// HiMagenta is a convenient helper function to print with hi-intensity magenta foreground. -// A newline is appended to format by default. -func HiMagenta(format string, a ...interface{}) { colorPrint(format, FgHiMagenta, a...) } - -// HiCyan is a convenient helper function to print with hi-intensity cyan foreground. A -// newline is appended to format by default. -func HiCyan(format string, a ...interface{}) { colorPrint(format, FgHiCyan, a...) } - -// HiWhite is a convenient helper function to print with hi-intensity white foreground. A -// newline is appended to format by default. -func HiWhite(format string, a ...interface{}) { colorPrint(format, FgHiWhite, a...) } - -// HiBlackString is a convenient helper function to return a string with hi-intensity black -// foreground. -func HiBlackString(format string, a ...interface{}) string { - return colorString(format, FgHiBlack, a...) -} - -// HiRedString is a convenient helper function to return a string with hi-intensity red -// foreground. -func HiRedString(format string, a ...interface{}) string { return colorString(format, FgHiRed, a...) } - -// HiGreenString is a convenient helper function to return a string with hi-intensity green -// foreground. -func HiGreenString(format string, a ...interface{}) string { - return colorString(format, FgHiGreen, a...) -} - -// HiYellowString is a convenient helper function to return a string with hi-intensity yellow -// foreground. -func HiYellowString(format string, a ...interface{}) string { - return colorString(format, FgHiYellow, a...) -} - -// HiBlueString is a convenient helper function to return a string with hi-intensity blue -// foreground. -func HiBlueString(format string, a ...interface{}) string { return colorString(format, FgHiBlue, a...) } - -// HiMagentaString is a convenient helper function to return a string with hi-intensity magenta -// foreground. -func HiMagentaString(format string, a ...interface{}) string { - return colorString(format, FgHiMagenta, a...) -} - -// HiCyanString is a convenient helper function to return a string with hi-intensity cyan -// foreground. -func HiCyanString(format string, a ...interface{}) string { return colorString(format, FgHiCyan, a...) } - -// HiWhiteString is a convenient helper function to return a string with hi-intensity white -// foreground. -func HiWhiteString(format string, a ...interface{}) string { - return colorString(format, FgHiWhite, a...) -} diff --git a/vendor/github.com/fatih/color/doc.go b/vendor/github.com/fatih/color/doc.go deleted file mode 100644 index cf1e965..0000000 --- a/vendor/github.com/fatih/color/doc.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Package color is an ANSI color package to output colorized or SGR defined -output to the standard output. The API can be used in several way, pick one -that suits you. - -Use simple and default helper functions with predefined foreground colors: - - color.Cyan("Prints text in cyan.") - - // a newline will be appended automatically - color.Blue("Prints %s in blue.", "text") - - // More default foreground colors.. - color.Red("We have red") - color.Yellow("Yellow color too!") - color.Magenta("And many others ..") - - // Hi-intensity colors - color.HiGreen("Bright green color.") - color.HiBlack("Bright black means gray..") - color.HiWhite("Shiny white color!") - -However there are times where custom color mixes are required. Below are some -examples to create custom color objects and use the print functions of each -separate color object. - - // Create a new color object - c := color.New(color.FgCyan).Add(color.Underline) - c.Println("Prints cyan text with an underline.") - - // Or just add them to New() - d := color.New(color.FgCyan, color.Bold) - d.Printf("This prints bold cyan %s\n", "too!.") - - - // Mix up foreground and background colors, create new mixes! - red := color.New(color.FgRed) - - boldRed := red.Add(color.Bold) - boldRed.Println("This will print text in bold red.") - - whiteBackground := red.Add(color.BgWhite) - whiteBackground.Println("Red text with White background.") - - // Use your own io.Writer output - color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - - blue := color.New(color.FgBlue) - blue.Fprint(myWriter, "This will print text in blue.") - -You can create PrintXxx functions to simplify even more: - - // Create a custom print function for convenient - red := color.New(color.FgRed).PrintfFunc() - red("warning") - red("error: %s", err) - - // Mix up multiple attributes - notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() - notice("don't forget this...") - -You can also FprintXxx functions to pass your own io.Writer: - - blue := color.New(FgBlue).FprintfFunc() - blue(myWriter, "important notice: %s", stars) - - // Mix up with multiple attributes - success := color.New(color.Bold, color.FgGreen).FprintlnFunc() - success(myWriter, don't forget this...") - - -Or create SprintXxx functions to mix strings with other non-colorized strings: - - yellow := New(FgYellow).SprintFunc() - red := New(FgRed).SprintFunc() - - fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Printf("this %s rocks!\n", info("package")) - -Windows support is enabled by default. All Print functions work as intended. -However only for color.SprintXXX functions, user should use fmt.FprintXXX and -set the output to color.Output: - - fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Fprintf(color.Output, "this %s rocks!\n", info("package")) - -Using with existing code is possible. Just use the Set() method to set the -standard output to the given parameters. That way a rewrite of an existing -code is not required. - - // Use handy standard colors. - color.Set(color.FgYellow) - - fmt.Println("Existing text will be now in Yellow") - fmt.Printf("This one %s\n", "too") - - color.Unset() // don't forget to unset - - // You can mix up parameters - color.Set(color.FgMagenta, color.Bold) - defer color.Unset() // use it in your function - - fmt.Println("All text will be now bold magenta.") - -There might be a case where you want to disable color output (for example to -pipe the standard output of your app to somewhere else). `Color` has support to -disable colors both globally and for single color definition. For example -suppose you have a CLI app and a `--no-color` bool flag. You can easily disable -the color output with: - - var flagNoColor = flag.Bool("no-color", false, "Disable color output") - - if *flagNoColor { - color.NoColor = true // disables colorized output - } - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - - c := color.New(color.FgCyan) - c.Println("Prints cyan text") - - c.DisableColor() - c.Println("This is printed without any color") - - c.EnableColor() - c.Println("This prints again cyan...") -*/ -package color diff --git a/vendor/github.com/fatih/color/go.mod b/vendor/github.com/fatih/color/go.mod deleted file mode 100644 index bc0df75..0000000 --- a/vendor/github.com/fatih/color/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/fatih/color - -go 1.13 - -require ( - github.com/mattn/go-colorable v0.1.4 - github.com/mattn/go-isatty v0.0.11 -) diff --git a/vendor/github.com/fatih/color/go.sum b/vendor/github.com/fatih/color/go.sum deleted file mode 100644 index 44328a8..0000000 --- a/vendor/github.com/fatih/color/go.sum +++ /dev/null @@ -1,8 +0,0 @@ -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/gin-contrib/sse/.travis.yml b/vendor/github.com/gin-contrib/sse/.travis.yml deleted file mode 100644 index d0e8fcf..0000000 --- a/vendor/github.com/gin-contrib/sse/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: go -sudo: false -go: - - 1.8.x - - 1.9.x - - 1.10.x - - 1.11.x - - 1.12.x - - master - -git: - depth: 10 - -matrix: - fast_finish: true - include: - - go: 1.11.x - env: GO111MODULE=on - - go: 1.12.x - env: GO111MODULE=on - -script: - - go test -v -covermode=count -coverprofile=coverage.out - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/gin-contrib/sse/LICENSE b/vendor/github.com/gin-contrib/sse/LICENSE deleted file mode 100644 index 1ff7f37..0000000 --- a/vendor/github.com/gin-contrib/sse/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Manuel Martínez-Almeida - -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. diff --git a/vendor/github.com/gin-contrib/sse/README.md b/vendor/github.com/gin-contrib/sse/README.md deleted file mode 100644 index c9c49cf..0000000 --- a/vendor/github.com/gin-contrib/sse/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Server-Sent Events - -[![GoDoc](https://godoc.org/github.com/gin-contrib/sse?status.svg)](https://godoc.org/github.com/gin-contrib/sse) -[![Build Status](https://travis-ci.org/gin-contrib/sse.svg)](https://travis-ci.org/gin-contrib/sse) -[![codecov](https://codecov.io/gh/gin-contrib/sse/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/sse) -[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/sse)](https://goreportcard.com/report/github.com/gin-contrib/sse) - -Server-sent events (SSE) is a technology where a browser receives automatic updates from a server via HTTP connection. The Server-Sent Events EventSource API is [standardized as part of HTML5[1] by the W3C](http://www.w3.org/TR/2009/WD-eventsource-20091029/). - -- [Read this great SSE introduction by the HTML5Rocks guys](http://www.html5rocks.com/en/tutorials/eventsource/basics/) -- [Browser support](http://caniuse.com/#feat=eventsource) - -## Sample code - -```go -import "github.com/gin-contrib/sse" - -func httpHandler(w http.ResponseWriter, req *http.Request) { - // data can be a primitive like a string, an integer or a float - sse.Encode(w, sse.Event{ - Event: "message", - Data: "some data\nmore data", - }) - - // also a complex type, like a map, a struct or a slice - sse.Encode(w, sse.Event{ - Id: "124", - Event: "message", - Data: map[string]interface{}{ - "user": "manu", - "date": time.Now().Unix(), - "content": "hi!", - }, - }) -} -``` -``` -event: message -data: some data\\nmore data - -id: 124 -event: message -data: {"content":"hi!","date":1431540810,"user":"manu"} - -``` - -## Content-Type - -```go -fmt.Println(sse.ContentType) -``` -``` -text/event-stream -``` - -## Decoding support - -There is a client-side implementation of SSE coming soon. diff --git a/vendor/github.com/gin-contrib/sse/go.mod b/vendor/github.com/gin-contrib/sse/go.mod deleted file mode 100644 index b9c03f4..0000000 --- a/vendor/github.com/gin-contrib/sse/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/gin-contrib/sse - -go 1.12 - -require github.com/stretchr/testify v1.3.0 diff --git a/vendor/github.com/gin-contrib/sse/go.sum b/vendor/github.com/gin-contrib/sse/go.sum deleted file mode 100644 index 4347755..0000000 --- a/vendor/github.com/gin-contrib/sse/go.sum +++ /dev/null @@ -1,7 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/gin-contrib/sse/sse-decoder.go b/vendor/github.com/gin-contrib/sse/sse-decoder.go deleted file mode 100644 index fd49b9c..0000000 --- a/vendor/github.com/gin-contrib/sse/sse-decoder.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package sse - -import ( - "bytes" - "io" - "io/ioutil" -) - -type decoder struct { - events []Event -} - -func Decode(r io.Reader) ([]Event, error) { - var dec decoder - return dec.decode(r) -} - -func (d *decoder) dispatchEvent(event Event, data string) { - dataLength := len(data) - if dataLength > 0 { - //If the data buffer's last character is a U+000A LINE FEED (LF) character, then remove the last character from the data buffer. - data = data[:dataLength-1] - dataLength-- - } - if dataLength == 0 && event.Event == "" { - return - } - if event.Event == "" { - event.Event = "message" - } - event.Data = data - d.events = append(d.events, event) -} - -func (d *decoder) decode(r io.Reader) ([]Event, error) { - buf, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } - - var currentEvent Event - var dataBuffer *bytes.Buffer = new(bytes.Buffer) - // TODO (and unit tests) - // Lines must be separated by either a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair, - // a single U+000A LINE FEED (LF) character, - // or a single U+000D CARRIAGE RETURN (CR) character. - lines := bytes.Split(buf, []byte{'\n'}) - for _, line := range lines { - if len(line) == 0 { - // If the line is empty (a blank line). Dispatch the event. - d.dispatchEvent(currentEvent, dataBuffer.String()) - - // reset current event and data buffer - currentEvent = Event{} - dataBuffer.Reset() - continue - } - if line[0] == byte(':') { - // If the line starts with a U+003A COLON character (:), ignore the line. - continue - } - - var field, value []byte - colonIndex := bytes.IndexRune(line, ':') - if colonIndex != -1 { - // If the line contains a U+003A COLON character character (:) - // Collect the characters on the line before the first U+003A COLON character (:), - // and let field be that string. - field = line[:colonIndex] - // Collect the characters on the line after the first U+003A COLON character (:), - // and let value be that string. - value = line[colonIndex+1:] - // If value starts with a single U+0020 SPACE character, remove it from value. - if len(value) > 0 && value[0] == ' ' { - value = value[1:] - } - } else { - // Otherwise, the string is not empty but does not contain a U+003A COLON character character (:) - // Use the whole line as the field name, and the empty string as the field value. - field = line - value = []byte{} - } - // The steps to process the field given a field name and a field value depend on the field name, - // as given in the following list. Field names must be compared literally, - // with no case folding performed. - switch string(field) { - case "event": - // Set the event name buffer to field value. - currentEvent.Event = string(value) - case "id": - // Set the event stream's last event ID to the field value. - currentEvent.Id = string(value) - case "retry": - // If the field value consists of only characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), - // then interpret the field value as an integer in base ten, and set the event stream's reconnection time to that integer. - // Otherwise, ignore the field. - currentEvent.Id = string(value) - case "data": - // Append the field value to the data buffer, - dataBuffer.Write(value) - // then append a single U+000A LINE FEED (LF) character to the data buffer. - dataBuffer.WriteString("\n") - default: - //Otherwise. The field is ignored. - continue - } - } - // Once the end of the file is reached, the user agent must dispatch the event one final time. - d.dispatchEvent(currentEvent, dataBuffer.String()) - - return d.events, nil -} diff --git a/vendor/github.com/gin-contrib/sse/sse-encoder.go b/vendor/github.com/gin-contrib/sse/sse-encoder.go deleted file mode 100644 index f9c8087..0000000 --- a/vendor/github.com/gin-contrib/sse/sse-encoder.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package sse - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "reflect" - "strconv" - "strings" -) - -// Server-Sent Events -// W3C Working Draft 29 October 2009 -// http://www.w3.org/TR/2009/WD-eventsource-20091029/ - -const ContentType = "text/event-stream" - -var contentType = []string{ContentType} -var noCache = []string{"no-cache"} - -var fieldReplacer = strings.NewReplacer( - "\n", "\\n", - "\r", "\\r") - -var dataReplacer = strings.NewReplacer( - "\n", "\ndata:", - "\r", "\\r") - -type Event struct { - Event string - Id string - Retry uint - Data interface{} -} - -func Encode(writer io.Writer, event Event) error { - w := checkWriter(writer) - writeId(w, event.Id) - writeEvent(w, event.Event) - writeRetry(w, event.Retry) - return writeData(w, event.Data) -} - -func writeId(w stringWriter, id string) { - if len(id) > 0 { - w.WriteString("id:") - fieldReplacer.WriteString(w, id) - w.WriteString("\n") - } -} - -func writeEvent(w stringWriter, event string) { - if len(event) > 0 { - w.WriteString("event:") - fieldReplacer.WriteString(w, event) - w.WriteString("\n") - } -} - -func writeRetry(w stringWriter, retry uint) { - if retry > 0 { - w.WriteString("retry:") - w.WriteString(strconv.FormatUint(uint64(retry), 10)) - w.WriteString("\n") - } -} - -func writeData(w stringWriter, data interface{}) error { - w.WriteString("data:") - switch kindOfData(data) { - case reflect.Struct, reflect.Slice, reflect.Map: - err := json.NewEncoder(w).Encode(data) - if err != nil { - return err - } - w.WriteString("\n") - default: - dataReplacer.WriteString(w, fmt.Sprint(data)) - w.WriteString("\n\n") - } - return nil -} - -func (r Event) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - return Encode(w, r) -} - -func (r Event) WriteContentType(w http.ResponseWriter) { - header := w.Header() - header["Content-Type"] = contentType - - if _, exist := header["Cache-Control"]; !exist { - header["Cache-Control"] = noCache - } -} - -func kindOfData(data interface{}) reflect.Kind { - value := reflect.ValueOf(data) - valueType := value.Kind() - if valueType == reflect.Ptr { - valueType = value.Elem().Kind() - } - return valueType -} diff --git a/vendor/github.com/gin-contrib/sse/writer.go b/vendor/github.com/gin-contrib/sse/writer.go deleted file mode 100644 index 6f9806c..0000000 --- a/vendor/github.com/gin-contrib/sse/writer.go +++ /dev/null @@ -1,24 +0,0 @@ -package sse - -import "io" - -type stringWriter interface { - io.Writer - WriteString(string) (int, error) -} - -type stringWrapper struct { - io.Writer -} - -func (w stringWrapper) WriteString(str string) (int, error) { - return w.Writer.Write([]byte(str)) -} - -func checkWriter(writer io.Writer) stringWriter { - if w, ok := writer.(stringWriter); ok { - return w - } else { - return stringWrapper{writer} - } -} diff --git a/vendor/github.com/gin-gonic/gin/.gitignore b/vendor/github.com/gin-gonic/gin/.gitignore deleted file mode 100644 index bdd50c9..0000000 --- a/vendor/github.com/gin-gonic/gin/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -vendor/* -!vendor/vendor.json -coverage.out -count.out -test -profile.out -tmp.out diff --git a/vendor/github.com/gin-gonic/gin/.travis.yml b/vendor/github.com/gin-gonic/gin/.travis.yml deleted file mode 100644 index 8ebae71..0000000 --- a/vendor/github.com/gin-gonic/gin/.travis.yml +++ /dev/null @@ -1,50 +0,0 @@ -language: go - -matrix: - fast_finish: true - include: - - go: 1.12.x - env: GO111MODULE=on - - go: 1.13.x - - go: 1.13.x - env: - - TESTTAGS=nomsgpack - - go: 1.14.x - - go: 1.14.x - env: - - TESTTAGS=nomsgpack - - go: 1.15.x - - go: 1.15.x - env: - - TESTTAGS=nomsgpack - - go: master - -git: - depth: 10 - -before_install: - - if [[ "${GO111MODULE}" = "on" ]]; then mkdir "${HOME}/go"; export GOPATH="${HOME}/go"; fi - -install: - - if [[ "${GO111MODULE}" = "on" ]]; then go mod download; fi - - if [[ "${GO111MODULE}" = "on" ]]; then export PATH="${GOPATH}/bin:${GOROOT}/bin:${PATH}"; fi - - if [[ "${GO111MODULE}" = "on" ]]; then make tools; fi - -go_import_path: github.com/gin-gonic/gin - -script: - - make vet - - make fmt-check - - make misspell-check - - make test - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/7f95bf605c4d356372f4 - on_success: change # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: false # default: false diff --git a/vendor/github.com/gin-gonic/gin/AUTHORS.md b/vendor/github.com/gin-gonic/gin/AUTHORS.md deleted file mode 100644 index c634e6b..0000000 --- a/vendor/github.com/gin-gonic/gin/AUTHORS.md +++ /dev/null @@ -1,233 +0,0 @@ -List of all the awesome people working to make Gin the best Web Framework in Go. - -## gin 1.x series authors - -**Gin Core Team:** Bo-Yi Wu (@appleboy), 田欧 (@thinkerou), Javier Provecho (@javierprovecho) - -## gin 0.x series authors - -**Maintainers:** Manu Martinez-Almeida (@manucorporat), Javier Provecho (@javierprovecho) - -People and companies, who have contributed, in alphabetical order. - -**@858806258 (杰哥)** -- Fix typo in example - - -**@achedeuzot (Klemen Sever)** -- Fix newline debug printing - - -**@adammck (Adam Mckaig)** -- Add MIT license - - -**@AlexanderChen1989 (Alexander)** -- Typos in README - - -**@alexanderdidenko (Aleksandr Didenko)** -- Add support multipart/form-data - - -**@alexandernyquist (Alexander Nyquist)** -- Using template.Must to fix multiple return issue -- ★ Added support for OPTIONS verb -- ★ Setting response headers before calling WriteHeader -- Improved documentation for model binding -- ★ Added Content.Redirect() -- ★ Added tons of Unit tests - - -**@austinheap (Austin Heap)** -- Added travis CI integration - - -**@andredublin (Andre Dublin)** -- Fix typo in comment - - -**@bredov (Ludwig Valda Vasquez)** -- Fix html templating in debug mode - - -**@bluele (Jun Kimura)** -- Fixes code examples in README - - -**@chad-russell** -- ★ Support for serializing gin.H into XML - - -**@dickeyxxx (Jeff Dickey)** -- Typos in README -- Add example about serving static files - - -**@donileo (Adonis)** -- Add NoMethod handler - - -**@dutchcoders (DutchCoders)** -- ★ Fix security bug that allows client to spoof ip -- Fix typo. r.HTMLTemplates -> SetHTMLTemplate - - -**@el3ctro- (Joshua Loper)** -- Fix typo in example - - -**@ethankan (Ethan Kan)** -- Unsigned integers in binding - - -**(Evgeny Persienko)** -- Validate sub structures - - -**@frankbille (Frank Bille)** -- Add support for HTTP Realm Auth - - -**@fmd (Fareed Dudhia)** -- Fix typo. SetHTTPTemplate -> SetHTMLTemplate - - -**@ironiridis (Christopher Harrington)** -- Remove old reference - - -**@jammie-stackhouse (Jamie Stackhouse)** -- Add more shortcuts for router methods - - -**@jasonrhansen** -- Fix spelling and grammar errors in documentation - - -**@JasonSoft (Jason Lee)** -- Fix typo in comment - - -**@joiggama (Ignacio Galindo)** -- Add utf-8 charset header on renders - - -**@julienschmidt (Julien Schmidt)** -- gofmt the code examples - - -**@kelcecil (Kel Cecil)** -- Fix readme typo - - -**@kyledinh (Kyle Dinh)** -- Adds RunTLS() - - -**@LinusU (Linus Unnebäck)** -- Small fixes in README - - -**@loongmxbt (Saint Asky)** -- Fix typo in example - - -**@lucas-clemente (Lucas Clemente)** -- ★ work around path.Join removing trailing slashes from routes - - -**@mattn (Yasuhiro Matsumoto)** -- Improve color logger - - -**@mdigger (Dmitry Sedykh)** -- Fixes Form binding when content-type is x-www-form-urlencoded -- No repeat call c.Writer.Status() in gin.Logger -- Fixes Content-Type for json render - - -**@mirzac (Mirza Ceric)** -- Fix debug printing - - -**@mopemope (Yutaka Matsubara)** -- ★ Adds Godep support (Dependencies Manager) -- Fix variadic parameter in the flexible render API -- Fix Corrupted plain render -- Add Pluggable View Renderer Example - - -**@msemenistyi (Mykyta Semenistyi)** -- update Readme.md. Add code to String method - - -**@msoedov (Sasha Myasoedov)** -- ★ Adds tons of unit tests. - - -**@ngerakines (Nick Gerakines)** -- ★ Improves API, c.GET() doesn't panic -- Adds MustGet() method - - -**@r8k (Rajiv Kilaparti)** -- Fix Port usage in README. - - -**@rayrod2030 (Ray Rodriguez)** -- Fix typo in example - - -**@rns** -- Fix typo in example - - -**@RobAWilkinson (Robert Wilkinson)** -- Add example of forms and params - - -**@rogierlommers (Rogier Lommers)** -- Add updated static serve example - -**@rw-access (Ross Wolf)** -- Added support to mix exact and param routes - -**@se77en (Damon Zhao)** -- Improve color logging - - -**@silasb (Silas Baronda)** -- Fixing quotes in README - - -**@SkuliOskarsson (Skuli Oskarsson)** -- Fixes some texts in README II - - -**@slimmy (Jimmy Pettersson)** -- Added messages for required bindings - - -**@smira (Andrey Smirnov)** -- Add support for ignored/unexported fields in binding - - -**@superalsrk (SRK.Lyu)** -- Update httprouter godeps - - -**@tebeka (Miki Tebeka)** -- Use net/http constants instead of numeric values - - -**@techjanitor** -- Update context.go reserved IPs - - -**@yosssi (Keiji Yoshida)** -- Fix link in README - - -**@yuyabee** -- Fixed README diff --git a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md deleted file mode 100644 index c11ee99..0000000 --- a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md +++ /dev/null @@ -1,666 +0,0 @@ - -# Benchmark System - -**VM HOST:** Travis -**Machine:** Ubuntu 16.04.6 LTS x64 -**Date:** May 04th, 2020 -**Version:** Gin v1.6.3 -**Go Version:** 1.14.2 linux/amd64 -**Source:** [Go HTTP Router Benchmark](https://github.com/gin-gonic/go-http-routing-benchmark) -**Result:** [See the gist](https://gist.github.com/appleboy/b5f2ecfaf50824ae9c64dcfb9165ae5e) or [Travis result](https://travis-ci.org/github/gin-gonic/go-http-routing-benchmark/jobs/682947061) - -## Static Routes: 157 - -```sh -Gin: 34936 Bytes - -HttpServeMux: 14512 Bytes -Ace: 30680 Bytes -Aero: 34536 Bytes -Bear: 30456 Bytes -Beego: 98456 Bytes -Bone: 40224 Bytes -Chi: 83608 Bytes -Denco: 10216 Bytes -Echo: 80328 Bytes -GocraftWeb: 55288 Bytes -Goji: 29744 Bytes -Gojiv2: 105840 Bytes -GoJsonRest: 137496 Bytes -GoRestful: 816936 Bytes -GorillaMux: 585632 Bytes -GowwwRouter: 24968 Bytes -HttpRouter: 21712 Bytes -HttpTreeMux: 73448 Bytes -Kocha: 115472 Bytes -LARS: 30640 Bytes -Macaron: 38592 Bytes -Martini: 310864 Bytes -Pat: 19696 Bytes -Possum: 89920 Bytes -R2router: 23712 Bytes -Rivet: 24608 Bytes -Tango: 28264 Bytes -TigerTonic: 78768 Bytes -Traffic: 538976 Bytes -Vulcan: 369960 Bytes -``` - -## GithubAPI Routes: 203 - -```sh -Gin: 58512 Bytes - -Ace: 48688 Bytes -Aero: 318568 Bytes -Bear: 84248 Bytes -Beego: 150936 Bytes -Bone: 100976 Bytes -Chi: 95112 Bytes -Denco: 36736 Bytes -Echo: 100296 Bytes -GocraftWeb: 95432 Bytes -Goji: 49680 Bytes -Gojiv2: 104704 Bytes -GoJsonRest: 141976 Bytes -GoRestful: 1241656 Bytes -GorillaMux: 1322784 Bytes -GowwwRouter: 80008 Bytes -HttpRouter: 37144 Bytes -HttpTreeMux: 78800 Bytes -Kocha: 785120 Bytes -LARS: 48600 Bytes -Macaron: 92784 Bytes -Martini: 485264 Bytes -Pat: 21200 Bytes -Possum: 85312 Bytes -R2router: 47104 Bytes -Rivet: 42840 Bytes -Tango: 54840 Bytes -TigerTonic: 95264 Bytes -Traffic: 921744 Bytes -Vulcan: 425992 Bytes -``` - -## GPlusAPI Routes: 13 - -```sh -Gin: 4384 Bytes - -Ace: 3712 Bytes -Aero: 26056 Bytes -Bear: 7112 Bytes -Beego: 10272 Bytes -Bone: 6688 Bytes -Chi: 8024 Bytes -Denco: 3264 Bytes -Echo: 9688 Bytes -GocraftWeb: 7496 Bytes -Goji: 3152 Bytes -Gojiv2: 7376 Bytes -GoJsonRest: 11400 Bytes -GoRestful: 74328 Bytes -GorillaMux: 66208 Bytes -GowwwRouter: 5744 Bytes -HttpRouter: 2808 Bytes -HttpTreeMux: 7440 Bytes -Kocha: 128880 Bytes -LARS: 3656 Bytes -Macaron: 8656 Bytes -Martini: 23920 Bytes -Pat: 1856 Bytes -Possum: 7248 Bytes -R2router: 3928 Bytes -Rivet: 3064 Bytes -Tango: 5168 Bytes -TigerTonic: 9408 Bytes -Traffic: 46400 Bytes -Vulcan: 25544 Bytes -``` - -## ParseAPI Routes: 26 - -```sh -Gin: 7776 Bytes - -Ace: 6704 Bytes -Aero: 28488 Bytes -Bear: 12320 Bytes -Beego: 19280 Bytes -Bone: 11440 Bytes -Chi: 9744 Bytes -Denco: 4192 Bytes -Echo: 11664 Bytes -GocraftWeb: 12800 Bytes -Goji: 5680 Bytes -Gojiv2: 14464 Bytes -GoJsonRest: 14072 Bytes -GoRestful: 116264 Bytes -GorillaMux: 105880 Bytes -GowwwRouter: 9344 Bytes -HttpRouter: 5072 Bytes -HttpTreeMux: 7848 Bytes -Kocha: 181712 Bytes -LARS: 6632 Bytes -Macaron: 13648 Bytes -Martini: 45888 Bytes -Pat: 2560 Bytes -Possum: 9200 Bytes -R2router: 7056 Bytes -Rivet: 5680 Bytes -Tango: 8920 Bytes -TigerTonic: 9840 Bytes -Traffic: 79096 Bytes -Vulcan: 44504 Bytes -``` - -## Static Routes - -```sh -BenchmarkGin_StaticAll 62169 19319 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_StaticAll 65428 18313 ns/op 0 B/op 0 allocs/op -BenchmarkAero_StaticAll 121132 9632 ns/op 0 B/op 0 allocs/op -BenchmarkHttpServeMux_StaticAll 52626 22758 ns/op 0 B/op 0 allocs/op -BenchmarkBeego_StaticAll 9962 179058 ns/op 55264 B/op 471 allocs/op -BenchmarkBear_StaticAll 14894 80966 ns/op 20272 B/op 469 allocs/op -BenchmarkBone_StaticAll 18718 64065 ns/op 0 B/op 0 allocs/op -BenchmarkChi_StaticAll 10000 149827 ns/op 67824 B/op 471 allocs/op -BenchmarkDenco_StaticAll 211393 5680 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_StaticAll 49341 24343 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_StaticAll 10000 126209 ns/op 46312 B/op 785 allocs/op -BenchmarkGoji_StaticAll 27956 43174 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_StaticAll 3430 370718 ns/op 205984 B/op 1570 allocs/op -BenchmarkGoJsonRest_StaticAll 9134 188888 ns/op 51653 B/op 1727 allocs/op -BenchmarkGoRestful_StaticAll 706 1703330 ns/op 613280 B/op 2053 allocs/op -BenchmarkGorillaMux_StaticAll 1268 924083 ns/op 153233 B/op 1413 allocs/op -BenchmarkGowwwRouter_StaticAll 63374 18935 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_StaticAll 109938 10902 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_StaticAll 109166 10861 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_StaticAll 92258 12992 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_StaticAll 65200 18387 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_StaticAll 5671 291501 ns/op 115553 B/op 1256 allocs/op -BenchmarkMartini_StaticAll 807 1460498 ns/op 125444 B/op 1717 allocs/op -BenchmarkPat_StaticAll 513 2342396 ns/op 602832 B/op 12559 allocs/op -BenchmarkPossum_StaticAll 10000 128270 ns/op 65312 B/op 471 allocs/op -BenchmarkR2router_StaticAll 16726 71760 ns/op 22608 B/op 628 allocs/op -BenchmarkRivet_StaticAll 41722 28723 ns/op 0 B/op 0 allocs/op -BenchmarkTango_StaticAll 7606 205082 ns/op 39209 B/op 1256 allocs/op -BenchmarkTigerTonic_StaticAll 26247 45806 ns/op 7376 B/op 157 allocs/op -BenchmarkTraffic_StaticAll 550 2284518 ns/op 754864 B/op 14601 allocs/op -BenchmarkVulcan_StaticAll 10000 131343 ns/op 15386 B/op 471 allocs/op -``` - -## Micro Benchmarks - -```sh -BenchmarkGin_Param 18785022 63.9 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_Param 14689765 81.5 ns/op 0 B/op 0 allocs/op -BenchmarkAero_Param 23094770 51.2 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Param 1417045 845 ns/op 456 B/op 5 allocs/op -BenchmarkBeego_Param 1000000 1080 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Param 1000000 1463 ns/op 816 B/op 6 allocs/op -BenchmarkChi_Param 1378756 885 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_Param 8557899 143 ns/op 32 B/op 1 allocs/op -BenchmarkEcho_Param 16433347 75.5 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param 1000000 1218 ns/op 648 B/op 8 allocs/op -BenchmarkGoji_Param 1921248 617 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Param 561848 2156 ns/op 1328 B/op 11 allocs/op -BenchmarkGoJsonRest_Param 1000000 1358 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_Param 224857 5307 ns/op 4192 B/op 14 allocs/op -BenchmarkGorillaMux_Param 498313 2459 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_Param 1864354 654 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Param 26269074 47.7 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_Param 2109829 557 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_Param 5050216 243 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_Param 19811712 59.9 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param 662746 2329 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_Param 279902 4260 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_Param 1000000 1382 ns/op 536 B/op 11 allocs/op -BenchmarkPossum_Param 1000000 1014 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Param 1712559 707 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Param 6648086 182 ns/op 48 B/op 1 allocs/op -BenchmarkTango_Param 1221504 994 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_Param 891661 2261 ns/op 776 B/op 16 allocs/op -BenchmarkTraffic_Param 350059 3598 ns/op 1856 B/op 21 allocs/op -BenchmarkVulcan_Param 2517823 472 ns/op 98 B/op 3 allocs/op -BenchmarkAce_Param5 9214365 130 ns/op 0 B/op 0 allocs/op -BenchmarkAero_Param5 15369013 77.9 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Param5 1000000 1113 ns/op 501 B/op 5 allocs/op -BenchmarkBeego_Param5 1000000 1269 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Param5 986820 1873 ns/op 864 B/op 6 allocs/op -BenchmarkChi_Param5 1000000 1156 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_Param5 3036331 400 ns/op 160 B/op 1 allocs/op -BenchmarkEcho_Param5 6447133 186 ns/op 0 B/op 0 allocs/op -BenchmarkGin_Param5 10786068 110 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param5 844820 1944 ns/op 920 B/op 11 allocs/op -BenchmarkGoji_Param5 1474965 827 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Param5 442820 2516 ns/op 1392 B/op 11 allocs/op -BenchmarkGoJsonRest_Param5 507555 2711 ns/op 1097 B/op 16 allocs/op -BenchmarkGoRestful_Param5 216481 6093 ns/op 4288 B/op 14 allocs/op -BenchmarkGorillaMux_Param5 314402 3628 ns/op 1344 B/op 10 allocs/op -BenchmarkGowwwRouter_Param5 1624660 733 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Param5 13167324 92.0 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_Param5 1000000 1295 ns/op 576 B/op 6 allocs/op -BenchmarkKocha_Param5 1000000 1138 ns/op 440 B/op 10 allocs/op -BenchmarkLARS_Param5 11580613 105 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param5 473596 2755 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_Param5 230756 5111 ns/op 1232 B/op 11 allocs/op -BenchmarkPat_Param5 469190 3370 ns/op 888 B/op 29 allocs/op -BenchmarkPossum_Param5 1000000 1002 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Param5 1422129 844 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Param5 2263789 539 ns/op 240 B/op 1 allocs/op -BenchmarkTango_Param5 1000000 1256 ns/op 360 B/op 8 allocs/op -BenchmarkTigerTonic_Param5 175500 7492 ns/op 2279 B/op 39 allocs/op -BenchmarkTraffic_Param5 233631 5816 ns/op 2208 B/op 27 allocs/op -BenchmarkVulcan_Param5 1923416 629 ns/op 98 B/op 3 allocs/op -BenchmarkAce_Param20 4321266 281 ns/op 0 B/op 0 allocs/op -BenchmarkAero_Param20 31501641 35.2 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Param20 335204 3489 ns/op 1665 B/op 5 allocs/op -BenchmarkBeego_Param20 503674 2860 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Param20 298922 4741 ns/op 2031 B/op 6 allocs/op -BenchmarkChi_Param20 878181 1957 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_Param20 1000000 1360 ns/op 640 B/op 1 allocs/op -BenchmarkEcho_Param20 2104946 580 ns/op 0 B/op 0 allocs/op -BenchmarkGin_Param20 4167204 290 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param20 173064 7514 ns/op 3796 B/op 15 allocs/op -BenchmarkGoji_Param20 458778 2651 ns/op 1247 B/op 2 allocs/op -BenchmarkGojiv2_Param20 364862 3178 ns/op 1632 B/op 11 allocs/op -BenchmarkGoJsonRest_Param20 125514 9760 ns/op 4485 B/op 20 allocs/op -BenchmarkGoRestful_Param20 101217 11964 ns/op 6715 B/op 18 allocs/op -BenchmarkGorillaMux_Param20 147654 8132 ns/op 3452 B/op 12 allocs/op -BenchmarkGowwwRouter_Param20 1000000 1225 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Param20 4920895 247 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_Param20 173202 6605 ns/op 3196 B/op 10 allocs/op -BenchmarkKocha_Param20 345988 3620 ns/op 1808 B/op 27 allocs/op -BenchmarkLARS_Param20 4592326 262 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param20 166492 7286 ns/op 2924 B/op 12 allocs/op -BenchmarkMartini_Param20 122162 10653 ns/op 3595 B/op 13 allocs/op -BenchmarkPat_Param20 78630 15239 ns/op 4424 B/op 93 allocs/op -BenchmarkPossum_Param20 1000000 1008 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Param20 294981 4587 ns/op 2284 B/op 7 allocs/op -BenchmarkRivet_Param20 691798 2090 ns/op 1024 B/op 1 allocs/op -BenchmarkTango_Param20 842440 2505 ns/op 856 B/op 8 allocs/op -BenchmarkTigerTonic_Param20 38614 31509 ns/op 9870 B/op 119 allocs/op -BenchmarkTraffic_Param20 57633 21107 ns/op 7853 B/op 47 allocs/op -BenchmarkVulcan_Param20 1000000 1178 ns/op 98 B/op 3 allocs/op -BenchmarkAce_ParamWrite 7330743 180 ns/op 8 B/op 1 allocs/op -BenchmarkAero_ParamWrite 13833598 86.7 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParamWrite 1363321 867 ns/op 456 B/op 5 allocs/op -BenchmarkBeego_ParamWrite 1000000 1104 ns/op 360 B/op 4 allocs/op -BenchmarkBone_ParamWrite 1000000 1475 ns/op 816 B/op 6 allocs/op -BenchmarkChi_ParamWrite 1320590 892 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_ParamWrite 7093605 172 ns/op 32 B/op 1 allocs/op -BenchmarkEcho_ParamWrite 8434424 161 ns/op 8 B/op 1 allocs/op -BenchmarkGin_ParamWrite 10377034 118 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParamWrite 1000000 1266 ns/op 656 B/op 9 allocs/op -BenchmarkGoji_ParamWrite 1874168 654 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_ParamWrite 459032 2352 ns/op 1360 B/op 13 allocs/op -BenchmarkGoJsonRest_ParamWrite 499434 2145 ns/op 1128 B/op 18 allocs/op -BenchmarkGoRestful_ParamWrite 241087 5470 ns/op 4200 B/op 15 allocs/op -BenchmarkGorillaMux_ParamWrite 425686 2522 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_ParamWrite 922172 1778 ns/op 976 B/op 8 allocs/op -BenchmarkHttpRouter_ParamWrite 15392049 77.7 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_ParamWrite 1973385 597 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_ParamWrite 4262500 281 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_ParamWrite 10764410 113 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParamWrite 486769 2726 ns/op 1176 B/op 14 allocs/op -BenchmarkMartini_ParamWrite 264804 4842 ns/op 1176 B/op 14 allocs/op -BenchmarkPat_ParamWrite 735116 2047 ns/op 960 B/op 15 allocs/op -BenchmarkPossum_ParamWrite 1000000 1004 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_ParamWrite 1592136 768 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_ParamWrite 3582051 339 ns/op 112 B/op 2 allocs/op -BenchmarkTango_ParamWrite 2237337 534 ns/op 136 B/op 4 allocs/op -BenchmarkTigerTonic_ParamWrite 439608 3136 ns/op 1216 B/op 21 allocs/op -BenchmarkTraffic_ParamWrite 306979 4328 ns/op 2280 B/op 25 allocs/op -BenchmarkVulcan_ParamWrite 2529973 472 ns/op 98 B/op 3 allocs/op -``` - -## GitHub - -```sh -BenchmarkGin_GithubStatic 15629472 76.7 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_GithubStatic 15542612 75.9 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GithubStatic 24777151 48.5 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GithubStatic 2788894 435 ns/op 120 B/op 3 allocs/op -BenchmarkBeego_GithubStatic 1000000 1064 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GithubStatic 93507 12838 ns/op 2880 B/op 60 allocs/op -BenchmarkChi_GithubStatic 1387743 860 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_GithubStatic 39384996 30.4 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_GithubStatic 12076382 99.1 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubStatic 1596495 756 ns/op 296 B/op 5 allocs/op -BenchmarkGoji_GithubStatic 6364876 189 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_GithubStatic 550202 2098 ns/op 1312 B/op 10 allocs/op -BenchmarkGoRestful_GithubStatic 102183 12552 ns/op 4256 B/op 13 allocs/op -BenchmarkGoJsonRest_GithubStatic 1000000 1029 ns/op 329 B/op 11 allocs/op -BenchmarkGorillaMux_GithubStatic 255552 5190 ns/op 976 B/op 9 allocs/op -BenchmarkGowwwRouter_GithubStatic 15531916 77.1 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_GithubStatic 27920724 43.1 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GithubStatic 21448953 55.8 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_GithubStatic 21405310 56.0 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_GithubStatic 13625156 89.0 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubStatic 1000000 1747 ns/op 736 B/op 8 allocs/op -BenchmarkMartini_GithubStatic 187186 7326 ns/op 768 B/op 9 allocs/op -BenchmarkPat_GithubStatic 109143 11563 ns/op 3648 B/op 76 allocs/op -BenchmarkPossum_GithubStatic 1575898 770 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_GithubStatic 3046231 404 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_GithubStatic 11484826 105 ns/op 0 B/op 0 allocs/op -BenchmarkTango_GithubStatic 1000000 1153 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_GithubStatic 4929780 249 ns/op 48 B/op 1 allocs/op -BenchmarkTraffic_GithubStatic 106351 11819 ns/op 4664 B/op 90 allocs/op -BenchmarkVulcan_GithubStatic 1613271 722 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GithubParam 8386032 143 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GithubParam 11816200 102 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GithubParam 1000000 1012 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_GithubParam 1000000 1157 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GithubParam 184653 6912 ns/op 1888 B/op 19 allocs/op -BenchmarkChi_GithubParam 1000000 1102 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_GithubParam 3484798 352 ns/op 128 B/op 1 allocs/op -BenchmarkEcho_GithubParam 6337380 189 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GithubParam 9132032 131 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubParam 1000000 1446 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_GithubParam 1248640 977 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GithubParam 383233 2784 ns/op 1408 B/op 13 allocs/op -BenchmarkGoJsonRest_GithubParam 1000000 1991 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_GithubParam 76414 16015 ns/op 4352 B/op 16 allocs/op -BenchmarkGorillaMux_GithubParam 150026 7663 ns/op 1296 B/op 10 allocs/op -BenchmarkGowwwRouter_GithubParam 1592044 751 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_GithubParam 10420628 115 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GithubParam 1403755 835 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_GithubParam 2286170 533 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_GithubParam 9540374 129 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubParam 533154 2742 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_GithubParam 119397 9638 ns/op 1152 B/op 11 allocs/op -BenchmarkPat_GithubParam 150675 8858 ns/op 2408 B/op 48 allocs/op -BenchmarkPossum_GithubParam 1000000 1001 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_GithubParam 1602886 761 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GithubParam 2986579 409 ns/op 96 B/op 1 allocs/op -BenchmarkTango_GithubParam 1000000 1356 ns/op 344 B/op 8 allocs/op -BenchmarkTigerTonic_GithubParam 388899 3429 ns/op 1176 B/op 22 allocs/op -BenchmarkTraffic_GithubParam 123160 9734 ns/op 2816 B/op 40 allocs/op -BenchmarkVulcan_GithubParam 1000000 1138 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GithubAll 40543 29670 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GithubAll 57632 20648 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GithubAll 9234 216179 ns/op 86448 B/op 943 allocs/op -BenchmarkBeego_GithubAll 7407 243496 ns/op 71456 B/op 609 allocs/op -BenchmarkBone_GithubAll 420 2922835 ns/op 720160 B/op 8620 allocs/op -BenchmarkChi_GithubAll 7620 238331 ns/op 87696 B/op 609 allocs/op -BenchmarkDenco_GithubAll 18355 64494 ns/op 20224 B/op 167 allocs/op -BenchmarkEcho_GithubAll 31251 38479 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GithubAll 43550 27364 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubAll 4117 300062 ns/op 131656 B/op 1686 allocs/op -BenchmarkGoji_GithubAll 3274 416158 ns/op 56112 B/op 334 allocs/op -BenchmarkGojiv2_GithubAll 1402 870518 ns/op 352720 B/op 4321 allocs/op -BenchmarkGoJsonRest_GithubAll 2976 401507 ns/op 134371 B/op 2737 allocs/op -BenchmarkGoRestful_GithubAll 410 2913158 ns/op 910144 B/op 2938 allocs/op -BenchmarkGorillaMux_GithubAll 346 3384987 ns/op 251650 B/op 1994 allocs/op -BenchmarkGowwwRouter_GithubAll 10000 143025 ns/op 72144 B/op 501 allocs/op -BenchmarkHttpRouter_GithubAll 55938 21360 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GithubAll 10000 153944 ns/op 65856 B/op 671 allocs/op -BenchmarkKocha_GithubAll 10000 106315 ns/op 23304 B/op 843 allocs/op -BenchmarkLARS_GithubAll 47779 25084 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubAll 3266 371907 ns/op 149409 B/op 1624 allocs/op -BenchmarkMartini_GithubAll 331 3444706 ns/op 226551 B/op 2325 allocs/op -BenchmarkPat_GithubAll 273 4381818 ns/op 1483152 B/op 26963 allocs/op -BenchmarkPossum_GithubAll 10000 164367 ns/op 84448 B/op 609 allocs/op -BenchmarkR2router_GithubAll 10000 160220 ns/op 77328 B/op 979 allocs/op -BenchmarkRivet_GithubAll 14625 82453 ns/op 16272 B/op 167 allocs/op -BenchmarkTango_GithubAll 6255 279611 ns/op 63826 B/op 1618 allocs/op -BenchmarkTigerTonic_GithubAll 2008 687874 ns/op 193856 B/op 4474 allocs/op -BenchmarkTraffic_GithubAll 355 3478508 ns/op 820744 B/op 14114 allocs/op -BenchmarkVulcan_GithubAll 6885 193333 ns/op 19894 B/op 609 allocs/op -``` - -## Google+ - -```sh -BenchmarkGin_GPlusStatic 19247326 62.2 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_GPlusStatic 20235060 59.2 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GPlusStatic 31978935 37.6 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlusStatic 3516523 341 ns/op 104 B/op 3 allocs/op -BenchmarkBeego_GPlusStatic 1212036 991 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GPlusStatic 6736242 183 ns/op 32 B/op 1 allocs/op -BenchmarkChi_GPlusStatic 1490640 814 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_GPlusStatic 55006856 21.8 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_GPlusStatic 17688258 67.9 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusStatic 1829181 666 ns/op 280 B/op 5 allocs/op -BenchmarkGoji_GPlusStatic 9147451 130 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_GPlusStatic 594015 2063 ns/op 1312 B/op 10 allocs/op -BenchmarkGoJsonRest_GPlusStatic 1264906 950 ns/op 329 B/op 11 allocs/op -BenchmarkGoRestful_GPlusStatic 231558 5341 ns/op 3872 B/op 13 allocs/op -BenchmarkGorillaMux_GPlusStatic 908418 1809 ns/op 976 B/op 9 allocs/op -BenchmarkGowwwRouter_GPlusStatic 40684604 29.5 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_GPlusStatic 46742804 25.7 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GPlusStatic 32567161 36.9 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_GPlusStatic 33800060 35.3 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_GPlusStatic 20431858 60.0 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusStatic 1000000 1745 ns/op 736 B/op 8 allocs/op -BenchmarkMartini_GPlusStatic 442248 3619 ns/op 768 B/op 9 allocs/op -BenchmarkPat_GPlusStatic 4328004 292 ns/op 96 B/op 2 allocs/op -BenchmarkPossum_GPlusStatic 1570753 763 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_GPlusStatic 3339474 355 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_GPlusStatic 18570961 64.7 ns/op 0 B/op 0 allocs/op -BenchmarkTango_GPlusStatic 1388702 860 ns/op 200 B/op 8 allocs/op -BenchmarkTigerTonic_GPlusStatic 7803543 159 ns/op 32 B/op 1 allocs/op -BenchmarkTraffic_GPlusStatic 878605 2171 ns/op 1112 B/op 16 allocs/op -BenchmarkVulcan_GPlusStatic 2742446 437 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GPlusParam 11626975 105 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GPlusParam 16914322 71.6 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlusParam 1405173 832 ns/op 480 B/op 5 allocs/op -BenchmarkBeego_GPlusParam 1000000 1075 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GPlusParam 1000000 1557 ns/op 816 B/op 6 allocs/op -BenchmarkChi_GPlusParam 1347926 894 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_GPlusParam 5513000 212 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_GPlusParam 11884383 101 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GPlusParam 12898952 93.1 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusParam 1000000 1194 ns/op 648 B/op 8 allocs/op -BenchmarkGoji_GPlusParam 1857229 645 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GPlusParam 520939 2322 ns/op 1328 B/op 11 allocs/op -BenchmarkGoJsonRest_GPlusParam 1000000 1536 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_GPlusParam 205449 5800 ns/op 4192 B/op 14 allocs/op -BenchmarkGorillaMux_GPlusParam 395310 3188 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_GPlusParam 1851798 667 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_GPlusParam 18420789 65.2 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GPlusParam 1878463 629 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_GPlusParam 4495610 273 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_GPlusParam 14615976 83.2 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusParam 584145 2549 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_GPlusParam 250501 4583 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_GPlusParam 1000000 1645 ns/op 576 B/op 11 allocs/op -BenchmarkPossum_GPlusParam 1000000 1008 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_GPlusParam 1708191 688 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GPlusParam 5795014 211 ns/op 48 B/op 1 allocs/op -BenchmarkTango_GPlusParam 1000000 1091 ns/op 264 B/op 8 allocs/op -BenchmarkTigerTonic_GPlusParam 760221 2489 ns/op 856 B/op 16 allocs/op -BenchmarkTraffic_GPlusParam 309774 4039 ns/op 1872 B/op 21 allocs/op -BenchmarkVulcan_GPlusParam 1935730 623 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GPlus2Params 9158314 134 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GPlus2Params 11300517 107 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlus2Params 1239238 961 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_GPlus2Params 1000000 1202 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GPlus2Params 335576 3725 ns/op 1168 B/op 10 allocs/op -BenchmarkChi_GPlus2Params 1000000 1014 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_GPlus2Params 4394598 280 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_GPlus2Params 7851861 154 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GPlus2Params 9958588 120 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlus2Params 1000000 1433 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_GPlus2Params 1325134 909 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GPlus2Params 405955 2870 ns/op 1408 B/op 14 allocs/op -BenchmarkGoJsonRest_GPlus2Params 977038 1987 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_GPlus2Params 205018 6142 ns/op 4384 B/op 16 allocs/op -BenchmarkGorillaMux_GPlus2Params 205641 6015 ns/op 1296 B/op 10 allocs/op -BenchmarkGowwwRouter_GPlus2Params 1748542 684 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_GPlus2Params 14047102 87.7 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GPlus2Params 1418673 828 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_GPlus2Params 2334562 520 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_GPlus2Params 11954094 101 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlus2Params 491552 2890 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_GPlus2Params 120532 9545 ns/op 1200 B/op 13 allocs/op -BenchmarkPat_GPlus2Params 194739 6766 ns/op 2168 B/op 33 allocs/op -BenchmarkPossum_GPlus2Params 1201224 1009 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_GPlus2Params 1575535 756 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GPlus2Params 3698930 325 ns/op 96 B/op 1 allocs/op -BenchmarkTango_GPlus2Params 1000000 1212 ns/op 344 B/op 8 allocs/op -BenchmarkTigerTonic_GPlus2Params 349350 3660 ns/op 1200 B/op 22 allocs/op -BenchmarkTraffic_GPlus2Params 169714 7862 ns/op 2248 B/op 28 allocs/op -BenchmarkVulcan_GPlus2Params 1222288 974 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GPlusAll 845606 1398 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GPlusAll 1000000 1009 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlusAll 103830 11386 ns/op 5488 B/op 61 allocs/op -BenchmarkBeego_GPlusAll 82653 14784 ns/op 4576 B/op 39 allocs/op -BenchmarkBone_GPlusAll 36601 33123 ns/op 11744 B/op 109 allocs/op -BenchmarkChi_GPlusAll 95264 12831 ns/op 5616 B/op 39 allocs/op -BenchmarkDenco_GPlusAll 567681 2950 ns/op 672 B/op 11 allocs/op -BenchmarkEcho_GPlusAll 720366 1665 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GPlusAll 1000000 1185 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusAll 71575 16365 ns/op 8040 B/op 103 allocs/op -BenchmarkGoji_GPlusAll 136352 9191 ns/op 3696 B/op 22 allocs/op -BenchmarkGojiv2_GPlusAll 38006 31802 ns/op 17616 B/op 154 allocs/op -BenchmarkGoJsonRest_GPlusAll 57238 21561 ns/op 8117 B/op 170 allocs/op -BenchmarkGoRestful_GPlusAll 15147 79276 ns/op 55520 B/op 192 allocs/op -BenchmarkGorillaMux_GPlusAll 24446 48410 ns/op 16112 B/op 128 allocs/op -BenchmarkGowwwRouter_GPlusAll 150112 7770 ns/op 4752 B/op 33 allocs/op -BenchmarkHttpRouter_GPlusAll 1367820 878 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GPlusAll 166628 8004 ns/op 4032 B/op 38 allocs/op -BenchmarkKocha_GPlusAll 265694 4570 ns/op 976 B/op 43 allocs/op -BenchmarkLARS_GPlusAll 1000000 1068 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusAll 54564 23305 ns/op 9568 B/op 104 allocs/op -BenchmarkMartini_GPlusAll 16274 73845 ns/op 14016 B/op 145 allocs/op -BenchmarkPat_GPlusAll 27181 44478 ns/op 15264 B/op 271 allocs/op -BenchmarkPossum_GPlusAll 122587 10277 ns/op 5408 B/op 39 allocs/op -BenchmarkR2router_GPlusAll 130137 9297 ns/op 5040 B/op 63 allocs/op -BenchmarkRivet_GPlusAll 532438 3323 ns/op 768 B/op 11 allocs/op -BenchmarkTango_GPlusAll 86054 14531 ns/op 3656 B/op 104 allocs/op -BenchmarkTigerTonic_GPlusAll 33936 35356 ns/op 11600 B/op 242 allocs/op -BenchmarkTraffic_GPlusAll 17833 68181 ns/op 26248 B/op 341 allocs/op -BenchmarkVulcan_GPlusAll 120109 9861 ns/op 1274 B/op 39 allocs/op -``` - -## Parse.com - -```sh -BenchmarkGin_ParseStatic 18877833 63.5 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_ParseStatic 19663731 60.8 ns/op 0 B/op 0 allocs/op -BenchmarkAero_ParseStatic 28967341 41.5 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParseStatic 3006984 402 ns/op 120 B/op 3 allocs/op -BenchmarkBeego_ParseStatic 1000000 1031 ns/op 352 B/op 3 allocs/op -BenchmarkBone_ParseStatic 1782482 675 ns/op 144 B/op 3 allocs/op -BenchmarkChi_ParseStatic 1453261 819 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_ParseStatic 45023595 26.5 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_ParseStatic 17330470 69.3 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseStatic 1644006 731 ns/op 296 B/op 5 allocs/op -BenchmarkGoji_ParseStatic 7026930 170 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_ParseStatic 517618 2037 ns/op 1312 B/op 10 allocs/op -BenchmarkGoJsonRest_ParseStatic 1227080 975 ns/op 329 B/op 11 allocs/op -BenchmarkGoRestful_ParseStatic 192458 6659 ns/op 4256 B/op 13 allocs/op -BenchmarkGorillaMux_ParseStatic 744062 2109 ns/op 976 B/op 9 allocs/op -BenchmarkGowwwRouter_ParseStatic 37781062 31.8 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_ParseStatic 45311223 26.5 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_ParseStatic 21383475 56.1 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_ParseStatic 29953290 40.1 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_ParseStatic 20036196 62.7 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseStatic 1000000 1740 ns/op 736 B/op 8 allocs/op -BenchmarkMartini_ParseStatic 404156 3801 ns/op 768 B/op 9 allocs/op -BenchmarkPat_ParseStatic 1547180 772 ns/op 240 B/op 5 allocs/op -BenchmarkPossum_ParseStatic 1608991 757 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_ParseStatic 3177936 385 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_ParseStatic 17783205 67.4 ns/op 0 B/op 0 allocs/op -BenchmarkTango_ParseStatic 1210777 990 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_ParseStatic 5316440 231 ns/op 48 B/op 1 allocs/op -BenchmarkTraffic_ParseStatic 496050 2539 ns/op 1256 B/op 19 allocs/op -BenchmarkVulcan_ParseStatic 2462798 488 ns/op 98 B/op 3 allocs/op -BenchmarkAce_ParseParam 13393669 89.6 ns/op 0 B/op 0 allocs/op -BenchmarkAero_ParseParam 19836619 60.4 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParseParam 1405954 864 ns/op 467 B/op 5 allocs/op -BenchmarkBeego_ParseParam 1000000 1065 ns/op 352 B/op 3 allocs/op -BenchmarkBone_ParseParam 1000000 1698 ns/op 896 B/op 7 allocs/op -BenchmarkChi_ParseParam 1356037 873 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_ParseParam 6241392 204 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_ParseParam 14088100 85.1 ns/op 0 B/op 0 allocs/op -BenchmarkGin_ParseParam 17426064 68.9 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseParam 1000000 1254 ns/op 664 B/op 8 allocs/op -BenchmarkGoji_ParseParam 1682574 713 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_ParseParam 502224 2333 ns/op 1360 B/op 12 allocs/op -BenchmarkGoJsonRest_ParseParam 1000000 1401 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_ParseParam 182623 7097 ns/op 4576 B/op 14 allocs/op -BenchmarkGorillaMux_ParseParam 482332 2477 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_ParseParam 1834873 657 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_ParseParam 23593393 51.0 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_ParseParam 2100160 574 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_ParseParam 4837220 252 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_ParseParam 18411192 66.2 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseParam 571870 2398 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_ParseParam 286262 4268 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_ParseParam 692906 2157 ns/op 992 B/op 15 allocs/op -BenchmarkPossum_ParseParam 1000000 1011 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_ParseParam 1722735 697 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_ParseParam 6058054 203 ns/op 48 B/op 1 allocs/op -BenchmarkTango_ParseParam 1000000 1061 ns/op 280 B/op 8 allocs/op -BenchmarkTigerTonic_ParseParam 890275 2277 ns/op 784 B/op 15 allocs/op -BenchmarkTraffic_ParseParam 351322 3543 ns/op 1896 B/op 21 allocs/op -BenchmarkVulcan_ParseParam 2076544 572 ns/op 98 B/op 3 allocs/op -BenchmarkAce_Parse2Params 11718074 101 ns/op 0 B/op 0 allocs/op -BenchmarkAero_Parse2Params 16264988 73.4 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Parse2Params 1238322 973 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_Parse2Params 1000000 1120 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Parse2Params 1000000 1632 ns/op 848 B/op 6 allocs/op -BenchmarkChi_Parse2Params 1239477 955 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_Parse2Params 4944133 245 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_Parse2Params 10518286 114 ns/op 0 B/op 0 allocs/op -BenchmarkGin_Parse2Params 14505195 82.7 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Parse2Params 1000000 1437 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_Parse2Params 1689883 707 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Parse2Params 502334 2308 ns/op 1344 B/op 11 allocs/op -BenchmarkGoJsonRest_Parse2Params 1000000 1771 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_Parse2Params 159092 7583 ns/op 4928 B/op 14 allocs/op -BenchmarkGorillaMux_Parse2Params 417548 2980 ns/op 1296 B/op 10 allocs/op -BenchmarkGowwwRouter_Parse2Params 1751737 686 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Parse2Params 18089204 66.3 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_Parse2Params 1556986 777 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_Parse2Params 2493082 485 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_Parse2Params 15350108 78.5 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Parse2Params 530974 2605 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_Parse2Params 247069 4673 ns/op 1152 B/op 11 allocs/op -BenchmarkPat_Parse2Params 816295 2126 ns/op 752 B/op 16 allocs/op -BenchmarkPossum_Parse2Params 1000000 1002 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Parse2Params 1569771 733 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Parse2Params 4080546 295 ns/op 96 B/op 1 allocs/op -BenchmarkTango_Parse2Params 1000000 1121 ns/op 312 B/op 8 allocs/op -BenchmarkTigerTonic_Parse2Params 399556 3470 ns/op 1168 B/op 22 allocs/op -BenchmarkTraffic_Parse2Params 314194 4159 ns/op 1944 B/op 22 allocs/op -BenchmarkVulcan_Parse2Params 1827559 664 ns/op 98 B/op 3 allocs/op -BenchmarkAce_ParseAll 478395 2503 ns/op 0 B/op 0 allocs/op -BenchmarkAero_ParseAll 715392 1658 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParseAll 59191 20124 ns/op 8928 B/op 110 allocs/op -BenchmarkBeego_ParseAll 45507 27266 ns/op 9152 B/op 78 allocs/op -BenchmarkBone_ParseAll 29328 41459 ns/op 16208 B/op 147 allocs/op -BenchmarkChi_ParseAll 48531 25053 ns/op 11232 B/op 78 allocs/op -BenchmarkDenco_ParseAll 325532 4284 ns/op 928 B/op 16 allocs/op -BenchmarkEcho_ParseAll 433771 2759 ns/op 0 B/op 0 allocs/op -BenchmarkGin_ParseAll 576316 2082 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseAll 41500 29692 ns/op 13728 B/op 181 allocs/op -BenchmarkGoji_ParseAll 80833 15563 ns/op 5376 B/op 32 allocs/op -BenchmarkGojiv2_ParseAll 19836 60335 ns/op 34448 B/op 277 allocs/op -BenchmarkGoJsonRest_ParseAll 32210 38027 ns/op 13866 B/op 321 allocs/op -BenchmarkGoRestful_ParseAll 6644 190842 ns/op 117600 B/op 354 allocs/op -BenchmarkGorillaMux_ParseAll 12634 95894 ns/op 30288 B/op 250 allocs/op -BenchmarkGowwwRouter_ParseAll 98152 12159 ns/op 6912 B/op 48 allocs/op -BenchmarkHttpRouter_ParseAll 933208 1273 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_ParseAll 107191 11554 ns/op 5728 B/op 51 allocs/op -BenchmarkKocha_ParseAll 184862 6225 ns/op 1112 B/op 54 allocs/op -BenchmarkLARS_ParseAll 644546 1858 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseAll 26145 46484 ns/op 19136 B/op 208 allocs/op -BenchmarkMartini_ParseAll 10000 121838 ns/op 25072 B/op 253 allocs/op -BenchmarkPat_ParseAll 25417 47196 ns/op 15216 B/op 308 allocs/op -BenchmarkPossum_ParseAll 58550 20735 ns/op 10816 B/op 78 allocs/op -BenchmarkR2router_ParseAll 72732 16584 ns/op 8352 B/op 120 allocs/op -BenchmarkRivet_ParseAll 281365 4968 ns/op 912 B/op 16 allocs/op -BenchmarkTango_ParseAll 42831 28668 ns/op 7168 B/op 208 allocs/op -BenchmarkTigerTonic_ParseAll 23774 49972 ns/op 16048 B/op 332 allocs/op -BenchmarkTraffic_ParseAll 10000 104679 ns/op 45520 B/op 605 allocs/op -BenchmarkVulcan_ParseAll 64810 18108 ns/op 2548 B/op 78 allocs/op -``` diff --git a/vendor/github.com/gin-gonic/gin/CHANGELOG.md b/vendor/github.com/gin-gonic/gin/CHANGELOG.md deleted file mode 100644 index 44d6251..0000000 --- a/vendor/github.com/gin-gonic/gin/CHANGELOG.md +++ /dev/null @@ -1,406 +0,0 @@ -# Gin ChangeLog - -## Gin v1.7.0 - -### BUGFIXES - -* fix compile error from [#2572](https://github.com/gin-gonic/gin/pull/2572) ([#2600](https://github.com/gin-gonic/gin/pull/2600)) -* fix: print headers without Authorization header on broken pipe ([#2528](https://github.com/gin-gonic/gin/pull/2528)) -* fix(tree): reassign fullpath when register new node ([#2366](https://github.com/gin-gonic/gin/pull/2366)) - -### ENHANCEMENTS - -* Support params and exact routes without creating conflicts ([#2663](https://github.com/gin-gonic/gin/pull/2663)) -* chore: improve render string performance ([#2365](https://github.com/gin-gonic/gin/pull/2365)) -* Sync route tree to httprouter latest code ([#2368](https://github.com/gin-gonic/gin/pull/2368)) -* chore: rename getQueryCache/getFormCache to initQueryCache/initFormCa ([#2375](https://github.com/gin-gonic/gin/pull/2375)) -* chore(performance): improve countParams ([#2378](https://github.com/gin-gonic/gin/pull/2378)) -* Remove some functions that have the same effect as the bytes package ([#2387](https://github.com/gin-gonic/gin/pull/2387)) -* update:SetMode function ([#2321](https://github.com/gin-gonic/gin/pull/2321)) -* remove a unused type SecureJSONPrefix ([#2391](https://github.com/gin-gonic/gin/pull/2391)) -* Add a redirect sample for POST method ([#2389](https://github.com/gin-gonic/gin/pull/2389)) -* Add CustomRecovery builtin middleware ([#2322](https://github.com/gin-gonic/gin/pull/2322)) -* binding: avoid 2038 problem on 32-bit architectures ([#2450](https://github.com/gin-gonic/gin/pull/2450)) -* Prevent panic in Context.GetQuery() when there is no Request ([#2412](https://github.com/gin-gonic/gin/pull/2412)) -* Add GetUint and GetUint64 method on gin.context ([#2487](https://github.com/gin-gonic/gin/pull/2487)) -* update content-disposition header to MIME-style ([#2512](https://github.com/gin-gonic/gin/pull/2512)) -* reduce allocs and improve the render `WriteString` ([#2508](https://github.com/gin-gonic/gin/pull/2508)) -* implement ".Unwrap() error" on Error type ([#2525](https://github.com/gin-gonic/gin/pull/2525)) ([#2526](https://github.com/gin-gonic/gin/pull/2526)) -* Allow bind with a map[string]string ([#2484](https://github.com/gin-gonic/gin/pull/2484)) -* chore: update tree ([#2371](https://github.com/gin-gonic/gin/pull/2371)) -* Support binding for slice/array obj [Rewrite] ([#2302](https://github.com/gin-gonic/gin/pull/2302)) -* basic auth: fix timing oracle ([#2609](https://github.com/gin-gonic/gin/pull/2609)) -* Add mixed param and non-param paths (port of httprouter[#329](https://github.com/gin-gonic/gin/pull/329)) ([#2663](https://github.com/gin-gonic/gin/pull/2663)) -* feat(engine): add trustedproxies and remoteIP ([#2632](https://github.com/gin-gonic/gin/pull/2632)) - -## Gin v1.6.3 - -### ENHANCEMENTS - - * Improve performance: Change `*sync.RWMutex` to `sync.RWMutex` in context. [#2351](https://github.com/gin-gonic/gin/pull/2351) - -## Gin v1.6.2 - -### BUGFIXES - * fix missing initial sync.RWMutex [#2305](https://github.com/gin-gonic/gin/pull/2305) -### ENHANCEMENTS - * Add set samesite in cookie. [#2306](https://github.com/gin-gonic/gin/pull/2306) - -## Gin v1.6.1 - -### BUGFIXES - * Revert "fix accept incoming network connections" [#2294](https://github.com/gin-gonic/gin/pull/2294) - -## Gin v1.6.0 - -### BREAKING - * chore(performance): Improve performance for adding RemoveExtraSlash flag [#2159](https://github.com/gin-gonic/gin/pull/2159) - * drop support govendor [#2148](https://github.com/gin-gonic/gin/pull/2148) - * Added support for SameSite cookie flag [#1615](https://github.com/gin-gonic/gin/pull/1615) -### FEATURES - * add yaml negotiation [#2220](https://github.com/gin-gonic/gin/pull/2220) - * FileFromFS [#2112](https://github.com/gin-gonic/gin/pull/2112) -### BUGFIXES - * Unix Socket Handling [#2280](https://github.com/gin-gonic/gin/pull/2280) - * Use json marshall in context json to fix breaking new line issue. Fixes #2209 [#2228](https://github.com/gin-gonic/gin/pull/2228) - * fix accept incoming network connections [#2216](https://github.com/gin-gonic/gin/pull/2216) - * Fixed a bug in the calculation of the maximum number of parameters [#2166](https://github.com/gin-gonic/gin/pull/2166) - * [FIX] allow empty headers on DataFromReader [#2121](https://github.com/gin-gonic/gin/pull/2121) - * Add mutex for protect Context.Keys map [#1391](https://github.com/gin-gonic/gin/pull/1391) -### ENHANCEMENTS - * Add mitigation for log injection [#2277](https://github.com/gin-gonic/gin/pull/2277) - * tree: range over nodes values [#2229](https://github.com/gin-gonic/gin/pull/2229) - * tree: remove duplicate assignment [#2222](https://github.com/gin-gonic/gin/pull/2222) - * chore: upgrade go-isatty and json-iterator/go [#2215](https://github.com/gin-gonic/gin/pull/2215) - * path: sync code with httprouter [#2212](https://github.com/gin-gonic/gin/pull/2212) - * Use zero-copy approach to convert types between string and byte slice [#2206](https://github.com/gin-gonic/gin/pull/2206) - * Reuse bytes when cleaning the URL paths [#2179](https://github.com/gin-gonic/gin/pull/2179) - * tree: remove one else statement [#2177](https://github.com/gin-gonic/gin/pull/2177) - * tree: sync httprouter update (#2173) (#2172) [#2171](https://github.com/gin-gonic/gin/pull/2171) - * tree: sync part httprouter codes and reduce if/else [#2163](https://github.com/gin-gonic/gin/pull/2163) - * use http method constant [#2155](https://github.com/gin-gonic/gin/pull/2155) - * upgrade go-validator to v10 [#2149](https://github.com/gin-gonic/gin/pull/2149) - * Refactor redirect request in gin.go [#1970](https://github.com/gin-gonic/gin/pull/1970) - * Add build tag nomsgpack [#1852](https://github.com/gin-gonic/gin/pull/1852) -### DOCS - * docs(path): improve comments [#2223](https://github.com/gin-gonic/gin/pull/2223) - * Renew README to fit the modification of SetCookie method [#2217](https://github.com/gin-gonic/gin/pull/2217) - * Fix spelling [#2202](https://github.com/gin-gonic/gin/pull/2202) - * Remove broken link from README. [#2198](https://github.com/gin-gonic/gin/pull/2198) - * Update docs on Context.Done(), Context.Deadline() and Context.Err() [#2196](https://github.com/gin-gonic/gin/pull/2196) - * Update validator to v10 [#2190](https://github.com/gin-gonic/gin/pull/2190) - * upgrade go-validator to v10 for README [#2189](https://github.com/gin-gonic/gin/pull/2189) - * Update to currently output [#2188](https://github.com/gin-gonic/gin/pull/2188) - * Fix "Custom Validators" example [#2186](https://github.com/gin-gonic/gin/pull/2186) - * Add project to README [#2165](https://github.com/gin-gonic/gin/pull/2165) - * docs(benchmarks): for gin v1.5 [#2153](https://github.com/gin-gonic/gin/pull/2153) - * Changed wording for clarity in README.md [#2122](https://github.com/gin-gonic/gin/pull/2122) -### MISC - * ci support go1.14 [#2262](https://github.com/gin-gonic/gin/pull/2262) - * chore: upgrade depend version [#2231](https://github.com/gin-gonic/gin/pull/2231) - * Drop support go1.10 [#2147](https://github.com/gin-gonic/gin/pull/2147) - * fix comment in `mode.go` [#2129](https://github.com/gin-gonic/gin/pull/2129) - -## Gin v1.5.0 - -- [FIX] Use DefaultWriter and DefaultErrorWriter for debug messages [#1891](https://github.com/gin-gonic/gin/pull/1891) -- [NEW] Now you can parse the inline lowercase start structure [#1893](https://github.com/gin-gonic/gin/pull/1893) -- [FIX] Some code improvements [#1909](https://github.com/gin-gonic/gin/pull/1909) -- [FIX] Use encode replace json marshal increase json encoder speed [#1546](https://github.com/gin-gonic/gin/pull/1546) -- [NEW] Hold matched route full path in the Context [#1826](https://github.com/gin-gonic/gin/pull/1826) -- [FIX] Fix context.Params race condition on Copy() [#1841](https://github.com/gin-gonic/gin/pull/1841) -- [NEW] Add context param query cache [#1450](https://github.com/gin-gonic/gin/pull/1450) -- [FIX] Improve GetQueryMap performance [#1918](https://github.com/gin-gonic/gin/pull/1918) -- [FIX] Improve get post data [#1920](https://github.com/gin-gonic/gin/pull/1920) -- [FIX] Use context instead of x/net/context [#1922](https://github.com/gin-gonic/gin/pull/1922) -- [FIX] Attempt to fix PostForm cache bug [#1931](https://github.com/gin-gonic/gin/pull/1931) -- [NEW] Add support of multipart multi files [#1949](https://github.com/gin-gonic/gin/pull/1949) -- [NEW] Support bind http header param [#1957](https://github.com/gin-gonic/gin/pull/1957) -- [FIX] Drop support for go1.8 and go1.9 [#1933](https://github.com/gin-gonic/gin/pull/1933) -- [FIX] Bugfix for the FullPath feature [#1919](https://github.com/gin-gonic/gin/pull/1919) -- [FIX] Gin1.5 bytes.Buffer to strings.Builder [#1939](https://github.com/gin-gonic/gin/pull/1939) -- [FIX] Upgrade github.com/ugorji/go/codec [#1969](https://github.com/gin-gonic/gin/pull/1969) -- [NEW] Support bind unix time [#1980](https://github.com/gin-gonic/gin/pull/1980) -- [FIX] Simplify code [#2004](https://github.com/gin-gonic/gin/pull/2004) -- [NEW] Support negative Content-Length in DataFromReader [#1981](https://github.com/gin-gonic/gin/pull/1981) -- [FIX] Identify terminal on a RISC-V architecture for auto-colored logs [#2019](https://github.com/gin-gonic/gin/pull/2019) -- [BREAKING] `Context.JSONP()` now expects a semicolon (`;`) at the end [#2007](https://github.com/gin-gonic/gin/pull/2007) -- [BREAKING] Upgrade default `binding.Validator` to v9 (see [its changelog](https://github.com/go-playground/validator/releases/tag/v9.0.0)) [#1015](https://github.com/gin-gonic/gin/pull/1015) -- [NEW] Add `DisallowUnknownFields()` in `Context.BindJSON()` [#2028](https://github.com/gin-gonic/gin/pull/2028) -- [NEW] Use specific `net.Listener` with `Engine.RunListener()` [#2023](https://github.com/gin-gonic/gin/pull/2023) -- [FIX] Fix some typo [#2079](https://github.com/gin-gonic/gin/pull/2079) [#2080](https://github.com/gin-gonic/gin/pull/2080) -- [FIX] Relocate binding body tests [#2086](https://github.com/gin-gonic/gin/pull/2086) -- [FIX] Use Writer in Context.Status [#1606](https://github.com/gin-gonic/gin/pull/1606) -- [FIX] `Engine.RunUnix()` now returns the error if it can't change the file mode [#2093](https://github.com/gin-gonic/gin/pull/2093) -- [FIX] `RouterGroup.StaticFS()` leaked files. Now it closes them. [#2118](https://github.com/gin-gonic/gin/pull/2118) -- [FIX] `Context.Request.FormFile` leaked file. Now it closes it. [#2114](https://github.com/gin-gonic/gin/pull/2114) -- [FIX] Ignore walking on `form:"-"` mapping [#1943](https://github.com/gin-gonic/gin/pull/1943) - -### Gin v1.4.0 - -- [NEW] Support for [Go Modules](https://github.com/golang/go/wiki/Modules) [#1569](https://github.com/gin-gonic/gin/pull/1569) -- [NEW] Refactor of form mapping multipart request [#1829](https://github.com/gin-gonic/gin/pull/1829) -- [FIX] Truncate Latency precision in long running request [#1830](https://github.com/gin-gonic/gin/pull/1830) -- [FIX] IsTerm flag should not be affected by DisableConsoleColor method. [#1802](https://github.com/gin-gonic/gin/pull/1802) -- [NEW] Supporting file binding [#1264](https://github.com/gin-gonic/gin/pull/1264) -- [NEW] Add support for mapping arrays [#1797](https://github.com/gin-gonic/gin/pull/1797) -- [FIX] Readme updates [#1793](https://github.com/gin-gonic/gin/pull/1793) [#1788](https://github.com/gin-gonic/gin/pull/1788) [1789](https://github.com/gin-gonic/gin/pull/1789) -- [FIX] StaticFS: Fixed Logging two log lines on 404. [#1805](https://github.com/gin-gonic/gin/pull/1805), [#1804](https://github.com/gin-gonic/gin/pull/1804) -- [NEW] Make context.Keys available as LogFormatterParams [#1779](https://github.com/gin-gonic/gin/pull/1779) -- [NEW] Use internal/json for Marshal/Unmarshal [#1791](https://github.com/gin-gonic/gin/pull/1791) -- [NEW] Support mapping time.Duration [#1794](https://github.com/gin-gonic/gin/pull/1794) -- [NEW] Refactor form mappings [#1749](https://github.com/gin-gonic/gin/pull/1749) -- [NEW] Added flag to context.Stream indicates if client disconnected in middle of stream [#1252](https://github.com/gin-gonic/gin/pull/1252) -- [FIX] Moved [examples](https://github.com/gin-gonic/examples) to stand alone Repo [#1775](https://github.com/gin-gonic/gin/pull/1775) -- [NEW] Extend context.File to allow for the content-disposition attachments via a new method context.Attachment [#1260](https://github.com/gin-gonic/gin/pull/1260) -- [FIX] Support HTTP content negotiation wildcards [#1112](https://github.com/gin-gonic/gin/pull/1112) -- [NEW] Add prefix from X-Forwarded-Prefix in redirectTrailingSlash [#1238](https://github.com/gin-gonic/gin/pull/1238) -- [FIX] context.Copy() race condition [#1020](https://github.com/gin-gonic/gin/pull/1020) -- [NEW] Add context.HandlerNames() [#1729](https://github.com/gin-gonic/gin/pull/1729) -- [FIX] Change color methods to public in the defaultLogger. [#1771](https://github.com/gin-gonic/gin/pull/1771) -- [FIX] Update writeHeaders method to use http.Header.Set [#1722](https://github.com/gin-gonic/gin/pull/1722) -- [NEW] Add response size to LogFormatterParams [#1752](https://github.com/gin-gonic/gin/pull/1752) -- [NEW] Allow ignoring field on form mapping [#1733](https://github.com/gin-gonic/gin/pull/1733) -- [NEW] Add a function to force color in console output. [#1724](https://github.com/gin-gonic/gin/pull/1724) -- [FIX] Context.Next() - recheck len of handlers on every iteration. [#1745](https://github.com/gin-gonic/gin/pull/1745) -- [FIX] Fix all errcheck warnings [#1739](https://github.com/gin-gonic/gin/pull/1739) [#1653](https://github.com/gin-gonic/gin/pull/1653) -- [NEW] context: inherits context cancellation and deadline from http.Request context for Go>=1.7 [#1690](https://github.com/gin-gonic/gin/pull/1690) -- [NEW] Binding for URL Params [#1694](https://github.com/gin-gonic/gin/pull/1694) -- [NEW] Add LoggerWithFormatter method [#1677](https://github.com/gin-gonic/gin/pull/1677) -- [FIX] CI testing updates [#1671](https://github.com/gin-gonic/gin/pull/1671) [#1670](https://github.com/gin-gonic/gin/pull/1670) [#1682](https://github.com/gin-gonic/gin/pull/1682) [#1669](https://github.com/gin-gonic/gin/pull/1669) -- [FIX] StaticFS(): Send 404 when path does not exist [#1663](https://github.com/gin-gonic/gin/pull/1663) -- [FIX] Handle nil body for JSON binding [#1638](https://github.com/gin-gonic/gin/pull/1638) -- [FIX] Support bind uri param [#1612](https://github.com/gin-gonic/gin/pull/1612) -- [FIX] recovery: fix issue with syscall import on google app engine [#1640](https://github.com/gin-gonic/gin/pull/1640) -- [FIX] Make sure the debug log contains line breaks [#1650](https://github.com/gin-gonic/gin/pull/1650) -- [FIX] Panic stack trace being printed during recovery of broken pipe [#1089](https://github.com/gin-gonic/gin/pull/1089) [#1259](https://github.com/gin-gonic/gin/pull/1259) -- [NEW] RunFd method to run http.Server through a file descriptor [#1609](https://github.com/gin-gonic/gin/pull/1609) -- [NEW] Yaml binding support [#1618](https://github.com/gin-gonic/gin/pull/1618) -- [FIX] Pass MaxMultipartMemory when FormFile is called [#1600](https://github.com/gin-gonic/gin/pull/1600) -- [FIX] LoadHTML* tests [#1559](https://github.com/gin-gonic/gin/pull/1559) -- [FIX] Removed use of sync.pool from HandleContext [#1565](https://github.com/gin-gonic/gin/pull/1565) -- [FIX] Format output log to os.Stderr [#1571](https://github.com/gin-gonic/gin/pull/1571) -- [FIX] Make logger use a yellow background and a darkgray text for legibility [#1570](https://github.com/gin-gonic/gin/pull/1570) -- [FIX] Remove sensitive request information from panic log. [#1370](https://github.com/gin-gonic/gin/pull/1370) -- [FIX] log.Println() does not print timestamp [#829](https://github.com/gin-gonic/gin/pull/829) [#1560](https://github.com/gin-gonic/gin/pull/1560) -- [NEW] Add PureJSON renderer [#694](https://github.com/gin-gonic/gin/pull/694) -- [FIX] Add missing copyright and update if/else [#1497](https://github.com/gin-gonic/gin/pull/1497) -- [FIX] Update msgpack usage [#1498](https://github.com/gin-gonic/gin/pull/1498) -- [FIX] Use protobuf on render [#1496](https://github.com/gin-gonic/gin/pull/1496) -- [FIX] Add support for Protobuf format response [#1479](https://github.com/gin-gonic/gin/pull/1479) -- [NEW] Set default time format in form binding [#1487](https://github.com/gin-gonic/gin/pull/1487) -- [FIX] Add BindXML and ShouldBindXML [#1485](https://github.com/gin-gonic/gin/pull/1485) -- [NEW] Upgrade dependency libraries [#1491](https://github.com/gin-gonic/gin/pull/1491) - - -## Gin v1.3.0 - -- [NEW] Add [`func (*Context) QueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.QueryMap), [`func (*Context) GetQueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetQueryMap), [`func (*Context) PostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.PostFormMap) and [`func (*Context) GetPostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetPostFormMap) to support `type map[string]string` as query string or form parameters, see [#1383](https://github.com/gin-gonic/gin/pull/1383) -- [NEW] Add [`func (*Context) AsciiJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.AsciiJSON), see [#1358](https://github.com/gin-gonic/gin/pull/1358) -- [NEW] Add `Pusher()` in [`type ResponseWriter`](https://godoc.org/github.com/gin-gonic/gin#ResponseWriter) for supporting http2 push, see [#1273](https://github.com/gin-gonic/gin/pull/1273) -- [NEW] Add [`func (*Context) DataFromReader`](https://godoc.org/github.com/gin-gonic/gin#Context.DataFromReader) for serving dynamic data, see [#1304](https://github.com/gin-gonic/gin/pull/1304) -- [NEW] Add [`func (*Context) ShouldBindBodyWith`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindBodyWith) allowing to call binding multiple times, see [#1341](https://github.com/gin-gonic/gin/pull/1341) -- [NEW] Support pointers in form binding, see [#1336](https://github.com/gin-gonic/gin/pull/1336) -- [NEW] Add [`func (*Context) JSONP`](https://godoc.org/github.com/gin-gonic/gin#Context.JSONP), see [#1333](https://github.com/gin-gonic/gin/pull/1333) -- [NEW] Support default value in form binding, see [#1138](https://github.com/gin-gonic/gin/pull/1138) -- [NEW] Expose validator engine in [`type StructValidator`](https://godoc.org/github.com/gin-gonic/gin/binding#StructValidator), see [#1277](https://github.com/gin-gonic/gin/pull/1277) -- [NEW] Add [`func (*Context) ShouldBind`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBind), [`func (*Context) ShouldBindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindQuery) and [`func (*Context) ShouldBindJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindJSON), see [#1047](https://github.com/gin-gonic/gin/pull/1047) -- [NEW] Add support for `time.Time` location in form binding, see [#1117](https://github.com/gin-gonic/gin/pull/1117) -- [NEW] Add [`func (*Context) BindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.BindQuery), see [#1029](https://github.com/gin-gonic/gin/pull/1029) -- [NEW] Make [jsonite](https://github.com/json-iterator/go) optional with build tags, see [#1026](https://github.com/gin-gonic/gin/pull/1026) -- [NEW] Show query string in logger, see [#999](https://github.com/gin-gonic/gin/pull/999) -- [NEW] Add [`func (*Context) SecureJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.SecureJSON), see [#987](https://github.com/gin-gonic/gin/pull/987) and [#993](https://github.com/gin-gonic/gin/pull/993) -- [DEPRECATE] `func (*Context) GetCookie` for [`func (*Context) Cookie`](https://godoc.org/github.com/gin-gonic/gin#Context.Cookie) -- [FIX] Don't display color tags if [`func DisableConsoleColor`](https://godoc.org/github.com/gin-gonic/gin#DisableConsoleColor) called, see [#1072](https://github.com/gin-gonic/gin/pull/1072) -- [FIX] Gin Mode `""` when calling [`func Mode`](https://godoc.org/github.com/gin-gonic/gin#Mode) now returns `const DebugMode`, see [#1250](https://github.com/gin-gonic/gin/pull/1250) -- [FIX] `Flush()` now doesn't overwrite `responseWriter` status code, see [#1460](https://github.com/gin-gonic/gin/pull/1460) - -## Gin 1.2.0 - -- [NEW] Switch from godeps to govendor -- [NEW] Add support for Let's Encrypt via gin-gonic/autotls -- [NEW] Improve README examples and add extra at examples folder -- [NEW] Improved support with App Engine -- [NEW] Add custom template delimiters, see #860 -- [NEW] Add Template Func Maps, see #962 -- [NEW] Add \*context.Handler(), see #928 -- [NEW] Add \*context.GetRawData() -- [NEW] Add \*context.GetHeader() (request) -- [NEW] Add \*context.AbortWithStatusJSON() (JSON content type) -- [NEW] Add \*context.Keys type cast helpers -- [NEW] Add \*context.ShouldBindWith() -- [NEW] Add \*context.MustBindWith() -- [NEW] Add \*engine.SetFuncMap() -- [DEPRECATE] On next release: \*context.BindWith(), see #855 -- [FIX] Refactor render -- [FIX] Reworked tests -- [FIX] logger now supports cygwin -- [FIX] Use X-Forwarded-For before X-Real-Ip -- [FIX] time.Time binding (#904) - -## Gin 1.1.4 - -- [NEW] Support google appengine for IsTerminal func - -## Gin 1.1.3 - -- [FIX] Reverted Logger: skip ANSI color commands - -## Gin 1.1 - -- [NEW] Implement QueryArray and PostArray methods -- [NEW] Refactor GetQuery and GetPostForm -- [NEW] Add contribution guide -- [FIX] Corrected typos in README -- [FIX] Removed additional Iota -- [FIX] Changed imports to gopkg instead of github in README (#733) -- [FIX] Logger: skip ANSI color commands if output is not a tty - -## Gin 1.0rc2 (...) - -- [PERFORMANCE] Fast path for writing Content-Type. -- [PERFORMANCE] Much faster 404 routing -- [PERFORMANCE] Allocation optimizations -- [PERFORMANCE] Faster root tree lookup -- [PERFORMANCE] Zero overhead, String() and JSON() rendering. -- [PERFORMANCE] Faster ClientIP parsing -- [PERFORMANCE] Much faster SSE implementation -- [NEW] Benchmarks suite -- [NEW] Bind validation can be disabled and replaced with custom validators. -- [NEW] More flexible HTML render -- [NEW] Multipart and PostForm bindings -- [NEW] Adds method to return all the registered routes -- [NEW] Context.HandlerName() returns the main handler's name -- [NEW] Adds Error.IsType() helper -- [FIX] Binding multipart form -- [FIX] Integration tests -- [FIX] Crash when binding non struct object in Context. -- [FIX] RunTLS() implementation -- [FIX] Logger() unit tests -- [FIX] Adds SetHTMLTemplate() warning -- [FIX] Context.IsAborted() -- [FIX] More unit tests -- [FIX] JSON, XML, HTML renders accept custom content-types -- [FIX] gin.AbortIndex is unexported -- [FIX] Better approach to avoid directory listing in StaticFS() -- [FIX] Context.ClientIP() always returns the IP with trimmed spaces. -- [FIX] Better warning when running in debug mode. -- [FIX] Google App Engine integration. debugPrint does not use os.Stdout -- [FIX] Fixes integer overflow in error type -- [FIX] Error implements the json.Marshaller interface -- [FIX] MIT license in every file - - -## Gin 1.0rc1 (May 22, 2015) - -- [PERFORMANCE] Zero allocation router -- [PERFORMANCE] Faster JSON, XML and text rendering -- [PERFORMANCE] Custom hand optimized HttpRouter for Gin -- [PERFORMANCE] Misc code optimizations. Inlining, tail call optimizations -- [NEW] Built-in support for golang.org/x/net/context -- [NEW] Any(path, handler). Create a route that matches any path -- [NEW] Refactored rendering pipeline (faster and static typed) -- [NEW] Refactored errors API -- [NEW] IndentedJSON() prints pretty JSON -- [NEW] Added gin.DefaultWriter -- [NEW] UNIX socket support -- [NEW] RouterGroup.BasePath is exposed -- [NEW] JSON validation using go-validate-yourself (very powerful options) -- [NEW] Completed suite of unit tests -- [NEW] HTTP streaming with c.Stream() -- [NEW] StaticFile() creates a router for serving just one file. -- [NEW] StaticFS() has an option to disable directory listing. -- [NEW] StaticFS() for serving static files through virtual filesystems -- [NEW] Server-Sent Events native support -- [NEW] WrapF() and WrapH() helpers for wrapping http.HandlerFunc and http.Handler -- [NEW] Added LoggerWithWriter() middleware -- [NEW] Added RecoveryWithWriter() middleware -- [NEW] Added DefaultPostFormValue() -- [NEW] Added DefaultFormValue() -- [NEW] Added DefaultParamValue() -- [FIX] BasicAuth() when using custom realm -- [FIX] Bug when serving static files in nested routing group -- [FIX] Redirect using built-in http.Redirect() -- [FIX] Logger when printing the requested path -- [FIX] Documentation typos -- [FIX] Context.Engine renamed to Context.engine -- [FIX] Better debugging messages -- [FIX] ErrorLogger -- [FIX] Debug HTTP render -- [FIX] Refactored binding and render modules -- [FIX] Refactored Context initialization -- [FIX] Refactored BasicAuth() -- [FIX] NoMethod/NoRoute handlers -- [FIX] Hijacking http -- [FIX] Better support for Google App Engine (using log instead of fmt) - - -## Gin 0.6 (Mar 9, 2015) - -- [NEW] Support multipart/form-data -- [NEW] NoMethod handler -- [NEW] Validate sub structures -- [NEW] Support for HTTP Realm Auth -- [FIX] Unsigned integers in binding -- [FIX] Improve color logger - - -## Gin 0.5 (Feb 7, 2015) - -- [NEW] Content Negotiation -- [FIX] Solved security bug that allow a client to spoof ip -- [FIX] Fix unexported/ignored fields in binding - - -## Gin 0.4 (Aug 21, 2014) - -- [NEW] Development mode -- [NEW] Unit tests -- [NEW] Add Content.Redirect() -- [FIX] Deferring WriteHeader() -- [FIX] Improved documentation for model binding - - -## Gin 0.3 (Jul 18, 2014) - -- [PERFORMANCE] Normal log and error log are printed in the same call. -- [PERFORMANCE] Improve performance of NoRouter() -- [PERFORMANCE] Improve context's memory locality, reduce CPU cache faults. -- [NEW] Flexible rendering API -- [NEW] Add Context.File() -- [NEW] Add shortcut RunTLS() for http.ListenAndServeTLS -- [FIX] Rename NotFound404() to NoRoute() -- [FIX] Errors in context are purged -- [FIX] Adds HEAD method in Static file serving -- [FIX] Refactors Static() file serving -- [FIX] Using keyed initialization to fix app-engine integration -- [FIX] Can't unmarshal JSON array, #63 -- [FIX] Renaming Context.Req to Context.Request -- [FIX] Check application/x-www-form-urlencoded when parsing form - - -## Gin 0.2b (Jul 08, 2014) -- [PERFORMANCE] Using sync.Pool to allocatio/gc overhead -- [NEW] Travis CI integration -- [NEW] Completely new logger -- [NEW] New API for serving static files. gin.Static() -- [NEW] gin.H() can be serialized into XML -- [NEW] Typed errors. Errors can be typed. Internet/external/custom. -- [NEW] Support for Godeps -- [NEW] Travis/Godocs badges in README -- [NEW] New Bind() and BindWith() methods for parsing request body. -- [NEW] Add Content.Copy() -- [NEW] Add context.LastError() -- [NEW] Add shortcut for OPTIONS HTTP method -- [FIX] Tons of README fixes -- [FIX] Header is written before body -- [FIX] BasicAuth() and changes API a little bit -- [FIX] Recovery() middleware only prints panics -- [FIX] Context.Get() does not panic anymore. Use MustGet() instead. -- [FIX] Multiple http.WriteHeader() in NotFound handlers -- [FIX] Engine.Run() panics if http server can't be set up -- [FIX] Crash when route path doesn't start with '/' -- [FIX] Do not update header when status code is negative -- [FIX] Setting response headers before calling WriteHeader in context.String() -- [FIX] Add MIT license -- [FIX] Changes behaviour of ErrorLogger() and Logger() diff --git a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md b/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md deleted file mode 100644 index 4ea14f3..0000000 --- a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at teamgingonic@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md b/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md deleted file mode 100644 index 97daa80..0000000 --- a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -## Contributing - -- With issues: - - Use the search tool before opening a new issue. - - Please provide source code and commit sha if you found a bug. - - Review existing issues and provide feedback or react to them. - -- With pull requests: - - Open your pull request against `master` - - Your pull request should have no more than two commits, if not you should squash them. - - It should pass all tests in the available continuous integration systems such as TravisCI. - - You should add/modify tests to cover your proposed code changes. - - If your pull request contains a new feature, please document it on the README. diff --git a/vendor/github.com/gin-gonic/gin/LICENSE b/vendor/github.com/gin-gonic/gin/LICENSE deleted file mode 100644 index 1ff7f37..0000000 --- a/vendor/github.com/gin-gonic/gin/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Manuel Martínez-Almeida - -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. diff --git a/vendor/github.com/gin-gonic/gin/Makefile b/vendor/github.com/gin-gonic/gin/Makefile deleted file mode 100644 index 1a99193..0000000 --- a/vendor/github.com/gin-gonic/gin/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -GO ?= go -GOFMT ?= gofmt "-s" -PACKAGES ?= $(shell $(GO) list ./...) -VETPACKAGES ?= $(shell $(GO) list ./... | grep -v /examples/) -GOFILES := $(shell find . -name "*.go") -TESTFOLDER := $(shell $(GO) list ./... | grep -E 'gin$$|binding$$|render$$' | grep -v examples) -TESTTAGS ?= "" - -.PHONY: test -test: - echo "mode: count" > coverage.out - for d in $(TESTFOLDER); do \ - $(GO) test -tags $(TESTTAGS) -v -covermode=count -coverprofile=profile.out $$d > tmp.out; \ - cat tmp.out; \ - if grep -q "^--- FAIL" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - elif grep -q "build failed" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - elif grep -q "setup failed" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - fi; \ - if [ -f profile.out ]; then \ - cat profile.out | grep -v "mode:" >> coverage.out; \ - rm profile.out; \ - fi; \ - done - -.PHONY: fmt -fmt: - $(GOFMT) -w $(GOFILES) - -.PHONY: fmt-check -fmt-check: - @diff=$$($(GOFMT) -d $(GOFILES)); \ - if [ -n "$$diff" ]; then \ - echo "Please run 'make fmt' and commit the result:"; \ - echo "$${diff}"; \ - exit 1; \ - fi; - -vet: - $(GO) vet $(VETPACKAGES) - -.PHONY: lint -lint: - @hash golint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u golang.org/x/lint/golint; \ - fi - for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done; - -.PHONY: misspell-check -misspell-check: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -error $(GOFILES) - -.PHONY: misspell -misspell: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -w $(GOFILES) - -.PHONY: tools -tools: - go install golang.org/x/lint/golint; \ - go install github.com/client9/misspell/cmd/misspell; diff --git a/vendor/github.com/gin-gonic/gin/README.md b/vendor/github.com/gin-gonic/gin/README.md deleted file mode 100644 index d4772d7..0000000 --- a/vendor/github.com/gin-gonic/gin/README.md +++ /dev/null @@ -1,2217 +0,0 @@ -# Gin Web Framework - - - -[![Build Status](https://travis-ci.org/gin-gonic/gin.svg)](https://travis-ci.org/gin-gonic/gin) -[![codecov](https://codecov.io/gh/gin-gonic/gin/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-gonic/gin) -[![Go Report Card](https://goreportcard.com/badge/github.com/gin-gonic/gin)](https://goreportcard.com/report/github.com/gin-gonic/gin) -[![GoDoc](https://pkg.go.dev/badge/github.com/gin-gonic/gin?status.svg)](https://pkg.go.dev/github.com/gin-gonic/gin?tab=doc) -[![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Sourcegraph](https://sourcegraph.com/github.com/gin-gonic/gin/-/badge.svg)](https://sourcegraph.com/github.com/gin-gonic/gin?badge) -[![Open Source Helpers](https://www.codetriage.com/gin-gonic/gin/badges/users.svg)](https://www.codetriage.com/gin-gonic/gin) -[![Release](https://img.shields.io/github/release/gin-gonic/gin.svg?style=flat-square)](https://github.com/gin-gonic/gin/releases) -[![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/gin-gonic/gin)](https://www.tickgit.com/browse?repo=github.com/gin-gonic/gin) - -Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin. - - -## Contents - -- [Gin Web Framework](#gin-web-framework) - - [Contents](#contents) - - [Installation](#installation) - - [Quick start](#quick-start) - - [Benchmarks](#benchmarks) - - [Gin v1. stable](#gin-v1-stable) - - [Build with jsoniter](#build-with-jsoniter) - - [API Examples](#api-examples) - - [Using GET, POST, PUT, PATCH, DELETE and OPTIONS](#using-get-post-put-patch-delete-and-options) - - [Parameters in path](#parameters-in-path) - - [Querystring parameters](#querystring-parameters) - - [Multipart/Urlencoded Form](#multiparturlencoded-form) - - [Another example: query + post form](#another-example-query--post-form) - - [Map as querystring or postform parameters](#map-as-querystring-or-postform-parameters) - - [Upload files](#upload-files) - - [Single file](#single-file) - - [Multiple files](#multiple-files) - - [Grouping routes](#grouping-routes) - - [Blank Gin without middleware by default](#blank-gin-without-middleware-by-default) - - [Using middleware](#using-middleware) - - [How to write log file](#how-to-write-log-file) - - [Custom Log Format](#custom-log-format) - - [Controlling Log output coloring](#controlling-log-output-coloring) - - [Model binding and validation](#model-binding-and-validation) - - [Custom Validators](#custom-validators) - - [Only Bind Query String](#only-bind-query-string) - - [Bind Query String or Post Data](#bind-query-string-or-post-data) - - [Bind Uri](#bind-uri) - - [Bind Header](#bind-header) - - [Bind HTML checkboxes](#bind-html-checkboxes) - - [Multipart/Urlencoded binding](#multiparturlencoded-binding) - - [XML, JSON, YAML and ProtoBuf rendering](#xml-json-yaml-and-protobuf-rendering) - - [SecureJSON](#securejson) - - [JSONP](#jsonp) - - [AsciiJSON](#asciijson) - - [PureJSON](#purejson) - - [Serving static files](#serving-static-files) - - [Serving data from file](#serving-data-from-file) - - [Serving data from reader](#serving-data-from-reader) - - [HTML rendering](#html-rendering) - - [Custom Template renderer](#custom-template-renderer) - - [Custom Delimiters](#custom-delimiters) - - [Custom Template Funcs](#custom-template-funcs) - - [Multitemplate](#multitemplate) - - [Redirects](#redirects) - - [Custom Middleware](#custom-middleware) - - [Using BasicAuth() middleware](#using-basicauth-middleware) - - [Goroutines inside a middleware](#goroutines-inside-a-middleware) - - [Custom HTTP configuration](#custom-http-configuration) - - [Support Let's Encrypt](#support-lets-encrypt) - - [Run multiple service using Gin](#run-multiple-service-using-gin) - - [Graceful shutdown or restart](#graceful-shutdown-or-restart) - - [Third-party packages](#third-party-packages) - - [Manually](#manually) - - [Build a single binary with templates](#build-a-single-binary-with-templates) - - [Bind form-data request with custom struct](#bind-form-data-request-with-custom-struct) - - [Try to bind body into different structs](#try-to-bind-body-into-different-structs) - - [http2 server push](#http2-server-push) - - [Define format for the log of routes](#define-format-for-the-log-of-routes) - - [Set and get a cookie](#set-and-get-a-cookie) - - [Testing](#testing) - - [Users](#users) - -## Installation - -To install Gin package, you need to install Go and set your Go workspace first. - -1. The first need [Go](https://golang.org/) installed (**version 1.12+ is required**), then you can use the below Go command to install Gin. - -```sh -$ go get -u github.com/gin-gonic/gin -``` - -2. Import it in your code: - -```go -import "github.com/gin-gonic/gin" -``` - -3. (Optional) Import `net/http`. This is required for example if using constants such as `http.StatusOK`. - -```go -import "net/http" -``` - -## Quick start - -```sh -# assume the following codes in example.go file -$ cat example.go -``` - -```go -package main - -import "github.com/gin-gonic/gin" - -func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.JSON(200, gin.H{ - "message": "pong", - }) - }) - r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") -} -``` - -``` -# run example.go and visit 0.0.0.0:8080/ping (for windows "localhost:8080/ping") on browser -$ go run example.go -``` - -## Benchmarks - -Gin uses a custom version of [HttpRouter](https://github.com/julienschmidt/httprouter) - -[See all benchmarks](/BENCHMARKS.md) - -| Benchmark name | (1) | (2) | (3) | (4) | -| ------------------------------ | ---------:| ---------------:| ------------:| ---------------:| -| BenchmarkGin_GithubAll | **43550** | **27364 ns/op** | **0 B/op** | **0 allocs/op** | -| BenchmarkAce_GithubAll | 40543 | 29670 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkAero_GithubAll | 57632 | 20648 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkBear_GithubAll | 9234 | 216179 ns/op | 86448 B/op | 943 allocs/op | -| BenchmarkBeego_GithubAll | 7407 | 243496 ns/op | 71456 B/op | 609 allocs/op | -| BenchmarkBone_GithubAll | 420 | 2922835 ns/op | 720160 B/op | 8620 allocs/op | -| BenchmarkChi_GithubAll | 7620 | 238331 ns/op | 87696 B/op | 609 allocs/op | -| BenchmarkDenco_GithubAll | 18355 | 64494 ns/op | 20224 B/op | 167 allocs/op | -| BenchmarkEcho_GithubAll | 31251 | 38479 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkGocraftWeb_GithubAll | 4117 | 300062 ns/op | 131656 B/op | 1686 allocs/op | -| BenchmarkGoji_GithubAll | 3274 | 416158 ns/op | 56112 B/op | 334 allocs/op | -| BenchmarkGojiv2_GithubAll | 1402 | 870518 ns/op | 352720 B/op | 4321 allocs/op | -| BenchmarkGoJsonRest_GithubAll | 2976 | 401507 ns/op | 134371 B/op | 2737 allocs/op | -| BenchmarkGoRestful_GithubAll | 410 | 2913158 ns/op | 910144 B/op | 2938 allocs/op | -| BenchmarkGorillaMux_GithubAll | 346 | 3384987 ns/op | 251650 B/op | 1994 allocs/op | -| BenchmarkGowwwRouter_GithubAll | 10000 | 143025 ns/op | 72144 B/op | 501 allocs/op | -| BenchmarkHttpRouter_GithubAll | 55938 | 21360 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkHttpTreeMux_GithubAll | 10000 | 153944 ns/op | 65856 B/op | 671 allocs/op | -| BenchmarkKocha_GithubAll | 10000 | 106315 ns/op | 23304 B/op | 843 allocs/op | -| BenchmarkLARS_GithubAll | 47779 | 25084 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkMacaron_GithubAll | 3266 | 371907 ns/op | 149409 B/op | 1624 allocs/op | -| BenchmarkMartini_GithubAll | 331 | 3444706 ns/op | 226551 B/op | 2325 allocs/op | -| BenchmarkPat_GithubAll | 273 | 4381818 ns/op | 1483152 B/op | 26963 allocs/op | -| BenchmarkPossum_GithubAll | 10000 | 164367 ns/op | 84448 B/op | 609 allocs/op | -| BenchmarkR2router_GithubAll | 10000 | 160220 ns/op | 77328 B/op | 979 allocs/op | -| BenchmarkRivet_GithubAll | 14625 | 82453 ns/op | 16272 B/op | 167 allocs/op | -| BenchmarkTango_GithubAll | 6255 | 279611 ns/op | 63826 B/op | 1618 allocs/op | -| BenchmarkTigerTonic_GithubAll | 2008 | 687874 ns/op | 193856 B/op | 4474 allocs/op | -| BenchmarkTraffic_GithubAll | 355 | 3478508 ns/op | 820744 B/op | 14114 allocs/op | -| BenchmarkVulcan_GithubAll | 6885 | 193333 ns/op | 19894 B/op | 609 allocs/op | - -- (1): Total Repetitions achieved in constant time, higher means more confident result -- (2): Single Repetition Duration (ns/op), lower is better -- (3): Heap Memory (B/op), lower is better -- (4): Average Allocations per Repetition (allocs/op), lower is better - -## Gin v1. stable - -- [x] Zero allocation router. -- [x] Still the fastest http router and framework. From routing to writing. -- [x] Complete suite of unit tests. -- [x] Battle tested. -- [x] API frozen, new releases will not break your code. - -## Build with [jsoniter](https://github.com/json-iterator/go) - -Gin uses `encoding/json` as default json package but you can change to [jsoniter](https://github.com/json-iterator/go) by build from other tags. - -```sh -$ go build -tags=jsoniter . -``` - -## API Examples - -You can find a number of ready-to-run examples at [Gin examples repository](https://github.com/gin-gonic/examples). - -### Using GET, POST, PUT, PATCH, DELETE and OPTIONS - -```go -func main() { - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/someGet", getting) - router.POST("/somePost", posting) - router.PUT("/somePut", putting) - router.DELETE("/someDelete", deleting) - router.PATCH("/somePatch", patching) - router.HEAD("/someHead", head) - router.OPTIONS("/someOptions", options) - - // By default it serves on :8080 unless a - // PORT environment variable was defined. - router.Run() - // router.Run(":3000") for a hard coded port -} -``` - -### Parameters in path - -```go -func main() { - router := gin.Default() - - // This handler will match /user/john but will not match /user/ or /user - router.GET("/user/:name", func(c *gin.Context) { - name := c.Param("name") - c.String(http.StatusOK, "Hello %s", name) - }) - - // However, this one will match /user/john/ and also /user/john/send - // If no other routers match /user/john, it will redirect to /user/john/ - router.GET("/user/:name/*action", func(c *gin.Context) { - name := c.Param("name") - action := c.Param("action") - message := name + " is " + action - c.String(http.StatusOK, message) - }) - - // For each matched request Context will hold the route definition - router.POST("/user/:name/*action", func(c *gin.Context) { - c.FullPath() == "/user/:name/*action" // true - }) - - // This handler will add a new router for /user/groups. - // Exact routes are resolved before param routes, regardless of the order they were defined. - // Routes starting with /user/groups are never interpreted as /user/:name/... routes - router.GET("/user/groups", func(c *gin.Context) { - c.String(http.StatusOK, "The available groups are [...]", name) - }) - - router.Run(":8080") -} -``` - -### Querystring parameters - -```go -func main() { - router := gin.Default() - - // Query string parameters are parsed using the existing underlying request object. - // The request responds to a url matching: /welcome?firstname=Jane&lastname=Doe - router.GET("/welcome", func(c *gin.Context) { - firstname := c.DefaultQuery("firstname", "Guest") - lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname") - - c.String(http.StatusOK, "Hello %s %s", firstname, lastname) - }) - router.Run(":8080") -} -``` - -### Multipart/Urlencoded Form - -```go -func main() { - router := gin.Default() - - router.POST("/form_post", func(c *gin.Context) { - message := c.PostForm("message") - nick := c.DefaultPostForm("nick", "anonymous") - - c.JSON(200, gin.H{ - "status": "posted", - "message": message, - "nick": nick, - }) - }) - router.Run(":8080") -} -``` - -### Another example: query + post form - -``` -POST /post?id=1234&page=1 HTTP/1.1 -Content-Type: application/x-www-form-urlencoded - -name=manu&message=this_is_great -``` - -```go -func main() { - router := gin.Default() - - router.POST("/post", func(c *gin.Context) { - - id := c.Query("id") - page := c.DefaultQuery("page", "0") - name := c.PostForm("name") - message := c.PostForm("message") - - fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message) - }) - router.Run(":8080") -} -``` - -``` -id: 1234; page: 1; name: manu; message: this_is_great -``` - -### Map as querystring or postform parameters - -``` -POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1 -Content-Type: application/x-www-form-urlencoded - -names[first]=thinkerou&names[second]=tianou -``` - -```go -func main() { - router := gin.Default() - - router.POST("/post", func(c *gin.Context) { - - ids := c.QueryMap("ids") - names := c.PostFormMap("names") - - fmt.Printf("ids: %v; names: %v", ids, names) - }) - router.Run(":8080") -} -``` - -``` -ids: map[b:hello a:1234]; names: map[second:tianou first:thinkerou] -``` - -### Upload files - -#### Single file - -References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/single). - -`file.Filename` **SHOULD NOT** be trusted. See [`Content-Disposition` on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#Directives) and [#1693](https://github.com/gin-gonic/gin/issues/1693) - -> The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done. - -```go -func main() { - router := gin.Default() - // Set a lower memory limit for multipart forms (default is 32 MiB) - router.MaxMultipartMemory = 8 << 20 // 8 MiB - router.POST("/upload", func(c *gin.Context) { - // single file - file, _ := c.FormFile("file") - log.Println(file.Filename) - - // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) - - c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) - }) - router.Run(":8080") -} -``` - -How to `curl`: - -```bash -curl -X POST http://localhost:8080/upload \ - -F "file=@/Users/appleboy/test.zip" \ - -H "Content-Type: multipart/form-data" -``` - -#### Multiple files - -See the detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). - -```go -func main() { - router := gin.Default() - // Set a lower memory limit for multipart forms (default is 32 MiB) - router.MaxMultipartMemory = 8 << 20 // 8 MiB - router.POST("/upload", func(c *gin.Context) { - // Multipart form - form, _ := c.MultipartForm() - files := form.File["upload[]"] - - for _, file := range files { - log.Println(file.Filename) - - // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) - } - c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) - }) - router.Run(":8080") -} -``` - -How to `curl`: - -```bash -curl -X POST http://localhost:8080/upload \ - -F "upload[]=@/Users/appleboy/test1.zip" \ - -F "upload[]=@/Users/appleboy/test2.zip" \ - -H "Content-Type: multipart/form-data" -``` - -### Grouping routes - -```go -func main() { - router := gin.Default() - - // Simple group: v1 - v1 := router.Group("/v1") - { - v1.POST("/login", loginEndpoint) - v1.POST("/submit", submitEndpoint) - v1.POST("/read", readEndpoint) - } - - // Simple group: v2 - v2 := router.Group("/v2") - { - v2.POST("/login", loginEndpoint) - v2.POST("/submit", submitEndpoint) - v2.POST("/read", readEndpoint) - } - - router.Run(":8080") -} -``` - -### Blank Gin without middleware by default - -Use - -```go -r := gin.New() -``` - -instead of - -```go -// Default With the Logger and Recovery middleware already attached -r := gin.Default() -``` - - -### Using middleware -```go -func main() { - // Creates a router without any middleware by default - r := gin.New() - - // Global middleware - // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. - // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) - - // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.Recovery()) - - // Per route middleware, you can add as many as you desire. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) - - // Authorization group - // authorized := r.Group("/", AuthRequired()) - // exactly the same as: - authorized := r.Group("/") - // per group middleware! in this case we use the custom created - // AuthRequired() middleware just in the "authorized" group. - authorized.Use(AuthRequired()) - { - authorized.POST("/login", loginEndpoint) - authorized.POST("/submit", submitEndpoint) - authorized.POST("/read", readEndpoint) - - // nested group - testing := authorized.Group("testing") - testing.GET("/analytics", analyticsEndpoint) - } - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Custom Recovery behavior -```go -func main() { - // Creates a router without any middleware by default - r := gin.New() - - // Global middleware - // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. - // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) - - // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.CustomRecovery(func(c *gin.Context, recovered interface{}) { - if err, ok := recovered.(string); ok { - c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err)) - } - c.AbortWithStatus(http.StatusInternalServerError) - })) - - r.GET("/panic", func(c *gin.Context) { - // panic with a string -- the custom middleware could save this to a database or report it to the user - panic("foo") - }) - - r.GET("/", func(c *gin.Context) { - c.String(http.StatusOK, "ohai") - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### How to write log file -```go -func main() { - // Disable Console Color, you don't need console color when writing the logs to file. - gin.DisableConsoleColor() - - // Logging to a file. - f, _ := os.Create("gin.log") - gin.DefaultWriter = io.MultiWriter(f) - - // Use the following code if you need to write the logs to file and console at the same time. - // gin.DefaultWriter = io.MultiWriter(f, os.Stdout) - - router := gin.Default() - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - -    router.Run(":8080") -} -``` - -### Custom Log Format -```go -func main() { - router := gin.New() - - // LoggerWithFormatter middleware will write the logs to gin.DefaultWriter - // By default gin.DefaultWriter = os.Stdout - router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string { - - // your custom format - return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n", - param.ClientIP, - param.TimeStamp.Format(time.RFC1123), - param.Method, - param.Path, - param.Request.Proto, - param.StatusCode, - param.Latency, - param.Request.UserAgent(), - param.ErrorMessage, - ) - })) - router.Use(gin.Recovery()) - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -**Sample Output** -``` -::1 - [Fri, 07 Dec 2018 17:04:38 JST] "GET /ping HTTP/1.1 200 122.767µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36" " -``` - -### Controlling Log output coloring - -By default, logs output on console should be colorized depending on the detected TTY. - -Never colorize logs: - -```go -func main() { - // Disable log's color - gin.DisableConsoleColor() - - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -Always colorize logs: - -```go -func main() { - // Force log's color - gin.ForceConsoleColor() - - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -### Model binding and validation - -To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz). - -Gin uses [**go-playground/validator/v10**](https://github.com/go-playground/validator) for validation. Check the full docs on tags usage [here](https://godoc.org/github.com/go-playground/validator#hdr-Baked_In_Validators_and_Tags). - -Note that you need to set the corresponding binding tag on all fields you want to bind. For example, when binding from JSON, set `json:"fieldname"`. - -Also, Gin provides two sets of methods for binding: -- **Type** - Must bind - - **Methods** - `Bind`, `BindJSON`, `BindXML`, `BindQuery`, `BindYAML`, `BindHeader` - - **Behavior** - These methods use `MustBindWith` under the hood. If there is a binding error, the request is aborted with `c.AbortWithError(400, err).SetType(ErrorTypeBind)`. This sets the response status code to 400 and the `Content-Type` header is set to `text/plain; charset=utf-8`. Note that if you try to set the response code after this, it will result in a warning `[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422`. If you wish to have greater control over the behavior, consider using the `ShouldBind` equivalent method. -- **Type** - Should bind - - **Methods** - `ShouldBind`, `ShouldBindJSON`, `ShouldBindXML`, `ShouldBindQuery`, `ShouldBindYAML`, `ShouldBindHeader` - - **Behavior** - These methods use `ShouldBindWith` under the hood. If there is a binding error, the error is returned and it is the developer's responsibility to handle the request and error appropriately. - -When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use `MustBindWith` or `ShouldBindWith`. - -You can also specify that specific fields are required. If a field is decorated with `binding:"required"` and has a empty value when binding, an error will be returned. - -```go -// Binding from JSON -type Login struct { - User string `form:"user" json:"user" xml:"user" binding:"required"` - Password string `form:"password" json:"password" xml:"password" binding:"required"` -} - -func main() { - router := gin.Default() - - // Example for binding JSON ({"user": "manu", "password": "123"}) - router.POST("/loginJSON", func(c *gin.Context) { - var json Login - if err := c.ShouldBindJSON(&json); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if json.User != "manu" || json.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Example for binding XML ( - // - // - // user - // 123 - // ) - router.POST("/loginXML", func(c *gin.Context) { - var xml Login - if err := c.ShouldBindXML(&xml); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if xml.User != "manu" || xml.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Example for binding a HTML form (user=manu&password=123) - router.POST("/loginForm", func(c *gin.Context) { - var form Login - // This will infer what binder to use depending on the content-type header. - if err := c.ShouldBind(&form); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if form.User != "manu" || form.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Listen and serve on 0.0.0.0:8080 - router.Run(":8080") -} -``` - -**Sample request** -```shell -$ curl -v -X POST \ - http://localhost:8080/loginJSON \ - -H 'content-type: application/json' \ - -d '{ "user": "manu" }' -> POST /loginJSON HTTP/1.1 -> Host: localhost:8080 -> User-Agent: curl/7.51.0 -> Accept: */* -> content-type: application/json -> Content-Length: 18 -> -* upload completely sent off: 18 out of 18 bytes -< HTTP/1.1 400 Bad Request -< Content-Type: application/json; charset=utf-8 -< Date: Fri, 04 Aug 2017 03:51:31 GMT -< Content-Length: 100 -< -{"error":"Key: 'Login.Password' Error:Field validation for 'Password' failed on the 'required' tag"} -``` - -**Skip validate** - -When running the above example using the above the `curl` command, it returns error. Because the example use `binding:"required"` for `Password`. If use `binding:"-"` for `Password`, then it will not return error when running the above example again. - -### Custom Validators - -It is also possible to register custom validators. See the [example code](https://github.com/gin-gonic/examples/tree/master/custom-validation/server.go). - -```go -package main - -import ( - "net/http" - "time" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - "github.com/go-playground/validator/v10" -) - -// Booking contains binded and validated data. -type Booking struct { - CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"` - CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"` -} - -var bookableDate validator.Func = func(fl validator.FieldLevel) bool { - date, ok := fl.Field().Interface().(time.Time) - if ok { - today := time.Now() - if today.After(date) { - return false - } - } - return true -} - -func main() { - route := gin.Default() - - if v, ok := binding.Validator.Engine().(*validator.Validate); ok { - v.RegisterValidation("bookabledate", bookableDate) - } - - route.GET("/bookable", getBookable) - route.Run(":8085") -} - -func getBookable(c *gin.Context) { - var b Booking - if err := c.ShouldBindWith(&b, binding.Query); err == nil { - c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"}) - } else { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - } -} -``` - -```console -$ curl "localhost:8085/bookable?check_in=2030-04-16&check_out=2030-04-17" -{"message":"Booking dates are valid!"} - -$ curl "localhost:8085/bookable?check_in=2030-03-10&check_out=2030-03-09" -{"error":"Key: 'Booking.CheckOut' Error:Field validation for 'CheckOut' failed on the 'gtfield' tag"} - -$ curl "localhost:8085/bookable?check_in=2000-03-09&check_out=2000-03-10" -{"error":"Key: 'Booking.CheckIn' Error:Field validation for 'CheckIn' failed on the 'bookabledate' tag"}% -``` - -[Struct level validations](https://github.com/go-playground/validator/releases/tag/v8.7) can also be registered this way. -See the [struct-lvl-validation example](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations) to learn more. - -### Only Bind Query String - -`ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/gin" -) - -type Person struct { - Name string `form:"name"` - Address string `form:"address"` -} - -func main() { - route := gin.Default() - route.Any("/testing", startPage) - route.Run(":8085") -} - -func startPage(c *gin.Context) { - var person Person - if c.ShouldBindQuery(&person) == nil { - log.Println("====== Only Bind By Query String ======") - log.Println(person.Name) - log.Println(person.Address) - } - c.String(200, "Success") -} - -``` - -### Bind Query String or Post Data - -See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). - -```go -package main - -import ( - "log" - "time" - - "github.com/gin-gonic/gin" -) - -type Person struct { - Name string `form:"name"` - Address string `form:"address"` - Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"` - CreateTime time.Time `form:"createTime" time_format:"unixNano"` - UnixTime time.Time `form:"unixTime" time_format:"unix"` -} - -func main() { - route := gin.Default() - route.GET("/testing", startPage) - route.Run(":8085") -} - -func startPage(c *gin.Context) { - var person Person - // If `GET`, only `Form` binding engine (`query`) used. - // If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`). - // See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48 - if c.ShouldBind(&person) == nil { - log.Println(person.Name) - log.Println(person.Address) - log.Println(person.Birthday) - log.Println(person.CreateTime) - log.Println(person.UnixTime) - } - - c.String(200, "Success") -} -``` - -Test it with: -```sh -$ curl -X GET "localhost:8085/testing?name=appleboy&address=xyz&birthday=1992-03-15&createTime=1562400033000000123&unixTime=1562400033" -``` - -### Bind Uri - -See the [detail information](https://github.com/gin-gonic/gin/issues/846). - -```go -package main - -import "github.com/gin-gonic/gin" - -type Person struct { - ID string `uri:"id" binding:"required,uuid"` - Name string `uri:"name" binding:"required"` -} - -func main() { - route := gin.Default() - route.GET("/:name/:id", func(c *gin.Context) { - var person Person - if err := c.ShouldBindUri(&person); err != nil { - c.JSON(400, gin.H{"msg": err}) - return - } - c.JSON(200, gin.H{"name": person.Name, "uuid": person.ID}) - }) - route.Run(":8088") -} -``` - -Test it with: -```sh -$ curl -v localhost:8088/thinkerou/987fbc97-4bed-5078-9f07-9141ba07c9f3 -$ curl -v localhost:8088/thinkerou/not-uuid -``` - -### Bind Header - -```go -package main - -import ( - "fmt" - "github.com/gin-gonic/gin" -) - -type testHeader struct { - Rate int `header:"Rate"` - Domain string `header:"Domain"` -} - -func main() { - r := gin.Default() - r.GET("/", func(c *gin.Context) { - h := testHeader{} - - if err := c.ShouldBindHeader(&h); err != nil { - c.JSON(200, err) - } - - fmt.Printf("%#v\n", h) - c.JSON(200, gin.H{"Rate": h.Rate, "Domain": h.Domain}) - }) - - r.Run() - -// client -// curl -H "rate:300" -H "domain:music" 127.0.0.1:8080/ -// output -// {"Domain":"music","Rate":300} -} -``` - -### Bind HTML checkboxes - -See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) - -main.go - -```go -... - -type myForm struct { - Colors []string `form:"colors[]"` -} - -... - -func formHandler(c *gin.Context) { - var fakeForm myForm - c.ShouldBind(&fakeForm) - c.JSON(200, gin.H{"color": fakeForm.Colors}) -} - -... - -``` - -form.html - -```html -
-

Check some colors

- - - - - - - -
-``` - -result: - -``` -{"color":["red","green","blue"]} -``` - -### Multipart/Urlencoded binding - -```go -type ProfileForm struct { - Name string `form:"name" binding:"required"` - Avatar *multipart.FileHeader `form:"avatar" binding:"required"` - - // or for multiple files - // Avatars []*multipart.FileHeader `form:"avatar" binding:"required"` -} - -func main() { - router := gin.Default() - router.POST("/profile", func(c *gin.Context) { - // you can bind multipart form with explicit binding declaration: - // c.ShouldBindWith(&form, binding.Form) - // or you can simply use autobinding with ShouldBind method: - var form ProfileForm - // in this case proper binding will be automatically selected - if err := c.ShouldBind(&form); err != nil { - c.String(http.StatusBadRequest, "bad request") - return - } - - err := c.SaveUploadedFile(form.Avatar, form.Avatar.Filename) - if err != nil { - c.String(http.StatusInternalServerError, "unknown error") - return - } - - // db.Save(&form) - - c.String(http.StatusOK, "ok") - }) - router.Run(":8080") -} -``` - -Test it with: -```sh -$ curl -X POST -v --form name=user --form "avatar=@./avatar.png" http://localhost:8080/profile -``` - -### XML, JSON, YAML and ProtoBuf rendering - -```go -func main() { - r := gin.Default() - - // gin.H is a shortcut for map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/moreJSON", func(c *gin.Context) { - // You also can use a struct - var msg struct { - Name string `json:"user"` - Message string - Number int - } - msg.Name = "Lena" - msg.Message = "hey" - msg.Number = 123 - // Note that msg.Name becomes "user" in the JSON - // Will output : {"user": "Lena", "Message": "hey", "Number": 123} - c.JSON(http.StatusOK, msg) - }) - - r.GET("/someXML", func(c *gin.Context) { - c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/someYAML", func(c *gin.Context) { - c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/someProtoBuf", func(c *gin.Context) { - reps := []int64{int64(1), int64(2)} - label := "test" - // The specific definition of protobuf is written in the testdata/protoexample file. - data := &protoexample.Test{ - Label: &label, - Reps: reps, - } - // Note that data becomes binary data in the response - // Will output protoexample.Test protobuf serialized data - c.ProtoBuf(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -#### SecureJSON - -Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. - -```go -func main() { - r := gin.Default() - - // You can also use your own secure json prefix - // r.SecureJsonPrefix(")]}',\n") - - r.GET("/someJSON", func(c *gin.Context) { - names := []string{"lena", "austin", "foo"} - - // Will output : while(1);["lena","austin","foo"] - c.SecureJSON(http.StatusOK, names) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` -#### JSONP - -Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. - -```go -func main() { - r := gin.Default() - - r.GET("/JSONP", func(c *gin.Context) { - data := gin.H{ - "foo": "bar", - } - - //callback is x - // Will output : x({\"foo\":\"bar\"}) - c.JSONP(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") - - // client - // curl http://127.0.0.1:8080/JSONP?callback=x -} -``` - -#### AsciiJSON - -Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII characters. - -```go -func main() { - r := gin.Default() - - r.GET("/someJSON", func(c *gin.Context) { - data := gin.H{ - "lang": "GO语言", - "tag": "
", - } - - // will output : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"} - c.AsciiJSON(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -#### PureJSON - -Normally, JSON replaces special HTML characters with their unicode entities, e.g. `<` becomes `\u003c`. If you want to encode such characters literally, you can use PureJSON instead. -This feature is unavailable in Go 1.6 and lower. - -```go -func main() { - r := gin.Default() - - // Serves unicode entities - r.GET("/json", func(c *gin.Context) { - c.JSON(200, gin.H{ - "html": "Hello, world!", - }) - }) - - // Serves literal characters - r.GET("/purejson", func(c *gin.Context) { - c.PureJSON(200, gin.H{ - "html": "Hello, world!", - }) - }) - - // listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Serving static files - -```go -func main() { - router := gin.Default() - router.Static("/assets", "./assets") - router.StaticFS("/more_static", http.Dir("my_file_system")) - router.StaticFile("/favicon.ico", "./resources/favicon.ico") - - // Listen and serve on 0.0.0.0:8080 - router.Run(":8080") -} -``` - -### Serving data from file - -```go -func main() { - router := gin.Default() - - router.GET("/local/file", func(c *gin.Context) { - c.File("local/file.go") - }) - - var fs http.FileSystem = // ... - router.GET("/fs/file", func(c *gin.Context) { - c.FileFromFS("fs/file.go", fs) - }) -} - -``` - -### Serving data from reader - -```go -func main() { - router := gin.Default() - router.GET("/someDataFromReader", func(c *gin.Context) { - response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png") - if err != nil || response.StatusCode != http.StatusOK { - c.Status(http.StatusServiceUnavailable) - return - } - - reader := response.Body - defer reader.Close() - contentLength := response.ContentLength - contentType := response.Header.Get("Content-Type") - - extraHeaders := map[string]string{ - "Content-Disposition": `attachment; filename="gopher.png"`, - } - - c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) - }) - router.Run(":8080") -} -``` - -### HTML rendering - -Using LoadHTMLGlob() or LoadHTMLFiles() - -```go -func main() { - router := gin.Default() - router.LoadHTMLGlob("templates/*") - //router.LoadHTMLFiles("templates/template1.html", "templates/template2.html") - router.GET("/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "index.tmpl", gin.H{ - "title": "Main website", - }) - }) - router.Run(":8080") -} -``` - -templates/index.tmpl - -```html - -

- {{ .title }} -

- -``` - -Using templates with same name in different directories - -```go -func main() { - router := gin.Default() - router.LoadHTMLGlob("templates/**/*") - router.GET("/posts/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ - "title": "Posts", - }) - }) - router.GET("/users/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ - "title": "Users", - }) - }) - router.Run(":8080") -} -``` - -templates/posts/index.tmpl - -```html -{{ define "posts/index.tmpl" }} -

- {{ .title }} -

-

Using posts/index.tmpl

- -{{ end }} -``` - -templates/users/index.tmpl - -```html -{{ define "users/index.tmpl" }} -

- {{ .title }} -

-

Using users/index.tmpl

- -{{ end }} -``` - -#### Custom Template renderer - -You can also use your own html template render - -```go -import "html/template" - -func main() { - router := gin.Default() - html := template.Must(template.ParseFiles("file1", "file2")) - router.SetHTMLTemplate(html) - router.Run(":8080") -} -``` - -#### Custom Delimiters - -You may use custom delims - -```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") -``` - -#### Custom Template Funcs - -See the detail [example code](https://github.com/gin-gonic/examples/tree/master/template). - -main.go - -```go -import ( - "fmt" - "html/template" - "net/http" - "time" - - "github.com/gin-gonic/gin" -) - -func formatAsDate(t time.Time) string { - year, month, day := t.Date() - return fmt.Sprintf("%d%02d/%02d", year, month, day) -} - -func main() { - router := gin.Default() - router.Delims("{[{", "}]}") - router.SetFuncMap(template.FuncMap{ - "formatAsDate": formatAsDate, - }) - router.LoadHTMLFiles("./testdata/template/raw.tmpl") - - router.GET("/raw", func(c *gin.Context) { - c.HTML(http.StatusOK, "raw.tmpl", gin.H{ - "now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), - }) - }) - - router.Run(":8080") -} - -``` - -raw.tmpl - -```html -Date: {[{.now | formatAsDate}]} -``` - -Result: -``` -Date: 2017/07/01 -``` - -### Multitemplate - -Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. - -### Redirects - -Issuing a HTTP redirect is easy. Both internal and external locations are supported. - -```go -r.GET("/test", func(c *gin.Context) { - c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") -}) -``` - -Issuing a HTTP redirect from POST. Refer to issue: [#444](https://github.com/gin-gonic/gin/issues/444) -```go -r.POST("/test", func(c *gin.Context) { - c.Redirect(http.StatusFound, "/foo") -}) -``` - -Issuing a Router redirect, use `HandleContext` like below. - -``` go -r.GET("/test", func(c *gin.Context) { - c.Request.URL.Path = "/test2" - r.HandleContext(c) -}) -r.GET("/test2", func(c *gin.Context) { - c.JSON(200, gin.H{"hello": "world"}) -}) -``` - - -### Custom Middleware - -```go -func Logger() gin.HandlerFunc { - return func(c *gin.Context) { - t := time.Now() - - // Set example variable - c.Set("example", "12345") - - // before request - - c.Next() - - // after request - latency := time.Since(t) - log.Print(latency) - - // access the status we are sending - status := c.Writer.Status() - log.Println(status) - } -} - -func main() { - r := gin.New() - r.Use(Logger()) - - r.GET("/test", func(c *gin.Context) { - example := c.MustGet("example").(string) - - // it would print: "12345" - log.Println(example) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Using BasicAuth() middleware - -```go -// simulate some private data -var secrets = gin.H{ - "foo": gin.H{"email": "foo@bar.com", "phone": "123433"}, - "austin": gin.H{"email": "austin@example.com", "phone": "666"}, - "lena": gin.H{"email": "lena@guapa.com", "phone": "523443"}, -} - -func main() { - r := gin.Default() - - // Group using gin.BasicAuth() middleware - // gin.Accounts is a shortcut for map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ - "foo": "bar", - "austin": "1234", - "lena": "hello2", - "manu": "4321", - })) - - // /admin/secrets endpoint - // hit "localhost:8080/admin/secrets - authorized.GET("/secrets", func(c *gin.Context) { - // get user, it was set by the BasicAuth middleware - user := c.MustGet(gin.AuthUserKey).(string) - if secret, ok := secrets[user]; ok { - c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret}) - } else { - c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("}) - } - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Goroutines inside a middleware - -When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. - -```go -func main() { - r := gin.Default() - - r.GET("/long_async", func(c *gin.Context) { - // create copy to be used inside the goroutine - cCp := c.Copy() - go func() { - // simulate a long task with time.Sleep(). 5 seconds - time.Sleep(5 * time.Second) - - // note that you are using the copied context "cCp", IMPORTANT - log.Println("Done! in path " + cCp.Request.URL.Path) - }() - }) - - r.GET("/long_sync", func(c *gin.Context) { - // simulate a long task with time.Sleep(). 5 seconds - time.Sleep(5 * time.Second) - - // since we are NOT using a goroutine, we do not have to copy the context - log.Println("Done! in path " + c.Request.URL.Path) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Custom HTTP configuration - -Use `http.ListenAndServe()` directly, like this: - -```go -func main() { - router := gin.Default() - http.ListenAndServe(":8080", router) -} -``` -or - -```go -func main() { - router := gin.Default() - - s := &http.Server{ - Addr: ":8080", - Handler: router, - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, - MaxHeaderBytes: 1 << 20, - } - s.ListenAndServe() -} -``` - -### Support Let's Encrypt - -example for 1-line LetsEncrypt HTTPS servers. - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/autotls" - "github.com/gin-gonic/gin" -) - -func main() { - r := gin.Default() - - // Ping handler - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - log.Fatal(autotls.Run(r, "example1.com", "example2.com")) -} -``` - -example for custom autocert manager. - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/autotls" - "github.com/gin-gonic/gin" - "golang.org/x/crypto/acme/autocert" -) - -func main() { - r := gin.Default() - - // Ping handler - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - m := autocert.Manager{ - Prompt: autocert.AcceptTOS, - HostPolicy: autocert.HostWhitelist("example1.com", "example2.com"), - Cache: autocert.DirCache("/var/www/.cache"), - } - - log.Fatal(autotls.RunWithManager(r, &m)) -} -``` - -### Run multiple service using Gin - -See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: - -```go -package main - -import ( - "log" - "net/http" - "time" - - "github.com/gin-gonic/gin" - "golang.org/x/sync/errgroup" -) - -var ( - g errgroup.Group -) - -func router01() http.Handler { - e := gin.New() - e.Use(gin.Recovery()) - e.GET("/", func(c *gin.Context) { - c.JSON( - http.StatusOK, - gin.H{ - "code": http.StatusOK, - "error": "Welcome server 01", - }, - ) - }) - - return e -} - -func router02() http.Handler { - e := gin.New() - e.Use(gin.Recovery()) - e.GET("/", func(c *gin.Context) { - c.JSON( - http.StatusOK, - gin.H{ - "code": http.StatusOK, - "error": "Welcome server 02", - }, - ) - }) - - return e -} - -func main() { - server01 := &http.Server{ - Addr: ":8080", - Handler: router01(), - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - } - - server02 := &http.Server{ - Addr: ":8081", - Handler: router02(), - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - } - - g.Go(func() error { - err := server01.ListenAndServe() - if err != nil && err != http.ErrServerClosed { - log.Fatal(err) - } - return err - }) - - g.Go(func() error { - err := server02.ListenAndServe() - if err != nil && err != http.ErrServerClosed { - log.Fatal(err) - } - return err - }) - - if err := g.Wait(); err != nil { - log.Fatal(err) - } -} -``` - -### Graceful shutdown or restart - -There are a few approaches you can use to perform a graceful shutdown or restart. You can make use of third-party packages specifically built for that, or you can manually do the same with the functions and methods from the built-in packages. - -#### Third-party packages - -We can use [fvbock/endless](https://github.com/fvbock/endless) to replace the default `ListenAndServe`. Refer to issue [#296](https://github.com/gin-gonic/gin/issues/296) for more details. - -```go -router := gin.Default() -router.GET("/", handler) -// [...] -endless.ListenAndServe(":4242", router) -``` - -Alternatives: - -* [manners](https://github.com/braintree/manners): A polite Go HTTP server that shuts down gracefully. -* [graceful](https://github.com/tylerb/graceful): Graceful is a Go package enabling graceful shutdown of an http.Handler server. -* [grace](https://github.com/facebookgo/grace): Graceful restart & zero downtime deploy for Go servers. - -#### Manually - -In case you are using Go 1.8 or a later version, you may not need to use those libraries. Consider using `http.Server`'s built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) method for graceful shutdowns. The example below describes its usage, and we've got more examples using gin [here](https://github.com/gin-gonic/examples/tree/master/graceful-shutdown). - -```go -// +build go1.8 - -package main - -import ( - "context" - "log" - "net/http" - "os" - "os/signal" - "syscall" - "time" - - "github.com/gin-gonic/gin" -) - -func main() { - router := gin.Default() - router.GET("/", func(c *gin.Context) { - time.Sleep(5 * time.Second) - c.String(http.StatusOK, "Welcome Gin Server") - }) - - srv := &http.Server{ - Addr: ":8080", - Handler: router, - } - - // Initializing the server in a goroutine so that - // it won't block the graceful shutdown handling below - go func() { - if err := srv.ListenAndServe(); err != nil && errors.Is(err, http.ErrServerClosed) { - log.Printf("listen: %s\n", err) - } - }() - - // Wait for interrupt signal to gracefully shutdown the server with - // a timeout of 5 seconds. - quit := make(chan os.Signal) - // kill (no param) default send syscall.SIGTERM - // kill -2 is syscall.SIGINT - // kill -9 is syscall.SIGKILL but can't be catch, so don't need add it - signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) - <-quit - log.Println("Shutting down server...") - - // The context is used to inform the server it has 5 seconds to finish - // the request it is currently handling - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - if err := srv.Shutdown(ctx); err != nil { - log.Fatal("Server forced to shutdown:", err) - } - - log.Println("Server exiting") -} -``` - -### Build a single binary with templates - -You can build a server into a single binary containing templates by using [go-assets][]. - -[go-assets]: https://github.com/jessevdk/go-assets - -```go -func main() { - r := gin.New() - - t, err := loadTemplate() - if err != nil { - panic(err) - } - r.SetHTMLTemplate(t) - - r.GET("/", func(c *gin.Context) { - c.HTML(http.StatusOK, "/html/index.tmpl",nil) - }) - r.Run(":8080") -} - -// loadTemplate loads templates embedded by go-assets-builder -func loadTemplate() (*template.Template, error) { - t := template.New("") - for name, file := range Assets.Files { - defer file.Close() - if file.IsDir() || !strings.HasSuffix(name, ".tmpl") { - continue - } - h, err := ioutil.ReadAll(file) - if err != nil { - return nil, err - } - t, err = t.New(name).Parse(string(h)) - if err != nil { - return nil, err - } - } - return t, nil -} -``` - -See a complete example in the `https://github.com/gin-gonic/examples/tree/master/assets-in-binary` directory. - -### Bind form-data request with custom struct - -The follow example using custom struct: - -```go -type StructA struct { - FieldA string `form:"field_a"` -} - -type StructB struct { - NestedStruct StructA - FieldB string `form:"field_b"` -} - -type StructC struct { - NestedStructPointer *StructA - FieldC string `form:"field_c"` -} - -type StructD struct { - NestedAnonyStruct struct { - FieldX string `form:"field_x"` - } - FieldD string `form:"field_d"` -} - -func GetDataB(c *gin.Context) { - var b StructB - c.Bind(&b) - c.JSON(200, gin.H{ - "a": b.NestedStruct, - "b": b.FieldB, - }) -} - -func GetDataC(c *gin.Context) { - var b StructC - c.Bind(&b) - c.JSON(200, gin.H{ - "a": b.NestedStructPointer, - "c": b.FieldC, - }) -} - -func GetDataD(c *gin.Context) { - var b StructD - c.Bind(&b) - c.JSON(200, gin.H{ - "x": b.NestedAnonyStruct, - "d": b.FieldD, - }) -} - -func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) - - r.Run() -} -``` - -Using the command `curl` command result: - -``` -$ curl "http://localhost:8080/getb?field_a=hello&field_b=world" -{"a":{"FieldA":"hello"},"b":"world"} -$ curl "http://localhost:8080/getc?field_a=hello&field_c=world" -{"a":{"FieldA":"hello"},"c":"world"} -$ curl "http://localhost:8080/getd?field_x=hello&field_d=world" -{"d":"world","x":{"FieldX":"hello"}} -``` - -### Try to bind body into different structs - -The normal methods for binding request body consumes `c.Request.Body` and they -cannot be called multiple times. - -```go -type formA struct { - Foo string `json:"foo" xml:"foo" binding:"required"` -} - -type formB struct { - Bar string `json:"bar" xml:"bar" binding:"required"` -} - -func SomeHandler(c *gin.Context) { - objA := formA{} - objB := formB{} - // This c.ShouldBind consumes c.Request.Body and it cannot be reused. - if errA := c.ShouldBind(&objA); errA == nil { - c.String(http.StatusOK, `the body should be formA`) - // Always an error is occurred by this because c.Request.Body is EOF now. - } else if errB := c.ShouldBind(&objB); errB == nil { - c.String(http.StatusOK, `the body should be formB`) - } else { - ... - } -} -``` - -For this, you can use `c.ShouldBindBodyWith`. - -```go -func SomeHandler(c *gin.Context) { - objA := formA{} - objB := formB{} - // This reads c.Request.Body and stores the result into the context. - if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil { - c.String(http.StatusOK, `the body should be formA`) - // At this time, it reuses body stored in the context. - } else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil { - c.String(http.StatusOK, `the body should be formB JSON`) - // And it can accepts other formats - } else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil { - c.String(http.StatusOK, `the body should be formB XML`) - } else { - ... - } -} -``` - -* `c.ShouldBindBodyWith` stores body into the context before binding. This has -a slight impact to performance, so you should not use this method if you are -enough to call binding at once. -* This feature is only needed for some formats -- `JSON`, `XML`, `MsgPack`, -`ProtoBuf`. For other formats, `Query`, `Form`, `FormPost`, `FormMultipart`, -can be called by `c.ShouldBind()` multiple times without any damage to -performance (See [#1341](https://github.com/gin-gonic/gin/pull/1341)). - -### http2 server push - -http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. - -```go -package main - -import ( - "html/template" - "log" - - "github.com/gin-gonic/gin" -) - -var html = template.Must(template.New("https").Parse(` - - - Https Test - - - -

Welcome, Ginner!

- - -`)) - -func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) - - r.GET("/", func(c *gin.Context) { - if pusher := c.Writer.Pusher(); pusher != nil { - // use pusher.Push() to do server push - if err := pusher.Push("/assets/app.js", nil); err != nil { - log.Printf("Failed to push: %v", err) - } - } - c.HTML(200, "https", gin.H{ - "status": "success", - }) - }) - - // Listen and Server in https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") -} -``` - -### Define format for the log of routes - -The default log of routes is: -``` -[GIN-debug] POST /foo --> main.main.func1 (3 handlers) -[GIN-debug] GET /bar --> main.main.func2 (3 handlers) -[GIN-debug] GET /status --> main.main.func3 (3 handlers) -``` - -If you want to log this information in given format (e.g. JSON, key values or something else), then you can define this format with `gin.DebugPrintRouteFunc`. -In the example below, we log all routes with standard log package but you can use another log tools that suits of your needs. -```go -import ( - "log" - "net/http" - - "github.com/gin-gonic/gin" -) - -func main() { - r := gin.Default() - gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { - log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) - } - - r.POST("/foo", func(c *gin.Context) { - c.JSON(http.StatusOK, "foo") - }) - - r.GET("/bar", func(c *gin.Context) { - c.JSON(http.StatusOK, "bar") - }) - - r.GET("/status", func(c *gin.Context) { - c.JSON(http.StatusOK, "ok") - }) - - // Listen and Server in http://0.0.0.0:8080 - r.Run() -} -``` - -### Set and get a cookie - -```go -import ( - "fmt" - - "github.com/gin-gonic/gin" -) - -func main() { - - router := gin.Default() - - router.GET("/cookie", func(c *gin.Context) { - - cookie, err := c.Cookie("gin_cookie") - - if err != nil { - cookie = "NotSet" - c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", false, true) - } - - fmt.Printf("Cookie value: %s \n", cookie) - }) - - router.Run() -} -``` - -## Don't trust all proxies - -Gin lets you specify which headers to hold the real client IP (if any), -as well as specifying which proxies (or direct clients) you trust to -specify one of these headers. - -The `TrustedProxies` slice on your `gin.Engine` specifes network addresses or -network CIDRs from where clients which their request headers related to client -IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or -IPv6 CIDRs. - -```go -import ( - "fmt" - - "github.com/gin-gonic/gin" -) - -func main() { - - router := gin.Default() - router.TrustedProxies = []string{"192.168.1.2"} - - router.GET("/", func(c *gin.Context) { - // If the client is 192.168.1.2, use the X-Forwarded-For - // header to deduce the original client IP from the trust- - // worthy parts of that header. - // Otherwise, simply return the direct client IP - fmt.Printf("ClientIP: %s\n", c.ClientIP()) - }) - router.Run() -} -``` - -## Testing - -The `net/http/httptest` package is preferable way for HTTP testing. - -```go -package main - -func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - return r -} - -func main() { - r := setupRouter() - r.Run(":8080") -} -``` - -Test for code example above: - -```go -package main - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestPingRoute(t *testing.T) { - router := setupRouter() - - w := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "/ping", nil) - router.ServeHTTP(w, req) - - assert.Equal(t, 200, w.Code) - assert.Equal(t, "pong", w.Body.String()) -} -``` - -## Users - -Awesome project lists using [Gin](https://github.com/gin-gonic/gin) web framework. - -* [gorush](https://github.com/appleboy/gorush): A push notification server written in Go. -* [fnproject](https://github.com/fnproject/fn): The container native, cloud agnostic serverless platform. -* [photoprism](https://github.com/photoprism/photoprism): Personal photo management powered by Go and Google TensorFlow. -* [krakend](https://github.com/devopsfaith/krakend): Ultra performant API Gateway with middlewares. -* [picfit](https://github.com/thoas/picfit): An image resizing server written in Go. -* [brigade](https://github.com/brigadecore/brigade): Event-based Scripting for Kubernetes. -* [dkron](https://github.com/distribworks/dkron): Distributed, fault tolerant job scheduling system. diff --git a/vendor/github.com/gin-gonic/gin/auth.go b/vendor/github.com/gin-gonic/gin/auth.go deleted file mode 100644 index 4d8a6ce..0000000 --- a/vendor/github.com/gin-gonic/gin/auth.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "crypto/subtle" - "encoding/base64" - "net/http" - "strconv" - - "github.com/gin-gonic/gin/internal/bytesconv" -) - -// AuthUserKey is the cookie name for user credential in basic auth. -const AuthUserKey = "user" - -// Accounts defines a key/value for user/pass list of authorized logins. -type Accounts map[string]string - -type authPair struct { - value string - user string -} - -type authPairs []authPair - -func (a authPairs) searchCredential(authValue string) (string, bool) { - if authValue == "" { - return "", false - } - for _, pair := range a { - if subtle.ConstantTimeCompare([]byte(pair.value), []byte(authValue)) == 1 { - return pair.user, true - } - } - return "", false -} - -// BasicAuthForRealm returns a Basic HTTP Authorization middleware. It takes as arguments a map[string]string where -// the key is the user name and the value is the password, as well as the name of the Realm. -// If the realm is empty, "Authorization Required" will be used by default. -// (see http://tools.ietf.org/html/rfc2617#section-1.2) -func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc { - if realm == "" { - realm = "Authorization Required" - } - realm = "Basic realm=" + strconv.Quote(realm) - pairs := processAccounts(accounts) - return func(c *Context) { - // Search user in the slice of allowed credentials - user, found := pairs.searchCredential(c.requestHeader("Authorization")) - if !found { - // Credentials doesn't match, we return 401 and abort handlers chain. - c.Header("WWW-Authenticate", realm) - c.AbortWithStatus(http.StatusUnauthorized) - return - } - - // The user credentials was found, set user's id to key AuthUserKey in this context, the user's id can be read later using - // c.MustGet(gin.AuthUserKey). - c.Set(AuthUserKey, user) - } -} - -// BasicAuth returns a Basic HTTP Authorization middleware. It takes as argument a map[string]string where -// the key is the user name and the value is the password. -func BasicAuth(accounts Accounts) HandlerFunc { - return BasicAuthForRealm(accounts, "") -} - -func processAccounts(accounts Accounts) authPairs { - length := len(accounts) - assert1(length > 0, "Empty list of authorized credentials") - pairs := make(authPairs, 0, length) - for user, password := range accounts { - assert1(user != "", "User can not be empty") - value := authorizationHeader(user, password) - pairs = append(pairs, authPair{ - value: value, - user: user, - }) - } - return pairs -} - -func authorizationHeader(user, password string) string { - base := user + ":" + password - return "Basic " + base64.StdEncoding.EncodeToString(bytesconv.StringToBytes(base)) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/binding.go b/vendor/github.com/gin-gonic/gin/binding/binding.go deleted file mode 100644 index 5caeb58..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/binding.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -//go:build !nomsgpack -// +build !nomsgpack - -package binding - -import "net/http" - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = "application/json" - MIMEHTML = "text/html" - MIMEXML = "application/xml" - MIMEXML2 = "text/xml" - MIMEPlain = "text/plain" - MIMEPOSTForm = "application/x-www-form-urlencoded" - MIMEMultipartPOSTForm = "multipart/form-data" - MIMEPROTOBUF = "application/x-protobuf" - MIMEMSGPACK = "application/x-msgpack" - MIMEMSGPACK2 = "application/msgpack" - MIMEYAML = "application/x-yaml" -) - -// Binding describes the interface which needs to be implemented for binding the -// data present in the request such as JSON request body, query parameters or -// the form POST. -type Binding interface { - Name() string - Bind(*http.Request, interface{}) error -} - -// BindingBody adds BindBody method to Binding. BindBody is similar with Bind, -// but it reads the body from supplied bytes instead of req.Body. -type BindingBody interface { - Binding - BindBody([]byte, interface{}) error -} - -// BindingUri adds BindUri method to Binding. BindUri is similar with Bind, -// but it read the Params. -type BindingUri interface { - Name() string - BindUri(map[string][]string, interface{}) error -} - -// StructValidator is the minimal interface which needs to be implemented in -// order for it to be used as the validator engine for ensuring the correctness -// of the request. Gin provides a default implementation for this using -// https://github.com/go-playground/validator/tree/v8.18.2. -type StructValidator interface { - // ValidateStruct can receive any kind of type and it should never panic, even if the configuration is not right. - // If the received type is a slice|array, the validation should be performed travel on every element. - // If the received type is not a struct or slice|array, any validation should be skipped and nil must be returned. - // If the received type is a struct or pointer to a struct, the validation should be performed. - // If the struct is not valid or the validation itself fails, a descriptive error should be returned. - // Otherwise nil must be returned. - ValidateStruct(interface{}) error - - // Engine returns the underlying validator engine which powers the - // StructValidator implementation. - Engine() interface{} -} - -// Validator is the default validator which implements the StructValidator -// interface. It uses https://github.com/go-playground/validator/tree/v8.18.2 -// under the hood. -var Validator StructValidator = &defaultValidator{} - -// These implement the Binding interface and can be used to bind the data -// present in the request to struct instances. -var ( - JSON = jsonBinding{} - XML = xmlBinding{} - Form = formBinding{} - Query = queryBinding{} - FormPost = formPostBinding{} - FormMultipart = formMultipartBinding{} - ProtoBuf = protobufBinding{} - MsgPack = msgpackBinding{} - YAML = yamlBinding{} - Uri = uriBinding{} - Header = headerBinding{} -) - -// Default returns the appropriate Binding instance based on the HTTP method -// and the content type. -func Default(method, contentType string) Binding { - if method == http.MethodGet { - return Form - } - - switch contentType { - case MIMEJSON: - return JSON - case MIMEXML, MIMEXML2: - return XML - case MIMEPROTOBUF: - return ProtoBuf - case MIMEMSGPACK, MIMEMSGPACK2: - return MsgPack - case MIMEYAML: - return YAML - case MIMEMultipartPOSTForm: - return FormMultipart - default: // case MIMEPOSTForm: - return Form - } -} - -func validate(obj interface{}) error { - if Validator == nil { - return nil - } - return Validator.ValidateStruct(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go b/vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go deleted file mode 100644 index 9afa3dc..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2020 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -//go:build nomsgpack -// +build nomsgpack - -package binding - -import "net/http" - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = "application/json" - MIMEHTML = "text/html" - MIMEXML = "application/xml" - MIMEXML2 = "text/xml" - MIMEPlain = "text/plain" - MIMEPOSTForm = "application/x-www-form-urlencoded" - MIMEMultipartPOSTForm = "multipart/form-data" - MIMEPROTOBUF = "application/x-protobuf" - MIMEYAML = "application/x-yaml" -) - -// Binding describes the interface which needs to be implemented for binding the -// data present in the request such as JSON request body, query parameters or -// the form POST. -type Binding interface { - Name() string - Bind(*http.Request, interface{}) error -} - -// BindingBody adds BindBody method to Binding. BindBody is similar with Bind, -// but it reads the body from supplied bytes instead of req.Body. -type BindingBody interface { - Binding - BindBody([]byte, interface{}) error -} - -// BindingUri adds BindUri method to Binding. BindUri is similar with Bind, -// but it read the Params. -type BindingUri interface { - Name() string - BindUri(map[string][]string, interface{}) error -} - -// StructValidator is the minimal interface which needs to be implemented in -// order for it to be used as the validator engine for ensuring the correctness -// of the request. Gin provides a default implementation for this using -// https://github.com/go-playground/validator/tree/v8.18.2. -type StructValidator interface { - // ValidateStruct can receive any kind of type and it should never panic, even if the configuration is not right. - // If the received type is not a struct, any validation should be skipped and nil must be returned. - // If the received type is a struct or pointer to a struct, the validation should be performed. - // If the struct is not valid or the validation itself fails, a descriptive error should be returned. - // Otherwise nil must be returned. - ValidateStruct(interface{}) error - - // Engine returns the underlying validator engine which powers the - // StructValidator implementation. - Engine() interface{} -} - -// Validator is the default validator which implements the StructValidator -// interface. It uses https://github.com/go-playground/validator/tree/v8.18.2 -// under the hood. -var Validator StructValidator = &defaultValidator{} - -// These implement the Binding interface and can be used to bind the data -// present in the request to struct instances. -var ( - JSON = jsonBinding{} - XML = xmlBinding{} - Form = formBinding{} - Query = queryBinding{} - FormPost = formPostBinding{} - FormMultipart = formMultipartBinding{} - ProtoBuf = protobufBinding{} - YAML = yamlBinding{} - Uri = uriBinding{} - Header = headerBinding{} -) - -// Default returns the appropriate Binding instance based on the HTTP method -// and the content type. -func Default(method, contentType string) Binding { - if method == "GET" { - return Form - } - - switch contentType { - case MIMEJSON: - return JSON - case MIMEXML, MIMEXML2: - return XML - case MIMEPROTOBUF: - return ProtoBuf - case MIMEYAML: - return YAML - case MIMEMultipartPOSTForm: - return FormMultipart - default: // case MIMEPOSTForm: - return Form - } -} - -func validate(obj interface{}) error { - if Validator == nil { - return nil - } - return Validator.ValidateStruct(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/default_validator.go b/vendor/github.com/gin-gonic/gin/binding/default_validator.go deleted file mode 100644 index c57a120..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/default_validator.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "fmt" - "reflect" - "strings" - "sync" - - "github.com/go-playground/validator/v10" -) - -type defaultValidator struct { - once sync.Once - validate *validator.Validate -} - -type sliceValidateError []error - -func (err sliceValidateError) Error() string { - var errMsgs []string - for i, e := range err { - if e == nil { - continue - } - errMsgs = append(errMsgs, fmt.Sprintf("[%d]: %s", i, e.Error())) - } - return strings.Join(errMsgs, "\n") -} - -var _ StructValidator = &defaultValidator{} - -// ValidateStruct receives any kind of type, but only performed struct or pointer to struct type. -func (v *defaultValidator) ValidateStruct(obj interface{}) error { - if obj == nil { - return nil - } - - value := reflect.ValueOf(obj) - switch value.Kind() { - case reflect.Ptr: - return v.ValidateStruct(value.Elem().Interface()) - case reflect.Struct: - return v.validateStruct(obj) - case reflect.Slice, reflect.Array: - count := value.Len() - validateRet := make(sliceValidateError, 0) - for i := 0; i < count; i++ { - if err := v.ValidateStruct(value.Index(i).Interface()); err != nil { - validateRet = append(validateRet, err) - } - } - if len(validateRet) == 0 { - return nil - } - return validateRet - default: - return nil - } -} - -// validateStruct receives struct type -func (v *defaultValidator) validateStruct(obj interface{}) error { - v.lazyinit() - return v.validate.Struct(obj) -} - -// Engine returns the underlying validator engine which powers the default -// Validator instance. This is useful if you want to register custom validations -// or struct level validations. See validator GoDoc for more info - -// https://godoc.org/gopkg.in/go-playground/validator.v8 -func (v *defaultValidator) Engine() interface{} { - v.lazyinit() - return v.validate -} - -func (v *defaultValidator) lazyinit() { - v.once.Do(func() { - v.validate = validator.New() - v.validate.SetTagName("binding") - }) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/form.go b/vendor/github.com/gin-gonic/gin/binding/form.go deleted file mode 100644 index b93c34c..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/form.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "net/http" -) - -const defaultMemory = 32 << 20 - -type formBinding struct{} -type formPostBinding struct{} -type formMultipartBinding struct{} - -func (formBinding) Name() string { - return "form" -} - -func (formBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseForm(); err != nil { - return err - } - if err := req.ParseMultipartForm(defaultMemory); err != nil { - if err != http.ErrNotMultipart { - return err - } - } - if err := mapForm(obj, req.Form); err != nil { - return err - } - return validate(obj) -} - -func (formPostBinding) Name() string { - return "form-urlencoded" -} - -func (formPostBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseForm(); err != nil { - return err - } - if err := mapForm(obj, req.PostForm); err != nil { - return err - } - return validate(obj) -} - -func (formMultipartBinding) Name() string { - return "multipart/form-data" -} - -func (formMultipartBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseMultipartForm(defaultMemory); err != nil { - return err - } - if err := mappingByPtr(obj, (*multipartRequest)(req), "form"); err != nil { - return err - } - - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go b/vendor/github.com/gin-gonic/gin/binding/form_mapping.go deleted file mode 100644 index 2f4e45b..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "time" - - "github.com/gin-gonic/gin/internal/bytesconv" - "github.com/gin-gonic/gin/internal/json" -) - -var errUnknownType = errors.New("unknown type") - -func mapUri(ptr interface{}, m map[string][]string) error { - return mapFormByTag(ptr, m, "uri") -} - -func mapForm(ptr interface{}, form map[string][]string) error { - return mapFormByTag(ptr, form, "form") -} - -var emptyField = reflect.StructField{} - -func mapFormByTag(ptr interface{}, form map[string][]string, tag string) error { - // Check if ptr is a map - ptrVal := reflect.ValueOf(ptr) - var pointed interface{} - if ptrVal.Kind() == reflect.Ptr { - ptrVal = ptrVal.Elem() - pointed = ptrVal.Interface() - } - if ptrVal.Kind() == reflect.Map && - ptrVal.Type().Key().Kind() == reflect.String { - if pointed != nil { - ptr = pointed - } - return setFormMap(ptr, form) - } - - return mappingByPtr(ptr, formSource(form), tag) -} - -// setter tries to set value on a walking by fields of a struct -type setter interface { - TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) -} - -type formSource map[string][]string - -var _ setter = formSource(nil) - -// TrySet tries to set a value by request's form source (like map[string][]string) -func (form formSource) TrySet(value reflect.Value, field reflect.StructField, tagValue string, opt setOptions) (isSetted bool, err error) { - return setByForm(value, field, form, tagValue, opt) -} - -func mappingByPtr(ptr interface{}, setter setter, tag string) error { - _, err := mapping(reflect.ValueOf(ptr), emptyField, setter, tag) - return err -} - -func mapping(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) { - if field.Tag.Get(tag) == "-" { // just ignoring this field - return false, nil - } - - var vKind = value.Kind() - - if vKind == reflect.Ptr { - var isNew bool - vPtr := value - if value.IsNil() { - isNew = true - vPtr = reflect.New(value.Type().Elem()) - } - isSetted, err := mapping(vPtr.Elem(), field, setter, tag) - if err != nil { - return false, err - } - if isNew && isSetted { - value.Set(vPtr) - } - return isSetted, nil - } - - if vKind != reflect.Struct || !field.Anonymous { - ok, err := tryToSetValue(value, field, setter, tag) - if err != nil { - return false, err - } - if ok { - return true, nil - } - } - - if vKind == reflect.Struct { - tValue := value.Type() - - var isSetted bool - for i := 0; i < value.NumField(); i++ { - sf := tValue.Field(i) - if sf.PkgPath != "" && !sf.Anonymous { // unexported - continue - } - ok, err := mapping(value.Field(i), tValue.Field(i), setter, tag) - if err != nil { - return false, err - } - isSetted = isSetted || ok - } - return isSetted, nil - } - return false, nil -} - -type setOptions struct { - isDefaultExists bool - defaultValue string -} - -func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) { - var tagValue string - var setOpt setOptions - - tagValue = field.Tag.Get(tag) - tagValue, opts := head(tagValue, ",") - - if tagValue == "" { // default value is FieldName - tagValue = field.Name - } - if tagValue == "" { // when field is "emptyField" variable - return false, nil - } - - var opt string - for len(opts) > 0 { - opt, opts = head(opts, ",") - - if k, v := head(opt, "="); k == "default" { - setOpt.isDefaultExists = true - setOpt.defaultValue = v - } - } - - return setter.TrySet(value, field, tagValue, setOpt) -} - -func setByForm(value reflect.Value, field reflect.StructField, form map[string][]string, tagValue string, opt setOptions) (isSetted bool, err error) { - vs, ok := form[tagValue] - if !ok && !opt.isDefaultExists { - return false, nil - } - - switch value.Kind() { - case reflect.Slice: - if !ok { - vs = []string{opt.defaultValue} - } - return true, setSlice(vs, value, field) - case reflect.Array: - if !ok { - vs = []string{opt.defaultValue} - } - if len(vs) != value.Len() { - return false, fmt.Errorf("%q is not valid value for %s", vs, value.Type().String()) - } - return true, setArray(vs, value, field) - default: - var val string - if !ok { - val = opt.defaultValue - } - - if len(vs) > 0 { - val = vs[0] - } - return true, setWithProperType(val, value, field) - } -} - -func setWithProperType(val string, value reflect.Value, field reflect.StructField) error { - switch value.Kind() { - case reflect.Int: - return setIntField(val, 0, value) - case reflect.Int8: - return setIntField(val, 8, value) - case reflect.Int16: - return setIntField(val, 16, value) - case reflect.Int32: - return setIntField(val, 32, value) - case reflect.Int64: - switch value.Interface().(type) { - case time.Duration: - return setTimeDuration(val, value, field) - } - return setIntField(val, 64, value) - case reflect.Uint: - return setUintField(val, 0, value) - case reflect.Uint8: - return setUintField(val, 8, value) - case reflect.Uint16: - return setUintField(val, 16, value) - case reflect.Uint32: - return setUintField(val, 32, value) - case reflect.Uint64: - return setUintField(val, 64, value) - case reflect.Bool: - return setBoolField(val, value) - case reflect.Float32: - return setFloatField(val, 32, value) - case reflect.Float64: - return setFloatField(val, 64, value) - case reflect.String: - value.SetString(val) - case reflect.Struct: - switch value.Interface().(type) { - case time.Time: - return setTimeField(val, field, value) - } - return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) - case reflect.Map: - return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) - default: - return errUnknownType - } - return nil -} - -func setIntField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0" - } - intVal, err := strconv.ParseInt(val, 10, bitSize) - if err == nil { - field.SetInt(intVal) - } - return err -} - -func setUintField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0" - } - uintVal, err := strconv.ParseUint(val, 10, bitSize) - if err == nil { - field.SetUint(uintVal) - } - return err -} - -func setBoolField(val string, field reflect.Value) error { - if val == "" { - val = "false" - } - boolVal, err := strconv.ParseBool(val) - if err == nil { - field.SetBool(boolVal) - } - return err -} - -func setFloatField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0.0" - } - floatVal, err := strconv.ParseFloat(val, bitSize) - if err == nil { - field.SetFloat(floatVal) - } - return err -} - -func setTimeField(val string, structField reflect.StructField, value reflect.Value) error { - timeFormat := structField.Tag.Get("time_format") - if timeFormat == "" { - timeFormat = time.RFC3339 - } - - switch tf := strings.ToLower(timeFormat); tf { - case "unix", "unixnano": - tv, err := strconv.ParseInt(val, 10, 64) - if err != nil { - return err - } - - d := time.Duration(1) - if tf == "unixnano" { - d = time.Second - } - - t := time.Unix(tv/int64(d), tv%int64(d)) - value.Set(reflect.ValueOf(t)) - return nil - - } - - if val == "" { - value.Set(reflect.ValueOf(time.Time{})) - return nil - } - - l := time.Local - if isUTC, _ := strconv.ParseBool(structField.Tag.Get("time_utc")); isUTC { - l = time.UTC - } - - if locTag := structField.Tag.Get("time_location"); locTag != "" { - loc, err := time.LoadLocation(locTag) - if err != nil { - return err - } - l = loc - } - - t, err := time.ParseInLocation(timeFormat, val, l) - if err != nil { - return err - } - - value.Set(reflect.ValueOf(t)) - return nil -} - -func setArray(vals []string, value reflect.Value, field reflect.StructField) error { - for i, s := range vals { - err := setWithProperType(s, value.Index(i), field) - if err != nil { - return err - } - } - return nil -} - -func setSlice(vals []string, value reflect.Value, field reflect.StructField) error { - slice := reflect.MakeSlice(value.Type(), len(vals), len(vals)) - err := setArray(vals, slice, field) - if err != nil { - return err - } - value.Set(slice) - return nil -} - -func setTimeDuration(val string, value reflect.Value, field reflect.StructField) error { - d, err := time.ParseDuration(val) - if err != nil { - return err - } - value.Set(reflect.ValueOf(d)) - return nil -} - -func head(str, sep string) (head string, tail string) { - idx := strings.Index(str, sep) - if idx < 0 { - return str, "" - } - return str[:idx], str[idx+len(sep):] -} - -func setFormMap(ptr interface{}, form map[string][]string) error { - el := reflect.TypeOf(ptr).Elem() - - if el.Kind() == reflect.Slice { - ptrMap, ok := ptr.(map[string][]string) - if !ok { - return errors.New("cannot convert to map slices of strings") - } - for k, v := range form { - ptrMap[k] = v - } - - return nil - } - - ptrMap, ok := ptr.(map[string]string) - if !ok { - return errors.New("cannot convert to map of strings") - } - for k, v := range form { - ptrMap[k] = v[len(v)-1] // pick last - } - - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/binding/header.go b/vendor/github.com/gin-gonic/gin/binding/header.go deleted file mode 100644 index 179ce4e..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/header.go +++ /dev/null @@ -1,34 +0,0 @@ -package binding - -import ( - "net/http" - "net/textproto" - "reflect" -) - -type headerBinding struct{} - -func (headerBinding) Name() string { - return "header" -} - -func (headerBinding) Bind(req *http.Request, obj interface{}) error { - - if err := mapHeader(obj, req.Header); err != nil { - return err - } - - return validate(obj) -} - -func mapHeader(ptr interface{}, h map[string][]string) error { - return mappingByPtr(ptr, headerSource(h), "header") -} - -type headerSource map[string][]string - -var _ setter = headerSource(nil) - -func (hs headerSource) TrySet(value reflect.Value, field reflect.StructField, tagValue string, opt setOptions) (isSetted bool, err error) { - return setByForm(value, field, hs, textproto.CanonicalMIMEHeaderKey(tagValue), opt) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/json.go b/vendor/github.com/gin-gonic/gin/binding/json.go deleted file mode 100644 index d62e070..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/json.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "fmt" - "io" - "net/http" - - "github.com/gin-gonic/gin/internal/json" -) - -// EnableDecoderUseNumber is used to call the UseNumber method on the JSON -// Decoder instance. UseNumber causes the Decoder to unmarshal a number into an -// interface{} as a Number instead of as a float64. -var EnableDecoderUseNumber = false - -// EnableDecoderDisallowUnknownFields is used to call the DisallowUnknownFields method -// on the JSON Decoder instance. DisallowUnknownFields causes the Decoder to -// return an error when the destination is a struct and the input contains object -// keys which do not match any non-ignored, exported fields in the destination. -var EnableDecoderDisallowUnknownFields = false - -type jsonBinding struct{} - -func (jsonBinding) Name() string { - return "json" -} - -func (jsonBinding) Bind(req *http.Request, obj interface{}) error { - if req == nil || req.Body == nil { - return fmt.Errorf("invalid request") - } - return decodeJSON(req.Body, obj) -} - -func (jsonBinding) BindBody(body []byte, obj interface{}) error { - return decodeJSON(bytes.NewReader(body), obj) -} - -func decodeJSON(r io.Reader, obj interface{}) error { - decoder := json.NewDecoder(r) - if EnableDecoderUseNumber { - decoder.UseNumber() - } - if EnableDecoderDisallowUnknownFields { - decoder.DisallowUnknownFields() - } - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/msgpack.go b/vendor/github.com/gin-gonic/gin/binding/msgpack.go deleted file mode 100644 index 2a44299..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/msgpack.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -//go:build !nomsgpack -// +build !nomsgpack - -package binding - -import ( - "bytes" - "io" - "net/http" - - "github.com/ugorji/go/codec" -) - -type msgpackBinding struct{} - -func (msgpackBinding) Name() string { - return "msgpack" -} - -func (msgpackBinding) Bind(req *http.Request, obj interface{}) error { - return decodeMsgPack(req.Body, obj) -} - -func (msgpackBinding) BindBody(body []byte, obj interface{}) error { - return decodeMsgPack(bytes.NewReader(body), obj) -} - -func decodeMsgPack(r io.Reader, obj interface{}) error { - cdc := new(codec.MsgpackHandle) - if err := codec.NewDecoder(r, cdc).Decode(&obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go b/vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go deleted file mode 100644 index f85a1aa..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "errors" - "mime/multipart" - "net/http" - "reflect" -) - -type multipartRequest http.Request - -var _ setter = (*multipartRequest)(nil) - -// TrySet tries to set a value by the multipart request with the binding a form file -func (r *multipartRequest) TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) { - if files := r.MultipartForm.File[key]; len(files) != 0 { - return setByMultipartFormFile(value, field, files) - } - - return setByForm(value, field, r.MultipartForm.Value, key, opt) -} - -func setByMultipartFormFile(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) { - switch value.Kind() { - case reflect.Ptr: - switch value.Interface().(type) { - case *multipart.FileHeader: - value.Set(reflect.ValueOf(files[0])) - return true, nil - } - case reflect.Struct: - switch value.Interface().(type) { - case multipart.FileHeader: - value.Set(reflect.ValueOf(*files[0])) - return true, nil - } - case reflect.Slice: - slice := reflect.MakeSlice(value.Type(), len(files), len(files)) - isSetted, err = setArrayOfMultipartFormFiles(slice, field, files) - if err != nil || !isSetted { - return isSetted, err - } - value.Set(slice) - return true, nil - case reflect.Array: - return setArrayOfMultipartFormFiles(value, field, files) - } - return false, errors.New("unsupported field type for multipart.FileHeader") -} - -func setArrayOfMultipartFormFiles(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) { - if value.Len() != len(files) { - return false, errors.New("unsupported len of array for []*multipart.FileHeader") - } - for i := range files { - setted, err := setByMultipartFormFile(value.Index(i), field, files[i:i+1]) - if err != nil || !setted { - return setted, err - } - } - return true, nil -} diff --git a/vendor/github.com/gin-gonic/gin/binding/protobuf.go b/vendor/github.com/gin-gonic/gin/binding/protobuf.go deleted file mode 100644 index f9ece92..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/protobuf.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "io/ioutil" - "net/http" - - "github.com/golang/protobuf/proto" -) - -type protobufBinding struct{} - -func (protobufBinding) Name() string { - return "protobuf" -} - -func (b protobufBinding) Bind(req *http.Request, obj interface{}) error { - buf, err := ioutil.ReadAll(req.Body) - if err != nil { - return err - } - return b.BindBody(buf, obj) -} - -func (protobufBinding) BindBody(body []byte, obj interface{}) error { - if err := proto.Unmarshal(body, obj.(proto.Message)); err != nil { - return err - } - // Here it's same to return validate(obj), but util now we can't add - // `binding:""` to the struct which automatically generate by gen-proto - return nil - // return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/query.go b/vendor/github.com/gin-gonic/gin/binding/query.go deleted file mode 100644 index 219743f..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/query.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import "net/http" - -type queryBinding struct{} - -func (queryBinding) Name() string { - return "query" -} - -func (queryBinding) Bind(req *http.Request, obj interface{}) error { - values := req.URL.Query() - if err := mapForm(obj, values); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/uri.go b/vendor/github.com/gin-gonic/gin/binding/uri.go deleted file mode 100644 index f91ec38..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/uri.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -type uriBinding struct{} - -func (uriBinding) Name() string { - return "uri" -} - -func (uriBinding) BindUri(m map[string][]string, obj interface{}) error { - if err := mapUri(obj, m); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/xml.go b/vendor/github.com/gin-gonic/gin/binding/xml.go deleted file mode 100644 index 4e90114..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/xml.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "encoding/xml" - "io" - "net/http" -) - -type xmlBinding struct{} - -func (xmlBinding) Name() string { - return "xml" -} - -func (xmlBinding) Bind(req *http.Request, obj interface{}) error { - return decodeXML(req.Body, obj) -} - -func (xmlBinding) BindBody(body []byte, obj interface{}) error { - return decodeXML(bytes.NewReader(body), obj) -} -func decodeXML(r io.Reader, obj interface{}) error { - decoder := xml.NewDecoder(r) - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/yaml.go b/vendor/github.com/gin-gonic/gin/binding/yaml.go deleted file mode 100644 index a2d36d6..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/yaml.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "io" - "net/http" - - "gopkg.in/yaml.v2" -) - -type yamlBinding struct{} - -func (yamlBinding) Name() string { - return "yaml" -} - -func (yamlBinding) Bind(req *http.Request, obj interface{}) error { - return decodeYAML(req.Body, obj) -} - -func (yamlBinding) BindBody(body []byte, obj interface{}) error { - return decodeYAML(bytes.NewReader(body), obj) -} - -func decodeYAML(r io.Reader, obj interface{}) error { - decoder := yaml.NewDecoder(r) - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/codecov.yml b/vendor/github.com/gin-gonic/gin/codecov.yml deleted file mode 100644 index c9c9a52..0000000 --- a/vendor/github.com/gin-gonic/gin/codecov.yml +++ /dev/null @@ -1,5 +0,0 @@ -coverage: - notify: - gitter: - default: - url: https://webhooks.gitter.im/e/d90dcdeeab2f1e357165 diff --git a/vendor/github.com/gin-gonic/gin/context.go b/vendor/github.com/gin-gonic/gin/context.go deleted file mode 100644 index 1ba0fa2..0000000 --- a/vendor/github.com/gin-gonic/gin/context.go +++ /dev/null @@ -1,1180 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "math" - "mime/multipart" - "net" - "net/http" - "net/url" - "os" - "strings" - "sync" - "time" - - "github.com/gin-contrib/sse" - "github.com/gin-gonic/gin/binding" - "github.com/gin-gonic/gin/render" -) - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = binding.MIMEJSON - MIMEHTML = binding.MIMEHTML - MIMEXML = binding.MIMEXML - MIMEXML2 = binding.MIMEXML2 - MIMEPlain = binding.MIMEPlain - MIMEPOSTForm = binding.MIMEPOSTForm - MIMEMultipartPOSTForm = binding.MIMEMultipartPOSTForm - MIMEYAML = binding.MIMEYAML -) - -// BodyBytesKey indicates a default body bytes key. -const BodyBytesKey = "_gin-gonic/gin/bodybyteskey" - -const abortIndex int8 = math.MaxInt8 / 2 - -// Context is the most important part of gin. It allows us to pass variables between middleware, -// manage the flow, validate the JSON of a request and render a JSON response for example. -type Context struct { - writermem responseWriter - Request *http.Request - Writer ResponseWriter - - Params Params - handlers HandlersChain - index int8 - fullPath string - - engine *Engine - params *Params - - // This mutex protect Keys map - mu sync.RWMutex - - // Keys is a key/value pair exclusively for the context of each request. - Keys map[string]interface{} - - // Errors is a list of errors attached to all the handlers/middlewares who used this context. - Errors errorMsgs - - // Accepted defines a list of manually accepted formats for content negotiation. - Accepted []string - - // queryCache use url.ParseQuery cached the param query result from c.Request.URL.Query() - queryCache url.Values - - // formCache use url.ParseQuery cached PostForm contains the parsed form data from POST, PATCH, - // or PUT body parameters. - formCache url.Values - - // SameSite allows a server to define a cookie attribute making it impossible for - // the browser to send this cookie along with cross-site requests. - sameSite http.SameSite -} - -/************************************/ -/********** CONTEXT CREATION ********/ -/************************************/ - -func (c *Context) reset() { - c.Writer = &c.writermem - c.Params = c.Params[0:0] - c.handlers = nil - c.index = -1 - - c.fullPath = "" - c.Keys = nil - c.Errors = c.Errors[0:0] - c.Accepted = nil - c.queryCache = nil - c.formCache = nil - *c.params = (*c.params)[0:0] -} - -// Copy returns a copy of the current context that can be safely used outside the request's scope. -// This has to be used when the context has to be passed to a goroutine. -func (c *Context) Copy() *Context { - cp := Context{ - writermem: c.writermem, - Request: c.Request, - Params: c.Params, - engine: c.engine, - } - cp.writermem.ResponseWriter = nil - cp.Writer = &cp.writermem - cp.index = abortIndex - cp.handlers = nil - cp.Keys = map[string]interface{}{} - for k, v := range c.Keys { - cp.Keys[k] = v - } - paramCopy := make([]Param, len(cp.Params)) - copy(paramCopy, cp.Params) - cp.Params = paramCopy - return &cp -} - -// HandlerName returns the main handler's name. For example if the handler is "handleGetUsers()", -// this function will return "main.handleGetUsers". -func (c *Context) HandlerName() string { - return nameOfFunction(c.handlers.Last()) -} - -// HandlerNames returns a list of all registered handlers for this context in descending order, -// following the semantics of HandlerName() -func (c *Context) HandlerNames() []string { - hn := make([]string, 0, len(c.handlers)) - for _, val := range c.handlers { - hn = append(hn, nameOfFunction(val)) - } - return hn -} - -// Handler returns the main handler. -func (c *Context) Handler() HandlerFunc { - return c.handlers.Last() -} - -// FullPath returns a matched route full path. For not found routes -// returns an empty string. -// router.GET("/user/:id", func(c *gin.Context) { -// c.FullPath() == "/user/:id" // true -// }) -func (c *Context) FullPath() string { - return c.fullPath -} - -/************************************/ -/*********** FLOW CONTROL ***********/ -/************************************/ - -// Next should be used only inside middleware. -// It executes the pending handlers in the chain inside the calling handler. -// See example in GitHub. -func (c *Context) Next() { - c.index++ - for c.index < int8(len(c.handlers)) { - c.handlers[c.index](c) - c.index++ - } -} - -// IsAborted returns true if the current context was aborted. -func (c *Context) IsAborted() bool { - return c.index >= abortIndex -} - -// Abort prevents pending handlers from being called. Note that this will not stop the current handler. -// Let's say you have an authorization middleware that validates that the current request is authorized. -// If the authorization fails (ex: the password does not match), call Abort to ensure the remaining handlers -// for this request are not called. -func (c *Context) Abort() { - c.index = abortIndex -} - -// AbortWithStatus calls `Abort()` and writes the headers with the specified status code. -// For example, a failed attempt to authenticate a request could use: context.AbortWithStatus(401). -func (c *Context) AbortWithStatus(code int) { - c.Status(code) - c.Writer.WriteHeaderNow() - c.Abort() -} - -// AbortWithStatusJSON calls `Abort()` and then `JSON` internally. -// This method stops the chain, writes the status code and return a JSON body. -// It also sets the Content-Type as "application/json". -func (c *Context) AbortWithStatusJSON(code int, jsonObj interface{}) { - c.Abort() - c.JSON(code, jsonObj) -} - -// AbortWithError calls `AbortWithStatus()` and `Error()` internally. -// This method stops the chain, writes the status code and pushes the specified error to `c.Errors`. -// See Context.Error() for more details. -func (c *Context) AbortWithError(code int, err error) *Error { - c.AbortWithStatus(code) - return c.Error(err) -} - -/************************************/ -/********* ERROR MANAGEMENT *********/ -/************************************/ - -// Error attaches an error to the current context. The error is pushed to a list of errors. -// It's a good idea to call Error for each error that occurred during the resolution of a request. -// A middleware can be used to collect all the errors and push them to a database together, -// print a log, or append it in the HTTP response. -// Error will panic if err is nil. -func (c *Context) Error(err error) *Error { - if err == nil { - panic("err is nil") - } - - parsedError, ok := err.(*Error) - if !ok { - parsedError = &Error{ - Err: err, - Type: ErrorTypePrivate, - } - } - - c.Errors = append(c.Errors, parsedError) - return parsedError -} - -/************************************/ -/******** METADATA MANAGEMENT********/ -/************************************/ - -// Set is used to store a new key/value pair exclusively for this context. -// It also lazy initializes c.Keys if it was not used previously. -func (c *Context) Set(key string, value interface{}) { - c.mu.Lock() - if c.Keys == nil { - c.Keys = make(map[string]interface{}) - } - - c.Keys[key] = value - c.mu.Unlock() -} - -// Get returns the value for the given key, ie: (value, true). -// If the value does not exists it returns (nil, false) -func (c *Context) Get(key string) (value interface{}, exists bool) { - c.mu.RLock() - value, exists = c.Keys[key] - c.mu.RUnlock() - return -} - -// MustGet returns the value for the given key if it exists, otherwise it panics. -func (c *Context) MustGet(key string) interface{} { - if value, exists := c.Get(key); exists { - return value - } - panic("Key \"" + key + "\" does not exist") -} - -// GetString returns the value associated with the key as a string. -func (c *Context) GetString(key string) (s string) { - if val, ok := c.Get(key); ok && val != nil { - s, _ = val.(string) - } - return -} - -// GetBool returns the value associated with the key as a boolean. -func (c *Context) GetBool(key string) (b bool) { - if val, ok := c.Get(key); ok && val != nil { - b, _ = val.(bool) - } - return -} - -// GetInt returns the value associated with the key as an integer. -func (c *Context) GetInt(key string) (i int) { - if val, ok := c.Get(key); ok && val != nil { - i, _ = val.(int) - } - return -} - -// GetInt64 returns the value associated with the key as an integer. -func (c *Context) GetInt64(key string) (i64 int64) { - if val, ok := c.Get(key); ok && val != nil { - i64, _ = val.(int64) - } - return -} - -// GetUint returns the value associated with the key as an unsigned integer. -func (c *Context) GetUint(key string) (ui uint) { - if val, ok := c.Get(key); ok && val != nil { - ui, _ = val.(uint) - } - return -} - -// GetUint64 returns the value associated with the key as an unsigned integer. -func (c *Context) GetUint64(key string) (ui64 uint64) { - if val, ok := c.Get(key); ok && val != nil { - ui64, _ = val.(uint64) - } - return -} - -// GetFloat64 returns the value associated with the key as a float64. -func (c *Context) GetFloat64(key string) (f64 float64) { - if val, ok := c.Get(key); ok && val != nil { - f64, _ = val.(float64) - } - return -} - -// GetTime returns the value associated with the key as time. -func (c *Context) GetTime(key string) (t time.Time) { - if val, ok := c.Get(key); ok && val != nil { - t, _ = val.(time.Time) - } - return -} - -// GetDuration returns the value associated with the key as a duration. -func (c *Context) GetDuration(key string) (d time.Duration) { - if val, ok := c.Get(key); ok && val != nil { - d, _ = val.(time.Duration) - } - return -} - -// GetStringSlice returns the value associated with the key as a slice of strings. -func (c *Context) GetStringSlice(key string) (ss []string) { - if val, ok := c.Get(key); ok && val != nil { - ss, _ = val.([]string) - } - return -} - -// GetStringMap returns the value associated with the key as a map of interfaces. -func (c *Context) GetStringMap(key string) (sm map[string]interface{}) { - if val, ok := c.Get(key); ok && val != nil { - sm, _ = val.(map[string]interface{}) - } - return -} - -// GetStringMapString returns the value associated with the key as a map of strings. -func (c *Context) GetStringMapString(key string) (sms map[string]string) { - if val, ok := c.Get(key); ok && val != nil { - sms, _ = val.(map[string]string) - } - return -} - -// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings. -func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string) { - if val, ok := c.Get(key); ok && val != nil { - smss, _ = val.(map[string][]string) - } - return -} - -/************************************/ -/************ INPUT DATA ************/ -/************************************/ - -// Param returns the value of the URL param. -// It is a shortcut for c.Params.ByName(key) -// router.GET("/user/:id", func(c *gin.Context) { -// // a GET request to /user/john -// id := c.Param("id") // id == "john" -// }) -func (c *Context) Param(key string) string { - return c.Params.ByName(key) -} - -// Query returns the keyed url query value if it exists, -// otherwise it returns an empty string `("")`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// GET /path?id=1234&name=Manu&value= -// c.Query("id") == "1234" -// c.Query("name") == "Manu" -// c.Query("value") == "" -// c.Query("wtf") == "" -func (c *Context) Query(key string) string { - value, _ := c.GetQuery(key) - return value -} - -// DefaultQuery returns the keyed url query value if it exists, -// otherwise it returns the specified defaultValue string. -// See: Query() and GetQuery() for further information. -// GET /?name=Manu&lastname= -// c.DefaultQuery("name", "unknown") == "Manu" -// c.DefaultQuery("id", "none") == "none" -// c.DefaultQuery("lastname", "none") == "" -func (c *Context) DefaultQuery(key, defaultValue string) string { - if value, ok := c.GetQuery(key); ok { - return value - } - return defaultValue -} - -// GetQuery is like Query(), it returns the keyed url query value -// if it exists `(value, true)` (even when the value is an empty string), -// otherwise it returns `("", false)`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// GET /?name=Manu&lastname= -// ("Manu", true) == c.GetQuery("name") -// ("", false) == c.GetQuery("id") -// ("", true) == c.GetQuery("lastname") -func (c *Context) GetQuery(key string) (string, bool) { - if values, ok := c.GetQueryArray(key); ok { - return values[0], ok - } - return "", false -} - -// QueryArray returns a slice of strings for a given query key. -// The length of the slice depends on the number of params with the given key. -func (c *Context) QueryArray(key string) []string { - values, _ := c.GetQueryArray(key) - return values -} - -func (c *Context) initQueryCache() { - if c.queryCache == nil { - if c.Request != nil { - c.queryCache = c.Request.URL.Query() - } else { - c.queryCache = url.Values{} - } - } -} - -// GetQueryArray returns a slice of strings for a given query key, plus -// a boolean value whether at least one value exists for the given key. -func (c *Context) GetQueryArray(key string) ([]string, bool) { - c.initQueryCache() - if values, ok := c.queryCache[key]; ok && len(values) > 0 { - return values, true - } - return []string{}, false -} - -// QueryMap returns a map for a given query key. -func (c *Context) QueryMap(key string) map[string]string { - dicts, _ := c.GetQueryMap(key) - return dicts -} - -// GetQueryMap returns a map for a given query key, plus a boolean value -// whether at least one value exists for the given key. -func (c *Context) GetQueryMap(key string) (map[string]string, bool) { - c.initQueryCache() - return c.get(c.queryCache, key) -} - -// PostForm returns the specified key from a POST urlencoded form or multipart form -// when it exists, otherwise it returns an empty string `("")`. -func (c *Context) PostForm(key string) string { - value, _ := c.GetPostForm(key) - return value -} - -// DefaultPostForm returns the specified key from a POST urlencoded form or multipart form -// when it exists, otherwise it returns the specified defaultValue string. -// See: PostForm() and GetPostForm() for further information. -func (c *Context) DefaultPostForm(key, defaultValue string) string { - if value, ok := c.GetPostForm(key); ok { - return value - } - return defaultValue -} - -// GetPostForm is like PostForm(key). It returns the specified key from a POST urlencoded -// form or multipart form when it exists `(value, true)` (even when the value is an empty string), -// otherwise it returns ("", false). -// For example, during a PATCH request to update the user's email: -// email=mail@example.com --> ("mail@example.com", true) := GetPostForm("email") // set email to "mail@example.com" -// email= --> ("", true) := GetPostForm("email") // set email to "" -// --> ("", false) := GetPostForm("email") // do nothing with email -func (c *Context) GetPostForm(key string) (string, bool) { - if values, ok := c.GetPostFormArray(key); ok { - return values[0], ok - } - return "", false -} - -// PostFormArray returns a slice of strings for a given form key. -// The length of the slice depends on the number of params with the given key. -func (c *Context) PostFormArray(key string) []string { - values, _ := c.GetPostFormArray(key) - return values -} - -func (c *Context) initFormCache() { - if c.formCache == nil { - c.formCache = make(url.Values) - req := c.Request - if err := req.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - if err != http.ErrNotMultipart { - debugPrint("error on parse multipart form array: %v", err) - } - } - c.formCache = req.PostForm - } -} - -// GetPostFormArray returns a slice of strings for a given form key, plus -// a boolean value whether at least one value exists for the given key. -func (c *Context) GetPostFormArray(key string) ([]string, bool) { - c.initFormCache() - if values := c.formCache[key]; len(values) > 0 { - return values, true - } - return []string{}, false -} - -// PostFormMap returns a map for a given form key. -func (c *Context) PostFormMap(key string) map[string]string { - dicts, _ := c.GetPostFormMap(key) - return dicts -} - -// GetPostFormMap returns a map for a given form key, plus a boolean value -// whether at least one value exists for the given key. -func (c *Context) GetPostFormMap(key string) (map[string]string, bool) { - c.initFormCache() - return c.get(c.formCache, key) -} - -// get is an internal method and returns a map which satisfy conditions. -func (c *Context) get(m map[string][]string, key string) (map[string]string, bool) { - dicts := make(map[string]string) - exist := false - for k, v := range m { - if i := strings.IndexByte(k, '['); i >= 1 && k[0:i] == key { - if j := strings.IndexByte(k[i+1:], ']'); j >= 1 { - exist = true - dicts[k[i+1:][:j]] = v[0] - } - } - } - return dicts, exist -} - -// FormFile returns the first file for the provided form key. -func (c *Context) FormFile(name string) (*multipart.FileHeader, error) { - if c.Request.MultipartForm == nil { - if err := c.Request.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - return nil, err - } - } - f, fh, err := c.Request.FormFile(name) - if err != nil { - return nil, err - } - f.Close() - return fh, err -} - -// MultipartForm is the parsed multipart form, including file uploads. -func (c *Context) MultipartForm() (*multipart.Form, error) { - err := c.Request.ParseMultipartForm(c.engine.MaxMultipartMemory) - return c.Request.MultipartForm, err -} - -// SaveUploadedFile uploads the form file to specific dst. -func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error { - src, err := file.Open() - if err != nil { - return err - } - defer src.Close() - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, src) - return err -} - -// Bind checks the Content-Type to select a binding engine automatically, -// Depending the "Content-Type" header different bindings are used: -// "application/json" --> JSON binding -// "application/xml" --> XML binding -// otherwise --> returns an error. -// It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. -// It decodes the json payload into the struct specified as a pointer. -// It writes a 400 error and sets Content-Type header "text/plain" in the response if input is not valid. -func (c *Context) Bind(obj interface{}) error { - b := binding.Default(c.Request.Method, c.ContentType()) - return c.MustBindWith(obj, b) -} - -// BindJSON is a shortcut for c.MustBindWith(obj, binding.JSON). -func (c *Context) BindJSON(obj interface{}) error { - return c.MustBindWith(obj, binding.JSON) -} - -// BindXML is a shortcut for c.MustBindWith(obj, binding.BindXML). -func (c *Context) BindXML(obj interface{}) error { - return c.MustBindWith(obj, binding.XML) -} - -// BindQuery is a shortcut for c.MustBindWith(obj, binding.Query). -func (c *Context) BindQuery(obj interface{}) error { - return c.MustBindWith(obj, binding.Query) -} - -// BindYAML is a shortcut for c.MustBindWith(obj, binding.YAML). -func (c *Context) BindYAML(obj interface{}) error { - return c.MustBindWith(obj, binding.YAML) -} - -// BindHeader is a shortcut for c.MustBindWith(obj, binding.Header). -func (c *Context) BindHeader(obj interface{}) error { - return c.MustBindWith(obj, binding.Header) -} - -// BindUri binds the passed struct pointer using binding.Uri. -// It will abort the request with HTTP 400 if any error occurs. -func (c *Context) BindUri(obj interface{}) error { - if err := c.ShouldBindUri(obj); err != nil { - c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck - return err - } - return nil -} - -// MustBindWith binds the passed struct pointer using the specified binding engine. -// It will abort the request with HTTP 400 if any error occurs. -// See the binding package. -func (c *Context) MustBindWith(obj interface{}, b binding.Binding) error { - if err := c.ShouldBindWith(obj, b); err != nil { - c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck - return err - } - return nil -} - -// ShouldBind checks the Content-Type to select a binding engine automatically, -// Depending the "Content-Type" header different bindings are used: -// "application/json" --> JSON binding -// "application/xml" --> XML binding -// otherwise --> returns an error -// It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. -// It decodes the json payload into the struct specified as a pointer. -// Like c.Bind() but this method does not set the response status code to 400 and abort if the json is not valid. -func (c *Context) ShouldBind(obj interface{}) error { - b := binding.Default(c.Request.Method, c.ContentType()) - return c.ShouldBindWith(obj, b) -} - -// ShouldBindJSON is a shortcut for c.ShouldBindWith(obj, binding.JSON). -func (c *Context) ShouldBindJSON(obj interface{}) error { - return c.ShouldBindWith(obj, binding.JSON) -} - -// ShouldBindXML is a shortcut for c.ShouldBindWith(obj, binding.XML). -func (c *Context) ShouldBindXML(obj interface{}) error { - return c.ShouldBindWith(obj, binding.XML) -} - -// ShouldBindQuery is a shortcut for c.ShouldBindWith(obj, binding.Query). -func (c *Context) ShouldBindQuery(obj interface{}) error { - return c.ShouldBindWith(obj, binding.Query) -} - -// ShouldBindYAML is a shortcut for c.ShouldBindWith(obj, binding.YAML). -func (c *Context) ShouldBindYAML(obj interface{}) error { - return c.ShouldBindWith(obj, binding.YAML) -} - -// ShouldBindHeader is a shortcut for c.ShouldBindWith(obj, binding.Header). -func (c *Context) ShouldBindHeader(obj interface{}) error { - return c.ShouldBindWith(obj, binding.Header) -} - -// ShouldBindUri binds the passed struct pointer using the specified binding engine. -func (c *Context) ShouldBindUri(obj interface{}) error { - m := make(map[string][]string) - for _, v := range c.Params { - m[v.Key] = []string{v.Value} - } - return binding.Uri.BindUri(m, obj) -} - -// ShouldBindWith binds the passed struct pointer using the specified binding engine. -// See the binding package. -func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error { - return b.Bind(c.Request, obj) -} - -// ShouldBindBodyWith is similar with ShouldBindWith, but it stores the request -// body into the context, and reuse when it is called again. -// -// NOTE: This method reads the body before binding. So you should use -// ShouldBindWith for better performance if you need to call only once. -func (c *Context) ShouldBindBodyWith(obj interface{}, bb binding.BindingBody) (err error) { - var body []byte - if cb, ok := c.Get(BodyBytesKey); ok { - if cbb, ok := cb.([]byte); ok { - body = cbb - } - } - if body == nil { - body, err = ioutil.ReadAll(c.Request.Body) - if err != nil { - return err - } - c.Set(BodyBytesKey, body) - } - return bb.BindBody(body, obj) -} - -// ClientIP implements a best effort algorithm to return the real client IP. -// It called c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not. -// If it's it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]). -// If the headers are nots syntactically valid OR the remote IP does not correspong to a trusted proxy, -// the remote IP (coming form Request.RemoteAddr) is returned. -func (c *Context) ClientIP() string { - if c.engine.AppEngine { - if addr := c.requestHeader("X-Appengine-Remote-Addr"); addr != "" { - return addr - } - } - - remoteIP, trusted := c.RemoteIP() - if remoteIP == nil { - return "" - } - - if trusted && c.engine.ForwardedByClientIP && c.engine.RemoteIPHeaders != nil { - for _, headerName := range c.engine.RemoteIPHeaders { - ip, valid := validateHeader(c.requestHeader(headerName)) - if valid { - return ip - } - } - } - return remoteIP.String() -} - -// RemoteIP parses the IP from Request.RemoteAddr, normalizes and returns the IP (without the port). -// It also checks if the remoteIP is a trusted proxy or not. -// In order to perform this validation, it will see if the IP is contained within at least one of the CIDR blocks -// defined in Engine.TrustedProxies -func (c *Context) RemoteIP() (net.IP, bool) { - ip, _, err := net.SplitHostPort(strings.TrimSpace(c.Request.RemoteAddr)) - if err != nil { - return nil, false - } - remoteIP := net.ParseIP(ip) - if remoteIP == nil { - return nil, false - } - - trustedCIDRs, _ := c.engine.prepareTrustedCIDRs() - c.engine.trustedCIDRs = trustedCIDRs - if c.engine.trustedCIDRs != nil { - for _, cidr := range c.engine.trustedCIDRs { - if cidr.Contains(remoteIP) { - return remoteIP, true - } - } - } - - return remoteIP, false -} - -func validateHeader(header string) (clientIP string, valid bool) { - if header == "" { - return "", false - } - items := strings.Split(header, ",") - for i, ipStr := range items { - ipStr = strings.TrimSpace(ipStr) - ip := net.ParseIP(ipStr) - if ip == nil { - return "", false - } - - // We need to return the first IP in the list, but, - // we should not early return since we need to validate that - // the rest of the header is syntactically valid - if i == 0 { - clientIP = ipStr - valid = true - } - } - return -} - -// ContentType returns the Content-Type header of the request. -func (c *Context) ContentType() string { - return filterFlags(c.requestHeader("Content-Type")) -} - -// IsWebsocket returns true if the request headers indicate that a websocket -// handshake is being initiated by the client. -func (c *Context) IsWebsocket() bool { - if strings.Contains(strings.ToLower(c.requestHeader("Connection")), "upgrade") && - strings.EqualFold(c.requestHeader("Upgrade"), "websocket") { - return true - } - return false -} - -func (c *Context) requestHeader(key string) string { - return c.Request.Header.Get(key) -} - -/************************************/ -/******** RESPONSE RENDERING ********/ -/************************************/ - -// bodyAllowedForStatus is a copy of http.bodyAllowedForStatus non-exported function. -func bodyAllowedForStatus(status int) bool { - switch { - case status >= 100 && status <= 199: - return false - case status == http.StatusNoContent: - return false - case status == http.StatusNotModified: - return false - } - return true -} - -// Status sets the HTTP response code. -func (c *Context) Status(code int) { - c.Writer.WriteHeader(code) -} - -// Header is a intelligent shortcut for c.Writer.Header().Set(key, value). -// It writes a header in the response. -// If value == "", this method removes the header `c.Writer.Header().Del(key)` -func (c *Context) Header(key, value string) { - if value == "" { - c.Writer.Header().Del(key) - return - } - c.Writer.Header().Set(key, value) -} - -// GetHeader returns value from request headers. -func (c *Context) GetHeader(key string) string { - return c.requestHeader(key) -} - -// GetRawData return stream data. -func (c *Context) GetRawData() ([]byte, error) { - return ioutil.ReadAll(c.Request.Body) -} - -// SetSameSite with cookie -func (c *Context) SetSameSite(samesite http.SameSite) { - c.sameSite = samesite -} - -// SetCookie adds a Set-Cookie header to the ResponseWriter's headers. -// The provided cookie must have a valid Name. Invalid cookies may be -// silently dropped. -func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) { - if path == "" { - path = "/" - } - http.SetCookie(c.Writer, &http.Cookie{ - Name: name, - Value: url.QueryEscape(value), - MaxAge: maxAge, - Path: path, - Domain: domain, - SameSite: c.sameSite, - Secure: secure, - HttpOnly: httpOnly, - }) -} - -// Cookie returns the named cookie provided in the request or -// ErrNoCookie if not found. And return the named cookie is unescaped. -// If multiple cookies match the given name, only one cookie will -// be returned. -func (c *Context) Cookie(name string) (string, error) { - cookie, err := c.Request.Cookie(name) - if err != nil { - return "", err - } - val, _ := url.QueryUnescape(cookie.Value) - return val, nil -} - -// Render writes the response headers and calls render.Render to render data. -func (c *Context) Render(code int, r render.Render) { - c.Status(code) - - if !bodyAllowedForStatus(code) { - r.WriteContentType(c.Writer) - c.Writer.WriteHeaderNow() - return - } - - if err := r.Render(c.Writer); err != nil { - panic(err) - } -} - -// HTML renders the HTTP template specified by its file name. -// It also updates the HTTP code and sets the Content-Type as "text/html". -// See http://golang.org/doc/articles/wiki/ -func (c *Context) HTML(code int, name string, obj interface{}) { - instance := c.engine.HTMLRender.Instance(name, obj) - c.Render(code, instance) -} - -// IndentedJSON serializes the given struct as pretty JSON (indented + endlines) into the response body. -// It also sets the Content-Type as "application/json". -// WARNING: we recommend to use this only for development purposes since printing pretty JSON is -// more CPU and bandwidth consuming. Use Context.JSON() instead. -func (c *Context) IndentedJSON(code int, obj interface{}) { - c.Render(code, render.IndentedJSON{Data: obj}) -} - -// SecureJSON serializes the given struct as Secure JSON into the response body. -// Default prepends "while(1)," to response body if the given struct is array values. -// It also sets the Content-Type as "application/json". -func (c *Context) SecureJSON(code int, obj interface{}) { - c.Render(code, render.SecureJSON{Prefix: c.engine.secureJSONPrefix, Data: obj}) -} - -// JSONP serializes the given struct as JSON into the response body. -// It adds padding to response body to request data from a server residing in a different domain than the client. -// It also sets the Content-Type as "application/javascript". -func (c *Context) JSONP(code int, obj interface{}) { - callback := c.DefaultQuery("callback", "") - if callback == "" { - c.Render(code, render.JSON{Data: obj}) - return - } - c.Render(code, render.JsonpJSON{Callback: callback, Data: obj}) -} - -// JSON serializes the given struct as JSON into the response body. -// It also sets the Content-Type as "application/json". -func (c *Context) JSON(code int, obj interface{}) { - c.Render(code, render.JSON{Data: obj}) -} - -// AsciiJSON serializes the given struct as JSON into the response body with unicode to ASCII string. -// It also sets the Content-Type as "application/json". -func (c *Context) AsciiJSON(code int, obj interface{}) { - c.Render(code, render.AsciiJSON{Data: obj}) -} - -// PureJSON serializes the given struct as JSON into the response body. -// PureJSON, unlike JSON, does not replace special html characters with their unicode entities. -func (c *Context) PureJSON(code int, obj interface{}) { - c.Render(code, render.PureJSON{Data: obj}) -} - -// XML serializes the given struct as XML into the response body. -// It also sets the Content-Type as "application/xml". -func (c *Context) XML(code int, obj interface{}) { - c.Render(code, render.XML{Data: obj}) -} - -// YAML serializes the given struct as YAML into the response body. -func (c *Context) YAML(code int, obj interface{}) { - c.Render(code, render.YAML{Data: obj}) -} - -// ProtoBuf serializes the given struct as ProtoBuf into the response body. -func (c *Context) ProtoBuf(code int, obj interface{}) { - c.Render(code, render.ProtoBuf{Data: obj}) -} - -// String writes the given string into the response body. -func (c *Context) String(code int, format string, values ...interface{}) { - c.Render(code, render.String{Format: format, Data: values}) -} - -// Redirect returns a HTTP redirect to the specific location. -func (c *Context) Redirect(code int, location string) { - c.Render(-1, render.Redirect{ - Code: code, - Location: location, - Request: c.Request, - }) -} - -// Data writes some data into the body stream and updates the HTTP code. -func (c *Context) Data(code int, contentType string, data []byte) { - c.Render(code, render.Data{ - ContentType: contentType, - Data: data, - }) -} - -// DataFromReader writes the specified reader into the body stream and updates the HTTP code. -func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) { - c.Render(code, render.Reader{ - Headers: extraHeaders, - ContentType: contentType, - ContentLength: contentLength, - Reader: reader, - }) -} - -// File writes the specified file into the body stream in an efficient way. -func (c *Context) File(filepath string) { - http.ServeFile(c.Writer, c.Request, filepath) -} - -// FileFromFS writes the specified file from http.FileSystem into the body stream in an efficient way. -func (c *Context) FileFromFS(filepath string, fs http.FileSystem) { - defer func(old string) { - c.Request.URL.Path = old - }(c.Request.URL.Path) - - c.Request.URL.Path = filepath - - http.FileServer(fs).ServeHTTP(c.Writer, c.Request) -} - -// FileAttachment writes the specified file into the body stream in an efficient way -// On the client side, the file will typically be downloaded with the given filename -func (c *Context) FileAttachment(filepath, filename string) { - c.Writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename)) - http.ServeFile(c.Writer, c.Request, filepath) -} - -// SSEvent writes a Server-Sent Event into the body stream. -func (c *Context) SSEvent(name string, message interface{}) { - c.Render(-1, sse.Event{ - Event: name, - Data: message, - }) -} - -// Stream sends a streaming response and returns a boolean -// indicates "Is client disconnected in middle of stream" -func (c *Context) Stream(step func(w io.Writer) bool) bool { - w := c.Writer - clientGone := w.CloseNotify() - for { - select { - case <-clientGone: - return true - default: - keepOpen := step(w) - w.Flush() - if !keepOpen { - return false - } - } - } -} - -/************************************/ -/******** CONTENT NEGOTIATION *******/ -/************************************/ - -// Negotiate contains all negotiations data. -type Negotiate struct { - Offered []string - HTMLName string - HTMLData interface{} - JSONData interface{} - XMLData interface{} - YAMLData interface{} - Data interface{} -} - -// Negotiate calls different Render according acceptable Accept format. -func (c *Context) Negotiate(code int, config Negotiate) { - switch c.NegotiateFormat(config.Offered...) { - case binding.MIMEJSON: - data := chooseData(config.JSONData, config.Data) - c.JSON(code, data) - - case binding.MIMEHTML: - data := chooseData(config.HTMLData, config.Data) - c.HTML(code, config.HTMLName, data) - - case binding.MIMEXML: - data := chooseData(config.XMLData, config.Data) - c.XML(code, data) - - case binding.MIMEYAML: - data := chooseData(config.YAMLData, config.Data) - c.YAML(code, data) - - default: - c.AbortWithError(http.StatusNotAcceptable, errors.New("the accepted formats are not offered by the server")) // nolint: errcheck - } -} - -// NegotiateFormat returns an acceptable Accept format. -func (c *Context) NegotiateFormat(offered ...string) string { - assert1(len(offered) > 0, "you must provide at least one offer") - - if c.Accepted == nil { - c.Accepted = parseAccept(c.requestHeader("Accept")) - } - if len(c.Accepted) == 0 { - return offered[0] - } - for _, accepted := range c.Accepted { - for _, offer := range offered { - // According to RFC 2616 and RFC 2396, non-ASCII characters are not allowed in headers, - // therefore we can just iterate over the string without casting it into []rune - i := 0 - for ; i < len(accepted); i++ { - if accepted[i] == '*' || offer[i] == '*' { - return offer - } - if accepted[i] != offer[i] { - break - } - } - if i == len(accepted) { - return offer - } - } - } - return "" -} - -// SetAccepted sets Accept header data. -func (c *Context) SetAccepted(formats ...string) { - c.Accepted = formats -} - -/************************************/ -/***** GOLANG.ORG/X/NET/CONTEXT *****/ -/************************************/ - -// Deadline always returns that there is no deadline (ok==false), -// maybe you want to use Request.Context().Deadline() instead. -func (c *Context) Deadline() (deadline time.Time, ok bool) { - return -} - -// Done always returns nil (chan which will wait forever), -// if you want to abort your work when the connection was closed -// you should use Request.Context().Done() instead. -func (c *Context) Done() <-chan struct{} { - return nil -} - -// Err always returns nil, maybe you want to use Request.Context().Err() instead. -func (c *Context) Err() error { - return nil -} - -// Value returns the value associated with this context for key, or nil -// if no value is associated with key. Successive calls to Value with -// the same key returns the same result. -func (c *Context) Value(key interface{}) interface{} { - if key == 0 { - return c.Request - } - if keyAsString, ok := key.(string); ok { - val, _ := c.Get(keyAsString) - return val - } - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/context_appengine.go b/vendor/github.com/gin-gonic/gin/context_appengine.go deleted file mode 100644 index d565843..0000000 --- a/vendor/github.com/gin-gonic/gin/context_appengine.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -//go:build appengine -// +build appengine - -package gin - -func init() { - defaultAppEngine = true -} diff --git a/vendor/github.com/gin-gonic/gin/debug.go b/vendor/github.com/gin-gonic/gin/debug.go deleted file mode 100644 index 4c7cd0c..0000000 --- a/vendor/github.com/gin-gonic/gin/debug.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "html/template" - "runtime" - "strconv" - "strings" -) - -const ginSupportMinGoVer = 12 - -// IsDebugging returns true if the framework is running in debug mode. -// Use SetMode(gin.ReleaseMode) to disable debug mode. -func IsDebugging() bool { - return ginMode == debugCode -} - -// DebugPrintRouteFunc indicates debug log output format. -var DebugPrintRouteFunc func(httpMethod, absolutePath, handlerName string, nuHandlers int) - -func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) { - if IsDebugging() { - nuHandlers := len(handlers) - handlerName := nameOfFunction(handlers.Last()) - if DebugPrintRouteFunc == nil { - debugPrint("%-6s %-25s --> %s (%d handlers)\n", httpMethod, absolutePath, handlerName, nuHandlers) - } else { - DebugPrintRouteFunc(httpMethod, absolutePath, handlerName, nuHandlers) - } - } -} - -func debugPrintLoadTemplate(tmpl *template.Template) { - if IsDebugging() { - var buf strings.Builder - for _, tmpl := range tmpl.Templates() { - buf.WriteString("\t- ") - buf.WriteString(tmpl.Name()) - buf.WriteString("\n") - } - debugPrint("Loaded HTML Templates (%d): \n%s\n", len(tmpl.Templates()), buf.String()) - } -} - -func debugPrint(format string, values ...interface{}) { - if IsDebugging() { - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - fmt.Fprintf(DefaultWriter, "[GIN-debug] "+format, values...) - } -} - -func getMinVer(v string) (uint64, error) { - first := strings.IndexByte(v, '.') - last := strings.LastIndexByte(v, '.') - if first == last { - return strconv.ParseUint(v[first+1:], 10, 64) - } - return strconv.ParseUint(v[first+1:last], 10, 64) -} - -func debugPrintWARNINGDefault() { - if v, e := getMinVer(runtime.Version()); e == nil && v <= ginSupportMinGoVer { - debugPrint(`[WARNING] Now Gin requires Go 1.12+. - -`) - } - debugPrint(`[WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. - -`) -} - -func debugPrintWARNINGNew() { - debugPrint(`[WARNING] Running in "debug" mode. Switch to "release" mode in production. - - using env: export GIN_MODE=release - - using code: gin.SetMode(gin.ReleaseMode) - -`) -} - -func debugPrintWARNINGSetHTMLTemplate() { - debugPrint(`[WARNING] Since SetHTMLTemplate() is NOT thread-safe. It should only be called -at initialization. ie. before any route is registered or the router is listening in a socket: - - router := gin.Default() - router.SetHTMLTemplate(template) // << good place - -`) -} - -func debugPrintError(err error) { - if err != nil { - if IsDebugging() { - fmt.Fprintf(DefaultErrorWriter, "[GIN-debug] [ERROR] %v\n", err) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/deprecated.go b/vendor/github.com/gin-gonic/gin/deprecated.go deleted file mode 100644 index ab44742..0000000 --- a/vendor/github.com/gin-gonic/gin/deprecated.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "log" - - "github.com/gin-gonic/gin/binding" -) - -// BindWith binds the passed struct pointer using the specified binding engine. -// See the binding package. -func (c *Context) BindWith(obj interface{}, b binding.Binding) error { - log.Println(`BindWith(\"interface{}, binding.Binding\") error is going to - be deprecated, please check issue #662 and either use MustBindWith() if you - want HTTP 400 to be automatically returned if any error occur, or use - ShouldBindWith() if you need to manage the error.`) - return c.MustBindWith(obj, b) -} diff --git a/vendor/github.com/gin-gonic/gin/doc.go b/vendor/github.com/gin-gonic/gin/doc.go deleted file mode 100644 index 1bd0386..0000000 --- a/vendor/github.com/gin-gonic/gin/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -/* -Package gin implements a HTTP web framework called gin. - -See https://gin-gonic.com/ for more information about gin. -*/ -package gin // import "github.com/gin-gonic/gin" diff --git a/vendor/github.com/gin-gonic/gin/errors.go b/vendor/github.com/gin-gonic/gin/errors.go deleted file mode 100644 index 0f276c1..0000000 --- a/vendor/github.com/gin-gonic/gin/errors.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "reflect" - "strings" - - "github.com/gin-gonic/gin/internal/json" -) - -// ErrorType is an unsigned 64-bit error code as defined in the gin spec. -type ErrorType uint64 - -const ( - // ErrorTypeBind is used when Context.Bind() fails. - ErrorTypeBind ErrorType = 1 << 63 - // ErrorTypeRender is used when Context.Render() fails. - ErrorTypeRender ErrorType = 1 << 62 - // ErrorTypePrivate indicates a private error. - ErrorTypePrivate ErrorType = 1 << 0 - // ErrorTypePublic indicates a public error. - ErrorTypePublic ErrorType = 1 << 1 - // ErrorTypeAny indicates any other error. - ErrorTypeAny ErrorType = 1<<64 - 1 - // ErrorTypeNu indicates any other error. - ErrorTypeNu = 2 -) - -// Error represents a error's specification. -type Error struct { - Err error - Type ErrorType - Meta interface{} -} - -type errorMsgs []*Error - -var _ error = &Error{} - -// SetType sets the error's type. -func (msg *Error) SetType(flags ErrorType) *Error { - msg.Type = flags - return msg -} - -// SetMeta sets the error's meta data. -func (msg *Error) SetMeta(data interface{}) *Error { - msg.Meta = data - return msg -} - -// JSON creates a properly formatted JSON -func (msg *Error) JSON() interface{} { - jsonData := H{} - if msg.Meta != nil { - value := reflect.ValueOf(msg.Meta) - switch value.Kind() { - case reflect.Struct: - return msg.Meta - case reflect.Map: - for _, key := range value.MapKeys() { - jsonData[key.String()] = value.MapIndex(key).Interface() - } - default: - jsonData["meta"] = msg.Meta - } - } - if _, ok := jsonData["error"]; !ok { - jsonData["error"] = msg.Error() - } - return jsonData -} - -// MarshalJSON implements the json.Marshaller interface. -func (msg *Error) MarshalJSON() ([]byte, error) { - return json.Marshal(msg.JSON()) -} - -// Error implements the error interface. -func (msg Error) Error() string { - return msg.Err.Error() -} - -// IsType judges one error. -func (msg *Error) IsType(flags ErrorType) bool { - return (msg.Type & flags) > 0 -} - -// Unwrap returns the wrapped error, to allow interoperability with errors.Is(), errors.As() and errors.Unwrap() -func (msg *Error) Unwrap() error { - return msg.Err -} - -// ByType returns a readonly copy filtered the byte. -// ie ByType(gin.ErrorTypePublic) returns a slice of errors with type=ErrorTypePublic. -func (a errorMsgs) ByType(typ ErrorType) errorMsgs { - if len(a) == 0 { - return nil - } - if typ == ErrorTypeAny { - return a - } - var result errorMsgs - for _, msg := range a { - if msg.IsType(typ) { - result = append(result, msg) - } - } - return result -} - -// Last returns the last error in the slice. It returns nil if the array is empty. -// Shortcut for errors[len(errors)-1]. -func (a errorMsgs) Last() *Error { - if length := len(a); length > 0 { - return a[length-1] - } - return nil -} - -// Errors returns an array will all the error messages. -// Example: -// c.Error(errors.New("first")) -// c.Error(errors.New("second")) -// c.Error(errors.New("third")) -// c.Errors.Errors() // == []string{"first", "second", "third"} -func (a errorMsgs) Errors() []string { - if len(a) == 0 { - return nil - } - errorStrings := make([]string, len(a)) - for i, err := range a { - errorStrings[i] = err.Error() - } - return errorStrings -} - -func (a errorMsgs) JSON() interface{} { - switch length := len(a); length { - case 0: - return nil - case 1: - return a.Last().JSON() - default: - jsonData := make([]interface{}, length) - for i, err := range a { - jsonData[i] = err.JSON() - } - return jsonData - } -} - -// MarshalJSON implements the json.Marshaller interface. -func (a errorMsgs) MarshalJSON() ([]byte, error) { - return json.Marshal(a.JSON()) -} - -func (a errorMsgs) String() string { - if len(a) == 0 { - return "" - } - var buffer strings.Builder - for i, msg := range a { - fmt.Fprintf(&buffer, "Error #%02d: %s\n", i+1, msg.Err) - if msg.Meta != nil { - fmt.Fprintf(&buffer, " Meta: %v\n", msg.Meta) - } - } - return buffer.String() -} diff --git a/vendor/github.com/gin-gonic/gin/fs.go b/vendor/github.com/gin-gonic/gin/fs.go deleted file mode 100644 index 007d9b7..0000000 --- a/vendor/github.com/gin-gonic/gin/fs.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "net/http" - "os" -) - -type onlyFilesFS struct { - fs http.FileSystem -} - -type neuteredReaddirFile struct { - http.File -} - -// Dir returns a http.Filesystem that can be used by http.FileServer(). It is used internally -// in router.Static(). -// if listDirectory == true, then it works the same as http.Dir() otherwise it returns -// a filesystem that prevents http.FileServer() to list the directory files. -func Dir(root string, listDirectory bool) http.FileSystem { - fs := http.Dir(root) - if listDirectory { - return fs - } - return &onlyFilesFS{fs} -} - -// Open conforms to http.Filesystem. -func (fs onlyFilesFS) Open(name string) (http.File, error) { - f, err := fs.fs.Open(name) - if err != nil { - return nil, err - } - return neuteredReaddirFile{f}, nil -} - -// Readdir overrides the http.File default implementation. -func (f neuteredReaddirFile) Readdir(count int) ([]os.FileInfo, error) { - // this disables directory listing - return nil, nil -} diff --git a/vendor/github.com/gin-gonic/gin/gin.go b/vendor/github.com/gin-gonic/gin/gin.go deleted file mode 100644 index 03a0e12..0000000 --- a/vendor/github.com/gin-gonic/gin/gin.go +++ /dev/null @@ -1,577 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "html/template" - "net" - "net/http" - "os" - "path" - "strings" - "sync" - - "github.com/gin-gonic/gin/internal/bytesconv" - "github.com/gin-gonic/gin/render" -) - -const defaultMultipartMemory = 32 << 20 // 32 MB - -var ( - default404Body = []byte("404 page not found") - default405Body = []byte("405 method not allowed") -) - -var defaultAppEngine bool - -// HandlerFunc defines the handler used by gin middleware as return value. -type HandlerFunc func(*Context) - -// HandlersChain defines a HandlerFunc array. -type HandlersChain []HandlerFunc - -// Last returns the last handler in the chain. ie. the last handler is the main one. -func (c HandlersChain) Last() HandlerFunc { - if length := len(c); length > 0 { - return c[length-1] - } - return nil -} - -// RouteInfo represents a request route's specification which contains method and path and its handler. -type RouteInfo struct { - Method string - Path string - Handler string - HandlerFunc HandlerFunc -} - -// RoutesInfo defines a RouteInfo array. -type RoutesInfo []RouteInfo - -// Engine is the framework's instance, it contains the muxer, middleware and configuration settings. -// Create an instance of Engine, by using New() or Default() -type Engine struct { - RouterGroup - - // Enables automatic redirection if the current route can't be matched but a - // handler for the path with (without) the trailing slash exists. - // For example if /foo/ is requested but a route only exists for /foo, the - // client is redirected to /foo with http status code 301 for GET requests - // and 307 for all other request methods. - RedirectTrailingSlash bool - - // If enabled, the router tries to fix the current request path, if no - // handle is registered for it. - // First superfluous path elements like ../ or // are removed. - // Afterwards the router does a case-insensitive lookup of the cleaned path. - // If a handle can be found for this route, the router makes a redirection - // to the corrected path with status code 301 for GET requests and 307 for - // all other request methods. - // For example /FOO and /..//Foo could be redirected to /foo. - // RedirectTrailingSlash is independent of this option. - RedirectFixedPath bool - - // If enabled, the router checks if another method is allowed for the - // current route, if the current request can not be routed. - // If this is the case, the request is answered with 'Method Not Allowed' - // and HTTP status code 405. - // If no other Method is allowed, the request is delegated to the NotFound - // handler. - HandleMethodNotAllowed bool - - // If enabled, client IP will be parsed from the request's headers that - // match those stored at `(*gin.Engine).RemoteIPHeaders`. If no IP was - // fetched, it falls back to the IP obtained from - // `(*gin.Context).Request.RemoteAddr`. - ForwardedByClientIP bool - - // List of headers used to obtain the client IP when - // `(*gin.Engine).ForwardedByClientIP` is `true` and - // `(*gin.Context).Request.RemoteAddr` is matched by at least one of the - // network origins of `(*gin.Engine).TrustedProxies`. - RemoteIPHeaders []string - - // List of network origins (IPv4 addresses, IPv4 CIDRs, IPv6 addresses or - // IPv6 CIDRs) from which to trust request's headers that contain - // alternative client IP when `(*gin.Engine).ForwardedByClientIP` is - // `true`. - TrustedProxies []string - - // #726 #755 If enabled, it will trust some headers starting with - // 'X-AppEngine...' for better integration with that PaaS. - AppEngine bool - - // If enabled, the url.RawPath will be used to find parameters. - UseRawPath bool - - // If true, the path value will be unescaped. - // If UseRawPath is false (by default), the UnescapePathValues effectively is true, - // as url.Path gonna be used, which is already unescaped. - UnescapePathValues bool - - // Value of 'maxMemory' param that is given to http.Request's ParseMultipartForm - // method call. - MaxMultipartMemory int64 - - // RemoveExtraSlash a parameter can be parsed from the URL even with extra slashes. - // See the PR #1817 and issue #1644 - RemoveExtraSlash bool - - delims render.Delims - secureJSONPrefix string - HTMLRender render.HTMLRender - FuncMap template.FuncMap - allNoRoute HandlersChain - allNoMethod HandlersChain - noRoute HandlersChain - noMethod HandlersChain - pool sync.Pool - trees methodTrees - maxParams uint16 - trustedCIDRs []*net.IPNet -} - -var _ IRouter = &Engine{} - -// New returns a new blank Engine instance without any middleware attached. -// By default the configuration is: -// - RedirectTrailingSlash: true -// - RedirectFixedPath: false -// - HandleMethodNotAllowed: false -// - ForwardedByClientIP: true -// - UseRawPath: false -// - UnescapePathValues: true -func New() *Engine { - debugPrintWARNINGNew() - engine := &Engine{ - RouterGroup: RouterGroup{ - Handlers: nil, - basePath: "/", - root: true, - }, - FuncMap: template.FuncMap{}, - RedirectTrailingSlash: true, - RedirectFixedPath: false, - HandleMethodNotAllowed: false, - ForwardedByClientIP: true, - RemoteIPHeaders: []string{"X-Forwarded-For", "X-Real-IP"}, - TrustedProxies: []string{"0.0.0.0/0"}, - AppEngine: defaultAppEngine, - UseRawPath: false, - RemoveExtraSlash: false, - UnescapePathValues: true, - MaxMultipartMemory: defaultMultipartMemory, - trees: make(methodTrees, 0, 9), - delims: render.Delims{Left: "{{", Right: "}}"}, - secureJSONPrefix: "while(1);", - } - engine.RouterGroup.engine = engine - engine.pool.New = func() interface{} { - return engine.allocateContext() - } - return engine -} - -// Default returns an Engine instance with the Logger and Recovery middleware already attached. -func Default() *Engine { - debugPrintWARNINGDefault() - engine := New() - engine.Use(Logger(), Recovery()) - return engine -} - -func (engine *Engine) allocateContext() *Context { - v := make(Params, 0, engine.maxParams) - return &Context{engine: engine, params: &v} -} - -// Delims sets template left and right delims and returns a Engine instance. -func (engine *Engine) Delims(left, right string) *Engine { - engine.delims = render.Delims{Left: left, Right: right} - return engine -} - -// SecureJsonPrefix sets the secureJSONPrefix used in Context.SecureJSON. -func (engine *Engine) SecureJsonPrefix(prefix string) *Engine { - engine.secureJSONPrefix = prefix - return engine -} - -// LoadHTMLGlob loads HTML files identified by glob pattern -// and associates the result with HTML renderer. -func (engine *Engine) LoadHTMLGlob(pattern string) { - left := engine.delims.Left - right := engine.delims.Right - templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern)) - - if IsDebugging() { - debugPrintLoadTemplate(templ) - engine.HTMLRender = render.HTMLDebug{Glob: pattern, FuncMap: engine.FuncMap, Delims: engine.delims} - return - } - - engine.SetHTMLTemplate(templ) -} - -// LoadHTMLFiles loads a slice of HTML files -// and associates the result with HTML renderer. -func (engine *Engine) LoadHTMLFiles(files ...string) { - if IsDebugging() { - engine.HTMLRender = render.HTMLDebug{Files: files, FuncMap: engine.FuncMap, Delims: engine.delims} - return - } - - templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...)) - engine.SetHTMLTemplate(templ) -} - -// SetHTMLTemplate associate a template with HTML renderer. -func (engine *Engine) SetHTMLTemplate(templ *template.Template) { - if len(engine.trees) > 0 { - debugPrintWARNINGSetHTMLTemplate() - } - - engine.HTMLRender = render.HTMLProduction{Template: templ.Funcs(engine.FuncMap)} -} - -// SetFuncMap sets the FuncMap used for template.FuncMap. -func (engine *Engine) SetFuncMap(funcMap template.FuncMap) { - engine.FuncMap = funcMap -} - -// NoRoute adds handlers for NoRoute. It return a 404 code by default. -func (engine *Engine) NoRoute(handlers ...HandlerFunc) { - engine.noRoute = handlers - engine.rebuild404Handlers() -} - -// NoMethod sets the handlers called when... TODO. -func (engine *Engine) NoMethod(handlers ...HandlerFunc) { - engine.noMethod = handlers - engine.rebuild405Handlers() -} - -// Use attaches a global middleware to the router. ie. the middleware attached though Use() will be -// included in the handlers chain for every single request. Even 404, 405, static files... -// For example, this is the right place for a logger or error management middleware. -func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes { - engine.RouterGroup.Use(middleware...) - engine.rebuild404Handlers() - engine.rebuild405Handlers() - return engine -} - -func (engine *Engine) rebuild404Handlers() { - engine.allNoRoute = engine.combineHandlers(engine.noRoute) -} - -func (engine *Engine) rebuild405Handlers() { - engine.allNoMethod = engine.combineHandlers(engine.noMethod) -} - -func (engine *Engine) addRoute(method, path string, handlers HandlersChain) { - assert1(path[0] == '/', "path must begin with '/'") - assert1(method != "", "HTTP method can not be empty") - assert1(len(handlers) > 0, "there must be at least one handler") - - debugPrintRoute(method, path, handlers) - - root := engine.trees.get(method) - if root == nil { - root = new(node) - root.fullPath = "/" - engine.trees = append(engine.trees, methodTree{method: method, root: root}) - } - root.addRoute(path, handlers) - - // Update maxParams - if paramsCount := countParams(path); paramsCount > engine.maxParams { - engine.maxParams = paramsCount - } -} - -// Routes returns a slice of registered routes, including some useful information, such as: -// the http method, path and the handler name. -func (engine *Engine) Routes() (routes RoutesInfo) { - for _, tree := range engine.trees { - routes = iterate("", tree.method, routes, tree.root) - } - return routes -} - -func iterate(path, method string, routes RoutesInfo, root *node) RoutesInfo { - path += root.path - if len(root.handlers) > 0 { - handlerFunc := root.handlers.Last() - routes = append(routes, RouteInfo{ - Method: method, - Path: path, - Handler: nameOfFunction(handlerFunc), - HandlerFunc: handlerFunc, - }) - } - for _, child := range root.children { - routes = iterate(path, method, routes, child) - } - return routes -} - -// Run attaches the router to a http.Server and starts listening and serving HTTP requests. -// It is a shortcut for http.ListenAndServe(addr, router) -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) Run(addr ...string) (err error) { - defer func() { debugPrintError(err) }() - - trustedCIDRs, err := engine.prepareTrustedCIDRs() - if err != nil { - return err - } - engine.trustedCIDRs = trustedCIDRs - address := resolveAddress(addr) - debugPrint("Listening and serving HTTP on %s\n", address) - err = http.ListenAndServe(address, engine) - return -} - -func (engine *Engine) prepareTrustedCIDRs() ([]*net.IPNet, error) { - if engine.TrustedProxies == nil { - return nil, nil - } - - cidr := make([]*net.IPNet, 0, len(engine.TrustedProxies)) - for _, trustedProxy := range engine.TrustedProxies { - if !strings.Contains(trustedProxy, "/") { - ip := parseIP(trustedProxy) - if ip == nil { - return cidr, &net.ParseError{Type: "IP address", Text: trustedProxy} - } - - switch len(ip) { - case net.IPv4len: - trustedProxy += "/32" - case net.IPv6len: - trustedProxy += "/128" - } - } - _, cidrNet, err := net.ParseCIDR(trustedProxy) - if err != nil { - return cidr, err - } - cidr = append(cidr, cidrNet) - } - return cidr, nil -} - -// parseIP parse a string representation of an IP and returns a net.IP with the -// minimum byte representation or nil if input is invalid. -func parseIP(ip string) net.IP { - parsedIP := net.ParseIP(ip) - - if ipv4 := parsedIP.To4(); ipv4 != nil { - // return ip in a 4-byte representation - return ipv4 - } - - // return ip in a 16-byte representation or nil - return parsedIP -} - -// RunTLS attaches the router to a http.Server and starts listening and serving HTTPS (secure) requests. -// It is a shortcut for http.ListenAndServeTLS(addr, certFile, keyFile, router) -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) { - debugPrint("Listening and serving HTTPS on %s\n", addr) - defer func() { debugPrintError(err) }() - - err = http.ListenAndServeTLS(addr, certFile, keyFile, engine) - return -} - -// RunUnix attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified unix socket (ie. a file). -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunUnix(file string) (err error) { - debugPrint("Listening and serving HTTP on unix:/%s", file) - defer func() { debugPrintError(err) }() - - listener, err := net.Listen("unix", file) - if err != nil { - return - } - defer listener.Close() - defer os.Remove(file) - - err = http.Serve(listener, engine) - return -} - -// RunFd attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified file descriptor. -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunFd(fd int) (err error) { - debugPrint("Listening and serving HTTP on fd@%d", fd) - defer func() { debugPrintError(err) }() - - f := os.NewFile(uintptr(fd), fmt.Sprintf("fd@%d", fd)) - listener, err := net.FileListener(f) - if err != nil { - return - } - defer listener.Close() - err = engine.RunListener(listener) - return -} - -// RunListener attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified net.Listener -func (engine *Engine) RunListener(listener net.Listener) (err error) { - debugPrint("Listening and serving HTTP on listener what's bind with address@%s", listener.Addr()) - defer func() { debugPrintError(err) }() - err = http.Serve(listener, engine) - return -} - -// ServeHTTP conforms to the http.Handler interface. -func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { - c := engine.pool.Get().(*Context) - c.writermem.reset(w) - c.Request = req - c.reset() - - engine.handleHTTPRequest(c) - - engine.pool.Put(c) -} - -// HandleContext re-enter a context that has been rewritten. -// This can be done by setting c.Request.URL.Path to your new target. -// Disclaimer: You can loop yourself to death with this, use wisely. -func (engine *Engine) HandleContext(c *Context) { - oldIndexValue := c.index - c.reset() - engine.handleHTTPRequest(c) - - c.index = oldIndexValue -} - -func (engine *Engine) handleHTTPRequest(c *Context) { - httpMethod := c.Request.Method - rPath := c.Request.URL.Path - unescape := false - if engine.UseRawPath && len(c.Request.URL.RawPath) > 0 { - rPath = c.Request.URL.RawPath - unescape = engine.UnescapePathValues - } - - if engine.RemoveExtraSlash { - rPath = cleanPath(rPath) - } - - // Find root of the tree for the given HTTP method - t := engine.trees - for i, tl := 0, len(t); i < tl; i++ { - if t[i].method != httpMethod { - continue - } - root := t[i].root - // Find route in tree - value := root.getValue(rPath, c.params, unescape) - if value.params != nil { - c.Params = *value.params - } - if value.handlers != nil { - c.handlers = value.handlers - c.fullPath = value.fullPath - c.Next() - c.writermem.WriteHeaderNow() - return - } - if httpMethod != "CONNECT" && rPath != "/" { - if value.tsr && engine.RedirectTrailingSlash { - redirectTrailingSlash(c) - return - } - if engine.RedirectFixedPath && redirectFixedPath(c, root, engine.RedirectFixedPath) { - return - } - } - break - } - - if engine.HandleMethodNotAllowed { - for _, tree := range engine.trees { - if tree.method == httpMethod { - continue - } - if value := tree.root.getValue(rPath, nil, unescape); value.handlers != nil { - c.handlers = engine.allNoMethod - serveError(c, http.StatusMethodNotAllowed, default405Body) - return - } - } - } - c.handlers = engine.allNoRoute - serveError(c, http.StatusNotFound, default404Body) -} - -var mimePlain = []string{MIMEPlain} - -func serveError(c *Context, code int, defaultMessage []byte) { - c.writermem.status = code - c.Next() - if c.writermem.Written() { - return - } - if c.writermem.Status() == code { - c.writermem.Header()["Content-Type"] = mimePlain - _, err := c.Writer.Write(defaultMessage) - if err != nil { - debugPrint("cannot write message to writer during serve error: %v", err) - } - return - } - c.writermem.WriteHeaderNow() -} - -func redirectTrailingSlash(c *Context) { - req := c.Request - p := req.URL.Path - if prefix := path.Clean(c.Request.Header.Get("X-Forwarded-Prefix")); prefix != "." { - p = prefix + "/" + req.URL.Path - } - req.URL.Path = p + "/" - if length := len(p); length > 1 && p[length-1] == '/' { - req.URL.Path = p[:length-1] - } - redirectRequest(c) -} - -func redirectFixedPath(c *Context, root *node, trailingSlash bool) bool { - req := c.Request - rPath := req.URL.Path - - if fixedPath, ok := root.findCaseInsensitivePath(cleanPath(rPath), trailingSlash); ok { - req.URL.Path = bytesconv.BytesToString(fixedPath) - redirectRequest(c) - return true - } - return false -} - -func redirectRequest(c *Context) { - req := c.Request - rPath := req.URL.Path - rURL := req.URL.String() - - code := http.StatusMovedPermanently // Permanent redirect, request with GET method - if req.Method != http.MethodGet { - code = http.StatusTemporaryRedirect - } - debugPrint("redirecting request %d: %s --> %s", code, rPath, rURL) - http.Redirect(c.Writer, req, rURL, code) - c.writermem.WriteHeaderNow() -} diff --git a/vendor/github.com/gin-gonic/gin/go.mod b/vendor/github.com/gin-gonic/gin/go.mod deleted file mode 100644 index 884ff85..0000000 --- a/vendor/github.com/gin-gonic/gin/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/gin-gonic/gin - -go 1.13 - -require ( - github.com/gin-contrib/sse v0.1.0 - github.com/go-playground/validator/v10 v10.4.1 - github.com/golang/protobuf v1.3.3 - github.com/json-iterator/go v1.1.9 - github.com/mattn/go-isatty v0.0.12 - github.com/stretchr/testify v1.4.0 - github.com/ugorji/go/codec v1.1.7 - gopkg.in/yaml.v2 v2.2.8 -) diff --git a/vendor/github.com/gin-gonic/gin/go.sum b/vendor/github.com/gin-gonic/gin/go.sum deleted file mode 100644 index a64b331..0000000 --- a/vendor/github.com/gin-gonic/gin/go.sum +++ /dev/null @@ -1,52 +0,0 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go b/vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go deleted file mode 100644 index 86e4c4d..0000000 --- a/vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2020 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package bytesconv - -import ( - "unsafe" -) - -// StringToBytes converts string to byte slice without a memory allocation. -func StringToBytes(s string) []byte { - return *(*[]byte)(unsafe.Pointer( - &struct { - string - Cap int - }{s, len(s)}, - )) -} - -// BytesToString converts byte slice to string without a memory allocation. -func BytesToString(b []byte) string { - return *(*string)(unsafe.Pointer(&b)) -} diff --git a/vendor/github.com/gin-gonic/gin/internal/json/json.go b/vendor/github.com/gin-gonic/gin/internal/json/json.go deleted file mode 100644 index 172aeb2..0000000 --- a/vendor/github.com/gin-gonic/gin/internal/json/json.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017 Bo-Yi Wu. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -//go:build !jsoniter -// +build !jsoniter - -package json - -import "encoding/json" - -var ( - // Marshal is exported by gin/json package. - Marshal = json.Marshal - // Unmarshal is exported by gin/json package. - Unmarshal = json.Unmarshal - // MarshalIndent is exported by gin/json package. - MarshalIndent = json.MarshalIndent - // NewDecoder is exported by gin/json package. - NewDecoder = json.NewDecoder - // NewEncoder is exported by gin/json package. - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go b/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go deleted file mode 100644 index 232f8dc..0000000 --- a/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2017 Bo-Yi Wu. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -//go:build jsoniter -// +build jsoniter - -package json - -import jsoniter "github.com/json-iterator/go" - -var ( - json = jsoniter.ConfigCompatibleWithStandardLibrary - // Marshal is exported by gin/json package. - Marshal = json.Marshal - // Unmarshal is exported by gin/json package. - Unmarshal = json.Unmarshal - // MarshalIndent is exported by gin/json package. - MarshalIndent = json.MarshalIndent - // NewDecoder is exported by gin/json package. - NewDecoder = json.NewDecoder - // NewEncoder is exported by gin/json package. - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/gin-gonic/gin/logger.go b/vendor/github.com/gin-gonic/gin/logger.go deleted file mode 100644 index d361b74..0000000 --- a/vendor/github.com/gin-gonic/gin/logger.go +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "io" - "net/http" - "os" - "time" - - "github.com/mattn/go-isatty" -) - -type consoleColorModeValue int - -const ( - autoColor consoleColorModeValue = iota - disableColor - forceColor -) - -const ( - green = "\033[97;42m" - white = "\033[90;47m" - yellow = "\033[90;43m" - red = "\033[97;41m" - blue = "\033[97;44m" - magenta = "\033[97;45m" - cyan = "\033[97;46m" - reset = "\033[0m" -) - -var consoleColorMode = autoColor - -// LoggerConfig defines the config for Logger middleware. -type LoggerConfig struct { - // Optional. Default value is gin.defaultLogFormatter - Formatter LogFormatter - - // Output is a writer where logs are written. - // Optional. Default value is gin.DefaultWriter. - Output io.Writer - - // SkipPaths is a url path array which logs are not written. - // Optional. - SkipPaths []string -} - -// LogFormatter gives the signature of the formatter function passed to LoggerWithFormatter -type LogFormatter func(params LogFormatterParams) string - -// LogFormatterParams is the structure any formatter will be handed when time to log comes -type LogFormatterParams struct { - Request *http.Request - - // TimeStamp shows the time after the server returns a response. - TimeStamp time.Time - // StatusCode is HTTP response code. - StatusCode int - // Latency is how much time the server cost to process a certain request. - Latency time.Duration - // ClientIP equals Context's ClientIP method. - ClientIP string - // Method is the HTTP method given to the request. - Method string - // Path is a path the client requests. - Path string - // ErrorMessage is set if error has occurred in processing the request. - ErrorMessage string - // isTerm shows whether does gin's output descriptor refers to a terminal. - isTerm bool - // BodySize is the size of the Response Body - BodySize int - // Keys are the keys set on the request's context. - Keys map[string]interface{} -} - -// StatusCodeColor is the ANSI color for appropriately logging http status code to a terminal. -func (p *LogFormatterParams) StatusCodeColor() string { - code := p.StatusCode - - switch { - case code >= http.StatusOK && code < http.StatusMultipleChoices: - return green - case code >= http.StatusMultipleChoices && code < http.StatusBadRequest: - return white - case code >= http.StatusBadRequest && code < http.StatusInternalServerError: - return yellow - default: - return red - } -} - -// MethodColor is the ANSI color for appropriately logging http method to a terminal. -func (p *LogFormatterParams) MethodColor() string { - method := p.Method - - switch method { - case http.MethodGet: - return blue - case http.MethodPost: - return cyan - case http.MethodPut: - return yellow - case http.MethodDelete: - return red - case http.MethodPatch: - return green - case http.MethodHead: - return magenta - case http.MethodOptions: - return white - default: - return reset - } -} - -// ResetColor resets all escape attributes. -func (p *LogFormatterParams) ResetColor() string { - return reset -} - -// IsOutputColor indicates whether can colors be outputted to the log. -func (p *LogFormatterParams) IsOutputColor() bool { - return consoleColorMode == forceColor || (consoleColorMode == autoColor && p.isTerm) -} - -// defaultLogFormatter is the default log format function Logger middleware uses. -var defaultLogFormatter = func(param LogFormatterParams) string { - var statusColor, methodColor, resetColor string - if param.IsOutputColor() { - statusColor = param.StatusCodeColor() - methodColor = param.MethodColor() - resetColor = param.ResetColor() - } - - if param.Latency > time.Minute { - // Truncate in a golang < 1.8 safe way - param.Latency = param.Latency - param.Latency%time.Second - } - return fmt.Sprintf("[GIN] %v |%s %3d %s| %13v | %15s |%s %-7s %s %#v\n%s", - param.TimeStamp.Format("2006/01/02 - 15:04:05"), - statusColor, param.StatusCode, resetColor, - param.Latency, - param.ClientIP, - methodColor, param.Method, resetColor, - param.Path, - param.ErrorMessage, - ) -} - -// DisableConsoleColor disables color output in the console. -func DisableConsoleColor() { - consoleColorMode = disableColor -} - -// ForceConsoleColor force color output in the console. -func ForceConsoleColor() { - consoleColorMode = forceColor -} - -// ErrorLogger returns a handlerfunc for any error type. -func ErrorLogger() HandlerFunc { - return ErrorLoggerT(ErrorTypeAny) -} - -// ErrorLoggerT returns a handlerfunc for a given error type. -func ErrorLoggerT(typ ErrorType) HandlerFunc { - return func(c *Context) { - c.Next() - errors := c.Errors.ByType(typ) - if len(errors) > 0 { - c.JSON(-1, errors) - } - } -} - -// Logger instances a Logger middleware that will write the logs to gin.DefaultWriter. -// By default gin.DefaultWriter = os.Stdout. -func Logger() HandlerFunc { - return LoggerWithConfig(LoggerConfig{}) -} - -// LoggerWithFormatter instance a Logger middleware with the specified log format function. -func LoggerWithFormatter(f LogFormatter) HandlerFunc { - return LoggerWithConfig(LoggerConfig{ - Formatter: f, - }) -} - -// LoggerWithWriter instance a Logger middleware with the specified writer buffer. -// Example: os.Stdout, a file opened in write mode, a socket... -func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc { - return LoggerWithConfig(LoggerConfig{ - Output: out, - SkipPaths: notlogged, - }) -} - -// LoggerWithConfig instance a Logger middleware with config. -func LoggerWithConfig(conf LoggerConfig) HandlerFunc { - formatter := conf.Formatter - if formatter == nil { - formatter = defaultLogFormatter - } - - out := conf.Output - if out == nil { - out = DefaultWriter - } - - notlogged := conf.SkipPaths - - isTerm := true - - if w, ok := out.(*os.File); !ok || os.Getenv("TERM") == "dumb" || - (!isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd())) { - isTerm = false - } - - var skip map[string]struct{} - - if length := len(notlogged); length > 0 { - skip = make(map[string]struct{}, length) - - for _, path := range notlogged { - skip[path] = struct{}{} - } - } - - return func(c *Context) { - // Start timer - start := time.Now() - path := c.Request.URL.Path - raw := c.Request.URL.RawQuery - - // Process request - c.Next() - - // Log only when path is not being skipped - if _, ok := skip[path]; !ok { - param := LogFormatterParams{ - Request: c.Request, - isTerm: isTerm, - Keys: c.Keys, - } - - // Stop timer - param.TimeStamp = time.Now() - param.Latency = param.TimeStamp.Sub(start) - - param.ClientIP = c.ClientIP() - param.Method = c.Request.Method - param.StatusCode = c.Writer.Status() - param.ErrorMessage = c.Errors.ByType(ErrorTypePrivate).String() - - param.BodySize = c.Writer.Size() - - if raw != "" { - path = path + "?" + raw - } - - param.Path = path - - fmt.Fprint(out, formatter(param)) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/mode.go b/vendor/github.com/gin-gonic/gin/mode.go deleted file mode 100644 index c8813af..0000000 --- a/vendor/github.com/gin-gonic/gin/mode.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "io" - "os" - - "github.com/gin-gonic/gin/binding" -) - -// EnvGinMode indicates environment name for gin mode. -const EnvGinMode = "GIN_MODE" - -const ( - // DebugMode indicates gin mode is debug. - DebugMode = "debug" - // ReleaseMode indicates gin mode is release. - ReleaseMode = "release" - // TestMode indicates gin mode is test. - TestMode = "test" -) - -const ( - debugCode = iota - releaseCode - testCode -) - -// DefaultWriter is the default io.Writer used by Gin for debug output and -// middleware output like Logger() or Recovery(). -// Note that both Logger and Recovery provides custom ways to configure their -// output io.Writer. -// To support coloring in Windows use: -// import "github.com/mattn/go-colorable" -// gin.DefaultWriter = colorable.NewColorableStdout() -var DefaultWriter io.Writer = os.Stdout - -// DefaultErrorWriter is the default io.Writer used by Gin to debug errors -var DefaultErrorWriter io.Writer = os.Stderr - -var ginMode = debugCode -var modeName = DebugMode - -func init() { - mode := os.Getenv(EnvGinMode) - SetMode(mode) -} - -// SetMode sets gin mode according to input string. -func SetMode(value string) { - if value == "" { - value = DebugMode - } - - switch value { - case DebugMode: - ginMode = debugCode - case ReleaseMode: - ginMode = releaseCode - case TestMode: - ginMode = testCode - default: - panic("gin mode unknown: " + value + " (available mode: debug release test)") - } - - modeName = value -} - -// DisableBindValidation closes the default validator. -func DisableBindValidation() { - binding.Validator = nil -} - -// EnableJsonDecoderUseNumber sets true for binding.EnableDecoderUseNumber to -// call the UseNumber method on the JSON Decoder instance. -func EnableJsonDecoderUseNumber() { - binding.EnableDecoderUseNumber = true -} - -// EnableJsonDecoderDisallowUnknownFields sets true for binding.EnableDecoderDisallowUnknownFields to -// call the DisallowUnknownFields method on the JSON Decoder instance. -func EnableJsonDecoderDisallowUnknownFields() { - binding.EnableDecoderDisallowUnknownFields = true -} - -// Mode returns currently gin mode. -func Mode() string { - return modeName -} diff --git a/vendor/github.com/gin-gonic/gin/path.go b/vendor/github.com/gin-gonic/gin/path.go deleted file mode 100644 index d42d6b9..0000000 --- a/vendor/github.com/gin-gonic/gin/path.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2013 Julien Schmidt. All rights reserved. -// Based on the path package, Copyright 2009 The Go Authors. -// Use of this source code is governed by a BSD-style license that can be found -// at https://github.com/julienschmidt/httprouter/blob/master/LICENSE. - -package gin - -// cleanPath is the URL version of path.Clean, it returns a canonical URL path -// for p, eliminating . and .. elements. -// -// The following rules are applied iteratively until no further processing can -// be done: -// 1. Replace multiple slashes with a single slash. -// 2. Eliminate each . path name element (the current directory). -// 3. Eliminate each inner .. path name element (the parent directory) -// along with the non-.. element that precedes it. -// 4. Eliminate .. elements that begin a rooted path: -// that is, replace "/.." by "/" at the beginning of a path. -// -// If the result of this process is an empty string, "/" is returned. -func cleanPath(p string) string { - const stackBufSize = 128 - // Turn empty string into "/" - if p == "" { - return "/" - } - - // Reasonably sized buffer on stack to avoid allocations in the common case. - // If a larger buffer is required, it gets allocated dynamically. - buf := make([]byte, 0, stackBufSize) - - n := len(p) - - // Invariants: - // reading from path; r is index of next byte to process. - // writing to buf; w is index of next byte to write. - - // path must start with '/' - r := 1 - w := 1 - - if p[0] != '/' { - r = 0 - - if n+1 > stackBufSize { - buf = make([]byte, n+1) - } else { - buf = buf[:n+1] - } - buf[0] = '/' - } - - trailing := n > 1 && p[n-1] == '/' - - // A bit more clunky without a 'lazybuf' like the path package, but the loop - // gets completely inlined (bufApp calls). - // loop has no expensive function calls (except 1x make) // So in contrast to the path package this loop has no expensive function - // calls (except make, if needed). - - for r < n { - switch { - case p[r] == '/': - // empty path element, trailing slash is added after the end - r++ - - case p[r] == '.' && r+1 == n: - trailing = true - r++ - - case p[r] == '.' && p[r+1] == '/': - // . element - r += 2 - - case p[r] == '.' && p[r+1] == '.' && (r+2 == n || p[r+2] == '/'): - // .. element: remove to last / - r += 3 - - if w > 1 { - // can backtrack - w-- - - if len(buf) == 0 { - for w > 1 && p[w] != '/' { - w-- - } - } else { - for w > 1 && buf[w] != '/' { - w-- - } - } - } - - default: - // Real path element. - // Add slash if needed - if w > 1 { - bufApp(&buf, p, w, '/') - w++ - } - - // Copy element - for r < n && p[r] != '/' { - bufApp(&buf, p, w, p[r]) - w++ - r++ - } - } - } - - // Re-append trailing slash - if trailing && w > 1 { - bufApp(&buf, p, w, '/') - w++ - } - - // If the original string was not modified (or only shortened at the end), - // return the respective substring of the original string. - // Otherwise return a new string from the buffer. - if len(buf) == 0 { - return p[:w] - } - return string(buf[:w]) -} - -// Internal helper to lazily create a buffer if necessary. -// Calls to this function get inlined. -func bufApp(buf *[]byte, s string, w int, c byte) { - b := *buf - if len(b) == 0 { - // No modification of the original string so far. - // If the next character is the same as in the original string, we do - // not yet have to allocate a buffer. - if s[w] == c { - return - } - - // Otherwise use either the stack buffer, if it is large enough, or - // allocate a new buffer on the heap, and copy all previous characters. - length := len(s) - if length > cap(b) { - *buf = make([]byte, length) - } else { - *buf = (*buf)[:length] - } - b = *buf - - copy(b, s[:w]) - } - b[w] = c -} diff --git a/vendor/github.com/gin-gonic/gin/recovery.go b/vendor/github.com/gin-gonic/gin/recovery.go deleted file mode 100644 index 563f5aa..0000000 --- a/vendor/github.com/gin-gonic/gin/recovery.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "log" - "net" - "net/http" - "net/http/httputil" - "os" - "runtime" - "strings" - "time" -) - -var ( - dunno = []byte("???") - centerDot = []byte("·") - dot = []byte(".") - slash = []byte("/") -) - -// RecoveryFunc defines the function passable to CustomRecovery. -type RecoveryFunc func(c *Context, err interface{}) - -// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one. -func Recovery() HandlerFunc { - return RecoveryWithWriter(DefaultErrorWriter) -} - -//CustomRecovery returns a middleware that recovers from any panics and calls the provided handle func to handle it. -func CustomRecovery(handle RecoveryFunc) HandlerFunc { - return RecoveryWithWriter(DefaultErrorWriter, handle) -} - -// RecoveryWithWriter returns a middleware for a given writer that recovers from any panics and writes a 500 if there was one. -func RecoveryWithWriter(out io.Writer, recovery ...RecoveryFunc) HandlerFunc { - if len(recovery) > 0 { - return CustomRecoveryWithWriter(out, recovery[0]) - } - return CustomRecoveryWithWriter(out, defaultHandleRecovery) -} - -// CustomRecoveryWithWriter returns a middleware for a given writer that recovers from any panics and calls the provided handle func to handle it. -func CustomRecoveryWithWriter(out io.Writer, handle RecoveryFunc) HandlerFunc { - var logger *log.Logger - if out != nil { - logger = log.New(out, "\n\n\x1b[31m", log.LstdFlags) - } - return func(c *Context) { - defer func() { - if err := recover(); err != nil { - // Check for a broken connection, as it is not really a - // condition that warrants a panic stack trace. - var brokenPipe bool - if ne, ok := err.(*net.OpError); ok { - if se, ok := ne.Err.(*os.SyscallError); ok { - if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") { - brokenPipe = true - } - } - } - if logger != nil { - stack := stack(3) - httpRequest, _ := httputil.DumpRequest(c.Request, false) - headers := strings.Split(string(httpRequest), "\r\n") - for idx, header := range headers { - current := strings.Split(header, ":") - if current[0] == "Authorization" { - headers[idx] = current[0] + ": *" - } - } - headersToStr := strings.Join(headers, "\r\n") - if brokenPipe { - logger.Printf("%s\n%s%s", err, headersToStr, reset) - } else if IsDebugging() { - logger.Printf("[Recovery] %s panic recovered:\n%s\n%s\n%s%s", - timeFormat(time.Now()), headersToStr, err, stack, reset) - } else { - logger.Printf("[Recovery] %s panic recovered:\n%s\n%s%s", - timeFormat(time.Now()), err, stack, reset) - } - } - if brokenPipe { - // If the connection is dead, we can't write a status to it. - c.Error(err.(error)) // nolint: errcheck - c.Abort() - } else { - handle(c, err) - } - } - }() - c.Next() - } -} - -func defaultHandleRecovery(c *Context, err interface{}) { - c.AbortWithStatus(http.StatusInternalServerError) -} - -// stack returns a nicely formatted stack frame, skipping skip frames. -func stack(skip int) []byte { - buf := new(bytes.Buffer) // the returned data - // As we loop, we open files and read them. These variables record the currently - // loaded file. - var lines [][]byte - var lastFile string - for i := skip; ; i++ { // Skip the expected number of frames - pc, file, line, ok := runtime.Caller(i) - if !ok { - break - } - // Print this much at least. If we can't find the source, it won't show. - fmt.Fprintf(buf, "%s:%d (0x%x)\n", file, line, pc) - if file != lastFile { - data, err := ioutil.ReadFile(file) - if err != nil { - continue - } - lines = bytes.Split(data, []byte{'\n'}) - lastFile = file - } - fmt.Fprintf(buf, "\t%s: %s\n", function(pc), source(lines, line)) - } - return buf.Bytes() -} - -// source returns a space-trimmed slice of the n'th line. -func source(lines [][]byte, n int) []byte { - n-- // in stack trace, lines are 1-indexed but our array is 0-indexed - if n < 0 || n >= len(lines) { - return dunno - } - return bytes.TrimSpace(lines[n]) -} - -// function returns, if possible, the name of the function containing the PC. -func function(pc uintptr) []byte { - fn := runtime.FuncForPC(pc) - if fn == nil { - return dunno - } - name := []byte(fn.Name()) - // The name includes the path name to the package, which is unnecessary - // since the file name is already included. Plus, it has center dots. - // That is, we see - // runtime/debug.*T·ptrmethod - // and want - // *T.ptrmethod - // Also the package path might contains dot (e.g. code.google.com/...), - // so first eliminate the path prefix - if lastSlash := bytes.LastIndex(name, slash); lastSlash >= 0 { - name = name[lastSlash+1:] - } - if period := bytes.Index(name, dot); period >= 0 { - name = name[period+1:] - } - name = bytes.Replace(name, centerDot, dot, -1) - return name -} - -func timeFormat(t time.Time) string { - timeString := t.Format("2006/01/02 - 15:04:05") - return timeString -} diff --git a/vendor/github.com/gin-gonic/gin/render/data.go b/vendor/github.com/gin-gonic/gin/render/data.go deleted file mode 100644 index 6ba657b..0000000 --- a/vendor/github.com/gin-gonic/gin/render/data.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import "net/http" - -// Data contains ContentType and bytes data. -type Data struct { - ContentType string - Data []byte -} - -// Render (Data) writes data with custom ContentType. -func (r Data) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - _, err = w.Write(r.Data) - return -} - -// WriteContentType (Data) writes custom ContentType. -func (r Data) WriteContentType(w http.ResponseWriter) { - writeContentType(w, []string{r.ContentType}) -} diff --git a/vendor/github.com/gin-gonic/gin/render/html.go b/vendor/github.com/gin-gonic/gin/render/html.go deleted file mode 100644 index 6696ece..0000000 --- a/vendor/github.com/gin-gonic/gin/render/html.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "html/template" - "net/http" -) - -// Delims represents a set of Left and Right delimiters for HTML template rendering. -type Delims struct { - // Left delimiter, defaults to {{. - Left string - // Right delimiter, defaults to }}. - Right string -} - -// HTMLRender interface is to be implemented by HTMLProduction and HTMLDebug. -type HTMLRender interface { - // Instance returns an HTML instance. - Instance(string, interface{}) Render -} - -// HTMLProduction contains template reference and its delims. -type HTMLProduction struct { - Template *template.Template - Delims Delims -} - -// HTMLDebug contains template delims and pattern and function with file list. -type HTMLDebug struct { - Files []string - Glob string - Delims Delims - FuncMap template.FuncMap -} - -// HTML contains template reference and its name with given interface object. -type HTML struct { - Template *template.Template - Name string - Data interface{} -} - -var htmlContentType = []string{"text/html; charset=utf-8"} - -// Instance (HTMLProduction) returns an HTML instance which it realizes Render interface. -func (r HTMLProduction) Instance(name string, data interface{}) Render { - return HTML{ - Template: r.Template, - Name: name, - Data: data, - } -} - -// Instance (HTMLDebug) returns an HTML instance which it realizes Render interface. -func (r HTMLDebug) Instance(name string, data interface{}) Render { - return HTML{ - Template: r.loadTemplate(), - Name: name, - Data: data, - } -} -func (r HTMLDebug) loadTemplate() *template.Template { - if r.FuncMap == nil { - r.FuncMap = template.FuncMap{} - } - if len(r.Files) > 0 { - return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseFiles(r.Files...)) - } - if r.Glob != "" { - return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseGlob(r.Glob)) - } - panic("the HTML debug render was created without files or glob pattern") -} - -// Render (HTML) executes template and writes its result with custom ContentType for response. -func (r HTML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - if r.Name == "" { - return r.Template.Execute(w, r.Data) - } - return r.Template.ExecuteTemplate(w, r.Name, r.Data) -} - -// WriteContentType (HTML) writes HTML ContentType. -func (r HTML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, htmlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/json.go b/vendor/github.com/gin-gonic/gin/render/json.go deleted file mode 100644 index 4186309..0000000 --- a/vendor/github.com/gin-gonic/gin/render/json.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "bytes" - "fmt" - "html/template" - "net/http" - - "github.com/gin-gonic/gin/internal/bytesconv" - "github.com/gin-gonic/gin/internal/json" -) - -// JSON contains the given interface object. -type JSON struct { - Data interface{} -} - -// IndentedJSON contains the given interface object. -type IndentedJSON struct { - Data interface{} -} - -// SecureJSON contains the given interface object and its prefix. -type SecureJSON struct { - Prefix string - Data interface{} -} - -// JsonpJSON contains the given interface object its callback. -type JsonpJSON struct { - Callback string - Data interface{} -} - -// AsciiJSON contains the given interface object. -type AsciiJSON struct { - Data interface{} -} - -// PureJSON contains the given interface object. -type PureJSON struct { - Data interface{} -} - -var jsonContentType = []string{"application/json; charset=utf-8"} -var jsonpContentType = []string{"application/javascript; charset=utf-8"} -var jsonAsciiContentType = []string{"application/json"} - -// Render (JSON) writes data with custom ContentType. -func (r JSON) Render(w http.ResponseWriter) (err error) { - if err = WriteJSON(w, r.Data); err != nil { - panic(err) - } - return -} - -// WriteContentType (JSON) writes JSON ContentType. -func (r JSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// WriteJSON marshals the given interface object and writes it with custom ContentType. -func WriteJSON(w http.ResponseWriter, obj interface{}) error { - writeContentType(w, jsonContentType) - jsonBytes, err := json.Marshal(obj) - if err != nil { - return err - } - _, err = w.Write(jsonBytes) - return err -} - -// Render (IndentedJSON) marshals the given interface object and writes it with custom ContentType. -func (r IndentedJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - jsonBytes, err := json.MarshalIndent(r.Data, "", " ") - if err != nil { - return err - } - _, err = w.Write(jsonBytes) - return err -} - -// WriteContentType (IndentedJSON) writes JSON ContentType. -func (r IndentedJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// Render (SecureJSON) marshals the given interface object and writes it with custom ContentType. -func (r SecureJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - jsonBytes, err := json.Marshal(r.Data) - if err != nil { - return err - } - // if the jsonBytes is array values - if bytes.HasPrefix(jsonBytes, bytesconv.StringToBytes("[")) && bytes.HasSuffix(jsonBytes, - bytesconv.StringToBytes("]")) { - _, err = w.Write(bytesconv.StringToBytes(r.Prefix)) - if err != nil { - return err - } - } - _, err = w.Write(jsonBytes) - return err -} - -// WriteContentType (SecureJSON) writes JSON ContentType. -func (r SecureJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// Render (JsonpJSON) marshals the given interface object and writes it and its callback with custom ContentType. -func (r JsonpJSON) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - ret, err := json.Marshal(r.Data) - if err != nil { - return err - } - - if r.Callback == "" { - _, err = w.Write(ret) - return err - } - - callback := template.JSEscapeString(r.Callback) - _, err = w.Write(bytesconv.StringToBytes(callback)) - if err != nil { - return err - } - _, err = w.Write(bytesconv.StringToBytes("(")) - if err != nil { - return err - } - _, err = w.Write(ret) - if err != nil { - return err - } - _, err = w.Write(bytesconv.StringToBytes(");")) - if err != nil { - return err - } - - return nil -} - -// WriteContentType (JsonpJSON) writes Javascript ContentType. -func (r JsonpJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonpContentType) -} - -// Render (AsciiJSON) marshals the given interface object and writes it with custom ContentType. -func (r AsciiJSON) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - ret, err := json.Marshal(r.Data) - if err != nil { - return err - } - - var buffer bytes.Buffer - for _, r := range bytesconv.BytesToString(ret) { - cvt := string(r) - if r >= 128 { - cvt = fmt.Sprintf("\\u%04x", int64(r)) - } - buffer.WriteString(cvt) - } - - _, err = w.Write(buffer.Bytes()) - return err -} - -// WriteContentType (AsciiJSON) writes JSON ContentType. -func (r AsciiJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonAsciiContentType) -} - -// Render (PureJSON) writes custom ContentType and encodes the given interface object. -func (r PureJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - encoder := json.NewEncoder(w) - encoder.SetEscapeHTML(false) - return encoder.Encode(r.Data) -} - -// WriteContentType (PureJSON) writes custom ContentType. -func (r PureJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/msgpack.go b/vendor/github.com/gin-gonic/gin/render/msgpack.go deleted file mode 100644 index 6ef5b6e..0000000 --- a/vendor/github.com/gin-gonic/gin/render/msgpack.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -//go:build !nomsgpack -// +build !nomsgpack - -package render - -import ( - "net/http" - - "github.com/ugorji/go/codec" -) - -var ( - _ Render = MsgPack{} -) - -// MsgPack contains the given interface object. -type MsgPack struct { - Data interface{} -} - -var msgpackContentType = []string{"application/msgpack; charset=utf-8"} - -// WriteContentType (MsgPack) writes MsgPack ContentType. -func (r MsgPack) WriteContentType(w http.ResponseWriter) { - writeContentType(w, msgpackContentType) -} - -// Render (MsgPack) encodes the given interface object and writes data with custom ContentType. -func (r MsgPack) Render(w http.ResponseWriter) error { - return WriteMsgPack(w, r.Data) -} - -// WriteMsgPack writes MsgPack ContentType and encodes the given interface object. -func WriteMsgPack(w http.ResponseWriter, obj interface{}) error { - writeContentType(w, msgpackContentType) - var mh codec.MsgpackHandle - return codec.NewEncoder(w, &mh).Encode(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/render/protobuf.go b/vendor/github.com/gin-gonic/gin/render/protobuf.go deleted file mode 100644 index 15aca99..0000000 --- a/vendor/github.com/gin-gonic/gin/render/protobuf.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "net/http" - - "github.com/golang/protobuf/proto" -) - -// ProtoBuf contains the given interface object. -type ProtoBuf struct { - Data interface{} -} - -var protobufContentType = []string{"application/x-protobuf"} - -// Render (ProtoBuf) marshals the given interface object and writes data with custom ContentType. -func (r ProtoBuf) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - bytes, err := proto.Marshal(r.Data.(proto.Message)) - if err != nil { - return err - } - - _, err = w.Write(bytes) - return err -} - -// WriteContentType (ProtoBuf) writes ProtoBuf ContentType. -func (r ProtoBuf) WriteContentType(w http.ResponseWriter) { - writeContentType(w, protobufContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/reader.go b/vendor/github.com/gin-gonic/gin/render/reader.go deleted file mode 100644 index d5282e4..0000000 --- a/vendor/github.com/gin-gonic/gin/render/reader.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "io" - "net/http" - "strconv" -) - -// Reader contains the IO reader and its length, and custom ContentType and other headers. -type Reader struct { - ContentType string - ContentLength int64 - Reader io.Reader - Headers map[string]string -} - -// Render (Reader) writes data with custom ContentType and headers. -func (r Reader) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - if r.ContentLength >= 0 { - if r.Headers == nil { - r.Headers = map[string]string{} - } - r.Headers["Content-Length"] = strconv.FormatInt(r.ContentLength, 10) - } - r.writeHeaders(w, r.Headers) - _, err = io.Copy(w, r.Reader) - return -} - -// WriteContentType (Reader) writes custom ContentType. -func (r Reader) WriteContentType(w http.ResponseWriter) { - writeContentType(w, []string{r.ContentType}) -} - -// writeHeaders writes custom Header. -func (r Reader) writeHeaders(w http.ResponseWriter, headers map[string]string) { - header := w.Header() - for k, v := range headers { - if header.Get(k) == "" { - header.Set(k, v) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/render/redirect.go b/vendor/github.com/gin-gonic/gin/render/redirect.go deleted file mode 100644 index c006691..0000000 --- a/vendor/github.com/gin-gonic/gin/render/redirect.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "fmt" - "net/http" -) - -// Redirect contains the http request reference and redirects status code and location. -type Redirect struct { - Code int - Request *http.Request - Location string -} - -// Render (Redirect) redirects the http request to new location and writes redirect response. -func (r Redirect) Render(w http.ResponseWriter) error { - if (r.Code < http.StatusMultipleChoices || r.Code > http.StatusPermanentRedirect) && r.Code != http.StatusCreated { - panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code)) - } - http.Redirect(w, r.Request, r.Location, r.Code) - return nil -} - -// WriteContentType (Redirect) don't write any ContentType. -func (r Redirect) WriteContentType(http.ResponseWriter) {} diff --git a/vendor/github.com/gin-gonic/gin/render/render.go b/vendor/github.com/gin-gonic/gin/render/render.go deleted file mode 100644 index bcd568b..0000000 --- a/vendor/github.com/gin-gonic/gin/render/render.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import "net/http" - -// Render interface is to be implemented by JSON, XML, HTML, YAML and so on. -type Render interface { - // Render writes data with custom ContentType. - Render(http.ResponseWriter) error - // WriteContentType writes custom ContentType. - WriteContentType(w http.ResponseWriter) -} - -var ( - _ Render = JSON{} - _ Render = IndentedJSON{} - _ Render = SecureJSON{} - _ Render = JsonpJSON{} - _ Render = XML{} - _ Render = String{} - _ Render = Redirect{} - _ Render = Data{} - _ Render = HTML{} - _ HTMLRender = HTMLDebug{} - _ HTMLRender = HTMLProduction{} - _ Render = YAML{} - _ Render = Reader{} - _ Render = AsciiJSON{} - _ Render = ProtoBuf{} -) - -func writeContentType(w http.ResponseWriter, value []string) { - header := w.Header() - if val := header["Content-Type"]; len(val) == 0 { - header["Content-Type"] = value - } -} diff --git a/vendor/github.com/gin-gonic/gin/render/text.go b/vendor/github.com/gin-gonic/gin/render/text.go deleted file mode 100644 index 461b720..0000000 --- a/vendor/github.com/gin-gonic/gin/render/text.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "fmt" - "net/http" - - "github.com/gin-gonic/gin/internal/bytesconv" -) - -// String contains the given interface object slice and its format. -type String struct { - Format string - Data []interface{} -} - -var plainContentType = []string{"text/plain; charset=utf-8"} - -// Render (String) writes data with custom ContentType. -func (r String) Render(w http.ResponseWriter) error { - return WriteString(w, r.Format, r.Data) -} - -// WriteContentType (String) writes Plain ContentType. -func (r String) WriteContentType(w http.ResponseWriter) { - writeContentType(w, plainContentType) -} - -// WriteString writes data according to its format and write custom ContentType. -func WriteString(w http.ResponseWriter, format string, data []interface{}) (err error) { - writeContentType(w, plainContentType) - if len(data) > 0 { - _, err = fmt.Fprintf(w, format, data...) - return - } - _, err = w.Write(bytesconv.StringToBytes(format)) - return -} diff --git a/vendor/github.com/gin-gonic/gin/render/xml.go b/vendor/github.com/gin-gonic/gin/render/xml.go deleted file mode 100644 index cc5390a..0000000 --- a/vendor/github.com/gin-gonic/gin/render/xml.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "encoding/xml" - "net/http" -) - -// XML contains the given interface object. -type XML struct { - Data interface{} -} - -var xmlContentType = []string{"application/xml; charset=utf-8"} - -// Render (XML) encodes the given interface object and writes data with custom ContentType. -func (r XML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - return xml.NewEncoder(w).Encode(r.Data) -} - -// WriteContentType (XML) writes XML ContentType for response. -func (r XML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, xmlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/yaml.go b/vendor/github.com/gin-gonic/gin/render/yaml.go deleted file mode 100644 index 0df7836..0000000 --- a/vendor/github.com/gin-gonic/gin/render/yaml.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "net/http" - - "gopkg.in/yaml.v2" -) - -// YAML contains the given interface object. -type YAML struct { - Data interface{} -} - -var yamlContentType = []string{"application/x-yaml; charset=utf-8"} - -// Render (YAML) marshals the given interface object and writes data with custom ContentType. -func (r YAML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - bytes, err := yaml.Marshal(r.Data) - if err != nil { - return err - } - - _, err = w.Write(bytes) - return err -} - -// WriteContentType (YAML) writes YAML ContentType for response. -func (r YAML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, yamlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/response_writer.go b/vendor/github.com/gin-gonic/gin/response_writer.go deleted file mode 100644 index 2682668..0000000 --- a/vendor/github.com/gin-gonic/gin/response_writer.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bufio" - "io" - "net" - "net/http" -) - -const ( - noWritten = -1 - defaultStatus = http.StatusOK -) - -// ResponseWriter ... -type ResponseWriter interface { - http.ResponseWriter - http.Hijacker - http.Flusher - http.CloseNotifier - - // Returns the HTTP response status code of the current request. - Status() int - - // Returns the number of bytes already written into the response http body. - // See Written() - Size() int - - // Writes the string into the response body. - WriteString(string) (int, error) - - // Returns true if the response body was already written. - Written() bool - - // Forces to write the http header (status code + headers). - WriteHeaderNow() - - // get the http.Pusher for server push - Pusher() http.Pusher -} - -type responseWriter struct { - http.ResponseWriter - size int - status int -} - -var _ ResponseWriter = &responseWriter{} - -func (w *responseWriter) reset(writer http.ResponseWriter) { - w.ResponseWriter = writer - w.size = noWritten - w.status = defaultStatus -} - -func (w *responseWriter) WriteHeader(code int) { - if code > 0 && w.status != code { - if w.Written() { - debugPrint("[WARNING] Headers were already written. Wanted to override status code %d with %d", w.status, code) - } - w.status = code - } -} - -func (w *responseWriter) WriteHeaderNow() { - if !w.Written() { - w.size = 0 - w.ResponseWriter.WriteHeader(w.status) - } -} - -func (w *responseWriter) Write(data []byte) (n int, err error) { - w.WriteHeaderNow() - n, err = w.ResponseWriter.Write(data) - w.size += n - return -} - -func (w *responseWriter) WriteString(s string) (n int, err error) { - w.WriteHeaderNow() - n, err = io.WriteString(w.ResponseWriter, s) - w.size += n - return -} - -func (w *responseWriter) Status() int { - return w.status -} - -func (w *responseWriter) Size() int { - return w.size -} - -func (w *responseWriter) Written() bool { - return w.size != noWritten -} - -// Hijack implements the http.Hijacker interface. -func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - if w.size < 0 { - w.size = 0 - } - return w.ResponseWriter.(http.Hijacker).Hijack() -} - -// CloseNotify implements the http.CloseNotify interface. -func (w *responseWriter) CloseNotify() <-chan bool { - return w.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - -// Flush implements the http.Flush interface. -func (w *responseWriter) Flush() { - w.WriteHeaderNow() - w.ResponseWriter.(http.Flusher).Flush() -} - -func (w *responseWriter) Pusher() (pusher http.Pusher) { - if pusher, ok := w.ResponseWriter.(http.Pusher); ok { - return pusher - } - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/routergroup.go b/vendor/github.com/gin-gonic/gin/routergroup.go deleted file mode 100644 index 15d9930..0000000 --- a/vendor/github.com/gin-gonic/gin/routergroup.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "net/http" - "path" - "regexp" - "strings" -) - -// IRouter defines all router handle interface includes single and group router. -type IRouter interface { - IRoutes - Group(string, ...HandlerFunc) *RouterGroup -} - -// IRoutes defines all router handle interface. -type IRoutes interface { - Use(...HandlerFunc) IRoutes - - Handle(string, string, ...HandlerFunc) IRoutes - Any(string, ...HandlerFunc) IRoutes - GET(string, ...HandlerFunc) IRoutes - POST(string, ...HandlerFunc) IRoutes - DELETE(string, ...HandlerFunc) IRoutes - PATCH(string, ...HandlerFunc) IRoutes - PUT(string, ...HandlerFunc) IRoutes - OPTIONS(string, ...HandlerFunc) IRoutes - HEAD(string, ...HandlerFunc) IRoutes - - StaticFile(string, string) IRoutes - Static(string, string) IRoutes - StaticFS(string, http.FileSystem) IRoutes -} - -// RouterGroup is used internally to configure router, a RouterGroup is associated with -// a prefix and an array of handlers (middleware). -type RouterGroup struct { - Handlers HandlersChain - basePath string - engine *Engine - root bool -} - -var _ IRouter = &RouterGroup{} - -// Use adds middleware to the group, see example code in GitHub. -func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes { - group.Handlers = append(group.Handlers, middleware...) - return group.returnObj() -} - -// Group creates a new router group. You should add all the routes that have common middlewares or the same path prefix. -// For example, all the routes that use a common middleware for authorization could be grouped. -func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup { - return &RouterGroup{ - Handlers: group.combineHandlers(handlers), - basePath: group.calculateAbsolutePath(relativePath), - engine: group.engine, - } -} - -// BasePath returns the base path of router group. -// For example, if v := router.Group("/rest/n/v1/api"), v.BasePath() is "/rest/n/v1/api". -func (group *RouterGroup) BasePath() string { - return group.basePath -} - -func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes { - absolutePath := group.calculateAbsolutePath(relativePath) - handlers = group.combineHandlers(handlers) - group.engine.addRoute(httpMethod, absolutePath, handlers) - return group.returnObj() -} - -// Handle registers a new request handle and middleware with the given path and method. -// The last handler should be the real handler, the other ones should be middleware that can and should be shared among different routes. -// See the example code in GitHub. -// -// For GET, POST, PUT, PATCH and DELETE requests the respective shortcut -// functions can be used. -// -// This function is intended for bulk loading and to allow the usage of less -// frequently used, non-standardized or custom methods (e.g. for internal -// communication with a proxy). -func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers ...HandlerFunc) IRoutes { - if matches, err := regexp.MatchString("^[A-Z]+$", httpMethod); !matches || err != nil { - panic("http method " + httpMethod + " is not valid") - } - return group.handle(httpMethod, relativePath, handlers) -} - -// POST is a shortcut for router.Handle("POST", path, handle). -func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodPost, relativePath, handlers) -} - -// GET is a shortcut for router.Handle("GET", path, handle). -func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodGet, relativePath, handlers) -} - -// DELETE is a shortcut for router.Handle("DELETE", path, handle). -func (group *RouterGroup) DELETE(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodDelete, relativePath, handlers) -} - -// PATCH is a shortcut for router.Handle("PATCH", path, handle). -func (group *RouterGroup) PATCH(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodPatch, relativePath, handlers) -} - -// PUT is a shortcut for router.Handle("PUT", path, handle). -func (group *RouterGroup) PUT(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodPut, relativePath, handlers) -} - -// OPTIONS is a shortcut for router.Handle("OPTIONS", path, handle). -func (group *RouterGroup) OPTIONS(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodOptions, relativePath, handlers) -} - -// HEAD is a shortcut for router.Handle("HEAD", path, handle). -func (group *RouterGroup) HEAD(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodHead, relativePath, handlers) -} - -// Any registers a route that matches all the HTTP methods. -// GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE. -func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) IRoutes { - group.handle(http.MethodGet, relativePath, handlers) - group.handle(http.MethodPost, relativePath, handlers) - group.handle(http.MethodPut, relativePath, handlers) - group.handle(http.MethodPatch, relativePath, handlers) - group.handle(http.MethodHead, relativePath, handlers) - group.handle(http.MethodOptions, relativePath, handlers) - group.handle(http.MethodDelete, relativePath, handlers) - group.handle(http.MethodConnect, relativePath, handlers) - group.handle(http.MethodTrace, relativePath, handlers) - return group.returnObj() -} - -// StaticFile registers a single route in order to serve a single file of the local filesystem. -// router.StaticFile("favicon.ico", "./resources/favicon.ico") -func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes { - if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") { - panic("URL parameters can not be used when serving a static file") - } - handler := func(c *Context) { - c.File(filepath) - } - group.GET(relativePath, handler) - group.HEAD(relativePath, handler) - return group.returnObj() -} - -// Static serves files from the given file system root. -// Internally a http.FileServer is used, therefore http.NotFound is used instead -// of the Router's NotFound handler. -// To use the operating system's file system implementation, -// use : -// router.Static("/static", "/var/www") -func (group *RouterGroup) Static(relativePath, root string) IRoutes { - return group.StaticFS(relativePath, Dir(root, false)) -} - -// StaticFS works just like `Static()` but a custom `http.FileSystem` can be used instead. -// Gin by default user: gin.Dir() -func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes { - if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") { - panic("URL parameters can not be used when serving a static folder") - } - handler := group.createStaticHandler(relativePath, fs) - urlPattern := path.Join(relativePath, "/*filepath") - - // Register GET and HEAD handlers - group.GET(urlPattern, handler) - group.HEAD(urlPattern, handler) - return group.returnObj() -} - -func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) HandlerFunc { - absolutePath := group.calculateAbsolutePath(relativePath) - fileServer := http.StripPrefix(absolutePath, http.FileServer(fs)) - - return func(c *Context) { - if _, noListing := fs.(*onlyFilesFS); noListing { - c.Writer.WriteHeader(http.StatusNotFound) - } - - file := c.Param("filepath") - // Check if file exists and/or if we have permission to access it - f, err := fs.Open(file) - if err != nil { - c.Writer.WriteHeader(http.StatusNotFound) - c.handlers = group.engine.noRoute - // Reset index - c.index = -1 - return - } - f.Close() - - fileServer.ServeHTTP(c.Writer, c.Request) - } -} - -func (group *RouterGroup) combineHandlers(handlers HandlersChain) HandlersChain { - finalSize := len(group.Handlers) + len(handlers) - if finalSize >= int(abortIndex) { - panic("too many handlers") - } - mergedHandlers := make(HandlersChain, finalSize) - copy(mergedHandlers, group.Handlers) - copy(mergedHandlers[len(group.Handlers):], handlers) - return mergedHandlers -} - -func (group *RouterGroup) calculateAbsolutePath(relativePath string) string { - return joinPaths(group.basePath, relativePath) -} - -func (group *RouterGroup) returnObj() IRoutes { - if group.root { - return group.engine - } - return group -} diff --git a/vendor/github.com/gin-gonic/gin/test_helpers.go b/vendor/github.com/gin-gonic/gin/test_helpers.go deleted file mode 100644 index 3a7a5dd..0000000 --- a/vendor/github.com/gin-gonic/gin/test_helpers.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import "net/http" - -// CreateTestContext returns a fresh engine and context for testing purposes -func CreateTestContext(w http.ResponseWriter) (c *Context, r *Engine) { - r = New() - c = r.allocateContext() - c.reset() - c.writermem.reset(w) - return -} diff --git a/vendor/github.com/gin-gonic/gin/tree.go b/vendor/github.com/gin-gonic/gin/tree.go deleted file mode 100644 index ca753e6..0000000 --- a/vendor/github.com/gin-gonic/gin/tree.go +++ /dev/null @@ -1,777 +0,0 @@ -// Copyright 2013 Julien Schmidt. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be found -// at https://github.com/julienschmidt/httprouter/blob/master/LICENSE - -package gin - -import ( - "bytes" - "net/url" - "strings" - "unicode" - "unicode/utf8" - - "github.com/gin-gonic/gin/internal/bytesconv" -) - -var ( - strColon = []byte(":") - strStar = []byte("*") -) - -// Param is a single URL parameter, consisting of a key and a value. -type Param struct { - Key string - Value string -} - -// Params is a Param-slice, as returned by the router. -// The slice is ordered, the first URL parameter is also the first slice value. -// It is therefore safe to read values by the index. -type Params []Param - -// Get returns the value of the first Param which key matches the given name. -// If no matching Param is found, an empty string is returned. -func (ps Params) Get(name string) (string, bool) { - for _, entry := range ps { - if entry.Key == name { - return entry.Value, true - } - } - return "", false -} - -// ByName returns the value of the first Param which key matches the given name. -// If no matching Param is found, an empty string is returned. -func (ps Params) ByName(name string) (va string) { - va, _ = ps.Get(name) - return -} - -type methodTree struct { - method string - root *node -} - -type methodTrees []methodTree - -func (trees methodTrees) get(method string) *node { - for _, tree := range trees { - if tree.method == method { - return tree.root - } - } - return nil -} - -func min(a, b int) int { - if a <= b { - return a - } - return b -} - -func longestCommonPrefix(a, b string) int { - i := 0 - max := min(len(a), len(b)) - for i < max && a[i] == b[i] { - i++ - } - return i -} - -// addChild will add a child node, keeping wildcards at the end -func (n *node) addChild(child *node) { - if n.wildChild && len(n.children) > 0 { - wildcardChild := n.children[len(n.children)-1] - n.children = append(n.children[:len(n.children)-1], child, wildcardChild) - } else { - n.children = append(n.children, child) - } -} - -func countParams(path string) uint16 { - var n uint16 - s := bytesconv.StringToBytes(path) - n += uint16(bytes.Count(s, strColon)) - n += uint16(bytes.Count(s, strStar)) - return n -} - -type nodeType uint8 - -const ( - static nodeType = iota // default - root - param - catchAll -) - -type node struct { - path string - indices string - wildChild bool - nType nodeType - priority uint32 - children []*node // child nodes, at most 1 :param style node at the end of the array - handlers HandlersChain - fullPath string -} - -// Increments priority of the given child and reorders if necessary -func (n *node) incrementChildPrio(pos int) int { - cs := n.children - cs[pos].priority++ - prio := cs[pos].priority - - // Adjust position (move to front) - newPos := pos - for ; newPos > 0 && cs[newPos-1].priority < prio; newPos-- { - // Swap node positions - cs[newPos-1], cs[newPos] = cs[newPos], cs[newPos-1] - } - - // Build new index char string - if newPos != pos { - n.indices = n.indices[:newPos] + // Unchanged prefix, might be empty - n.indices[pos:pos+1] + // The index char we move - n.indices[newPos:pos] + n.indices[pos+1:] // Rest without char at 'pos' - } - - return newPos -} - -// addRoute adds a node with the given handle to the path. -// Not concurrency-safe! -func (n *node) addRoute(path string, handlers HandlersChain) { - fullPath := path - n.priority++ - - // Empty tree - if len(n.path) == 0 && len(n.children) == 0 { - n.insertChild(path, fullPath, handlers) - n.nType = root - return - } - - parentFullPathIndex := 0 - -walk: - for { - // Find the longest common prefix. - // This also implies that the common prefix contains no ':' or '*' - // since the existing key can't contain those chars. - i := longestCommonPrefix(path, n.path) - - // Split edge - if i < len(n.path) { - child := node{ - path: n.path[i:], - wildChild: n.wildChild, - indices: n.indices, - children: n.children, - handlers: n.handlers, - priority: n.priority - 1, - fullPath: n.fullPath, - } - - n.children = []*node{&child} - // []byte for proper unicode char conversion, see #65 - n.indices = bytesconv.BytesToString([]byte{n.path[i]}) - n.path = path[:i] - n.handlers = nil - n.wildChild = false - n.fullPath = fullPath[:parentFullPathIndex+i] - } - - // Make new node a child of this node - if i < len(path) { - path = path[i:] - c := path[0] - - // '/' after param - if n.nType == param && c == '/' && len(n.children) == 1 { - parentFullPathIndex += len(n.path) - n = n.children[0] - n.priority++ - continue walk - } - - // Check if a child with the next path byte exists - for i, max := 0, len(n.indices); i < max; i++ { - if c == n.indices[i] { - parentFullPathIndex += len(n.path) - i = n.incrementChildPrio(i) - n = n.children[i] - continue walk - } - } - - // Otherwise insert it - if c != ':' && c != '*' && n.nType != catchAll { - // []byte for proper unicode char conversion, see #65 - n.indices += bytesconv.BytesToString([]byte{c}) - child := &node{ - fullPath: fullPath, - } - n.addChild(child) - n.incrementChildPrio(len(n.indices) - 1) - n = child - } else if n.wildChild { - // inserting a wildcard node, need to check if it conflicts with the existing wildcard - n = n.children[len(n.children)-1] - n.priority++ - - // Check if the wildcard matches - if len(path) >= len(n.path) && n.path == path[:len(n.path)] && - // Adding a child to a catchAll is not possible - n.nType != catchAll && - // Check for longer wildcard, e.g. :name and :names - (len(n.path) >= len(path) || path[len(n.path)] == '/') { - continue walk - } - - // Wildcard conflict - pathSeg := path - if n.nType != catchAll { - pathSeg = strings.SplitN(pathSeg, "/", 2)[0] - } - prefix := fullPath[:strings.Index(fullPath, pathSeg)] + n.path - panic("'" + pathSeg + - "' in new path '" + fullPath + - "' conflicts with existing wildcard '" + n.path + - "' in existing prefix '" + prefix + - "'") - } - - n.insertChild(path, fullPath, handlers) - return - } - - // Otherwise add handle to current node - if n.handlers != nil { - panic("handlers are already registered for path '" + fullPath + "'") - } - n.handlers = handlers - n.fullPath = fullPath - return - } -} - -// Search for a wildcard segment and check the name for invalid characters. -// Returns -1 as index, if no wildcard was found. -func findWildcard(path string) (wildcard string, i int, valid bool) { - // Find start - for start, c := range []byte(path) { - // A wildcard starts with ':' (param) or '*' (catch-all) - if c != ':' && c != '*' { - continue - } - - // Find end and check for invalid characters - valid = true - for end, c := range []byte(path[start+1:]) { - switch c { - case '/': - return path[start : start+1+end], start, valid - case ':', '*': - valid = false - } - } - return path[start:], start, valid - } - return "", -1, false -} - -func (n *node) insertChild(path string, fullPath string, handlers HandlersChain) { - for { - // Find prefix until first wildcard - wildcard, i, valid := findWildcard(path) - if i < 0 { // No wildcard found - break - } - - // The wildcard name must not contain ':' and '*' - if !valid { - panic("only one wildcard per path segment is allowed, has: '" + - wildcard + "' in path '" + fullPath + "'") - } - - // check if the wildcard has a name - if len(wildcard) < 2 { - panic("wildcards must be named with a non-empty name in path '" + fullPath + "'") - } - - if wildcard[0] == ':' { // param - if i > 0 { - // Insert prefix before the current wildcard - n.path = path[:i] - path = path[i:] - } - - child := &node{ - nType: param, - path: wildcard, - fullPath: fullPath, - } - n.addChild(child) - n.wildChild = true - n = child - n.priority++ - - // if the path doesn't end with the wildcard, then there - // will be another non-wildcard subpath starting with '/' - if len(wildcard) < len(path) { - path = path[len(wildcard):] - - child := &node{ - priority: 1, - fullPath: fullPath, - } - n.addChild(child) - n = child - continue - } - - // Otherwise we're done. Insert the handle in the new leaf - n.handlers = handlers - return - } - - // catchAll - if i+len(wildcard) != len(path) { - panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'") - } - - if len(n.path) > 0 && n.path[len(n.path)-1] == '/' { - panic("catch-all conflicts with existing handle for the path segment root in path '" + fullPath + "'") - } - - // currently fixed width 1 for '/' - i-- - if path[i] != '/' { - panic("no / before catch-all in path '" + fullPath + "'") - } - - n.path = path[:i] - - // First node: catchAll node with empty path - child := &node{ - wildChild: true, - nType: catchAll, - fullPath: fullPath, - } - - n.addChild(child) - n.indices = string('/') - n = child - n.priority++ - - // second node: node holding the variable - child = &node{ - path: path[i:], - nType: catchAll, - handlers: handlers, - priority: 1, - fullPath: fullPath, - } - n.children = []*node{child} - - return - } - - // If no wildcard was found, simply insert the path and handle - n.path = path - n.handlers = handlers - n.fullPath = fullPath -} - -// nodeValue holds return values of (*Node).getValue method -type nodeValue struct { - handlers HandlersChain - params *Params - tsr bool - fullPath string -} - -// Returns the handle registered with the given path (key). The values of -// wildcards are saved to a map. -// If no handle can be found, a TSR (trailing slash redirect) recommendation is -// made if a handle exists with an extra (without the) trailing slash for the -// given path. -func (n *node) getValue(path string, params *Params, unescape bool) (value nodeValue) { -walk: // Outer loop for walking the tree - for { - prefix := n.path - if len(path) > len(prefix) { - if path[:len(prefix)] == prefix { - path = path[len(prefix):] - - // Try all the non-wildcard children first by matching the indices - idxc := path[0] - for i, c := range []byte(n.indices) { - if c == idxc { - n = n.children[i] - continue walk - } - } - - // If there is no wildcard pattern, recommend a redirection - if !n.wildChild { - // Nothing found. - // We can recommend to redirect to the same URL without a - // trailing slash if a leaf exists for that path. - value.tsr = (path == "/" && n.handlers != nil) - return - } - - // Handle wildcard child, which is always at the end of the array - n = n.children[len(n.children)-1] - - switch n.nType { - case param: - // Find param end (either '/' or path end) - end := 0 - for end < len(path) && path[end] != '/' { - end++ - } - - // Save param value - if params != nil { - if value.params == nil { - value.params = params - } - // Expand slice within preallocated capacity - i := len(*value.params) - *value.params = (*value.params)[:i+1] - val := path[:end] - if unescape { - if v, err := url.QueryUnescape(val); err == nil { - val = v - } - } - (*value.params)[i] = Param{ - Key: n.path[1:], - Value: val, - } - } - - // we need to go deeper! - if end < len(path) { - if len(n.children) > 0 { - path = path[end:] - n = n.children[0] - continue walk - } - - // ... but we can't - value.tsr = (len(path) == end+1) - return - } - - if value.handlers = n.handlers; value.handlers != nil { - value.fullPath = n.fullPath - return - } - if len(n.children) == 1 { - // No handle found. Check if a handle for this path + a - // trailing slash exists for TSR recommendation - n = n.children[0] - value.tsr = (n.path == "/" && n.handlers != nil) - } - return - - case catchAll: - // Save param value - if params != nil { - if value.params == nil { - value.params = params - } - // Expand slice within preallocated capacity - i := len(*value.params) - *value.params = (*value.params)[:i+1] - val := path - if unescape { - if v, err := url.QueryUnescape(path); err == nil { - val = v - } - } - (*value.params)[i] = Param{ - Key: n.path[2:], - Value: val, - } - } - - value.handlers = n.handlers - value.fullPath = n.fullPath - return - - default: - panic("invalid node type") - } - } - } - - if path == prefix { - // We should have reached the node containing the handle. - // Check if this node has a handle registered. - if value.handlers = n.handlers; value.handlers != nil { - value.fullPath = n.fullPath - return - } - - // If there is no handle for this route, but this route has a - // wildcard child, there must be a handle for this path with an - // additional trailing slash - if path == "/" && n.wildChild && n.nType != root { - value.tsr = true - return - } - - // No handle found. Check if a handle for this path + a - // trailing slash exists for trailing slash recommendation - for i, c := range []byte(n.indices) { - if c == '/' { - n = n.children[i] - value.tsr = (len(n.path) == 1 && n.handlers != nil) || - (n.nType == catchAll && n.children[0].handlers != nil) - return - } - } - - return - } - - // Nothing found. We can recommend to redirect to the same URL with an - // extra trailing slash if a leaf exists for that path - value.tsr = (path == "/") || - (len(prefix) == len(path)+1 && prefix[len(path)] == '/' && - path == prefix[:len(prefix)-1] && n.handlers != nil) - return - } -} - -// Makes a case-insensitive lookup of the given path and tries to find a handler. -// It can optionally also fix trailing slashes. -// It returns the case-corrected path and a bool indicating whether the lookup -// was successful. -func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) ([]byte, bool) { - const stackBufSize = 128 - - // Use a static sized buffer on the stack in the common case. - // If the path is too long, allocate a buffer on the heap instead. - buf := make([]byte, 0, stackBufSize) - if length := len(path) + 1; length > stackBufSize { - buf = make([]byte, 0, length) - } - - ciPath := n.findCaseInsensitivePathRec( - path, - buf, // Preallocate enough memory for new path - [4]byte{}, // Empty rune buffer - fixTrailingSlash, - ) - - return ciPath, ciPath != nil -} - -// Shift bytes in array by n bytes left -func shiftNRuneBytes(rb [4]byte, n int) [4]byte { - switch n { - case 0: - return rb - case 1: - return [4]byte{rb[1], rb[2], rb[3], 0} - case 2: - return [4]byte{rb[2], rb[3]} - case 3: - return [4]byte{rb[3]} - default: - return [4]byte{} - } -} - -// Recursive case-insensitive lookup function used by n.findCaseInsensitivePath -func (n *node) findCaseInsensitivePathRec(path string, ciPath []byte, rb [4]byte, fixTrailingSlash bool) []byte { - npLen := len(n.path) - -walk: // Outer loop for walking the tree - for len(path) >= npLen && (npLen == 0 || strings.EqualFold(path[1:npLen], n.path[1:])) { - // Add common prefix to result - oldPath := path - path = path[npLen:] - ciPath = append(ciPath, n.path...) - - if len(path) == 0 { - // We should have reached the node containing the handle. - // Check if this node has a handle registered. - if n.handlers != nil { - return ciPath - } - - // No handle found. - // Try to fix the path by adding a trailing slash - if fixTrailingSlash { - for i, c := range []byte(n.indices) { - if c == '/' { - n = n.children[i] - if (len(n.path) == 1 && n.handlers != nil) || - (n.nType == catchAll && n.children[0].handlers != nil) { - return append(ciPath, '/') - } - return nil - } - } - } - return nil - } - - // If this node does not have a wildcard (param or catchAll) child, - // we can just look up the next child node and continue to walk down - // the tree - if !n.wildChild { - // Skip rune bytes already processed - rb = shiftNRuneBytes(rb, npLen) - - if rb[0] != 0 { - // Old rune not finished - idxc := rb[0] - for i, c := range []byte(n.indices) { - if c == idxc { - // continue with child node - n = n.children[i] - npLen = len(n.path) - continue walk - } - } - } else { - // Process a new rune - var rv rune - - // Find rune start. - // Runes are up to 4 byte long, - // -4 would definitely be another rune. - var off int - for max := min(npLen, 3); off < max; off++ { - if i := npLen - off; utf8.RuneStart(oldPath[i]) { - // read rune from cached path - rv, _ = utf8.DecodeRuneInString(oldPath[i:]) - break - } - } - - // Calculate lowercase bytes of current rune - lo := unicode.ToLower(rv) - utf8.EncodeRune(rb[:], lo) - - // Skip already processed bytes - rb = shiftNRuneBytes(rb, off) - - idxc := rb[0] - for i, c := range []byte(n.indices) { - // Lowercase matches - if c == idxc { - // must use a recursive approach since both the - // uppercase byte and the lowercase byte might exist - // as an index - if out := n.children[i].findCaseInsensitivePathRec( - path, ciPath, rb, fixTrailingSlash, - ); out != nil { - return out - } - break - } - } - - // If we found no match, the same for the uppercase rune, - // if it differs - if up := unicode.ToUpper(rv); up != lo { - utf8.EncodeRune(rb[:], up) - rb = shiftNRuneBytes(rb, off) - - idxc := rb[0] - for i, c := range []byte(n.indices) { - // Uppercase matches - if c == idxc { - // Continue with child node - n = n.children[i] - npLen = len(n.path) - continue walk - } - } - } - } - - // Nothing found. We can recommend to redirect to the same URL - // without a trailing slash if a leaf exists for that path - if fixTrailingSlash && path == "/" && n.handlers != nil { - return ciPath - } - return nil - } - - n = n.children[0] - switch n.nType { - case param: - // Find param end (either '/' or path end) - end := 0 - for end < len(path) && path[end] != '/' { - end++ - } - - // Add param value to case insensitive path - ciPath = append(ciPath, path[:end]...) - - // We need to go deeper! - if end < len(path) { - if len(n.children) > 0 { - // Continue with child node - n = n.children[0] - npLen = len(n.path) - path = path[end:] - continue - } - - // ... but we can't - if fixTrailingSlash && len(path) == end+1 { - return ciPath - } - return nil - } - - if n.handlers != nil { - return ciPath - } - - if fixTrailingSlash && len(n.children) == 1 { - // No handle found. Check if a handle for this path + a - // trailing slash exists - n = n.children[0] - if n.path == "/" && n.handlers != nil { - return append(ciPath, '/') - } - } - - return nil - - case catchAll: - return append(ciPath, path...) - - default: - panic("invalid node type") - } - } - - // Nothing found. - // Try to fix the path by adding / removing a trailing slash - if fixTrailingSlash { - if path == "/" { - return ciPath - } - if len(path)+1 == npLen && n.path[len(path)] == '/' && - strings.EqualFold(path[1:], n.path[1:len(path)]) && n.handlers != nil { - return append(ciPath, n.path...) - } - } - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/utils.go b/vendor/github.com/gin-gonic/gin/utils.go deleted file mode 100644 index c32f0ee..0000000 --- a/vendor/github.com/gin-gonic/gin/utils.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "encoding/xml" - "net/http" - "os" - "path" - "reflect" - "runtime" - "strings" -) - -// BindKey indicates a default bind key. -const BindKey = "_gin-gonic/gin/bindkey" - -// Bind is a helper function for given interface object and returns a Gin middleware. -func Bind(val interface{}) HandlerFunc { - value := reflect.ValueOf(val) - if value.Kind() == reflect.Ptr { - panic(`Bind struct can not be a pointer. Example: - Use: gin.Bind(Struct{}) instead of gin.Bind(&Struct{}) -`) - } - typ := value.Type() - - return func(c *Context) { - obj := reflect.New(typ).Interface() - if c.Bind(obj) == nil { - c.Set(BindKey, obj) - } - } -} - -// WrapF is a helper function for wrapping http.HandlerFunc and returns a Gin middleware. -func WrapF(f http.HandlerFunc) HandlerFunc { - return func(c *Context) { - f(c.Writer, c.Request) - } -} - -// WrapH is a helper function for wrapping http.Handler and returns a Gin middleware. -func WrapH(h http.Handler) HandlerFunc { - return func(c *Context) { - h.ServeHTTP(c.Writer, c.Request) - } -} - -// H is a shortcut for map[string]interface{} -type H map[string]interface{} - -// MarshalXML allows type H to be used with xml.Marshal. -func (h H) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - start.Name = xml.Name{ - Space: "", - Local: "map", - } - if err := e.EncodeToken(start); err != nil { - return err - } - for key, value := range h { - elem := xml.StartElement{ - Name: xml.Name{Space: "", Local: key}, - Attr: []xml.Attr{}, - } - if err := e.EncodeElement(value, elem); err != nil { - return err - } - } - - return e.EncodeToken(xml.EndElement{Name: start.Name}) -} - -func assert1(guard bool, text string) { - if !guard { - panic(text) - } -} - -func filterFlags(content string) string { - for i, char := range content { - if char == ' ' || char == ';' { - return content[:i] - } - } - return content -} - -func chooseData(custom, wildcard interface{}) interface{} { - if custom != nil { - return custom - } - if wildcard != nil { - return wildcard - } - panic("negotiation config is invalid") -} - -func parseAccept(acceptHeader string) []string { - parts := strings.Split(acceptHeader, ",") - out := make([]string, 0, len(parts)) - for _, part := range parts { - if i := strings.IndexByte(part, ';'); i > 0 { - part = part[:i] - } - if part = strings.TrimSpace(part); part != "" { - out = append(out, part) - } - } - return out -} - -func lastChar(str string) uint8 { - if str == "" { - panic("The length of the string can't be 0") - } - return str[len(str)-1] -} - -func nameOfFunction(f interface{}) string { - return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name() -} - -func joinPaths(absolutePath, relativePath string) string { - if relativePath == "" { - return absolutePath - } - - finalPath := path.Join(absolutePath, relativePath) - if lastChar(relativePath) == '/' && lastChar(finalPath) != '/' { - return finalPath + "/" - } - return finalPath -} - -func resolveAddress(addr []string) string { - switch len(addr) { - case 0: - if port := os.Getenv("PORT"); port != "" { - debugPrint("Environment variable PORT=\"%s\"", port) - return ":" + port - } - debugPrint("Environment variable PORT is undefined. Using port :8080 by default") - return ":8080" - case 1: - return addr[0] - default: - panic("too many parameters") - } -} diff --git a/vendor/github.com/gin-gonic/gin/version.go b/vendor/github.com/gin-gonic/gin/version.go deleted file mode 100644 index 95b4ed1..0000000 --- a/vendor/github.com/gin-gonic/gin/version.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -// Version is the current gin framework's version. -const Version = "v1.7.0" diff --git a/vendor/github.com/go-playground/locales/.gitignore b/vendor/github.com/go-playground/locales/.gitignore deleted file mode 100644 index daf913b..0000000 --- a/vendor/github.com/go-playground/locales/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof diff --git a/vendor/github.com/go-playground/locales/.travis.yml b/vendor/github.com/go-playground/locales/.travis.yml deleted file mode 100644 index d50237a..0000000 --- a/vendor/github.com/go-playground/locales/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: go -go: - - 1.13.1 - - tip -matrix: - allow_failures: - - go: tip - -notifications: - email: - recipients: dean.karn@gmail.com - on_success: change - on_failure: always - -before_install: - - go install github.com/mattn/goveralls - -# Only clone the most recent commit. -git: - depth: 1 - -script: - - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... - -after_success: | - goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file diff --git a/vendor/github.com/go-playground/locales/LICENSE b/vendor/github.com/go-playground/locales/LICENSE deleted file mode 100644 index 75854ac..0000000 --- a/vendor/github.com/go-playground/locales/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Go Playground - -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/github.com/go-playground/locales/README.md b/vendor/github.com/go-playground/locales/README.md deleted file mode 100644 index ba1b068..0000000 --- a/vendor/github.com/go-playground/locales/README.md +++ /dev/null @@ -1,172 +0,0 @@ -## locales -![Project status](https://img.shields.io/badge/version-0.13.0-green.svg) -[![Build Status](https://travis-ci.org/go-playground/locales.svg?branch=master)](https://travis-ci.org/go-playground/locales) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/locales)](https://goreportcard.com/report/github.com/go-playground/locales) -[![GoDoc](https://godoc.org/github.com/go-playground/locales?status.svg)](https://godoc.org/github.com/go-playground/locales) -![License](https://img.shields.io/dub/l/vibe-d.svg) -[![Gitter](https://badges.gitter.im/go-playground/locales.svg)](https://gitter.im/go-playground/locales?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -Locales is a set of locales generated from the [Unicode CLDR Project](http://cldr.unicode.org/) which can be used independently or within -an i18n package; these were built for use with, but not exclusive to, [Universal Translator](https://github.com/go-playground/universal-translator). - -Features --------- -- [x] Rules generated from the latest [CLDR](http://cldr.unicode.org/index/downloads) data, v31.0.1 -- [x] Contains Cardinal, Ordinal and Range Plural Rules -- [x] Contains Month, Weekday and Timezone translations built in -- [x] Contains Date & Time formatting functions -- [x] Contains Number, Currency, Accounting and Percent formatting functions -- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere ) - -Full Tests --------------------- -I could sure use your help adding tests for every locale, it is a huge undertaking and I just don't have the free time to do it all at the moment; -any help would be **greatly appreciated!!!!** please see [issue](https://github.com/go-playground/locales/issues/1) for details. - -Installation ------------ - -Use go get - -```shell -go get github.com/go-playground/locales -``` - -NOTES --------- -You'll notice most return types are []byte, this is because most of the time the results will be concatenated with a larger body -of text and can avoid some allocations if already appending to a byte array, otherwise just cast as string. - -Usage -------- -```go -package main - -import ( - "fmt" - "time" - - "github.com/go-playground/locales/currency" - "github.com/go-playground/locales/en_CA" -) - -func main() { - - loc, _ := time.LoadLocation("America/Toronto") - datetime := time.Date(2016, 02, 03, 9, 0, 1, 0, loc) - - l := en_CA.New() - - // Dates - fmt.Println(l.FmtDateFull(datetime)) - fmt.Println(l.FmtDateLong(datetime)) - fmt.Println(l.FmtDateMedium(datetime)) - fmt.Println(l.FmtDateShort(datetime)) - - // Times - fmt.Println(l.FmtTimeFull(datetime)) - fmt.Println(l.FmtTimeLong(datetime)) - fmt.Println(l.FmtTimeMedium(datetime)) - fmt.Println(l.FmtTimeShort(datetime)) - - // Months Wide - fmt.Println(l.MonthWide(time.January)) - fmt.Println(l.MonthWide(time.February)) - fmt.Println(l.MonthWide(time.March)) - // ... - - // Months Abbreviated - fmt.Println(l.MonthAbbreviated(time.January)) - fmt.Println(l.MonthAbbreviated(time.February)) - fmt.Println(l.MonthAbbreviated(time.March)) - // ... - - // Months Narrow - fmt.Println(l.MonthNarrow(time.January)) - fmt.Println(l.MonthNarrow(time.February)) - fmt.Println(l.MonthNarrow(time.March)) - // ... - - // Weekdays Wide - fmt.Println(l.WeekdayWide(time.Sunday)) - fmt.Println(l.WeekdayWide(time.Monday)) - fmt.Println(l.WeekdayWide(time.Tuesday)) - // ... - - // Weekdays Abbreviated - fmt.Println(l.WeekdayAbbreviated(time.Sunday)) - fmt.Println(l.WeekdayAbbreviated(time.Monday)) - fmt.Println(l.WeekdayAbbreviated(time.Tuesday)) - // ... - - // Weekdays Short - fmt.Println(l.WeekdayShort(time.Sunday)) - fmt.Println(l.WeekdayShort(time.Monday)) - fmt.Println(l.WeekdayShort(time.Tuesday)) - // ... - - // Weekdays Narrow - fmt.Println(l.WeekdayNarrow(time.Sunday)) - fmt.Println(l.WeekdayNarrow(time.Monday)) - fmt.Println(l.WeekdayNarrow(time.Tuesday)) - // ... - - var f64 float64 - - f64 = -10356.4523 - - // Number - fmt.Println(l.FmtNumber(f64, 2)) - - // Currency - fmt.Println(l.FmtCurrency(f64, 2, currency.CAD)) - fmt.Println(l.FmtCurrency(f64, 2, currency.USD)) - - // Accounting - fmt.Println(l.FmtAccounting(f64, 2, currency.CAD)) - fmt.Println(l.FmtAccounting(f64, 2, currency.USD)) - - f64 = 78.12 - - // Percent - fmt.Println(l.FmtPercent(f64, 0)) - - // Plural Rules for locale, so you know what rules you must cover - fmt.Println(l.PluralsCardinal()) - fmt.Println(l.PluralsOrdinal()) - - // Cardinal Plural Rules - fmt.Println(l.CardinalPluralRule(1, 0)) - fmt.Println(l.CardinalPluralRule(1.0, 0)) - fmt.Println(l.CardinalPluralRule(1.0, 1)) - fmt.Println(l.CardinalPluralRule(3, 0)) - - // Ordinal Plural Rules - fmt.Println(l.OrdinalPluralRule(21, 0)) // 21st - fmt.Println(l.OrdinalPluralRule(22, 0)) // 22nd - fmt.Println(l.OrdinalPluralRule(33, 0)) // 33rd - fmt.Println(l.OrdinalPluralRule(34, 0)) // 34th - - // Range Plural Rules - fmt.Println(l.RangePluralRule(1, 0, 1, 0)) // 1-1 - fmt.Println(l.RangePluralRule(1, 0, 2, 0)) // 1-2 - fmt.Println(l.RangePluralRule(5, 0, 8, 0)) // 5-8 -} -``` - -NOTES: -------- -These rules were generated from the [Unicode CLDR Project](http://cldr.unicode.org/), if you encounter any issues -I strongly encourage contributing to the CLDR project to get the locale information corrected and the next time -these locales are regenerated the fix will come with. - -I do however realize that time constraints are often important and so there are two options: - -1. Create your own locale, copy, paste and modify, and ensure it complies with the `Translator` interface. -2. Add an exception in the locale generation code directly and once regenerated, fix will be in place. - -Please to not make fixes inside the locale files, they WILL get overwritten when the locales are regenerated. - -License ------- -Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/github.com/go-playground/locales/currency/currency.go b/vendor/github.com/go-playground/locales/currency/currency.go deleted file mode 100644 index cdaba59..0000000 --- a/vendor/github.com/go-playground/locales/currency/currency.go +++ /dev/null @@ -1,308 +0,0 @@ -package currency - -// Type is the currency type associated with the locales currency enum -type Type int - -// locale currencies -const ( - ADP Type = iota - AED - AFA - AFN - ALK - ALL - AMD - ANG - AOA - AOK - AON - AOR - ARA - ARL - ARM - ARP - ARS - ATS - AUD - AWG - AZM - AZN - BAD - BAM - BAN - BBD - BDT - BEC - BEF - BEL - BGL - BGM - BGN - BGO - BHD - BIF - BMD - BND - BOB - BOL - BOP - BOV - BRB - BRC - BRE - BRL - BRN - BRR - BRZ - BSD - BTN - BUK - BWP - BYB - BYN - BYR - BZD - CAD - CDF - CHE - CHF - CHW - CLE - CLF - CLP - CNH - CNX - CNY - COP - COU - CRC - CSD - CSK - CUC - CUP - CVE - CYP - CZK - DDM - DEM - DJF - DKK - DOP - DZD - ECS - ECV - EEK - EGP - ERN - ESA - ESB - ESP - ETB - EUR - FIM - FJD - FKP - FRF - GBP - GEK - GEL - GHC - GHS - GIP - GMD - GNF - GNS - GQE - GRD - GTQ - GWE - GWP - GYD - HKD - HNL - HRD - HRK - HTG - HUF - IDR - IEP - ILP - ILR - ILS - INR - IQD - IRR - ISJ - ISK - ITL - JMD - JOD - JPY - KES - KGS - KHR - KMF - KPW - KRH - KRO - KRW - KWD - KYD - KZT - LAK - LBP - LKR - LRD - LSL - LTL - LTT - LUC - LUF - LUL - LVL - LVR - LYD - MAD - MAF - MCF - MDC - MDL - MGA - MGF - MKD - MKN - MLF - MMK - MNT - MOP - MRO - MTL - MTP - MUR - MVP - MVR - MWK - MXN - MXP - MXV - MYR - MZE - MZM - MZN - NAD - NGN - NIC - NIO - NLG - NOK - NPR - NZD - OMR - PAB - PEI - PEN - PES - PGK - PHP - PKR - PLN - PLZ - PTE - PYG - QAR - RHD - ROL - RON - RSD - RUB - RUR - RWF - SAR - SBD - SCR - SDD - SDG - SDP - SEK - SGD - SHP - SIT - SKK - SLL - SOS - SRD - SRG - SSP - STD - STN - SUR - SVC - SYP - SZL - THB - TJR - TJS - TMM - TMT - TND - TOP - TPE - TRL - TRY - TTD - TWD - TZS - UAH - UAK - UGS - UGX - USD - USN - USS - UYI - UYP - UYU - UZS - VEB - VEF - VND - VNN - VUV - WST - XAF - XAG - XAU - XBA - XBB - XBC - XBD - XCD - XDR - XEU - XFO - XFU - XOF - XPD - XPF - XPT - XRE - XSU - XTS - XUA - XXX - YDD - YER - YUD - YUM - YUN - YUR - ZAL - ZAR - ZMK - ZMW - ZRN - ZRZ - ZWD - ZWL - ZWR -) diff --git a/vendor/github.com/go-playground/locales/go.mod b/vendor/github.com/go-playground/locales/go.mod deleted file mode 100644 index 34ab6f2..0000000 --- a/vendor/github.com/go-playground/locales/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/go-playground/locales - -go 1.13 - -require golang.org/x/text v0.3.2 diff --git a/vendor/github.com/go-playground/locales/go.sum b/vendor/github.com/go-playground/locales/go.sum deleted file mode 100644 index 63c9200..0000000 --- a/vendor/github.com/go-playground/locales/go.sum +++ /dev/null @@ -1,3 +0,0 @@ -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/go-playground/locales/logo.png b/vendor/github.com/go-playground/locales/logo.png deleted file mode 100644 index 3038276e6873076ecd542099e95b25037b1c0c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37360 zcmV(-K-|BHP)ysx*JK zMpBX=dbK}5gAy}y3R{{beYQe$t~_(EI9HY=983!yQ4BbH2t9fee6m7kr7b^x7%_4X zJ9`gfp(=T?K~s?>F>nbtbqz;?9&D*HLWLAVf)p1<2qIzzh`mlUaSo2aQfQ+xioj4u zi57RSK09+4J$n}=VG1>K6C+;`IdT#dKnQiRIYfOMa;!RRrZpi|42HT(K7kH5Z51D0 z2RV8bBU%zznI$e~3~;G9N{kpKWf73XRDQWdPL3KgZV)nR5J7tvJAVu-VG5JQScJDo zR+bL!Ta3IbT6ncoYNbC?j4!6pWoxTBl*n#=wPJ6nPG_V?T&y%kcr-zED1W(DRHZFT zhB7~qA6u3+V3JBCZ4gs{L}jKoF=`!luS|!&X@DUWZdUYba2WIU7L}XOvil!bU7wAXuO|PIN?OtwU_FF?ptGuGegAxjs8(G9yYG zg|%{%%2R#1JvUt~pwDwIP%5I+ft0_2vEYw`$yQ3QA)Db+A{7b_0054wNkl}YE}wrc9DS+rDCwcq-kLn z6*rr9Gievg)&9W#+|En4X(tdH=fj-$InQ~{3w3k;I<^V903k*-k%?L`+gy zD<80`%CcVCt7&b)>-AWo}M*k4L#h*SN=*WN=wOPGQCc(S19x{GH}}yZ*TGF ziK2LMaUoYPF2r$dT&q?u0Q}(MpEI#8)^7>wy*j~dU6yeGL|G)4Z!`D?6v$J?4GNiF zGNUM+N-|jqFSt^;^pX20u^KaC*wKL1)CJS$%Vk@iEmQRU!98y?czh5h263h#&UI8G~>;F&}3tQ$@xhmG@h5396##KW2c6&nD-->t* zzH&?cgu?c})WwUscng4f{a@;`oGHloVP3&K8 zYWaY-m3_Qz=Z77^NgMadOSSCt@E=Ps4GgQlTkY0kAe~EC|Lpg z0C`J&DPN2UyU7&Gu-tM7^CfvM>!_q$|F7zV-={;NRk*zX^&Xy|sN>Mfv~agPsrszZ zST{=H##(12j$1JtBfT5p%`HZ(R~kw8ecKQFg5WJ*x&2m`V}}Y*yZ+#L(7tQhrOc;? zl-q4QvB#(*`_Y3X_Vss0x8Fk3#a~Y$nt>$Qn2*D~V85{yB8iQ{r9&gU|I zev9S7uL8Gt)I|dF=Y>|QegWzPvP@{V3Nn!IR4VydvXh@BKI2xUMBh(6aBL~@%r!AuWVG?f=&mJDxzGOktCLsq`D9Be0N@V+ zw0ap7DLEZtMdX4AhRfVstkov-f;^PxlkxbXr%Y<&X1CewisGbJ`y`1>y^eD%RgLHX zYcVG7w{0ENyVVm($?-3NBx$ln5*EKMtyUbD4wv+JlvSVUD^3~+YL43}RqjpaZ>3ze_N$kOC+VOY{hW+5B@jP%seQ7^>9XbyLO_reD=`#sdf2i+$u9o?M zdc~#Q*=#JUW~0w|6Dzl8Ec<(uJGK{c1uP-ECFnFoEcE?p>b=X@zgJgrNs7N?y_(l62vH_2aOTu; zH1Wkuhrd?fG^jc{yVoI7S9+u_MCut_7!Id3v9PUUb&ldf@7>y_JFay%O|e@o7B~1R zR>f}jzhMAekSBme7+=8B<$4CP2M`qy9;PHYV6Jyi@gzzQxufnYeT4}(ia$$dqsPwU z5sO*J_umWFSAy&Qz_!oZ_MFx;KV|fIOpaJ^|IlRj`#mo`7L%L${sFWDr)GmSX15!x z-ju0rqgjo2_ERjgP*qK!X^q!LX;y>Hu?d|?f1KrU_f9eo=CJlH^$aSqrQQSef(+VI zC|ev?=iM66d@OdmUC?cIyVcDG)WLl$UUUh>iAb>R_igW2u?(N61L7?ic^SATn9E7n zNxqRMszu^JF zAl2kMNq7&8r$ZVW%4{j9Mn@?q+c73i$N&u<3-i9;kLlEE%cl5$T`V6CkTnyOJ+mDaOaDWQ*^ecn!U$EDGLmsW}B zARh3Q)rAo6JL!FggZ3F6jy>B;&&!jW5FMg-Pfri`&2I0*$r<%!@Z{{~#$u(6L5tIC z^ct$p<0cjz2bs`3+o&=gg zN0I9tG<<%Iswa`AOAJdUZZ^xs-z{*A5120pqimm1%e$$8lj2Rz-5n3_^+!xU`FD3; z?p{7vc6^8QYfHemZ=l>~d!hFs`#E}j$4Ogk{OLe2Q=08L;!#{n!QPLNUsaV8bX6T_ zoZeWG8?W;fL^?9qw}QvFOlz1NW~S4EBF|xQlOZ}B-97Er#?yIiJSVn3uGPB5yDgsX za>d8T9K^q@j<*wkQ>~J@2auzPFOmx}x0!EFdB9!yU9WwxvgjR&?#kfg)Re^ zU-wz6Z!-%j`#HxBkmxujd;G3VYpX;y0Xtz}E(t{V$~uW0lOc^)=|GS@GK+e7MHx=# z!*RE|?AE3ejI;Sv?ZxLMm2b0E0P-M#%6ch}d~Pk7{t#OF7gYEvW_6V_EC`1%sm z;p`;DqvO$3nU9KswqGY#rE*CRhZCi6Vg+4BzY4?O1Z^=|F|5~1w-IQ|ecyr0B;3%> z6NBS&$4u{pLhhSaJ04eT@6<#cQlX#RA=lns%xy$Iav8;|8b2CeW=l2{s^~`vfxD{}nt5yRf<*f`crJol5KDpU+ooq#9&8 zolytKS$vp#7S*yGSBhp|TzSfi1;>|pT8b=!z8&|j&*(e&+8TUqFrCtl8|%?a$FBL@ z{y>@BXE$djM^uFJTU_rioz{q{e5Fbf#|)xZ>^Gwk$Huc-c9m^sKiA@Euns4o_3#?h z5i=0rkge;=Umc~s?o7dWGHh16c;nOB7RtO!P^{%PB)h}wuHU|SgU1_E^|#l+Q}qdS zH#zt}!9}+!7OMbK0D7Km3rMzut~&X`M`exqrYM-~VVJwhgjJnk7U?*AzI_a9V$zJD zYHhE&WAk}!5pOwiZ;S039$dytin18|FPwW+$P$X}!sSCocO(=%2_8{qAMNLT)*Y5M ztEsG{FE zcd6Zz*ty+c+4me7W7MhL5el9=Tt?^XuMb_;vSwBV%E_{HLRF>yV3AH_j|HcTm^;>a zvC_jO>{*oxChK<3CbtTePO|dXP!_ATF7#edCex`hO``srW-Zsv6_-_5+@v|i8We%Y zyMIuG>bHs?7YPXYC-gp6qnLxi$pt8CqEy8~wN7FkrU^!Uudp5tkYr|StbYSr7gfDV zsM%*}B(Tv6Atx0*<3}nIIDfx$@1=y-X3vRdKeE41dk)V6r>|lW>)}zv|MC*Fy`WVDgB%|{yeSf>k=9~(Lk%M*Vv}w0f(3C@}$xW z=X;gp5Q-lcaybmN2}XLiG@bn1#U(Pt?#M*{@CI`K@ZrY~KmPdP15Q4?y(75}eD891 zC_7n)=49M0h?tLJO|BA$D3Dz}f!wJx7^$#1Y~R+{IWt^h(BQN*7k{Rg64=2xqpssD zn`W{H_xI(6YZSCPV+TC8tNs^9A%it&I(jN+PxAE94F2TRn(Smgm^H4&{6j33fOh zZjjt+-FdS%$#sj9&A8U=j_334usFvB82#hjhsQtOJig5p-xephIDsOb#>Knora0d; z5&SmI<#x`^b0pP@Q&HaT3K3^9*D>9aop88;9J?Or>4dJ6EzBUTMqjBY_GmR4Fe6FO z3~ldwf$o=IUERAW(~Wh{VsiKmmaF?;oDlu_3w%;_Zb7fRgLaG6Y~wF^?Tgs-~d>j&DCZN@>`>j_xTR{}t_f9U)W2S+R648V8hb{3Dmp813n?7e z6LF4tmd&OUt5Qilew8{x$Uy@An?-AlX{&(3EiElA<#AhfOL=T557!owu4yP~DebPa ztx)PswzAR!84X=8C4fe0x=1Ru)JJIjfz$+3Ov@v(L?jKOMvF@vC=8ABl}ra>#Kgob zYE1lL)E|Bqy)c%ACEK~@obP-O%4%vKqpYuMEaDb% z>Xe*wLNU)%FK*z7Jri6>qYAqoQ~6u3ywE}DD8MH{89OM0G^)dF;hsksFBVOkXtT0L zA)0_y?A`NfeW$BFX`cjk;gmBhQ?bvFCP#gkc*f;o0ClWv2_(_=U@$V0blZKCc3>Z- zBH*?Mrjtn*NIp28+w$lrc+K<-%I$&t#c9`?SWEITs|_o5YRdX)Clyr@1azy>;plKs zILBxE2xv?d84A5>{!r^s^r5BjTb85%_(J2Zgm{-@VQR0h$oiG zruagSqDUa91*Hjf5jbT!=~D(dN$Ax^u%=i_N2ScHLF4s8w)Nt}WP($HD+eob4+B3P z2EH?PEIFp0@qxWyt=$peI9dq>gRu@o0?Cm`BpwOQCWH9i=%n2qna56ySnw)tT9SZx z7W;3W%9&~C7}KMVF^|Hnz%@C&C$MdCP+=BOb8{&*LJl6^&o&ZZ4|lRKcdWUR5qED&dJGwX)i)6B?n$ zOosG;3l-6!Kd&dR7|)UkH5H9Iqee`1;=ypJmBx9KQkSgDkU6M&@Vi>>Nx#3cdf>G)y~J z&y#G)I3rK8{v8dNM(U#AD~htsQ86ORxE5|0tFhji;NKFrW=+J=$c#L1JJ;M3Mo_yeqOj zI*IXjLAHKtzljb9u;77UFc6Gj1l&oB<)$6oo{t240gG#7-W|uHxO+xnbWFQPvFn(8 z06vU5$U{urHQalQn-%>gb9(cFpCbKaOy_`aLnc}uni3iZLGy;BwGx#%B&?Pz`TT~< zFIEW7G%Cug1j7}YPEPZslA;&+91*slk5kMm7b`V6lCvX`*`#a40zeNW<2d^Ek(+jmJ02821OEzy2yukV2AJ!GIcxE4Ry$&BNVa08W#W3>t(6_>z^&514EIOeh48)L8Is~0v&gIH(NED?41y597-PtVe ztf&wb7hftBovGq@#uW{fb@gJ6a7rT=iAw}xLt+TXNf>nJ_2#p+1oW!jxIpLhY~ImD z)3g=0m8H?JDzsiy-{OUD>}momhezG8Bi!@ho?h3ew`JS6?XyoO?MX`{Ih#D(y!*>9 z+lTvccHUpd#|p+Dy$89$(8o`yZD0gi7RQifvXf1ZYH!*`dtl5$w6P=Kgt*4kqBS`k zZ87L|XlFX4PEgbw;V@nSjrSXf1d#yj8;QQY>e`_$saY=MD$1%SN@bU1&CUD<4__hV z);A6)J(s#KahiuakvBoOl!z)MwHkBvl!nWJ!}XfO2yB<)O8EN?dLu~@C>lNY(lkk7 z%>nDC$81b5fCsm>ZD!Jk+96JX>F(s=w?{|5h$UdRj7(eX(}C@~J3Bka`S;#<@4-$0 zs&(!CIG#W-fb9;T-S`X!lEL|TOC(^QwOb;}TLyyISCYV#&QNUdD#Y z8cn6pZ6c?m`rBi=tFajL1t5>Cl`71}b}+o5E}^8lt4sD`?W>%+@rl6-nShT&4y3zu z8==dP>3Wy1BO2Ja{(tAGGVi5@LkIAJwZ<;7?X>ZyThF6J~`Y z)dCX%APghL<^pjCuKBRackk|hcl*w*Z@=B1Y#ROVdfolx?VXeNj^BImX<_HkJrc05 zj6_zF$ys;A9uG$1zIf2h-uU^X9kUJ%=Y~_m(xIEDwiTcqN6i|B)e9EEdXumwL8`1& zMpfH^;0e_3JWWwVDArE2OAW1aF%rh2G&ZEFl#M;DktuGJb$6dB@|-KL@Kn@^M9re{ zhQ2{g5qM3txY(o6C^cf4CS(u*89P+chm7aXN)cmGdP*JDJM<|%kEnDhfBfDX$0tW? zAoA>p2jW0=7V%I26rcSc=fUTpc+l`3#xgzGV?*%LG};1-3g@H=8*c-DhDDXIB6tJT zr5tkcWhiB#^XZIIm1NVpA^G9I5_BDio#spM7E7oU-V+LUlO z4fsyEh|j4W6I6>PM6!tv%1n_lIQmi&c7>6|9Ca9}s2ai{ipE?0aO7Z*GreB;q7}Kubavrj@AubsZ=XzW9AwkkEC&9KH}c1afW4b6*s)YD zhzARg)~`io0r_Y>i}1b~@L*74Bok~L#RinfAsDTdZgXPfuCWdqal^+`jaeh0fc2EuRfs}21N(Wucufk-eWo4VJO@TRbITCj|;iwPI3 z1%1Yu%S>+Uj_#b?-A|{dJj<)ku0H$4Zl-X1=iueT&4a0Qb}4_nxpU{>zRwbAdjF<< z#WKHQ58~KI;_j8Wdln22EEd`Ybk;qCgE(Vx2Uwi%VY4XQ&o){M|Jww}ga41D8AfPS z?I8TRJ~BpuZRphiB&omMIA}Ds8;H;i5Lu+{;Ka8 zjzHW{*EtRfFB|KtmGEwu`yh75Nb^Gp74AB28zK&*j9pPZ%7bJ@@?b*5*6VF)Q!{j1 zrjWUp$=qZ1!h0^)^ufu4^won0X|z54$mY8{yE~t}a_9bsZ|~g7ZebR_Iyzcgiv%od zcaKu8;0m!87n4#^Z#FKMQfWtRskx*I$t7X%HQl4ee4k?0&e z=jqeVA`sR->zDR%cc6xa!o83J4WaIv= z{lK4_CvT$6wfO%!W{v%f2UphcLfC<~!^gFQ9AVd4mlB>&3+5|)&BSD)pGK6meIzMVeKuIEwv`uggJnf^Ohf13E{t)+ba?R@_D_&E3A)6YNu z^ysf&e*Ja-@XcUwWn?A(=IqFdeFdLEh?*oT)+27;G<=(x86f;=BnSLtv>3QV8w%H+ zhS|tl;Y{Msbd=PO>4$0_A}KXqfjUNz{&tn>s+15Cp{^G>!m)|2nu!<7#v7h~y1t}@ zgIzBwI#=H~F)+Ys7}xN)-P~#cU(A**htCpJGhxb^JvD-(;$%ZrQ4 zi_7cl>)HI$`X`4=U*>N^qOQ$Dy{)kpWn>KxJM1GEe0*giNtE0(ZFeEBvuW|dZB{1S zW`j3ysvg*c4_${NONQp=q;SVCrocl~p^!?alU})qyDl}io8dRr+z@k1U*ai;i_cUP z^AwGB^^GNEobK*tlurZUmG#XR_`C|vm|Q9y>{6A14n9m0=hcMKK^sxOns(03MF}Iq zCMOMp4C2KG-N<-p#u3eAavO!rwM?N<$lUt=+uM7)Ki#_XRXV-y`QejyKYM<4@fDQ4 zwY8OAPN&n^d_JGu-vG|<2iPmdmdS267~Rpz>8>BHS?qyP-@MB`13y#S(*oK69Tdic zFQ%}~i_5OH0`Gu&=sK-tX{?HN_#Gr9y2{)N8QX3oC>g| zXU$OB6#RcscMw^Kv*~O17!*%$4sSn5uWzm2`tIvzpMB-o)yEfC zS5f@(@_KrG=}X+UU-EC{ckGr~cYMSi4bSp6msiLj;2dNjDu$sapwhfG|r#9TaG%npBZ&Y*wR__7PL^>hj{! zhSJLC#F_~K`?Cb1649CKGA>W^Dn~F;<|(Z&;_&32b|L?&+{`hD&N})jI)!MX7MB9v zR3?{!M5FiFNgC)>ByvrE|@PjEy=b-Tkq=Zw-B>wiqn3eAY9GuJ=o(q0QQg?kxmfzA}X_tOpOcW>u!zq_>b<9Ej= z7Z0|+$A+(>7``SsB%8%S6Mug<@ z_U9@EFYy)QV*D)4_2>9iMUC~B&+v=OMM{oLSrRVcs=E3IjZ#=mB^Nc-+X^+f;%C7}i4*&k=@UQ!y7VZb!M;2H&tOT;d zwMPWun}j;R#Ggt87z6!nY_{I(@M>WRTQTe@u-SzaITqDjA+8{EBM`W%DN03v>$DGP zifYEMOpS9C7rKjh`~gKV3WZ=99;hm+;*^x*qhU-bn;N?!mlV~6Zs_}U3u*{Kf1g8Y zq;pmr5gNr)>`zieO;)XyO@7pLKdsJWG8;hn%*Izge3X0b?caV#FMsq00PWqomS2C} z+xbGXzP069U*BTez78Ubw&$~7qI4v2kSKQh2nIe7S-E>}XXCHKjeQ^%@n(GN~bst8Gk zv^}ON<(3z7J={vqAV(uB?<{{+R54s!RD8MnOgX1iQzkA`@I1V+=7(idax=-rt|zDj zJh*yJoj9WS#cr^YO)|G@n$Hd23R`dQppMU!KCx7lAjU0~Lv><~( zR)y4#fw}FPoUC%e?Fg^z+?p<}J=66#)ITdnb`Ybn|1SX6^|F z&1eSc=uzx}EzriYEwckj;no(|Elv)0PS#iq2J7g)*=n=vW(p~)kVGnWb#Wv6F%bd$ zL69v(G6ly$BNz&S4>b;g4Vqg3OqO|ZVwhnD1^PIVIbg8Uq%2<6ESr_LUMzQMhA&<; z)Xpoq+9Ao|YQF{-9GKxzyYJk1xGO0Q07&TG`2bdNVU1f_U+P?6`l_Kd79t@Yc&Icu zD7M*H4$R%_dFry)->(J86Uv+rQ1}ReP!JKs1Vzhn;K0ctArSPA36XVd#!f=APZ%wj z%%U>@qpM>uf?baWM&Yunu|TzziGgJ`PGTbb~05fO#S>Cx;DFzWV-e>SdLCJx8S}7zx{Zv{UQYY#S7-kNwt?-Tcxc@T!3r2Qs8377nzGH zE}xqZ#SaEJ2zbD;fq{At;{A10mGp5?Z9qgk;6j`a(4G!`4L**?F`=2EkOD&gjF6d1 zW`s0>XgGus$)eK=pj;(0QbdemLap=wn;Qu>uAAbmzLy_ODPtXjj z2lIsT1+B1C|4=caxpjATJ>o-Cd)I{@Z~f=>c3535La-0az;#tS-t&?Vg}s4`f>aV2 zd~A%bk3-})yi(XCC7~Q7%2Jodmx16euPg}I*0LZ7`~Xx?0dfXF$38%nb7a3LpWMP^ zeB6lw@^Q%e$T~k_fe$S*B!n1=_uI3V;ep#^>w>p;am3nStT65XKSz7)b)sUeQyi%n zM^f@$yq6``$>bqgGPJ9KL|34T?Z$8jBLp*nNlsvcCK5J+gph;~IzmMJ{MeBRad|LE z!NN;c9ut|O7`J%~u;~JdyF4XJjCU*y*3OG0J z44B5#e#xn9h)t8kN?T>XNz^XQgVUuFAf?cmJ|FnF%CDf@)h0n#Q%~z^UoXpp?p_-Z zP%D707NPw5p*%#a;bN; z2Tsue6a{-7FwR?TtZWWYx42_0tSDRdkQ{+w##p!(6xK!hve^fjG#WdM+!PnVgdhhk zE=Lr~q0>U?en>>X#|e2bO~URRFlKtNYSac9mSf{P7ss_P=3XqkP|n?6n=%HdYv)Zc z&p^Q6ZHIa0;dZ(b>F&mOZZkQrn$Z-#l9Fvq2PU7!x+xN z082&|oIuENO)P{(rW2Z=)FT`=B80IHA_2-CCn16W%4A_)xoJ-QXPa?;_K{9#?C&2m zDM!@mGPQ9eZR}C}eWSu)FkQRVbqgB%H7IizFW!Km2Cj833PATr_zk0A?x>V21vnaI zX29pL$w0}^IW&LhP-|XVUfKK$W4lf+hg}`+k89ugEl9nn))s$_y<2~7QXfN)D&!Qh zXe)_?( z<V}u8invj{s)^GKhDyeJdBx z15F*R@B2SBSw0!c}C!c-R)*O|2u#nh76OfxS zKncajV1S;c7*9$8B{bE^!`ssX>tt1eLQEk(^&sYU^*>3Jn61DZ}9 zP+MlWV3OwvBg8BO5{{W5H1~EDUAlDFtK*V)J@2HFUV8Z0;ZK{7eH#1H_liA`2kj*$5(lN6!%o1&CjZsBdUisW9tJ3Sp4k zJZLTtFqx-;cbK0q4;ULe0u0&5dAgv5T-4`x1_sbbpMimOVBqg*zN`mwy&+%Hlk=6V zb=PR6Od?gG7vwr9OQD^k;@a}Xua_a%KN#$kqet9n)=YU<)x*xs%jTV|xqZDQ{a8%Q zCvDdcx3#n!ON?obilGq;X{^FTRn zt*g9KFk9?NR*s%nU#f4lH6WONb#9R-SSOGs;93aq5a=9)AZGgsLy=H2!Uj|_4i+_3 zyCgg=pDpgXq*R;`Bjw^w+2g_?kHdOY!tmEXg}xjM^zGuOvUF*xKQACC4rpu(2*p=)S?{h?nJ~wwmd|x&@A_M z@h$~=dKMMce>XHYH`m|acDR4I?|O?*>0w&iXKlw~XrC6x96MZ?OLQTVLDwBd!5_{2 z+{MNx%_6!G>F=ojwEixyKK!m{RsG44{)(Ch=O^c;e)j)<>a)Yw zzwj%LE=?uwtWIVGlM16^aG8uuP_*x1WRP5O7^-b<(Wlu(MbUPE+1OfJVh&h=JQzo! zI1_Q3DVsLgSl}66j7WD;=s}?$S-cy80-8+ch&XVIL_$si1Og)D2z>-dZ~}Q}gudOS z{YC!;=wbbGwMO6f$MWLF!zUv*^b3aRq_o%5)MaV%TD9TEjVBK$z}XWMPr&V3fMaC& zNitQXET?ibsZw%?4@3kXjd%$<&8M|WVQ~XgB2I0b)j^zh4yp}Cn*GdE&~LRUd`SPow+4*`|gHqVR$=w@X_Oi6YY;hr3xNXL}?J20+TtEm8CF9r}LIQyWdSD+i^Z0Ip zh{57;(m5glB7lk?3Fx~R+MNDz;B949efHFprWaApu8fS_U!ttNxUgoJrH{9M1;ASD zduj0_7w$Zqm;tX(47^(0))&SvOY1*=Z`|{2R?cLsS~_jt?qF?+-R!Z|0fR}gx3Tnc zv87N*pfJV|8L6R7VJ8w`M@6-1AqdnqA5mgd-(kJEH(eAeM1&%=u?g60(a-&6^KyOk zvHF!+Jx8Hgm^IFuW(^O~QGMDlAOCJ6=x5$BXu;plC*bR0+`z=ZlZ7YaGPJ6rxjmZC zg^y84dQ~MLRg%$GZi9qd2@F*HSnc%MoI)o?Ezg(8%F04K_N|aa|M~KJ;lYU8V4JjbM8Sq z+i-V}Dy#5p=V&UZrl|I|7%I-5LUE!{d~p=Q9yTDmO$F#{B_~d>VUUdo>J$k2MkeRx z^u5xZ@*Ti3&@*a zn0|s*Hz;#Z-Pz+y@BS^7E?wsLr1b!umQ>jQaC919C6Tp$wXyM6Qa-4pK`sgFTAyxM zqf20m&9gk7VRCZy%%A&tHDB(p0JF3FOWr6c>4vkdySt?1_n%I`QF1yftK0uf$-UdR z=lW8EiK&q5(AbaeVK` zwXdsdVu25fLlEv3!bS}1Famw8RI$8r?%cUajY6R?r^6g4>>GO8JEdRg{rTtBOT2Hx zr(Q%1z9>|xwZ^rzsc|JBuWREV2~r;#n;+LgVMjy$`OMWDzb$QyFC=lf@4+bZOa}gj zI9Ewqfp<}D{GooN|4X{7^<_Rlv6ti1?rV*Z>|(`QJ#Tf2cmCA9Q~OV!^4||9YoGrc zZ)}5m8$5xMH_mP=DLGqm<;vOan>YP$-aOM`rqL69`byK&n~RGB1E~&FFDlj1+SwO4 zCwLjc*4fU%5>OkAGsa@eQ5$Q##byegQHLj!@u6fIA(Vx#f=3YsEkV$Su=M(>qAFh1 z$#ds;9V`6`p+dR5I<>qyq*U}j=(yC;vGREJk-}is=+flI1%pw$b_ckIrKEQcjlHim zY@q&zA_snlxPLe@`Vv~2tS5(is3Ephs)F!GOZ?LGqx&;6kH#h3*tFK##@ct@7Iz8} zv(l^>=GClroUAzo4nJSI4N0@-~&5Ot|!i)Me4|u$jypwSAfLEA;UFEiy=YwO-ZFZ3YBk9c=WLC0w5Qrp z9lX7>v#C|#ftXycz})6&-*6Ho5I}3+OgfH32qyRiGt!d_qkf+3Eln?NnLBm<`h(Sb3;XDv?N%%BAI%5@_-83ebk~>T@RGwG$Vw-qJSiT3FEP z{#Y<5hu1E7dCh&>aqq#?@6i9~pM^Sj+nZ<4g5Ccg_z|o=y92(TJqw=i2It?*I&<^P znKL)De(3)+)xtKnnOfxJbk4IV+Z$w(ILqzO-0d*dHh60W-qj6{PjPh2ZT=|g)2No_ z^y@M7QXjDS%8>m&PR7_^Yku>hp;K?Z#+B&Ms9CEa_iee(l||{MSG&#gBc) z?-{>y_2I<8KzsWPkhJTy+Tq2qmHK~~xc0Cn>nJ?#7ZE`q!4v^?6v3Kgk&i_*77q~? z1414GvI#^YY($PGd!~aJw}%aJlb914EH26#A><%Q0^=HD$W1U*KoLO!#qe6a-xk%` zw+s7&Z|`@`dC%o{eqVjQl*OV7cpP5yjq4%?557+E6f-?NJ)m?T)vEp5Z=w3_+wsI_ zToWg!k|OB-B;dRog z^%m>bS-ks6tc8~)3IV!0fnG>g(}z4yitqQPoLion17apFIR(%OA+ABPNDSN}9#5*| zm7x*SpFJ+QIl6TGvj5r9{@RAl+B**)jOE5OE;gcEJJoaIX=SKiT>8Vyqn(`#8SyW7 zd>q*E#es;7^!8n?Wp60POO>Xl>gDsJrMG^6dQc!AJg8(j7c)34*--N}c$g=X$t2jk z#K{BLR@_{Ncm+B%|IgP&S}94Me!a+JNK>6d02lK4QMLj48#W@wZQZ+-MCC(rl6=!_ z;Ok+uFmh5fndTmy6&)Q`m@t29h%(iCZECv2(-W$O1OYle>t4h`GKM$^k(MQv>K2)n znwP$Q<@n{kHiWm%*2k4`s=O-`NMaWoXCFUJeURJU9@p8{x%l=(MY`V>|9DIg#O1|w zv@Q0JOU66fuF7lce;dD3Cn-*1v4nhNFd{L9fru>@F=QY(oF2b|IJu7Db>abcCxGi< z!}y8ILvX@L&*}R^w@Q|WI0agf<>VLh6MdbjW|2lHTS==(_N&&}SeTeZ3E6CFrjW}P z(%5Viz%+FNw;`vu6eTx3^p17uXjKK%y<*D)_ z`nv0DC5pPbHiB+1X0@pM5PkYRE#GvYS@HQ?zKuKj=m&{t%|3JBAm zo_eIA%-t)1ax^gdf}F&}99!E>k(Q=wEDbjxs$1!Y2LwdLCdI}^Me*4o!mO;!LOMHv zoxtU*s|(b<%|GX8TBeFTa84MymSk`cdWZXg{onJuB%{}6iieEduCqct^(np179=wy{~ zCAH_2Wh|*&AlNI&AJKr^f`DI4sGPZ?@a_M(I^K2AbymM(?Fe>|=|^)6j#yKm)p}wM z#MU=5U{k;beLGV-QfRfE`B2|4^N&ZHP>}goJe*yu z?H|1|q34kHNf1` z+|tZo(}p)m&dyXMdd8&i@HC6(9gV}t#$FQ;mgub=xMj_5m z=pFVCJA^(!bTXCzYl}VKb)5R>c*FUg%iV2bJ$)FLscd?XSNRxCn#W(nv`3_>o?(M_ zQ{4Lpki@9c|CsSle^A+1qmY-Dw$}ArJyj!}tdZ|kyeU;4%vWM0qnO8Gh{Uk?AVgFc zJiJYd9l#+vl>(vTy<0?J7H*=!i1yUZ@GOtnJ67_dOWnm zCx$(8cnl4)yxzLw!{2=K<1cq^7D{@$D^*A1;`*AZ;+j-#zy5kW%K+#CUB@ZJB)Z?xm}8IZIlm+$$*K9Fua2M~-oh!PF@Pui*ekK)Aoj zbV`Qawce&fOvsALaS%e7`nMh}_m*$n$5+eusyP~srXYu3Pz~^W-$be}_BfesG_}R* zi%p;YkG|L1HlvxuQk}eFr6Lp~K{~M5FU{ zoz+8hA9N`Vk<>Z0+@=h*OwSF?wJ-=L*FK53&bOuVsR3q2tMyl}F)}hU+(@!=TW9yK z)oM&xJ^$qkn6uj!wQY~hTE~#AtOW49kSpX?bGa9qmy?}}TAGJ?h3cPsZxlV+?g86N zCW>ZM6$LB-kLBz#_|q>xb{wBQ|JLQYhFZm$)GMQ%ss#-FS5)OLl*hEkS1sh_rm6xD zRpf>4%d1fNEq=Oq>HP6$7ZtUF`cmcmhZ9S!1IlWp;2=*a6CcbM33x%GW60QHZn}_4 zq!U_((-HehNMB+1`;Q(?FE2m3Q6ReaX#QHkg&d(!2nWX-4t}I%W@Lbao`Igdsl5To zj*4tf-_lH)BXXc)59zW66$5

^J3SC{O=CWxCY&tzNKiT7Ed?5&{U3B&KGl|Qi^kMOQv-cdv&|b# zHv+SZnT-wAe#7(YZP%L^B$3jDwEgJu(xPef1bPBj%~dC;>1=x8>E5aNpVdk9wEbN6 znfaFOK%PuQ9ON7bZ#)?~79(fcCXQqA`D`Z^Rgu8`diJp@{pdoRYN4v4B4!~qJ-xju zz9IuzeC7N8f2iUny2fVW&qlO$b@fXohTE2YkVtuxm^Lfs2*8}h`MmELTD7An)$top z>)iW4A+RHqf!yXsIQ;4yji&n6bje&nP9`W_hdwjbH)&I*Wh8ZLl=GX0)U9S4oXxg6 zZ{12VGBnnQ1(;YF+gRC~?6xwY(n4ZEb7U-Fc{#E{b-*pmQcv9y{)P@%LPCS`v-JaK zT8IV_uYiNZn#0rZdHL1O0GRqoE^pN`*{DwiyuB!#aE=KF62E}$cw>RQ+gAg zsYe&`UP`U3`0(qQqqLS-DIYLd2FV&Z7OZ9beu-$Fy5@4Pb z6%`PyADnHMZKoHEky+BJHLEtSH`ZHcVG(Ar7F!#4+W1&I9@$}i^N1`Z}+u zyi=Qw=EXF5SA_bhQsc@)(<>q}u&VxP-`GS?*T*03`fjmreyMNxr#i(*y+SY|FB7<- zD&PpDJk~K?2M(O7O=WZpM`W%ZI&sp{EfdLxXo|~@txkZj&oI8f*6T%cbPRVShlPZM z#D<5PS=s3u8DSG|fYF-ZZ2e%+oP!-UfH)X$UQIF%U!9HeWsmU-pG8@J7J`j}&tbIQ z+S<{5tvflT?#xdObSDT|o*GbB3%T4RuJ9Z)`NCCN zY)F{#>hap_GezrY3Wg~|+7OjT3*K0kle_;}|XMc1yy z$2TV>jf%nkGC}`HjgpA$0<@fqWrFW{_|MQg1>#9aGQhu16cF2;{t<%wz=60#_pdGA zQYR#Ex%{7)qSI_)Y)E7XEs7QyYn7N}a?r%~O%u#hSUOW(Tx@r5^^M)@>+4KfV_;-p zVn{O9vr4itNlJ3tZ*K0D7T_2{^9rMxxJSiC(=r>_v}kiWo1c=zEli*{@X2IqA-7<@ zh)L1fBhoDf*e-}C;vkz>3ah^5K?(!o;_$)KVhple11Wk?gIgQTKrF(Zh{Bw!Q8r!I#@`l`!c zi87)Hf^SQ-jfv!w_vWru=OAUhaDO0CSm46;%@k5IU0hBHAa`bPTpq*eA77VFTTbKCQR$>Gl|b{yVw~P=d z3=WBRgDu98<0@Q&37mDX67^AAcaqNd*F>^iooNO>OPEi{rzytxqraRR!ji z@2WTy5$7M1TD7Iz`+zDi=$U9%U8o5M@M-iZal% zBN^G5t}c6CZY*#!^&6N=h@@7dR~*C@GVH9bPHo@K{nFELN^ijCYQ;XLNq^q|ZAdG;UY> z7yj)T54L-~<*q85t>WG@_0-w!Jhz$v$g?NSA(AGJaSUK24kyaZS z6S~$92FY)>vopnp=HNBKo3o9wadS3{FW-IFWY1@M*ztZC8($6|w*Knyw!^q_A0}^K z!IJZ~BZSs>ypnPRAIOfU2cF#Hh|#6wKmeNXc@1bj)45FYd})7AS5Irj<+0)MEA7w9 z;{q!V>}vWvFx6ibxa-0DGgY52e!jR^{_xqK{ffq#$yyYxW&LtQHK|-9Rce$x@cTjM zVsxJwFf3HaI%mff*uFyUcxtuI#N~%=FvaJt-x9KELUuSilg6fj*J&1CW{2BnuUVa~ zA0BL%9gMpX8Ll=Ax4?^Au!Ef$QMo~EoNbc$Nl~_L25xBv_GzT`ULotq`@?tInERwf zoiN$oKqK$ZjHV}?E(|*%bajnAolvd5aPM9+n3u`K`BB*sZi$vHPg9I^zO3eV(s*6P z<+i>jqZzNp9O@`PkP+{HH1yM|R}Y{&^YZ&0!*?@g(2NA;Nu>f?BnFiT=PaItB|G;> z=ES5--_}esVNF_g15yalbVaU?7pNT%0zLHZS;BU$*E=+RI`!3C1&z7ahRpK z>^67a?SlKSP#s*HF&1pR*V64E>CHEd4hGng0vt#VHs(gbdaDuOOh^`MNzd=m!v+HE zD8L;$$e(PpUb_?ffUI4~m`-tb-)a3^iqFny*FrU2-4a9;t#C9k;pssL@;nVoIwGi% zl%lU(+t~fEGriI;9f>>E7xUsUD^%%M?jP^nG1C$8hyTo9fBntVmB%$*#^H@!>>f;H z12$xXjbIXJvXT&*vtSJZW&;HlM}#`=iGi$$h{MWFXAp=MA{BH%fgGiiL(Iz1C`GbE zR8Uu>r9t)Sdxr(_A z0$UfPC8dZcl(ZzN#zR9#%1#wA=?srh4F{cOwo4h4=Bf15d&YWG0|S{`x3a>Y$-p$H z8?=qwpyaoDb@T%dtae+y_h4!S*hBKvy(bTvOs2lsMYIgp4JZ;GI6d@13nO>8Ihnw( zet+?si)Wu)SGw-;xWjSUEtS>#FqvK15w)%B?&_#hKb82;|NZwLf4z06;@zoh7cU(u z1iob+KlIu0fm1$Rst>+3>tN^bI(ha%i^i8c-a}-fMQ_l@CS3MGm}FT zDxgbhRgF$nmkuAN^i~pCUW_u9hD{{YGkFvymndb|OOvE9c%U>C0voo@CbH`JYyqE7 z%S*2CEYRyKWO)@8%8G)#0=-IQsxhgJs9}m~dUI5UT_#zrsl2nc`@0bQVt8IBOba)c zwHV+~a<&1XMEP>;%lS3hn4{W`(k-Q>>(*@BxA}#2G0(>Pw?tJxaO$VvkN*7g?>|33 zG+_Va=g@QZm+}uBXc(M0^6J}fUmE&uMab~b(-&!1cwxpKmO9=0;@?UnC8JJmX1X`b%C`tvlhL}z%z@rEp7uuDZ7 zo<$$Gl;1khlF5Gfo?GK1HdUIjMwb_wuBu7T)bOZ~Tw`L;hv&=lkuZdzzQXkZ$$kOC z$n|O2%Od>He+ zohpx~R0@=t*jO32zFt~Z&u0-Un6P*$5f7P6p=*2yOmdP7kqd<;9*vs97ZN?`PQEOS z0NO0yRiEsu;4|cWb#%HxohH|zLm`Vc%A-{V6Hxle+s-{><48G?%;1a)tMU&70hT^} z43z$k2jSn}*#(yY^;73UVfY7*$tZ=!MTowV<%pH|F1s}$2=HwIR1x^e{OC0 z==YwU>9-rI4wb}6dk-~kZ7eEWud(0*sOyS8&; zc&>Ms5jMW7Hm9%#P*g$kGGWj%1|tX;-jz!ANJ3nPfAb)+rED@Y$q7btLenH^X(>V- zEmT0GS75%AEa3B4L{GN2CoO|U#ZW=`{o?SzFtIpHrVtzC^1KK|pFwX@mk(aXnP+7! z8oRT6vox9u^V{1bMypCAsl8zxw9* z$7fHUzH+7K`1Y^H9{#jzwEEgW|MluLNK{Q8PkB*QTBEsab^$1(E8@Ar7 zF7ND~xl@e5>WnXlzl~NL(oVkvRRz~ZbB}@73dU#flck&A*xUi>(3tHVTJ5%HgCE_p zCU?X3(x{_x4}NcSH*R!K8P!F3=#l2h#C*M{ zx4_$r=HM<%Wf?kF*Kfs@hPs9Xj83f#Uj=x8$lpTJ#r-uU-IhES#r%?&+mEGiN| zt>f3^g$h-n1)&8TPSG+lmm~r^)Pv#bL4iUxh0l~S$xNavmCW^^Q?sF=>cU~r1+FQc z$pWf`&vj)$Zr9h7%kbjyyr_JyVCyMF7E3_jQRyB8 zj#Nlbqthidz8Z-rNuuG1D3Jkv=)TmG>nRjAJBdiFFJqL&l9BV)ds0$(z-TEzZorgx z7evP@#6^4cM!8xXT`up_^_lAA>T&~6!2Y2d-|g7lT$nxS_JG^Ty$2t<*l=Rgqo+3H zLOc|rO3w!G>(Kfi-Wa@YyW_!9d=bQjhaD%6o~-`%D#l&gfW#eWKh)6NFol=@L@7@<{w?&jLA*2zBB*-$ey~||AJ@Q%<>a}Q@s8j`f z9XNn|0fEKl)t9lU0u~oyYAm8hJ(Ec!N{P7pJ`9dX6tFXtK$cK_m?SQbz~zH4D@mb+ z(geb?ydZairy$5PnZyesxeJ1}dMcFqt%|%%gDgxPW&rg-A(NS8261oi$c^K(0H*v# znwkzaVI1(Tu^wnQtSxyorg}@qzK(71aSKmY#xHE{S}18bdb1__e77nA1hADi`t7&u!?%Zj`)z6KO9|{!E|=v5EvO0AUu!;2abZ;J!%oR}qy-Fz*@Pb{W6cI&AVUi?h!Dy01 zDH`aA)9C3W&U(6VXAXTmQzFbGpwZ$*Lr2Q%{&4SSFbR(_st9-3y4p=1CYQ;>6nTIu z4Jz9=#|JL?9Y`Md;;Ge7J2T$Fm#b791N(tK;HhP91BF zIu_pAbk zS-S(1U)(zGyJgmX&TgtxtI-lx$z;Hv-Q9Ii5@oV@JcKS^Ave;6;RE;0b0zWp7#hEH zjt~*tg(&rK@%8g1Joz^3n4M9Yxc$keSe!`>p3!Pa!G>b%cH>%*z1Klykpcl7wEe`);MN3~k)xMMy( zc)oODzO*Z5Avf27F%E^};Dsq66dVdIW~+H;L%U^vW1@L~R^oe!AuC?lvGSKshgYCF zFK%3kt3F<3o|+wAdHc0R@csJS+}vybb~=ZLC&zmSdu^S%U9~!tl{$4@C?b#&Ghc#0 z&sdr_i-+9Yg9y41)rUl<`-;+bl6(S0bQcL-D9TyyD4&vr z18HC8cCGOr{p63cXECSTv1NXrzr!C9E!P3HfyYj@mUJmnqocY88qB*7Ou^dQ3lSX5 z2~#0p<~3XoNf<0nFyF8@6gHb18bcCS+SQkm{W{N#&)vK7<$LbAetUXwdUz#V-1U%g z`|qIqcXroxmm6yhIw?(H5HLGL2_)6*Vb5Nmm=IvvHZTh zvIp*49vybyeXHd!rrwo$R~X3Rtvv%6Xd9R~5_D|MT~TWHJVWZ?f+${KVeVR?mfl7 z-0piizZ~=@>l{q{-a9kXgPnVZ?u0l~8vB_cm1muL$X;%<88P>x(&_6|>FBla^}?JW zjy{0z?Lz|-6z9z#ijc=ZFx`bK(ulYaX(15n^VyhgBqed!n0;Y08H^n0!=q7^EQu5_ z2xU|VchTxuWs5P+J2o%Y9kC-EZ3%qEPIOqRTeL#av^ua!X=oAyyMZXj@hZu;S3cQv zSIdP*$4+gC(w1ob7fRwC{>Qc>Y0q6a)%EBCUe(Q~4t~*}xU;#c%C8;mR15m{K-aAA zCA`^aS&`Lvz4+c6{j0Ke?Hbc2 zd5&>-&X}SuLI$f=DBLqMV#B>-Gh&&sEEXY!$q|yXef@Sy0wmmJWQGQOp>!$R!wJxc z=yZG`0D;S)`vzpY?i7+Dd0bHtTObq&7+!2HE;|Dv2g%7n1VNb~7AZZ-S2(<|5t-HlSzI(7e0Zj5c*b;o$Y_mWDxVqO}v=Zv56rL1F*J)No^O?Ik0Y ze(0A~*2(gkBDL6PFdR<+tqZQs}x>hCBz5#V8BBqIu=AgDw{1J z2v})Mz9^K#$qrZ+8Q?34qz3u1T^NxJczcnb$d%3^Xeb^O3Q-^-5;+7egnCFkBC1va zgF$2D=yM8WLRyeOuY?;>gsJ6jXhALCyF4t_xd7Zm;N#xtgO4=zoE~W(Go?QA(Abx! z$DWFUf@pk8+@_lg59gLdJ#yjZrlx~y@4HK{?;0rF{dDvG#=`61Wi&VMPq2c3idWE> zXjy?9Uwr%Wg#F}QDRSE`paQtiioV&91f;A6gTZ$2xs!8tOLOD6EmIa~f>Odcl|C<1 zta(Ps$gHSvqn9aJK`8`2bhU&OK7~Z(feR~QQlxBbkEhZ2Nz-<6BeNs3G3Vy$=i=*u zP(X!NIFm>&i*@zlk6i_B}5 zZR&JE#YByX|9p=6t-B>8@SXF1-+OzW=l%GjZ_nKG^k2|+$3Tnji;p~X@k@L3;>FtP z?aCs$YYT7qR-a#f7e4K-xh|aY+*DT=>e;yQE*%fc`2JSKoTVw+fw3cr^jfAZCa^X6)+U@~PL)O)#Ma@_ zk-BMk#wIB@7&nPzav9!lP!c4N$Tum(0Rxg*x0UOz#uw6zVCQt=}b3M%P<#DO}=^wwQJyno{aG_O#npRTrR>&@&f{mYzm+QQUoCqb{!~0gC_;(m9y-x@ zGIj!GjuVlcW*yquNi=Ex;gtW~ptjZngsWi%$)zqL6%*92e@$1MtIBvKBE3Y}7+ zCirS2m?6;8KiP1<=>E3G@m7(8GE$-Vc;Yk$jo3gW>%@4ol@>5WAP5zW7CYKcf$jR< z`|n>?UHKmCHSVjQzSn*G@!O9)a(t@2_srzo4}?FYQq|1xam)5XR}N_pkn1CJBW!SX z$Jx2{vj7|eQZWVCec=mNd-J)np8?;hx)|;Fd~d5vQRQ}~W1iaHDOZ?gv(8@$``_O> z+M6~Hj`lmu;nOM2#2pE>O{(_DiMk@Xf=_1Lne}RlWv*C5R__yBoFl(Er)B; zb7iDNA{O(SR6=7=frD<8RuNSpOPt4%fF5O;4w1YtkEp3T-Ij3H&euS(7L6zf8iL(# z@AO0;=vcy;pLf~jPfhmT-G1uMjkmrRqpR}PYu~^2^N-&>c;>Hrx{n{ZxN>}E1yVoJ zUVAtyDpq!{?OxtL+}!y6@7vfqHXuWN=q(qLR~9l?rg96Ffhawi_GY7C8HPNQ2?lh& zbP1u<#`fl=3XLWxy?yCM_1<2^6LP@0)j1RmpmZk3MV3epGE?NKD71?S4#`((b*+fDY-!8hMZ_H9$>L@8byigVrD+5X!j{F_-7#D>IgePfb`w5sTcy0i;qQ zwtxrr#A$XaL@UI+TE}ZdI%S;)o{cGbI%aEGQdsR0v^71Mk!tV6Q1#~RNlL>SE?CkPMOhGRU+#i zf1)ma;=~ET6DRrnNN^|}% zzVo%_9w8BSG>juMktjF{u22BBu8OA$$^t=?P~-FYjP8DGM9kyFd_t*If+lmos_vKh zcy1F3B0pgjNM)ibC~K=ZgqSbm%k&n#$xBA+rS-7;L}NWVG7c!9u%gO#mI!9+)X`BL ztxI`yOgW^}v5=#$fQuONx!;(Ih{YDu>o2@H}ZlV-Ij@E;vLpK`idVg2^v{@m5g z%Kq8)&CM@DDF< zz7YUvOcFgup8*vH-XFIjuocFj%EaXw_;LfGSF4js(l8z&2sW7!iR#deX@-O{jd=s% z5XGy(ejT=U8&t%jo+xhkB31M->GbB=97sZi!qfs&w7q47ce%x`!c-=Au(zfRhs!RHISMnfN9|AvSh9QI zLgv9kqv*u;SC3WV8{1oz-QRv-KL7J@^S4_+EiNx_?e=*0;>}M8>c&ZZBx!ZKNrN!h zUlr6=Nn?DmSR*!wtsF(hs}>uR7>FPxs>mQuC2!)gLmdrLq0GW}TS%Y9q>fFitvqDA zb&wuB(a_WIgrm+F4iTY72jy^eOt#dr2H#G3pvxCFqjZ7d6?$>m&9fsJ@PRTu!|>G0 z5yR_OED&gcud96B-Tihi#@;=!vNQqN@kw(hV{U0~on^ju8*nWQxu*;Zxi=&W8*SlY zI28@iblhz2cbOF~nxb3`?SWt{)9xyJvfG=0bou>`neDAn@3hY`xVw3U zh$x;sp*kT|#mSzWAy6=glPW$J!<_^w+;MV~Po|N;)=2ak^!Y#Uo!dvFWbrwa9G{W~^2>PbSlv zFw_i6n;ENtE0kmQlTfLbgX_!H2o*+!+ejq&GB=QB5v8RLvsxS5+A!Fyrg6BgXFMFH zU1oD_2Oa_>rEN?qA5P^%-n@5g?B?phr9PGn$9AJY5EFSmy&iOE|&5hx!Mn#pR3Uv!a@LI&J zq%tWnka{am&*A6=$YGGjYr*d3Sw-X4NMtBtGVzjDiJAl2A4e#CMmP@VhMSHjs>7(a zfdOZ=4TBRCE(-4VD*z# zNh(HQII#jfxCV$lxmp3EqFpFWQeJ%0*)b-aH-jFBrw{!67eD=9C&%mW>RMmyLSDYx zGU~E7uF&UuYdh|S;_p39XKxz!cadt_e!P%;ys$X3Siq-{dv|Z`^R4UKlv5Y=z%1+@ zT=GtEO=+`E_iR4xW&D0Bn{tHE6v&R2E?+vlus*jxT%P;=8c3=`R_hG-OECfjW_3T= zPg;3$4PWj9S6>^G2@3&;uJJi?0}p3i9MniPY$iYC)9}bDkya|#i?t@ToG;`^)uxmI z_r0}0E>h|e=s%+8UN_JTpo+*G3h7{s9Xe-iEtO5{vi|YWHI_Q?EVjRYlif4BmPgLQ z>T!jYoavH1)lq^(R`gDUeRmf<6J}Q%sy+8#&5c}n90w1sFlQL~>ae)GKeyxYhIQVW zM5?;lHjhcXY#3p4MYAsa-w~oxgIO5BaN_eDxeR=1;b>>`X#JL;rw2bO&{FOs8Plo+ zQf{0b0zk%MrkFMoAZ0k}Ds99>YV=Jp#5QhU@|=Xv#ZCq6h2Y}~v{g#uI38C9Gd+1? zxC$ZScSMNwpty_b@C;hpXh@0M=J8`B9OfFjCdJSc8gY=zSpDkxRd9?B{(kH~FyAZa z!!CB+(RY0VCw3lF*H)a+s_dP(yBjiYQM>0QWGBDP}(GzkarYYh?rCjHA)TGl%*)e+wBj>RD%j*Ti5V^v7;VTf=%W*<20$3;%Gm3?J zlOzc}HNCV-5@Z{VVu{9@F&K@Sq!{pE=*Y_50dQfE$BVg|02I@OZaG4kq+6^}6Odaa z;N4*RBDFMvo&-k$qj$7n?r~y(mA!#SccmE@n(Z@r?@Sh0#npd5V}rQr{*_Z;0anYb zz`~^xqOu~w6uZvjY_q#uEr4TE@DPxe!51$Be#O$n3)lA2X5IF}@-CCWX`*d57l!%R z;Z1A22%siHc0@IfaJ7wULx_KQe-0;v-TgX#Eza%iPWOA+R(gyinvjheG#rglD}f(Z z3%R(^3`%2wi@24S(aVw?+yN%ORm_)T+8GQ&#w!ScAhd{^xTFlqd>kbqtJ4}S2Eu9) zHPqF&wY56f$(V^SokFQ1p{VxK9@-YxnE@;UGI@0sTW8mP9~wi;iw|FTcyS%OpWDha zB!GE}Lbj|Mt%P_5DQ1P#h&Nt)6 zYsY*Wlq$jrue!#I`b1^n@eAu%7ykc^KexUDqw85c*)LNf<(4b8e6%5CVw7xf)$xg> z*raWeD0qA$8NgeYsPr5XnuBhAl2m3C3Tu$i5M;Qi0Dw7Z4`kr zK!kKcI^5`V=&EaR--XjUGt{nXY&Is%i~`fK%C3X!7w)*w*N2}5O!7PSE8BU*qzLzm z9yTy#7d(}{$fQeYJThz@3r4@(_tSxYaOTE~*AMbuzc;R<<90e89S*r@q_1=~)la(+ zEhBjy1Z437yYMX*3+osDTd%;wtv-A1Szl&I4q(PF zEfa`Qs?cOepMfMn`inQ25X%Y`G9^c*!iZ|fOrsnrsy_+8CQ_?J^}@Qk`V&esWcS0T z?}tq7zBe1wRm3u|$%YjJCjVH|9;3N5W-KqF8E42=ZL`tE!E6Yj>*y#N ztOxrnIe#7d1ylY1H~-jeET0hs<)NYB3<->wMr?v`a!^22srWeQZiyRmb9_~VgtnxZ zBr{grX2{mH@*vO`$tGEHIO*o|2m&U-=gZ|nk@}=sWR#?o1kQS6Rr6_J>RN3;*PzMc zBv6-z;+amD_QO>FJ?>bWM}3RzT3*Lz%j-{%tx;YxlP(YX(_z*@+lpx_no6g!^|7(t zo9ve^!?7*w>ZZf~)w184&Fa9i)PaXVowqyB!=WO4s2U& z`}haeZNGrI%5t+oc4C7%nM}q<1xm<^LtwEd5X1$57p=~iK;qZCwI;ci-^7>mtuk&V z7AwRJG6fF0M#fVK|EZ!VJQA7~*Am03C)o*upc9*$){oeO`@BQBUy>GX__i|0_qxU@A z`VA0BaO}62r>6&Z{`>$Zf~e+$r#`s&q;ws83sR6>2q=JcnBErJd+5`V>8+qI`1Dl_ z*f{||eGb%Xgsqhn-L_CnHaWyFU0(N^YZFz~xnwL((xgBg6131ZdDYSl70^e|Z~^jp8?99- zf+o;bJW~dCD#F$h5hBYll9cI)w3yu^67@um1tC;_QQQT8bOYyu(^yQQB0NG5>GIQC zPle|QpnLVzPjSd)tqT9Q6S7TL@bj8eeFwdl;kI#8rmG>0H)Q1Re7XuZcm@DCo(4-) zj~klk^ma<#uG89G-MDeH1!KQC4FUD&;%Dp?JHEH)XYoB;e?Y|w1?$mx0Y#^vrX?fQ zqtl!*Xu9KTa-8C66UjQsg?C-g4=l?9&M7uW>frFAgi2F-(J;6HYLNs{iKeJYSgK9T zr8&iBscd$mg9nth#gMSt9-+@-G+Cmz;TXmYls`pZ%h~y@5ASUpD(BB{?BLwo)vkxQ z{~c{-YZvRC(#}XL4@2>2Yk4+Z{sKMp;mLPj;_rTIhz$nA<8XdJ8Bn^l9$qe|wKZ*M zr)Y?T(sp?YY4*jR&qA*K=dZv1_1Di2W9#AGANT_&9{xUB9FEa2D;Rn^D&PT(SI`_T zHwRsKZK@c>u2E#hT}PFfE5y=dJgz25lgiJefdM~=dr{z%JV;$?u5*CIL%bP=}=a;KtaNQrRra(og&9(q=AOpm(RTIf#V|n{_C_%XR z`Qbl*{R`#Sqn|GR{tGQ;5cB>T+WP@8eu3Yz{Y-O4xs;NQPnuA1Lh(UyLScZ?qQOwa z0OfT)Miyz3)77F%(O?+T_sbt};bLcGGDFtfT6E1_JCKFSmu+1pR;XDd5=H&d&L zcqs*s5a2dyVZHZYxI8*IJy?Eq=ZQC-1E+rZ%iS-ukIPsq*gLrU^_^YxnqS3XLR!)< zjR1|SRqICS?6Z$P`R0@BH~L$3q z7r*`S=bx`09o@e5+fP3}5N`eFyN@5e6>c8eKmBD|w2;NP$X{Zr8Rf50vTWwlF(xnB zU~CD#kkl#FQuRE*zI{lMvo@ut^-!PndX7}{r`J#6M}Toh_aw@% zzVPaE&mBGYI5a3vUHlztxc_+Y=--V$fsrJ4ep)WnisfZvYt#vXdL6<(I$bmisv-%D zO`uoOR%C@UY+)eKFGb^AnpTTNGuE`oLDW!r-t&??i;@h-`f`QGu5-`lG8y!gAF4DjR0kRMZr@qvaw;kP1C+&JGI({(3E~=Skg5 z+l(=;*n%2Mb_oflPMh5Ugn-#ZHkFOU3n9$0IjK`ACjmQXGaKY z?%etiQT62)UmxGRQG&TwtDS1Kj7Je+?8x+9Tn|rk2aOq>P6q)&38~61Dwp^k{;)O* zJ=(}&=JAcncCNjJ(q65f(`q%xA32bghorz0w{hKHeeRxVFYxE>7cMU^PoKb%W9!XO zzx>6szug{>Ay=llZ9bXL<5n}Vg22rXttxSvXdVs@JsIu-`&)a=O}WRIeOAR@%9G<+1wx4{g0&-FdHH#U3>@gCLH<8@TB09RkftxYpb7 zgIDWULwRX+jz;BNVN%KE_P6KPM-V9ew@y!C?>Of%_USGU4(@)t7#}T;76%6t*!x%C zo_~D6T#HeraN>K>sMl*-oJw9Jl>##`b(0Vj+6Kz2a*QWwb<7E~cH50c3rT{@>*z2{ z32KVryL8BNVwwp@Nlm_zVY8vZ1L{Yt?>iPhvCzC#^H$EvIreV`r@vof>p$LUVAe}( zRc^pi{mzbtG;F<&Q-1{M>mztD?S2ptRdBiZyc)p3N4K164UoBAV-P1rH}{BoW@BHh z?>!x^{mnW?=P8r9+^~Eg%OYF{;TkuWFQKb;arVbwf#tdjkW<{@?Ci&jPY)Kcq9CPa zi8c~5j`P4srf6N^lAK&Y=4Oz#>n16~hO(P#Mp>av%5BC-n+j!CKzD$++Cgh>D{SRyg&fsye_-o(ZbBW_DpxnJS7GpF$SF{| zz&pR#`Mrf_xe%OUVaRhCugtu>D?(az72qkNBO8GuRhQ;_Jm#T_Vou!KM1?a zH;}Z!WLJ~c)L#r2i_vl<24F1Ce|qEHJ70h}L_=G@-$DK{*N|?n=N{X{E8&lBJ-WO3 zc7N+JaZ7_veib;Hd!<&p;y7Zb-`^CsH|n_^dMTx2e32K}!R{H+()Oe}DPz-F6(zYjeEdl^$kpscN30$e0ZZPK^~6 z@a)21aOfL4MX8(_L);S?FwL1ODAyz!t>e1dmQB_~>PrhsC6$%3y`CZa_C!HYlj-O7 zYAlE_ZwklO3be)u*wn%}-%o%1;KOG>Z2-A%0LXTyqsAy0l}BQ~ysm9uspFZ7^7>Wa zeHf(y=5WzR>)Ya^b@3r>Tg-@&TneEb7&2$F?ztd$!MF?VcLq``uvZ}K%uAEWVm=8-l#|wg*Yin&Mq?daA$SEE=()TW4@=J343&{s#}A~& zy*URCu(wlNIhug%?Y9r#ci$gU9pz58+YW^{pz9 zZY7Gl;GH&iVC$Rv;W$jhii(&KuB2Fz&y3g&tlUOve}6yq{A99x#-A0erWN?hMH2=O zg_kWi7nUx&NYavwKpFn{`?E3K_GDfj$B9^)_GgwW@LW3S@j8*`p?5L~({!i&6CNl3^kx<8S0G8(+tSyD5tbJO3o%3)HK>lmIX^kWjQ-;rVwesJ@p$Sr{@hV z%UL!cL74`~C*M6EPMzbDgj5SI`8q~-Yfwf$(g(5i8s3lYzo*sj7eVH?MlH+Hq$^@) zd*oo-`?>u(n9pr7ThHw5Z{*P2WP%Epn7zzC5Z;-%!D0f7p9PDtbvTADbul*l1@8Dj zE)-0@?dyUfnZ7Rw7G&y#AMd$QQgta$p4f8CZO0-M4JEUU!c(!yH3x<+I|2h>i^i@+ zT+e_JA!ubN5*2xp(IpTWN=%_BHu1_N5*bj2HJ{AUNvCzfn5SV4{YFsr8h!9aD25!I zfB4~#A0Hq0!)~_Px`&X|Z(Q;EAl2AXsfM=t{^pKWeOj!C>WY@^^u6`|_KV`))4e(l zoXPPWB#C^*scndxn|pxwM7GNoC`rhyIlW%n_bssOiohEK|73h}B+H9yNnQ!8=FIYK zo}keY>bgwNx5m~$kldcsW?WTJx?IJkRLbNqx}i&OwhrqVOhDe|i*YVmk-PFtYQqtN zsRY(jN>>$BicC^0#8Ujk=sv>}1S`D~N#IXuUYX2&WNniMme+Dtojzn{%ex=k`gU=1 zQR7>UPNy^ywd*Sw{Q7IJq1_M*I#Iy;I$lq|TGcQKM%+U6w!B%@#Lj#)8cCyQB1ejQ z<0=pyA=MngBL?Tx_xBPKV@$?lO844|tEdJ#95GGokSom0@R^4q9CKkjwr$oX;+*Tc zV>Vjwe2Dv8zg|=2gE+Mq>V7e z9;mk4uf5ja-0EW(hSq3iOrGjA_@**rT$s~2i$z~T`8hdku`i&%`+tj|qYpaNs3l z(WE3PNLyzzqY|?w*-Yk(BnS+l;M+akgwiz&}U@7Q?QWT}=tit7$bRukmqULN90$RTVB`UY5qa*s9xR2McYi$hM&i~E4prOsJ0oRM5gWb! zQ1qOtr-hFfR2!YGRJDUlESQc&shUf?oQXV?%E61XsZ=(D>ZVuQ$Pl@DCYS3}x*&^y zJM3PD@dR`XFrEk5`Qga{R2*cIv7&83m>HB2c6}FJANu7&P#6pONbwbD9nxxEiI{Vl z7u+_vM)6UBJ0y}S?z#}|mG31xwKz`?j_4Pw@qY7=BM-ELyZUMi9&72RN?G;3QrPtGA&PU8d(y&|)MAk$G2 zF+6AH2b4AI>M=3~^(Xq~6nM;J3^NU4#U#yBf=#FbB(Efcep*U5Q{z;HsnF0&xILnB z)?9{Kai1NHY8`3R8_mzgH-jTopT219=YVIuvM81T@uNBb3_)2AacXTlA?|fHLt0Y| z|1&4To!7TSQ9~gohkvqr8{sUpST04Z3E?MSsjv)~;l%SE%AMB))~o3 z)-nhtN)A!?Ry~2|^dzmsd$qZg%T+p(S7n_lsLhc!!jPY^bej}wUO9s?{<#_gyfu@Ev4vb2#*4xizdX^%)ETV1Nvd5URB1~u=FVlvTqmOFeA;7=$78UE*t=saXJmvTiqJp-X$Z}_G!jXXl|a!J2(nN{ZxIp&$jvK3 z;@@(d1q$v<#(BRM?|Uh~`ugQ-WGQePH-yKC`)cBbLf^fISFq3S zKKb~=4-wF-xI`MU_3CgJsn2;9l{m9`KA?=uuAhGWvic(eA{ z4`~#gyc>2eEpbw8IVmg==ii33iFD+kj^Yg`d3-Q#vqmp}e0=(H_@SvDpK*!$c>nNz zh8t7-^2he~@1MVTzxd?-^ZK(-KF2L+K8nAEJ|jgTPi1$X!kb@bHU56T5I%#fe+YxN ze}fpf`?`4fVe`@)p0^vm(S?l*Nc1>rV;*pQAlqKjJ~}=cGdbp4pYt>NuH3f?lZb%J z3e^rg{5tCZRIa%~A{qg|47p`BCO^PkhIAV!b;IiESt99qq_zzp4`Fn9x+I zBp)J%|3%MQVoz1N9iH|?NGqt`pi0c2t2CyjE{`v@c}e;G;qcStx9#)OSMMG_e;41Y z_?!aJx8HvI?pG-IVfUZjEr6Gsqd(l;;u_Fv4Bvc%d&OsqmaXa)%H-@NTiLJc`h^yX z zdbo>>9#4yxG~&4x-VdcTG>^dWq?!z+~;V$UdQhi!-Wo9r-Q9N z|K=NP$SRHs1XK|(zomaMvVy;bXh;#`Js$4{{v)cqyEvoHw#p{)x^MRVunsPlEZ@E9 zFYA-s zxqI)E?-n7i@38^cgazBb&$zCSXoK*jpab>QT)(qU@V(=;y3OG+0&9J{2~IX|hm(b2=8MRE(@kPy}(F2o+qxmnupIO&6Evx6WT-~E0yI-hH7RWf#`y1iEx%+g9`5Vta1?`uUU<6zYuh;Qnw5~VD zto}61ZeB+&*%U>gNfbp$sFR6`JO#aXsdYq-Y3}n&yM7Z`+f`MUKW%@!ti^K@#UVJG zd$TJ@KTW}Cn>_EDB%=92g^=?#@x2(V?a{bJt(hvK8|l!YCqxG+o#*SOqq2n`8_C#^ z4;>_iYzXHdSUf-k8$u!~j`N(YNKKE$0v*5S<3qDRN2wL5&ft9CKeZ5|dgpws_GGhEoPujA;bY?P0 zZOf`I?(He@e!n3ifBW@f{vaML1N{f7;7 ziu|@ui+gm|85j+;48AnRtTg-zS3hK*!o#nYEite>Rtwt^)DZ}@i6V68*a|$x<0BDV zD99Y8)(Xb#X~LXVhQO?)v>;4*-(8}^o^>6rR$O+;d8kTBtvh(p(H(JvGlw~Q+*Kay zpAtnFE=CM*8YKNKKSM1g`nKiL#g(?2vVv4mCq_x7c0nPuP$rzfJkljq|3+{wMhA^0 zR+54ja3C)!jpGP@B~QasTGUH$-!1GOfnkM5gkiDct3lu5qBbToc(2G_zvfuP$7MHT zQDC6Q@vCKS!U)WAVxfGeDMElF6s5C>b!j347WJPp4L##x_sSWaw>=dHvAUeeFD*#TiIR&DsL3(3mJNkic0@xc9BCP=5XOSI@|Z z1-2^QC4PhylQ=sG`=)l0<~(4#4v;J3P}2B4BE;?U{%i)FwrpnE^-Z%oWV4$NIiZTU z&@wtp>ilk3@`85~6`Y0?Zo@sEqi*DS7+f@~s9 zSLGu2uvK=2-7Uk6C+y)qzQ5@}nSxFNpbL@RUBMO}ixH>Tg48uiC8|`jF%#p81veQ= zly8F*mhhd=&zr;g@K?8f6ts|?SNxE_iTB^x}tLrx2Nn-?w(nPdEFv24!tyhdyL9o1I!nP5lXY@qM1v-L~$JEeG z_gEYe#4cOvk*mm#6tEV-$5kf8Gr}8|&8DW=JexV2R|Vb!cDPn+3X3?BxQpllT}LDV z+xf^Wfy;6ygya(LzzK&mWm)UhroXh@SImMK3N5yWzKPQ`MGbS8&BTo6Rz~5lgYwP3 zP>uI|Pu>hxczy3zm2$9i6GdZV?d)bpgo`&X#p8bDD}0 zGTU)!Rx6#+Xk71_$RNwnhlSV=={@?IMdmQTOtGl-t#FA;TECjjU_ig5bOWOnLuO`C zj%@Ka>f1;(xnG*`nM#KjmTJ9pFG-Mur*HTBU@hl)*Qtn%p;f!C+%9rZU&pB36Qhl2 z0LQJX)=zBvsqfOOHWdCK0&~s`X4+a zNklAA1HZ9x1a~BoX4y*>(He=2KESRI_Bv zO}HKBfU|~1NdihUCL=0k#h8%77zwQrl12#Q{_^JW(F@;oETrH-dx|2%(abf%0mW$M zGF|6P(wX=rE%oc6iCWo`wr3Z;-66M`XrevpqH7eWmO5(k#L3x6m^)4qE*C@z)$WxF z%0pkfrh&q=*4oqy5W{FJ*Tii^Gl6glYr2S*)gb z^9Ehqju71?)@5)}Btw#%#!)6nZcY(!KRD?GZ)~^gd7CUxwP;W-tO|m(QahFo+olkj zGCI{=!nt%aBP6MsCK+r;c+dY7jhqT*g{sf9OXjP)LzZMNrU?AmOok{)4T)@`fHPF8 zYV+0-+aby<#Lh|0C>BfQ0=-t0E72ttv?2#Z$@KVo0|dptBKom z3v>mj3&VgIcXeKGY-ArdDSJIV?6g2^iZ%4%VmXac@YcUt}E&?3f9K0 z9+)o-D-v9cT(8O7OUS2Z&fvD?`w=rFIr0@!YQ~hj(km5AU#FD`-cHlR6pAJrN#1*} z+JZo77-Viz3k2%SVodA*pwF++VgEq~?8UHjvK%5n7q8GU0ev;L%(g%WLipA?Bw4Hw z!pm@GA_igJiefrmwn?8Scz<7YjdHFT1|^ZdRYzhwN$%s!nXaj>lhKTkP50uNKUz`_ z{!H?<8-jl>wpCP_2X@s7ul=1t+Qi0B*20g5GBHuRH11wN-58oBMIr))cUG#Uw0d2u z`zJ!pe1nb+_&;>0Hvlh~WdzNH0eT^D{vYW2)$6zE3=|&FC36;D4?#+8*sSR^P7~fI z_+~>o%D_4#@y?E_^IWw|AQ)}L3f4NP6D2L3qeA6L6wQ-zqvs;`)+V$kz6x8Nzljo= zEv2uGI;;Soslz8{ji84Uu~NA#lzD|%55#d5>;gTYRj>}wDOU84*TW3_sBf;>40#I~ zeT7~da9A(U$zqNWetQMS3!J~117wY-SdPGX#0VD#w?KEV(5ap*1y$hfA|6kHB|t8^ zG4Y)ejZa#pFmG#_pbj#j?K}x8xe!80F+=6mx!JS{8wgvIzf__p8koI;Ac8$$)sn5Q z8nhzwJn67xcq5pCi-oW~bd$9qEHyk7sC5pkkEH$=Ix_~CF$qSqKwr$*8pyF^0u!&$ zg?)uyup3^Oi(a8Kz1Yp`k#r2uCH}qtpo1J@C{ryF3?$__SN_~C#jYPJB?wb3!3>O9 s>SmKTFz#xX%2+j_#T4;&ea^-9Z+8#z7el$et^fc407*qoM6N<$f?|Tx;{X5v diff --git a/vendor/github.com/go-playground/locales/rules.go b/vendor/github.com/go-playground/locales/rules.go deleted file mode 100644 index 9202900..0000000 --- a/vendor/github.com/go-playground/locales/rules.go +++ /dev/null @@ -1,293 +0,0 @@ -package locales - -import ( - "strconv" - "time" - - "github.com/go-playground/locales/currency" -) - -// // ErrBadNumberValue is returned when the number passed for -// // plural rule determination cannot be parsed -// type ErrBadNumberValue struct { -// NumberValue string -// InnerError error -// } - -// // Error returns ErrBadNumberValue error string -// func (e *ErrBadNumberValue) Error() string { -// return fmt.Sprintf("Invalid Number Value '%s' %s", e.NumberValue, e.InnerError) -// } - -// var _ error = new(ErrBadNumberValue) - -// PluralRule denotes the type of plural rules -type PluralRule int - -// PluralRule's -const ( - PluralRuleUnknown PluralRule = iota - PluralRuleZero // zero - PluralRuleOne // one - singular - PluralRuleTwo // two - dual - PluralRuleFew // few - paucal - PluralRuleMany // many - also used for fractions if they have a separate class - PluralRuleOther // other - required—general plural form—also used if the language only has a single form -) - -const ( - pluralsString = "UnknownZeroOneTwoFewManyOther" -) - -// Translator encapsulates an instance of a locale -// NOTE: some values are returned as a []byte just in case the caller -// wishes to add more and can help avoid allocations; otherwise just cast as string -type Translator interface { - - // The following Functions are for overriding, debugging or developing - // with a Translator Locale - - // Locale returns the string value of the translator - Locale() string - - // returns an array of cardinal plural rules associated - // with this translator - PluralsCardinal() []PluralRule - - // returns an array of ordinal plural rules associated - // with this translator - PluralsOrdinal() []PluralRule - - // returns an array of range plural rules associated - // with this translator - PluralsRange() []PluralRule - - // returns the cardinal PluralRule given 'num' and digits/precision of 'v' for locale - CardinalPluralRule(num float64, v uint64) PluralRule - - // returns the ordinal PluralRule given 'num' and digits/precision of 'v' for locale - OrdinalPluralRule(num float64, v uint64) PluralRule - - // returns the ordinal PluralRule given 'num1', 'num2' and digits/precision of 'v1' and 'v2' for locale - RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64) PluralRule - - // returns the locales abbreviated month given the 'month' provided - MonthAbbreviated(month time.Month) string - - // returns the locales abbreviated months - MonthsAbbreviated() []string - - // returns the locales narrow month given the 'month' provided - MonthNarrow(month time.Month) string - - // returns the locales narrow months - MonthsNarrow() []string - - // returns the locales wide month given the 'month' provided - MonthWide(month time.Month) string - - // returns the locales wide months - MonthsWide() []string - - // returns the locales abbreviated weekday given the 'weekday' provided - WeekdayAbbreviated(weekday time.Weekday) string - - // returns the locales abbreviated weekdays - WeekdaysAbbreviated() []string - - // returns the locales narrow weekday given the 'weekday' provided - WeekdayNarrow(weekday time.Weekday) string - - // WeekdaysNarrowreturns the locales narrow weekdays - WeekdaysNarrow() []string - - // returns the locales short weekday given the 'weekday' provided - WeekdayShort(weekday time.Weekday) string - - // returns the locales short weekdays - WeekdaysShort() []string - - // returns the locales wide weekday given the 'weekday' provided - WeekdayWide(weekday time.Weekday) string - - // returns the locales wide weekdays - WeekdaysWide() []string - - // The following Functions are common Formatting functionsfor the Translator's Locale - - // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v' - FmtNumber(num float64, v uint64) string - - // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v' - // NOTE: 'num' passed into FmtPercent is assumed to be in percent already - FmtPercent(num float64, v uint64) string - - // returns the currency representation of 'num' with digits/precision of 'v' for locale - FmtCurrency(num float64, v uint64, currency currency.Type) string - - // returns the currency representation of 'num' with digits/precision of 'v' for locale - // in accounting notation. - FmtAccounting(num float64, v uint64, currency currency.Type) string - - // returns the short date representation of 't' for locale - FmtDateShort(t time.Time) string - - // returns the medium date representation of 't' for locale - FmtDateMedium(t time.Time) string - - // returns the long date representation of 't' for locale - FmtDateLong(t time.Time) string - - // returns the full date representation of 't' for locale - FmtDateFull(t time.Time) string - - // returns the short time representation of 't' for locale - FmtTimeShort(t time.Time) string - - // returns the medium time representation of 't' for locale - FmtTimeMedium(t time.Time) string - - // returns the long time representation of 't' for locale - FmtTimeLong(t time.Time) string - - // returns the full time representation of 't' for locale - FmtTimeFull(t time.Time) string -} - -// String returns the string value of PluralRule -func (p PluralRule) String() string { - - switch p { - case PluralRuleZero: - return pluralsString[7:11] - case PluralRuleOne: - return pluralsString[11:14] - case PluralRuleTwo: - return pluralsString[14:17] - case PluralRuleFew: - return pluralsString[17:20] - case PluralRuleMany: - return pluralsString[20:24] - case PluralRuleOther: - return pluralsString[24:] - default: - return pluralsString[:7] - } -} - -// -// Precision Notes: -// -// must specify a precision >= 0, and here is why https://play.golang.org/p/LyL90U0Vyh -// -// v := float64(3.141) -// i := float64(int64(v)) -// -// fmt.Println(v - i) -// -// or -// -// s := strconv.FormatFloat(v-i, 'f', -1, 64) -// fmt.Println(s) -// -// these will not print what you'd expect: 0.14100000000000001 -// and so this library requires a precision to be specified, or -// inaccurate plural rules could be applied. -// -// -// -// n - absolute value of the source number (integer and decimals). -// i - integer digits of n. -// v - number of visible fraction digits in n, with trailing zeros. -// w - number of visible fraction digits in n, without trailing zeros. -// f - visible fractional digits in n, with trailing zeros. -// t - visible fractional digits in n, without trailing zeros. -// -// -// Func(num float64, v uint64) // v = digits/precision and prevents -1 as a special case as this can lead to very unexpected behaviour, see precision note's above. -// -// n := math.Abs(num) -// i := int64(n) -// v := v -// -// -// w := strconv.FormatFloat(num-float64(i), 'f', int(v), 64) // then parse backwards on string until no more zero's.... -// f := strconv.FormatFloat(n, 'f', int(v), 64) // then turn everything after decimal into an int64 -// t := strconv.FormatFloat(n, 'f', int(v), 64) // then parse backwards on string until no more zero's.... -// -// -// -// General Inclusion Rules -// - v will always be available inherently -// - all require n -// - w requires i -// - -// W returns the number of visible fraction digits in N, without trailing zeros. -func W(n float64, v uint64) (w int64) { - - s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) - - // with either be '0' or '0.xxxx', so if 1 then w will be zero - // otherwise need to parse - if len(s) != 1 { - - s = s[2:] - end := len(s) + 1 - - for i := end; i >= 0; i-- { - if s[i] != '0' { - end = i + 1 - break - } - } - - w = int64(len(s[:end])) - } - - return -} - -// F returns the visible fractional digits in N, with trailing zeros. -func F(n float64, v uint64) (f int64) { - - s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) - - // with either be '0' or '0.xxxx', so if 1 then f will be zero - // otherwise need to parse - if len(s) != 1 { - - // ignoring error, because it can't fail as we generated - // the string internally from a real number - f, _ = strconv.ParseInt(s[2:], 10, 64) - } - - return -} - -// T returns the visible fractional digits in N, without trailing zeros. -func T(n float64, v uint64) (t int64) { - - s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) - - // with either be '0' or '0.xxxx', so if 1 then t will be zero - // otherwise need to parse - if len(s) != 1 { - - s = s[2:] - end := len(s) + 1 - - for i := end; i >= 0; i-- { - if s[i] != '0' { - end = i + 1 - break - } - } - - // ignoring error, because it can't fail as we generated - // the string internally from a real number - t, _ = strconv.ParseInt(s[:end], 10, 64) - } - - return -} diff --git a/vendor/github.com/go-playground/universal-translator/.gitignore b/vendor/github.com/go-playground/universal-translator/.gitignore deleted file mode 100644 index bc4e07f..0000000 --- a/vendor/github.com/go-playground/universal-translator/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof -*.coverprofile \ No newline at end of file diff --git a/vendor/github.com/go-playground/universal-translator/.travis.yml b/vendor/github.com/go-playground/universal-translator/.travis.yml deleted file mode 100644 index 39b8b92..0000000 --- a/vendor/github.com/go-playground/universal-translator/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: go -go: - - 1.13.4 - - tip -matrix: - allow_failures: - - go: tip - -notifications: - email: - recipients: dean.karn@gmail.com - on_success: change - on_failure: always - -before_install: - - go install github.com/mattn/goveralls - -# Only clone the most recent commit. -git: - depth: 1 - -script: - - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... - -after_success: | - [ $TRAVIS_GO_VERSION = 1.13.4 ] && - goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file diff --git a/vendor/github.com/go-playground/universal-translator/LICENSE b/vendor/github.com/go-playground/universal-translator/LICENSE deleted file mode 100644 index 8d8aba1..0000000 --- a/vendor/github.com/go-playground/universal-translator/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Go Playground - -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. diff --git a/vendor/github.com/go-playground/universal-translator/README.md b/vendor/github.com/go-playground/universal-translator/README.md deleted file mode 100644 index 071f33a..0000000 --- a/vendor/github.com/go-playground/universal-translator/README.md +++ /dev/null @@ -1,89 +0,0 @@ -## universal-translator -![Project status](https://img.shields.io/badge/version-0.17.0-green.svg) -[![Build Status](https://travis-ci.org/go-playground/universal-translator.svg?branch=master)](https://travis-ci.org/go-playground/universal-translator) -[![Coverage Status](https://coveralls.io/repos/github/go-playground/universal-translator/badge.svg)](https://coveralls.io/github/go-playground/universal-translator) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/universal-translator)](https://goreportcard.com/report/github.com/go-playground/universal-translator) -[![GoDoc](https://godoc.org/github.com/go-playground/universal-translator?status.svg)](https://godoc.org/github.com/go-playground/universal-translator) -![License](https://img.shields.io/dub/l/vibe-d.svg) -[![Gitter](https://badges.gitter.im/go-playground/universal-translator.svg)](https://gitter.im/go-playground/universal-translator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -Universal Translator is an i18n Translator for Go/Golang using CLDR data + pluralization rules - -Why another i18n library? --------------------------- -Because none of the plural rules seem to be correct out there, including the previous implementation of this package, -so I took it upon myself to create [locales](https://github.com/go-playground/locales) for everyone to use; this package -is a thin wrapper around [locales](https://github.com/go-playground/locales) in order to store and translate text for -use in your applications. - -Features --------- -- [x] Rules generated from the [CLDR](http://cldr.unicode.org/index/downloads) data, v30.0.3 -- [x] Contains Cardinal, Ordinal and Range Plural Rules -- [x] Contains Month, Weekday and Timezone translations built in -- [x] Contains Date & Time formatting functions -- [x] Contains Number, Currency, Accounting and Percent formatting functions -- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere ) -- [x] Support loading translations from files -- [x] Exporting translations to file(s), mainly for getting them professionally translated -- [ ] Code Generation for translation files -> Go code.. i.e. after it has been professionally translated -- [ ] Tests for all languages, I need help with this, please see [here](https://github.com/go-playground/locales/issues/1) - -Installation ------------ - -Use go get - -```shell -go get github.com/go-playground/universal-translator -``` - -Usage & Documentation -------- - -Please see https://godoc.org/github.com/go-playground/universal-translator for usage docs - -##### Examples: - -- [Basic](https://github.com/go-playground/universal-translator/tree/master/_examples/basic) -- [Full - no files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-no-files) -- [Full - with files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-with-files) - -File formatting --------------- -All types, Plain substitution, Cardinal, Ordinal and Range translations can all be contained withing the same file(s); -they are only separated for easy viewing. - -##### Examples: - -- [Formats](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats) - -##### Basic Makeup -NOTE: not all fields are needed for all translation types, see [examples](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats) -```json -{ - "locale": "en", - "key": "days-left", - "trans": "You have {0} day left.", - "type": "Cardinal", - "rule": "One", - "override": false -} -``` -|Field|Description| -|---|---| -|locale|The locale for which the translation is for.| -|key|The translation key that will be used to store and lookup each translation; normally it is a string or integer.| -|trans|The actual translation text.| -|type|The type of translation Cardinal, Ordinal, Range or "" for a plain substitution(not required to be defined if plain used)| -|rule|The plural rule for which the translation is for eg. One, Two, Few, Many or Other.(not required to be defined if plain used)| -|override|If you wish to override an existing translation that has already been registered, set this to 'true'. 99% of the time there is no need to define it.| - -Help With Tests ---------------- -To anyone interesting in helping or contributing, I sure could use some help creating tests for each language. -Please see issue [here](https://github.com/go-playground/locales/issues/1) for details. - -License ------- -Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/github.com/go-playground/universal-translator/errors.go b/vendor/github.com/go-playground/universal-translator/errors.go deleted file mode 100644 index 38b163b..0000000 --- a/vendor/github.com/go-playground/universal-translator/errors.go +++ /dev/null @@ -1,148 +0,0 @@ -package ut - -import ( - "errors" - "fmt" - - "github.com/go-playground/locales" -) - -var ( - // ErrUnknowTranslation indicates the translation could not be found - ErrUnknowTranslation = errors.New("Unknown Translation") -) - -var _ error = new(ErrConflictingTranslation) -var _ error = new(ErrRangeTranslation) -var _ error = new(ErrOrdinalTranslation) -var _ error = new(ErrCardinalTranslation) -var _ error = new(ErrMissingPluralTranslation) -var _ error = new(ErrExistingTranslator) - -// ErrExistingTranslator is the error representing a conflicting translator -type ErrExistingTranslator struct { - locale string -} - -// Error returns ErrExistingTranslator's internal error text -func (e *ErrExistingTranslator) Error() string { - return fmt.Sprintf("error: conflicting translator for locale '%s'", e.locale) -} - -// ErrConflictingTranslation is the error representing a conflicting translation -type ErrConflictingTranslation struct { - locale string - key interface{} - rule locales.PluralRule - text string -} - -// Error returns ErrConflictingTranslation's internal error text -func (e *ErrConflictingTranslation) Error() string { - - if _, ok := e.key.(string); !ok { - return fmt.Sprintf("error: conflicting key '%#v' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale) - } - - return fmt.Sprintf("error: conflicting key '%s' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale) -} - -// ErrRangeTranslation is the error representing a range translation error -type ErrRangeTranslation struct { - text string -} - -// Error returns ErrRangeTranslation's internal error text -func (e *ErrRangeTranslation) Error() string { - return e.text -} - -// ErrOrdinalTranslation is the error representing an ordinal translation error -type ErrOrdinalTranslation struct { - text string -} - -// Error returns ErrOrdinalTranslation's internal error text -func (e *ErrOrdinalTranslation) Error() string { - return e.text -} - -// ErrCardinalTranslation is the error representing a cardinal translation error -type ErrCardinalTranslation struct { - text string -} - -// Error returns ErrCardinalTranslation's internal error text -func (e *ErrCardinalTranslation) Error() string { - return e.text -} - -// ErrMissingPluralTranslation is the error signifying a missing translation given -// the locales plural rules. -type ErrMissingPluralTranslation struct { - locale string - key interface{} - rule locales.PluralRule - translationType string -} - -// Error returns ErrMissingPluralTranslation's internal error text -func (e *ErrMissingPluralTranslation) Error() string { - - if _, ok := e.key.(string); !ok { - return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%#v' and locale '%s'", e.translationType, e.rule, e.key, e.locale) - } - - return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%s' and locale '%s'", e.translationType, e.rule, e.key, e.locale) -} - -// ErrMissingBracket is the error representing a missing bracket in a translation -// eg. This is a {0 <-- missing ending '}' -type ErrMissingBracket struct { - locale string - key interface{} - text string -} - -// Error returns ErrMissingBracket error message -func (e *ErrMissingBracket) Error() string { - return fmt.Sprintf("error: missing bracket '{}', in translation. locale: '%s' key: '%v' text: '%s'", e.locale, e.key, e.text) -} - -// ErrBadParamSyntax is the error representing a bad parameter definition in a translation -// eg. This is a {must-be-int} -type ErrBadParamSyntax struct { - locale string - param string - key interface{} - text string -} - -// Error returns ErrBadParamSyntax error message -func (e *ErrBadParamSyntax) Error() string { - return fmt.Sprintf("error: bad parameter syntax, missing parameter '%s' in translation. locale: '%s' key: '%v' text: '%s'", e.param, e.locale, e.key, e.text) -} - -// import/export errors - -// ErrMissingLocale is the error representing an expected locale that could -// not be found aka locale not registered with the UniversalTranslator Instance -type ErrMissingLocale struct { - locale string -} - -// Error returns ErrMissingLocale's internal error text -func (e *ErrMissingLocale) Error() string { - return fmt.Sprintf("error: locale '%s' not registered.", e.locale) -} - -// ErrBadPluralDefinition is the error representing an incorrect plural definition -// usually found within translations defined within files during the import process. -type ErrBadPluralDefinition struct { - tl translation -} - -// Error returns ErrBadPluralDefinition's internal error text -func (e *ErrBadPluralDefinition) Error() string { - return fmt.Sprintf("error: bad plural definition '%#v'", e.tl) -} diff --git a/vendor/github.com/go-playground/universal-translator/go.mod b/vendor/github.com/go-playground/universal-translator/go.mod deleted file mode 100644 index 8079590..0000000 --- a/vendor/github.com/go-playground/universal-translator/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/go-playground/universal-translator - -go 1.13 - -require github.com/go-playground/locales v0.13.0 diff --git a/vendor/github.com/go-playground/universal-translator/go.sum b/vendor/github.com/go-playground/universal-translator/go.sum deleted file mode 100644 index cbbf324..0000000 --- a/vendor/github.com/go-playground/universal-translator/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/go-playground/universal-translator/import_export.go b/vendor/github.com/go-playground/universal-translator/import_export.go deleted file mode 100644 index 7bd76f2..0000000 --- a/vendor/github.com/go-playground/universal-translator/import_export.go +++ /dev/null @@ -1,274 +0,0 @@ -package ut - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "io" - - "github.com/go-playground/locales" -) - -type translation struct { - Locale string `json:"locale"` - Key interface{} `json:"key"` // either string or integer - Translation string `json:"trans"` - PluralType string `json:"type,omitempty"` - PluralRule string `json:"rule,omitempty"` - OverrideExisting bool `json:"override,omitempty"` -} - -const ( - cardinalType = "Cardinal" - ordinalType = "Ordinal" - rangeType = "Range" -) - -// ImportExportFormat is the format of the file import or export -type ImportExportFormat uint8 - -// supported Export Formats -const ( - FormatJSON ImportExportFormat = iota -) - -// Export writes the translations out to a file on disk. -// -// NOTE: this currently only works with string or int translations keys. -func (t *UniversalTranslator) Export(format ImportExportFormat, dirname string) error { - - _, err := os.Stat(dirname) - fmt.Println(dirname, err, os.IsNotExist(err)) - if err != nil { - - if !os.IsNotExist(err) { - return err - } - - if err = os.MkdirAll(dirname, 0744); err != nil { - return err - } - } - - // build up translations - var trans []translation - var b []byte - var ext string - - for _, locale := range t.translators { - - for k, v := range locale.(*translator).translations { - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k, - Translation: v.text, - }) - } - - for k, pluralTrans := range locale.(*translator).cardinalTanslations { - - for i, plural := range pluralTrans { - - // leave enough for all plural rules - // but not all are set for all languages. - if plural == nil { - continue - } - - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k.(string), - Translation: plural.text, - PluralType: cardinalType, - PluralRule: locales.PluralRule(i).String(), - }) - } - } - - for k, pluralTrans := range locale.(*translator).ordinalTanslations { - - for i, plural := range pluralTrans { - - // leave enough for all plural rules - // but not all are set for all languages. - if plural == nil { - continue - } - - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k.(string), - Translation: plural.text, - PluralType: ordinalType, - PluralRule: locales.PluralRule(i).String(), - }) - } - } - - for k, pluralTrans := range locale.(*translator).rangeTanslations { - - for i, plural := range pluralTrans { - - // leave enough for all plural rules - // but not all are set for all languages. - if plural == nil { - continue - } - - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k.(string), - Translation: plural.text, - PluralType: rangeType, - PluralRule: locales.PluralRule(i).String(), - }) - } - } - - switch format { - case FormatJSON: - b, err = json.MarshalIndent(trans, "", " ") - ext = ".json" - } - - if err != nil { - return err - } - - err = ioutil.WriteFile(filepath.Join(dirname, fmt.Sprintf("%s%s", locale.Locale(), ext)), b, 0644) - if err != nil { - return err - } - - trans = trans[0:0] - } - - return nil -} - -// Import reads the translations out of a file or directory on disk. -// -// NOTE: this currently only works with string or int translations keys. -func (t *UniversalTranslator) Import(format ImportExportFormat, dirnameOrFilename string) error { - - fi, err := os.Stat(dirnameOrFilename) - if err != nil { - return err - } - - processFn := func(filename string) error { - - f, err := os.Open(filename) - if err != nil { - return err - } - defer f.Close() - - return t.ImportByReader(format, f) - } - - if !fi.IsDir() { - return processFn(dirnameOrFilename) - } - - // recursively go through directory - walker := func(path string, info os.FileInfo, err error) error { - - if info.IsDir() { - return nil - } - - switch format { - case FormatJSON: - // skip non JSON files - if filepath.Ext(info.Name()) != ".json" { - return nil - } - } - - return processFn(path) - } - - return filepath.Walk(dirnameOrFilename, walker) -} - -// ImportByReader imports the the translations found within the contents read from the supplied reader. -// -// NOTE: generally used when assets have been embedded into the binary and are already in memory. -func (t *UniversalTranslator) ImportByReader(format ImportExportFormat, reader io.Reader) error { - - b, err := ioutil.ReadAll(reader) - if err != nil { - return err - } - - var trans []translation - - switch format { - case FormatJSON: - err = json.Unmarshal(b, &trans) - } - - if err != nil { - return err - } - - for _, tl := range trans { - - locale, found := t.FindTranslator(tl.Locale) - if !found { - return &ErrMissingLocale{locale: tl.Locale} - } - - pr := stringToPR(tl.PluralRule) - - if pr == locales.PluralRuleUnknown { - - err = locale.Add(tl.Key, tl.Translation, tl.OverrideExisting) - if err != nil { - return err - } - - continue - } - - switch tl.PluralType { - case cardinalType: - err = locale.AddCardinal(tl.Key, tl.Translation, pr, tl.OverrideExisting) - case ordinalType: - err = locale.AddOrdinal(tl.Key, tl.Translation, pr, tl.OverrideExisting) - case rangeType: - err = locale.AddRange(tl.Key, tl.Translation, pr, tl.OverrideExisting) - default: - return &ErrBadPluralDefinition{tl: tl} - } - - if err != nil { - return err - } - } - - return nil -} - -func stringToPR(s string) locales.PluralRule { - - switch s { - case "One": - return locales.PluralRuleOne - case "Two": - return locales.PluralRuleTwo - case "Few": - return locales.PluralRuleFew - case "Many": - return locales.PluralRuleMany - case "Other": - return locales.PluralRuleOther - default: - return locales.PluralRuleUnknown - } - -} diff --git a/vendor/github.com/go-playground/universal-translator/logo.png b/vendor/github.com/go-playground/universal-translator/logo.png deleted file mode 100644 index a37aa8c0cd0f6e1b98e0be3eb2531ebc6ac6717b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16598 zcmV(yK*U_<=i=1Q$^7;0v#+eDrK0%p z>%6(N%f`XBv#;pk-N3xJlaY`9`tZ@r#>d0H&B?^Dtf>F`_3`TEoSK)csHK;dl)1LD z{xUb9o}0zMyZALSjf{%1BqI0!{{5jc`1SO`zPq8KpwB5MBz`@`DJHxnB>jUjr=XpP zhJ*ceGX0V>qah&tt}xmxDK3XPA9F;SA|8N$duRs?{%JJ*T{HG>5AcL8I*&O1Ju^KN z1^!Yp@h&apFDzno38}29au*Y6VF#%(B=Pd^`t{{04g#CPRH8PEL>89OH1Y4=wM`?Y+cnsCD|dZGb#-yb zPbYsY6v#U#TTlf1)HKmxCR88|TWkfi;WgJmEa>U!iH1CPzc%zlFUrZIxOpL50SAW2 zHrkRe-Bv8!+}rP-U23*Bp`mB-jzz%dHuKoF($TRq)t%&MEAPFIet}u?$D-;-NTfd? zqGBFudL7@{$H>RCmXS~SDk-e2cr(q3b}2D4;I^fdk8wf@!NHcex`pmIGxX}ykX2Zk zP#l(MXu)GF(Pvk zb5n$3uu@QfLrR3XE#bH{zmF;My}ImfZ|eE@n0GU+i65iC#kVv_JUkHP6q^ z=b4$1KRnawHnN9;XOVD+dTcU@PWtQI+{V7)vVb@}2{~W|d768ob{*KawLyATCMyBY zhk?3y?SQh*YZ(!U#KDNg9qaM-(p?CZPE$X(8z(y`Rk002FaNkl8uC7fajE|-h>jHG2b9lbevz(KOfu`z+X2)PND2t1w1WGFmB z;BZ@Tf}w8eW!d6lVUNJlhe<3w@VLAr5!hqYo=(frj?qrXhNe@r$z?o#)_BC$c#6Tn zw%ibJSrePzu1EE-o7FRWE@Bmr=0#t-W8=a(6GTqoYvcqTWN@=@*0!nMye8HIu2(T+Ak@9J5Z~>D99iw*`m8V%yP8G^_lKA3_-39D4+I+C1zz z%PxAIjtxqC6rEeEoK;TYRK5moFT3e)S;c473ltAKvc{hCWlVc;gKFP7(_^pP+TQSQ zjTnnuLBc{Sdb7KSnYy{T8Mi%*-`7X=bnva_VNVf!d<1rL=-JH6uuGF1?^y5f9AB6q zotFt+&fvKN9wTt?2px9TxG)4b)AV}%MO>l#`PSCbhc8CH z(ahGS3jt5QrHGrvLqpybTd3aT!_Ma3C?0!8iS}-@N4$|3Vjk~Odfkur_B2j4Q=ai9 zwCdFE-MgodJ$v@--@hOJdcD5T)wQs^+~2>veB#83lSsEgpFKBQ8LAYfrz?!j@VGrK zfD?mhnuhu zc6A*>`uqE-yqo0c(WA$Y&khU>p!`akr_C16;qx9(K3}Q48GMs(2|#W(U+C>U+gs?p z^6}jBk0WP#6@}XUG1|MFxifa;Gu`Gf@{^8r3D0vJ&-0ExB2Qql!KaO@u%q%RuxCa- z=nDq{@3OWa?o`}pF?bNzz;Q^nz?4c2d1Yzhk<6eIWaeu#=B8Cm810v^Rke)+e)?h zH``r9!+0zn64TyHj(U9NCw8Ir?OU83bm-%VH;0Wb>dWQso<4o4T$akBA7WgT3iz&_ zN#||w+mrl%lwSPt^Vg61UR6`~YFWHi_l{!JcULueSU zuU#7-U!wAd^F!yiGqsgYce}fpeBa&ns10GwH=8Hj)>BVDk~}BH;~@vhCnx{=D_1_h z9(z4@+Q`0r`z}a*NhgoKotri}dCcg8TMu47d)M~vT^slBr56_$zkgrMPE@N|O(WZ! zsLQ%0YpP1+LKrd6^35*)GUSB5)MzwrJS8#U4D>#RSz-pt?c=lJXO zeSaQ*)aC{sacalkE(o<+>1c~WPfGnKtu-k`2YJOl(N%r)u4fVPB7smYkR!~c!2?5` z13>TVn~)3sx0VVE3qQ8?KZ&MxkE4I%0~`Az9FB(`>c8OVKkXPppkEAHPbYRdx2|$6 zf*j~H;Ex?orIrKyj}eYAQ%S`h#fdpw@Cz<58T?>}2zx?ZT|%y(T{~Xpi=gkZTF;#e z3F=$F{`}PNFa>wR$HyM5Ztd#os_vSakjh6}Iy<|C2zX8|>ielr&R9gEe{Fo0|8gK| zkY8VlfcpEtiRi!U(S93Z-L~--2kINT8Vb8(?fP;$%dGar++*t=TX-4CqacXL~rY1d|=Z=r( zT@Q{j(+PIADfOvY)=!t^b(wRg^=0R7n8aR zGu)okchJ@@r~V1+Ujz8JBY#ZBac;u{>vE*5fRzYXDa*3>N)mKP)O|L;_+)+@W$#W_ z1HCSw0BPQbdWUK^n3k3~2){GaaiQou{J~fvivE1qGekZm14C^s_>uYe_~`Zew$6dh z&dz2jY$hilM;G9l1sq4)7Rn-P`H|OEqLr&S14g)DnOR!8zA!U0bMNinM7RaVpGDl; zY-jGh@Wtt|F$}V_tG&EfzS=j}cU7%lLF4S~p35Z7OJBR(*!bOV-xB?PmY6P)N+eR& zm~-CP8no)@pwxKED3P8YEr^+%?8q=F+vn#4EnG5nUJd7iSCx$h8STYo>M5XqKb%>U znOOtZDR(?fN4Uox1Ub*XkD$wZHf)e>(EIqv@I>f+HsGnMd7^oAVqjvh1vQ|K6RZ%6 zS(agDR(SBQc^!rdmzN8vK88rJqp)LqgEnqF@z805HGQJ@1$%=?VI znx@@zXBFMuwRP&sqPpVZvLw6xjS9oC{Zv}oug2jiu%}ZIcF@Ph^RCBI+pC^=W&^+h zj2nbIz;VS1L`O&K^(`$vP;`|5u!wLu!{jbqrQrBbaLVo`2m4qAM6qoVHq>>S?SyR` z*c}LXS5Tn6g}o`iI4?0VQ5zK%Rio1xlm=zWuo0G1 z^py0Jec*;-d4*BepMTH?oH9ZSY$|#H{6GG`^dbW~(Tbd;`3i5jm;5kK&YSMhLvC&3 zHVlp9eiusn*^WX_1XErv-9)w42ysdA?Q+H zW2CX6=ZBNdm?l$Xli3vMR5s}}x+#0!T+v)!UV9=H(9Y8J_>rsU{BkbR#TC3Ak&M^yN+acyB-!s$e-Ut;vL8ySlm4a z;eC8dRw94`tf=X%Uv6%$8=aRI9J<1TIMbMW6^gFu(4jHQl%}SF=r%{bpn^hWvR;$u# z?d{>=gnV=2*2E~n{(eP81u1Vp-=CRI+4rUIi{BUTb=|}MLKVTK$?cJhCIQZa#yajY zS(}2N?bT>;%*x8uf2KJB_nPh{ry9GsF6g#rFPyoz{6b}Ux%JHA;^J%)xNpWt!c`tW z{u(CNPsL)vuD!{O6hY2%>I8qZSX5O>PtGWEy~`Lmb<%8B>Xe$#4z(JbN}bN!q|z#P z103ko^(ZQx!H{Jz7!K^;PuL-zok!n77@PpuN3`=QIJaXNJwN>xw8No`D|!K~UHql+Qv5HWo# zB}cT^)aaC12QmqJ`hK3=ZTlv`6W5{ViSOGfIrW*|Np9;)2Kq```l9tRy)3$O^iF?{ zPUxJ75m{!I-KK-QaAxVc*K(Nd4R;SXqMht4{NEVX+)5Xg*@A@Hq<~LB?(fg+E!|uH zU3PZ%u1f#x_XH9a#ZAHrAeO}~uDGbkZnqajX~LVrJ32BtOdr;k&6(!Li-vb=RcYZo z`qr(9iCZ7x(X%SDkm@`-$X^FI#FKA=?VA8jd`GrF3{<|9@ts|UOIx>`TRl)x)i(4! zVqK1178248PoY+zy&b-K_%Oy7g$1LI+PVzSss7D$wDbGdl?MTRO~_3yx};tzTQz$r zSe*>=WM;>E0%_2DZ|vGpUk`K^A_F2WgkGGN_tjVSqN1X_;l#xEe>Y_`nRX?JRuvab z&g~`&C+yn9tq{;bzH_ItrY6OpN)iIAqhPS4RrcG0}H-ItzJ63yu82&@oOwU+_mf1X}n+g2RO*VZncK44<-BB z+G+Yq=F+7-dwvP<@5T-$&i;rIO9hgIw?BI0!*bRmde8z!{OebMCn_45k1IEu%%;5w zZ2pLs8`5bugFNbyN1`6vx%0719fnqA*1>c_p8opl;C9=-g_85G(`0|)akx&hT0i8E z*A@6EL~^dPMBnD8U_geo*8BDX#{gcTd}-NoZ9(W=)2}TPcDLmocn>*d*J+ov2jn5X zXFPA=Qd371{#Zkjvdg7$5|ZN*kx0rQ<9P{LJPXA|<1mAld=H zeF6pxh+y>)4x?&9&JdUXE;854k?u3tb-luOx$vDg{YKA04)&K8U7-bQ)+Wt*$g!p+ zd>R)h=2(eXDrI1_slN=}1S%ohp zYxPt}n<|U+ZLLX3DU^`n%%gKDue)jSGZ|@jXG+Vz=eq5l&YUz)X3nM`O}_;8bW6G= z_o!T>E7p}a=o+%+4G~%088Lh6<#L=(cY(ZrFR_KH+jR%FgZ+7u*Ku0ym53ZDlD%;M zDK00U$79jCFr3=+e>+Zd8Kbx^y8rpdw;+ePi0(rEcF{vXXUH9M*J=IbOtmtzv9U2p zZ8n=LDb51T5%B!EI7_u9F0HyYe&&bWyDz1GlxsT+qsKmW{8-WTmSZB|aUiV( zp-$K&$n7N5VfYthn(2a0mpq8WDj|Q##oe9cXkS151>`UX`LAYm5)73sDbrS_7t)At z*5MiTSA0^HksSw%*X)LU1ay357LSh~J$h6Zm8R3Ap?k~D-LOHIy{AFm-Px^**;QYa zRWHuV0((CzdpO8}4s*y3Xwud&^^FK$SLZ;dLr&F+Ft25_rg2cGMHE*=P(hwTxPLCH!Q#wALd+)uu>YY1x z@80P^ABRO1AI(Ks%hl*K+3~t~e6n@AtgJn{^)dCj`q*8&RP*TJAcw=-+1WIg>Og-! zi0R>uof>t-y6A!jjiN=dZvEf4lN?@2@VXN~XWf0N=0ImPpPrm-n>8vX&)n@Ol2R#B znbf1LwNQFh?-AAi|L(|>>jb9nKL5a# z9Oin*V%Hps8x@|4J7>=Pz-uLu-d02$AM6y*6+OQCyoDT5;^I)icc$llc4<5}_oyZ} z9q6GAFnMu9vAj6DbA5(iJ=DU~vNpz>?Ab;zfJ01KKV`b&+4+RMK#-yA2MrCG_ zjasUD`OG&}adz8*Hiir*E=5IYiqq0M(?ZkbGuepsVqLeqJEOB(2kKohauw41-dFoo zTMPU9LH@!E;jl%)zA-iRc}Di9+Jk~xPK8|TB|^jN?%g<&O~C;*1>ZTr|1HqT^~&AZ zt2|$RWm0odWs$lF-$Id8uw<=`?m#1}vaQK}T3tBj~iK{rDR^4%a1L}Fip6pKf zo^E+P(CcIO@2Z!pRH`=%LEgUw>`rv2>e~rA)5v2sH_8=VnBt-*_gW4*wPuqbAjy{F zg8t9slNhyMMJprJo3Y9#Q_FY~k2ZAkutg4!9=0@%*iP77rNsdba<2F7igPm&jID>o z#Kgo_Rqc*a9xqlw4X(wq?9avVNq zlfWb>_yT3k)!mnn1Ko?Cg6jldkn@@v0Zpnql3mf#LUJI^Vez+xlB;b|b15a~Lmi@X zJWG2YK1tUT^v0&MU$F+&){6@@u6Tr zjdB19{%^XtMFoAbLxMTGeca3`Dl2Pk)9Z^WWs<-7woPeKX~Znm6;#ut=)i4DZGI`h zOUtV7N~y{@4xQgO_dr`{X@zvA z9J2{nIpTZ?Ix9NJfxgt`Nv!vrR&C#Sx@&moL?lHYuRFE;i^icGLGYMgK=2as!*F+y zzYB7^=2C^ii(DQ062r07cvB{%yjs=fMwz`zF6@(vkk(-#is~cOIV0CsxT=)reLM7O z{`m-UPzCo=aF7%BcH;2FTvT^-HCu;GT{Si0(*uFSLtPj@?fr^guIS!|F@Y(-mgIM0 zaW8WisqhzQofDQsa1z#?_ca*OC3#HY)*TC(}?XH@?&Z-WxtL~JYjrGCdlLMQysqz8SfFa-G>$_VQx`Nh36<)yN?DnC)#7fB z!>_%4IZIsJ+?=ICB0tL7{@(1QvYaHs45Uw{tXPiEHi zq;9v>)C6A~O&ks3E?4zOPYwjEGlgLhcHN7M-5uy4zvVcsRg7q(#oprRXf3(HQ)IUJ z(u5qhYprT2kK(wXIgT4Cestix!M$rbb2e+FyM>a9riL|Pi${b zWYL!fd*tdHml<@G>e3Yo=eHL4-U>46j7L+xp|&jsyRdcav_GR z?TLwOu)`KNH6uRBVLeKlQl-)kmWV=@sXCVuBE7nXm4b>5UH&(vkkqhs7x<)`RO!=hk@B#+>Rab5%2HV z@qUDT;C_V5J-1;)dF|B@?)S7eM0aW)%WxBPyXuLse{y(u{0LS@BmIVYYLo{hWD2@W zboZVy!GJQ!6dA~Det&WKgV$KiKP2R^X|e|>@v@5htOl`G9KBCW0iDKWi+vohILtX5 z^p*J^*^es_9A7ZZoR6G~M`F*2FVBc^fIH)yC5P$^JM5o4eyi0V`;&p#WgX~oN6;>J z0et0m>jc5dfw0Ihzd--h$)=yy!QEN%TWxJW>+df)pr5|OSDf3oFFG2ZXzc}>q&b_B zMpg&^BI6+advZH0JMHW&ICIl5U)0LyHUE0eet<6}U*hm=L-*YCgZ@xG46Ceyo+d7D zd3%z`xob`i3j~46u;DJPA=%%@|0kPmUi4qEJc4B@?^XHJXFAqO`V1r1zKLtsR*;NE zNzF#Pd#CU{q(+zR9chQO!m{&Hv4xPQX#j3VXTf1#kFu$KhQ1i<)SPUJuM zj6L-LfC+56y*~W^lm#th`;^yuyU3>Y=Bs#gX zxN*THx|cicONSWMm{YK(W-A(|v90N^r041!rU`A>rg4C?uVnZw%yymDml4p z^m^gTU=MovKC&c}*us#r9&ZPCq7Nqfe2aR-pda$Z&s?U*NA?7pOv(Y%6~k)7gUQK0 zPXzxS#^$&-EO5FRvD@!aGJV(U+5=erBbz^6`zYjanHk5nd2`k^-vU{R(Sp&GUG>oM zZ5lf{)4a0iGhRQkVSen#&u&g#tE(%ltE+q2en+0jqO)y0J_P+)(#k#;`K>=vJhLjj zDUys|mm@j;KfzeA0IK^LwAwBofAX$JdD#!-1bxj)vM1(_E%vq6zP{+w){!n8mrh3; zP?>3?t*o`RwXLm94=ZA`CPfMH&zg&g9c98Cs=H{;pvT01{ONu+!|ngfTKN5O>D1Ks z9zV8_B>{)%4%Nf)K|f~~9kP!c9En^VwmOiYuRDl&ySn`A%x**wgO0!UE)4c?Ms(|g2CMy12+&Pq_u%a! ziOWhQZw%-Gfyx`CR6=wgpC=AI^yt$zfZw|H0Q}u;1(u~|^$B3tVn=nvYQ4ed2zgxS zE>vK*U!tfik_qSiodN)Tp2_W+;!qadsW~ZX1U+VRZAlf|$MhE>%)cUcmcFa5x76XP zJduPuW)*eUUzl&>!y);g^^r$>h9i^xfsWT$ICA<@{~MmBOC;O{I_0brprKJlb|J+N zgZ&Vmu|4|e&9I`IX0;XsGxg9iuu zuqIF5#P}!U6;uFJ7mT4u{r~d{{YO5J)tr*#)Qq8zwfTvo#i?CPtTX5!huvS|)--)a zw#q}{A!(XCZ|$>Mts^5NR&tLlRg*lYuGAyZt6S$YJjeGH{cYSNYBb}WgdFH;5svdY zJ~6}?^eSp<6xf?_U?H9R$5?|PZITxa^q>|(e$2hsyTr=+`}M~s1`m^+} zk2rdWpck2C5|LhA$x9JQGc#F_$6+?9IdeQ+jvIysW^EuLAuqlmuUj6mzB@0AxVyL$ z4qu-aJCQT;`sS@0+g~r-xOdA*nUt*3k`V|&2YJh}RphC_r-R6Ig#F?g!ysM&;#ElG zL7#6|M+Tbw0&44d(q-Q%l06rGzZ+>}TLX6*pw|{x?0MNM(^eHS2w6q_?+H`NP_lgzP>mx6aB=_u_k3P+) z?qe7vNjYG^WP0@gS$Q~#=Lw3FI z^kQ#lUte#p+rA4F$6!E4qNPdBj>arwkE;qgrLh@`!#X>ea{d=7=N{8m702;%aa^D< zV6csc@^TEk>mZD>DT%9=&`nn;gh)mlB7!rdB9AJME`b_S!eiwj ztdeHfL{c_bjmTcch>`u}|Hkh*x3{+)Iw$_<;Qj;ar@!axl#^7s(}uH{Y;^fAa2w@GE+?S3Ep z{Oz~%^F4tvUh2BKPS&D;Oly$Rx%c=!JlS~bVug~%%PXR^tFgEVUFh02#JbG1Hj4fs zK|iWiefYX6=Vd3lDs^3Z}T+Ya;&Ni@f!YgQA1J`fWyK%5;X(4!FEX-yLqx}StO zvq`UuOHP2T0^S!C>=UXTiWi?HgPSd*;fB$KaJ9bkRLETcolYqut+(&mx3K>6{O>(6 z(xBB&wIz3z1iCvgYY78VLd(Bg2Z+2ir8OlLRQf6^D$l010h^$|1oUdv`+2I5dGy!v zw0Uo7b($(eu6+&YXc+P65lgLzaR@ILFc;IX>f_gL+Az^7-f8e=hu$F%q3A7}estPl zClWei9YrA0N6X`Y}!prk%Okx6*BdR;WvleVA97X%R&DC&^KGs4G%(E9BPQ3WVdbTMFDE;wHAn3hB92y`<(J4RpFY&niX{j{c{56Ajx2`3ml z3fQ;c>p4Jo)B2IDr>0~gI!SKW&s+)ExP68iybs8Cn>KJ{GmNBl7`%LMaDv`qk|)q8 zHxsyH^j%19*lhfyv{Tm^M^|oc=wK(aO{nJfg)QB^NrbM+Cg#s=d3U|a7w%$7!w0WjnU;tsxcgfeU z!?dyx7KV9G__}WK*;7dg`FeRQjqo#4cN+G;pa+uVW{6GJVKT>Y@9r}s&UvEy?;{8Q z&z$ienRm*$b0Z@-4u%F5>Am6&pQ(Y?1u=tp?;Tih9fz8ispN9RXD5#@M; zUofRC52d6oL`9K%EKJWmrz2O^$de5Sa+{ki%nln=5G-1gS{}57_x38x_&7y$jFZ## zx)WV0t*op2e!iCY`o#BDyx=f6mT!;;VjCm~uFlJ6-XzA55Fs*gIpRz!<4JhY;1C}BLr<47kbpwp6LEtidvj$ud5s%uc(|KfsBujHs zu&DiuCeolf92|`Gx_Pw4UJ1D9V@qY-!+W&I#AW{29FwE2=PFt>@h#h zt83>+6l!>Rt$O|(1e@nSZo3i;tX{b|f1ug3=c{HsbI`g!Gpgm$tGA*1!O`1o2iI&x ze~V5d{Gu)+_2JOdQD)kZ&6#$XrqM%POeS3#xfef}x)b&Uawo^A)iBnHv>qa$3)#(Y zR|nLNF`uH5`Pw=Zv9=FJftcKx8M3trvP+}!MTCi;sSA~5@A^0wGD`#u@a zPY`s4>LQPxrPgNUXj3-qyEOLw<+i9bTa1v~Ku*z7&4C=f5?|kSQ)=pZSd@+)E_k?i zT4z2LVvRNH_2KEyau{9QA$#!gq;zw5EY|%xY(Y?Tu#1U(cRSU3Gql}Tr)Y!D;p>R+ zw(%-nUWEudt==&Ci0tMwJzX_LXTGT6u(Dv*>;aNd?bVmxQmIcUh_B~$Q*>zk{BFCy z%pTQYi!|7RM07$f6{4IEt}wZ~n3}pV7`B(#d)`p&b9#qEXHK?S^3&g(9w0+5GT9D{ zo{2i14x5j6bdF8;-V3=)J5(Y%&2B&sX#e?~Q^vo)NsRsGcy@L+4^NhF5{B*of!({N zr1aDBlG4(W&u9R;Zx5Bg*H2tkDNxI_=3$*$U6)m$%_z_Y_}WHCZGMPxqc+5MF~Ead zK!>mIj*LSIZ(1DGV+O=DsDIvc4_o5X4y&biF6F@NB*$Env3I157c78za&+`6tm$S$ ze7FT2*N~7?+Y>w32|7|a0vn=R8TE4rzCm92=1_5cNsWYotuwTg^)7#}SqeWW=VL&W z&F(X5U%YriMdV_JR;AL`W#y~TvkAJeX|ru=?%Td#qwm~S^`r3rdWmkw(A_ZEroDXB-mrlx2GAF?s==(t${^?w zUiWO9p;$Nv7+M5$C|z)MitbC$BcpUVD^JsFOHju4S{?LWD!ggyMk3}wPEN{}u3wi8 zkUd1N|8nb6fB#&6Z@)!7hCdi0E?dJqLVU;gxrsU|WE*0l z%F)~gbllSvYF?;4p6^DdPo+Iefy}C|^Ia#!LicZx|=kx;>#>W*m5$35-OP}~2($)sWSM+5L zV}#I2OF4kVH+~tA(W`!DFJ@7pL)Lh~OgZ6=68MPisZB)3;w5VTVLA2y%=mIR^!oVN za9o=7%<|Go>#b`m-M`^#21YutbVv5&T}nwX)w)%$9r>>m^wyho>i54Tc5$@-0|-^qv5389|oe03Z9LVZLDo@$A6KChyh0HFb zH|ekA^*^-Xq<(=~-FL`Hb?zd+to(?BY9G`5mrZ$+6K9vnVpwKiz>6mbx@hn2sV$OM zx`58#I~W^2XUVr*-@~%AlU^LLIT;BlEKM=)I%iqUKdFR$1L*kb*CV^R%J|T279Vra znbN;OkGa_B0*5r+_(=H?N}9)@vyFLnOlern>=agSth1P*!@GE9=pzJ1!2Y8(j?VDtI3JWOqCdKV*>@q}he~y2-0s-K{cKKo9a*x=?b8&f7b>u^^`# z%sPvuKfgeogGi~_NSvZWKRhb=lQR0m(e&}y`hKv*ItTLp1ie~L)Q%>VE6@SmrS>9S zop8E9eaLtW=m4kEnA=l$nS}C3RVZb_Q zLr^-sTY=1-lhBT_YrJoOi%O^Huy^;Q?o>K=1xUtEJY7?Lw5zbeUY7t>e@cVp)&9rjhRZL@fiLU zrln!fK{?De4Re>ji@tQZr)STlo*U5|+k?w_7{SVxy8+FklYbz`r^BqH6dUm7(J8rS zCC8(KT(EbX@d`PmvtZT@qCVohi>Ld*B$kaXduBN)RY5fS4+&j-@}B`Z#sT6_jg1|5 zQ#-m;e1nd%<0_h=PNX#j&POZG76Kd8g+`pxtWE^ zON@Zd>}y5+D#o}g10)b5_$AIpgIp6BNR=*F+*~lm}B~8kn%Sz?&C8hFo&_{(Bb_!y|k|xpJD$#tM6v`FKZc zQ~INxPFy{1I_G(iQ*?DcnQ5hw1GXa-K4flvSxOT1azhW<|(3Ixh;XVH5*TL2eCp0E53{WhKEG`gQ5;{d6>n1~Y%ma5 ze%K}aNC~DK+Vp_bAjJX&l~pX!HM@JUkSiCE6(PF9szj`{VmUYnXKNuyYDA-?mnbI= zsh~ZyRfU{fDpf5|C4zE^Q2q(TcV>4o9$LVOR9;-yQ7`@Y`{vD?H?#AWj`#f-Tvb8Q zUxWKlaGD_9;s-W;cL!JpYxaX9{H|njNAxrP{08)3)lS)azB%(9Qkr}U?AFTRqbo-b zTZUFDhsq_bTvp4Lx;{EpLvo`M^rK}B=xpIG%i}ZL;Rk1KDR4;S-xqIb96ccCbGjfp zVqD)Z!Ce(JzK^vBkLS;AqgJx}6XJ(3+PUn0kpH{vllyxveEH@X`^Y5bH zJ^uSU3>{aL@axuK2%L&cu2tNv0bO7hWcOYE(F<#j|L_L}`pfU;&!0?zdu64RR?CK= zOP65uu<`3BHspiAXcZJDAca~fGrg@ zXaUNypPzhv!T|cGVXbP_jO{5Sw?W=(En_)N(2?B$eXCq1IZZ<^LUX_)o>TO(4;^ez zlZuqxP(hyLE{ivC?6?#-Q@L5-8-bNImmP%IEA*pTR~CjEX8 z>A)_?&e&qn8IoWk7-CsWpnHEm4E)p9JqzF|z|j9S{59x_T{BPGjLSp#~jHQiDq zsGg;YW;(C;L2N8*xG7Ur(2`b z8bu!(CFsatG1p-T$UZs|9U086-xhmRX~Aq@w%2m8^k#3-ZFF_ndLtHP`GtGq!0v zF(NuA?-t2{4)Wg*ku4V(*eCs~(j&iZ!r?(axGLfd-NZEC>G{!N$R4mC5ZNI+Vej5I zn}=C>ihe7XZ|1j>Eu(4}O4({!B`sA-!_$vinp{q`q;;za^stn1OfTsG&iSKXRNxrc%gd^^9xB5b@^qq~|8u$i?VRV;s)e zf3rCiOXGobOKn<)Va2d;l?Zwhi&p#<);vsZwwX=Nn-#}|`{(8h+MJ%4vvZD?gEOtE0_g@+bTz-JE3tKTXm%mBT z^LK7yBdUL~7w|#fgS3hXN=v3Unl-gnBF?@MADXTjHBuFI^^8Owlkn`cr-xk~GHVT6 z#mn>-^h(q-l*t_jANT-SAV8EK@>Q9n2(Ueq}&dkrOkQyCnK;ggPO| z!yt^^*Ig{wK!&^Lanorve**{f19reCeD?G>rPnliRX8yXIZHf5&~vKoNYWQ(*fz-* z;M!rwjoWTUpPSd?b=&sliR6qt&>W%*1D%m$NS>BNOZ>WuaL+ZDw=a%ugIoqxhoO$i zPT7Ip&JOh1>l3g~w^?jVcxVAZ8$PIk`gn^Ic*!H^URYH!r*tQ3yJ=+Z`dpMqp7Gq=oE`nlZHw)q z<}8`Pyv9Ty7BW^A+L-Fd;#SWMUWE3$YX$SzC9eC9%Tsndasz)S=<92=XoJ-|7oJLw z{ubjnFh|C`N(Vmp@h9Zzu?)~L%jvq8Fy|4~qlIEtuefH^p6h8iEpuL&)dX@RGsN9F z`N);~?C60q#6BxMSIPP{#5UbJp5PceOX}Lf{8tqHgB#sJ!AgJ^y4)AOy<2b!$cE8t%=oOIDMpsA~@74TSHqZwM`NJLD9VqXm`O76C)V;u~ zRZEY*_`}3`kgxeg8yII7;h9nLG|;s=vi7XrsO$6fLN-&V7xe|#?6KXt9?95quH7GD z)A{Y2ocy^Uxcj0H_yc`-JoMifd%DEn8K5(EA=JU=ucIf&ylJtPPZ13ae}EbQrV zV26r&v4U421KtMG8GFGj7VWNxQ_yGk`{d-P)Sm!n`72G`LEb*lp9=jK8G`zrYrqR+?Y^hyzW7cvbqA4f-Sr5ueUzLvaeN$c zN4~mq=gtS4q#5s%SFUt3c+fwz)XZ9+$XWABkh2YCQFBE14o3Rk8(kf|4|{N)uJ1bFF9hp%-l;Rvb+;eJ;5k1mnn*vn zRR5`tmENP7u0(G#8I97WR;;HNeh)bt=Pb5U&1rCd;(_ZHiyEwno#Y`YP z=)oSiJ!{S?@Z$sdh<6zNiBL0eLe3l2ve3@Qxsb|0^hxP~+r$6B&T?ARtbF0Q@`N77 z;R&Z;nSQP}xQPjUTE$82e&nx658Oi1fxoe{+C1BsAngAEz5qf00MAd3Cq<=4x Z{{;$xH 0 && tarr[rule] != nil && !override { - return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} - } - - } else { - tarr = make([]*transText, 7, 7) - t.cardinalTanslations[key] = tarr - } - - trans := &transText{ - text: text, - indexes: make([]int, 2, 2), - } - - tarr[rule] = trans - - idx := strings.Index(text, paramZero) - if idx == -1 { - tarr[rule] = nil - return &ErrCardinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddCardinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} - } - - trans.indexes[0] = idx - trans.indexes[1] = idx + len(paramZero) - - return nil -} - -// AddOrdinal adds an ordinal plural translation for a particular language/locale -// {0} is the only replacement type accepted and only one variable is accepted as -// multiple cannot be used for a plural rule determination, unless it is a range; -// see AddRange below. -// eg. in locale 'en' one: '{0}st day of spring' other: '{0}nd day of spring' - 1st, 2nd, 3rd... -func (t *translator) AddOrdinal(key interface{}, text string, rule locales.PluralRule, override bool) error { - - var verified bool - - // verify plural rule exists for locale - for _, pr := range t.PluralsOrdinal() { - if pr == rule { - verified = true - break - } - } - - if !verified { - return &ErrOrdinalTranslation{text: fmt.Sprintf("error: ordinal plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)} - } - - tarr, ok := t.ordinalTanslations[key] - if ok { - // verify not adding a conflicting record - if len(tarr) > 0 && tarr[rule] != nil && !override { - return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} - } - - } else { - tarr = make([]*transText, 7, 7) - t.ordinalTanslations[key] = tarr - } - - trans := &transText{ - text: text, - indexes: make([]int, 2, 2), - } - - tarr[rule] = trans - - idx := strings.Index(text, paramZero) - if idx == -1 { - tarr[rule] = nil - return &ErrOrdinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddOrdinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} - } - - trans.indexes[0] = idx - trans.indexes[1] = idx + len(paramZero) - - return nil -} - -// AddRange adds a range plural translation for a particular language/locale -// {0} and {1} are the only replacement types accepted and only these are accepted. -// eg. in locale 'nl' one: '{0}-{1} day left' other: '{0}-{1} days left' -func (t *translator) AddRange(key interface{}, text string, rule locales.PluralRule, override bool) error { - - var verified bool - - // verify plural rule exists for locale - for _, pr := range t.PluralsRange() { - if pr == rule { - verified = true - break - } - } - - if !verified { - return &ErrRangeTranslation{text: fmt.Sprintf("error: range plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)} - } - - tarr, ok := t.rangeTanslations[key] - if ok { - // verify not adding a conflicting record - if len(tarr) > 0 && tarr[rule] != nil && !override { - return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} - } - - } else { - tarr = make([]*transText, 7, 7) - t.rangeTanslations[key] = tarr - } - - trans := &transText{ - text: text, - indexes: make([]int, 4, 4), - } - - tarr[rule] = trans - - idx := strings.Index(text, paramZero) - if idx == -1 { - tarr[rule] = nil - return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, are you sure you're adding a Range Translation? locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} - } - - trans.indexes[0] = idx - trans.indexes[1] = idx + len(paramZero) - - idx = strings.Index(text, paramOne) - if idx == -1 { - tarr[rule] = nil - return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, a Range Translation requires two parameters. locale: '%s' key: '%v' text: '%s'", paramOne, t.Locale(), key, text)} - } - - trans.indexes[2] = idx - trans.indexes[3] = idx + len(paramOne) - - return nil -} - -// T creates the translation for the locale given the 'key' and params passed in -func (t *translator) T(key interface{}, params ...string) (string, error) { - - trans, ok := t.translations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - b := make([]byte, 0, 64) - - var start, end, count int - - for i := 0; i < len(trans.indexes); i++ { - end = trans.indexes[i] - b = append(b, trans.text[start:end]...) - b = append(b, params[count]...) - i++ - start = trans.indexes[i] - count++ - } - - b = append(b, trans.text[start:]...) - - return string(b), nil -} - -// C creates the cardinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in -func (t *translator) C(key interface{}, num float64, digits uint64, param string) (string, error) { - - tarr, ok := t.cardinalTanslations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - rule := t.CardinalPluralRule(num, digits) - - trans := tarr[rule] - - b := make([]byte, 0, 64) - b = append(b, trans.text[:trans.indexes[0]]...) - b = append(b, param...) - b = append(b, trans.text[trans.indexes[1]:]...) - - return string(b), nil -} - -// O creates the ordinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in -func (t *translator) O(key interface{}, num float64, digits uint64, param string) (string, error) { - - tarr, ok := t.ordinalTanslations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - rule := t.OrdinalPluralRule(num, digits) - - trans := tarr[rule] - - b := make([]byte, 0, 64) - b = append(b, trans.text[:trans.indexes[0]]...) - b = append(b, param...) - b = append(b, trans.text[trans.indexes[1]:]...) - - return string(b), nil -} - -// R creates the range translation for the locale given the 'key', 'num1', 'digit1', 'num2' and 'digit2' arguments -// and 'param1' and 'param2' passed in -func (t *translator) R(key interface{}, num1 float64, digits1 uint64, num2 float64, digits2 uint64, param1, param2 string) (string, error) { - - tarr, ok := t.rangeTanslations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - rule := t.RangePluralRule(num1, digits1, num2, digits2) - - trans := tarr[rule] - - b := make([]byte, 0, 64) - b = append(b, trans.text[:trans.indexes[0]]...) - b = append(b, param1...) - b = append(b, trans.text[trans.indexes[1]:trans.indexes[2]]...) - b = append(b, param2...) - b = append(b, trans.text[trans.indexes[3]:]...) - - return string(b), nil -} - -// VerifyTranslations checks to ensures that no plural rules have been -// missed within the translations. -func (t *translator) VerifyTranslations() error { - - for k, v := range t.cardinalTanslations { - - for _, rule := range t.PluralsCardinal() { - - if v[rule] == nil { - return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "plural", rule: rule, key: k} - } - } - } - - for k, v := range t.ordinalTanslations { - - for _, rule := range t.PluralsOrdinal() { - - if v[rule] == nil { - return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "ordinal", rule: rule, key: k} - } - } - } - - for k, v := range t.rangeTanslations { - - for _, rule := range t.PluralsRange() { - - if v[rule] == nil { - return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "range", rule: rule, key: k} - } - } - } - - return nil -} diff --git a/vendor/github.com/go-playground/universal-translator/universal_translator.go b/vendor/github.com/go-playground/universal-translator/universal_translator.go deleted file mode 100644 index dbf707f..0000000 --- a/vendor/github.com/go-playground/universal-translator/universal_translator.go +++ /dev/null @@ -1,113 +0,0 @@ -package ut - -import ( - "strings" - - "github.com/go-playground/locales" -) - -// UniversalTranslator holds all locale & translation data -type UniversalTranslator struct { - translators map[string]Translator - fallback Translator -} - -// New returns a new UniversalTranslator instance set with -// the fallback locale and locales it should support -func New(fallback locales.Translator, supportedLocales ...locales.Translator) *UniversalTranslator { - - t := &UniversalTranslator{ - translators: make(map[string]Translator), - } - - for _, v := range supportedLocales { - - trans := newTranslator(v) - t.translators[strings.ToLower(trans.Locale())] = trans - - if fallback.Locale() == v.Locale() { - t.fallback = trans - } - } - - if t.fallback == nil && fallback != nil { - t.fallback = newTranslator(fallback) - } - - return t -} - -// FindTranslator trys to find a Translator based on an array of locales -// and returns the first one it can find, otherwise returns the -// fallback translator. -func (t *UniversalTranslator) FindTranslator(locales ...string) (trans Translator, found bool) { - - for _, locale := range locales { - - if trans, found = t.translators[strings.ToLower(locale)]; found { - return - } - } - - return t.fallback, false -} - -// GetTranslator returns the specified translator for the given locale, -// or fallback if not found -func (t *UniversalTranslator) GetTranslator(locale string) (trans Translator, found bool) { - - if trans, found = t.translators[strings.ToLower(locale)]; found { - return - } - - return t.fallback, false -} - -// GetFallback returns the fallback locale -func (t *UniversalTranslator) GetFallback() Translator { - return t.fallback -} - -// AddTranslator adds the supplied translator, if it already exists the override param -// will be checked and if false an error will be returned, otherwise the translator will be -// overridden; if the fallback matches the supplied translator it will be overridden as well -// NOTE: this is normally only used when translator is embedded within a library -func (t *UniversalTranslator) AddTranslator(translator locales.Translator, override bool) error { - - lc := strings.ToLower(translator.Locale()) - _, ok := t.translators[lc] - if ok && !override { - return &ErrExistingTranslator{locale: translator.Locale()} - } - - trans := newTranslator(translator) - - if t.fallback.Locale() == translator.Locale() { - - // because it's optional to have a fallback, I don't impose that limitation - // don't know why you wouldn't but... - if !override { - return &ErrExistingTranslator{locale: translator.Locale()} - } - - t.fallback = trans - } - - t.translators[lc] = trans - - return nil -} - -// VerifyTranslations runs through all locales and identifies any issues -// eg. missing plural rules for a locale -func (t *UniversalTranslator) VerifyTranslations() (err error) { - - for _, trans := range t.translators { - err = trans.VerifyTranslations() - if err != nil { - return - } - } - - return -} diff --git a/vendor/github.com/go-playground/validator/v10/.gitignore b/vendor/github.com/go-playground/validator/v10/.gitignore deleted file mode 100644 index 6e43fac..0000000 --- a/vendor/github.com/go-playground/validator/v10/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test -bin - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof -*.test -*.out -*.txt -cover.html -README.html diff --git a/vendor/github.com/go-playground/validator/v10/.travis.yml b/vendor/github.com/go-playground/validator/v10/.travis.yml deleted file mode 100644 index 85a7be3..0000000 --- a/vendor/github.com/go-playground/validator/v10/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: go -go: - - 1.15.2 - - tip -matrix: - allow_failures: - - go: tip - -notifications: - email: - recipients: dean.karn@gmail.com - on_success: change - on_failure: always - -before_install: - - go install github.com/mattn/goveralls - - mkdir -p $GOPATH/src/gopkg.in - - ln -s $GOPATH/src/github.com/$TRAVIS_REPO_SLUG $GOPATH/src/gopkg.in/validator.v9 - -# Only clone the most recent commit. -git: - depth: 1 - -script: - - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... - -after_success: | - [ $TRAVIS_GO_VERSION = 1.15.2 ] && - goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/go-playground/validator/v10/LICENSE b/vendor/github.com/go-playground/validator/v10/LICENSE deleted file mode 100644 index 6a2ae9a..0000000 --- a/vendor/github.com/go-playground/validator/v10/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Dean Karn - -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. - diff --git a/vendor/github.com/go-playground/validator/v10/Makefile b/vendor/github.com/go-playground/validator/v10/Makefile deleted file mode 100644 index 19c91ed..0000000 --- a/vendor/github.com/go-playground/validator/v10/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -GOCMD=GO111MODULE=on go - -linters-install: - @golangci-lint --version >/dev/null 2>&1 || { \ - echo "installing linting tools..."; \ - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s v1.21.0; \ - } - -lint: linters-install - $(PWD)/bin/golangci-lint run - -test: - $(GOCMD) test -cover -race ./... - -bench: - $(GOCMD) test -bench=. -benchmem ./... - -.PHONY: test lint linters-install \ No newline at end of file diff --git a/vendor/github.com/go-playground/validator/v10/README.md b/vendor/github.com/go-playground/validator/v10/README.md deleted file mode 100644 index 04fbb3c..0000000 --- a/vendor/github.com/go-playground/validator/v10/README.md +++ /dev/null @@ -1,299 +0,0 @@ -Package validator -================ -[![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -![Project status](https://img.shields.io/badge/version-10.4.1-green.svg) -[![Build Status](https://travis-ci.org/go-playground/validator.svg?branch=master)](https://travis-ci.org/go-playground/validator) -[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator) -[![GoDoc](https://godoc.org/github.com/go-playground/validator?status.svg)](https://pkg.go.dev/github.com/go-playground/validator/v10) -![License](https://img.shields.io/dub/l/vibe-d.svg) - -Package validator implements value validations for structs and individual fields based on tags. - -It has the following **unique** features: - -- Cross Field and Cross Struct validations by using validation tags or custom validators. -- Slice, Array and Map diving, which allows any or all levels of a multidimensional field to be validated. -- Ability to dive into both map keys and values for validation -- Handles type interface by determining it's underlying type prior to validation. -- Handles custom field types such as sql driver Valuer see [Valuer](https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29) -- Alias validation tags, which allows for mapping of several validations to a single tag for easier defining of validations on structs -- Extraction of custom defined Field Name e.g. can specify to extract the JSON name while validating and have it available in the resulting FieldError -- Customizable i18n aware error messages. -- Default validator for the [gin](https://github.com/gin-gonic/gin) web framework; upgrading from v8 to v9 in gin see [here](https://github.com/go-playground/validator/tree/master/_examples/gin-upgrading-overriding) - -Installation ------------- - -Use go get. - - go get github.com/go-playground/validator/v10 - -Then import the validator package into your own code. - - import "github.com/go-playground/validator/v10" - -Error Return Value -------- - -Validation functions return type error - -They return type error to avoid the issue discussed in the following, where err is always != nil: - -* http://stackoverflow.com/a/29138676/3158232 -* https://github.com/go-playground/validator/issues/134 - -Validator only InvalidValidationError for bad validation input, nil or ValidationErrors as type error; so, in your code all you need to do is check if the error returned is not nil, and if it's not check if error is InvalidValidationError ( if necessary, most of the time it isn't ) type cast it to type ValidationErrors like so: - -```go -err := validate.Struct(mystruct) -validationErrors := err.(validator.ValidationErrors) - ``` - -Usage and documentation ------- - -Please see https://godoc.org/github.com/go-playground/validator for detailed usage docs. - -##### Examples: - -- [Simple](https://github.com/go-playground/validator/blob/master/_examples/simple/main.go) -- [Custom Field Types](https://github.com/go-playground/validator/blob/master/_examples/custom/main.go) -- [Struct Level](https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go) -- [Translations & Custom Errors](https://github.com/go-playground/validator/blob/master/_examples/translations/main.go) -- [Gin upgrade and/or override validator](https://github.com/go-playground/validator/tree/v9/_examples/gin-upgrading-overriding) -- [wash - an example application putting it all together](https://github.com/bluesuncorp/wash) - -Baked-in Validations ------- - -### Fields: - -| Tag | Description | -| - | - | -| eqcsfield | Field Equals Another Field (relative)| -| eqfield | Field Equals Another Field | -| fieldcontains | NOT DOCUMENTED IN doc.go | -| fieldexcludes | NOT DOCUMENTED IN doc.go | -| gtcsfield | Field Greater Than Another Relative Field | -| gtecsfield | Field Greater Than or Equal To Another Relative Field | -| gtefield | Field Greater Than or Equal To Another Field | -| gtfield | Field Greater Than Another Field | -| ltcsfield | Less Than Another Relative Field | -| ltecsfield | Less Than or Equal To Another Relative Field | -| ltefield | Less Than or Equal To Another Field | -| ltfield | Less Than Another Field | -| necsfield | Field Does Not Equal Another Field (relative) | -| nefield | Field Does Not Equal Another Field | - -### Network: - -| Tag | Description | -| - | - | -| cidr | Classless Inter-Domain Routing CIDR | -| cidrv4 | Classless Inter-Domain Routing CIDRv4 | -| cidrv6 | Classless Inter-Domain Routing CIDRv6 | -| datauri | Data URL | -| fqdn | Full Qualified Domain Name (FQDN) | -| hostname | Hostname RFC 952 | -| hostname_port | HostPort | -| hostname_rfc1123 | Hostname RFC 1123 | -| ip | Internet Protocol Address IP | -| ip4_addr | Internet Protocol Address IPv4 | -| ip6_addr |Internet Protocol Address IPv6 | -| ip_addr | Internet Protocol Address IP | -| ipv4 | Internet Protocol Address IPv4 | -| ipv6 | Internet Protocol Address IPv6 | -| mac | Media Access Control Address MAC | -| tcp4_addr | Transmission Control Protocol Address TCPv4 | -| tcp6_addr | Transmission Control Protocol Address TCPv6 | -| tcp_addr | Transmission Control Protocol Address TCP | -| udp4_addr | User Datagram Protocol Address UDPv4 | -| udp6_addr | User Datagram Protocol Address UDPv6 | -| udp_addr | User Datagram Protocol Address UDP | -| unix_addr | Unix domain socket end point Address | -| uri | URI String | -| url | URL String | -| url_encoded | URL Encoded | -| urn_rfc2141 | Urn RFC 2141 String | - -### Strings: - -| Tag | Description | -| - | - | -| alpha | Alpha Only | -| alphanum | Alphanumeric | -| alphanumunicode | Alphanumeric Unicode | -| alphaunicode | Alpha Unicode | -| ascii | ASCII | -| contains | Contains | -| containsany | Contains Any | -| containsrune | Contains Rune | -| endswith | Ends With | -| lowercase | Lowercase | -| multibyte | Multi-Byte Characters | -| number | NOT DOCUMENTED IN doc.go | -| numeric | Numeric | -| printascii | Printable ASCII | -| startswith | Starts With | -| uppercase | Uppercase | - -### Format: -| Tag | Description | -| - | - | -| base64 | Base64 String | -| base64url | Base64URL String | -| btc_addr | Bitcoin Address | -| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) | -| datetime | Datetime | -| e164 | e164 formatted phone number | -| email | E-mail String -| eth_addr | Ethereum Address | -| hexadecimal | Hexadecimal String | -| hexcolor | Hexcolor String | -| hsl | HSL String | -| hsla | HSLA String | -| html | HTML Tags | -| html_encoded | HTML Encoded | -| isbn | International Standard Book Number | -| isbn10 | International Standard Book Number 10 | -| isbn13 | International Standard Book Number 13 | -| json | JSON | -| latitude | Latitude | -| longitude | Longitude | -| rgb | RGB String | -| rgba | RGBA String | -| ssn | Social Security Number SSN | -| uuid | Universally Unique Identifier UUID | -| uuid3 | Universally Unique Identifier UUID v3 | -| uuid3_rfc4122 | Universally Unique Identifier UUID v3 RFC4122 | -| uuid4 | Universally Unique Identifier UUID v4 | -| uuid4_rfc4122 | Universally Unique Identifier UUID v4 RFC4122 | -| uuid5 | Universally Unique Identifier UUID v5 | -| uuid5_rfc4122 | Universally Unique Identifier UUID v5 RFC4122 | -| uuid_rfc4122 | Universally Unique Identifier UUID RFC4122 | - -### Comparisons: -| Tag | Description | -| - | - | -| eq | Equals | -| gt | Greater than| -| gte |Greater than or equal | -| lt | Less Than | -| lte | Less Than or Equal | -| ne | Not Equal | - -### Other: -| Tag | Description | -| - | - | -| dir | Directory | -| endswith | Ends With | -| excludes | Excludes | -| excludesall | Excludes All | -| excludesrune | Excludes Rune | -| file | File path | -| isdefault | Is Default | -| len | Length | -| max | Maximum | -| min | Minimum | -| oneof | One Of | -| required | Required | -| required_if | Required If | -| required_unless | Required Unless | -| required_with | Required With | -| required_with_all | Required With All | -| required_without | Required Without | -| required_without_all | Required Without All | -| excluded_with | Excluded With | -| excluded_with_all | Excluded With All | -| excluded_without | Excluded Without | -| excluded_without_all | Excluded Without All | -| unique | Unique | - -Benchmarks ------- -###### Run on MacBook Pro (15-inch, 2017) go version go1.10.2 darwin/amd64 -```go -goos: darwin -goarch: amd64 -pkg: github.com/go-playground/validator -BenchmarkFieldSuccess-8 20000000 83.6 ns/op 0 B/op 0 allocs/op -BenchmarkFieldSuccessParallel-8 50000000 26.8 ns/op 0 B/op 0 allocs/op -BenchmarkFieldFailure-8 5000000 291 ns/op 208 B/op 4 allocs/op -BenchmarkFieldFailureParallel-8 20000000 107 ns/op 208 B/op 4 allocs/op -BenchmarkFieldArrayDiveSuccess-8 2000000 623 ns/op 201 B/op 11 allocs/op -BenchmarkFieldArrayDiveSuccessParallel-8 10000000 237 ns/op 201 B/op 11 allocs/op -BenchmarkFieldArrayDiveFailure-8 2000000 859 ns/op 412 B/op 16 allocs/op -BenchmarkFieldArrayDiveFailureParallel-8 5000000 335 ns/op 413 B/op 16 allocs/op -BenchmarkFieldMapDiveSuccess-8 1000000 1292 ns/op 432 B/op 18 allocs/op -BenchmarkFieldMapDiveSuccessParallel-8 3000000 467 ns/op 432 B/op 18 allocs/op -BenchmarkFieldMapDiveFailure-8 1000000 1082 ns/op 512 B/op 16 allocs/op -BenchmarkFieldMapDiveFailureParallel-8 5000000 425 ns/op 512 B/op 16 allocs/op -BenchmarkFieldMapDiveWithKeysSuccess-8 1000000 1539 ns/op 480 B/op 21 allocs/op -BenchmarkFieldMapDiveWithKeysSuccessParallel-8 3000000 613 ns/op 480 B/op 21 allocs/op -BenchmarkFieldMapDiveWithKeysFailure-8 1000000 1413 ns/op 721 B/op 21 allocs/op -BenchmarkFieldMapDiveWithKeysFailureParallel-8 3000000 575 ns/op 721 B/op 21 allocs/op -BenchmarkFieldCustomTypeSuccess-8 10000000 216 ns/op 32 B/op 2 allocs/op -BenchmarkFieldCustomTypeSuccessParallel-8 20000000 82.2 ns/op 32 B/op 2 allocs/op -BenchmarkFieldCustomTypeFailure-8 5000000 274 ns/op 208 B/op 4 allocs/op -BenchmarkFieldCustomTypeFailureParallel-8 20000000 116 ns/op 208 B/op 4 allocs/op -BenchmarkFieldOrTagSuccess-8 2000000 740 ns/op 16 B/op 1 allocs/op -BenchmarkFieldOrTagSuccessParallel-8 3000000 474 ns/op 16 B/op 1 allocs/op -BenchmarkFieldOrTagFailure-8 3000000 471 ns/op 224 B/op 5 allocs/op -BenchmarkFieldOrTagFailureParallel-8 3000000 414 ns/op 224 B/op 5 allocs/op -BenchmarkStructLevelValidationSuccess-8 10000000 213 ns/op 32 B/op 2 allocs/op -BenchmarkStructLevelValidationSuccessParallel-8 20000000 91.8 ns/op 32 B/op 2 allocs/op -BenchmarkStructLevelValidationFailure-8 3000000 473 ns/op 304 B/op 8 allocs/op -BenchmarkStructLevelValidationFailureParallel-8 10000000 234 ns/op 304 B/op 8 allocs/op -BenchmarkStructSimpleCustomTypeSuccess-8 5000000 385 ns/op 32 B/op 2 allocs/op -BenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 161 ns/op 32 B/op 2 allocs/op -BenchmarkStructSimpleCustomTypeFailure-8 2000000 640 ns/op 424 B/op 9 allocs/op -BenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 318 ns/op 440 B/op 10 allocs/op -BenchmarkStructFilteredSuccess-8 2000000 597 ns/op 288 B/op 9 allocs/op -BenchmarkStructFilteredSuccessParallel-8 10000000 266 ns/op 288 B/op 9 allocs/op -BenchmarkStructFilteredFailure-8 3000000 454 ns/op 256 B/op 7 allocs/op -BenchmarkStructFilteredFailureParallel-8 10000000 214 ns/op 256 B/op 7 allocs/op -BenchmarkStructPartialSuccess-8 3000000 502 ns/op 256 B/op 6 allocs/op -BenchmarkStructPartialSuccessParallel-8 10000000 225 ns/op 256 B/op 6 allocs/op -BenchmarkStructPartialFailure-8 2000000 702 ns/op 480 B/op 11 allocs/op -BenchmarkStructPartialFailureParallel-8 5000000 329 ns/op 480 B/op 11 allocs/op -BenchmarkStructExceptSuccess-8 2000000 793 ns/op 496 B/op 12 allocs/op -BenchmarkStructExceptSuccessParallel-8 10000000 193 ns/op 240 B/op 5 allocs/op -BenchmarkStructExceptFailure-8 2000000 639 ns/op 464 B/op 10 allocs/op -BenchmarkStructExceptFailureParallel-8 5000000 300 ns/op 464 B/op 10 allocs/op -BenchmarkStructSimpleCrossFieldSuccess-8 3000000 417 ns/op 72 B/op 3 allocs/op -BenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 163 ns/op 72 B/op 3 allocs/op -BenchmarkStructSimpleCrossFieldFailure-8 2000000 645 ns/op 304 B/op 8 allocs/op -BenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 285 ns/op 304 B/op 8 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3000000 588 ns/op 80 B/op 4 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 221 ns/op 80 B/op 4 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2000000 868 ns/op 320 B/op 9 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 5000000 337 ns/op 320 B/op 9 allocs/op -BenchmarkStructSimpleSuccess-8 5000000 260 ns/op 0 B/op 0 allocs/op -BenchmarkStructSimpleSuccessParallel-8 20000000 90.6 ns/op 0 B/op 0 allocs/op -BenchmarkStructSimpleFailure-8 2000000 619 ns/op 424 B/op 9 allocs/op -BenchmarkStructSimpleFailureParallel-8 5000000 296 ns/op 424 B/op 9 allocs/op -BenchmarkStructComplexSuccess-8 1000000 1454 ns/op 128 B/op 8 allocs/op -BenchmarkStructComplexSuccessParallel-8 3000000 579 ns/op 128 B/op 8 allocs/op -BenchmarkStructComplexFailure-8 300000 4140 ns/op 3041 B/op 53 allocs/op -BenchmarkStructComplexFailureParallel-8 1000000 2127 ns/op 3041 B/op 53 allocs/op -BenchmarkOneof-8 10000000 140 ns/op 0 B/op 0 allocs/op -BenchmarkOneofParallel-8 20000000 70.1 ns/op 0 B/op 0 allocs/op -``` - -Complementary Software ----------------------- - -Here is a list of software that complements using this library either pre or post validation. - -* [form](https://github.com/go-playground/form) - Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. Dual Array and Full map support. -* [mold](https://github.com/go-playground/mold) - A general library to help modify or set data within data structures and other objects - -How to Contribute ------- - -Make a pull request... - -License ------- -Distributed under MIT License, please see license file within the code for more details. diff --git a/vendor/github.com/go-playground/validator/v10/baked_in.go b/vendor/github.com/go-playground/validator/v10/baked_in.go deleted file mode 100644 index 6ce762d..0000000 --- a/vendor/github.com/go-playground/validator/v10/baked_in.go +++ /dev/null @@ -1,2285 +0,0 @@ -package validator - -import ( - "bytes" - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "fmt" - "net" - "net/url" - "os" - "reflect" - "strconv" - "strings" - "sync" - "time" - "unicode/utf8" - - "golang.org/x/crypto/sha3" - - urn "github.com/leodido/go-urn" -) - -// Func accepts a FieldLevel interface for all validation needs. The return -// value should be true when validation succeeds. -type Func func(fl FieldLevel) bool - -// FuncCtx accepts a context.Context and FieldLevel interface for all -// validation needs. The return value should be true when validation succeeds. -type FuncCtx func(ctx context.Context, fl FieldLevel) bool - -// wrapFunc wraps noramal Func makes it compatible with FuncCtx -func wrapFunc(fn Func) FuncCtx { - if fn == nil { - return nil // be sure not to wrap a bad function. - } - return func(ctx context.Context, fl FieldLevel) bool { - return fn(fl) - } -} - -var ( - restrictedTags = map[string]struct{}{ - diveTag: {}, - keysTag: {}, - endKeysTag: {}, - structOnlyTag: {}, - omitempty: {}, - skipValidationTag: {}, - utf8HexComma: {}, - utf8Pipe: {}, - noStructLevelTag: {}, - requiredTag: {}, - isdefault: {}, - } - - // BakedInAliasValidators is a default mapping of a single validation tag that - // defines a common or complex set of validation(s) to simplify - // adding validation to structs. - bakedInAliases = map[string]string{ - "iscolor": "hexcolor|rgb|rgba|hsl|hsla", - "country_code": "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric", - } - - // BakedInValidators is the default map of ValidationFunc - // you can add, remove or even replace items to suite your needs, - // or even disregard and use your own map if so desired. - bakedInValidators = map[string]Func{ - "required": hasValue, - "required_if": requiredIf, - "required_unless": requiredUnless, - "required_with": requiredWith, - "required_with_all": requiredWithAll, - "required_without": requiredWithout, - "required_without_all": requiredWithoutAll, - "excluded_with": excludedWith, - "excluded_with_all": excludedWithAll, - "excluded_without": excludedWithout, - "excluded_without_all": excludedWithoutAll, - "isdefault": isDefault, - "len": hasLengthOf, - "min": hasMinOf, - "max": hasMaxOf, - "eq": isEq, - "ne": isNe, - "lt": isLt, - "lte": isLte, - "gt": isGt, - "gte": isGte, - "eqfield": isEqField, - "eqcsfield": isEqCrossStructField, - "necsfield": isNeCrossStructField, - "gtcsfield": isGtCrossStructField, - "gtecsfield": isGteCrossStructField, - "ltcsfield": isLtCrossStructField, - "ltecsfield": isLteCrossStructField, - "nefield": isNeField, - "gtefield": isGteField, - "gtfield": isGtField, - "ltefield": isLteField, - "ltfield": isLtField, - "fieldcontains": fieldContains, - "fieldexcludes": fieldExcludes, - "alpha": isAlpha, - "alphanum": isAlphanum, - "alphaunicode": isAlphaUnicode, - "alphanumunicode": isAlphanumUnicode, - "numeric": isNumeric, - "number": isNumber, - "hexadecimal": isHexadecimal, - "hexcolor": isHEXColor, - "rgb": isRGB, - "rgba": isRGBA, - "hsl": isHSL, - "hsla": isHSLA, - "e164": isE164, - "email": isEmail, - "url": isURL, - "uri": isURI, - "urn_rfc2141": isUrnRFC2141, // RFC 2141 - "file": isFile, - "base64": isBase64, - "base64url": isBase64URL, - "contains": contains, - "containsany": containsAny, - "containsrune": containsRune, - "excludes": excludes, - "excludesall": excludesAll, - "excludesrune": excludesRune, - "startswith": startsWith, - "endswith": endsWith, - "startsnotwith": startsNotWith, - "endsnotwith": endsNotWith, - "isbn": isISBN, - "isbn10": isISBN10, - "isbn13": isISBN13, - "eth_addr": isEthereumAddress, - "btc_addr": isBitcoinAddress, - "btc_addr_bech32": isBitcoinBech32Address, - "uuid": isUUID, - "uuid3": isUUID3, - "uuid4": isUUID4, - "uuid5": isUUID5, - "uuid_rfc4122": isUUIDRFC4122, - "uuid3_rfc4122": isUUID3RFC4122, - "uuid4_rfc4122": isUUID4RFC4122, - "uuid5_rfc4122": isUUID5RFC4122, - "ascii": isASCII, - "printascii": isPrintableASCII, - "multibyte": hasMultiByteCharacter, - "datauri": isDataURI, - "latitude": isLatitude, - "longitude": isLongitude, - "ssn": isSSN, - "ipv4": isIPv4, - "ipv6": isIPv6, - "ip": isIP, - "cidrv4": isCIDRv4, - "cidrv6": isCIDRv6, - "cidr": isCIDR, - "tcp4_addr": isTCP4AddrResolvable, - "tcp6_addr": isTCP6AddrResolvable, - "tcp_addr": isTCPAddrResolvable, - "udp4_addr": isUDP4AddrResolvable, - "udp6_addr": isUDP6AddrResolvable, - "udp_addr": isUDPAddrResolvable, - "ip4_addr": isIP4AddrResolvable, - "ip6_addr": isIP6AddrResolvable, - "ip_addr": isIPAddrResolvable, - "unix_addr": isUnixAddrResolvable, - "mac": isMAC, - "hostname": isHostnameRFC952, // RFC 952 - "hostname_rfc1123": isHostnameRFC1123, // RFC 1123 - "fqdn": isFQDN, - "unique": isUnique, - "oneof": isOneOf, - "html": isHTML, - "html_encoded": isHTMLEncoded, - "url_encoded": isURLEncoded, - "dir": isDir, - "json": isJSON, - "hostname_port": isHostnamePort, - "lowercase": isLowercase, - "uppercase": isUppercase, - "datetime": isDatetime, - "timezone": isTimeZone, - "iso3166_1_alpha2": isIso3166Alpha2, - "iso3166_1_alpha3": isIso3166Alpha3, - "iso3166_1_alpha_numeric": isIso3166AlphaNumeric, - } -) - -var oneofValsCache = map[string][]string{} -var oneofValsCacheRWLock = sync.RWMutex{} - -func parseOneOfParam2(s string) []string { - oneofValsCacheRWLock.RLock() - vals, ok := oneofValsCache[s] - oneofValsCacheRWLock.RUnlock() - if !ok { - oneofValsCacheRWLock.Lock() - vals = splitParamsRegex.FindAllString(s, -1) - for i := 0; i < len(vals); i++ { - vals[i] = strings.Replace(vals[i], "'", "", -1) - } - oneofValsCache[s] = vals - oneofValsCacheRWLock.Unlock() - } - return vals -} - -func isURLEncoded(fl FieldLevel) bool { - return uRLEncodedRegex.MatchString(fl.Field().String()) -} - -func isHTMLEncoded(fl FieldLevel) bool { - return hTMLEncodedRegex.MatchString(fl.Field().String()) -} - -func isHTML(fl FieldLevel) bool { - return hTMLRegex.MatchString(fl.Field().String()) -} - -func isOneOf(fl FieldLevel) bool { - vals := parseOneOfParam2(fl.Param()) - - field := fl.Field() - - var v string - switch field.Kind() { - case reflect.String: - v = field.String() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - v = strconv.FormatInt(field.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - v = strconv.FormatUint(field.Uint(), 10) - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } - for i := 0; i < len(vals); i++ { - if vals[i] == v { - return true - } - } - return false -} - -// isUnique is the validation function for validating if each array|slice|map value is unique -func isUnique(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - v := reflect.ValueOf(struct{}{}) - - switch field.Kind() { - case reflect.Slice, reflect.Array: - elem := field.Type().Elem() - if elem.Kind() == reflect.Ptr { - elem = elem.Elem() - } - - if param == "" { - m := reflect.MakeMap(reflect.MapOf(elem, v.Type())) - - for i := 0; i < field.Len(); i++ { - m.SetMapIndex(reflect.Indirect(field.Index(i)), v) - } - return field.Len() == m.Len() - } - - sf, ok := elem.FieldByName(param) - if !ok { - panic(fmt.Sprintf("Bad field name %s", param)) - } - - sfTyp := sf.Type - if sfTyp.Kind() == reflect.Ptr { - sfTyp = sfTyp.Elem() - } - - m := reflect.MakeMap(reflect.MapOf(sfTyp, v.Type())) - for i := 0; i < field.Len(); i++ { - m.SetMapIndex(reflect.Indirect(reflect.Indirect(field.Index(i)).FieldByName(param)), v) - } - return field.Len() == m.Len() - case reflect.Map: - m := reflect.MakeMap(reflect.MapOf(field.Type().Elem(), v.Type())) - - for _, k := range field.MapKeys() { - m.SetMapIndex(field.MapIndex(k), v) - } - return field.Len() == m.Len() - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } -} - -// IsMAC is the validation function for validating if the field's value is a valid MAC address. -func isMAC(fl FieldLevel) bool { - - _, err := net.ParseMAC(fl.Field().String()) - - return err == nil -} - -// IsCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address. -func isCIDRv4(fl FieldLevel) bool { - - ip, _, err := net.ParseCIDR(fl.Field().String()) - - return err == nil && ip.To4() != nil -} - -// IsCIDRv6 is the validation function for validating if the field's value is a valid v6 CIDR address. -func isCIDRv6(fl FieldLevel) bool { - - ip, _, err := net.ParseCIDR(fl.Field().String()) - - return err == nil && ip.To4() == nil -} - -// IsCIDR is the validation function for validating if the field's value is a valid v4 or v6 CIDR address. -func isCIDR(fl FieldLevel) bool { - - _, _, err := net.ParseCIDR(fl.Field().String()) - - return err == nil -} - -// IsIPv4 is the validation function for validating if a value is a valid v4 IP address. -func isIPv4(fl FieldLevel) bool { - - ip := net.ParseIP(fl.Field().String()) - - return ip != nil && ip.To4() != nil -} - -// IsIPv6 is the validation function for validating if the field's value is a valid v6 IP address. -func isIPv6(fl FieldLevel) bool { - - ip := net.ParseIP(fl.Field().String()) - - return ip != nil && ip.To4() == nil -} - -// IsIP is the validation function for validating if the field's value is a valid v4 or v6 IP address. -func isIP(fl FieldLevel) bool { - - ip := net.ParseIP(fl.Field().String()) - - return ip != nil -} - -// IsSSN is the validation function for validating if the field's value is a valid SSN. -func isSSN(fl FieldLevel) bool { - - field := fl.Field() - - if field.Len() != 11 { - return false - } - - return sSNRegex.MatchString(field.String()) -} - -// IsLongitude is the validation function for validating if the field's value is a valid longitude coordinate. -func isLongitude(fl FieldLevel) bool { - field := fl.Field() - - var v string - switch field.Kind() { - case reflect.String: - v = field.String() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - v = strconv.FormatInt(field.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - v = strconv.FormatUint(field.Uint(), 10) - case reflect.Float32: - v = strconv.FormatFloat(field.Float(), 'f', -1, 32) - case reflect.Float64: - v = strconv.FormatFloat(field.Float(), 'f', -1, 64) - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } - - return longitudeRegex.MatchString(v) -} - -// IsLatitude is the validation function for validating if the field's value is a valid latitude coordinate. -func isLatitude(fl FieldLevel) bool { - field := fl.Field() - - var v string - switch field.Kind() { - case reflect.String: - v = field.String() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - v = strconv.FormatInt(field.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - v = strconv.FormatUint(field.Uint(), 10) - case reflect.Float32: - v = strconv.FormatFloat(field.Float(), 'f', -1, 32) - case reflect.Float64: - v = strconv.FormatFloat(field.Float(), 'f', -1, 64) - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } - - return latitudeRegex.MatchString(v) -} - -// IsDataURI is the validation function for validating if the field's value is a valid data URI. -func isDataURI(fl FieldLevel) bool { - - uri := strings.SplitN(fl.Field().String(), ",", 2) - - if len(uri) != 2 { - return false - } - - if !dataURIRegex.MatchString(uri[0]) { - return false - } - - return base64Regex.MatchString(uri[1]) -} - -// HasMultiByteCharacter is the validation function for validating if the field's value has a multi byte character. -func hasMultiByteCharacter(fl FieldLevel) bool { - - field := fl.Field() - - if field.Len() == 0 { - return true - } - - return multibyteRegex.MatchString(field.String()) -} - -// IsPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character. -func isPrintableASCII(fl FieldLevel) bool { - return printableASCIIRegex.MatchString(fl.Field().String()) -} - -// IsASCII is the validation function for validating if the field's value is a valid ASCII character. -func isASCII(fl FieldLevel) bool { - return aSCIIRegex.MatchString(fl.Field().String()) -} - -// IsUUID5 is the validation function for validating if the field's value is a valid v5 UUID. -func isUUID5(fl FieldLevel) bool { - return uUID5Regex.MatchString(fl.Field().String()) -} - -// IsUUID4 is the validation function for validating if the field's value is a valid v4 UUID. -func isUUID4(fl FieldLevel) bool { - return uUID4Regex.MatchString(fl.Field().String()) -} - -// IsUUID3 is the validation function for validating if the field's value is a valid v3 UUID. -func isUUID3(fl FieldLevel) bool { - return uUID3Regex.MatchString(fl.Field().String()) -} - -// IsUUID is the validation function for validating if the field's value is a valid UUID of any version. -func isUUID(fl FieldLevel) bool { - return uUIDRegex.MatchString(fl.Field().String()) -} - -// IsUUID5RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v5 UUID. -func isUUID5RFC4122(fl FieldLevel) bool { - return uUID5RFC4122Regex.MatchString(fl.Field().String()) -} - -// IsUUID4RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v4 UUID. -func isUUID4RFC4122(fl FieldLevel) bool { - return uUID4RFC4122Regex.MatchString(fl.Field().String()) -} - -// IsUUID3RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v3 UUID. -func isUUID3RFC4122(fl FieldLevel) bool { - return uUID3RFC4122Regex.MatchString(fl.Field().String()) -} - -// IsUUIDRFC4122 is the validation function for validating if the field's value is a valid RFC4122 UUID of any version. -func isUUIDRFC4122(fl FieldLevel) bool { - return uUIDRFC4122Regex.MatchString(fl.Field().String()) -} - -// IsISBN is the validation function for validating if the field's value is a valid v10 or v13 ISBN. -func isISBN(fl FieldLevel) bool { - return isISBN10(fl) || isISBN13(fl) -} - -// IsISBN13 is the validation function for validating if the field's value is a valid v13 ISBN. -func isISBN13(fl FieldLevel) bool { - - s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 4), " ", "", 4) - - if !iSBN13Regex.MatchString(s) { - return false - } - - var checksum int32 - var i int32 - - factor := []int32{1, 3} - - for i = 0; i < 12; i++ { - checksum += factor[i%2] * int32(s[i]-'0') - } - - return (int32(s[12]-'0'))-((10-(checksum%10))%10) == 0 -} - -// IsISBN10 is the validation function for validating if the field's value is a valid v10 ISBN. -func isISBN10(fl FieldLevel) bool { - - s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 3), " ", "", 3) - - if !iSBN10Regex.MatchString(s) { - return false - } - - var checksum int32 - var i int32 - - for i = 0; i < 9; i++ { - checksum += (i + 1) * int32(s[i]-'0') - } - - if s[9] == 'X' { - checksum += 10 * 10 - } else { - checksum += 10 * int32(s[9]-'0') - } - - return checksum%11 == 0 -} - -// IsEthereumAddress is the validation function for validating if the field's value is a valid Ethereum address. -func isEthereumAddress(fl FieldLevel) bool { - address := fl.Field().String() - - if !ethAddressRegex.MatchString(address) { - return false - } - - if ethaddressRegexUpper.MatchString(address) || ethAddressRegexLower.MatchString(address) { - return true - } - - // Checksum validation. Reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md - address = address[2:] // Skip "0x" prefix. - h := sha3.NewLegacyKeccak256() - // hash.Hash's io.Writer implementation says it never returns an error. https://golang.org/pkg/hash/#Hash - _, _ = h.Write([]byte(strings.ToLower(address))) - hash := hex.EncodeToString(h.Sum(nil)) - - for i := 0; i < len(address); i++ { - if address[i] <= '9' { // Skip 0-9 digits: they don't have upper/lower-case. - continue - } - if hash[i] > '7' && address[i] >= 'a' || hash[i] <= '7' && address[i] <= 'F' { - return false - } - } - - return true -} - -// IsBitcoinAddress is the validation function for validating if the field's value is a valid btc address -func isBitcoinAddress(fl FieldLevel) bool { - address := fl.Field().String() - - if !btcAddressRegex.MatchString(address) { - return false - } - - alphabet := []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") - - decode := [25]byte{} - - for _, n := range []byte(address) { - d := bytes.IndexByte(alphabet, n) - - for i := 24; i >= 0; i-- { - d += 58 * int(decode[i]) - decode[i] = byte(d % 256) - d /= 256 - } - } - - h := sha256.New() - _, _ = h.Write(decode[:21]) - d := h.Sum([]byte{}) - h = sha256.New() - _, _ = h.Write(d) - - validchecksum := [4]byte{} - computedchecksum := [4]byte{} - - copy(computedchecksum[:], h.Sum(d[:0])) - copy(validchecksum[:], decode[21:]) - - return validchecksum == computedchecksum -} - -// IsBitcoinBech32Address is the validation function for validating if the field's value is a valid bech32 btc address -func isBitcoinBech32Address(fl FieldLevel) bool { - address := fl.Field().String() - - if !btcLowerAddressRegexBech32.MatchString(address) && !btcUpperAddressRegexBech32.MatchString(address) { - return false - } - - am := len(address) % 8 - - if am == 0 || am == 3 || am == 5 { - return false - } - - address = strings.ToLower(address) - - alphabet := "qpzry9x8gf2tvdw0s3jn54khce6mua7l" - - hr := []int{3, 3, 0, 2, 3} // the human readable part will always be bc - addr := address[3:] - dp := make([]int, 0, len(addr)) - - for _, c := range addr { - dp = append(dp, strings.IndexRune(alphabet, c)) - } - - ver := dp[0] - - if ver < 0 || ver > 16 { - return false - } - - if ver == 0 { - if len(address) != 42 && len(address) != 62 { - return false - } - } - - values := append(hr, dp...) - - GEN := []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3} - - p := 1 - - for _, v := range values { - b := p >> 25 - p = (p&0x1ffffff)<<5 ^ v - - for i := 0; i < 5; i++ { - if (b>>uint(i))&1 == 1 { - p ^= GEN[i] - } - } - } - - if p != 1 { - return false - } - - b := uint(0) - acc := 0 - mv := (1 << 5) - 1 - var sw []int - - for _, v := range dp[1 : len(dp)-6] { - acc = (acc << 5) | v - b += 5 - for b >= 8 { - b -= 8 - sw = append(sw, (acc>>b)&mv) - } - } - - if len(sw) < 2 || len(sw) > 40 { - return false - } - - return true -} - -// ExcludesRune is the validation function for validating that the field's value does not contain the rune specified within the param. -func excludesRune(fl FieldLevel) bool { - return !containsRune(fl) -} - -// ExcludesAll is the validation function for validating that the field's value does not contain any of the characters specified within the param. -func excludesAll(fl FieldLevel) bool { - return !containsAny(fl) -} - -// Excludes is the validation function for validating that the field's value does not contain the text specified within the param. -func excludes(fl FieldLevel) bool { - return !contains(fl) -} - -// ContainsRune is the validation function for validating that the field's value contains the rune specified within the param. -func containsRune(fl FieldLevel) bool { - - r, _ := utf8.DecodeRuneInString(fl.Param()) - - return strings.ContainsRune(fl.Field().String(), r) -} - -// ContainsAny is the validation function for validating that the field's value contains any of the characters specified within the param. -func containsAny(fl FieldLevel) bool { - return strings.ContainsAny(fl.Field().String(), fl.Param()) -} - -// Contains is the validation function for validating that the field's value contains the text specified within the param. -func contains(fl FieldLevel) bool { - return strings.Contains(fl.Field().String(), fl.Param()) -} - -// StartsWith is the validation function for validating that the field's value starts with the text specified within the param. -func startsWith(fl FieldLevel) bool { - return strings.HasPrefix(fl.Field().String(), fl.Param()) -} - -// EndsWith is the validation function for validating that the field's value ends with the text specified within the param. -func endsWith(fl FieldLevel) bool { - return strings.HasSuffix(fl.Field().String(), fl.Param()) -} - -// StartsNotWith is the validation function for validating that the field's value does not start with the text specified within the param. -func startsNotWith(fl FieldLevel) bool { - return !startsWith(fl) -} - -// EndsNotWith is the validation function for validating that the field's value does not end with the text specified within the param. -func endsNotWith(fl FieldLevel) bool { - return !endsWith(fl) -} - -// FieldContains is the validation function for validating if the current field's value contains the field specified by the param's value. -func fieldContains(fl FieldLevel) bool { - field := fl.Field() - - currentField, _, ok := fl.GetStructFieldOK() - - if !ok { - return false - } - - return strings.Contains(field.String(), currentField.String()) -} - -// FieldExcludes is the validation function for validating if the current field's value excludes the field specified by the param's value. -func fieldExcludes(fl FieldLevel) bool { - field := fl.Field() - - currentField, _, ok := fl.GetStructFieldOK() - if !ok { - return true - } - - return !strings.Contains(field.String(), currentField.String()) -} - -// IsNeField is the validation function for validating if the current field's value is not equal to the field specified by the param's value. -func isNeField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - - if !ok || currentKind != kind { - return true - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() != currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() != currentField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() != currentField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) != int64(currentField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return true - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return !fieldTime.Equal(t) - } - - } - - // default reflect.String: - return field.String() != currentField.String() -} - -// IsNe is the validation function for validating that the field's value does not equal the provided param value. -func isNe(fl FieldLevel) bool { - return !isEq(fl) -} - -// IsLteCrossStructField is the validation function for validating if the current field's value is less than or equal to the field, within a separate struct, specified by the param's value. -func isLteCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() <= topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() <= topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() <= topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) <= int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.Before(topTime) || fieldTime.Equal(topTime) - } - } - - // default reflect.String: - return field.String() <= topField.String() -} - -// IsLtCrossStructField is the validation function for validating if the current field's value is less than the field, within a separate struct, specified by the param's value. -// NOTE: This is exposed for use within your own custom functions and not intended to be called directly. -func isLtCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() < topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() < topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() < topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) < int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.Before(topTime) - } - } - - // default reflect.String: - return field.String() < topField.String() -} - -// IsGteCrossStructField is the validation function for validating if the current field's value is greater than or equal to the field, within a separate struct, specified by the param's value. -func isGteCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() >= topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() >= topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() >= topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) >= int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.After(topTime) || fieldTime.Equal(topTime) - } - } - - // default reflect.String: - return field.String() >= topField.String() -} - -// IsGtCrossStructField is the validation function for validating if the current field's value is greater than the field, within a separate struct, specified by the param's value. -func isGtCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() > topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() > topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() > topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) > int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.After(topTime) - } - } - - // default reflect.String: - return field.String() > topField.String() -} - -// IsNeCrossStructField is the validation function for validating that the current field's value is not equal to the field, within a separate struct, specified by the param's value. -func isNeCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return true - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return topField.Int() != field.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return topField.Uint() != field.Uint() - - case reflect.Float32, reflect.Float64: - return topField.Float() != field.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(topField.Len()) != int64(field.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return true - } - - if fieldType == timeType { - - t := field.Interface().(time.Time) - fieldTime := topField.Interface().(time.Time) - - return !fieldTime.Equal(t) - } - } - - // default reflect.String: - return topField.String() != field.String() -} - -// IsEqCrossStructField is the validation function for validating that the current field's value is equal to the field, within a separate struct, specified by the param's value. -func isEqCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return topField.Int() == field.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return topField.Uint() == field.Uint() - - case reflect.Float32, reflect.Float64: - return topField.Float() == field.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(topField.Len()) == int64(field.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - t := field.Interface().(time.Time) - fieldTime := topField.Interface().(time.Time) - - return fieldTime.Equal(t) - } - } - - // default reflect.String: - return topField.String() == field.String() -} - -// IsEqField is the validation function for validating if the current field's value is equal to the field specified by the param's value. -func isEqField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() == currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() == currentField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() == currentField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) == int64(currentField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.Equal(t) - } - - } - - // default reflect.String: - return field.String() == currentField.String() -} - -// IsEq is the validation function for validating if the current field's value is equal to the param's value. -func isEq(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - return field.String() == param - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) == p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asIntFromType(field.Type(), param) - - return field.Int() == p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() == p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() == p - - case reflect.Bool: - p := asBool(param) - - return field.Bool() == p - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsBase64 is the validation function for validating if the current field's value is a valid base 64. -func isBase64(fl FieldLevel) bool { - return base64Regex.MatchString(fl.Field().String()) -} - -// IsBase64URL is the validation function for validating if the current field's value is a valid base64 URL safe string. -func isBase64URL(fl FieldLevel) bool { - return base64URLRegex.MatchString(fl.Field().String()) -} - -// IsURI is the validation function for validating if the current field's value is a valid URI. -func isURI(fl FieldLevel) bool { - - field := fl.Field() - - switch field.Kind() { - - case reflect.String: - - s := field.String() - - // checks needed as of Go 1.6 because of change https://github.com/golang/go/commit/617c93ce740c3c3cc28cdd1a0d712be183d0b328#diff-6c2d018290e298803c0c9419d8739885L195 - // emulate browser and strip the '#' suffix prior to validation. see issue-#237 - if i := strings.Index(s, "#"); i > -1 { - s = s[:i] - } - - if len(s) == 0 { - return false - } - - _, err := url.ParseRequestURI(s) - - return err == nil - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsURL is the validation function for validating if the current field's value is a valid URL. -func isURL(fl FieldLevel) bool { - - field := fl.Field() - - switch field.Kind() { - - case reflect.String: - - var i int - s := field.String() - - // checks needed as of Go 1.6 because of change https://github.com/golang/go/commit/617c93ce740c3c3cc28cdd1a0d712be183d0b328#diff-6c2d018290e298803c0c9419d8739885L195 - // emulate browser and strip the '#' suffix prior to validation. see issue-#237 - if i = strings.Index(s, "#"); i > -1 { - s = s[:i] - } - - if len(s) == 0 { - return false - } - - url, err := url.ParseRequestURI(s) - - if err != nil || url.Scheme == "" { - return false - } - - return true - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isUrnRFC2141 is the validation function for validating if the current field's value is a valid URN as per RFC 2141. -func isUrnRFC2141(fl FieldLevel) bool { - field := fl.Field() - - switch field.Kind() { - - case reflect.String: - - str := field.String() - - _, match := urn.Parse([]byte(str)) - - return match - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsFile is the validation function for validating if the current field's value is a valid file path. -func isFile(fl FieldLevel) bool { - field := fl.Field() - - switch field.Kind() { - case reflect.String: - fileInfo, err := os.Stat(field.String()) - if err != nil { - return false - } - - return !fileInfo.IsDir() - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number. -func isE164(fl FieldLevel) bool { - return e164Regex.MatchString(fl.Field().String()) -} - -// IsEmail is the validation function for validating if the current field's value is a valid email address. -func isEmail(fl FieldLevel) bool { - return emailRegex.MatchString(fl.Field().String()) -} - -// IsHSLA is the validation function for validating if the current field's value is a valid HSLA color. -func isHSLA(fl FieldLevel) bool { - return hslaRegex.MatchString(fl.Field().String()) -} - -// IsHSL is the validation function for validating if the current field's value is a valid HSL color. -func isHSL(fl FieldLevel) bool { - return hslRegex.MatchString(fl.Field().String()) -} - -// IsRGBA is the validation function for validating if the current field's value is a valid RGBA color. -func isRGBA(fl FieldLevel) bool { - return rgbaRegex.MatchString(fl.Field().String()) -} - -// IsRGB is the validation function for validating if the current field's value is a valid RGB color. -func isRGB(fl FieldLevel) bool { - return rgbRegex.MatchString(fl.Field().String()) -} - -// IsHEXColor is the validation function for validating if the current field's value is a valid HEX color. -func isHEXColor(fl FieldLevel) bool { - return hexcolorRegex.MatchString(fl.Field().String()) -} - -// IsHexadecimal is the validation function for validating if the current field's value is a valid hexadecimal. -func isHexadecimal(fl FieldLevel) bool { - return hexadecimalRegex.MatchString(fl.Field().String()) -} - -// IsNumber is the validation function for validating if the current field's value is a valid number. -func isNumber(fl FieldLevel) bool { - switch fl.Field().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64: - return true - default: - return numberRegex.MatchString(fl.Field().String()) - } -} - -// IsNumeric is the validation function for validating if the current field's value is a valid numeric value. -func isNumeric(fl FieldLevel) bool { - switch fl.Field().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64: - return true - default: - return numericRegex.MatchString(fl.Field().String()) - } -} - -// IsAlphanum is the validation function for validating if the current field's value is a valid alphanumeric value. -func isAlphanum(fl FieldLevel) bool { - return alphaNumericRegex.MatchString(fl.Field().String()) -} - -// IsAlpha is the validation function for validating if the current field's value is a valid alpha value. -func isAlpha(fl FieldLevel) bool { - return alphaRegex.MatchString(fl.Field().String()) -} - -// IsAlphanumUnicode is the validation function for validating if the current field's value is a valid alphanumeric unicode value. -func isAlphanumUnicode(fl FieldLevel) bool { - return alphaUnicodeNumericRegex.MatchString(fl.Field().String()) -} - -// IsAlphaUnicode is the validation function for validating if the current field's value is a valid alpha unicode value. -func isAlphaUnicode(fl FieldLevel) bool { - return alphaUnicodeRegex.MatchString(fl.Field().String()) -} - -// isDefault is the opposite of required aka hasValue -func isDefault(fl FieldLevel) bool { - return !hasValue(fl) -} - -// HasValue is the validation function for validating if the current field's value is not the default static value. -func hasValue(fl FieldLevel) bool { - field := fl.Field() - switch field.Kind() { - case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func: - return !field.IsNil() - default: - if fl.(*validate).fldIsPointer && field.Interface() != nil { - return true - } - return field.IsValid() && field.Interface() != reflect.Zero(field.Type()).Interface() - } -} - -// requireCheckField is a func for check field kind -func requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue bool) bool { - field := fl.Field() - kind := field.Kind() - var nullable, found bool - if len(param) > 0 { - field, kind, nullable, found = fl.GetStructFieldOKAdvanced2(fl.Parent(), param) - if !found { - return defaultNotFoundValue - } - } - switch kind { - case reflect.Invalid: - return defaultNotFoundValue - case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func: - return field.IsNil() - default: - if nullable && field.Interface() != nil { - return false - } - return field.IsValid() && field.Interface() == reflect.Zero(field.Type()).Interface() - } -} - -// requireCheckFieldValue is a func for check field value -func requireCheckFieldValue(fl FieldLevel, param string, value string, defaultNotFoundValue bool) bool { - field, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param) - if !found { - return defaultNotFoundValue - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() == asInt(value) - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() == asUint(value) - - case reflect.Float32, reflect.Float64: - return field.Float() == asFloat(value) - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) == asInt(value) - } - - // default reflect.String: - return field.String() == value -} - -// requiredIf is the validation function -// The field under validation must be present and not empty only if all the other specified fields are equal to the value following with the specified field. -func requiredIf(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - if len(params)%2 != 0 { - panic(fmt.Sprintf("Bad param number for required_if %s", fl.FieldName())) - } - for i := 0; i < len(params); i += 2 { - if !requireCheckFieldValue(fl, params[i], params[i+1], false) { - return true - } - } - return hasValue(fl) -} - -// requiredUnless is the validation function -// The field under validation must be present and not empty only unless all the other specified fields are equal to the value following with the specified field. -func requiredUnless(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - if len(params)%2 != 0 { - panic(fmt.Sprintf("Bad param number for required_unless %s", fl.FieldName())) - } - - for i := 0; i < len(params); i += 2 { - if requireCheckFieldValue(fl, params[i], params[i+1], false) { - return true - } - } - return hasValue(fl) -} - -// ExcludedWith is the validation function -// The field under validation must not be present or is empty if any of the other specified fields are present. -func excludedWith(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if !requireCheckFieldKind(fl, param, true) { - return !hasValue(fl) - } - } - return true -} - -// RequiredWith is the validation function -// The field under validation must be present and not empty only if any of the other specified fields are present. -func requiredWith(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if !requireCheckFieldKind(fl, param, true) { - return hasValue(fl) - } - } - return true -} - -// ExcludedWithAll is the validation function -// The field under validation must not be present or is empty if all of the other specified fields are present. -func excludedWithAll(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if requireCheckFieldKind(fl, param, true) { - return true - } - } - return !hasValue(fl) -} - -// RequiredWithAll is the validation function -// The field under validation must be present and not empty only if all of the other specified fields are present. -func requiredWithAll(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if requireCheckFieldKind(fl, param, true) { - return true - } - } - return hasValue(fl) -} - -// ExcludedWithout is the validation function -// The field under validation must not be present or is empty when any of the other specified fields are not present. -func excludedWithout(fl FieldLevel) bool { - if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) { - return !hasValue(fl) - } - return true -} - -// RequiredWithout is the validation function -// The field under validation must be present and not empty only when any of the other specified fields are not present. -func requiredWithout(fl FieldLevel) bool { - if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) { - return hasValue(fl) - } - return true -} - -// RequiredWithoutAll is the validation function -// The field under validation must not be present or is empty when all of the other specified fields are not present. -func excludedWithoutAll(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if !requireCheckFieldKind(fl, param, true) { - return true - } - } - return !hasValue(fl) -} - -// RequiredWithoutAll is the validation function -// The field under validation must be present and not empty only when all of the other specified fields are not present. -func requiredWithoutAll(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if !requireCheckFieldKind(fl, param, true) { - return true - } - } - return hasValue(fl) -} - -// IsGteField is the validation function for validating if the current field's value is greater than or equal to the field specified by the param's value. -func isGteField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() >= currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() >= currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() >= currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.After(t) || fieldTime.Equal(t) - } - } - - // default reflect.String - return len(field.String()) >= len(currentField.String()) -} - -// IsGtField is the validation function for validating if the current field's value is greater than the field specified by the param's value. -func isGtField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() > currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() > currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() > currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.After(t) - } - } - - // default reflect.String - return len(field.String()) > len(currentField.String()) -} - -// IsGte is the validation function for validating if the current field's value is greater than or equal to the param's value. -func isGte(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) >= p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) >= p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asIntFromType(field.Type(), param) - - return field.Int() >= p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() >= p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() >= p - - case reflect.Struct: - - if field.Type() == timeType { - - now := time.Now().UTC() - t := field.Interface().(time.Time) - - return t.After(now) || t.Equal(now) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsGt is the validation function for validating if the current field's value is greater than the param's value. -func isGt(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) > p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) > p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asIntFromType(field.Type(), param) - - return field.Int() > p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() > p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() > p - case reflect.Struct: - - if field.Type() == timeType { - - return field.Interface().(time.Time).After(time.Now().UTC()) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// HasLengthOf is the validation function for validating if the current field's value is equal to the param's value. -func hasLengthOf(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) == p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) == p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asIntFromType(field.Type(), param) - - return field.Int() == p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() == p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() == p - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// HasMinOf is the validation function for validating if the current field's value is greater than or equal to the param's value. -func hasMinOf(fl FieldLevel) bool { - return isGte(fl) -} - -// IsLteField is the validation function for validating if the current field's value is less than or equal to the field specified by the param's value. -func isLteField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() <= currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() <= currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() <= currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.Before(t) || fieldTime.Equal(t) - } - } - - // default reflect.String - return len(field.String()) <= len(currentField.String()) -} - -// IsLtField is the validation function for validating if the current field's value is less than the field specified by the param's value. -func isLtField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() < currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() < currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() < currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.Before(t) - } - } - - // default reflect.String - return len(field.String()) < len(currentField.String()) -} - -// IsLte is the validation function for validating if the current field's value is less than or equal to the param's value. -func isLte(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) <= p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) <= p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asIntFromType(field.Type(), param) - - return field.Int() <= p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() <= p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() <= p - - case reflect.Struct: - - if field.Type() == timeType { - - now := time.Now().UTC() - t := field.Interface().(time.Time) - - return t.Before(now) || t.Equal(now) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsLt is the validation function for validating if the current field's value is less than the param's value. -func isLt(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) < p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) < p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asIntFromType(field.Type(), param) - - return field.Int() < p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() < p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() < p - - case reflect.Struct: - - if field.Type() == timeType { - - return field.Interface().(time.Time).Before(time.Now().UTC()) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// HasMaxOf is the validation function for validating if the current field's value is less than or equal to the param's value. -func hasMaxOf(fl FieldLevel) bool { - return isLte(fl) -} - -// IsTCP4AddrResolvable is the validation function for validating if the field's value is a resolvable tcp4 address. -func isTCP4AddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) { - return false - } - - _, err := net.ResolveTCPAddr("tcp4", fl.Field().String()) - return err == nil -} - -// IsTCP6AddrResolvable is the validation function for validating if the field's value is a resolvable tcp6 address. -func isTCP6AddrResolvable(fl FieldLevel) bool { - - if !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveTCPAddr("tcp6", fl.Field().String()) - - return err == nil -} - -// IsTCPAddrResolvable is the validation function for validating if the field's value is a resolvable tcp address. -func isTCPAddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) && !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveTCPAddr("tcp", fl.Field().String()) - - return err == nil -} - -// IsUDP4AddrResolvable is the validation function for validating if the field's value is a resolvable udp4 address. -func isUDP4AddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) { - return false - } - - _, err := net.ResolveUDPAddr("udp4", fl.Field().String()) - - return err == nil -} - -// IsUDP6AddrResolvable is the validation function for validating if the field's value is a resolvable udp6 address. -func isUDP6AddrResolvable(fl FieldLevel) bool { - - if !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveUDPAddr("udp6", fl.Field().String()) - - return err == nil -} - -// IsUDPAddrResolvable is the validation function for validating if the field's value is a resolvable udp address. -func isUDPAddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) && !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveUDPAddr("udp", fl.Field().String()) - - return err == nil -} - -// IsIP4AddrResolvable is the validation function for validating if the field's value is a resolvable ip4 address. -func isIP4AddrResolvable(fl FieldLevel) bool { - - if !isIPv4(fl) { - return false - } - - _, err := net.ResolveIPAddr("ip4", fl.Field().String()) - - return err == nil -} - -// IsIP6AddrResolvable is the validation function for validating if the field's value is a resolvable ip6 address. -func isIP6AddrResolvable(fl FieldLevel) bool { - - if !isIPv6(fl) { - return false - } - - _, err := net.ResolveIPAddr("ip6", fl.Field().String()) - - return err == nil -} - -// IsIPAddrResolvable is the validation function for validating if the field's value is a resolvable ip address. -func isIPAddrResolvable(fl FieldLevel) bool { - - if !isIP(fl) { - return false - } - - _, err := net.ResolveIPAddr("ip", fl.Field().String()) - - return err == nil -} - -// IsUnixAddrResolvable is the validation function for validating if the field's value is a resolvable unix address. -func isUnixAddrResolvable(fl FieldLevel) bool { - - _, err := net.ResolveUnixAddr("unix", fl.Field().String()) - - return err == nil -} - -func isIP4Addr(fl FieldLevel) bool { - - val := fl.Field().String() - - if idx := strings.LastIndex(val, ":"); idx != -1 { - val = val[0:idx] - } - - ip := net.ParseIP(val) - - return ip != nil && ip.To4() != nil -} - -func isIP6Addr(fl FieldLevel) bool { - - val := fl.Field().String() - - if idx := strings.LastIndex(val, ":"); idx != -1 { - if idx != 0 && val[idx-1:idx] == "]" { - val = val[1 : idx-1] - } - } - - ip := net.ParseIP(val) - - return ip != nil && ip.To4() == nil -} - -func isHostnameRFC952(fl FieldLevel) bool { - return hostnameRegexRFC952.MatchString(fl.Field().String()) -} - -func isHostnameRFC1123(fl FieldLevel) bool { - return hostnameRegexRFC1123.MatchString(fl.Field().String()) -} - -func isFQDN(fl FieldLevel) bool { - val := fl.Field().String() - - if val == "" { - return false - } - - return fqdnRegexRFC1123.MatchString(val) -} - -// IsDir is the validation function for validating if the current field's value is a valid directory. -func isDir(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - fileInfo, err := os.Stat(field.String()) - if err != nil { - return false - } - - return fileInfo.IsDir() - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isJSON is the validation function for validating if the current field's value is a valid json string. -func isJSON(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - val := field.String() - return json.Valid([]byte(val)) - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isHostnamePort validates a : combination for fields typically used for socket address. -func isHostnamePort(fl FieldLevel) bool { - val := fl.Field().String() - host, port, err := net.SplitHostPort(val) - if err != nil { - return false - } - // Port must be a iny <= 65535. - if portNum, err := strconv.ParseInt(port, 10, 32); err != nil || portNum > 65535 || portNum < 1 { - return false - } - - // If host is specified, it should match a DNS name - if host != "" { - return hostnameRegexRFC1123.MatchString(host) - } - return true -} - -// isLowercase is the validation function for validating if the current field's value is a lowercase string. -func isLowercase(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - if field.String() == "" { - return false - } - return field.String() == strings.ToLower(field.String()) - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isUppercase is the validation function for validating if the current field's value is an uppercase string. -func isUppercase(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - if field.String() == "" { - return false - } - return field.String() == strings.ToUpper(field.String()) - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isDatetime is the validation function for validating if the current field's value is a valid datetime string. -func isDatetime(fl FieldLevel) bool { - field := fl.Field() - param := fl.Param() - - if field.Kind() == reflect.String { - _, err := time.Parse(param, field.String()) - - return err == nil - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isTimeZone is the validation function for validating if the current field's value is a valid time zone string. -func isTimeZone(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - // empty value is converted to UTC by time.LoadLocation but disallow it as it is not a valid time zone name - if field.String() == "" { - return false - } - - // Local value is converted to the current system time zone by time.LoadLocation but disallow it as it is not a valid time zone name - if strings.ToLower(field.String()) == "local" { - return false - } - - _, err := time.LoadLocation(field.String()) - return err == nil - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-2 country code. -func isIso3166Alpha2(fl FieldLevel) bool { - val := fl.Field().String() - return iso3166_1_alpha2[val] -} - -// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 country code. -func isIso3166Alpha3(fl FieldLevel) bool { - val := fl.Field().String() - return iso3166_1_alpha3[val] -} - -// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric country code. -func isIso3166AlphaNumeric(fl FieldLevel) bool { - field := fl.Field() - - var code int - switch field.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - code = int(field.Int() % 1000) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - code = int(field.Uint() % 1000) - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } - return iso3166_1_alpha_numeric[code] -} diff --git a/vendor/github.com/go-playground/validator/v10/cache.go b/vendor/github.com/go-playground/validator/v10/cache.go deleted file mode 100644 index 0d18d6e..0000000 --- a/vendor/github.com/go-playground/validator/v10/cache.go +++ /dev/null @@ -1,322 +0,0 @@ -package validator - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -type tagType uint8 - -const ( - typeDefault tagType = iota - typeOmitEmpty - typeIsDefault - typeNoStructLevel - typeStructOnly - typeDive - typeOr - typeKeys - typeEndKeys -) - -const ( - invalidValidation = "Invalid validation tag on field '%s'" - undefinedValidation = "Undefined validation function '%s' on field '%s'" - keysTagNotDefined = "'" + endKeysTag + "' tag encountered without a corresponding '" + keysTag + "' tag" -) - -type structCache struct { - lock sync.Mutex - m atomic.Value // map[reflect.Type]*cStruct -} - -func (sc *structCache) Get(key reflect.Type) (c *cStruct, found bool) { - c, found = sc.m.Load().(map[reflect.Type]*cStruct)[key] - return -} - -func (sc *structCache) Set(key reflect.Type, value *cStruct) { - m := sc.m.Load().(map[reflect.Type]*cStruct) - nm := make(map[reflect.Type]*cStruct, len(m)+1) - for k, v := range m { - nm[k] = v - } - nm[key] = value - sc.m.Store(nm) -} - -type tagCache struct { - lock sync.Mutex - m atomic.Value // map[string]*cTag -} - -func (tc *tagCache) Get(key string) (c *cTag, found bool) { - c, found = tc.m.Load().(map[string]*cTag)[key] - return -} - -func (tc *tagCache) Set(key string, value *cTag) { - m := tc.m.Load().(map[string]*cTag) - nm := make(map[string]*cTag, len(m)+1) - for k, v := range m { - nm[k] = v - } - nm[key] = value - tc.m.Store(nm) -} - -type cStruct struct { - name string - fields []*cField - fn StructLevelFuncCtx -} - -type cField struct { - idx int - name string - altName string - namesEqual bool - cTags *cTag -} - -type cTag struct { - tag string - aliasTag string - actualAliasTag string - param string - keys *cTag // only populated when using tag's 'keys' and 'endkeys' for map key validation - next *cTag - fn FuncCtx - typeof tagType - hasTag bool - hasAlias bool - hasParam bool // true if parameter used eg. eq= where the equal sign has been set - isBlockEnd bool // indicates the current tag represents the last validation in the block - runValidationWhenNil bool -} - -func (v *Validate) extractStructCache(current reflect.Value, sName string) *cStruct { - v.structCache.lock.Lock() - defer v.structCache.lock.Unlock() // leave as defer! because if inner panics, it will never get unlocked otherwise! - - typ := current.Type() - - // could have been multiple trying to access, but once first is done this ensures struct - // isn't parsed again. - cs, ok := v.structCache.Get(typ) - if ok { - return cs - } - - cs = &cStruct{name: sName, fields: make([]*cField, 0), fn: v.structLevelFuncs[typ]} - - numFields := current.NumField() - - var ctag *cTag - var fld reflect.StructField - var tag string - var customName string - - for i := 0; i < numFields; i++ { - - fld = typ.Field(i) - - if !fld.Anonymous && len(fld.PkgPath) > 0 { - continue - } - - tag = fld.Tag.Get(v.tagName) - - if tag == skipValidationTag { - continue - } - - customName = fld.Name - - if v.hasTagNameFunc { - name := v.tagNameFunc(fld) - if len(name) > 0 { - customName = name - } - } - - // NOTE: cannot use shared tag cache, because tags may be equal, but things like alias may be different - // and so only struct level caching can be used instead of combined with Field tag caching - - if len(tag) > 0 { - ctag, _ = v.parseFieldTagsRecursive(tag, fld.Name, "", false) - } else { - // even if field doesn't have validations need cTag for traversing to potential inner/nested - // elements of the field. - ctag = new(cTag) - } - - cs.fields = append(cs.fields, &cField{ - idx: i, - name: fld.Name, - altName: customName, - cTags: ctag, - namesEqual: fld.Name == customName, - }) - } - v.structCache.Set(typ, cs) - return cs -} - -func (v *Validate) parseFieldTagsRecursive(tag string, fieldName string, alias string, hasAlias bool) (firstCtag *cTag, current *cTag) { - var t string - noAlias := len(alias) == 0 - tags := strings.Split(tag, tagSeparator) - - for i := 0; i < len(tags); i++ { - t = tags[i] - if noAlias { - alias = t - } - - // check map for alias and process new tags, otherwise process as usual - if tagsVal, found := v.aliases[t]; found { - if i == 0 { - firstCtag, current = v.parseFieldTagsRecursive(tagsVal, fieldName, t, true) - } else { - next, curr := v.parseFieldTagsRecursive(tagsVal, fieldName, t, true) - current.next, current = next, curr - - } - continue - } - - var prevTag tagType - - if i == 0 { - current = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true, typeof: typeDefault} - firstCtag = current - } else { - prevTag = current.typeof - current.next = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true} - current = current.next - } - - switch t { - case diveTag: - current.typeof = typeDive - continue - - case keysTag: - current.typeof = typeKeys - - if i == 0 || prevTag != typeDive { - panic(fmt.Sprintf("'%s' tag must be immediately preceded by the '%s' tag", keysTag, diveTag)) - } - - current.typeof = typeKeys - - // need to pass along only keys tag - // need to increment i to skip over the keys tags - b := make([]byte, 0, 64) - - i++ - - for ; i < len(tags); i++ { - - b = append(b, tags[i]...) - b = append(b, ',') - - if tags[i] == endKeysTag { - break - } - } - - current.keys, _ = v.parseFieldTagsRecursive(string(b[:len(b)-1]), fieldName, "", false) - continue - - case endKeysTag: - current.typeof = typeEndKeys - - // if there are more in tags then there was no keysTag defined - // and an error should be thrown - if i != len(tags)-1 { - panic(keysTagNotDefined) - } - return - - case omitempty: - current.typeof = typeOmitEmpty - continue - - case structOnlyTag: - current.typeof = typeStructOnly - continue - - case noStructLevelTag: - current.typeof = typeNoStructLevel - continue - - default: - if t == isdefault { - current.typeof = typeIsDefault - } - // if a pipe character is needed within the param you must use the utf8Pipe representation "0x7C" - orVals := strings.Split(t, orSeparator) - - for j := 0; j < len(orVals); j++ { - vals := strings.SplitN(orVals[j], tagKeySeparator, 2) - if noAlias { - alias = vals[0] - current.aliasTag = alias - } else { - current.actualAliasTag = t - } - - if j > 0 { - current.next = &cTag{aliasTag: alias, actualAliasTag: current.actualAliasTag, hasAlias: hasAlias, hasTag: true} - current = current.next - } - current.hasParam = len(vals) > 1 - - current.tag = vals[0] - if len(current.tag) == 0 { - panic(strings.TrimSpace(fmt.Sprintf(invalidValidation, fieldName))) - } - - if wrapper, ok := v.validations[current.tag]; ok { - current.fn = wrapper.fn - current.runValidationWhenNil = wrapper.runValidatinOnNil - } else { - panic(strings.TrimSpace(fmt.Sprintf(undefinedValidation, current.tag, fieldName))) - } - - if len(orVals) > 1 { - current.typeof = typeOr - } - - if len(vals) > 1 { - current.param = strings.Replace(strings.Replace(vals[1], utf8HexComma, ",", -1), utf8Pipe, "|", -1) - } - } - current.isBlockEnd = true - } - } - return -} - -func (v *Validate) fetchCacheTag(tag string) *cTag { - // find cached tag - ctag, found := v.tagCache.Get(tag) - if !found { - v.tagCache.lock.Lock() - defer v.tagCache.lock.Unlock() - - // could have been multiple trying to access, but once first is done this ensures tag - // isn't parsed again. - ctag, found = v.tagCache.Get(tag) - if !found { - ctag, _ = v.parseFieldTagsRecursive(tag, "", "", false) - v.tagCache.Set(tag, ctag) - } - } - return ctag -} diff --git a/vendor/github.com/go-playground/validator/v10/country_codes.go b/vendor/github.com/go-playground/validator/v10/country_codes.go deleted file mode 100644 index ef81ead..0000000 --- a/vendor/github.com/go-playground/validator/v10/country_codes.go +++ /dev/null @@ -1,162 +0,0 @@ -package validator - -var iso3166_1_alpha2 = map[string]bool{ - // see: https://www.iso.org/iso-3166-country-codes.html - "AF": true, "AX": true, "AL": true, "DZ": true, "AS": true, - "AD": true, "AO": true, "AI": true, "AQ": true, "AG": true, - "AR": true, "AM": true, "AW": true, "AU": true, "AT": true, - "AZ": true, "BS": true, "BH": true, "BD": true, "BB": true, - "BY": true, "BE": true, "BZ": true, "BJ": true, "BM": true, - "BT": true, "BO": true, "BQ": true, "BA": true, "BW": true, - "BV": true, "BR": true, "IO": true, "BN": true, "BG": true, - "BF": true, "BI": true, "KH": true, "CM": true, "CA": true, - "CV": true, "KY": true, "CF": true, "TD": true, "CL": true, - "CN": true, "CX": true, "CC": true, "CO": true, "KM": true, - "CG": true, "CD": true, "CK": true, "CR": true, "CI": true, - "HR": true, "CU": true, "CW": true, "CY": true, "CZ": true, - "DK": true, "DJ": true, "DM": true, "DO": true, "EC": true, - "EG": true, "SV": true, "GQ": true, "ER": true, "EE": true, - "ET": true, "FK": true, "FO": true, "FJ": true, "FI": true, - "FR": true, "GF": true, "PF": true, "TF": true, "GA": true, - "GM": true, "GE": true, "DE": true, "GH": true, "GI": true, - "GR": true, "GL": true, "GD": true, "GP": true, "GU": true, - "GT": true, "GG": true, "GN": true, "GW": true, "GY": true, - "HT": true, "HM": true, "VA": true, "HN": true, "HK": true, - "HU": true, "IS": true, "IN": true, "ID": true, "IR": true, - "IQ": true, "IE": true, "IM": true, "IL": true, "IT": true, - "JM": true, "JP": true, "JE": true, "JO": true, "KZ": true, - "KE": true, "KI": true, "KP": true, "KR": true, "KW": true, - "KG": true, "LA": true, "LV": true, "LB": true, "LS": true, - "LR": true, "LY": true, "LI": true, "LT": true, "LU": true, - "MO": true, "MK": true, "MG": true, "MW": true, "MY": true, - "MV": true, "ML": true, "MT": true, "MH": true, "MQ": true, - "MR": true, "MU": true, "YT": true, "MX": true, "FM": true, - "MD": true, "MC": true, "MN": true, "ME": true, "MS": true, - "MA": true, "MZ": true, "MM": true, "NA": true, "NR": true, - "NP": true, "NL": true, "NC": true, "NZ": true, "NI": true, - "NE": true, "NG": true, "NU": true, "NF": true, "MP": true, - "NO": true, "OM": true, "PK": true, "PW": true, "PS": true, - "PA": true, "PG": true, "PY": true, "PE": true, "PH": true, - "PN": true, "PL": true, "PT": true, "PR": true, "QA": true, - "RE": true, "RO": true, "RU": true, "RW": true, "BL": true, - "SH": true, "KN": true, "LC": true, "MF": true, "PM": true, - "VC": true, "WS": true, "SM": true, "ST": true, "SA": true, - "SN": true, "RS": true, "SC": true, "SL": true, "SG": true, - "SX": true, "SK": true, "SI": true, "SB": true, "SO": true, - "ZA": true, "GS": true, "SS": true, "ES": true, "LK": true, - "SD": true, "SR": true, "SJ": true, "SZ": true, "SE": true, - "CH": true, "SY": true, "TW": true, "TJ": true, "TZ": true, - "TH": true, "TL": true, "TG": true, "TK": true, "TO": true, - "TT": true, "TN": true, "TR": true, "TM": true, "TC": true, - "TV": true, "UG": true, "UA": true, "AE": true, "GB": true, - "US": true, "UM": true, "UY": true, "UZ": true, "VU": true, - "VE": true, "VN": true, "VG": true, "VI": true, "WF": true, - "EH": true, "YE": true, "ZM": true, "ZW": true, -} - -var iso3166_1_alpha3 = map[string]bool{ - // see: https://www.iso.org/iso-3166-country-codes.html - "AFG": true, "ALB": true, "DZA": true, "ASM": true, "AND": true, - "AGO": true, "AIA": true, "ATA": true, "ATG": true, "ARG": true, - "ARM": true, "ABW": true, "AUS": true, "AUT": true, "AZE": true, - "BHS": true, "BHR": true, "BGD": true, "BRB": true, "BLR": true, - "BEL": true, "BLZ": true, "BEN": true, "BMU": true, "BTN": true, - "BOL": true, "BES": true, "BIH": true, "BWA": true, "BVT": true, - "BRA": true, "IOT": true, "BRN": true, "BGR": true, "BFA": true, - "BDI": true, "CPV": true, "KHM": true, "CMR": true, "CAN": true, - "CYM": true, "CAF": true, "TCD": true, "CHL": true, "CHN": true, - "CXR": true, "CCK": true, "COL": true, "COM": true, "COD": true, - "COG": true, "COK": true, "CRI": true, "HRV": true, "CUB": true, - "CUW": true, "CYP": true, "CZE": true, "CIV": true, "DNK": true, - "DJI": true, "DMA": true, "DOM": true, "ECU": true, "EGY": true, - "SLV": true, "GNQ": true, "ERI": true, "EST": true, "SWZ": true, - "ETH": true, "FLK": true, "FRO": true, "FJI": true, "FIN": true, - "FRA": true, "GUF": true, "PYF": true, "ATF": true, "GAB": true, - "GMB": true, "GEO": true, "DEU": true, "GHA": true, "GIB": true, - "GRC": true, "GRL": true, "GRD": true, "GLP": true, "GUM": true, - "GTM": true, "GGY": true, "GIN": true, "GNB": true, "GUY": true, - "HTI": true, "HMD": true, "VAT": true, "HND": true, "HKG": true, - "HUN": true, "ISL": true, "IND": true, "IDN": true, "IRN": true, - "IRQ": true, "IRL": true, "IMN": true, "ISR": true, "ITA": true, - "JAM": true, "JPN": true, "JEY": true, "JOR": true, "KAZ": true, - "KEN": true, "KIR": true, "PRK": true, "KOR": true, "KWT": true, - "KGZ": true, "LAO": true, "LVA": true, "LBN": true, "LSO": true, - "LBR": true, "LBY": true, "LIE": true, "LTU": true, "LUX": true, - "MAC": true, "MDG": true, "MWI": true, "MYS": true, "MDV": true, - "MLI": true, "MLT": true, "MHL": true, "MTQ": true, "MRT": true, - "MUS": true, "MYT": true, "MEX": true, "FSM": true, "MDA": true, - "MCO": true, "MNG": true, "MNE": true, "MSR": true, "MAR": true, - "MOZ": true, "MMR": true, "NAM": true, "NRU": true, "NPL": true, - "NLD": true, "NCL": true, "NZL": true, "NIC": true, "NER": true, - "NGA": true, "NIU": true, "NFK": true, "MKD": true, "MNP": true, - "NOR": true, "OMN": true, "PAK": true, "PLW": true, "PSE": true, - "PAN": true, "PNG": true, "PRY": true, "PER": true, "PHL": true, - "PCN": true, "POL": true, "PRT": true, "PRI": true, "QAT": true, - "ROU": true, "RUS": true, "RWA": true, "REU": true, "BLM": true, - "SHN": true, "KNA": true, "LCA": true, "MAF": true, "SPM": true, - "VCT": true, "WSM": true, "SMR": true, "STP": true, "SAU": true, - "SEN": true, "SRB": true, "SYC": true, "SLE": true, "SGP": true, - "SXM": true, "SVK": true, "SVN": true, "SLB": true, "SOM": true, - "ZAF": true, "SGS": true, "SSD": true, "ESP": true, "LKA": true, - "SDN": true, "SUR": true, "SJM": true, "SWE": true, "CHE": true, - "SYR": true, "TWN": true, "TJK": true, "TZA": true, "THA": true, - "TLS": true, "TGO": true, "TKL": true, "TON": true, "TTO": true, - "TUN": true, "TUR": true, "TKM": true, "TCA": true, "TUV": true, - "UGA": true, "UKR": true, "ARE": true, "GBR": true, "UMI": true, - "USA": true, "URY": true, "UZB": true, "VUT": true, "VEN": true, - "VNM": true, "VGB": true, "VIR": true, "WLF": true, "ESH": true, - "YEM": true, "ZMB": true, "ZWE": true, "ALA": true, -} -var iso3166_1_alpha_numeric = map[int]bool{ - // see: https://www.iso.org/iso-3166-country-codes.html - 4: true, 8: true, 12: true, 16: true, 20: true, - 24: true, 660: true, 10: true, 28: true, 32: true, - 51: true, 533: true, 36: true, 40: true, 31: true, - 44: true, 48: true, 50: true, 52: true, 112: true, - 56: true, 84: true, 204: true, 60: true, 64: true, - 68: true, 535: true, 70: true, 72: true, 74: true, - 76: true, 86: true, 96: true, 100: true, 854: true, - 108: true, 132: true, 116: true, 120: true, 124: true, - 136: true, 140: true, 148: true, 152: true, 156: true, - 162: true, 166: true, 170: true, 174: true, 180: true, - 178: true, 184: true, 188: true, 191: true, 192: true, - 531: true, 196: true, 203: true, 384: true, 208: true, - 262: true, 212: true, 214: true, 218: true, 818: true, - 222: true, 226: true, 232: true, 233: true, 748: true, - 231: true, 238: true, 234: true, 242: true, 246: true, - 250: true, 254: true, 258: true, 260: true, 266: true, - 270: true, 268: true, 276: true, 288: true, 292: true, - 300: true, 304: true, 308: true, 312: true, 316: true, - 320: true, 831: true, 324: true, 624: true, 328: true, - 332: true, 334: true, 336: true, 340: true, 344: true, - 348: true, 352: true, 356: true, 360: true, 364: true, - 368: true, 372: true, 833: true, 376: true, 380: true, - 388: true, 392: true, 832: true, 400: true, 398: true, - 404: true, 296: true, 408: true, 410: true, 414: true, - 417: true, 418: true, 428: true, 422: true, 426: true, - 430: true, 434: true, 438: true, 440: true, 442: true, - 446: true, 450: true, 454: true, 458: true, 462: true, - 466: true, 470: true, 584: true, 474: true, 478: true, - 480: true, 175: true, 484: true, 583: true, 498: true, - 492: true, 496: true, 499: true, 500: true, 504: true, - 508: true, 104: true, 516: true, 520: true, 524: true, - 528: true, 540: true, 554: true, 558: true, 562: true, - 566: true, 570: true, 574: true, 807: true, 580: true, - 578: true, 512: true, 586: true, 585: true, 275: true, - 591: true, 598: true, 600: true, 604: true, 608: true, - 612: true, 616: true, 620: true, 630: true, 634: true, - 642: true, 643: true, 646: true, 638: true, 652: true, - 654: true, 659: true, 662: true, 663: true, 666: true, - 670: true, 882: true, 674: true, 678: true, 682: true, - 686: true, 688: true, 690: true, 694: true, 702: true, - 534: true, 703: true, 705: true, 90: true, 706: true, - 710: true, 239: true, 728: true, 724: true, 144: true, - 729: true, 740: true, 744: true, 752: true, 756: true, - 760: true, 158: true, 762: true, 834: true, 764: true, - 626: true, 768: true, 772: true, 776: true, 780: true, - 788: true, 792: true, 795: true, 796: true, 798: true, - 800: true, 804: true, 784: true, 826: true, 581: true, - 840: true, 858: true, 860: true, 548: true, 862: true, - 704: true, 92: true, 850: true, 876: true, 732: true, - 887: true, 894: true, 716: true, 248: true, -} diff --git a/vendor/github.com/go-playground/validator/v10/doc.go b/vendor/github.com/go-playground/validator/v10/doc.go deleted file mode 100644 index a816c20..0000000 --- a/vendor/github.com/go-playground/validator/v10/doc.go +++ /dev/null @@ -1,1308 +0,0 @@ -/* -Package validator implements value validations for structs and individual fields -based on tags. - -It can also handle Cross-Field and Cross-Struct validation for nested structs -and has the ability to dive into arrays and maps of any type. - -see more examples https://github.com/go-playground/validator/tree/master/_examples - -Validation Functions Return Type error - -Doing things this way is actually the way the standard library does, see the -file.Open method here: - - https://golang.org/pkg/os/#Open. - -The authors return type "error" to avoid the issue discussed in the following, -where err is always != nil: - - http://stackoverflow.com/a/29138676/3158232 - https://github.com/go-playground/validator/issues/134 - -Validator only InvalidValidationError for bad validation input, nil or -ValidationErrors as type error; so, in your code all you need to do is check -if the error returned is not nil, and if it's not check if error is -InvalidValidationError ( if necessary, most of the time it isn't ) type cast -it to type ValidationErrors like so err.(validator.ValidationErrors). - -Custom Validation Functions - -Custom Validation functions can be added. Example: - - // Structure - func customFunc(fl validator.FieldLevel) bool { - - if fl.Field().String() == "invalid" { - return false - } - - return true - } - - validate.RegisterValidation("custom tag name", customFunc) - // NOTES: using the same tag name as an existing function - // will overwrite the existing one - -Cross-Field Validation - -Cross-Field Validation can be done via the following tags: - - eqfield - - nefield - - gtfield - - gtefield - - ltfield - - ltefield - - eqcsfield - - necsfield - - gtcsfield - - gtecsfield - - ltcsfield - - ltecsfield - -If, however, some custom cross-field validation is required, it can be done -using a custom validation. - -Why not just have cross-fields validation tags (i.e. only eqcsfield and not -eqfield)? - -The reason is efficiency. If you want to check a field within the same struct -"eqfield" only has to find the field on the same struct (1 level). But, if we -used "eqcsfield" it could be multiple levels down. Example: - - type Inner struct { - StartDate time.Time - } - - type Outer struct { - InnerStructField *Inner - CreatedAt time.Time `validate:"ltecsfield=InnerStructField.StartDate"` - } - - now := time.Now() - - inner := &Inner{ - StartDate: now, - } - - outer := &Outer{ - InnerStructField: inner, - CreatedAt: now, - } - - errs := validate.Struct(outer) - - // NOTE: when calling validate.Struct(val) topStruct will be the top level struct passed - // into the function - // when calling validate.VarWithValue(val, field, tag) val will be - // whatever you pass, struct, field... - // when calling validate.Field(field, tag) val will be nil - -Multiple Validators - -Multiple validators on a field will process in the order defined. Example: - - type Test struct { - Field `validate:"max=10,min=1"` - } - - // max will be checked then min - -Bad Validator definitions are not handled by the library. Example: - - type Test struct { - Field `validate:"min=10,max=0"` - } - - // this definition of min max will never succeed - -Using Validator Tags - -Baked In Cross-Field validation only compares fields on the same struct. -If Cross-Field + Cross-Struct validation is needed you should implement your -own custom validator. - -Comma (",") is the default separator of validation tags. If you wish to -have a comma included within the parameter (i.e. excludesall=,) you will need to -use the UTF-8 hex representation 0x2C, which is replaced in the code as a comma, -so the above will become excludesall=0x2C. - - type Test struct { - Field `validate:"excludesall=,"` // BAD! Do not include a comma. - Field `validate:"excludesall=0x2C"` // GOOD! Use the UTF-8 hex representation. - } - -Pipe ("|") is the 'or' validation tags deparator. If you wish to -have a pipe included within the parameter i.e. excludesall=| you will need to -use the UTF-8 hex representation 0x7C, which is replaced in the code as a pipe, -so the above will become excludesall=0x7C - - type Test struct { - Field `validate:"excludesall=|"` // BAD! Do not include a a pipe! - Field `validate:"excludesall=0x7C"` // GOOD! Use the UTF-8 hex representation. - } - - -Baked In Validators and Tags - -Here is a list of the current built in validators: - - -Skip Field - -Tells the validation to skip this struct field; this is particularly -handy in ignoring embedded structs from being validated. (Usage: -) - Usage: - - - -Or Operator - -This is the 'or' operator allowing multiple validators to be used and -accepted. (Usage: rgb|rgba) <-- this would allow either rgb or rgba -colors to be accepted. This can also be combined with 'and' for example -( Usage: omitempty,rgb|rgba) - - Usage: | - -StructOnly - -When a field that is a nested struct is encountered, and contains this flag -any validation on the nested struct will be run, but none of the nested -struct fields will be validated. This is useful if inside of your program -you know the struct will be valid, but need to verify it has been assigned. -NOTE: only "required" and "omitempty" can be used on a struct itself. - - Usage: structonly - -NoStructLevel - -Same as structonly tag except that any struct level validations will not run. - - Usage: nostructlevel - -Omit Empty - -Allows conditional validation, for example if a field is not set with -a value (Determined by the "required" validator) then other validation -such as min or max won't run, but if a value is set validation will run. - - Usage: omitempty - -Dive - -This tells the validator to dive into a slice, array or map and validate that -level of the slice, array or map with the validation tags that follow. -Multidimensional nesting is also supported, each level you wish to dive will -require another dive tag. dive has some sub-tags, 'keys' & 'endkeys', please see -the Keys & EndKeys section just below. - - Usage: dive - -Example #1 - - [][]string with validation tag "gt=0,dive,len=1,dive,required" - // gt=0 will be applied to [] - // len=1 will be applied to []string - // required will be applied to string - -Example #2 - - [][]string with validation tag "gt=0,dive,dive,required" - // gt=0 will be applied to [] - // []string will be spared validation - // required will be applied to string - -Keys & EndKeys - -These are to be used together directly after the dive tag and tells the validator -that anything between 'keys' and 'endkeys' applies to the keys of a map and not the -values; think of it like the 'dive' tag, but for map keys instead of values. -Multidimensional nesting is also supported, each level you wish to validate will -require another 'keys' and 'endkeys' tag. These tags are only valid for maps. - - Usage: dive,keys,othertagvalidation(s),endkeys,valuevalidationtags - -Example #1 - - map[string]string with validation tag "gt=0,dive,keys,eg=1|eq=2,endkeys,required" - // gt=0 will be applied to the map itself - // eg=1|eq=2 will be applied to the map keys - // required will be applied to map values - -Example #2 - - map[[2]string]string with validation tag "gt=0,dive,keys,dive,eq=1|eq=2,endkeys,required" - // gt=0 will be applied to the map itself - // eg=1|eq=2 will be applied to each array element in the the map keys - // required will be applied to map values - -Required - -This validates that the value is not the data types default zero value. -For numbers ensures value is not zero. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required - -Required If - -The field under validation must be present and not empty only if all -the other specified fields are equal to the value following the specified -field. For strings ensures value is not "". For slices, maps, pointers, -interfaces, channels and functions ensures the value is not nil. - - Usage: required_if - -Examples: - - // require the field if the Field1 is equal to the parameter given: - Usage: required_if=Field1 foobar - - // require the field if the Field1 and Field2 is equal to the value respectively: - Usage: required_if=Field1 foo Field2 bar - -Required Unless - -The field under validation must be present and not empty unless all -the other specified fields are equal to the value following the specified -field. For strings ensures value is not "". For slices, maps, pointers, -interfaces, channels and functions ensures the value is not nil. - - Usage: required_unless - -Examples: - - // require the field unless the Field1 is equal to the parameter given: - Usage: required_unless=Field1 foobar - - // require the field unless the Field1 and Field2 is equal to the value respectively: - Usage: required_unless=Field1 foo Field2 bar - -Required With - -The field under validation must be present and not empty only if any -of the other specified fields are present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_with - -Examples: - - // require the field if the Field1 is present: - Usage: required_with=Field1 - - // require the field if the Field1 or Field2 is present: - Usage: required_with=Field1 Field2 - -Required With All - -The field under validation must be present and not empty only if all -of the other specified fields are present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_with_all - -Example: - - // require the field if the Field1 and Field2 is present: - Usage: required_with_all=Field1 Field2 - -Required Without - -The field under validation must be present and not empty only when any -of the other specified fields are not present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_without - -Examples: - - // require the field if the Field1 is not present: - Usage: required_without=Field1 - - // require the field if the Field1 or Field2 is not present: - Usage: required_without=Field1 Field2 - -Required Without All - -The field under validation must be present and not empty only when all -of the other specified fields are not present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_without_all - -Example: - - // require the field if the Field1 and Field2 is not present: - Usage: required_without_all=Field1 Field2 - -Is Default - -This validates that the value is the default value and is almost the -opposite of required. - - Usage: isdefault - -Length - -For numbers, length will ensure that the value is -equal to the parameter given. For strings, it checks that -the string length is exactly that number of characters. For slices, -arrays, and maps, validates the number of items. - -Example #1 - - Usage: len=10 - -Example #2 (time.Duration) - -For time.Duration, len will ensure that the value is equal to the duration given -in the parameter. - - Usage: len=1h30m - -Maximum - -For numbers, max will ensure that the value is -less than or equal to the parameter given. For strings, it checks -that the string length is at most that number of characters. For -slices, arrays, and maps, validates the number of items. - -Example #1 - - Usage: max=10 - -Example #2 (time.Duration) - -For time.Duration, max will ensure that the value is less than or equal to the -duration given in the parameter. - - Usage: max=1h30m - -Minimum - -For numbers, min will ensure that the value is -greater or equal to the parameter given. For strings, it checks that -the string length is at least that number of characters. For slices, -arrays, and maps, validates the number of items. - -Example #1 - - Usage: min=10 - -Example #2 (time.Duration) - -For time.Duration, min will ensure that the value is greater than or equal to -the duration given in the parameter. - - Usage: min=1h30m - -Equals - -For strings & numbers, eq will ensure that the value is -equal to the parameter given. For slices, arrays, and maps, -validates the number of items. - -Example #1 - - Usage: eq=10 - -Example #2 (time.Duration) - -For time.Duration, eq will ensure that the value is equal to the duration given -in the parameter. - - Usage: eq=1h30m - -Not Equal - -For strings & numbers, ne will ensure that the value is not -equal to the parameter given. For slices, arrays, and maps, -validates the number of items. - -Example #1 - - Usage: ne=10 - -Example #2 (time.Duration) - -For time.Duration, ne will ensure that the value is not equal to the duration -given in the parameter. - - Usage: ne=1h30m - -One Of - -For strings, ints, and uints, oneof will ensure that the value -is one of the values in the parameter. The parameter should be -a list of values separated by whitespace. Values may be -strings or numbers. To match strings with spaces in them, include -the target string between single quotes. - - Usage: oneof=red green - oneof='red green' 'blue yellow' - oneof=5 7 9 - -Greater Than - -For numbers, this will ensure that the value is greater than the -parameter given. For strings, it checks that the string length -is greater than that number of characters. For slices, arrays -and maps it validates the number of items. - -Example #1 - - Usage: gt=10 - -Example #2 (time.Time) - -For time.Time ensures the time value is greater than time.Now.UTC(). - - Usage: gt - -Example #3 (time.Duration) - -For time.Duration, gt will ensure that the value is greater than the duration -given in the parameter. - - Usage: gt=1h30m - -Greater Than or Equal - -Same as 'min' above. Kept both to make terminology with 'len' easier. - -Example #1 - - Usage: gte=10 - -Example #2 (time.Time) - -For time.Time ensures the time value is greater than or equal to time.Now.UTC(). - - Usage: gte - -Example #3 (time.Duration) - -For time.Duration, gte will ensure that the value is greater than or equal to -the duration given in the parameter. - - Usage: gte=1h30m - -Less Than - -For numbers, this will ensure that the value is less than the parameter given. -For strings, it checks that the string length is less than that number of -characters. For slices, arrays, and maps it validates the number of items. - -Example #1 - - Usage: lt=10 - -Example #2 (time.Time) - -For time.Time ensures the time value is less than time.Now.UTC(). - - Usage: lt - -Example #3 (time.Duration) - -For time.Duration, lt will ensure that the value is less than the duration given -in the parameter. - - Usage: lt=1h30m - -Less Than or Equal - -Same as 'max' above. Kept both to make terminology with 'len' easier. - -Example #1 - - Usage: lte=10 - -Example #2 (time.Time) - -For time.Time ensures the time value is less than or equal to time.Now.UTC(). - - Usage: lte - -Example #3 (time.Duration) - -For time.Duration, lte will ensure that the value is less than or equal to the -duration given in the parameter. - - Usage: lte=1h30m - -Field Equals Another Field - -This will validate the field value against another fields value either within -a struct or passed in field. - -Example #1: - - // Validation on Password field using: - Usage: eqfield=ConfirmPassword - -Example #2: - - // Validating by field: - validate.VarWithValue(password, confirmpassword, "eqfield") - -Field Equals Another Field (relative) - -This does the same as eqfield except that it validates the field provided relative -to the top level struct. - - Usage: eqcsfield=InnerStructField.Field) - -Field Does Not Equal Another Field - -This will validate the field value against another fields value either within -a struct or passed in field. - -Examples: - - // Confirm two colors are not the same: - // - // Validation on Color field: - Usage: nefield=Color2 - - // Validating by field: - validate.VarWithValue(color1, color2, "nefield") - -Field Does Not Equal Another Field (relative) - -This does the same as nefield except that it validates the field provided -relative to the top level struct. - - Usage: necsfield=InnerStructField.Field - -Field Greater Than Another Field - -Only valid for Numbers, time.Duration and time.Time types, this will validate -the field value against another fields value either within a struct or passed in -field. usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(gtfield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "gtfield") - -Field Greater Than Another Relative Field - -This does the same as gtfield except that it validates the field provided -relative to the top level struct. - - Usage: gtcsfield=InnerStructField.Field - -Field Greater Than or Equal To Another Field - -Only valid for Numbers, time.Duration and time.Time types, this will validate -the field value against another fields value either within a struct or passed in -field. usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(gtefield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "gtefield") - -Field Greater Than or Equal To Another Relative Field - -This does the same as gtefield except that it validates the field provided relative -to the top level struct. - - Usage: gtecsfield=InnerStructField.Field - -Less Than Another Field - -Only valid for Numbers, time.Duration and time.Time types, this will validate -the field value against another fields value either within a struct or passed in -field. usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(ltfield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "ltfield") - -Less Than Another Relative Field - -This does the same as ltfield except that it validates the field provided relative -to the top level struct. - - Usage: ltcsfield=InnerStructField.Field - -Less Than or Equal To Another Field - -Only valid for Numbers, time.Duration and time.Time types, this will validate -the field value against another fields value either within a struct or passed in -field. usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(ltefield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "ltefield") - -Less Than or Equal To Another Relative Field - -This does the same as ltefield except that it validates the field provided relative -to the top level struct. - - Usage: ltecsfield=InnerStructField.Field - -Field Contains Another Field - -This does the same as contains except for struct fields. It should only be used -with string types. See the behavior of reflect.Value.String() for behavior on -other types. - - Usage: containsfield=InnerStructField.Field - -Field Excludes Another Field - -This does the same as excludes except for struct fields. It should only be used -with string types. See the behavior of reflect.Value.String() for behavior on -other types. - - Usage: excludesfield=InnerStructField.Field - -Unique - -For arrays & slices, unique will ensure that there are no duplicates. -For maps, unique will ensure that there are no duplicate values. -For slices of struct, unique will ensure that there are no duplicate values -in a field of the struct specified via a parameter. - - // For arrays, slices, and maps: - Usage: unique - - // For slices of struct: - Usage: unique=field - -Alpha Only - -This validates that a string value contains ASCII alpha characters only - - Usage: alpha - -Alphanumeric - -This validates that a string value contains ASCII alphanumeric characters only - - Usage: alphanum - -Alpha Unicode - -This validates that a string value contains unicode alpha characters only - - Usage: alphaunicode - -Alphanumeric Unicode - -This validates that a string value contains unicode alphanumeric characters only - - Usage: alphanumunicode - -Number - -This validates that a string value contains number values only. -For integers or float it returns true. - - Usage: number - -Numeric - -This validates that a string value contains a basic numeric value. -basic excludes exponents etc... -for integers or float it returns true. - - Usage: numeric - -Hexadecimal String - -This validates that a string value contains a valid hexadecimal. - - Usage: hexadecimal - -Hexcolor String - -This validates that a string value contains a valid hex color including -hashtag (#) - - Usage: hexcolor - -Lowercase String - -This validates that a string value contains only lowercase characters. An empty string is not a valid lowercase string. - - Usage: lowercase - -Uppercase String - -This validates that a string value contains only uppercase characters. An empty string is not a valid uppercase string. - - Usage: uppercase - -RGB String - -This validates that a string value contains a valid rgb color - - Usage: rgb - -RGBA String - -This validates that a string value contains a valid rgba color - - Usage: rgba - -HSL String - -This validates that a string value contains a valid hsl color - - Usage: hsl - -HSLA String - -This validates that a string value contains a valid hsla color - - Usage: hsla - -E.164 Phone Number String - -This validates that a string value contains a valid E.164 Phone number -https://en.wikipedia.org/wiki/E.164 (ex. +1123456789) - - Usage: e164 - -E-mail String - -This validates that a string value contains a valid email -This may not conform to all possibilities of any rfc standard, but neither -does any email provider accept all possibilities. - - Usage: email - -JSON String - -This validates that a string value is valid JSON - - Usage: json - -File path - -This validates that a string value contains a valid file path and that -the file exists on the machine. -This is done using os.Stat, which is a platform independent function. - - Usage: file - -URL String - -This validates that a string value contains a valid url -This will accept any url the golang request uri accepts but must contain -a schema for example http:// or rtmp:// - - Usage: url - -URI String - -This validates that a string value contains a valid uri -This will accept any uri the golang request uri accepts - - Usage: uri - -Urn RFC 2141 String - -This validataes that a string value contains a valid URN -according to the RFC 2141 spec. - - Usage: urn_rfc2141 - -Base64 String - -This validates that a string value contains a valid base64 value. -Although an empty string is valid base64 this will report an empty string -as an error, if you wish to accept an empty string as valid you can use -this with the omitempty tag. - - Usage: base64 - -Base64URL String - -This validates that a string value contains a valid base64 URL safe value -according the the RFC4648 spec. -Although an empty string is a valid base64 URL safe value, this will report -an empty string as an error, if you wish to accept an empty string as valid -you can use this with the omitempty tag. - - Usage: base64url - -Bitcoin Address - -This validates that a string value contains a valid bitcoin address. -The format of the string is checked to ensure it matches one of the three formats -P2PKH, P2SH and performs checksum validation. - - Usage: btc_addr - -Bitcoin Bech32 Address (segwit) - -This validates that a string value contains a valid bitcoin Bech32 address as defined -by bip-0173 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki) -Special thanks to Pieter Wuille for providng reference implementations. - - Usage: btc_addr_bech32 - -Ethereum Address - -This validates that a string value contains a valid ethereum address. -The format of the string is checked to ensure it matches the standard Ethereum address format. - - Usage: eth_addr - -Contains - -This validates that a string value contains the substring value. - - Usage: contains=@ - -Contains Any - -This validates that a string value contains any Unicode code points -in the substring value. - - Usage: containsany=!@#? - -Contains Rune - -This validates that a string value contains the supplied rune value. - - Usage: containsrune=@ - -Excludes - -This validates that a string value does not contain the substring value. - - Usage: excludes=@ - -Excludes All - -This validates that a string value does not contain any Unicode code -points in the substring value. - - Usage: excludesall=!@#? - -Excludes Rune - -This validates that a string value does not contain the supplied rune value. - - Usage: excludesrune=@ - -Starts With - -This validates that a string value starts with the supplied string value - - Usage: startswith=hello - -Ends With - -This validates that a string value ends with the supplied string value - - Usage: endswith=goodbye - -Does Not Start With - -This validates that a string value does not start with the supplied string value - - Usage: startsnotwith=hello - -Does Not End With - -This validates that a string value does not end with the supplied string value - - Usage: endsnotwith=goodbye - -International Standard Book Number - -This validates that a string value contains a valid isbn10 or isbn13 value. - - Usage: isbn - -International Standard Book Number 10 - -This validates that a string value contains a valid isbn10 value. - - Usage: isbn10 - -International Standard Book Number 13 - -This validates that a string value contains a valid isbn13 value. - - Usage: isbn13 - -Universally Unique Identifier UUID - -This validates that a string value contains a valid UUID. Uppercase UUID values will not pass - use `uuid_rfc4122` instead. - - Usage: uuid - -Universally Unique Identifier UUID v3 - -This validates that a string value contains a valid version 3 UUID. Uppercase UUID values will not pass - use `uuid3_rfc4122` instead. - - Usage: uuid3 - -Universally Unique Identifier UUID v4 - -This validates that a string value contains a valid version 4 UUID. Uppercase UUID values will not pass - use `uuid4_rfc4122` instead. - - Usage: uuid4 - -Universally Unique Identifier UUID v5 - -This validates that a string value contains a valid version 5 UUID. Uppercase UUID values will not pass - use `uuid5_rfc4122` instead. - - Usage: uuid5 - -ASCII - -This validates that a string value contains only ASCII characters. -NOTE: if the string is blank, this validates as true. - - Usage: ascii - -Printable ASCII - -This validates that a string value contains only printable ASCII characters. -NOTE: if the string is blank, this validates as true. - - Usage: printascii - -Multi-Byte Characters - -This validates that a string value contains one or more multibyte characters. -NOTE: if the string is blank, this validates as true. - - Usage: multibyte - -Data URL - -This validates that a string value contains a valid DataURI. -NOTE: this will also validate that the data portion is valid base64 - - Usage: datauri - -Latitude - -This validates that a string value contains a valid latitude. - - Usage: latitude - -Longitude - -This validates that a string value contains a valid longitude. - - Usage: longitude - -Social Security Number SSN - -This validates that a string value contains a valid U.S. Social Security Number. - - Usage: ssn - -Internet Protocol Address IP - -This validates that a string value contains a valid IP Address. - - Usage: ip - -Internet Protocol Address IPv4 - -This validates that a string value contains a valid v4 IP Address. - - Usage: ipv4 - -Internet Protocol Address IPv6 - -This validates that a string value contains a valid v6 IP Address. - - Usage: ipv6 - -Classless Inter-Domain Routing CIDR - -This validates that a string value contains a valid CIDR Address. - - Usage: cidr - -Classless Inter-Domain Routing CIDRv4 - -This validates that a string value contains a valid v4 CIDR Address. - - Usage: cidrv4 - -Classless Inter-Domain Routing CIDRv6 - -This validates that a string value contains a valid v6 CIDR Address. - - Usage: cidrv6 - -Transmission Control Protocol Address TCP - -This validates that a string value contains a valid resolvable TCP Address. - - Usage: tcp_addr - -Transmission Control Protocol Address TCPv4 - -This validates that a string value contains a valid resolvable v4 TCP Address. - - Usage: tcp4_addr - -Transmission Control Protocol Address TCPv6 - -This validates that a string value contains a valid resolvable v6 TCP Address. - - Usage: tcp6_addr - -User Datagram Protocol Address UDP - -This validates that a string value contains a valid resolvable UDP Address. - - Usage: udp_addr - -User Datagram Protocol Address UDPv4 - -This validates that a string value contains a valid resolvable v4 UDP Address. - - Usage: udp4_addr - -User Datagram Protocol Address UDPv6 - -This validates that a string value contains a valid resolvable v6 UDP Address. - - Usage: udp6_addr - -Internet Protocol Address IP - -This validates that a string value contains a valid resolvable IP Address. - - Usage: ip_addr - -Internet Protocol Address IPv4 - -This validates that a string value contains a valid resolvable v4 IP Address. - - Usage: ip4_addr - -Internet Protocol Address IPv6 - -This validates that a string value contains a valid resolvable v6 IP Address. - - Usage: ip6_addr - -Unix domain socket end point Address - -This validates that a string value contains a valid Unix Address. - - Usage: unix_addr - -Media Access Control Address MAC - -This validates that a string value contains a valid MAC Address. - - Usage: mac - -Note: See Go's ParseMAC for accepted formats and types: - - http://golang.org/src/net/mac.go?s=866:918#L29 - -Hostname RFC 952 - -This validates that a string value is a valid Hostname according to RFC 952 https://tools.ietf.org/html/rfc952 - - Usage: hostname - -Hostname RFC 1123 - -This validates that a string value is a valid Hostname according to RFC 1123 https://tools.ietf.org/html/rfc1123 - - Usage: hostname_rfc1123 or if you want to continue to use 'hostname' in your tags, create an alias. - -Full Qualified Domain Name (FQDN) - -This validates that a string value contains a valid FQDN. - - Usage: fqdn - -HTML Tags - -This validates that a string value appears to be an HTML element tag -including those described at https://developer.mozilla.org/en-US/docs/Web/HTML/Element - - Usage: html - -HTML Encoded - -This validates that a string value is a proper character reference in decimal -or hexadecimal format - - Usage: html_encoded - -URL Encoded - -This validates that a string value is percent-encoded (URL encoded) according -to https://tools.ietf.org/html/rfc3986#section-2.1 - - Usage: url_encoded - -Directory - -This validates that a string value contains a valid directory and that -it exists on the machine. -This is done using os.Stat, which is a platform independent function. - - Usage: dir - -HostPort - -This validates that a string value contains a valid DNS hostname and port that -can be used to valiate fields typically passed to sockets and connections. - - Usage: hostname_port - -Datetime - -This validates that a string value is a valid datetime based on the supplied datetime format. -Supplied format must match the official Go time format layout as documented in https://golang.org/pkg/time/ - - Usage: datetime=2006-01-02 - -Iso3166-1 alpha-2 - -This validates that a string value is a valid country code based on iso3166-1 alpha-2 standard. -see: https://www.iso.org/iso-3166-country-codes.html - - Usage: iso3166_1_alpha2 - -Iso3166-1 alpha-3 - -This validates that a string value is a valid country code based on iso3166-1 alpha-3 standard. -see: https://www.iso.org/iso-3166-country-codes.html - - Usage: iso3166_1_alpha3 - -Iso3166-1 alpha-numeric - -This validates that a string value is a valid country code based on iso3166-1 alpha-numeric standard. -see: https://www.iso.org/iso-3166-country-codes.html - - Usage: iso3166_1_alpha3 - -TimeZone - -This validates that a string value is a valid time zone based on the time zone database present on the system. -Although empty value and Local value are allowed by time.LoadLocation golang function, they are not allowed by this validator. -More information on https://golang.org/pkg/time/#LoadLocation - - Usage: timezone - - -Alias Validators and Tags - -NOTE: When returning an error, the tag returned in "FieldError" will be -the alias tag unless the dive tag is part of the alias. Everything after the -dive tag is not reported as the alias tag. Also, the "ActualTag" in the before -case will be the actual tag within the alias that failed. - -Here is a list of the current built in alias tags: - - "iscolor" - alias is "hexcolor|rgb|rgba|hsl|hsla" (Usage: iscolor) - "country_code" - alias is "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric" (Usage: country_code) - -Validator notes: - - regex - a regex validator won't be added because commas and = signs can be part - of a regex which conflict with the validation definitions. Although - workarounds can be made, they take away from using pure regex's. - Furthermore it's quick and dirty but the regex's become harder to - maintain and are not reusable, so it's as much a programming philosophy - as anything. - - In place of this new validator functions should be created; a regex can - be used within the validator function and even be precompiled for better - efficiency within regexes.go. - - And the best reason, you can submit a pull request and we can keep on - adding to the validation library of this package! - -Non standard validators - -A collection of validation rules that are frequently needed but are more -complex than the ones found in the baked in validators. -A non standard validator must be registered manually like you would -with your own custom validation functions. - -Example of registration and use: - - type Test struct { - TestField string `validate:"yourtag"` - } - - t := &Test{ - TestField: "Test" - } - - validate := validator.New() - validate.RegisterValidation("yourtag", validators.NotBlank) - -Here is a list of the current non standard validators: - - NotBlank - This validates that the value is not blank or with length zero. - For strings ensures they do not contain only spaces. For channels, maps, slices and arrays - ensures they don't have zero length. For others, a non empty value is required. - - Usage: notblank - -Panics - -This package panics when bad input is provided, this is by design, bad code like -that should not make it to production. - - type Test struct { - TestField string `validate:"nonexistantfunction=1"` - } - - t := &Test{ - TestField: "Test" - } - - validate.Struct(t) // this will panic -*/ -package validator diff --git a/vendor/github.com/go-playground/validator/v10/errors.go b/vendor/github.com/go-playground/validator/v10/errors.go deleted file mode 100644 index 63293cf..0000000 --- a/vendor/github.com/go-playground/validator/v10/errors.go +++ /dev/null @@ -1,275 +0,0 @@ -package validator - -import ( - "bytes" - "fmt" - "reflect" - "strings" - - ut "github.com/go-playground/universal-translator" -) - -const ( - fieldErrMsg = "Key: '%s' Error:Field validation for '%s' failed on the '%s' tag" -) - -// ValidationErrorsTranslations is the translation return type -type ValidationErrorsTranslations map[string]string - -// InvalidValidationError describes an invalid argument passed to -// `Struct`, `StructExcept`, StructPartial` or `Field` -type InvalidValidationError struct { - Type reflect.Type -} - -// Error returns InvalidValidationError message -func (e *InvalidValidationError) Error() string { - - if e.Type == nil { - return "validator: (nil)" - } - - return "validator: (nil " + e.Type.String() + ")" -} - -// ValidationErrors is an array of FieldError's -// for use in custom error messages post validation. -type ValidationErrors []FieldError - -// Error is intended for use in development + debugging and not intended to be a production error message. -// It allows ValidationErrors to subscribe to the Error interface. -// All information to create an error message specific to your application is contained within -// the FieldError found within the ValidationErrors array -func (ve ValidationErrors) Error() string { - - buff := bytes.NewBufferString("") - - var fe *fieldError - - for i := 0; i < len(ve); i++ { - - fe = ve[i].(*fieldError) - buff.WriteString(fe.Error()) - buff.WriteString("\n") - } - - return strings.TrimSpace(buff.String()) -} - -// Translate translates all of the ValidationErrors -func (ve ValidationErrors) Translate(ut ut.Translator) ValidationErrorsTranslations { - - trans := make(ValidationErrorsTranslations) - - var fe *fieldError - - for i := 0; i < len(ve); i++ { - fe = ve[i].(*fieldError) - - // // in case an Anonymous struct was used, ensure that the key - // // would be 'Username' instead of ".Username" - // if len(fe.ns) > 0 && fe.ns[:1] == "." { - // trans[fe.ns[1:]] = fe.Translate(ut) - // continue - // } - - trans[fe.ns] = fe.Translate(ut) - } - - return trans -} - -// FieldError contains all functions to get error details -type FieldError interface { - - // returns the validation tag that failed. if the - // validation was an alias, this will return the - // alias name and not the underlying tag that failed. - // - // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla" - // will return "iscolor" - Tag() string - - // returns the validation tag that failed, even if an - // alias the actual tag within the alias will be returned. - // If an 'or' validation fails the entire or will be returned. - // - // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla" - // will return "hexcolor|rgb|rgba|hsl|hsla" - ActualTag() string - - // returns the namespace for the field error, with the tag - // name taking precedence over the field's actual name. - // - // eg. JSON name "User.fname" - // - // See StructNamespace() for a version that returns actual names. - // - // NOTE: this field can be blank when validating a single primitive field - // using validate.Field(...) as there is no way to extract it's name - Namespace() string - - // returns the namespace for the field error, with the field's - // actual name. - // - // eq. "User.FirstName" see Namespace for comparison - // - // NOTE: this field can be blank when validating a single primitive field - // using validate.Field(...) as there is no way to extract its name - StructNamespace() string - - // returns the fields name with the tag name taking precedence over the - // field's actual name. - // - // eq. JSON name "fname" - // see StructField for comparison - Field() string - - // returns the field's actual name from the struct, when able to determine. - // - // eq. "FirstName" - // see Field for comparison - StructField() string - - // returns the actual field's value in case needed for creating the error - // message - Value() interface{} - - // returns the param value, in string form for comparison; this will also - // help with generating an error message - Param() string - - // Kind returns the Field's reflect Kind - // - // eg. time.Time's kind is a struct - Kind() reflect.Kind - - // Type returns the Field's reflect Type - // - // // eg. time.Time's type is time.Time - Type() reflect.Type - - // returns the FieldError's translated error - // from the provided 'ut.Translator' and registered 'TranslationFunc' - // - // NOTE: if no registered translator can be found it returns the same as - // calling fe.Error() - Translate(ut ut.Translator) string - - // Error returns the FieldError's message - Error() string -} - -// compile time interface checks -var _ FieldError = new(fieldError) -var _ error = new(fieldError) - -// fieldError contains a single field's validation error along -// with other properties that may be needed for error message creation -// it complies with the FieldError interface -type fieldError struct { - v *Validate - tag string - actualTag string - ns string - structNs string - fieldLen uint8 - structfieldLen uint8 - value interface{} - param string - kind reflect.Kind - typ reflect.Type -} - -// Tag returns the validation tag that failed. -func (fe *fieldError) Tag() string { - return fe.tag -} - -// ActualTag returns the validation tag that failed, even if an -// alias the actual tag within the alias will be returned. -func (fe *fieldError) ActualTag() string { - return fe.actualTag -} - -// Namespace returns the namespace for the field error, with the tag -// name taking precedence over the field's actual name. -func (fe *fieldError) Namespace() string { - return fe.ns -} - -// StructNamespace returns the namespace for the field error, with the field's -// actual name. -func (fe *fieldError) StructNamespace() string { - return fe.structNs -} - -// Field returns the field's name with the tag name taking precedence over the -// field's actual name. -func (fe *fieldError) Field() string { - - return fe.ns[len(fe.ns)-int(fe.fieldLen):] - // // return fe.field - // fld := fe.ns[len(fe.ns)-int(fe.fieldLen):] - - // log.Println("FLD:", fld) - - // if len(fld) > 0 && fld[:1] == "." { - // return fld[1:] - // } - - // return fld -} - -// returns the field's actual name from the struct, when able to determine. -func (fe *fieldError) StructField() string { - // return fe.structField - return fe.structNs[len(fe.structNs)-int(fe.structfieldLen):] -} - -// Value returns the actual field's value in case needed for creating the error -// message -func (fe *fieldError) Value() interface{} { - return fe.value -} - -// Param returns the param value, in string form for comparison; this will -// also help with generating an error message -func (fe *fieldError) Param() string { - return fe.param -} - -// Kind returns the Field's reflect Kind -func (fe *fieldError) Kind() reflect.Kind { - return fe.kind -} - -// Type returns the Field's reflect Type -func (fe *fieldError) Type() reflect.Type { - return fe.typ -} - -// Error returns the fieldError's error message -func (fe *fieldError) Error() string { - return fmt.Sprintf(fieldErrMsg, fe.ns, fe.Field(), fe.tag) -} - -// Translate returns the FieldError's translated error -// from the provided 'ut.Translator' and registered 'TranslationFunc' -// -// NOTE: if no registered translation can be found, it returns the original -// untranslated error message. -func (fe *fieldError) Translate(ut ut.Translator) string { - - m, ok := fe.v.transTagFunc[ut] - if !ok { - return fe.Error() - } - - fn, ok := m[fe.tag] - if !ok { - return fe.Error() - } - - return fn(ut, fe) -} diff --git a/vendor/github.com/go-playground/validator/v10/field_level.go b/vendor/github.com/go-playground/validator/v10/field_level.go deleted file mode 100644 index f0e2a9a..0000000 --- a/vendor/github.com/go-playground/validator/v10/field_level.go +++ /dev/null @@ -1,119 +0,0 @@ -package validator - -import "reflect" - -// FieldLevel contains all the information and helper functions -// to validate a field -type FieldLevel interface { - // returns the top level struct, if any - Top() reflect.Value - - // returns the current fields parent struct, if any or - // the comparison value if called 'VarWithValue' - Parent() reflect.Value - - // returns current field for validation - Field() reflect.Value - - // returns the field's name with the tag - // name taking precedence over the fields actual name. - FieldName() string - - // returns the struct field's name - StructFieldName() string - - // returns param for validation against current field - Param() string - - // GetTag returns the current validations tag name - GetTag() string - - // ExtractType gets the actual underlying type of field value. - // It will dive into pointers, customTypes and return you the - // underlying value and it's kind. - ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool) - - // traverses the parent struct to retrieve a specific field denoted by the provided namespace - // in the param and returns the field, field kind and whether is was successful in retrieving - // the field at all. - // - // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field - // could not be retrieved because it didn't exist. - // - // Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable. - GetStructFieldOK() (reflect.Value, reflect.Kind, bool) - - // GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for - // the field and namespace allowing more extensibility for validators. - // - // Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable. - GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) - - // traverses the parent struct to retrieve a specific field denoted by the provided namespace - // in the param and returns the field, field kind, if it's a nullable type and whether is was successful in retrieving - // the field at all. - // - // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field - // could not be retrieved because it didn't exist. - GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) - - // GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for - // the field and namespace allowing more extensibility for validators. - GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) -} - -var _ FieldLevel = new(validate) - -// Field returns current field for validation -func (v *validate) Field() reflect.Value { - return v.flField -} - -// FieldName returns the field's name with the tag -// name taking precedence over the fields actual name. -func (v *validate) FieldName() string { - return v.cf.altName -} - -// GetTag returns the current validations tag name -func (v *validate) GetTag() string { - return v.ct.tag -} - -// StructFieldName returns the struct field's name -func (v *validate) StructFieldName() string { - return v.cf.name -} - -// Param returns param for validation against current field -func (v *validate) Param() string { - return v.ct.param -} - -// GetStructFieldOK returns Param returns param for validation against current field -// -// Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable. -func (v *validate) GetStructFieldOK() (reflect.Value, reflect.Kind, bool) { - current, kind, _, found := v.getStructFieldOKInternal(v.slflParent, v.ct.param) - return current, kind, found -} - -// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for -// the field and namespace allowing more extensibility for validators. -// -// Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable. -func (v *validate) GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) { - current, kind, _, found := v.GetStructFieldOKAdvanced2(val, namespace) - return current, kind, found -} - -// GetStructFieldOK returns Param returns param for validation against current field -func (v *validate) GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) { - return v.getStructFieldOKInternal(v.slflParent, v.ct.param) -} - -// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for -// the field and namespace allowing more extensibility for validators. -func (v *validate) GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) { - return v.getStructFieldOKInternal(val, namespace) -} diff --git a/vendor/github.com/go-playground/validator/v10/go.mod b/vendor/github.com/go-playground/validator/v10/go.mod deleted file mode 100644 index d457100..0000000 --- a/vendor/github.com/go-playground/validator/v10/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module github.com/go-playground/validator/v10 - -go 1.13 - -require ( - github.com/go-playground/assert/v2 v2.0.1 - github.com/go-playground/locales v0.13.0 - github.com/go-playground/universal-translator v0.17.0 - github.com/leodido/go-urn v1.2.0 - golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 -) diff --git a/vendor/github.com/go-playground/validator/v10/go.sum b/vendor/github.com/go-playground/validator/v10/go.sum deleted file mode 100644 index 0152642..0000000 --- a/vendor/github.com/go-playground/validator/v10/go.sum +++ /dev/null @@ -1,28 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-playground/validator/v10/logo.png b/vendor/github.com/go-playground/validator/v10/logo.png deleted file mode 100644 index 355000f5247d50e979cf5db5de38188ef4649a34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13443 zcmbVz^LHiB^LK39wrv|5-`KWoTN~T9%?&s9Mte8f*xWeZ`~Lg^&kxU>)6-|>Om|IH zcUM=vsybFxSr!?A009gP3|U@IN*z>Z{#W2&KzAW<*L_e0I`lYd#@osT8GH952<>}$=#%H%txCM^!YLYIPG*~?*PoX}XfpXD#$r$vg% zUJ@M8Sa6}E0bs?J()q&Aj2!Xx^!*X7wf45!j09TZ!t8tmiZrhYa~rM!hkOgG3jNOL z$t%hsiEZp{`uZS=pUq3db%5@e>LpqUR%RzF4Fp&XYtszH3NMj(x&yBfN!B@dDe(i*$ zFaI9z`VK(*+SzZ3Km$V|gFS(NfPUS&ND}#zKM&MsZR;zy@SJwDwy5moK{eH84yz0`{Dhd+jynpps_Wzr*Rl)ctU%7jk!=>D(g}(sK zP}YV(B1|d_4NeR~4qlx?36qk5ng9u-wt+@fOTlvqhk>WQ%HxtjxBspSS(-6OpP;_x z73LX72W9oA=yUj&B*sjt0z}2U44ACNztdo!tbwR&pl8vCLjf!@HDwcP;p{h$JYsrk zE3Pp7L^A>!xwNPSX+2zrQgJ8|CCr11n`u|=C}{? zlHLN%{DxBD;+;&!6Se$BciUB@EQ~Y8_ZT-Q&4p}|A3l`R=AVR9Kt+V~a3a3V{l=)gHBK2op+X}BW7o(X1K2eRTZ^; ziO?#OmuWkXeCj2*{H(1C#qnQ>tz|Kq>*#cF7g)+?3G3(pVB@N37)9YHmYxa}CVb-% z@SHf5CnrEMiI6-&fkkOb9ema$%-Ld}qN54xNf|CDt?#e@Aec&IEcEEpu3Ak5Y z>0@s)b7yHEr~UCsek0JVuF%66MBgBxj-d!wQu4Evlx;p|pZG{&=4VV)*pIE{{f=SO z;V$)QC5ae=-6(Nc68{(S;2ymNVxIiwAs9}A@vA2?55kfV(qK>S6caF|bywd&p8ydL zB}xJ~6Di7u^Xl{s1E&b!{FXH0#>1$=MTNA7+vd;Pm*#B`iYRecX>5H7^iqDqQ{GQH zKNNh0?p}h?nEjh_Ft*^M`+(a;L*rKgPp=E!!}stvVxG|YKY=Yh25?+RloCoyT3T~2 zr1!?YL58}YTlyj1sTl_H(oBl48zJPwJFr9|r(>T7Npe$Hyl7Pm(dZ}|x;n!X(4wtZ zeNCCz4LTygy(gl;pV;dp+-Lpq=weiOW2Z_Lt@RNd_s43tZ>$@23^%6`T}rfexq!%# z)e|oR;kRY~2fW@V(in6QZzE*6TubN0<>|v2xiX)v6->d$no+&np8 z=DZPj>yPVL2Y2U^MJuW`R8R{2@Rg&}`S+$yEgsGihuW$3 z2y*A5Rm-TCh*xaY#R1q)HfzQS_%fPHCL7200}u=S#u`m zvW%z6F_UcmBq~g~s|d}v6$Q?noL`Z(X;@Q$i>kw^bF}I3A8QQyAE_nz-`H~a9o2}- ztPUs0q(DTZ^Yx3oA6C5I?{nHCX0qfW&C2r}h~~slhe!$_Hh1WB`w?_|D{JsF#zpgf z;F^yDTZs-$?`myzyDj@=x}@L4b~_KtUWzV+uiL${48Qh^ZdoywlRNR<*WLFY>v0fq zeWQS`g6{8q<#x){FrCbZlcTAh?+fw^gB-2LpRnlF^}`$D;(KxTOLn;dXs3Yl(uW$g6hyw3{wZdTVg|kdSet`n+SACG=!&%#r zl+Ha_MzD$G>iQb%tW~Uus7-zOMPI__Qo92dK3VKkGgR#;-!`uw++~l5J?MT+BUCv3 zcItfZO)uKXlipj1XD?F|>3frjQWA;$JV>TcHHrcrR=Ql;-B}Bb4;f|uVo(S7xL(QP zE%c8{bnchCJ%aG)3x8gx0`Hqq`eapfWqK`~Ec6Mea`v0{J?4~x(S2D#-7sMBR1X;{ zO-QlMUsyD!#jI^8v6y2J8TinHz_zsU@;3|?TfT0F2b2A7aX&aEQGc;IZ>UV*cToht z27rX9TA$h1ZMxk`KX|$6o$)=$PxIM3k^FhGmiJMaA3fBM6(M#efLJ9ucfbo2TkroP zxE4Dv?B_Nkef;0LYVj3nk|C9-MLv{y^-tY`SD(5phR2KMn}9@?I@SQ^#m* zu>9T8l>)311+yf)qc`Zp%3Cp9FS4PN18t5zZGy-!{f^5eJQA&Fb>Llf4kF^OZ}Tu z=jyadHyzlQLaf@_eAf{CFb}_v=Gj*BLc$VrMAe%hAL@6JaXkt^p&>`#SXjBAX!3#; zZ(sPdwtkoS08=HP@lruhHm*fIlu{y~LTu@+@;u*LBUU~nbQ7S{eH09xc5^_Xtu!q@ z6^P#P!A-(qwW30Th;TBWNp{b1+lP1D!2Y2In`HJ8=DTs8;1)Y~TE2Tco&agHaJGJRtE&{R2y^@Gnpny|$qxXc2=Ps$@$~9mxET{1Q$%i!i#frlzo0UOe_Y zMxNvLk98G99Jhl+-rMB_{OyQsE?70nTDUTZf%>P_;7WAz0a+FG*4EALUD*p3UWt_( z3yZrIM%L#2dleC=K}bD*)-@4195ctqtgM0iQACxJ?F&0O<{t?%^dK1pMJo*-dHj;E z%Vt=-^pa?Z(eb%_rx~$m@yuyvX^t!IvZZ&&LJtY`#;x+PXT-Gb~(3>gv;tf~4N37#aCX z-tW%A@AM^Cf&WBJl*|wp9s0RGq_rCL)=Klfe3e8BUY|7FGZM)#ZdT04zyZ#{*|<&8 z+dsxt9B+krqDfJbykPO==|6C|yAi)*jkV&C{Du7Y#drV0`{jGeFSFOANIz#B-ncz= zB?v}IR2j5eCJ`2>yNMN9<}h!(e$i><|KSPd(Ff^lC-7pg&G~QJ8T0JD-37gq1-K+V z;1?GW_CVrGX3V0m%yvW#+uGLl^01=9zyGrgZ5fJ6GeeULS25^4)YCL=-Z!w`r$tH= zj-ikdG|nI;y1wvvk2)h7^hL0Xvnxw)Y1u}&9Vv%k1};Z0IqW?AQ8)B@QOUa?ayt31 zX^`u?pa(0F6YpbrT;e2^auw#%0BX_ub?}_ieYF;4rGRd*1_vX-+Xv9I&yR@ zZF(3;`kXg0vHdTn$5Ie;gpS4@djPPJ60-Z_1?!DwQz9NO2jKDbkZ^oJbQVc?6v#&0 zAW|kWVx3>tw#eTFT> z$S^|&ZWo)7Lyes7r)@VL=2A|$JW1nr)ed9~F&(_uHC1f;YO_5oj&Afj!0(9M)7c*f z$rra8Ji?1Bc%e|v^CcS{(B7RRCc7Wrrs=I7)f#8IE{rDM)o~`?Y8!;pSaL!lLHCZ% z2RHV1+l?QSk}_AkH)`_s#(xKJ?jwKC`csy*aOGtV&`hmHIG<5hXtzm+=iQkb{pyZ< z%;RxAP~z<%lTo;vNWd4mn;*jW+1tVM*tJ0j)}5|LR4#M7r{PkXJaW;yHBr@9pIuiG z8V1M4Ci1&Z6T1I>(C@#6rJT=}4_MR%kp=0LFD)iInpDCFQ;rm ziA+yF-c%|NyQ8);!vM6)#xu8qylq9(nieBl!@e}S5}R@)8LEU)Q|o0z)Z3vP);l2n zvCG7gtlR2XtjF1}fhC?!r{BZ4#sNRJi-Kgt?Rd(rePR;wmE}rqM-z^#fA_=ptrRR~ zqS-A)prf=s19gdfPBn?#&j;!a+e1!wX7|RMt|@0KQ_^z7My)2imN}+? z&Ro$-#EC#FN(11}WJ|$X)eQ0hf7Xye3AhvowX$0|1+x+uY~g?ccTKswq+io;vFNd6 zr7#C9z4;>@b-tg$UzV@9U5hK{mDW{6%YjDa>FJu9Z8hZyN}pshPN=W>uI!^Q$kMqm z+}IiQA9sdYvoB1IiBfX#m0axM;6c8}N>K$tD8kW56>r1h5t8J!3X0YAj1|Aw&~l@A zxf2^V`F;A0W?i!7*yQ+#;?4!!1ZQrBEI$9+-N z6P_sTrV&}s7MX}77Nq}~KmQy&5T&0ZWX--y(<$MEOLGIm!7k)jQOWggN0!Rg^`Bj3z7;;PquhhFnoqJeAbUfHR~d2;C{_De_Ogp81i65*qU(X5fweyv+B#w>RW0 zm&_w7Zm z`YWfGxm^7MK^A>0nDITy;gz^Lzudv@BC>+^JOVExD%|?aa0W#9qe``&CHjF6vqV zB8&tSqdhz{r4(|w3!g-DZKg>^k=!a74kk`D{P(2>&R~8kXP)^Ns3jTlnM7|b=I@?W z*3YW^eW^H83@t)lUE4LAm#(ICbAZTgW?ohHU;Ok91QJvMGp6fHL|&TQb|ICaXi{OO zrD__`B5>e)a6orX^!P5CsJZqQhI9-E6v4*!cC1vUi2?G|44quG+rfLS+7ZX;meFoT zMa+fb0pH+x{|o<7L^;cM5J4}K*7m~l#N2_qa(YL%G9rt7(fo;z(CaJOODkCKPA9`Bop?dIYFl3wBU&l zdqN~tz4k#i1&+HT_N>0Qm%uxG;}xqfaciIXXK|67VNTu0yzMz6pt6)m~ z7y^EZ+(wMlK9yMiwkhp&>cmXQoRzGf`o{MmkrGaxJY*%s0Dza_WczOvC8IXtY4zGE zoAfaSy~MQoF^;l5RWb}DJq*S_&wp|_lkCAaR~iQkooeXo>yX+1hRw(?%#&k0 zm|IG1?>%mpBmLr(*DC>|Vr>bN;nKsdZLlS4*_h%G1n`;;6|sE0rg^T9KG)Swoz!z& zJra776~H1@daS@C;jzI*0~;x5(E1Fpo!nLAV=SmM;Q>*#bxdaC<;wO{!IV4ONwN}f z8NK=|T>UjQ5%%_C3KAVb1}wC~Feno-GH|l>&?HI*RX~t*0XtJ~S0R6Kst$kD*7mw& z{mR31-KopNO5bKJqku0*PjnBKFE_1y_|tmDtiN7SF!NZpwNb5#sV6w^bu9#1B5K7# z0N}))422cqc#^(uW?wJU*^KLe?VU&(*c6j;U6^LZcQoK4POU1{yKSH^?k2$VGLEWB zog!7!3_Kl%apr)=%d3Rpw_4BDLZf!1tIdN&D;Yg?X2&jp0vSBqbz)XX`Wu2%`IWJS1s3lhZ7H--?PJxQLg$XONw$8qE z@4G(S5}8yFwM`{Rdz9E__ZH{{Gusj%$t#w4+ac&G3wkM0n&qZPP}J9r*av-Zq- z%NdhH1sgs~Oq9{PLkkxDiK6MQo36OTZrr&F7k6+F*a}5hV<;1u+B`QQSF#ti5`pI3 z@gvRFovLjNAri8~54co-plD$yQSX*b95r9t@B%~eI2r9NqXw{mGRKtdG5*|wk~yO zW)?msL*Rlpy{X4OLKx;RTX5`t1RY4!(bJ`a7rJ?=xM7fwcCL;k7j%-*cj9NLfbojM= zsFk;>hWcz(m*MFBO66YXrs>D4!BqdqWy_oZ>c&}P@|L*1a zVk(-?<3wy?;t9XLM*dyTj^XbicaVIM%BJouomO8jaqzV51LbTf>Ywq=#cXFtO*-oC z$O(ezf}G*);p^d{5Cc9apUxWE7RHp-F$ne9h?~C!5ok6%glp3JFOLJd2A-Fm@I}Id-s z30mMGUBh}2LTd&+z4*b8fB8hNy+ke`kmJbFXYm9=Ud96znCvs;Xa*GB`{*jEPp($~+DX+RP*)$prD03Z~ zot>}r&YE}7>5Wkie5E(*NC^ihU`EdF6Ezw%Y_=C72{{2}2gipm z*Kp)Aa`c2J&xYYZ876z^z{Zt5pR2|?72(fT&g8MYt4OgJ8>+ZDr_oB=>9xhEw%27Y zdZWI$a9GrD@5Los+iFbyl507c-TMRH3x)MMT{uczOKy3!ra7;z>2})#CRqJW`Jr@s z)uA36KCgr8c)q);G>N2B3p4kyV4NWuoxzls;Xqq+eg~fI$A3otuea;KAQGd#L@`_H zA12vy0BVLhln8XMstlX5M43pjjcZzAO3GUc$zV-2^wq;7JE(EwPLoa!*2(XgxwSlx z2_J0xvN3`hnHWW^kuO7z`%AW8B~t4yhgSPHzS%y%$=}V7s+fZJ0#{k0^O+*L0|Zg4 zfX#xMrgl!s6Xo=iNk_&jq83fy!YAvDSuT8GO6%m58Pi*2YUR|;TQb;TdN=rqTpKIZ z-p&;$N{lIA6N##--%mV~CtEEa4=)@J`4YoT@$9}xH&qcX>lvW>wj*s%n1(JbS$r*d zK9ca~LMdTQ7v!Y34Q6Zh;50&tLX-E@$j3m@9%{iLEyrjeeM_lyMFuI6_pPMcUemdp z%6;iM!PP84B5GQ70B|+R^|BqipYC7_%BZRXP;eo#KZ6EBvBzlpn}@P3p}|8#I(4 zul0x<>TxI(s0g?8v|a89+n1)Jx##kH*g@FY*niUw?{Sqmm)Xi-;WBKlUieBT&& zR3bfdZ|yI{!e~+H2q@uF@=N3k*$H|RZpj@5hvmw~_Py+wV14-k8ynOVi-{@1gB;!g zop(C8F2W!)$gD|@VYtF3M2`gl44ny?45baF7yCBl4PB@{E_nNFz6{2b zr3nxXdd~S*FLLzzO#wytqw(3PI0_%D56fEkMQPca=JX$gqH9aJ{ZpKvk8&kz zVxpVpl56nj^P5R4Lm_KK_6WeFW0cD?IY zZu%H?$YfA5eBYF>2g^}+ig>LD^PgW_C#jRJ$|LNXlubK_b)pT9uqy)nlg?;4DG*(P@1w56aN4^TZM6bWUyCM1*1Czy}HIA#1w25=*y73 z^<0dmnQg(qFmL~t3lPYXx1H8~Zxg@d(x{4t40F=4{->PSRp{RzUszJHDlXejc7G)lY;8~fKsU-hk(590&9v& zFxr}ZKJqco?V2qb5bnkeLoQVbyu32=?$Kwh?;N0OiGN|7=6`RkdoJ(JT@djZ8dUCb za?z#~&v8Fm?V}L${Zr&aQ8JC0EF>X56u4pkjt-w^+1bG$r9f1OrJ$<6qE&iV7_}kN zQweT&?sbJOanV*#E0|bLjkCC(vOm|{V<5MsimhiSt-uxzjxz9SMUvMQK{`~RZ+v_m ztb%l8kCZHm@?oa?Mb$L;Bv2$(K*V=w5SD>$*ITQ!W*n%SOXJlQO>pLoRxLI#%aHpA zmYUE<8T)d$P6F=j$+`7W&dSV^FR;c5cvU=igm6$Q0Bz?EE|?msF@JEX89DoMOUuTr z`R{3)%|h-VtA7`wTgs8)s;PQ6$6IvQTsUzrO=Y6G!D)=Xx9w0$Gba6n1y?{dK@SoK ze54vzFH|9D2~QbpUTb_H)IYDfa|J}Lq9?%CFHbsIB8(vc1WUKbA`4uL=6b&iurle2 zi(4jg{2hA5K*7uKNnBA0KV4x*3NO0jb^QuEWV&39?%#Ve9aEQ)AWUUwycBSf_o%|` zTcm^fRU(B}U8I(N*#z&8fsGAkKpBAt5@UnRa>N{07@%qaw@bs$K2R5VP#c$2^Q%RQ zVuW0slT(*~U8kk?duR;_jOTpmwrrbx->n}JX^_|@zO|a)Ik@>X7HOQ(!z(#CF@`^7JGf2aEfn1S0v}oHKo%uVUMDjl3<>f#kD$hfw(^nW(aRB6AaG-TDAh%oHjEJ=J$;2s zNEtTUsuZa{ji(_8)1j8gUOb~B9fXBSc)M%Hfsu<`&aJGt{{#rePUQ zno1K;1#~H`?Rd#V$}MtvkS~UOgsP~@^u^u{ua{D3V=Fa{2IKwI7>|!cOUteP#X!Z_ z0=9Z(Y!#lhZpJ0TKxMl6%R?6~lt!EvNztb>dbADO5-ZkYS1f(TlqF6|c^Euh&Dojz z>7lTs0ClkTp5>|*~0 z_E{QdSna;}KOcu@*xbF3xyhffB&XIT`p{6hS*F))v#>=YEtJB9Cr*b2YtK$qd9@hS zP$+_%N43)URxgAF_fx!4#yRV$Y6W06mtQ<`6RwW>A*AaHVyEylR` z2)a@71;tKHeL9Ik*CB!~)Qw;=Fl6gGLG;?;LTeerep>@XsgVh4FN73z`?Z=yj9;v% zBxr{}l;h6)J_enD_Xs$w_!zAMpK(;B2{L7;9924=)DeQQG^=eR>S_sq&5Q6tF?!ZR z5Qknd!5HirCsnTIK}aSQLQ_)EQtb#JSG@QUVD}mpOr(idOXutsza|QP5K1WjdsWrs zkY855Sph`j8nzw^f)v# zwC?)Bwo9-}lWq~G9ow>)3->q?FnXQ<$)Y*Vq?hu8MmH8aL1yGrPXCBBQZxc2c}gM_ zazx&=nWtc(!DSU&y7M>VVWHK|f42Z4$ zgM>V`3TB$s+ZXAeFq65x>B{Mdc~^YySq_px;%mpmr2Huz$C}=8-KJN$50%RxgBJ`5 zP&~~O#I1B_1NXRe11=!ZG+8?m1fW)N1v3M~LuJCB_sLZ){E+CtNyJ{zEW!m2t6~4F z%H681*4phFkdH+Wb0LC&2rz`YF05QDpj#b^CS9c1iNN6yizQhsjIRb7ouDlN!>cKa zg7n0;K8z}XHxXi2Ecua32b&VylFo$*L~5$eud(~1>99o0y8R!-= zN_$<&9xytjEu>6segSMd2}6=@3VVB@GhvK>e5(3kr&=sV&}-F69b-m9?Ip^S&_1rK z)REQFT(LR2P6B9EqR$$Fjhw z@@PRbM9s{1I>jgtQ$A{Too_2xnL(GQD!IAjpSUUis4yB{sY$2}MT}d+!IfS_pu32*B z(%fM}`E)&K1vl5$L@*MaDwYf>96D4c;kb|PKTS;+YgrY9Ko@0Q)3$VlDZzF2D5qzp z3ooIC#iZNaZ8P4)aA|hlnC{a}TPrb~vTu2a+lFss)C;W1zZ926mndG{GXR|B)WfV} z(w*ugyn0Rs7_}^z1)X+M+)NXwrEUSMFwNFX_HD7RuV z!p-X54t?QhInx8)RxXg9Gk>_MaF-=XqAoa3dpy^>ZnMr+Cdt={MR4L zlI?2b=gsG3&Ijqpwy~pkv)Y=9n_|E|4ghMbhOV!U-CR;Kg+YdeFwVdfiyc*SZ33P= z$^Lo3LKgdGzEro#sbQm;1h}cbE=gD;VPV$RSAC(NX#P3$r*wNcQV1ac_8s?7<*v7Pd5{UE zcj<@b8s(}ugB+l6X(Y2RciZYZr@$lnh&EYVD&Q;@IV#m~)&N`>i%eC8QGg&uMXI=s zQLp~@6So9V;*{|ZngyWwRLWwzOCrXEh&`MazZ2wm)kNAKFDMMTX_jGA!oO_hJ-YRa z$^tLI^PHPVUu(o9eNPBKBkY8oY*JvIpawcN$Hq>rF`BD0kq%ngOwjI!^ei&^{U1>= z!^&Yoa|y-vSLjPKIP(7C?$zHcE6TomiB6zAM~x|S=v76w%>=hQ$rVordZSPGH_r!u za~NE4L)9W;Zi;ur8=N=;g2x`9ew-T?zd44CWDowkmcCKC2ZEkwyy{Cgf?DBwA)VTz zfJ;~J*q-_{>l2=#Z#w%BHa5yiZUb#89mRN|$!s*X41Sj}m@%Y%D8!j#oex}HpuLkT zi_70a875WHbj(&5q=Cb3*-Fn-b_=@DxVxh?M%~C#aO%I9A zfDhFlS)5h5m^sgc`qgo&LB;4CbJ+4Do$EQJL-i45cQ|%b4D${*iHS6$Z!lFja4{Z& zm_cQ;+$jmX_Ipjb?|qoQbz3TEQd@UgHO-t8i&2#uH*%Y+@t8HptKD;^>9mRb|w53r?9PIIfP$v|io_ z*cIdNpF96_?%r4O-CUdtgPsVgQ7~>`(Iv=~Vz&=N0I0@6UyQtkp156a;eRI#QPSg> zAcDjr+gD33>K!@@N;gSJr1%xowp?n{?=lK{fWo0V0xrMs(WD=)!hLrQ-FS z@!mYs_Wz~@&+paJijML41V^ce^;23KtbY_xNJKz@7&zTeFEoHm7;$(UI=YQFs#$@ptk!EQ42Y4FfxEf@TOsVt37 z}4AVbnC9Ri){mLjd@o@_vA;wzpV8G_ypN3Y=M08M6ZfM2Xtkpu^=A9}u!A?A z)0NYU%Y#TSSE#tnm?KTmo4 zd|UY(Tqjl;m?`7^R${$QG*ZIW=)p?(%lWYXyf8k9{rdP=)z$ty1cAPSJfgXTOPXN1 z^D-Pknjk$jWsP@0+o&sn#8=lA=)a-i-j|YE5DwZ9s#vk3w-c?}%C?C;Q@<(1;-i>L zl}SN#MAX*71GGR14&RiPaHe@3srrMMPYHjml+|aGSDU_fRi{h1_NlT;MHYR@D(IR3 zt6;N#m)Tdz?)V=$7s!&Z;ZdmJFd0m>InR~Umqz^)eM=coLx(q4tw%~Z0U73ho^=Mj zF)fREGIOlh6`*ARYk?K%ir!a_Yvw9snW){J#zyP<3!#qD8Q_2~d|so+(Xc54smil}_4kGqEK^l7mVKQmM+ zBR70H=a2QXGB!3jg`P(Kg~lE^KQr-y_EVJi%}cMMzb+f?)6-|yp{QzpZdk)-9EhXzQpEZ(ZuvkddnL`d4Y{JQ>J+Eg}}BSGkUqgbqYuem+;8++@MM(|;Eh?pTI_O&4Gy6PBOnIB)^cWfo! V^Rh-@K?jDw` - splitParamsRegexString = `'[^']*'|\S+` -) - -var ( - alphaRegex = regexp.MustCompile(alphaRegexString) - alphaNumericRegex = regexp.MustCompile(alphaNumericRegexString) - alphaUnicodeRegex = regexp.MustCompile(alphaUnicodeRegexString) - alphaUnicodeNumericRegex = regexp.MustCompile(alphaUnicodeNumericRegexString) - numericRegex = regexp.MustCompile(numericRegexString) - numberRegex = regexp.MustCompile(numberRegexString) - hexadecimalRegex = regexp.MustCompile(hexadecimalRegexString) - hexcolorRegex = regexp.MustCompile(hexcolorRegexString) - rgbRegex = regexp.MustCompile(rgbRegexString) - rgbaRegex = regexp.MustCompile(rgbaRegexString) - hslRegex = regexp.MustCompile(hslRegexString) - hslaRegex = regexp.MustCompile(hslaRegexString) - e164Regex = regexp.MustCompile(e164RegexString) - emailRegex = regexp.MustCompile(emailRegexString) - base64Regex = regexp.MustCompile(base64RegexString) - base64URLRegex = regexp.MustCompile(base64URLRegexString) - iSBN10Regex = regexp.MustCompile(iSBN10RegexString) - iSBN13Regex = regexp.MustCompile(iSBN13RegexString) - uUID3Regex = regexp.MustCompile(uUID3RegexString) - uUID4Regex = regexp.MustCompile(uUID4RegexString) - uUID5Regex = regexp.MustCompile(uUID5RegexString) - uUIDRegex = regexp.MustCompile(uUIDRegexString) - uUID3RFC4122Regex = regexp.MustCompile(uUID3RFC4122RegexString) - uUID4RFC4122Regex = regexp.MustCompile(uUID4RFC4122RegexString) - uUID5RFC4122Regex = regexp.MustCompile(uUID5RFC4122RegexString) - uUIDRFC4122Regex = regexp.MustCompile(uUIDRFC4122RegexString) - aSCIIRegex = regexp.MustCompile(aSCIIRegexString) - printableASCIIRegex = regexp.MustCompile(printableASCIIRegexString) - multibyteRegex = regexp.MustCompile(multibyteRegexString) - dataURIRegex = regexp.MustCompile(dataURIRegexString) - latitudeRegex = regexp.MustCompile(latitudeRegexString) - longitudeRegex = regexp.MustCompile(longitudeRegexString) - sSNRegex = regexp.MustCompile(sSNRegexString) - hostnameRegexRFC952 = regexp.MustCompile(hostnameRegexStringRFC952) - hostnameRegexRFC1123 = regexp.MustCompile(hostnameRegexStringRFC1123) - fqdnRegexRFC1123 = regexp.MustCompile(fqdnRegexStringRFC1123) - btcAddressRegex = regexp.MustCompile(btcAddressRegexString) - btcUpperAddressRegexBech32 = regexp.MustCompile(btcAddressUpperRegexStringBech32) - btcLowerAddressRegexBech32 = regexp.MustCompile(btcAddressLowerRegexStringBech32) - ethAddressRegex = regexp.MustCompile(ethAddressRegexString) - ethaddressRegexUpper = regexp.MustCompile(ethAddressUpperRegexString) - ethAddressRegexLower = regexp.MustCompile(ethAddressLowerRegexString) - uRLEncodedRegex = regexp.MustCompile(uRLEncodedRegexString) - hTMLEncodedRegex = regexp.MustCompile(hTMLEncodedRegexString) - hTMLRegex = regexp.MustCompile(hTMLRegexString) - splitParamsRegex = regexp.MustCompile(splitParamsRegexString) -) diff --git a/vendor/github.com/go-playground/validator/v10/struct_level.go b/vendor/github.com/go-playground/validator/v10/struct_level.go deleted file mode 100644 index 57691ee..0000000 --- a/vendor/github.com/go-playground/validator/v10/struct_level.go +++ /dev/null @@ -1,175 +0,0 @@ -package validator - -import ( - "context" - "reflect" -) - -// StructLevelFunc accepts all values needed for struct level validation -type StructLevelFunc func(sl StructLevel) - -// StructLevelFuncCtx accepts all values needed for struct level validation -// but also allows passing of contextual validation information via context.Context. -type StructLevelFuncCtx func(ctx context.Context, sl StructLevel) - -// wrapStructLevelFunc wraps normal StructLevelFunc makes it compatible with StructLevelFuncCtx -func wrapStructLevelFunc(fn StructLevelFunc) StructLevelFuncCtx { - return func(ctx context.Context, sl StructLevel) { - fn(sl) - } -} - -// StructLevel contains all the information and helper functions -// to validate a struct -type StructLevel interface { - - // returns the main validation object, in case one wants to call validations internally. - // this is so you don't have to use anonymous functions to get access to the validate - // instance. - Validator() *Validate - - // returns the top level struct, if any - Top() reflect.Value - - // returns the current fields parent struct, if any - Parent() reflect.Value - - // returns the current struct. - Current() reflect.Value - - // ExtractType gets the actual underlying type of field value. - // It will dive into pointers, customTypes and return you the - // underlying value and its kind. - ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool) - - // reports an error just by passing the field and tag information - // - // NOTES: - // - // fieldName and altName get appended to the existing namespace that - // validator is on. e.g. pass 'FirstName' or 'Names[0]' depending - // on the nesting - // - // tag can be an existing validation tag or just something you make up - // and process on the flip side it's up to you. - ReportError(field interface{}, fieldName, structFieldName string, tag, param string) - - // reports an error just by passing ValidationErrors - // - // NOTES: - // - // relativeNamespace and relativeActualNamespace get appended to the - // existing namespace that validator is on. - // e.g. pass 'User.FirstName' or 'Users[0].FirstName' depending - // on the nesting. most of the time they will be blank, unless you validate - // at a level lower the the current field depth - ReportValidationErrors(relativeNamespace, relativeActualNamespace string, errs ValidationErrors) -} - -var _ StructLevel = new(validate) - -// Top returns the top level struct -// -// NOTE: this can be the same as the current struct being validated -// if not is a nested struct. -// -// this is only called when within Struct and Field Level validation and -// should not be relied upon for an acurate value otherwise. -func (v *validate) Top() reflect.Value { - return v.top -} - -// Parent returns the current structs parent -// -// NOTE: this can be the same as the current struct being validated -// if not is a nested struct. -// -// this is only called when within Struct and Field Level validation and -// should not be relied upon for an acurate value otherwise. -func (v *validate) Parent() reflect.Value { - return v.slflParent -} - -// Current returns the current struct. -func (v *validate) Current() reflect.Value { - return v.slCurrent -} - -// Validator returns the main validation object, in case one want to call validations internally. -func (v *validate) Validator() *Validate { - return v.v -} - -// ExtractType gets the actual underlying type of field value. -func (v *validate) ExtractType(field reflect.Value) (reflect.Value, reflect.Kind, bool) { - return v.extractTypeInternal(field, false) -} - -// ReportError reports an error just by passing the field and tag information -func (v *validate) ReportError(field interface{}, fieldName, structFieldName, tag, param string) { - - fv, kind, _ := v.extractTypeInternal(reflect.ValueOf(field), false) - - if len(structFieldName) == 0 { - structFieldName = fieldName - } - - v.str1 = string(append(v.ns, fieldName...)) - - if v.v.hasTagNameFunc || fieldName != structFieldName { - v.str2 = string(append(v.actualNs, structFieldName...)) - } else { - v.str2 = v.str1 - } - - if kind == reflect.Invalid { - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: tag, - actualTag: tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(fieldName)), - structfieldLen: uint8(len(structFieldName)), - param: param, - kind: kind, - }, - ) - return - } - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: tag, - actualTag: tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(fieldName)), - structfieldLen: uint8(len(structFieldName)), - value: fv.Interface(), - param: param, - kind: kind, - typ: fv.Type(), - }, - ) -} - -// ReportValidationErrors reports ValidationErrors obtained from running validations within the Struct Level validation. -// -// NOTE: this function prepends the current namespace to the relative ones. -func (v *validate) ReportValidationErrors(relativeNamespace, relativeStructNamespace string, errs ValidationErrors) { - - var err *fieldError - - for i := 0; i < len(errs); i++ { - - err = errs[i].(*fieldError) - err.ns = string(append(append(v.ns, relativeNamespace...), err.ns...)) - err.structNs = string(append(append(v.actualNs, relativeStructNamespace...), err.structNs...)) - - v.errs = append(v.errs, err) - } -} diff --git a/vendor/github.com/go-playground/validator/v10/translations.go b/vendor/github.com/go-playground/validator/v10/translations.go deleted file mode 100644 index 4d9d75c..0000000 --- a/vendor/github.com/go-playground/validator/v10/translations.go +++ /dev/null @@ -1,11 +0,0 @@ -package validator - -import ut "github.com/go-playground/universal-translator" - -// TranslationFunc is the function type used to register or override -// custom translations -type TranslationFunc func(ut ut.Translator, fe FieldError) string - -// RegisterTranslationsFunc allows for registering of translations -// for a 'ut.Translator' for use within the 'TranslationFunc' -type RegisterTranslationsFunc func(ut ut.Translator) error diff --git a/vendor/github.com/go-playground/validator/v10/util.go b/vendor/github.com/go-playground/validator/v10/util.go deleted file mode 100644 index 56420f4..0000000 --- a/vendor/github.com/go-playground/validator/v10/util.go +++ /dev/null @@ -1,288 +0,0 @@ -package validator - -import ( - "reflect" - "strconv" - "strings" - "time" -) - -// extractTypeInternal gets the actual underlying type of field value. -// It will dive into pointers, customTypes and return you the -// underlying value and it's kind. -func (v *validate) extractTypeInternal(current reflect.Value, nullable bool) (reflect.Value, reflect.Kind, bool) { - -BEGIN: - switch current.Kind() { - case reflect.Ptr: - - nullable = true - - if current.IsNil() { - return current, reflect.Ptr, nullable - } - - current = current.Elem() - goto BEGIN - - case reflect.Interface: - - nullable = true - - if current.IsNil() { - return current, reflect.Interface, nullable - } - - current = current.Elem() - goto BEGIN - - case reflect.Invalid: - return current, reflect.Invalid, nullable - - default: - - if v.v.hasCustomFuncs { - - if fn, ok := v.v.customFuncs[current.Type()]; ok { - current = reflect.ValueOf(fn(current)) - goto BEGIN - } - } - - return current, current.Kind(), nullable - } -} - -// getStructFieldOKInternal traverses a struct to retrieve a specific field denoted by the provided namespace and -// returns the field, field kind and whether is was successful in retrieving the field at all. -// -// NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field -// could not be retrieved because it didn't exist. -func (v *validate) getStructFieldOKInternal(val reflect.Value, namespace string) (current reflect.Value, kind reflect.Kind, nullable bool, found bool) { - -BEGIN: - current, kind, nullable = v.ExtractType(val) - if kind == reflect.Invalid { - return - } - - if namespace == "" { - found = true - return - } - - switch kind { - - case reflect.Ptr, reflect.Interface: - return - - case reflect.Struct: - - typ := current.Type() - fld := namespace - var ns string - - if typ != timeType { - - idx := strings.Index(namespace, namespaceSeparator) - - if idx != -1 { - fld = namespace[:idx] - ns = namespace[idx+1:] - } else { - ns = "" - } - - bracketIdx := strings.Index(fld, leftBracket) - if bracketIdx != -1 { - fld = fld[:bracketIdx] - - ns = namespace[bracketIdx:] - } - - val = current.FieldByName(fld) - namespace = ns - goto BEGIN - } - - case reflect.Array, reflect.Slice: - idx := strings.Index(namespace, leftBracket) - idx2 := strings.Index(namespace, rightBracket) - - arrIdx, _ := strconv.Atoi(namespace[idx+1 : idx2]) - - if arrIdx >= current.Len() { - return - } - - startIdx := idx2 + 1 - - if startIdx < len(namespace) { - if namespace[startIdx:startIdx+1] == namespaceSeparator { - startIdx++ - } - } - - val = current.Index(arrIdx) - namespace = namespace[startIdx:] - goto BEGIN - - case reflect.Map: - idx := strings.Index(namespace, leftBracket) + 1 - idx2 := strings.Index(namespace, rightBracket) - - endIdx := idx2 - - if endIdx+1 < len(namespace) { - if namespace[endIdx+1:endIdx+2] == namespaceSeparator { - endIdx++ - } - } - - key := namespace[idx:idx2] - - switch current.Type().Key().Kind() { - case reflect.Int: - i, _ := strconv.Atoi(key) - val = current.MapIndex(reflect.ValueOf(i)) - namespace = namespace[endIdx+1:] - - case reflect.Int8: - i, _ := strconv.ParseInt(key, 10, 8) - val = current.MapIndex(reflect.ValueOf(int8(i))) - namespace = namespace[endIdx+1:] - - case reflect.Int16: - i, _ := strconv.ParseInt(key, 10, 16) - val = current.MapIndex(reflect.ValueOf(int16(i))) - namespace = namespace[endIdx+1:] - - case reflect.Int32: - i, _ := strconv.ParseInt(key, 10, 32) - val = current.MapIndex(reflect.ValueOf(int32(i))) - namespace = namespace[endIdx+1:] - - case reflect.Int64: - i, _ := strconv.ParseInt(key, 10, 64) - val = current.MapIndex(reflect.ValueOf(i)) - namespace = namespace[endIdx+1:] - - case reflect.Uint: - i, _ := strconv.ParseUint(key, 10, 0) - val = current.MapIndex(reflect.ValueOf(uint(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint8: - i, _ := strconv.ParseUint(key, 10, 8) - val = current.MapIndex(reflect.ValueOf(uint8(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint16: - i, _ := strconv.ParseUint(key, 10, 16) - val = current.MapIndex(reflect.ValueOf(uint16(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint32: - i, _ := strconv.ParseUint(key, 10, 32) - val = current.MapIndex(reflect.ValueOf(uint32(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint64: - i, _ := strconv.ParseUint(key, 10, 64) - val = current.MapIndex(reflect.ValueOf(i)) - namespace = namespace[endIdx+1:] - - case reflect.Float32: - f, _ := strconv.ParseFloat(key, 32) - val = current.MapIndex(reflect.ValueOf(float32(f))) - namespace = namespace[endIdx+1:] - - case reflect.Float64: - f, _ := strconv.ParseFloat(key, 64) - val = current.MapIndex(reflect.ValueOf(f)) - namespace = namespace[endIdx+1:] - - case reflect.Bool: - b, _ := strconv.ParseBool(key) - val = current.MapIndex(reflect.ValueOf(b)) - namespace = namespace[endIdx+1:] - - // reflect.Type = string - default: - val = current.MapIndex(reflect.ValueOf(key)) - namespace = namespace[endIdx+1:] - } - - goto BEGIN - } - - // if got here there was more namespace, cannot go any deeper - panic("Invalid field namespace") -} - -// asInt returns the parameter as a int64 -// or panics if it can't convert -func asInt(param string) int64 { - i, err := strconv.ParseInt(param, 0, 64) - panicIf(err) - - return i -} - -// asIntFromTimeDuration parses param as time.Duration and returns it as int64 -// or panics on error. -func asIntFromTimeDuration(param string) int64 { - d, err := time.ParseDuration(param) - if err != nil { - // attempt parsing as an an integer assuming nanosecond precision - return asInt(param) - } - return int64(d) -} - -// asIntFromType calls the proper function to parse param as int64, -// given a field's Type t. -func asIntFromType(t reflect.Type, param string) int64 { - switch t { - case timeDurationType: - return asIntFromTimeDuration(param) - default: - return asInt(param) - } -} - -// asUint returns the parameter as a uint64 -// or panics if it can't convert -func asUint(param string) uint64 { - - i, err := strconv.ParseUint(param, 0, 64) - panicIf(err) - - return i -} - -// asFloat returns the parameter as a float64 -// or panics if it can't convert -func asFloat(param string) float64 { - - i, err := strconv.ParseFloat(param, 64) - panicIf(err) - - return i -} - -// asBool returns the parameter as a bool -// or panics if it can't convert -func asBool(param string) bool { - - i, err := strconv.ParseBool(param) - panicIf(err) - - return i -} - -func panicIf(err error) { - if err != nil { - panic(err.Error()) - } -} diff --git a/vendor/github.com/go-playground/validator/v10/validator.go b/vendor/github.com/go-playground/validator/v10/validator.go deleted file mode 100644 index f097f39..0000000 --- a/vendor/github.com/go-playground/validator/v10/validator.go +++ /dev/null @@ -1,477 +0,0 @@ -package validator - -import ( - "context" - "fmt" - "reflect" - "strconv" -) - -// per validate construct -type validate struct { - v *Validate - top reflect.Value - ns []byte - actualNs []byte - errs ValidationErrors - includeExclude map[string]struct{} // reset only if StructPartial or StructExcept are called, no need otherwise - ffn FilterFunc - slflParent reflect.Value // StructLevel & FieldLevel - slCurrent reflect.Value // StructLevel & FieldLevel - flField reflect.Value // StructLevel & FieldLevel - cf *cField // StructLevel & FieldLevel - ct *cTag // StructLevel & FieldLevel - misc []byte // misc reusable - str1 string // misc reusable - str2 string // misc reusable - fldIsPointer bool // StructLevel & FieldLevel - isPartial bool - hasExcludes bool -} - -// parent and current will be the same the first run of validateStruct -func (v *validate) validateStruct(ctx context.Context, parent reflect.Value, current reflect.Value, typ reflect.Type, ns []byte, structNs []byte, ct *cTag) { - - cs, ok := v.v.structCache.Get(typ) - if !ok { - cs = v.v.extractStructCache(current, typ.Name()) - } - - if len(ns) == 0 && len(cs.name) != 0 { - - ns = append(ns, cs.name...) - ns = append(ns, '.') - - structNs = append(structNs, cs.name...) - structNs = append(structNs, '.') - } - - // ct is nil on top level struct, and structs as fields that have no tag info - // so if nil or if not nil and the structonly tag isn't present - if ct == nil || ct.typeof != typeStructOnly { - - var f *cField - - for i := 0; i < len(cs.fields); i++ { - - f = cs.fields[i] - - if v.isPartial { - - if v.ffn != nil { - // used with StructFiltered - if v.ffn(append(structNs, f.name...)) { - continue - } - - } else { - // used with StructPartial & StructExcept - _, ok = v.includeExclude[string(append(structNs, f.name...))] - - if (ok && v.hasExcludes) || (!ok && !v.hasExcludes) { - continue - } - } - } - - v.traverseField(ctx, parent, current.Field(f.idx), ns, structNs, f, f.cTags) - } - } - - // check if any struct level validations, after all field validations already checked. - // first iteration will have no info about nostructlevel tag, and is checked prior to - // calling the next iteration of validateStruct called from traverseField. - if cs.fn != nil { - - v.slflParent = parent - v.slCurrent = current - v.ns = ns - v.actualNs = structNs - - cs.fn(ctx, v) - } -} - -// traverseField validates any field, be it a struct or single field, ensures it's validity and passes it along to be validated via it's tag options -func (v *validate) traverseField(ctx context.Context, parent reflect.Value, current reflect.Value, ns []byte, structNs []byte, cf *cField, ct *cTag) { - var typ reflect.Type - var kind reflect.Kind - - current, kind, v.fldIsPointer = v.extractTypeInternal(current, false) - - switch kind { - case reflect.Ptr, reflect.Interface, reflect.Invalid: - - if ct == nil { - return - } - - if ct.typeof == typeOmitEmpty || ct.typeof == typeIsDefault { - return - } - - if ct.hasTag { - if kind == reflect.Invalid { - v.str1 = string(append(ns, cf.altName...)) - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - param: ct.param, - kind: kind, - }, - ) - return - } - - v.str1 = string(append(ns, cf.altName...)) - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - if !ct.runValidationWhenNil { - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: current.Type(), - }, - ) - return - } - } - - case reflect.Struct: - - typ = current.Type() - - if typ != timeType { - - if ct != nil { - - if ct.typeof == typeStructOnly { - goto CONTINUE - } else if ct.typeof == typeIsDefault { - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if !ct.fn(ctx, v) { - v.str1 = string(append(ns, cf.altName...)) - - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - return - } - } - - ct = ct.next - } - - if ct != nil && ct.typeof == typeNoStructLevel { - return - } - - CONTINUE: - // if len == 0 then validating using 'Var' or 'VarWithValue' - // Var - doesn't make much sense to do it that way, should call 'Struct', but no harm... - // VarWithField - this allows for validating against each field within the struct against a specific value - // pretty handy in certain situations - if len(cf.name) > 0 { - ns = append(append(ns, cf.altName...), '.') - structNs = append(append(structNs, cf.name...), '.') - } - - v.validateStruct(ctx, current, current, typ, ns, structNs, ct) - return - } - } - - if !ct.hasTag { - return - } - - typ = current.Type() - -OUTER: - for { - if ct == nil { - return - } - - switch ct.typeof { - - case typeOmitEmpty: - - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if !hasValue(v) { - return - } - - ct = ct.next - continue - - case typeEndKeys: - return - - case typeDive: - - ct = ct.next - - // traverse slice or map here - // or panic ;) - switch kind { - case reflect.Slice, reflect.Array: - - var i64 int64 - reusableCF := &cField{} - - for i := 0; i < current.Len(); i++ { - - i64 = int64(i) - - v.misc = append(v.misc[0:0], cf.name...) - v.misc = append(v.misc, '[') - v.misc = strconv.AppendInt(v.misc, i64, 10) - v.misc = append(v.misc, ']') - - reusableCF.name = string(v.misc) - - if cf.namesEqual { - reusableCF.altName = reusableCF.name - } else { - - v.misc = append(v.misc[0:0], cf.altName...) - v.misc = append(v.misc, '[') - v.misc = strconv.AppendInt(v.misc, i64, 10) - v.misc = append(v.misc, ']') - - reusableCF.altName = string(v.misc) - } - v.traverseField(ctx, parent, current.Index(i), ns, structNs, reusableCF, ct) - } - - case reflect.Map: - - var pv string - reusableCF := &cField{} - - for _, key := range current.MapKeys() { - - pv = fmt.Sprintf("%v", key.Interface()) - - v.misc = append(v.misc[0:0], cf.name...) - v.misc = append(v.misc, '[') - v.misc = append(v.misc, pv...) - v.misc = append(v.misc, ']') - - reusableCF.name = string(v.misc) - - if cf.namesEqual { - reusableCF.altName = reusableCF.name - } else { - v.misc = append(v.misc[0:0], cf.altName...) - v.misc = append(v.misc, '[') - v.misc = append(v.misc, pv...) - v.misc = append(v.misc, ']') - - reusableCF.altName = string(v.misc) - } - - if ct != nil && ct.typeof == typeKeys && ct.keys != nil { - v.traverseField(ctx, parent, key, ns, structNs, reusableCF, ct.keys) - // can be nil when just keys being validated - if ct.next != nil { - v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct.next) - } - } else { - v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct) - } - } - - default: - // throw error, if not a slice or map then should not have gotten here - // bad dive tag - panic("dive error! can't dive on a non slice or map") - } - - return - - case typeOr: - - v.misc = v.misc[0:0] - - for { - - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if ct.fn(ctx, v) { - - // drain rest of the 'or' values, then continue or leave - for { - - ct = ct.next - - if ct == nil { - return - } - - if ct.typeof != typeOr { - continue OUTER - } - } - } - - v.misc = append(v.misc, '|') - v.misc = append(v.misc, ct.tag...) - - if ct.hasParam { - v.misc = append(v.misc, '=') - v.misc = append(v.misc, ct.param...) - } - - if ct.isBlockEnd || ct.next == nil { - // if we get here, no valid 'or' value and no more tags - v.str1 = string(append(ns, cf.altName...)) - - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - - if ct.hasAlias { - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.actualAliasTag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - - } else { - - tVal := string(v.misc)[1:] - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: tVal, - actualTag: tVal, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - } - - return - } - - ct = ct.next - } - - default: - - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if !ct.fn(ctx, v) { - - v.str1 = string(append(ns, cf.altName...)) - - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - - return - } - ct = ct.next - } - } - -} diff --git a/vendor/github.com/go-playground/validator/v10/validator_instance.go b/vendor/github.com/go-playground/validator/v10/validator_instance.go deleted file mode 100644 index fe6a487..0000000 --- a/vendor/github.com/go-playground/validator/v10/validator_instance.go +++ /dev/null @@ -1,619 +0,0 @@ -package validator - -import ( - "context" - "errors" - "fmt" - "reflect" - "strings" - "sync" - "time" - - ut "github.com/go-playground/universal-translator" -) - -const ( - defaultTagName = "validate" - utf8HexComma = "0x2C" - utf8Pipe = "0x7C" - tagSeparator = "," - orSeparator = "|" - tagKeySeparator = "=" - structOnlyTag = "structonly" - noStructLevelTag = "nostructlevel" - omitempty = "omitempty" - isdefault = "isdefault" - requiredWithoutAllTag = "required_without_all" - requiredWithoutTag = "required_without" - requiredWithTag = "required_with" - requiredWithAllTag = "required_with_all" - requiredIfTag = "required_if" - requiredUnlessTag = "required_unless" - skipValidationTag = "-" - diveTag = "dive" - keysTag = "keys" - endKeysTag = "endkeys" - requiredTag = "required" - namespaceSeparator = "." - leftBracket = "[" - rightBracket = "]" - restrictedTagChars = ".[],|=+()`~!@#$%^&*\\\"/?<>{}" - restrictedAliasErr = "Alias '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation" - restrictedTagErr = "Tag '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation" -) - -var ( - timeDurationType = reflect.TypeOf(time.Duration(0)) - timeType = reflect.TypeOf(time.Time{}) - - defaultCField = &cField{namesEqual: true} -) - -// FilterFunc is the type used to filter fields using -// StructFiltered(...) function. -// returning true results in the field being filtered/skiped from -// validation -type FilterFunc func(ns []byte) bool - -// CustomTypeFunc allows for overriding or adding custom field type handler functions -// field = field value of the type to return a value to be validated -// example Valuer from sql drive see https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29 -type CustomTypeFunc func(field reflect.Value) interface{} - -// TagNameFunc allows for adding of a custom tag name parser -type TagNameFunc func(field reflect.StructField) string - -type internalValidationFuncWrapper struct { - fn FuncCtx - runValidatinOnNil bool -} - -// Validate contains the validator settings and cache -type Validate struct { - tagName string - pool *sync.Pool - hasCustomFuncs bool - hasTagNameFunc bool - tagNameFunc TagNameFunc - structLevelFuncs map[reflect.Type]StructLevelFuncCtx - customFuncs map[reflect.Type]CustomTypeFunc - aliases map[string]string - validations map[string]internalValidationFuncWrapper - transTagFunc map[ut.Translator]map[string]TranslationFunc // map[]map[]TranslationFunc - tagCache *tagCache - structCache *structCache -} - -// New returns a new instance of 'validate' with sane defaults. -func New() *Validate { - - tc := new(tagCache) - tc.m.Store(make(map[string]*cTag)) - - sc := new(structCache) - sc.m.Store(make(map[reflect.Type]*cStruct)) - - v := &Validate{ - tagName: defaultTagName, - aliases: make(map[string]string, len(bakedInAliases)), - validations: make(map[string]internalValidationFuncWrapper, len(bakedInValidators)), - tagCache: tc, - structCache: sc, - } - - // must copy alias validators for separate validations to be used in each validator instance - for k, val := range bakedInAliases { - v.RegisterAlias(k, val) - } - - // must copy validators for separate validations to be used in each instance - for k, val := range bakedInValidators { - - switch k { - // these require that even if the value is nil that the validation should run, omitempty still overrides this behaviour - case requiredIfTag, requiredUnlessTag, requiredWithTag, requiredWithAllTag, requiredWithoutTag, requiredWithoutAllTag: - _ = v.registerValidation(k, wrapFunc(val), true, true) - default: - // no need to error check here, baked in will always be valid - _ = v.registerValidation(k, wrapFunc(val), true, false) - } - } - - v.pool = &sync.Pool{ - New: func() interface{} { - return &validate{ - v: v, - ns: make([]byte, 0, 64), - actualNs: make([]byte, 0, 64), - misc: make([]byte, 32), - } - }, - } - - return v -} - -// SetTagName allows for changing of the default tag name of 'validate' -func (v *Validate) SetTagName(name string) { - v.tagName = name -} - -// RegisterTagNameFunc registers a function to get alternate names for StructFields. -// -// eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names: -// -// validate.RegisterTagNameFunc(func(fld reflect.StructField) string { -// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0] -// if name == "-" { -// return "" -// } -// return name -// }) -func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) { - v.tagNameFunc = fn - v.hasTagNameFunc = true -} - -// RegisterValidation adds a validation with the given tag -// -// NOTES: -// - if the key already exists, the previous validation function will be replaced. -// - this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterValidation(tag string, fn Func, callValidationEvenIfNull ...bool) error { - return v.RegisterValidationCtx(tag, wrapFunc(fn), callValidationEvenIfNull...) -} - -// RegisterValidationCtx does the same as RegisterValidation on accepts a FuncCtx validation -// allowing context.Context validation support. -func (v *Validate) RegisterValidationCtx(tag string, fn FuncCtx, callValidationEvenIfNull ...bool) error { - var nilCheckable bool - if len(callValidationEvenIfNull) > 0 { - nilCheckable = callValidationEvenIfNull[0] - } - return v.registerValidation(tag, fn, false, nilCheckable) -} - -func (v *Validate) registerValidation(tag string, fn FuncCtx, bakedIn bool, nilCheckable bool) error { - if len(tag) == 0 { - return errors.New("Function Key cannot be empty") - } - - if fn == nil { - return errors.New("Function cannot be empty") - } - - _, ok := restrictedTags[tag] - if !bakedIn && (ok || strings.ContainsAny(tag, restrictedTagChars)) { - panic(fmt.Sprintf(restrictedTagErr, tag)) - } - v.validations[tag] = internalValidationFuncWrapper{fn: fn, runValidatinOnNil: nilCheckable} - return nil -} - -// RegisterAlias registers a mapping of a single validation tag that -// defines a common or complex set of validation(s) to simplify adding validation -// to structs. -// -// NOTE: this function is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterAlias(alias, tags string) { - - _, ok := restrictedTags[alias] - - if ok || strings.ContainsAny(alias, restrictedTagChars) { - panic(fmt.Sprintf(restrictedAliasErr, alias)) - } - - v.aliases[alias] = tags -} - -// RegisterStructValidation registers a StructLevelFunc against a number of types. -// -// NOTE: -// - this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterStructValidation(fn StructLevelFunc, types ...interface{}) { - v.RegisterStructValidationCtx(wrapStructLevelFunc(fn), types...) -} - -// RegisterStructValidationCtx registers a StructLevelFuncCtx against a number of types and allows passing -// of contextual validation information via context.Context. -// -// NOTE: -// - this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...interface{}) { - - if v.structLevelFuncs == nil { - v.structLevelFuncs = make(map[reflect.Type]StructLevelFuncCtx) - } - - for _, t := range types { - tv := reflect.ValueOf(t) - if tv.Kind() == reflect.Ptr { - t = reflect.Indirect(tv).Interface() - } - - v.structLevelFuncs[reflect.TypeOf(t)] = fn - } -} - -// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types -// -// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterCustomTypeFunc(fn CustomTypeFunc, types ...interface{}) { - - if v.customFuncs == nil { - v.customFuncs = make(map[reflect.Type]CustomTypeFunc) - } - - for _, t := range types { - v.customFuncs[reflect.TypeOf(t)] = fn - } - - v.hasCustomFuncs = true -} - -// RegisterTranslation registers translations against the provided tag. -func (v *Validate) RegisterTranslation(tag string, trans ut.Translator, registerFn RegisterTranslationsFunc, translationFn TranslationFunc) (err error) { - - if v.transTagFunc == nil { - v.transTagFunc = make(map[ut.Translator]map[string]TranslationFunc) - } - - if err = registerFn(trans); err != nil { - return - } - - m, ok := v.transTagFunc[trans] - if !ok { - m = make(map[string]TranslationFunc) - v.transTagFunc[trans] = m - } - - m[tag] = translationFn - - return -} - -// Struct validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified. -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) Struct(s interface{}) error { - return v.StructCtx(context.Background(), s) -} - -// StructCtx validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified -// and also allows passing of context.Context for contextual validation information. -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructCtx(ctx context.Context, s interface{}) (err error) { - - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = false - // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept - - vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// StructFiltered validates a structs exposed fields, that pass the FilterFunc check and automatically validates -// nested structs, unless otherwise specified. -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructFiltered(s interface{}, fn FilterFunc) error { - return v.StructFilteredCtx(context.Background(), s, fn) -} - -// StructFilteredCtx validates a structs exposed fields, that pass the FilterFunc check and automatically validates -// nested structs, unless otherwise specified and also allows passing of contextual validation information via -// context.Context -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructFilteredCtx(ctx context.Context, s interface{}, fn FilterFunc) (err error) { - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = true - vd.ffn = fn - // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept - - vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// StructPartial validates the fields passed in only, ignoring all others. -// Fields may be provided in a namespaced fashion relative to the struct provided -// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructPartial(s interface{}, fields ...string) error { - return v.StructPartialCtx(context.Background(), s, fields...) -} - -// StructPartialCtx validates the fields passed in only, ignoring all others and allows passing of contextual -// validation validation information via context.Context -// Fields may be provided in a namespaced fashion relative to the struct provided -// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructPartialCtx(ctx context.Context, s interface{}, fields ...string) (err error) { - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = true - vd.ffn = nil - vd.hasExcludes = false - vd.includeExclude = make(map[string]struct{}) - - typ := val.Type() - name := typ.Name() - - for _, k := range fields { - - flds := strings.Split(k, namespaceSeparator) - if len(flds) > 0 { - - vd.misc = append(vd.misc[0:0], name...) - vd.misc = append(vd.misc, '.') - - for _, s := range flds { - - idx := strings.Index(s, leftBracket) - - if idx != -1 { - for idx != -1 { - vd.misc = append(vd.misc, s[:idx]...) - vd.includeExclude[string(vd.misc)] = struct{}{} - - idx2 := strings.Index(s, rightBracket) - idx2++ - vd.misc = append(vd.misc, s[idx:idx2]...) - vd.includeExclude[string(vd.misc)] = struct{}{} - s = s[idx2:] - idx = strings.Index(s, leftBracket) - } - } else { - - vd.misc = append(vd.misc, s...) - vd.includeExclude[string(vd.misc)] = struct{}{} - } - - vd.misc = append(vd.misc, '.') - } - } - } - - vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// StructExcept validates all fields except the ones passed in. -// Fields may be provided in a namespaced fashion relative to the struct provided -// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructExcept(s interface{}, fields ...string) error { - return v.StructExceptCtx(context.Background(), s, fields...) -} - -// StructExceptCtx validates all fields except the ones passed in and allows passing of contextual -// validation validation information via context.Context -// Fields may be provided in a namespaced fashion relative to the struct provided -// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructExceptCtx(ctx context.Context, s interface{}, fields ...string) (err error) { - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = true - vd.ffn = nil - vd.hasExcludes = true - vd.includeExclude = make(map[string]struct{}) - - typ := val.Type() - name := typ.Name() - - for _, key := range fields { - - vd.misc = vd.misc[0:0] - - if len(name) > 0 { - vd.misc = append(vd.misc, name...) - vd.misc = append(vd.misc, '.') - } - - vd.misc = append(vd.misc, key...) - vd.includeExclude[string(vd.misc)] = struct{}{} - } - - vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// Var validates a single variable using tag style validation. -// eg. -// var i int -// validate.Var(i, "gt=1,lt=10") -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) Var(field interface{}, tag string) error { - return v.VarCtx(context.Background(), field, tag) -} - -// VarCtx validates a single variable using tag style validation and allows passing of contextual -// validation validation information via context.Context. -// eg. -// var i int -// validate.Var(i, "gt=1,lt=10") -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (err error) { - if len(tag) == 0 || tag == skipValidationTag { - return nil - } - - ctag := v.fetchCacheTag(tag) - val := reflect.ValueOf(field) - vd := v.pool.Get().(*validate) - vd.top = val - vd.isPartial = false - vd.traverseField(ctx, val, val, vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - v.pool.Put(vd) - return -} - -// VarWithValue validates a single variable, against another variable/field's value using tag style validation -// eg. -// s1 := "abcd" -// s2 := "abcd" -// validate.VarWithValue(s1, s2, "eqcsfield") // returns true -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) VarWithValue(field interface{}, other interface{}, tag string) error { - return v.VarWithValueCtx(context.Background(), field, other, tag) -} - -// VarWithValueCtx validates a single variable, against another variable/field's value using tag style validation and -// allows passing of contextual validation validation information via context.Context. -// eg. -// s1 := "abcd" -// s2 := "abcd" -// validate.VarWithValue(s1, s2, "eqcsfield") // returns true -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other interface{}, tag string) (err error) { - if len(tag) == 0 || tag == skipValidationTag { - return nil - } - ctag := v.fetchCacheTag(tag) - otherVal := reflect.ValueOf(other) - vd := v.pool.Get().(*validate) - vd.top = otherVal - vd.isPartial = false - vd.traverseField(ctx, otherVal, reflect.ValueOf(field), vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - v.pool.Put(vd) - return -} diff --git a/vendor/github.com/go-sql-driver/mysql/.gitignore b/vendor/github.com/go-sql-driver/mysql/.gitignore deleted file mode 100644 index 2de28da..0000000 --- a/vendor/github.com/go-sql-driver/mysql/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -Icon? -ehthumbs.db -Thumbs.db -.idea diff --git a/vendor/github.com/go-sql-driver/mysql/.travis.yml b/vendor/github.com/go-sql-driver/mysql/.travis.yml deleted file mode 100644 index 56fcf25..0000000 --- a/vendor/github.com/go-sql-driver/mysql/.travis.yml +++ /dev/null @@ -1,129 +0,0 @@ -sudo: false -language: go -go: - - 1.10.x - - 1.11.x - - 1.12.x - - 1.13.x - - master - -before_install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - -before_script: - - echo -e "[server]\ninnodb_log_file_size=256MB\ninnodb_buffer_pool_size=512MB\nmax_allowed_packet=16MB" | sudo tee -a /etc/mysql/my.cnf - - sudo service mysql restart - - .travis/wait_mysql.sh - - mysql -e 'create database gotest;' - -matrix: - include: - - env: DB=MYSQL8 - sudo: required - dist: trusty - go: 1.10.x - services: - - docker - before_install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - - docker pull mysql:8.0 - - docker run -d -p 127.0.0.1:3307:3306 --name mysqld -e MYSQL_DATABASE=gotest -e MYSQL_USER=gotest -e MYSQL_PASSWORD=secret -e MYSQL_ROOT_PASSWORD=verysecret - mysql:8.0 --innodb_log_file_size=256MB --innodb_buffer_pool_size=512MB --max_allowed_packet=16MB --local-infile=1 - - cp .travis/docker.cnf ~/.my.cnf - - .travis/wait_mysql.sh - before_script: - - export MYSQL_TEST_USER=gotest - - export MYSQL_TEST_PASS=secret - - export MYSQL_TEST_ADDR=127.0.0.1:3307 - - export MYSQL_TEST_CONCURRENT=1 - - - env: DB=MYSQL57 - sudo: required - dist: trusty - go: 1.10.x - services: - - docker - before_install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - - docker pull mysql:5.7 - - docker run -d -p 127.0.0.1:3307:3306 --name mysqld -e MYSQL_DATABASE=gotest -e MYSQL_USER=gotest -e MYSQL_PASSWORD=secret -e MYSQL_ROOT_PASSWORD=verysecret - mysql:5.7 --innodb_log_file_size=256MB --innodb_buffer_pool_size=512MB --max_allowed_packet=16MB --local-infile=1 - - cp .travis/docker.cnf ~/.my.cnf - - .travis/wait_mysql.sh - before_script: - - export MYSQL_TEST_USER=gotest - - export MYSQL_TEST_PASS=secret - - export MYSQL_TEST_ADDR=127.0.0.1:3307 - - export MYSQL_TEST_CONCURRENT=1 - - - env: DB=MARIA55 - sudo: required - dist: trusty - go: 1.10.x - services: - - docker - before_install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - - docker pull mariadb:5.5 - - docker run -d -p 127.0.0.1:3307:3306 --name mysqld -e MYSQL_DATABASE=gotest -e MYSQL_USER=gotest -e MYSQL_PASSWORD=secret -e MYSQL_ROOT_PASSWORD=verysecret - mariadb:5.5 --innodb_log_file_size=256MB --innodb_buffer_pool_size=512MB --max_allowed_packet=16MB --local-infile=1 - - cp .travis/docker.cnf ~/.my.cnf - - .travis/wait_mysql.sh - before_script: - - export MYSQL_TEST_USER=gotest - - export MYSQL_TEST_PASS=secret - - export MYSQL_TEST_ADDR=127.0.0.1:3307 - - export MYSQL_TEST_CONCURRENT=1 - - - env: DB=MARIA10_1 - sudo: required - dist: trusty - go: 1.10.x - services: - - docker - before_install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - - docker pull mariadb:10.1 - - docker run -d -p 127.0.0.1:3307:3306 --name mysqld -e MYSQL_DATABASE=gotest -e MYSQL_USER=gotest -e MYSQL_PASSWORD=secret -e MYSQL_ROOT_PASSWORD=verysecret - mariadb:10.1 --innodb_log_file_size=256MB --innodb_buffer_pool_size=512MB --max_allowed_packet=16MB --local-infile=1 - - cp .travis/docker.cnf ~/.my.cnf - - .travis/wait_mysql.sh - before_script: - - export MYSQL_TEST_USER=gotest - - export MYSQL_TEST_PASS=secret - - export MYSQL_TEST_ADDR=127.0.0.1:3307 - - export MYSQL_TEST_CONCURRENT=1 - - - os: osx - osx_image: xcode10.1 - addons: - homebrew: - packages: - - mysql - update: true - go: 1.12.x - before_install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - before_script: - - echo -e "[server]\ninnodb_log_file_size=256MB\ninnodb_buffer_pool_size=512MB\nmax_allowed_packet=16MB\nlocal_infile=1" >> /usr/local/etc/my.cnf - - mysql.server start - - mysql -uroot -e 'CREATE USER gotest IDENTIFIED BY "secret"' - - mysql -uroot -e 'GRANT ALL ON *.* TO gotest' - - mysql -uroot -e 'create database gotest;' - - export MYSQL_TEST_USER=gotest - - export MYSQL_TEST_PASS=secret - - export MYSQL_TEST_ADDR=127.0.0.1:3306 - - export MYSQL_TEST_CONCURRENT=1 - -script: - - go test -v -covermode=count -coverprofile=coverage.out - - go vet ./... - - .travis/gofmt.sh -after_script: - - $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS deleted file mode 100644 index ad59898..0000000 --- a/vendor/github.com/go-sql-driver/mysql/AUTHORS +++ /dev/null @@ -1,105 +0,0 @@ -# This is the official list of Go-MySQL-Driver authors for copyright purposes. - -# If you are submitting a patch, please add your name or the name of the -# organization which holds the copyright to this list in alphabetical order. - -# Names should be added to this file as -# Name -# The email address is not required for organizations. -# Please keep the list sorted. - - -# Individual Persons - -Aaron Hopkins -Achille Roussel -Alexey Palazhchenko -Andrew Reid -Arne Hormann -Asta Xie -Bulat Gaifullin -Carlos Nieto -Chris Moos -Craig Wilson -Daniel Montoya -Daniel Nichter -Daniël van Eeden -Dave Protasowski -DisposaBoy -Egor Smolyakov -Erwan Martin -Evan Shaw -Frederick Mayle -Gustavo Kristic -Hajime Nakagami -Hanno Braun -Henri Yandell -Hirotaka Yamamoto -Huyiguang -ICHINOSE Shogo -Ilia Cimpoes -INADA Naoki -Jacek Szwec -James Harr -Jeff Hodges -Jeffrey Charles -Jerome Meyer -Jiajia Zhong -Jian Zhen -Joshua Prunier -Julien Lefevre -Julien Schmidt -Justin Li -Justin Nuß -Kamil Dziedzic -Kevin Malachowski -Kieron Woodhouse -Lennart Rudolph -Leonardo YongUk Kim -Linh Tran Tuan -Lion Yang -Luca Looz -Lucas Liu -Luke Scott -Maciej Zimnoch -Michael Woolnough -Nathanial Murphy -Nicola Peduzzi -Olivier Mengué -oscarzhao -Paul Bonser -Peter Schultz -Rebecca Chin -Reed Allman -Richard Wilkes -Robert Russell -Runrioter Wung -Shuode Li -Simon J Mudd -Soroush Pour -Stan Putrya -Stanley Gunawan -Steven Hartland -Thomas Wodarek -Tim Ruffles -Tom Jenkinson -Vladimir Kovpak -Xiangyu Hu -Xiaobing Jiang -Xiuming Chen -Zhenye Xie - -# Organizations - -Barracuda Networks, Inc. -Counting Ltd. -DigitalOcean Inc. -Facebook Inc. -GitHub Inc. -Google Inc. -InfoSum Ltd. -Keybase Inc. -Multiplay Ltd. -Percona LLC -Pivotal Inc. -Stripe Inc. diff --git a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md deleted file mode 100644 index 9cb97b3..0000000 --- a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md +++ /dev/null @@ -1,206 +0,0 @@ -## Version 1.5 (2020-01-07) - -Changes: - - - Dropped support Go 1.9 and lower (#823, #829, #886, #1016, #1017) - - Improve buffer handling (#890) - - Document potentially insecure TLS configs (#901) - - Use a double-buffering scheme to prevent data races (#943) - - Pass uint64 values without converting them to string (#838, #955) - - Update collations and make utf8mb4 default (#877, #1054) - - Make NullTime compatible with sql.NullTime in Go 1.13+ (#995) - - Removed CloudSQL support (#993, #1007) - - Add Go Module support (#1003) - -New Features: - - - Implement support of optional TLS (#900) - - Check connection liveness (#934, #964, #997, #1048, #1051, #1052) - - Implement Connector Interface (#941, #958, #1020, #1035) - -Bugfixes: - - - Mark connections as bad on error during ping (#875) - - Mark connections as bad on error during dial (#867) - - Fix connection leak caused by rapid context cancellation (#1024) - - Mark connections as bad on error during Conn.Prepare (#1030) - - -## Version 1.4.1 (2018-11-14) - -Bugfixes: - - - Fix TIME format for binary columns (#818) - - Fix handling of empty auth plugin names (#835) - - Fix caching_sha2_password with empty password (#826) - - Fix canceled context broke mysqlConn (#862) - - Fix OldAuthSwitchRequest support (#870) - - Fix Auth Response packet for cleartext password (#887) - -## Version 1.4 (2018-06-03) - -Changes: - - - Documentation fixes (#530, #535, #567) - - Refactoring (#575, #579, #580, #581, #603, #615, #704) - - Cache column names (#444) - - Sort the DSN parameters in DSNs generated from a config (#637) - - Allow native password authentication by default (#644) - - Use the default port if it is missing in the DSN (#668) - - Removed the `strict` mode (#676) - - Do not query `max_allowed_packet` by default (#680) - - Dropped support Go 1.6 and lower (#696) - - Updated `ConvertValue()` to match the database/sql/driver implementation (#760) - - Document the usage of `0000-00-00T00:00:00` as the time.Time zero value (#783) - - Improved the compatibility of the authentication system (#807) - -New Features: - - - Multi-Results support (#537) - - `rejectReadOnly` DSN option (#604) - - `context.Context` support (#608, #612, #627, #761) - - Transaction isolation level support (#619, #744) - - Read-Only transactions support (#618, #634) - - `NewConfig` function which initializes a config with default values (#679) - - Implemented the `ColumnType` interfaces (#667, #724) - - Support for custom string types in `ConvertValue` (#623) - - Implemented `NamedValueChecker`, improving support for uint64 with high bit set (#690, #709, #710) - - `caching_sha2_password` authentication plugin support (#794, #800, #801, #802) - - Implemented `driver.SessionResetter` (#779) - - `sha256_password` authentication plugin support (#808) - -Bugfixes: - - - Use the DSN hostname as TLS default ServerName if `tls=true` (#564, #718) - - Fixed LOAD LOCAL DATA INFILE for empty files (#590) - - Removed columns definition cache since it sometimes cached invalid data (#592) - - Don't mutate registered TLS configs (#600) - - Make RegisterTLSConfig concurrency-safe (#613) - - Handle missing auth data in the handshake packet correctly (#646) - - Do not retry queries when data was written to avoid data corruption (#302, #736) - - Cache the connection pointer for error handling before invalidating it (#678) - - Fixed imports for appengine/cloudsql (#700) - - Fix sending STMT_LONG_DATA for 0 byte data (#734) - - Set correct capacity for []bytes read from length-encoded strings (#766) - - Make RegisterDial concurrency-safe (#773) - - -## Version 1.3 (2016-12-01) - -Changes: - - - Go 1.1 is no longer supported - - Use decimals fields in MySQL to format time types (#249) - - Buffer optimizations (#269) - - TLS ServerName defaults to the host (#283) - - Refactoring (#400, #410, #437) - - Adjusted documentation for second generation CloudSQL (#485) - - Documented DSN system var quoting rules (#502) - - Made statement.Close() calls idempotent to avoid errors in Go 1.6+ (#512) - -New Features: - - - Enable microsecond resolution on TIME, DATETIME and TIMESTAMP (#249) - - Support for returning table alias on Columns() (#289, #359, #382) - - Placeholder interpolation, can be actived with the DSN parameter `interpolateParams=true` (#309, #318, #490) - - Support for uint64 parameters with high bit set (#332, #345) - - Cleartext authentication plugin support (#327) - - Exported ParseDSN function and the Config struct (#403, #419, #429) - - Read / Write timeouts (#401) - - Support for JSON field type (#414) - - Support for multi-statements and multi-results (#411, #431) - - DSN parameter to set the driver-side max_allowed_packet value manually (#489) - - Native password authentication plugin support (#494, #524) - -Bugfixes: - - - Fixed handling of queries without columns and rows (#255) - - Fixed a panic when SetKeepAlive() failed (#298) - - Handle ERR packets while reading rows (#321) - - Fixed reading NULL length-encoded integers in MySQL 5.6+ (#349) - - Fixed absolute paths support in LOAD LOCAL DATA INFILE (#356) - - Actually zero out bytes in handshake response (#378) - - Fixed race condition in registering LOAD DATA INFILE handler (#383) - - Fixed tests with MySQL 5.7.9+ (#380) - - QueryUnescape TLS config names (#397) - - Fixed "broken pipe" error by writing to closed socket (#390) - - Fixed LOAD LOCAL DATA INFILE buffering (#424) - - Fixed parsing of floats into float64 when placeholders are used (#434) - - Fixed DSN tests with Go 1.7+ (#459) - - Handle ERR packets while waiting for EOF (#473) - - Invalidate connection on error while discarding additional results (#513) - - Allow terminating packets of length 0 (#516) - - -## Version 1.2 (2014-06-03) - -Changes: - - - We switched back to a "rolling release". `go get` installs the current master branch again - - Version v1 of the driver will not be maintained anymore. Go 1.0 is no longer supported by this driver - - Exported errors to allow easy checking from application code - - Enabled TCP Keepalives on TCP connections - - Optimized INFILE handling (better buffer size calculation, lazy init, ...) - - The DSN parser also checks for a missing separating slash - - Faster binary date / datetime to string formatting - - Also exported the MySQLWarning type - - mysqlConn.Close returns the first error encountered instead of ignoring all errors - - writePacket() automatically writes the packet size to the header - - readPacket() uses an iterative approach instead of the recursive approach to merge splitted packets - -New Features: - - - `RegisterDial` allows the usage of a custom dial function to establish the network connection - - Setting the connection collation is possible with the `collation` DSN parameter. This parameter should be preferred over the `charset` parameter - - Logging of critical errors is configurable with `SetLogger` - - Google CloudSQL support - -Bugfixes: - - - Allow more than 32 parameters in prepared statements - - Various old_password fixes - - Fixed TestConcurrent test to pass Go's race detection - - Fixed appendLengthEncodedInteger for large numbers - - Renamed readLengthEnodedString to readLengthEncodedString and skipLengthEnodedString to skipLengthEncodedString (fixed typo) - - -## Version 1.1 (2013-11-02) - -Changes: - - - Go-MySQL-Driver now requires Go 1.1 - - Connections now use the collation `utf8_general_ci` by default. Adding `&charset=UTF8` to the DSN should not be necessary anymore - - Made closing rows and connections error tolerant. This allows for example deferring rows.Close() without checking for errors - - `[]byte(nil)` is now treated as a NULL value. Before, it was treated like an empty string / `[]byte("")` - - DSN parameter values must now be url.QueryEscape'ed. This allows text values to contain special characters, such as '&'. - - Use the IO buffer also for writing. This results in zero allocations (by the driver) for most queries - - Optimized the buffer for reading - - stmt.Query now caches column metadata - - New Logo - - Changed the copyright header to include all contributors - - Improved the LOAD INFILE documentation - - The driver struct is now exported to make the driver directly accessible - - Refactored the driver tests - - Added more benchmarks and moved all to a separate file - - Other small refactoring - -New Features: - - - Added *old_passwords* support: Required in some cases, but must be enabled by adding `allowOldPasswords=true` to the DSN since it is insecure - - Added a `clientFoundRows` parameter: Return the number of matching rows instead of the number of rows changed on UPDATEs - - Added TLS/SSL support: Use a TLS/SSL encrypted connection to the server. Custom TLS configs can be registered and used - -Bugfixes: - - - Fixed MySQL 4.1 support: MySQL 4.1 sends packets with lengths which differ from the specification - - Convert to DB timezone when inserting `time.Time` - - Splitted packets (more than 16MB) are now merged correctly - - Fixed false positive `io.EOF` errors when the data was fully read - - Avoid panics on reuse of closed connections - - Fixed empty string producing false nil values - - Fixed sign byte for positive TIME fields - - -## Version 1.0 (2013-05-14) - -Initial Release diff --git a/vendor/github.com/go-sql-driver/mysql/LICENSE b/vendor/github.com/go-sql-driver/mysql/LICENSE deleted file mode 100644 index 14e2f77..0000000 --- a/vendor/github.com/go-sql-driver/mysql/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/go-sql-driver/mysql/README.md b/vendor/github.com/go-sql-driver/mysql/README.md deleted file mode 100644 index d2627a4..0000000 --- a/vendor/github.com/go-sql-driver/mysql/README.md +++ /dev/null @@ -1,501 +0,0 @@ -# Go-MySQL-Driver - -A MySQL-Driver for Go's [database/sql](https://golang.org/pkg/database/sql/) package - -![Go-MySQL-Driver logo](https://raw.github.com/wiki/go-sql-driver/mysql/gomysql_m.png "Golang Gopher holding the MySQL Dolphin") - ---------------------------------------- - * [Features](#features) - * [Requirements](#requirements) - * [Installation](#installation) - * [Usage](#usage) - * [DSN (Data Source Name)](#dsn-data-source-name) - * [Password](#password) - * [Protocol](#protocol) - * [Address](#address) - * [Parameters](#parameters) - * [Examples](#examples) - * [Connection pool and timeouts](#connection-pool-and-timeouts) - * [context.Context Support](#contextcontext-support) - * [ColumnType Support](#columntype-support) - * [LOAD DATA LOCAL INFILE support](#load-data-local-infile-support) - * [time.Time support](#timetime-support) - * [Unicode support](#unicode-support) - * [Testing / Development](#testing--development) - * [License](#license) - ---------------------------------------- - -## Features - * Lightweight and [fast](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance") - * Native Go implementation. No C-bindings, just pure Go - * Connections over TCP/IPv4, TCP/IPv6, Unix domain sockets or [custom protocols](https://godoc.org/github.com/go-sql-driver/mysql#DialFunc) - * Automatic handling of broken connections - * Automatic Connection Pooling *(by database/sql package)* - * Supports queries larger than 16MB - * Full [`sql.RawBytes`](https://golang.org/pkg/database/sql/#RawBytes) support. - * Intelligent `LONG DATA` handling in prepared statements - * Secure `LOAD DATA LOCAL INFILE` support with file Whitelisting and `io.Reader` support - * Optional `time.Time` parsing - * Optional placeholder interpolation - -## Requirements - * Go 1.10 or higher. We aim to support the 3 latest versions of Go. - * MySQL (4.1+), MariaDB, Percona Server, Google CloudSQL or Sphinx (2.2.3+) - ---------------------------------------- - -## Installation -Simple install the package to your [$GOPATH](https://github.com/golang/go/wiki/GOPATH "GOPATH") with the [go tool](https://golang.org/cmd/go/ "go command") from shell: -```bash -$ go get -u github.com/go-sql-driver/mysql -``` -Make sure [Git is installed](https://git-scm.com/downloads) on your machine and in your system's `PATH`. - -## Usage -_Go MySQL Driver_ is an implementation of Go's `database/sql/driver` interface. You only need to import the driver and can use the full [`database/sql`](https://golang.org/pkg/database/sql/) API then. - -Use `mysql` as `driverName` and a valid [DSN](#dsn-data-source-name) as `dataSourceName`: -```go -import "database/sql" -import _ "github.com/go-sql-driver/mysql" - -db, err := sql.Open("mysql", "user:password@/dbname") -``` - -[Examples are available in our Wiki](https://github.com/go-sql-driver/mysql/wiki/Examples "Go-MySQL-Driver Examples"). - - -### DSN (Data Source Name) - -The Data Source Name has a common format, like e.g. [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php) uses it, but without type-prefix (optional parts marked by squared brackets): -``` -[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] -``` - -A DSN in its fullest form: -``` -username:password@protocol(address)/dbname?param=value -``` - -Except for the databasename, all values are optional. So the minimal DSN is: -``` -/dbname -``` - -If you do not want to preselect a database, leave `dbname` empty: -``` -/ -``` -This has the same effect as an empty DSN string: -``` - -``` - -Alternatively, [Config.FormatDSN](https://godoc.org/github.com/go-sql-driver/mysql#Config.FormatDSN) can be used to create a DSN string by filling a struct. - -#### Password -Passwords can consist of any character. Escaping is **not** necessary. - -#### Protocol -See [net.Dial](https://golang.org/pkg/net/#Dial) for more information which networks are available. -In general you should use an Unix domain socket if available and TCP otherwise for best performance. - -#### Address -For TCP and UDP networks, addresses have the form `host[:port]`. -If `port` is omitted, the default port will be used. -If `host` is a literal IPv6 address, it must be enclosed in square brackets. -The functions [net.JoinHostPort](https://golang.org/pkg/net/#JoinHostPort) and [net.SplitHostPort](https://golang.org/pkg/net/#SplitHostPort) manipulate addresses in this form. - -For Unix domain sockets the address is the absolute path to the MySQL-Server-socket, e.g. `/var/run/mysqld/mysqld.sock` or `/tmp/mysql.sock`. - -#### Parameters -*Parameters are case-sensitive!* - -Notice that any of `true`, `TRUE`, `True` or `1` is accepted to stand for a true boolean value. Not surprisingly, false can be specified as any of: `false`, `FALSE`, `False` or `0`. - -##### `allowAllFiles` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`allowAllFiles=true` disables the file Whitelist for `LOAD DATA LOCAL INFILE` and allows *all* files. -[*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html) - -##### `allowCleartextPasswords` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`allowCleartextPasswords=true` allows using the [cleartext client side plugin](http://dev.mysql.com/doc/en/cleartext-authentication-plugin.html) if required by an account, such as one defined with the [PAM authentication plugin](http://dev.mysql.com/doc/en/pam-authentication-plugin.html). Sending passwords in clear text may be a security problem in some configurations. To avoid problems if there is any possibility that the password would be intercepted, clients should connect to MySQL Server using a method that protects the password. Possibilities include [TLS / SSL](#tls), IPsec, or a private network. - -##### `allowNativePasswords` - -``` -Type: bool -Valid Values: true, false -Default: true -``` -`allowNativePasswords=false` disallows the usage of MySQL native password method. - -##### `allowOldPasswords` - -``` -Type: bool -Valid Values: true, false -Default: false -``` -`allowOldPasswords=true` allows the usage of the insecure old password method. This should be avoided, but is necessary in some cases. See also [the old_passwords wiki page](https://github.com/go-sql-driver/mysql/wiki/old_passwords). - -##### `charset` - -``` -Type: string -Valid Values: -Default: none -``` - -Sets the charset used for client-server interaction (`"SET NAMES "`). If multiple charsets are set (separated by a comma), the following charset is used if setting the charset failes. This enables for example support for `utf8mb4` ([introduced in MySQL 5.5.3](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)) with fallback to `utf8` for older servers (`charset=utf8mb4,utf8`). - -Usage of the `charset` parameter is discouraged because it issues additional queries to the server. -Unless you need the fallback behavior, please use `collation` instead. - -##### `checkConnLiveness` - -``` -Type: bool -Valid Values: true, false -Default: true -``` - -On supported platforms connections retrieved from the connection pool are checked for liveness before using them. If the check fails, the respective connection is marked as bad and the query retried with another connection. -`checkConnLiveness=false` disables this liveness check of connections. - -##### `collation` - -``` -Type: string -Valid Values: -Default: utf8mb4_general_ci -``` - -Sets the collation used for client-server interaction on connection. In contrast to `charset`, `collation` does not issue additional queries. If the specified collation is unavailable on the target server, the connection will fail. - -A list of valid charsets for a server is retrievable with `SHOW COLLATION`. - -The default collation (`utf8mb4_general_ci`) is supported from MySQL 5.5. You should use an older collation (e.g. `utf8_general_ci`) for older MySQL. - -Collations for charset "ucs2", "utf16", "utf16le", and "utf32" can not be used ([ref](https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html#charset-connection-impermissible-client-charset)). - - -##### `clientFoundRows` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`clientFoundRows=true` causes an UPDATE to return the number of matching rows instead of the number of rows changed. - -##### `columnsWithAlias` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -When `columnsWithAlias` is true, calls to `sql.Rows.Columns()` will return the table alias and the column name separated by a dot. For example: - -``` -SELECT u.id FROM users as u -``` - -will return `u.id` instead of just `id` if `columnsWithAlias=true`. - -##### `interpolateParams` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -If `interpolateParams` is true, placeholders (`?`) in calls to `db.Query()` and `db.Exec()` are interpolated into a single query string with given parameters. This reduces the number of roundtrips, since the driver has to prepare a statement, execute it with given parameters and close the statement again with `interpolateParams=false`. - -*This can not be used together with the multibyte encodings BIG5, CP932, GB2312, GBK or SJIS. These are blacklisted as they may [introduce a SQL injection vulnerability](http://stackoverflow.com/a/12118602/3430118)!* - -##### `loc` - -``` -Type: string -Valid Values: -Default: UTC -``` - -Sets the location for time.Time values (when using `parseTime=true`). *"Local"* sets the system's location. See [time.LoadLocation](https://golang.org/pkg/time/#LoadLocation) for details. - -Note that this sets the location for time.Time values but does not change MySQL's [time_zone setting](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html). For that see the [time_zone system variable](#system-variables), which can also be set as a DSN parameter. - -Please keep in mind, that param values must be [url.QueryEscape](https://golang.org/pkg/net/url/#QueryEscape)'ed. Alternatively you can manually replace the `/` with `%2F`. For example `US/Pacific` would be `loc=US%2FPacific`. - -##### `maxAllowedPacket` -``` -Type: decimal number -Default: 4194304 -``` - -Max packet size allowed in bytes. The default value is 4 MiB and should be adjusted to match the server settings. `maxAllowedPacket=0` can be used to automatically fetch the `max_allowed_packet` variable from server *on every connection*. - -##### `multiStatements` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -Allow multiple statements in one query. While this allows batch queries, it also greatly increases the risk of SQL injections. Only the result of the first query is returned, all other results are silently discarded. - -When `multiStatements` is used, `?` parameters must only be used in the first statement. - -##### `parseTime` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`parseTime=true` changes the output type of `DATE` and `DATETIME` values to `time.Time` instead of `[]byte` / `string` -The date or datetime like `0000-00-00 00:00:00` is converted into zero value of `time.Time`. - - -##### `readTimeout` - -``` -Type: duration -Default: 0 -``` - -I/O read timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. - -##### `rejectReadOnly` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - - -`rejectReadOnly=true` causes the driver to reject read-only connections. This -is for a possible race condition during an automatic failover, where the mysql -client gets connected to a read-only replica after the failover. - -Note that this should be a fairly rare case, as an automatic failover normally -happens when the primary is down, and the race condition shouldn't happen -unless it comes back up online as soon as the failover is kicked off. On the -other hand, when this happens, a MySQL application can get stuck on a -read-only connection until restarted. It is however fairly easy to reproduce, -for example, using a manual failover on AWS Aurora's MySQL-compatible cluster. - -If you are not relying on read-only transactions to reject writes that aren't -supposed to happen, setting this on some MySQL providers (such as AWS Aurora) -is safer for failovers. - -Note that ERROR 1290 can be returned for a `read-only` server and this option will -cause a retry for that error. However the same error number is used for some -other cases. You should ensure your application will never cause an ERROR 1290 -except for `read-only` mode when enabling this option. - - -##### `serverPubKey` - -``` -Type: string -Valid Values: -Default: none -``` - -Server public keys can be registered with [`mysql.RegisterServerPubKey`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterServerPubKey), which can then be used by the assigned name in the DSN. -Public keys are used to transmit encrypted data, e.g. for authentication. -If the server's public key is known, it should be set manually to avoid expensive and potentially insecure transmissions of the public key from the server to the client each time it is required. - - -##### `timeout` - -``` -Type: duration -Default: OS default -``` - -Timeout for establishing connections, aka dial timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. - - -##### `tls` - -``` -Type: bool / string -Valid Values: true, false, skip-verify, preferred, -Default: false -``` - -`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side) or use `preferred` to use TLS only when advertised by the server. This is similar to `skip-verify`, but additionally allows a fallback to a connection which is not encrypted. Neither `skip-verify` nor `preferred` add any reliable security. You can use a custom TLS config after registering it with [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig). - - -##### `writeTimeout` - -``` -Type: duration -Default: 0 -``` - -I/O write timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. - - -##### System Variables - -Any other parameters are interpreted as system variables: - * `=`: `SET =` - * `=`: `SET =` - * `=%27%27`: `SET =''` - -Rules: -* The values for string variables must be quoted with `'`. -* The values must also be [url.QueryEscape](http://golang.org/pkg/net/url/#QueryEscape)'ed! - (which implies values of string variables must be wrapped with `%27`). - -Examples: - * `autocommit=1`: `SET autocommit=1` - * [`time_zone=%27Europe%2FParis%27`](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html): `SET time_zone='Europe/Paris'` - * [`tx_isolation=%27REPEATABLE-READ%27`](https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_tx_isolation): `SET tx_isolation='REPEATABLE-READ'` - - -#### Examples -``` -user@unix(/path/to/socket)/dbname -``` - -``` -root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local -``` - -``` -user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true -``` - -Treat warnings as errors by setting the system variable [`sql_mode`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html): -``` -user:password@/dbname?sql_mode=TRADITIONAL -``` - -TCP via IPv6: -``` -user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci -``` - -TCP on a remote host, e.g. Amazon RDS: -``` -id:password@tcp(your-amazonaws-uri.com:3306)/dbname -``` - -Google Cloud SQL on App Engine: -``` -user:password@unix(/cloudsql/project-id:region-name:instance-name)/dbname -``` - -TCP using default port (3306) on localhost: -``` -user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped -``` - -Use the default protocol (tcp) and host (localhost:3306): -``` -user:password@/dbname -``` - -No Database preselected: -``` -user:password@/ -``` - - -### Connection pool and timeouts -The connection pool is managed by Go's database/sql package. For details on how to configure the size of the pool and how long connections stay in the pool see `*DB.SetMaxOpenConns`, `*DB.SetMaxIdleConns`, and `*DB.SetConnMaxLifetime` in the [database/sql documentation](https://golang.org/pkg/database/sql/). The read, write, and dial timeouts for each individual connection are configured with the DSN parameters [`readTimeout`](#readtimeout), [`writeTimeout`](#writetimeout), and [`timeout`](#timeout), respectively. - -## `ColumnType` Support -This driver supports the [`ColumnType` interface](https://golang.org/pkg/database/sql/#ColumnType) introduced in Go 1.8, with the exception of [`ColumnType.Length()`](https://golang.org/pkg/database/sql/#ColumnType.Length), which is currently not supported. - -## `context.Context` Support -Go 1.8 added `database/sql` support for `context.Context`. This driver supports query timeouts and cancellation via contexts. -See [context support in the database/sql package](https://golang.org/doc/go1.8#database_sql) for more details. - - -### `LOAD DATA LOCAL INFILE` support -For this feature you need direct access to the package. Therefore you must change the import path (no `_`): -```go -import "github.com/go-sql-driver/mysql" -``` - -Files must be whitelisted by registering them with `mysql.RegisterLocalFile(filepath)` (recommended) or the Whitelist check must be deactivated by using the DSN parameter `allowAllFiles=true` ([*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html)). - -To use a `io.Reader` a handler function must be registered with `mysql.RegisterReaderHandler(name, handler)` which returns a `io.Reader` or `io.ReadCloser`. The Reader is available with the filepath `Reader::` then. Choose different names for different handlers and `DeregisterReaderHandler` when you don't need it anymore. - -See the [godoc of Go-MySQL-Driver](https://godoc.org/github.com/go-sql-driver/mysql "golang mysql driver documentation") for details. - - -### `time.Time` support -The default internal output type of MySQL `DATE` and `DATETIME` values is `[]byte` which allows you to scan the value into a `[]byte`, `string` or `sql.RawBytes` variable in your program. - -However, many want to scan MySQL `DATE` and `DATETIME` values into `time.Time` variables, which is the logical equivalent in Go to `DATE` and `DATETIME` in MySQL. You can do that by changing the internal output type from `[]byte` to `time.Time` with the DSN parameter `parseTime=true`. You can set the default [`time.Time` location](https://golang.org/pkg/time/#Location) with the `loc` DSN parameter. - -**Caution:** As of Go 1.1, this makes `time.Time` the only variable type you can scan `DATE` and `DATETIME` values into. This breaks for example [`sql.RawBytes` support](https://github.com/go-sql-driver/mysql/wiki/Examples#rawbytes). - -Alternatively you can use the [`NullTime`](https://godoc.org/github.com/go-sql-driver/mysql#NullTime) type as the scan destination, which works with both `time.Time` and `string` / `[]byte`. - - -### Unicode support -Since version 1.5 Go-MySQL-Driver automatically uses the collation ` utf8mb4_general_ci` by default. - -Other collations / charsets can be set using the [`collation`](#collation) DSN parameter. - -Version 1.0 of the driver recommended adding `&charset=utf8` (alias for `SET NAMES utf8`) to the DSN to enable proper UTF-8 support. This is not necessary anymore. The [`collation`](#collation) parameter should be preferred to set another collation / charset than the default. - -See http://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html for more details on MySQL's Unicode support. - -## Testing / Development -To run the driver tests you may need to adjust the configuration. See the [Testing Wiki-Page](https://github.com/go-sql-driver/mysql/wiki/Testing "Testing") for details. - -Go-MySQL-Driver is not feature-complete yet. Your help is very appreciated. -If you want to contribute, you can work on an [open issue](https://github.com/go-sql-driver/mysql/issues?state=open) or review a [pull request](https://github.com/go-sql-driver/mysql/pulls). - -See the [Contribution Guidelines](https://github.com/go-sql-driver/mysql/blob/master/CONTRIBUTING.md) for details. - ---------------------------------------- - -## License -Go-MySQL-Driver is licensed under the [Mozilla Public License Version 2.0](https://raw.github.com/go-sql-driver/mysql/master/LICENSE) - -Mozilla summarizes the license scope as follows: -> MPL: The copyleft applies to any files containing MPLed code. - - -That means: - * You can **use** the **unchanged** source code both in private and commercially. - * When distributing, you **must publish** the source code of any **changed files** licensed under the MPL 2.0 under a) the MPL 2.0 itself or b) a compatible license (e.g. GPL 3.0 or Apache License 2.0). - * You **needn't publish** the source code of your library as long as the files licensed under the MPL 2.0 are **unchanged**. - -Please read the [MPL 2.0 FAQ](https://www.mozilla.org/en-US/MPL/2.0/FAQ/) if you have further questions regarding the license. - -You can read the full terms here: [LICENSE](https://raw.github.com/go-sql-driver/mysql/master/LICENSE). - -![Go Gopher and MySQL Dolphin](https://raw.github.com/wiki/go-sql-driver/mysql/go-mysql-driver_m.jpg "Golang Gopher transporting the MySQL Dolphin in a wheelbarrow") - diff --git a/vendor/github.com/go-sql-driver/mysql/auth.go b/vendor/github.com/go-sql-driver/mysql/auth.go deleted file mode 100644 index fec7040..0000000 --- a/vendor/github.com/go-sql-driver/mysql/auth.go +++ /dev/null @@ -1,422 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2018 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "crypto/rand" - "crypto/rsa" - "crypto/sha1" - "crypto/sha256" - "crypto/x509" - "encoding/pem" - "sync" -) - -// server pub keys registry -var ( - serverPubKeyLock sync.RWMutex - serverPubKeyRegistry map[string]*rsa.PublicKey -) - -// RegisterServerPubKey registers a server RSA public key which can be used to -// send data in a secure manner to the server without receiving the public key -// in a potentially insecure way from the server first. -// Registered keys can afterwards be used adding serverPubKey= to the DSN. -// -// Note: The provided rsa.PublicKey instance is exclusively owned by the driver -// after registering it and may not be modified. -// -// data, err := ioutil.ReadFile("mykey.pem") -// if err != nil { -// log.Fatal(err) -// } -// -// block, _ := pem.Decode(data) -// if block == nil || block.Type != "PUBLIC KEY" { -// log.Fatal("failed to decode PEM block containing public key") -// } -// -// pub, err := x509.ParsePKIXPublicKey(block.Bytes) -// if err != nil { -// log.Fatal(err) -// } -// -// if rsaPubKey, ok := pub.(*rsa.PublicKey); ok { -// mysql.RegisterServerPubKey("mykey", rsaPubKey) -// } else { -// log.Fatal("not a RSA public key") -// } -// -func RegisterServerPubKey(name string, pubKey *rsa.PublicKey) { - serverPubKeyLock.Lock() - if serverPubKeyRegistry == nil { - serverPubKeyRegistry = make(map[string]*rsa.PublicKey) - } - - serverPubKeyRegistry[name] = pubKey - serverPubKeyLock.Unlock() -} - -// DeregisterServerPubKey removes the public key registered with the given name. -func DeregisterServerPubKey(name string) { - serverPubKeyLock.Lock() - if serverPubKeyRegistry != nil { - delete(serverPubKeyRegistry, name) - } - serverPubKeyLock.Unlock() -} - -func getServerPubKey(name string) (pubKey *rsa.PublicKey) { - serverPubKeyLock.RLock() - if v, ok := serverPubKeyRegistry[name]; ok { - pubKey = v - } - serverPubKeyLock.RUnlock() - return -} - -// Hash password using pre 4.1 (old password) method -// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c -type myRnd struct { - seed1, seed2 uint32 -} - -const myRndMaxVal = 0x3FFFFFFF - -// Pseudo random number generator -func newMyRnd(seed1, seed2 uint32) *myRnd { - return &myRnd{ - seed1: seed1 % myRndMaxVal, - seed2: seed2 % myRndMaxVal, - } -} - -// Tested to be equivalent to MariaDB's floating point variant -// http://play.golang.org/p/QHvhd4qved -// http://play.golang.org/p/RG0q4ElWDx -func (r *myRnd) NextByte() byte { - r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal - r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal - - return byte(uint64(r.seed1) * 31 / myRndMaxVal) -} - -// Generate binary hash from byte string using insecure pre 4.1 method -func pwHash(password []byte) (result [2]uint32) { - var add uint32 = 7 - var tmp uint32 - - result[0] = 1345345333 - result[1] = 0x12345671 - - for _, c := range password { - // skip spaces and tabs in password - if c == ' ' || c == '\t' { - continue - } - - tmp = uint32(c) - result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) - result[1] += (result[1] << 8) ^ result[0] - add += tmp - } - - // Remove sign bit (1<<31)-1) - result[0] &= 0x7FFFFFFF - result[1] &= 0x7FFFFFFF - - return -} - -// Hash password using insecure pre 4.1 method -func scrambleOldPassword(scramble []byte, password string) []byte { - if len(password) == 0 { - return nil - } - - scramble = scramble[:8] - - hashPw := pwHash([]byte(password)) - hashSc := pwHash(scramble) - - r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) - - var out [8]byte - for i := range out { - out[i] = r.NextByte() + 64 - } - - mask := r.NextByte() - for i := range out { - out[i] ^= mask - } - - return out[:] -} - -// Hash password using 4.1+ method (SHA1) -func scramblePassword(scramble []byte, password string) []byte { - if len(password) == 0 { - return nil - } - - // stage1Hash = SHA1(password) - crypt := sha1.New() - crypt.Write([]byte(password)) - stage1 := crypt.Sum(nil) - - // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) - // inner Hash - crypt.Reset() - crypt.Write(stage1) - hash := crypt.Sum(nil) - - // outer Hash - crypt.Reset() - crypt.Write(scramble) - crypt.Write(hash) - scramble = crypt.Sum(nil) - - // token = scrambleHash XOR stage1Hash - for i := range scramble { - scramble[i] ^= stage1[i] - } - return scramble -} - -// Hash password using MySQL 8+ method (SHA256) -func scrambleSHA256Password(scramble []byte, password string) []byte { - if len(password) == 0 { - return nil - } - - // XOR(SHA256(password), SHA256(SHA256(SHA256(password)), scramble)) - - crypt := sha256.New() - crypt.Write([]byte(password)) - message1 := crypt.Sum(nil) - - crypt.Reset() - crypt.Write(message1) - message1Hash := crypt.Sum(nil) - - crypt.Reset() - crypt.Write(message1Hash) - crypt.Write(scramble) - message2 := crypt.Sum(nil) - - for i := range message1 { - message1[i] ^= message2[i] - } - - return message1 -} - -func encryptPassword(password string, seed []byte, pub *rsa.PublicKey) ([]byte, error) { - plain := make([]byte, len(password)+1) - copy(plain, password) - for i := range plain { - j := i % len(seed) - plain[i] ^= seed[j] - } - sha1 := sha1.New() - return rsa.EncryptOAEP(sha1, rand.Reader, pub, plain, nil) -} - -func (mc *mysqlConn) sendEncryptedPassword(seed []byte, pub *rsa.PublicKey) error { - enc, err := encryptPassword(mc.cfg.Passwd, seed, pub) - if err != nil { - return err - } - return mc.writeAuthSwitchPacket(enc) -} - -func (mc *mysqlConn) auth(authData []byte, plugin string) ([]byte, error) { - switch plugin { - case "caching_sha2_password": - authResp := scrambleSHA256Password(authData, mc.cfg.Passwd) - return authResp, nil - - case "mysql_old_password": - if !mc.cfg.AllowOldPasswords { - return nil, ErrOldPassword - } - // Note: there are edge cases where this should work but doesn't; - // this is currently "wontfix": - // https://github.com/go-sql-driver/mysql/issues/184 - authResp := append(scrambleOldPassword(authData[:8], mc.cfg.Passwd), 0) - return authResp, nil - - case "mysql_clear_password": - if !mc.cfg.AllowCleartextPasswords { - return nil, ErrCleartextPassword - } - // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html - // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html - return append([]byte(mc.cfg.Passwd), 0), nil - - case "mysql_native_password": - if !mc.cfg.AllowNativePasswords { - return nil, ErrNativePassword - } - // https://dev.mysql.com/doc/internals/en/secure-password-authentication.html - // Native password authentication only need and will need 20-byte challenge. - authResp := scramblePassword(authData[:20], mc.cfg.Passwd) - return authResp, nil - - case "sha256_password": - if len(mc.cfg.Passwd) == 0 { - return []byte{0}, nil - } - if mc.cfg.tls != nil || mc.cfg.Net == "unix" { - // write cleartext auth packet - return append([]byte(mc.cfg.Passwd), 0), nil - } - - pubKey := mc.cfg.pubKey - if pubKey == nil { - // request public key from server - return []byte{1}, nil - } - - // encrypted password - enc, err := encryptPassword(mc.cfg.Passwd, authData, pubKey) - return enc, err - - default: - errLog.Print("unknown auth plugin:", plugin) - return nil, ErrUnknownPlugin - } -} - -func (mc *mysqlConn) handleAuthResult(oldAuthData []byte, plugin string) error { - // Read Result Packet - authData, newPlugin, err := mc.readAuthResult() - if err != nil { - return err - } - - // handle auth plugin switch, if requested - if newPlugin != "" { - // If CLIENT_PLUGIN_AUTH capability is not supported, no new cipher is - // sent and we have to keep using the cipher sent in the init packet. - if authData == nil { - authData = oldAuthData - } else { - // copy data from read buffer to owned slice - copy(oldAuthData, authData) - } - - plugin = newPlugin - - authResp, err := mc.auth(authData, plugin) - if err != nil { - return err - } - if err = mc.writeAuthSwitchPacket(authResp); err != nil { - return err - } - - // Read Result Packet - authData, newPlugin, err = mc.readAuthResult() - if err != nil { - return err - } - - // Do not allow to change the auth plugin more than once - if newPlugin != "" { - return ErrMalformPkt - } - } - - switch plugin { - - // https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/ - case "caching_sha2_password": - switch len(authData) { - case 0: - return nil // auth successful - case 1: - switch authData[0] { - case cachingSha2PasswordFastAuthSuccess: - if err = mc.readResultOK(); err == nil { - return nil // auth successful - } - - case cachingSha2PasswordPerformFullAuthentication: - if mc.cfg.tls != nil || mc.cfg.Net == "unix" { - // write cleartext auth packet - err = mc.writeAuthSwitchPacket(append([]byte(mc.cfg.Passwd), 0)) - if err != nil { - return err - } - } else { - pubKey := mc.cfg.pubKey - if pubKey == nil { - // request public key from server - data, err := mc.buf.takeSmallBuffer(4 + 1) - if err != nil { - return err - } - data[4] = cachingSha2PasswordRequestPublicKey - mc.writePacket(data) - - // parse public key - if data, err = mc.readPacket(); err != nil { - return err - } - - block, _ := pem.Decode(data[1:]) - pkix, err := x509.ParsePKIXPublicKey(block.Bytes) - if err != nil { - return err - } - pubKey = pkix.(*rsa.PublicKey) - } - - // send encrypted password - err = mc.sendEncryptedPassword(oldAuthData, pubKey) - if err != nil { - return err - } - } - return mc.readResultOK() - - default: - return ErrMalformPkt - } - default: - return ErrMalformPkt - } - - case "sha256_password": - switch len(authData) { - case 0: - return nil // auth successful - default: - block, _ := pem.Decode(authData) - pub, err := x509.ParsePKIXPublicKey(block.Bytes) - if err != nil { - return err - } - - // send encrypted password - err = mc.sendEncryptedPassword(oldAuthData, pub.(*rsa.PublicKey)) - if err != nil { - return err - } - return mc.readResultOK() - } - - default: - return nil // auth successful - } - - return err -} diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go deleted file mode 100644 index 0774c5c..0000000 --- a/vendor/github.com/go-sql-driver/mysql/buffer.go +++ /dev/null @@ -1,182 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "io" - "net" - "time" -) - -const defaultBufSize = 4096 -const maxCachedBufSize = 256 * 1024 - -// A buffer which is used for both reading and writing. -// This is possible since communication on each connection is synchronous. -// In other words, we can't write and read simultaneously on the same connection. -// The buffer is similar to bufio.Reader / Writer but zero-copy-ish -// Also highly optimized for this particular use case. -// This buffer is backed by two byte slices in a double-buffering scheme -type buffer struct { - buf []byte // buf is a byte buffer who's length and capacity are equal. - nc net.Conn - idx int - length int - timeout time.Duration - dbuf [2][]byte // dbuf is an array with the two byte slices that back this buffer - flipcnt uint // flipccnt is the current buffer counter for double-buffering -} - -// newBuffer allocates and returns a new buffer. -func newBuffer(nc net.Conn) buffer { - fg := make([]byte, defaultBufSize) - return buffer{ - buf: fg, - nc: nc, - dbuf: [2][]byte{fg, nil}, - } -} - -// flip replaces the active buffer with the background buffer -// this is a delayed flip that simply increases the buffer counter; -// the actual flip will be performed the next time we call `buffer.fill` -func (b *buffer) flip() { - b.flipcnt += 1 -} - -// fill reads into the buffer until at least _need_ bytes are in it -func (b *buffer) fill(need int) error { - n := b.length - // fill data into its double-buffering target: if we've called - // flip on this buffer, we'll be copying to the background buffer, - // and then filling it with network data; otherwise we'll just move - // the contents of the current buffer to the front before filling it - dest := b.dbuf[b.flipcnt&1] - - // grow buffer if necessary to fit the whole packet. - if need > len(dest) { - // Round up to the next multiple of the default size - dest = make([]byte, ((need/defaultBufSize)+1)*defaultBufSize) - - // if the allocated buffer is not too large, move it to backing storage - // to prevent extra allocations on applications that perform large reads - if len(dest) <= maxCachedBufSize { - b.dbuf[b.flipcnt&1] = dest - } - } - - // if we're filling the fg buffer, move the existing data to the start of it. - // if we're filling the bg buffer, copy over the data - if n > 0 { - copy(dest[:n], b.buf[b.idx:]) - } - - b.buf = dest - b.idx = 0 - - for { - if b.timeout > 0 { - if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil { - return err - } - } - - nn, err := b.nc.Read(b.buf[n:]) - n += nn - - switch err { - case nil: - if n < need { - continue - } - b.length = n - return nil - - case io.EOF: - if n >= need { - b.length = n - return nil - } - return io.ErrUnexpectedEOF - - default: - return err - } - } -} - -// returns next N bytes from buffer. -// The returned slice is only guaranteed to be valid until the next read -func (b *buffer) readNext(need int) ([]byte, error) { - if b.length < need { - // refill - if err := b.fill(need); err != nil { - return nil, err - } - } - - offset := b.idx - b.idx += need - b.length -= need - return b.buf[offset:b.idx], nil -} - -// takeBuffer returns a buffer with the requested size. -// If possible, a slice from the existing buffer is returned. -// Otherwise a bigger buffer is made. -// Only one buffer (total) can be used at a time. -func (b *buffer) takeBuffer(length int) ([]byte, error) { - if b.length > 0 { - return nil, ErrBusyBuffer - } - - // test (cheap) general case first - if length <= cap(b.buf) { - return b.buf[:length], nil - } - - if length < maxPacketSize { - b.buf = make([]byte, length) - return b.buf, nil - } - - // buffer is larger than we want to store. - return make([]byte, length), nil -} - -// takeSmallBuffer is shortcut which can be used if length is -// known to be smaller than defaultBufSize. -// Only one buffer (total) can be used at a time. -func (b *buffer) takeSmallBuffer(length int) ([]byte, error) { - if b.length > 0 { - return nil, ErrBusyBuffer - } - return b.buf[:length], nil -} - -// takeCompleteBuffer returns the complete existing buffer. -// This can be used if the necessary buffer size is unknown. -// cap and len of the returned buffer will be equal. -// Only one buffer (total) can be used at a time. -func (b *buffer) takeCompleteBuffer() ([]byte, error) { - if b.length > 0 { - return nil, ErrBusyBuffer - } - return b.buf, nil -} - -// store stores buf, an updated buffer, if its suitable to do so. -func (b *buffer) store(buf []byte) error { - if b.length > 0 { - return ErrBusyBuffer - } else if cap(buf) <= maxPacketSize && cap(buf) > cap(b.buf) { - b.buf = buf[:cap(buf)] - } - return nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/collations.go b/vendor/github.com/go-sql-driver/mysql/collations.go deleted file mode 100644 index 8d2b556..0000000 --- a/vendor/github.com/go-sql-driver/mysql/collations.go +++ /dev/null @@ -1,265 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2014 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -const defaultCollation = "utf8mb4_general_ci" -const binaryCollation = "binary" - -// A list of available collations mapped to the internal ID. -// To update this map use the following MySQL query: -// SELECT COLLATION_NAME, ID FROM information_schema.COLLATIONS WHERE ID<256 ORDER BY ID -// -// Handshake packet have only 1 byte for collation_id. So we can't use collations with ID > 255. -// -// ucs2, utf16, and utf32 can't be used for connection charset. -// https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html#charset-connection-impermissible-client-charset -// They are commented out to reduce this map. -var collations = map[string]byte{ - "big5_chinese_ci": 1, - "latin2_czech_cs": 2, - "dec8_swedish_ci": 3, - "cp850_general_ci": 4, - "latin1_german1_ci": 5, - "hp8_english_ci": 6, - "koi8r_general_ci": 7, - "latin1_swedish_ci": 8, - "latin2_general_ci": 9, - "swe7_swedish_ci": 10, - "ascii_general_ci": 11, - "ujis_japanese_ci": 12, - "sjis_japanese_ci": 13, - "cp1251_bulgarian_ci": 14, - "latin1_danish_ci": 15, - "hebrew_general_ci": 16, - "tis620_thai_ci": 18, - "euckr_korean_ci": 19, - "latin7_estonian_cs": 20, - "latin2_hungarian_ci": 21, - "koi8u_general_ci": 22, - "cp1251_ukrainian_ci": 23, - "gb2312_chinese_ci": 24, - "greek_general_ci": 25, - "cp1250_general_ci": 26, - "latin2_croatian_ci": 27, - "gbk_chinese_ci": 28, - "cp1257_lithuanian_ci": 29, - "latin5_turkish_ci": 30, - "latin1_german2_ci": 31, - "armscii8_general_ci": 32, - "utf8_general_ci": 33, - "cp1250_czech_cs": 34, - //"ucs2_general_ci": 35, - "cp866_general_ci": 36, - "keybcs2_general_ci": 37, - "macce_general_ci": 38, - "macroman_general_ci": 39, - "cp852_general_ci": 40, - "latin7_general_ci": 41, - "latin7_general_cs": 42, - "macce_bin": 43, - "cp1250_croatian_ci": 44, - "utf8mb4_general_ci": 45, - "utf8mb4_bin": 46, - "latin1_bin": 47, - "latin1_general_ci": 48, - "latin1_general_cs": 49, - "cp1251_bin": 50, - "cp1251_general_ci": 51, - "cp1251_general_cs": 52, - "macroman_bin": 53, - //"utf16_general_ci": 54, - //"utf16_bin": 55, - //"utf16le_general_ci": 56, - "cp1256_general_ci": 57, - "cp1257_bin": 58, - "cp1257_general_ci": 59, - //"utf32_general_ci": 60, - //"utf32_bin": 61, - //"utf16le_bin": 62, - "binary": 63, - "armscii8_bin": 64, - "ascii_bin": 65, - "cp1250_bin": 66, - "cp1256_bin": 67, - "cp866_bin": 68, - "dec8_bin": 69, - "greek_bin": 70, - "hebrew_bin": 71, - "hp8_bin": 72, - "keybcs2_bin": 73, - "koi8r_bin": 74, - "koi8u_bin": 75, - "utf8_tolower_ci": 76, - "latin2_bin": 77, - "latin5_bin": 78, - "latin7_bin": 79, - "cp850_bin": 80, - "cp852_bin": 81, - "swe7_bin": 82, - "utf8_bin": 83, - "big5_bin": 84, - "euckr_bin": 85, - "gb2312_bin": 86, - "gbk_bin": 87, - "sjis_bin": 88, - "tis620_bin": 89, - //"ucs2_bin": 90, - "ujis_bin": 91, - "geostd8_general_ci": 92, - "geostd8_bin": 93, - "latin1_spanish_ci": 94, - "cp932_japanese_ci": 95, - "cp932_bin": 96, - "eucjpms_japanese_ci": 97, - "eucjpms_bin": 98, - "cp1250_polish_ci": 99, - //"utf16_unicode_ci": 101, - //"utf16_icelandic_ci": 102, - //"utf16_latvian_ci": 103, - //"utf16_romanian_ci": 104, - //"utf16_slovenian_ci": 105, - //"utf16_polish_ci": 106, - //"utf16_estonian_ci": 107, - //"utf16_spanish_ci": 108, - //"utf16_swedish_ci": 109, - //"utf16_turkish_ci": 110, - //"utf16_czech_ci": 111, - //"utf16_danish_ci": 112, - //"utf16_lithuanian_ci": 113, - //"utf16_slovak_ci": 114, - //"utf16_spanish2_ci": 115, - //"utf16_roman_ci": 116, - //"utf16_persian_ci": 117, - //"utf16_esperanto_ci": 118, - //"utf16_hungarian_ci": 119, - //"utf16_sinhala_ci": 120, - //"utf16_german2_ci": 121, - //"utf16_croatian_ci": 122, - //"utf16_unicode_520_ci": 123, - //"utf16_vietnamese_ci": 124, - //"ucs2_unicode_ci": 128, - //"ucs2_icelandic_ci": 129, - //"ucs2_latvian_ci": 130, - //"ucs2_romanian_ci": 131, - //"ucs2_slovenian_ci": 132, - //"ucs2_polish_ci": 133, - //"ucs2_estonian_ci": 134, - //"ucs2_spanish_ci": 135, - //"ucs2_swedish_ci": 136, - //"ucs2_turkish_ci": 137, - //"ucs2_czech_ci": 138, - //"ucs2_danish_ci": 139, - //"ucs2_lithuanian_ci": 140, - //"ucs2_slovak_ci": 141, - //"ucs2_spanish2_ci": 142, - //"ucs2_roman_ci": 143, - //"ucs2_persian_ci": 144, - //"ucs2_esperanto_ci": 145, - //"ucs2_hungarian_ci": 146, - //"ucs2_sinhala_ci": 147, - //"ucs2_german2_ci": 148, - //"ucs2_croatian_ci": 149, - //"ucs2_unicode_520_ci": 150, - //"ucs2_vietnamese_ci": 151, - //"ucs2_general_mysql500_ci": 159, - //"utf32_unicode_ci": 160, - //"utf32_icelandic_ci": 161, - //"utf32_latvian_ci": 162, - //"utf32_romanian_ci": 163, - //"utf32_slovenian_ci": 164, - //"utf32_polish_ci": 165, - //"utf32_estonian_ci": 166, - //"utf32_spanish_ci": 167, - //"utf32_swedish_ci": 168, - //"utf32_turkish_ci": 169, - //"utf32_czech_ci": 170, - //"utf32_danish_ci": 171, - //"utf32_lithuanian_ci": 172, - //"utf32_slovak_ci": 173, - //"utf32_spanish2_ci": 174, - //"utf32_roman_ci": 175, - //"utf32_persian_ci": 176, - //"utf32_esperanto_ci": 177, - //"utf32_hungarian_ci": 178, - //"utf32_sinhala_ci": 179, - //"utf32_german2_ci": 180, - //"utf32_croatian_ci": 181, - //"utf32_unicode_520_ci": 182, - //"utf32_vietnamese_ci": 183, - "utf8_unicode_ci": 192, - "utf8_icelandic_ci": 193, - "utf8_latvian_ci": 194, - "utf8_romanian_ci": 195, - "utf8_slovenian_ci": 196, - "utf8_polish_ci": 197, - "utf8_estonian_ci": 198, - "utf8_spanish_ci": 199, - "utf8_swedish_ci": 200, - "utf8_turkish_ci": 201, - "utf8_czech_ci": 202, - "utf8_danish_ci": 203, - "utf8_lithuanian_ci": 204, - "utf8_slovak_ci": 205, - "utf8_spanish2_ci": 206, - "utf8_roman_ci": 207, - "utf8_persian_ci": 208, - "utf8_esperanto_ci": 209, - "utf8_hungarian_ci": 210, - "utf8_sinhala_ci": 211, - "utf8_german2_ci": 212, - "utf8_croatian_ci": 213, - "utf8_unicode_520_ci": 214, - "utf8_vietnamese_ci": 215, - "utf8_general_mysql500_ci": 223, - "utf8mb4_unicode_ci": 224, - "utf8mb4_icelandic_ci": 225, - "utf8mb4_latvian_ci": 226, - "utf8mb4_romanian_ci": 227, - "utf8mb4_slovenian_ci": 228, - "utf8mb4_polish_ci": 229, - "utf8mb4_estonian_ci": 230, - "utf8mb4_spanish_ci": 231, - "utf8mb4_swedish_ci": 232, - "utf8mb4_turkish_ci": 233, - "utf8mb4_czech_ci": 234, - "utf8mb4_danish_ci": 235, - "utf8mb4_lithuanian_ci": 236, - "utf8mb4_slovak_ci": 237, - "utf8mb4_spanish2_ci": 238, - "utf8mb4_roman_ci": 239, - "utf8mb4_persian_ci": 240, - "utf8mb4_esperanto_ci": 241, - "utf8mb4_hungarian_ci": 242, - "utf8mb4_sinhala_ci": 243, - "utf8mb4_german2_ci": 244, - "utf8mb4_croatian_ci": 245, - "utf8mb4_unicode_520_ci": 246, - "utf8mb4_vietnamese_ci": 247, - "gb18030_chinese_ci": 248, - "gb18030_bin": 249, - "gb18030_unicode_520_ci": 250, - "utf8mb4_0900_ai_ci": 255, -} - -// A blacklist of collations which is unsafe to interpolate parameters. -// These multibyte encodings may contains 0x5c (`\`) in their trailing bytes. -var unsafeCollations = map[string]bool{ - "big5_chinese_ci": true, - "sjis_japanese_ci": true, - "gbk_chinese_ci": true, - "big5_bin": true, - "gb2312_bin": true, - "gbk_bin": true, - "sjis_bin": true, - "cp932_japanese_ci": true, - "cp932_bin": true, - "gb18030_chinese_ci": true, - "gb18030_bin": true, - "gb18030_unicode_520_ci": true, -} diff --git a/vendor/github.com/go-sql-driver/mysql/conncheck.go b/vendor/github.com/go-sql-driver/mysql/conncheck.go deleted file mode 100644 index 024eb28..0000000 --- a/vendor/github.com/go-sql-driver/mysql/conncheck.go +++ /dev/null @@ -1,54 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2019 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -// +build linux darwin dragonfly freebsd netbsd openbsd solaris illumos - -package mysql - -import ( - "errors" - "io" - "net" - "syscall" -) - -var errUnexpectedRead = errors.New("unexpected read from socket") - -func connCheck(conn net.Conn) error { - var sysErr error - - sysConn, ok := conn.(syscall.Conn) - if !ok { - return nil - } - rawConn, err := sysConn.SyscallConn() - if err != nil { - return err - } - - err = rawConn.Read(func(fd uintptr) bool { - var buf [1]byte - n, err := syscall.Read(int(fd), buf[:]) - switch { - case n == 0 && err == nil: - sysErr = io.EOF - case n > 0: - sysErr = errUnexpectedRead - case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK: - sysErr = nil - default: - sysErr = err - } - return true - }) - if err != nil { - return err - } - - return sysErr -} diff --git a/vendor/github.com/go-sql-driver/mysql/conncheck_dummy.go b/vendor/github.com/go-sql-driver/mysql/conncheck_dummy.go deleted file mode 100644 index ea7fb60..0000000 --- a/vendor/github.com/go-sql-driver/mysql/conncheck_dummy.go +++ /dev/null @@ -1,17 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2019 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -// +build !linux,!darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!illumos - -package mysql - -import "net" - -func connCheck(conn net.Conn) error { - return nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go deleted file mode 100644 index e4bb59e..0000000 --- a/vendor/github.com/go-sql-driver/mysql/connection.go +++ /dev/null @@ -1,651 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "context" - "database/sql" - "database/sql/driver" - "io" - "net" - "strconv" - "strings" - "time" -) - -type mysqlConn struct { - buf buffer - netConn net.Conn - rawConn net.Conn // underlying connection when netConn is TLS connection. - affectedRows uint64 - insertId uint64 - cfg *Config - maxAllowedPacket int - maxWriteSize int - writeTimeout time.Duration - flags clientFlag - status statusFlag - sequence uint8 - parseTime bool - reset bool // set when the Go SQL package calls ResetSession - - // for context support (Go 1.8+) - watching bool - watcher chan<- context.Context - closech chan struct{} - finished chan<- struct{} - canceled atomicError // set non-nil if conn is canceled - closed atomicBool // set when conn is closed, before closech is closed -} - -// Handles parameters set in DSN after the connection is established -func (mc *mysqlConn) handleParams() (err error) { - for param, val := range mc.cfg.Params { - switch param { - // Charset - case "charset": - charsets := strings.Split(val, ",") - for i := range charsets { - // ignore errors here - a charset may not exist - err = mc.exec("SET NAMES " + charsets[i]) - if err == nil { - break - } - } - if err != nil { - return - } - - // System Vars - default: - err = mc.exec("SET " + param + "=" + val + "") - if err != nil { - return - } - } - } - - return -} - -func (mc *mysqlConn) markBadConn(err error) error { - if mc == nil { - return err - } - if err != errBadConnNoWrite { - return err - } - return driver.ErrBadConn -} - -func (mc *mysqlConn) Begin() (driver.Tx, error) { - return mc.begin(false) -} - -func (mc *mysqlConn) begin(readOnly bool) (driver.Tx, error) { - if mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - var q string - if readOnly { - q = "START TRANSACTION READ ONLY" - } else { - q = "START TRANSACTION" - } - err := mc.exec(q) - if err == nil { - return &mysqlTx{mc}, err - } - return nil, mc.markBadConn(err) -} - -func (mc *mysqlConn) Close() (err error) { - // Makes Close idempotent - if !mc.closed.IsSet() { - err = mc.writeCommandPacket(comQuit) - } - - mc.cleanup() - - return -} - -// Closes the network connection and unsets internal variables. Do not call this -// function after successfully authentication, call Close instead. This function -// is called before auth or on auth failure because MySQL will have already -// closed the network connection. -func (mc *mysqlConn) cleanup() { - if !mc.closed.TrySet(true) { - return - } - - // Makes cleanup idempotent - close(mc.closech) - if mc.netConn == nil { - return - } - if err := mc.netConn.Close(); err != nil { - errLog.Print(err) - } -} - -func (mc *mysqlConn) error() error { - if mc.closed.IsSet() { - if err := mc.canceled.Value(); err != nil { - return err - } - return ErrInvalidConn - } - return nil -} - -func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) { - if mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - // Send command - err := mc.writeCommandPacketStr(comStmtPrepare, query) - if err != nil { - // STMT_PREPARE is safe to retry. So we can return ErrBadConn here. - errLog.Print(err) - return nil, driver.ErrBadConn - } - - stmt := &mysqlStmt{ - mc: mc, - } - - // Read Result - columnCount, err := stmt.readPrepareResultPacket() - if err == nil { - if stmt.paramCount > 0 { - if err = mc.readUntilEOF(); err != nil { - return nil, err - } - } - - if columnCount > 0 { - err = mc.readUntilEOF() - } - } - - return stmt, err -} - -func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (string, error) { - // Number of ? should be same to len(args) - if strings.Count(query, "?") != len(args) { - return "", driver.ErrSkip - } - - buf, err := mc.buf.takeCompleteBuffer() - if err != nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(err) - return "", ErrInvalidConn - } - buf = buf[:0] - argPos := 0 - - for i := 0; i < len(query); i++ { - q := strings.IndexByte(query[i:], '?') - if q == -1 { - buf = append(buf, query[i:]...) - break - } - buf = append(buf, query[i:i+q]...) - i += q - - arg := args[argPos] - argPos++ - - if arg == nil { - buf = append(buf, "NULL"...) - continue - } - - switch v := arg.(type) { - case int64: - buf = strconv.AppendInt(buf, v, 10) - case uint64: - // Handle uint64 explicitly because our custom ConvertValue emits unsigned values - buf = strconv.AppendUint(buf, v, 10) - case float64: - buf = strconv.AppendFloat(buf, v, 'g', -1, 64) - case bool: - if v { - buf = append(buf, '1') - } else { - buf = append(buf, '0') - } - case time.Time: - if v.IsZero() { - buf = append(buf, "'0000-00-00'"...) - } else { - v := v.In(mc.cfg.Loc) - v = v.Add(time.Nanosecond * 500) // To round under microsecond - year := v.Year() - year100 := year / 100 - year1 := year % 100 - month := v.Month() - day := v.Day() - hour := v.Hour() - minute := v.Minute() - second := v.Second() - micro := v.Nanosecond() / 1000 - - buf = append(buf, []byte{ - '\'', - digits10[year100], digits01[year100], - digits10[year1], digits01[year1], - '-', - digits10[month], digits01[month], - '-', - digits10[day], digits01[day], - ' ', - digits10[hour], digits01[hour], - ':', - digits10[minute], digits01[minute], - ':', - digits10[second], digits01[second], - }...) - - if micro != 0 { - micro10000 := micro / 10000 - micro100 := micro / 100 % 100 - micro1 := micro % 100 - buf = append(buf, []byte{ - '.', - digits10[micro10000], digits01[micro10000], - digits10[micro100], digits01[micro100], - digits10[micro1], digits01[micro1], - }...) - } - buf = append(buf, '\'') - } - case []byte: - if v == nil { - buf = append(buf, "NULL"...) - } else { - buf = append(buf, "_binary'"...) - if mc.status&statusNoBackslashEscapes == 0 { - buf = escapeBytesBackslash(buf, v) - } else { - buf = escapeBytesQuotes(buf, v) - } - buf = append(buf, '\'') - } - case string: - buf = append(buf, '\'') - if mc.status&statusNoBackslashEscapes == 0 { - buf = escapeStringBackslash(buf, v) - } else { - buf = escapeStringQuotes(buf, v) - } - buf = append(buf, '\'') - default: - return "", driver.ErrSkip - } - - if len(buf)+4 > mc.maxAllowedPacket { - return "", driver.ErrSkip - } - } - if argPos != len(args) { - return "", driver.ErrSkip - } - return string(buf), nil -} - -func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) { - if mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - if len(args) != 0 { - if !mc.cfg.InterpolateParams { - return nil, driver.ErrSkip - } - // try to interpolate the parameters to save extra roundtrips for preparing and closing a statement - prepared, err := mc.interpolateParams(query, args) - if err != nil { - return nil, err - } - query = prepared - } - mc.affectedRows = 0 - mc.insertId = 0 - - err := mc.exec(query) - if err == nil { - return &mysqlResult{ - affectedRows: int64(mc.affectedRows), - insertId: int64(mc.insertId), - }, err - } - return nil, mc.markBadConn(err) -} - -// Internal function to execute commands -func (mc *mysqlConn) exec(query string) error { - // Send command - if err := mc.writeCommandPacketStr(comQuery, query); err != nil { - return mc.markBadConn(err) - } - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err != nil { - return err - } - - if resLen > 0 { - // columns - if err := mc.readUntilEOF(); err != nil { - return err - } - - // rows - if err := mc.readUntilEOF(); err != nil { - return err - } - } - - return mc.discardResults() -} - -func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, error) { - return mc.query(query, args) -} - -func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) { - if mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - if len(args) != 0 { - if !mc.cfg.InterpolateParams { - return nil, driver.ErrSkip - } - // try client-side prepare to reduce roundtrip - prepared, err := mc.interpolateParams(query, args) - if err != nil { - return nil, err - } - query = prepared - } - // Send command - err := mc.writeCommandPacketStr(comQuery, query) - if err == nil { - // Read Result - var resLen int - resLen, err = mc.readResultSetHeaderPacket() - if err == nil { - rows := new(textRows) - rows.mc = mc - - if resLen == 0 { - rows.rs.done = true - - switch err := rows.NextResultSet(); err { - case nil, io.EOF: - return rows, nil - default: - return nil, err - } - } - - // Columns - rows.rs.columns, err = mc.readColumns(resLen) - return rows, err - } - } - return nil, mc.markBadConn(err) -} - -// Gets the value of the given MySQL System Variable -// The returned byte slice is only valid until the next read -func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { - // Send command - if err := mc.writeCommandPacketStr(comQuery, "SELECT @@"+name); err != nil { - return nil, err - } - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err == nil { - rows := new(textRows) - rows.mc = mc - rows.rs.columns = []mysqlField{{fieldType: fieldTypeVarChar}} - - if resLen > 0 { - // Columns - if err := mc.readUntilEOF(); err != nil { - return nil, err - } - } - - dest := make([]driver.Value, resLen) - if err = rows.readRow(dest); err == nil { - return dest[0].([]byte), mc.readUntilEOF() - } - } - return nil, err -} - -// finish is called when the query has canceled. -func (mc *mysqlConn) cancel(err error) { - mc.canceled.Set(err) - mc.cleanup() -} - -// finish is called when the query has succeeded. -func (mc *mysqlConn) finish() { - if !mc.watching || mc.finished == nil { - return - } - select { - case mc.finished <- struct{}{}: - mc.watching = false - case <-mc.closech: - } -} - -// Ping implements driver.Pinger interface -func (mc *mysqlConn) Ping(ctx context.Context) (err error) { - if mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return driver.ErrBadConn - } - - if err = mc.watchCancel(ctx); err != nil { - return - } - defer mc.finish() - - if err = mc.writeCommandPacket(comPing); err != nil { - return mc.markBadConn(err) - } - - return mc.readResultOK() -} - -// BeginTx implements driver.ConnBeginTx interface -func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - defer mc.finish() - - if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { - level, err := mapIsolationLevel(opts.Isolation) - if err != nil { - return nil, err - } - err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) - if err != nil { - return nil, err - } - } - - return mc.begin(opts.ReadOnly) -} - -func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - - rows, err := mc.query(query, dargs) - if err != nil { - mc.finish() - return nil, err - } - rows.finish = mc.finish - return rows, err -} - -func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - defer mc.finish() - - return mc.Exec(query, dargs) -} - -func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { - if err := mc.watchCancel(ctx); err != nil { - return nil, err - } - - stmt, err := mc.Prepare(query) - mc.finish() - if err != nil { - return nil, err - } - - select { - default: - case <-ctx.Done(): - stmt.Close() - return nil, ctx.Err() - } - return stmt, nil -} - -func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := stmt.mc.watchCancel(ctx); err != nil { - return nil, err - } - - rows, err := stmt.query(dargs) - if err != nil { - stmt.mc.finish() - return nil, err - } - rows.finish = stmt.mc.finish - return rows, err -} - -func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { - dargs, err := namedValueToValue(args) - if err != nil { - return nil, err - } - - if err := stmt.mc.watchCancel(ctx); err != nil { - return nil, err - } - defer stmt.mc.finish() - - return stmt.Exec(dargs) -} - -func (mc *mysqlConn) watchCancel(ctx context.Context) error { - if mc.watching { - // Reach here if canceled, - // so the connection is already invalid - mc.cleanup() - return nil - } - // When ctx is already cancelled, don't watch it. - if err := ctx.Err(); err != nil { - return err - } - // When ctx is not cancellable, don't watch it. - if ctx.Done() == nil { - return nil - } - // When watcher is not alive, can't watch it. - if mc.watcher == nil { - return nil - } - - mc.watching = true - mc.watcher <- ctx - return nil -} - -func (mc *mysqlConn) startWatcher() { - watcher := make(chan context.Context, 1) - mc.watcher = watcher - finished := make(chan struct{}) - mc.finished = finished - go func() { - for { - var ctx context.Context - select { - case ctx = <-watcher: - case <-mc.closech: - return - } - - select { - case <-ctx.Done(): - mc.cancel(ctx.Err()) - case <-finished: - case <-mc.closech: - return - } - } - }() -} - -func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { - nv.Value, err = converter{}.ConvertValue(nv.Value) - return -} - -// ResetSession implements driver.SessionResetter. -// (From Go 1.10) -func (mc *mysqlConn) ResetSession(ctx context.Context) error { - if mc.closed.IsSet() { - return driver.ErrBadConn - } - mc.reset = true - return nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/connector.go b/vendor/github.com/go-sql-driver/mysql/connector.go deleted file mode 100644 index d567b4e..0000000 --- a/vendor/github.com/go-sql-driver/mysql/connector.go +++ /dev/null @@ -1,146 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2018 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "context" - "database/sql/driver" - "net" -) - -type connector struct { - cfg *Config // immutable private copy. -} - -// Connect implements driver.Connector interface. -// Connect returns a connection to the database. -func (c *connector) Connect(ctx context.Context) (driver.Conn, error) { - var err error - - // New mysqlConn - mc := &mysqlConn{ - maxAllowedPacket: maxPacketSize, - maxWriteSize: maxPacketSize - 1, - closech: make(chan struct{}), - cfg: c.cfg, - } - mc.parseTime = mc.cfg.ParseTime - - // Connect to Server - dialsLock.RLock() - dial, ok := dials[mc.cfg.Net] - dialsLock.RUnlock() - if ok { - dctx := ctx - if mc.cfg.Timeout > 0 { - var cancel context.CancelFunc - dctx, cancel = context.WithTimeout(ctx, c.cfg.Timeout) - defer cancel() - } - mc.netConn, err = dial(dctx, mc.cfg.Addr) - } else { - nd := net.Dialer{Timeout: mc.cfg.Timeout} - mc.netConn, err = nd.DialContext(ctx, mc.cfg.Net, mc.cfg.Addr) - } - - if err != nil { - return nil, err - } - - // Enable TCP Keepalives on TCP connections - if tc, ok := mc.netConn.(*net.TCPConn); ok { - if err := tc.SetKeepAlive(true); err != nil { - // Don't send COM_QUIT before handshake. - mc.netConn.Close() - mc.netConn = nil - return nil, err - } - } - - // Call startWatcher for context support (From Go 1.8) - mc.startWatcher() - if err := mc.watchCancel(ctx); err != nil { - mc.cleanup() - return nil, err - } - defer mc.finish() - - mc.buf = newBuffer(mc.netConn) - - // Set I/O timeouts - mc.buf.timeout = mc.cfg.ReadTimeout - mc.writeTimeout = mc.cfg.WriteTimeout - - // Reading Handshake Initialization Packet - authData, plugin, err := mc.readHandshakePacket() - if err != nil { - mc.cleanup() - return nil, err - } - - if plugin == "" { - plugin = defaultAuthPlugin - } - - // Send Client Authentication Packet - authResp, err := mc.auth(authData, plugin) - if err != nil { - // try the default auth plugin, if using the requested plugin failed - errLog.Print("could not use requested auth plugin '"+plugin+"': ", err.Error()) - plugin = defaultAuthPlugin - authResp, err = mc.auth(authData, plugin) - if err != nil { - mc.cleanup() - return nil, err - } - } - if err = mc.writeHandshakeResponsePacket(authResp, plugin); err != nil { - mc.cleanup() - return nil, err - } - - // Handle response to auth packet, switch methods if possible - if err = mc.handleAuthResult(authData, plugin); err != nil { - // Authentication failed and MySQL has already closed the connection - // (https://dev.mysql.com/doc/internals/en/authentication-fails.html). - // Do not send COM_QUIT, just cleanup and return the error. - mc.cleanup() - return nil, err - } - - if mc.cfg.MaxAllowedPacket > 0 { - mc.maxAllowedPacket = mc.cfg.MaxAllowedPacket - } else { - // Get max allowed packet size - maxap, err := mc.getSystemVar("max_allowed_packet") - if err != nil { - mc.Close() - return nil, err - } - mc.maxAllowedPacket = stringToInt(maxap) - 1 - } - if mc.maxAllowedPacket < maxPacketSize { - mc.maxWriteSize = mc.maxAllowedPacket - } - - // Handle DSN Params - err = mc.handleParams() - if err != nil { - mc.Close() - return nil, err - } - - return mc, nil -} - -// Driver implements driver.Connector interface. -// Driver returns &MySQLDriver{}. -func (c *connector) Driver() driver.Driver { - return &MySQLDriver{} -} diff --git a/vendor/github.com/go-sql-driver/mysql/const.go b/vendor/github.com/go-sql-driver/mysql/const.go deleted file mode 100644 index b1e6b85..0000000 --- a/vendor/github.com/go-sql-driver/mysql/const.go +++ /dev/null @@ -1,174 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -const ( - defaultAuthPlugin = "mysql_native_password" - defaultMaxAllowedPacket = 4 << 20 // 4 MiB - minProtocolVersion = 10 - maxPacketSize = 1<<24 - 1 - timeFormat = "2006-01-02 15:04:05.999999" -) - -// MySQL constants documentation: -// http://dev.mysql.com/doc/internals/en/client-server-protocol.html - -const ( - iOK byte = 0x00 - iAuthMoreData byte = 0x01 - iLocalInFile byte = 0xfb - iEOF byte = 0xfe - iERR byte = 0xff -) - -// https://dev.mysql.com/doc/internals/en/capability-flags.html#packet-Protocol::CapabilityFlags -type clientFlag uint32 - -const ( - clientLongPassword clientFlag = 1 << iota - clientFoundRows - clientLongFlag - clientConnectWithDB - clientNoSchema - clientCompress - clientODBC - clientLocalFiles - clientIgnoreSpace - clientProtocol41 - clientInteractive - clientSSL - clientIgnoreSIGPIPE - clientTransactions - clientReserved - clientSecureConn - clientMultiStatements - clientMultiResults - clientPSMultiResults - clientPluginAuth - clientConnectAttrs - clientPluginAuthLenEncClientData - clientCanHandleExpiredPasswords - clientSessionTrack - clientDeprecateEOF -) - -const ( - comQuit byte = iota + 1 - comInitDB - comQuery - comFieldList - comCreateDB - comDropDB - comRefresh - comShutdown - comStatistics - comProcessInfo - comConnect - comProcessKill - comDebug - comPing - comTime - comDelayedInsert - comChangeUser - comBinlogDump - comTableDump - comConnectOut - comRegisterSlave - comStmtPrepare - comStmtExecute - comStmtSendLongData - comStmtClose - comStmtReset - comSetOption - comStmtFetch -) - -// https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnType -type fieldType byte - -const ( - fieldTypeDecimal fieldType = iota - fieldTypeTiny - fieldTypeShort - fieldTypeLong - fieldTypeFloat - fieldTypeDouble - fieldTypeNULL - fieldTypeTimestamp - fieldTypeLongLong - fieldTypeInt24 - fieldTypeDate - fieldTypeTime - fieldTypeDateTime - fieldTypeYear - fieldTypeNewDate - fieldTypeVarChar - fieldTypeBit -) -const ( - fieldTypeJSON fieldType = iota + 0xf5 - fieldTypeNewDecimal - fieldTypeEnum - fieldTypeSet - fieldTypeTinyBLOB - fieldTypeMediumBLOB - fieldTypeLongBLOB - fieldTypeBLOB - fieldTypeVarString - fieldTypeString - fieldTypeGeometry -) - -type fieldFlag uint16 - -const ( - flagNotNULL fieldFlag = 1 << iota - flagPriKey - flagUniqueKey - flagMultipleKey - flagBLOB - flagUnsigned - flagZeroFill - flagBinary - flagEnum - flagAutoIncrement - flagTimestamp - flagSet - flagUnknown1 - flagUnknown2 - flagUnknown3 - flagUnknown4 -) - -// http://dev.mysql.com/doc/internals/en/status-flags.html -type statusFlag uint16 - -const ( - statusInTrans statusFlag = 1 << iota - statusInAutocommit - statusReserved // Not in documentation - statusMoreResultsExists - statusNoGoodIndexUsed - statusNoIndexUsed - statusCursorExists - statusLastRowSent - statusDbDropped - statusNoBackslashEscapes - statusMetadataChanged - statusQueryWasSlow - statusPsOutParams - statusInTransReadonly - statusSessionStateChanged -) - -const ( - cachingSha2PasswordRequestPublicKey = 2 - cachingSha2PasswordFastAuthSuccess = 3 - cachingSha2PasswordPerformFullAuthentication = 4 -) diff --git a/vendor/github.com/go-sql-driver/mysql/driver.go b/vendor/github.com/go-sql-driver/mysql/driver.go deleted file mode 100644 index c1bdf11..0000000 --- a/vendor/github.com/go-sql-driver/mysql/driver.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -// Package mysql provides a MySQL driver for Go's database/sql package. -// -// The driver should be used via the database/sql package: -// -// import "database/sql" -// import _ "github.com/go-sql-driver/mysql" -// -// db, err := sql.Open("mysql", "user:password@/dbname") -// -// See https://github.com/go-sql-driver/mysql#usage for details -package mysql - -import ( - "context" - "database/sql" - "database/sql/driver" - "net" - "sync" -) - -// MySQLDriver is exported to make the driver directly accessible. -// In general the driver is used via the database/sql package. -type MySQLDriver struct{} - -// DialFunc is a function which can be used to establish the network connection. -// Custom dial functions must be registered with RegisterDial -// -// Deprecated: users should register a DialContextFunc instead -type DialFunc func(addr string) (net.Conn, error) - -// DialContextFunc is a function which can be used to establish the network connection. -// Custom dial functions must be registered with RegisterDialContext -type DialContextFunc func(ctx context.Context, addr string) (net.Conn, error) - -var ( - dialsLock sync.RWMutex - dials map[string]DialContextFunc -) - -// RegisterDialContext registers a custom dial function. It can then be used by the -// network address mynet(addr), where mynet is the registered new network. -// The current context for the connection and its address is passed to the dial function. -func RegisterDialContext(net string, dial DialContextFunc) { - dialsLock.Lock() - defer dialsLock.Unlock() - if dials == nil { - dials = make(map[string]DialContextFunc) - } - dials[net] = dial -} - -// RegisterDial registers a custom dial function. It can then be used by the -// network address mynet(addr), where mynet is the registered new network. -// addr is passed as a parameter to the dial function. -// -// Deprecated: users should call RegisterDialContext instead -func RegisterDial(network string, dial DialFunc) { - RegisterDialContext(network, func(_ context.Context, addr string) (net.Conn, error) { - return dial(addr) - }) -} - -// Open new Connection. -// See https://github.com/go-sql-driver/mysql#dsn-data-source-name for how -// the DSN string is formatted -func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { - cfg, err := ParseDSN(dsn) - if err != nil { - return nil, err - } - c := &connector{ - cfg: cfg, - } - return c.Connect(context.Background()) -} - -func init() { - sql.Register("mysql", &MySQLDriver{}) -} - -// NewConnector returns new driver.Connector. -func NewConnector(cfg *Config) (driver.Connector, error) { - cfg = cfg.Clone() - // normalize the contents of cfg so calls to NewConnector have the same - // behavior as MySQLDriver.OpenConnector - if err := cfg.normalize(); err != nil { - return nil, err - } - return &connector{cfg: cfg}, nil -} - -// OpenConnector implements driver.DriverContext. -func (d MySQLDriver) OpenConnector(dsn string) (driver.Connector, error) { - cfg, err := ParseDSN(dsn) - if err != nil { - return nil, err - } - return &connector{ - cfg: cfg, - }, nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go deleted file mode 100644 index 75c8c24..0000000 --- a/vendor/github.com/go-sql-driver/mysql/dsn.go +++ /dev/null @@ -1,560 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2016 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "bytes" - "crypto/rsa" - "crypto/tls" - "errors" - "fmt" - "math/big" - "net" - "net/url" - "sort" - "strconv" - "strings" - "time" -) - -var ( - errInvalidDSNUnescaped = errors.New("invalid DSN: did you forget to escape a param value?") - errInvalidDSNAddr = errors.New("invalid DSN: network address not terminated (missing closing brace)") - errInvalidDSNNoSlash = errors.New("invalid DSN: missing the slash separating the database name") - errInvalidDSNUnsafeCollation = errors.New("invalid DSN: interpolateParams can not be used with unsafe collations") -) - -// Config is a configuration parsed from a DSN string. -// If a new Config is created instead of being parsed from a DSN string, -// the NewConfig function should be used, which sets default values. -type Config struct { - User string // Username - Passwd string // Password (requires User) - Net string // Network type - Addr string // Network address (requires Net) - DBName string // Database name - Params map[string]string // Connection parameters - Collation string // Connection collation - Loc *time.Location // Location for time.Time values - MaxAllowedPacket int // Max packet size allowed - ServerPubKey string // Server public key name - pubKey *rsa.PublicKey // Server public key - TLSConfig string // TLS configuration name - tls *tls.Config // TLS configuration - Timeout time.Duration // Dial timeout - ReadTimeout time.Duration // I/O read timeout - WriteTimeout time.Duration // I/O write timeout - - AllowAllFiles bool // Allow all files to be used with LOAD DATA LOCAL INFILE - AllowCleartextPasswords bool // Allows the cleartext client side plugin - AllowNativePasswords bool // Allows the native password authentication method - AllowOldPasswords bool // Allows the old insecure password method - CheckConnLiveness bool // Check connections for liveness before using them - ClientFoundRows bool // Return number of matching rows instead of rows changed - ColumnsWithAlias bool // Prepend table alias to column names - InterpolateParams bool // Interpolate placeholders into query string - MultiStatements bool // Allow multiple statements in one query - ParseTime bool // Parse time values to time.Time - RejectReadOnly bool // Reject read-only connections -} - -// NewConfig creates a new Config and sets default values. -func NewConfig() *Config { - return &Config{ - Collation: defaultCollation, - Loc: time.UTC, - MaxAllowedPacket: defaultMaxAllowedPacket, - AllowNativePasswords: true, - CheckConnLiveness: true, - } -} - -func (cfg *Config) Clone() *Config { - cp := *cfg - if cp.tls != nil { - cp.tls = cfg.tls.Clone() - } - if len(cp.Params) > 0 { - cp.Params = make(map[string]string, len(cfg.Params)) - for k, v := range cfg.Params { - cp.Params[k] = v - } - } - if cfg.pubKey != nil { - cp.pubKey = &rsa.PublicKey{ - N: new(big.Int).Set(cfg.pubKey.N), - E: cfg.pubKey.E, - } - } - return &cp -} - -func (cfg *Config) normalize() error { - if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { - return errInvalidDSNUnsafeCollation - } - - // Set default network if empty - if cfg.Net == "" { - cfg.Net = "tcp" - } - - // Set default address if empty - if cfg.Addr == "" { - switch cfg.Net { - case "tcp": - cfg.Addr = "127.0.0.1:3306" - case "unix": - cfg.Addr = "/tmp/mysql.sock" - default: - return errors.New("default addr for network '" + cfg.Net + "' unknown") - } - } else if cfg.Net == "tcp" { - cfg.Addr = ensureHavePort(cfg.Addr) - } - - switch cfg.TLSConfig { - case "false", "": - // don't set anything - case "true": - cfg.tls = &tls.Config{} - case "skip-verify", "preferred": - cfg.tls = &tls.Config{InsecureSkipVerify: true} - default: - cfg.tls = getTLSConfigClone(cfg.TLSConfig) - if cfg.tls == nil { - return errors.New("invalid value / unknown config name: " + cfg.TLSConfig) - } - } - - if cfg.tls != nil && cfg.tls.ServerName == "" && !cfg.tls.InsecureSkipVerify { - host, _, err := net.SplitHostPort(cfg.Addr) - if err == nil { - cfg.tls.ServerName = host - } - } - - if cfg.ServerPubKey != "" { - cfg.pubKey = getServerPubKey(cfg.ServerPubKey) - if cfg.pubKey == nil { - return errors.New("invalid value / unknown server pub key name: " + cfg.ServerPubKey) - } - } - - return nil -} - -func writeDSNParam(buf *bytes.Buffer, hasParam *bool, name, value string) { - buf.Grow(1 + len(name) + 1 + len(value)) - if !*hasParam { - *hasParam = true - buf.WriteByte('?') - } else { - buf.WriteByte('&') - } - buf.WriteString(name) - buf.WriteByte('=') - buf.WriteString(value) -} - -// FormatDSN formats the given Config into a DSN string which can be passed to -// the driver. -func (cfg *Config) FormatDSN() string { - var buf bytes.Buffer - - // [username[:password]@] - if len(cfg.User) > 0 { - buf.WriteString(cfg.User) - if len(cfg.Passwd) > 0 { - buf.WriteByte(':') - buf.WriteString(cfg.Passwd) - } - buf.WriteByte('@') - } - - // [protocol[(address)]] - if len(cfg.Net) > 0 { - buf.WriteString(cfg.Net) - if len(cfg.Addr) > 0 { - buf.WriteByte('(') - buf.WriteString(cfg.Addr) - buf.WriteByte(')') - } - } - - // /dbname - buf.WriteByte('/') - buf.WriteString(cfg.DBName) - - // [?param1=value1&...¶mN=valueN] - hasParam := false - - if cfg.AllowAllFiles { - hasParam = true - buf.WriteString("?allowAllFiles=true") - } - - if cfg.AllowCleartextPasswords { - writeDSNParam(&buf, &hasParam, "allowCleartextPasswords", "true") - } - - if !cfg.AllowNativePasswords { - writeDSNParam(&buf, &hasParam, "allowNativePasswords", "false") - } - - if cfg.AllowOldPasswords { - writeDSNParam(&buf, &hasParam, "allowOldPasswords", "true") - } - - if !cfg.CheckConnLiveness { - writeDSNParam(&buf, &hasParam, "checkConnLiveness", "false") - } - - if cfg.ClientFoundRows { - writeDSNParam(&buf, &hasParam, "clientFoundRows", "true") - } - - if col := cfg.Collation; col != defaultCollation && len(col) > 0 { - writeDSNParam(&buf, &hasParam, "collation", col) - } - - if cfg.ColumnsWithAlias { - writeDSNParam(&buf, &hasParam, "columnsWithAlias", "true") - } - - if cfg.InterpolateParams { - writeDSNParam(&buf, &hasParam, "interpolateParams", "true") - } - - if cfg.Loc != time.UTC && cfg.Loc != nil { - writeDSNParam(&buf, &hasParam, "loc", url.QueryEscape(cfg.Loc.String())) - } - - if cfg.MultiStatements { - writeDSNParam(&buf, &hasParam, "multiStatements", "true") - } - - if cfg.ParseTime { - writeDSNParam(&buf, &hasParam, "parseTime", "true") - } - - if cfg.ReadTimeout > 0 { - writeDSNParam(&buf, &hasParam, "readTimeout", cfg.ReadTimeout.String()) - } - - if cfg.RejectReadOnly { - writeDSNParam(&buf, &hasParam, "rejectReadOnly", "true") - } - - if len(cfg.ServerPubKey) > 0 { - writeDSNParam(&buf, &hasParam, "serverPubKey", url.QueryEscape(cfg.ServerPubKey)) - } - - if cfg.Timeout > 0 { - writeDSNParam(&buf, &hasParam, "timeout", cfg.Timeout.String()) - } - - if len(cfg.TLSConfig) > 0 { - writeDSNParam(&buf, &hasParam, "tls", url.QueryEscape(cfg.TLSConfig)) - } - - if cfg.WriteTimeout > 0 { - writeDSNParam(&buf, &hasParam, "writeTimeout", cfg.WriteTimeout.String()) - } - - if cfg.MaxAllowedPacket != defaultMaxAllowedPacket { - writeDSNParam(&buf, &hasParam, "maxAllowedPacket", strconv.Itoa(cfg.MaxAllowedPacket)) - } - - // other params - if cfg.Params != nil { - var params []string - for param := range cfg.Params { - params = append(params, param) - } - sort.Strings(params) - for _, param := range params { - writeDSNParam(&buf, &hasParam, param, url.QueryEscape(cfg.Params[param])) - } - } - - return buf.String() -} - -// ParseDSN parses the DSN string to a Config -func ParseDSN(dsn string) (cfg *Config, err error) { - // New config with some default values - cfg = NewConfig() - - // [user[:password]@][net[(addr)]]/dbname[?param1=value1¶mN=valueN] - // Find the last '/' (since the password or the net addr might contain a '/') - foundSlash := false - for i := len(dsn) - 1; i >= 0; i-- { - if dsn[i] == '/' { - foundSlash = true - var j, k int - - // left part is empty if i <= 0 - if i > 0 { - // [username[:password]@][protocol[(address)]] - // Find the last '@' in dsn[:i] - for j = i; j >= 0; j-- { - if dsn[j] == '@' { - // username[:password] - // Find the first ':' in dsn[:j] - for k = 0; k < j; k++ { - if dsn[k] == ':' { - cfg.Passwd = dsn[k+1 : j] - break - } - } - cfg.User = dsn[:k] - - break - } - } - - // [protocol[(address)]] - // Find the first '(' in dsn[j+1:i] - for k = j + 1; k < i; k++ { - if dsn[k] == '(' { - // dsn[i-1] must be == ')' if an address is specified - if dsn[i-1] != ')' { - if strings.ContainsRune(dsn[k+1:i], ')') { - return nil, errInvalidDSNUnescaped - } - return nil, errInvalidDSNAddr - } - cfg.Addr = dsn[k+1 : i-1] - break - } - } - cfg.Net = dsn[j+1 : k] - } - - // dbname[?param1=value1&...¶mN=valueN] - // Find the first '?' in dsn[i+1:] - for j = i + 1; j < len(dsn); j++ { - if dsn[j] == '?' { - if err = parseDSNParams(cfg, dsn[j+1:]); err != nil { - return - } - break - } - } - cfg.DBName = dsn[i+1 : j] - - break - } - } - - if !foundSlash && len(dsn) > 0 { - return nil, errInvalidDSNNoSlash - } - - if err = cfg.normalize(); err != nil { - return nil, err - } - return -} - -// parseDSNParams parses the DSN "query string" -// Values must be url.QueryEscape'ed -func parseDSNParams(cfg *Config, params string) (err error) { - for _, v := range strings.Split(params, "&") { - param := strings.SplitN(v, "=", 2) - if len(param) != 2 { - continue - } - - // cfg params - switch value := param[1]; param[0] { - // Disable INFILE whitelist / enable all files - case "allowAllFiles": - var isBool bool - cfg.AllowAllFiles, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Use cleartext authentication mode (MySQL 5.5.10+) - case "allowCleartextPasswords": - var isBool bool - cfg.AllowCleartextPasswords, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Use native password authentication - case "allowNativePasswords": - var isBool bool - cfg.AllowNativePasswords, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Use old authentication mode (pre MySQL 4.1) - case "allowOldPasswords": - var isBool bool - cfg.AllowOldPasswords, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Check connections for Liveness before using them - case "checkConnLiveness": - var isBool bool - cfg.CheckConnLiveness, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Switch "rowsAffected" mode - case "clientFoundRows": - var isBool bool - cfg.ClientFoundRows, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Collation - case "collation": - cfg.Collation = value - break - - case "columnsWithAlias": - var isBool bool - cfg.ColumnsWithAlias, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Compression - case "compress": - return errors.New("compression not implemented yet") - - // Enable client side placeholder substitution - case "interpolateParams": - var isBool bool - cfg.InterpolateParams, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Time Location - case "loc": - if value, err = url.QueryUnescape(value); err != nil { - return - } - cfg.Loc, err = time.LoadLocation(value) - if err != nil { - return - } - - // multiple statements in one query - case "multiStatements": - var isBool bool - cfg.MultiStatements, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // time.Time parsing - case "parseTime": - var isBool bool - cfg.ParseTime, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // I/O read Timeout - case "readTimeout": - cfg.ReadTimeout, err = time.ParseDuration(value) - if err != nil { - return - } - - // Reject read-only connections - case "rejectReadOnly": - var isBool bool - cfg.RejectReadOnly, isBool = readBool(value) - if !isBool { - return errors.New("invalid bool value: " + value) - } - - // Server public key - case "serverPubKey": - name, err := url.QueryUnescape(value) - if err != nil { - return fmt.Errorf("invalid value for server pub key name: %v", err) - } - cfg.ServerPubKey = name - - // Strict mode - case "strict": - panic("strict mode has been removed. See https://github.com/go-sql-driver/mysql/wiki/strict-mode") - - // Dial Timeout - case "timeout": - cfg.Timeout, err = time.ParseDuration(value) - if err != nil { - return - } - - // TLS-Encryption - case "tls": - boolValue, isBool := readBool(value) - if isBool { - if boolValue { - cfg.TLSConfig = "true" - } else { - cfg.TLSConfig = "false" - } - } else if vl := strings.ToLower(value); vl == "skip-verify" || vl == "preferred" { - cfg.TLSConfig = vl - } else { - name, err := url.QueryUnescape(value) - if err != nil { - return fmt.Errorf("invalid value for TLS config name: %v", err) - } - cfg.TLSConfig = name - } - - // I/O write Timeout - case "writeTimeout": - cfg.WriteTimeout, err = time.ParseDuration(value) - if err != nil { - return - } - case "maxAllowedPacket": - cfg.MaxAllowedPacket, err = strconv.Atoi(value) - if err != nil { - return - } - default: - // lazy init - if cfg.Params == nil { - cfg.Params = make(map[string]string) - } - - if cfg.Params[param[0]], err = url.QueryUnescape(value); err != nil { - return - } - } - } - - return -} - -func ensureHavePort(addr string) string { - if _, _, err := net.SplitHostPort(addr); err != nil { - return net.JoinHostPort(addr, "3306") - } - return addr -} diff --git a/vendor/github.com/go-sql-driver/mysql/errors.go b/vendor/github.com/go-sql-driver/mysql/errors.go deleted file mode 100644 index 760782f..0000000 --- a/vendor/github.com/go-sql-driver/mysql/errors.go +++ /dev/null @@ -1,65 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "errors" - "fmt" - "log" - "os" -) - -// Various errors the driver might return. Can change between driver versions. -var ( - ErrInvalidConn = errors.New("invalid connection") - ErrMalformPkt = errors.New("malformed packet") - ErrNoTLS = errors.New("TLS requested but server does not support TLS") - ErrCleartextPassword = errors.New("this user requires clear text authentication. If you still want to use it, please add 'allowCleartextPasswords=1' to your DSN") - ErrNativePassword = errors.New("this user requires mysql native password authentication.") - ErrOldPassword = errors.New("this user requires old password authentication. If you still want to use it, please add 'allowOldPasswords=1' to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords") - ErrUnknownPlugin = errors.New("this authentication plugin is not supported") - ErrOldProtocol = errors.New("MySQL server does not support required protocol 41+") - ErrPktSync = errors.New("commands out of sync. You can't run this command now") - ErrPktSyncMul = errors.New("commands out of sync. Did you run multiple statements at once?") - ErrPktTooLarge = errors.New("packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server") - ErrBusyBuffer = errors.New("busy buffer") - - // errBadConnNoWrite is used for connection errors where nothing was sent to the database yet. - // If this happens first in a function starting a database interaction, it should be replaced by driver.ErrBadConn - // to trigger a resend. - // See https://github.com/go-sql-driver/mysql/pull/302 - errBadConnNoWrite = errors.New("bad connection") -) - -var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile)) - -// Logger is used to log critical error messages. -type Logger interface { - Print(v ...interface{}) -} - -// SetLogger is used to set the logger for critical errors. -// The initial logger is os.Stderr. -func SetLogger(logger Logger) error { - if logger == nil { - return errors.New("logger is nil") - } - errLog = logger - return nil -} - -// MySQLError is an error type which represents a single MySQL error -type MySQLError struct { - Number uint16 - Message string -} - -func (me *MySQLError) Error() string { - return fmt.Sprintf("Error %d: %s", me.Number, me.Message) -} diff --git a/vendor/github.com/go-sql-driver/mysql/fields.go b/vendor/github.com/go-sql-driver/mysql/fields.go deleted file mode 100644 index e1e2ece..0000000 --- a/vendor/github.com/go-sql-driver/mysql/fields.go +++ /dev/null @@ -1,194 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql" - "reflect" -) - -func (mf *mysqlField) typeDatabaseName() string { - switch mf.fieldType { - case fieldTypeBit: - return "BIT" - case fieldTypeBLOB: - if mf.charSet != collations[binaryCollation] { - return "TEXT" - } - return "BLOB" - case fieldTypeDate: - return "DATE" - case fieldTypeDateTime: - return "DATETIME" - case fieldTypeDecimal: - return "DECIMAL" - case fieldTypeDouble: - return "DOUBLE" - case fieldTypeEnum: - return "ENUM" - case fieldTypeFloat: - return "FLOAT" - case fieldTypeGeometry: - return "GEOMETRY" - case fieldTypeInt24: - return "MEDIUMINT" - case fieldTypeJSON: - return "JSON" - case fieldTypeLong: - return "INT" - case fieldTypeLongBLOB: - if mf.charSet != collations[binaryCollation] { - return "LONGTEXT" - } - return "LONGBLOB" - case fieldTypeLongLong: - return "BIGINT" - case fieldTypeMediumBLOB: - if mf.charSet != collations[binaryCollation] { - return "MEDIUMTEXT" - } - return "MEDIUMBLOB" - case fieldTypeNewDate: - return "DATE" - case fieldTypeNewDecimal: - return "DECIMAL" - case fieldTypeNULL: - return "NULL" - case fieldTypeSet: - return "SET" - case fieldTypeShort: - return "SMALLINT" - case fieldTypeString: - if mf.charSet == collations[binaryCollation] { - return "BINARY" - } - return "CHAR" - case fieldTypeTime: - return "TIME" - case fieldTypeTimestamp: - return "TIMESTAMP" - case fieldTypeTiny: - return "TINYINT" - case fieldTypeTinyBLOB: - if mf.charSet != collations[binaryCollation] { - return "TINYTEXT" - } - return "TINYBLOB" - case fieldTypeVarChar: - if mf.charSet == collations[binaryCollation] { - return "VARBINARY" - } - return "VARCHAR" - case fieldTypeVarString: - if mf.charSet == collations[binaryCollation] { - return "VARBINARY" - } - return "VARCHAR" - case fieldTypeYear: - return "YEAR" - default: - return "" - } -} - -var ( - scanTypeFloat32 = reflect.TypeOf(float32(0)) - scanTypeFloat64 = reflect.TypeOf(float64(0)) - scanTypeInt8 = reflect.TypeOf(int8(0)) - scanTypeInt16 = reflect.TypeOf(int16(0)) - scanTypeInt32 = reflect.TypeOf(int32(0)) - scanTypeInt64 = reflect.TypeOf(int64(0)) - scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{}) - scanTypeNullInt = reflect.TypeOf(sql.NullInt64{}) - scanTypeNullTime = reflect.TypeOf(NullTime{}) - scanTypeUint8 = reflect.TypeOf(uint8(0)) - scanTypeUint16 = reflect.TypeOf(uint16(0)) - scanTypeUint32 = reflect.TypeOf(uint32(0)) - scanTypeUint64 = reflect.TypeOf(uint64(0)) - scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{}) - scanTypeUnknown = reflect.TypeOf(new(interface{})) -) - -type mysqlField struct { - tableName string - name string - length uint32 - flags fieldFlag - fieldType fieldType - decimals byte - charSet uint8 -} - -func (mf *mysqlField) scanType() reflect.Type { - switch mf.fieldType { - case fieldTypeTiny: - if mf.flags&flagNotNULL != 0 { - if mf.flags&flagUnsigned != 0 { - return scanTypeUint8 - } - return scanTypeInt8 - } - return scanTypeNullInt - - case fieldTypeShort, fieldTypeYear: - if mf.flags&flagNotNULL != 0 { - if mf.flags&flagUnsigned != 0 { - return scanTypeUint16 - } - return scanTypeInt16 - } - return scanTypeNullInt - - case fieldTypeInt24, fieldTypeLong: - if mf.flags&flagNotNULL != 0 { - if mf.flags&flagUnsigned != 0 { - return scanTypeUint32 - } - return scanTypeInt32 - } - return scanTypeNullInt - - case fieldTypeLongLong: - if mf.flags&flagNotNULL != 0 { - if mf.flags&flagUnsigned != 0 { - return scanTypeUint64 - } - return scanTypeInt64 - } - return scanTypeNullInt - - case fieldTypeFloat: - if mf.flags&flagNotNULL != 0 { - return scanTypeFloat32 - } - return scanTypeNullFloat - - case fieldTypeDouble: - if mf.flags&flagNotNULL != 0 { - return scanTypeFloat64 - } - return scanTypeNullFloat - - case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, - fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, - fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, - fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON, - fieldTypeTime: - return scanTypeRawBytes - - case fieldTypeDate, fieldTypeNewDate, - fieldTypeTimestamp, fieldTypeDateTime: - // NullTime is always returned for more consistent behavior as it can - // handle both cases of parseTime regardless if the field is nullable. - return scanTypeNullTime - - default: - return scanTypeUnknown - } -} diff --git a/vendor/github.com/go-sql-driver/mysql/go.mod b/vendor/github.com/go-sql-driver/mysql/go.mod deleted file mode 100644 index fffbf6a..0000000 --- a/vendor/github.com/go-sql-driver/mysql/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/go-sql-driver/mysql - -go 1.10 diff --git a/vendor/github.com/go-sql-driver/mysql/infile.go b/vendor/github.com/go-sql-driver/mysql/infile.go deleted file mode 100644 index 273cb0b..0000000 --- a/vendor/github.com/go-sql-driver/mysql/infile.go +++ /dev/null @@ -1,182 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "fmt" - "io" - "os" - "strings" - "sync" -) - -var ( - fileRegister map[string]bool - fileRegisterLock sync.RWMutex - readerRegister map[string]func() io.Reader - readerRegisterLock sync.RWMutex -) - -// RegisterLocalFile adds the given file to the file whitelist, -// so that it can be used by "LOAD DATA LOCAL INFILE ". -// Alternatively you can allow the use of all local files with -// the DSN parameter 'allowAllFiles=true' -// -// filePath := "/home/gopher/data.csv" -// mysql.RegisterLocalFile(filePath) -// err := db.Exec("LOAD DATA LOCAL INFILE '" + filePath + "' INTO TABLE foo") -// if err != nil { -// ... -// -func RegisterLocalFile(filePath string) { - fileRegisterLock.Lock() - // lazy map init - if fileRegister == nil { - fileRegister = make(map[string]bool) - } - - fileRegister[strings.Trim(filePath, `"`)] = true - fileRegisterLock.Unlock() -} - -// DeregisterLocalFile removes the given filepath from the whitelist. -func DeregisterLocalFile(filePath string) { - fileRegisterLock.Lock() - delete(fileRegister, strings.Trim(filePath, `"`)) - fileRegisterLock.Unlock() -} - -// RegisterReaderHandler registers a handler function which is used -// to receive a io.Reader. -// The Reader can be used by "LOAD DATA LOCAL INFILE Reader::". -// If the handler returns a io.ReadCloser Close() is called when the -// request is finished. -// -// mysql.RegisterReaderHandler("data", func() io.Reader { -// var csvReader io.Reader // Some Reader that returns CSV data -// ... // Open Reader here -// return csvReader -// }) -// err := db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE foo") -// if err != nil { -// ... -// -func RegisterReaderHandler(name string, handler func() io.Reader) { - readerRegisterLock.Lock() - // lazy map init - if readerRegister == nil { - readerRegister = make(map[string]func() io.Reader) - } - - readerRegister[name] = handler - readerRegisterLock.Unlock() -} - -// DeregisterReaderHandler removes the ReaderHandler function with -// the given name from the registry. -func DeregisterReaderHandler(name string) { - readerRegisterLock.Lock() - delete(readerRegister, name) - readerRegisterLock.Unlock() -} - -func deferredClose(err *error, closer io.Closer) { - closeErr := closer.Close() - if *err == nil { - *err = closeErr - } -} - -func (mc *mysqlConn) handleInFileRequest(name string) (err error) { - var rdr io.Reader - var data []byte - packetSize := 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP - if mc.maxWriteSize < packetSize { - packetSize = mc.maxWriteSize - } - - if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader - // The server might return an an absolute path. See issue #355. - name = name[idx+8:] - - readerRegisterLock.RLock() - handler, inMap := readerRegister[name] - readerRegisterLock.RUnlock() - - if inMap { - rdr = handler() - if rdr != nil { - if cl, ok := rdr.(io.Closer); ok { - defer deferredClose(&err, cl) - } - } else { - err = fmt.Errorf("Reader '%s' is ", name) - } - } else { - err = fmt.Errorf("Reader '%s' is not registered", name) - } - } else { // File - name = strings.Trim(name, `"`) - fileRegisterLock.RLock() - fr := fileRegister[name] - fileRegisterLock.RUnlock() - if mc.cfg.AllowAllFiles || fr { - var file *os.File - var fi os.FileInfo - - if file, err = os.Open(name); err == nil { - defer deferredClose(&err, file) - - // get file size - if fi, err = file.Stat(); err == nil { - rdr = file - if fileSize := int(fi.Size()); fileSize < packetSize { - packetSize = fileSize - } - } - } - } else { - err = fmt.Errorf("local file '%s' is not registered", name) - } - } - - // send content packets - // if packetSize == 0, the Reader contains no data - if err == nil && packetSize > 0 { - data := make([]byte, 4+packetSize) - var n int - for err == nil { - n, err = rdr.Read(data[4:]) - if n > 0 { - if ioErr := mc.writePacket(data[:4+n]); ioErr != nil { - return ioErr - } - } - } - if err == io.EOF { - err = nil - } - } - - // send empty packet (termination) - if data == nil { - data = make([]byte, 4) - } - if ioErr := mc.writePacket(data[:4]); ioErr != nil { - return ioErr - } - - // read OK packet - if err == nil { - return mc.readResultOK() - } - - mc.readPacket() - return err -} diff --git a/vendor/github.com/go-sql-driver/mysql/nulltime.go b/vendor/github.com/go-sql-driver/mysql/nulltime.go deleted file mode 100644 index afa8a89..0000000 --- a/vendor/github.com/go-sql-driver/mysql/nulltime.go +++ /dev/null @@ -1,50 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql/driver" - "fmt" - "time" -) - -// Scan implements the Scanner interface. -// The value type must be time.Time or string / []byte (formatted time-string), -// otherwise Scan fails. -func (nt *NullTime) Scan(value interface{}) (err error) { - if value == nil { - nt.Time, nt.Valid = time.Time{}, false - return - } - - switch v := value.(type) { - case time.Time: - nt.Time, nt.Valid = v, true - return - case []byte: - nt.Time, err = parseDateTime(string(v), time.UTC) - nt.Valid = (err == nil) - return - case string: - nt.Time, err = parseDateTime(v, time.UTC) - nt.Valid = (err == nil) - return - } - - nt.Valid = false - return fmt.Errorf("Can't convert %T to time.Time", value) -} - -// Value implements the driver Valuer interface. -func (nt NullTime) Value() (driver.Value, error) { - if !nt.Valid { - return nil, nil - } - return nt.Time, nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/nulltime_go113.go b/vendor/github.com/go-sql-driver/mysql/nulltime_go113.go deleted file mode 100644 index c392594..0000000 --- a/vendor/github.com/go-sql-driver/mysql/nulltime_go113.go +++ /dev/null @@ -1,31 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -// +build go1.13 - -package mysql - -import ( - "database/sql" -) - -// NullTime represents a time.Time that may be NULL. -// NullTime implements the Scanner interface so -// it can be used as a scan destination: -// -// var nt NullTime -// err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt) -// ... -// if nt.Valid { -// // use nt.Time -// } else { -// // NULL value -// } -// -// This NullTime implementation is not driver-specific -type NullTime sql.NullTime diff --git a/vendor/github.com/go-sql-driver/mysql/nulltime_legacy.go b/vendor/github.com/go-sql-driver/mysql/nulltime_legacy.go deleted file mode 100644 index 86d159d..0000000 --- a/vendor/github.com/go-sql-driver/mysql/nulltime_legacy.go +++ /dev/null @@ -1,34 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -// +build !go1.13 - -package mysql - -import ( - "time" -) - -// NullTime represents a time.Time that may be NULL. -// NullTime implements the Scanner interface so -// it can be used as a scan destination: -// -// var nt NullTime -// err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt) -// ... -// if nt.Valid { -// // use nt.Time -// } else { -// // NULL value -// } -// -// This NullTime implementation is not driver-specific -type NullTime struct { - Time time.Time - Valid bool // Valid is true if Time is not NULL -} diff --git a/vendor/github.com/go-sql-driver/mysql/packets.go b/vendor/github.com/go-sql-driver/mysql/packets.go deleted file mode 100644 index 82ad7a2..0000000 --- a/vendor/github.com/go-sql-driver/mysql/packets.go +++ /dev/null @@ -1,1342 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "bytes" - "crypto/tls" - "database/sql/driver" - "encoding/binary" - "errors" - "fmt" - "io" - "math" - "time" -) - -// Packets documentation: -// http://dev.mysql.com/doc/internals/en/client-server-protocol.html - -// Read packet to buffer 'data' -func (mc *mysqlConn) readPacket() ([]byte, error) { - var prevData []byte - for { - // read packet header - data, err := mc.buf.readNext(4) - if err != nil { - if cerr := mc.canceled.Value(); cerr != nil { - return nil, cerr - } - errLog.Print(err) - mc.Close() - return nil, ErrInvalidConn - } - - // packet length [24 bit] - pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16) - - // check packet sync [8 bit] - if data[3] != mc.sequence { - if data[3] > mc.sequence { - return nil, ErrPktSyncMul - } - return nil, ErrPktSync - } - mc.sequence++ - - // packets with length 0 terminate a previous packet which is a - // multiple of (2^24)-1 bytes long - if pktLen == 0 { - // there was no previous packet - if prevData == nil { - errLog.Print(ErrMalformPkt) - mc.Close() - return nil, ErrInvalidConn - } - - return prevData, nil - } - - // read packet body [pktLen bytes] - data, err = mc.buf.readNext(pktLen) - if err != nil { - if cerr := mc.canceled.Value(); cerr != nil { - return nil, cerr - } - errLog.Print(err) - mc.Close() - return nil, ErrInvalidConn - } - - // return data if this was the last packet - if pktLen < maxPacketSize { - // zero allocations for non-split packets - if prevData == nil { - return data, nil - } - - return append(prevData, data...), nil - } - - prevData = append(prevData, data...) - } -} - -// Write packet buffer 'data' -func (mc *mysqlConn) writePacket(data []byte) error { - pktLen := len(data) - 4 - - if pktLen > mc.maxAllowedPacket { - return ErrPktTooLarge - } - - // Perform a stale connection check. We only perform this check for - // the first query on a connection that has been checked out of the - // connection pool: a fresh connection from the pool is more likely - // to be stale, and it has not performed any previous writes that - // could cause data corruption, so it's safe to return ErrBadConn - // if the check fails. - if mc.reset { - mc.reset = false - conn := mc.netConn - if mc.rawConn != nil { - conn = mc.rawConn - } - var err error - // If this connection has a ReadTimeout which we've been setting on - // reads, reset it to its default value before we attempt a non-blocking - // read, otherwise the scheduler will just time us out before we can read - if mc.cfg.ReadTimeout != 0 { - err = conn.SetReadDeadline(time.Time{}) - } - if err == nil && mc.cfg.CheckConnLiveness { - err = connCheck(conn) - } - if err != nil { - errLog.Print("closing bad idle connection: ", err) - mc.Close() - return driver.ErrBadConn - } - } - - for { - var size int - if pktLen >= maxPacketSize { - data[0] = 0xff - data[1] = 0xff - data[2] = 0xff - size = maxPacketSize - } else { - data[0] = byte(pktLen) - data[1] = byte(pktLen >> 8) - data[2] = byte(pktLen >> 16) - size = pktLen - } - data[3] = mc.sequence - - // Write packet - if mc.writeTimeout > 0 { - if err := mc.netConn.SetWriteDeadline(time.Now().Add(mc.writeTimeout)); err != nil { - return err - } - } - - n, err := mc.netConn.Write(data[:4+size]) - if err == nil && n == 4+size { - mc.sequence++ - if size != maxPacketSize { - return nil - } - pktLen -= size - data = data[size:] - continue - } - - // Handle error - if err == nil { // n != len(data) - mc.cleanup() - errLog.Print(ErrMalformPkt) - } else { - if cerr := mc.canceled.Value(); cerr != nil { - return cerr - } - if n == 0 && pktLen == len(data)-4 { - // only for the first loop iteration when nothing was written yet - return errBadConnNoWrite - } - mc.cleanup() - errLog.Print(err) - } - return ErrInvalidConn - } -} - -/****************************************************************************** -* Initialization Process * -******************************************************************************/ - -// Handshake Initialization Packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake -func (mc *mysqlConn) readHandshakePacket() (data []byte, plugin string, err error) { - data, err = mc.readPacket() - if err != nil { - // for init we can rewrite this to ErrBadConn for sql.Driver to retry, since - // in connection initialization we don't risk retrying non-idempotent actions. - if err == ErrInvalidConn { - return nil, "", driver.ErrBadConn - } - return - } - - if data[0] == iERR { - return nil, "", mc.handleErrorPacket(data) - } - - // protocol version [1 byte] - if data[0] < minProtocolVersion { - return nil, "", fmt.Errorf( - "unsupported protocol version %d. Version %d or higher is required", - data[0], - minProtocolVersion, - ) - } - - // server version [null terminated string] - // connection id [4 bytes] - pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + 4 - - // first part of the password cipher [8 bytes] - authData := data[pos : pos+8] - - // (filler) always 0x00 [1 byte] - pos += 8 + 1 - - // capability flags (lower 2 bytes) [2 bytes] - mc.flags = clientFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) - if mc.flags&clientProtocol41 == 0 { - return nil, "", ErrOldProtocol - } - if mc.flags&clientSSL == 0 && mc.cfg.tls != nil { - if mc.cfg.TLSConfig == "preferred" { - mc.cfg.tls = nil - } else { - return nil, "", ErrNoTLS - } - } - pos += 2 - - if len(data) > pos { - // character set [1 byte] - // status flags [2 bytes] - // capability flags (upper 2 bytes) [2 bytes] - // length of auth-plugin-data [1 byte] - // reserved (all [00]) [10 bytes] - pos += 1 + 2 + 2 + 1 + 10 - - // second part of the password cipher [mininum 13 bytes], - // where len=MAX(13, length of auth-plugin-data - 8) - // - // The web documentation is ambiguous about the length. However, - // according to mysql-5.7/sql/auth/sql_authentication.cc line 538, - // the 13th byte is "\0 byte, terminating the second part of - // a scramble". So the second part of the password cipher is - // a NULL terminated string that's at least 13 bytes with the - // last byte being NULL. - // - // The official Python library uses the fixed length 12 - // which seems to work but technically could have a hidden bug. - authData = append(authData, data[pos:pos+12]...) - pos += 13 - - // EOF if version (>= 5.5.7 and < 5.5.10) or (>= 5.6.0 and < 5.6.2) - // \NUL otherwise - if end := bytes.IndexByte(data[pos:], 0x00); end != -1 { - plugin = string(data[pos : pos+end]) - } else { - plugin = string(data[pos:]) - } - - // make a memory safe copy of the cipher slice - var b [20]byte - copy(b[:], authData) - return b[:], plugin, nil - } - - // make a memory safe copy of the cipher slice - var b [8]byte - copy(b[:], authData) - return b[:], plugin, nil -} - -// Client Authentication Packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse -func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string) error { - // Adjust client flags based on server support - clientFlags := clientProtocol41 | - clientSecureConn | - clientLongPassword | - clientTransactions | - clientLocalFiles | - clientPluginAuth | - clientMultiResults | - mc.flags&clientLongFlag - - if mc.cfg.ClientFoundRows { - clientFlags |= clientFoundRows - } - - // To enable TLS / SSL - if mc.cfg.tls != nil { - clientFlags |= clientSSL - } - - if mc.cfg.MultiStatements { - clientFlags |= clientMultiStatements - } - - // encode length of the auth plugin data - var authRespLEIBuf [9]byte - authRespLen := len(authResp) - authRespLEI := appendLengthEncodedInteger(authRespLEIBuf[:0], uint64(authRespLen)) - if len(authRespLEI) > 1 { - // if the length can not be written in 1 byte, it must be written as a - // length encoded integer - clientFlags |= clientPluginAuthLenEncClientData - } - - pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + len(authRespLEI) + len(authResp) + 21 + 1 - - // To specify a db name - if n := len(mc.cfg.DBName); n > 0 { - clientFlags |= clientConnectWithDB - pktLen += n + 1 - } - - // Calculate packet length and get buffer with that size - data, err := mc.buf.takeSmallBuffer(pktLen + 4) - if err != nil { - // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) - return errBadConnNoWrite - } - - // ClientFlags [32 bit] - data[4] = byte(clientFlags) - data[5] = byte(clientFlags >> 8) - data[6] = byte(clientFlags >> 16) - data[7] = byte(clientFlags >> 24) - - // MaxPacketSize [32 bit] (none) - data[8] = 0x00 - data[9] = 0x00 - data[10] = 0x00 - data[11] = 0x00 - - // Charset [1 byte] - var found bool - data[12], found = collations[mc.cfg.Collation] - if !found { - // Note possibility for false negatives: - // could be triggered although the collation is valid if the - // collations map does not contain entries the server supports. - return errors.New("unknown collation") - } - - // SSL Connection Request Packet - // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest - if mc.cfg.tls != nil { - // Send TLS / SSL request packet - if err := mc.writePacket(data[:(4+4+1+23)+4]); err != nil { - return err - } - - // Switch to TLS - tlsConn := tls.Client(mc.netConn, mc.cfg.tls) - if err := tlsConn.Handshake(); err != nil { - return err - } - mc.rawConn = mc.netConn - mc.netConn = tlsConn - mc.buf.nc = tlsConn - } - - // Filler [23 bytes] (all 0x00) - pos := 13 - for ; pos < 13+23; pos++ { - data[pos] = 0 - } - - // User [null terminated string] - if len(mc.cfg.User) > 0 { - pos += copy(data[pos:], mc.cfg.User) - } - data[pos] = 0x00 - pos++ - - // Auth Data [length encoded integer] - pos += copy(data[pos:], authRespLEI) - pos += copy(data[pos:], authResp) - - // Databasename [null terminated string] - if len(mc.cfg.DBName) > 0 { - pos += copy(data[pos:], mc.cfg.DBName) - data[pos] = 0x00 - pos++ - } - - pos += copy(data[pos:], plugin) - data[pos] = 0x00 - pos++ - - // Send Auth packet - return mc.writePacket(data[:pos]) -} - -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeAuthSwitchPacket(authData []byte) error { - pktLen := 4 + len(authData) - data, err := mc.buf.takeSmallBuffer(pktLen) - if err != nil { - // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) - return errBadConnNoWrite - } - - // Add the auth data [EOF] - copy(data[4:], authData) - return mc.writePacket(data) -} - -/****************************************************************************** -* Command Packets * -******************************************************************************/ - -func (mc *mysqlConn) writeCommandPacket(command byte) error { - // Reset Packet Sequence - mc.sequence = 0 - - data, err := mc.buf.takeSmallBuffer(4 + 1) - if err != nil { - // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) - return errBadConnNoWrite - } - - // Add command byte - data[4] = command - - // Send CMD packet - return mc.writePacket(data) -} - -func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { - // Reset Packet Sequence - mc.sequence = 0 - - pktLen := 1 + len(arg) - data, err := mc.buf.takeBuffer(pktLen + 4) - if err != nil { - // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) - return errBadConnNoWrite - } - - // Add command byte - data[4] = command - - // Add arg - copy(data[5:], arg) - - // Send CMD packet - return mc.writePacket(data) -} - -func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { - // Reset Packet Sequence - mc.sequence = 0 - - data, err := mc.buf.takeSmallBuffer(4 + 1 + 4) - if err != nil { - // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) - return errBadConnNoWrite - } - - // Add command byte - data[4] = command - - // Add arg [32 bit] - data[5] = byte(arg) - data[6] = byte(arg >> 8) - data[7] = byte(arg >> 16) - data[8] = byte(arg >> 24) - - // Send CMD packet - return mc.writePacket(data) -} - -/****************************************************************************** -* Result Packets * -******************************************************************************/ - -func (mc *mysqlConn) readAuthResult() ([]byte, string, error) { - data, err := mc.readPacket() - if err != nil { - return nil, "", err - } - - // packet indicator - switch data[0] { - - case iOK: - return nil, "", mc.handleOkPacket(data) - - case iAuthMoreData: - return data[1:], "", err - - case iEOF: - if len(data) == 1 { - // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::OldAuthSwitchRequest - return nil, "mysql_old_password", nil - } - pluginEndIndex := bytes.IndexByte(data, 0x00) - if pluginEndIndex < 0 { - return nil, "", ErrMalformPkt - } - plugin := string(data[1:pluginEndIndex]) - authData := data[pluginEndIndex+1:] - return authData, plugin, nil - - default: // Error otherwise - return nil, "", mc.handleErrorPacket(data) - } -} - -// Returns error if Packet is not an 'Result OK'-Packet -func (mc *mysqlConn) readResultOK() error { - data, err := mc.readPacket() - if err != nil { - return err - } - - if data[0] == iOK { - return mc.handleOkPacket(data) - } - return mc.handleErrorPacket(data) -} - -// Result Set Header Packet -// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::Resultset -func (mc *mysqlConn) readResultSetHeaderPacket() (int, error) { - data, err := mc.readPacket() - if err == nil { - switch data[0] { - - case iOK: - return 0, mc.handleOkPacket(data) - - case iERR: - return 0, mc.handleErrorPacket(data) - - case iLocalInFile: - return 0, mc.handleInFileRequest(string(data[1:])) - } - - // column count - num, _, n := readLengthEncodedInteger(data) - if n-len(data) == 0 { - return int(num), nil - } - - return 0, ErrMalformPkt - } - return 0, err -} - -// Error Packet -// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-ERR_Packet -func (mc *mysqlConn) handleErrorPacket(data []byte) error { - if data[0] != iERR { - return ErrMalformPkt - } - - // 0xff [1 byte] - - // Error Number [16 bit uint] - errno := binary.LittleEndian.Uint16(data[1:3]) - - // 1792: ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION - // 1290: ER_OPTION_PREVENTS_STATEMENT (returned by Aurora during failover) - if (errno == 1792 || errno == 1290) && mc.cfg.RejectReadOnly { - // Oops; we are connected to a read-only connection, and won't be able - // to issue any write statements. Since RejectReadOnly is configured, - // we throw away this connection hoping this one would have write - // permission. This is specifically for a possible race condition - // during failover (e.g. on AWS Aurora). See README.md for more. - // - // We explicitly close the connection before returning - // driver.ErrBadConn to ensure that `database/sql` purges this - // connection and initiates a new one for next statement next time. - mc.Close() - return driver.ErrBadConn - } - - pos := 3 - - // SQL State [optional: # + 5bytes string] - if data[3] == 0x23 { - //sqlstate := string(data[4 : 4+5]) - pos = 9 - } - - // Error Message [string] - return &MySQLError{ - Number: errno, - Message: string(data[pos:]), - } -} - -func readStatus(b []byte) statusFlag { - return statusFlag(b[0]) | statusFlag(b[1])<<8 -} - -// Ok Packet -// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-OK_Packet -func (mc *mysqlConn) handleOkPacket(data []byte) error { - var n, m int - - // 0x00 [1 byte] - - // Affected rows [Length Coded Binary] - mc.affectedRows, _, n = readLengthEncodedInteger(data[1:]) - - // Insert id [Length Coded Binary] - mc.insertId, _, m = readLengthEncodedInteger(data[1+n:]) - - // server_status [2 bytes] - mc.status = readStatus(data[1+n+m : 1+n+m+2]) - if mc.status&statusMoreResultsExists != 0 { - return nil - } - - // warning count [2 bytes] - - return nil -} - -// Read Packets as Field Packets until EOF-Packet or an Error appears -// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition41 -func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { - columns := make([]mysqlField, count) - - for i := 0; ; i++ { - data, err := mc.readPacket() - if err != nil { - return nil, err - } - - // EOF Packet - if data[0] == iEOF && (len(data) == 5 || len(data) == 1) { - if i == count { - return columns, nil - } - return nil, fmt.Errorf("column count mismatch n:%d len:%d", count, len(columns)) - } - - // Catalog - pos, err := skipLengthEncodedString(data) - if err != nil { - return nil, err - } - - // Database [len coded string] - n, err := skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - - // Table [len coded string] - if mc.cfg.ColumnsWithAlias { - tableName, _, n, err := readLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - columns[i].tableName = string(tableName) - } else { - n, err = skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - } - - // Original table [len coded string] - n, err = skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - - // Name [len coded string] - name, _, n, err := readLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - columns[i].name = string(name) - pos += n - - // Original name [len coded string] - n, err = skipLengthEncodedString(data[pos:]) - if err != nil { - return nil, err - } - pos += n - - // Filler [uint8] - pos++ - - // Charset [charset, collation uint8] - columns[i].charSet = data[pos] - pos += 2 - - // Length [uint32] - columns[i].length = binary.LittleEndian.Uint32(data[pos : pos+4]) - pos += 4 - - // Field type [uint8] - columns[i].fieldType = fieldType(data[pos]) - pos++ - - // Flags [uint16] - columns[i].flags = fieldFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) - pos += 2 - - // Decimals [uint8] - columns[i].decimals = data[pos] - //pos++ - - // Default value [len coded binary] - //if pos < len(data) { - // defaultVal, _, err = bytesToLengthCodedBinary(data[pos:]) - //} - } -} - -// Read Packets as Field Packets until EOF-Packet or an Error appears -// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::ResultsetRow -func (rows *textRows) readRow(dest []driver.Value) error { - mc := rows.mc - - if rows.rs.done { - return io.EOF - } - - data, err := mc.readPacket() - if err != nil { - return err - } - - // EOF Packet - if data[0] == iEOF && len(data) == 5 { - // server_status [2 bytes] - rows.mc.status = readStatus(data[3:]) - rows.rs.done = true - if !rows.HasNextResultSet() { - rows.mc = nil - } - return io.EOF - } - if data[0] == iERR { - rows.mc = nil - return mc.handleErrorPacket(data) - } - - // RowSet Packet - var n int - var isNull bool - pos := 0 - - for i := range dest { - // Read bytes and convert to string - dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) - pos += n - if err == nil { - if !isNull { - if !mc.parseTime { - continue - } else { - switch rows.rs.columns[i].fieldType { - case fieldTypeTimestamp, fieldTypeDateTime, - fieldTypeDate, fieldTypeNewDate: - dest[i], err = parseDateTime( - string(dest[i].([]byte)), - mc.cfg.Loc, - ) - if err == nil { - continue - } - default: - continue - } - } - - } else { - dest[i] = nil - continue - } - } - return err // err != nil - } - - return nil -} - -// Reads Packets until EOF-Packet or an Error appears. Returns count of Packets read -func (mc *mysqlConn) readUntilEOF() error { - for { - data, err := mc.readPacket() - if err != nil { - return err - } - - switch data[0] { - case iERR: - return mc.handleErrorPacket(data) - case iEOF: - if len(data) == 5 { - mc.status = readStatus(data[3:]) - } - return nil - } - } -} - -/****************************************************************************** -* Prepared Statements * -******************************************************************************/ - -// Prepare Result Packets -// http://dev.mysql.com/doc/internals/en/com-stmt-prepare-response.html -func (stmt *mysqlStmt) readPrepareResultPacket() (uint16, error) { - data, err := stmt.mc.readPacket() - if err == nil { - // packet indicator [1 byte] - if data[0] != iOK { - return 0, stmt.mc.handleErrorPacket(data) - } - - // statement id [4 bytes] - stmt.id = binary.LittleEndian.Uint32(data[1:5]) - - // Column count [16 bit uint] - columnCount := binary.LittleEndian.Uint16(data[5:7]) - - // Param count [16 bit uint] - stmt.paramCount = int(binary.LittleEndian.Uint16(data[7:9])) - - // Reserved [8 bit] - - // Warning count [16 bit uint] - - return columnCount, nil - } - return 0, err -} - -// http://dev.mysql.com/doc/internals/en/com-stmt-send-long-data.html -func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { - maxLen := stmt.mc.maxAllowedPacket - 1 - pktLen := maxLen - - // After the header (bytes 0-3) follows before the data: - // 1 byte command - // 4 bytes stmtID - // 2 bytes paramID - const dataOffset = 1 + 4 + 2 - - // Cannot use the write buffer since - // a) the buffer is too small - // b) it is in use - data := make([]byte, 4+1+4+2+len(arg)) - - copy(data[4+dataOffset:], arg) - - for argLen := len(arg); argLen > 0; argLen -= pktLen - dataOffset { - if dataOffset+argLen < maxLen { - pktLen = dataOffset + argLen - } - - stmt.mc.sequence = 0 - // Add command byte [1 byte] - data[4] = comStmtSendLongData - - // Add stmtID [32 bit] - data[5] = byte(stmt.id) - data[6] = byte(stmt.id >> 8) - data[7] = byte(stmt.id >> 16) - data[8] = byte(stmt.id >> 24) - - // Add paramID [16 bit] - data[9] = byte(paramID) - data[10] = byte(paramID >> 8) - - // Send CMD packet - err := stmt.mc.writePacket(data[:4+pktLen]) - if err == nil { - data = data[pktLen-dataOffset:] - continue - } - return err - - } - - // Reset Packet Sequence - stmt.mc.sequence = 0 - return nil -} - -// Execute Prepared Statement -// http://dev.mysql.com/doc/internals/en/com-stmt-execute.html -func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { - if len(args) != stmt.paramCount { - return fmt.Errorf( - "argument count mismatch (got: %d; has: %d)", - len(args), - stmt.paramCount, - ) - } - - const minPktLen = 4 + 1 + 4 + 1 + 4 - mc := stmt.mc - - // Determine threshold dynamically to avoid packet size shortage. - longDataSize := mc.maxAllowedPacket / (stmt.paramCount + 1) - if longDataSize < 64 { - longDataSize = 64 - } - - // Reset packet-sequence - mc.sequence = 0 - - var data []byte - var err error - - if len(args) == 0 { - data, err = mc.buf.takeBuffer(minPktLen) - } else { - data, err = mc.buf.takeCompleteBuffer() - // In this case the len(data) == cap(data) which is used to optimise the flow below. - } - if err != nil { - // cannot take the buffer. Something must be wrong with the connection - errLog.Print(err) - return errBadConnNoWrite - } - - // command [1 byte] - data[4] = comStmtExecute - - // statement_id [4 bytes] - data[5] = byte(stmt.id) - data[6] = byte(stmt.id >> 8) - data[7] = byte(stmt.id >> 16) - data[8] = byte(stmt.id >> 24) - - // flags (0: CURSOR_TYPE_NO_CURSOR) [1 byte] - data[9] = 0x00 - - // iteration_count (uint32(1)) [4 bytes] - data[10] = 0x01 - data[11] = 0x00 - data[12] = 0x00 - data[13] = 0x00 - - if len(args) > 0 { - pos := minPktLen - - var nullMask []byte - if maskLen, typesLen := (len(args)+7)/8, 1+2*len(args); pos+maskLen+typesLen >= cap(data) { - // buffer has to be extended but we don't know by how much so - // we depend on append after all data with known sizes fit. - // We stop at that because we deal with a lot of columns here - // which makes the required allocation size hard to guess. - tmp := make([]byte, pos+maskLen+typesLen) - copy(tmp[:pos], data[:pos]) - data = tmp - nullMask = data[pos : pos+maskLen] - // No need to clean nullMask as make ensures that. - pos += maskLen - } else { - nullMask = data[pos : pos+maskLen] - for i := range nullMask { - nullMask[i] = 0 - } - pos += maskLen - } - - // newParameterBoundFlag 1 [1 byte] - data[pos] = 0x01 - pos++ - - // type of each parameter [len(args)*2 bytes] - paramTypes := data[pos:] - pos += len(args) * 2 - - // value of each parameter [n bytes] - paramValues := data[pos:pos] - valuesCap := cap(paramValues) - - for i, arg := range args { - // build NULL-bitmap - if arg == nil { - nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = byte(fieldTypeNULL) - paramTypes[i+i+1] = 0x00 - continue - } - - // cache types and values - switch v := arg.(type) { - case int64: - paramTypes[i+i] = byte(fieldTypeLongLong) - paramTypes[i+i+1] = 0x00 - - if cap(paramValues)-len(paramValues)-8 >= 0 { - paramValues = paramValues[:len(paramValues)+8] - binary.LittleEndian.PutUint64( - paramValues[len(paramValues)-8:], - uint64(v), - ) - } else { - paramValues = append(paramValues, - uint64ToBytes(uint64(v))..., - ) - } - - case uint64: - paramTypes[i+i] = byte(fieldTypeLongLong) - paramTypes[i+i+1] = 0x80 // type is unsigned - - if cap(paramValues)-len(paramValues)-8 >= 0 { - paramValues = paramValues[:len(paramValues)+8] - binary.LittleEndian.PutUint64( - paramValues[len(paramValues)-8:], - uint64(v), - ) - } else { - paramValues = append(paramValues, - uint64ToBytes(uint64(v))..., - ) - } - - case float64: - paramTypes[i+i] = byte(fieldTypeDouble) - paramTypes[i+i+1] = 0x00 - - if cap(paramValues)-len(paramValues)-8 >= 0 { - paramValues = paramValues[:len(paramValues)+8] - binary.LittleEndian.PutUint64( - paramValues[len(paramValues)-8:], - math.Float64bits(v), - ) - } else { - paramValues = append(paramValues, - uint64ToBytes(math.Float64bits(v))..., - ) - } - - case bool: - paramTypes[i+i] = byte(fieldTypeTiny) - paramTypes[i+i+1] = 0x00 - - if v { - paramValues = append(paramValues, 0x01) - } else { - paramValues = append(paramValues, 0x00) - } - - case []byte: - // Common case (non-nil value) first - if v != nil { - paramTypes[i+i] = byte(fieldTypeString) - paramTypes[i+i+1] = 0x00 - - if len(v) < longDataSize { - paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(v)), - ) - paramValues = append(paramValues, v...) - } else { - if err := stmt.writeCommandLongData(i, v); err != nil { - return err - } - } - continue - } - - // Handle []byte(nil) as a NULL value - nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = byte(fieldTypeNULL) - paramTypes[i+i+1] = 0x00 - - case string: - paramTypes[i+i] = byte(fieldTypeString) - paramTypes[i+i+1] = 0x00 - - if len(v) < longDataSize { - paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(v)), - ) - paramValues = append(paramValues, v...) - } else { - if err := stmt.writeCommandLongData(i, []byte(v)); err != nil { - return err - } - } - - case time.Time: - paramTypes[i+i] = byte(fieldTypeString) - paramTypes[i+i+1] = 0x00 - - var a [64]byte - var b = a[:0] - - if v.IsZero() { - b = append(b, "0000-00-00"...) - } else { - b = v.In(mc.cfg.Loc).AppendFormat(b, timeFormat) - } - - paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(b)), - ) - paramValues = append(paramValues, b...) - - default: - return fmt.Errorf("cannot convert type: %T", arg) - } - } - - // Check if param values exceeded the available buffer - // In that case we must build the data packet with the new values buffer - if valuesCap != cap(paramValues) { - data = append(data[:pos], paramValues...) - if err = mc.buf.store(data); err != nil { - errLog.Print(err) - return errBadConnNoWrite - } - } - - pos += len(paramValues) - data = data[:pos] - } - - return mc.writePacket(data) -} - -func (mc *mysqlConn) discardResults() error { - for mc.status&statusMoreResultsExists != 0 { - resLen, err := mc.readResultSetHeaderPacket() - if err != nil { - return err - } - if resLen > 0 { - // columns - if err := mc.readUntilEOF(); err != nil { - return err - } - // rows - if err := mc.readUntilEOF(); err != nil { - return err - } - } - } - return nil -} - -// http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html -func (rows *binaryRows) readRow(dest []driver.Value) error { - data, err := rows.mc.readPacket() - if err != nil { - return err - } - - // packet indicator [1 byte] - if data[0] != iOK { - // EOF Packet - if data[0] == iEOF && len(data) == 5 { - rows.mc.status = readStatus(data[3:]) - rows.rs.done = true - if !rows.HasNextResultSet() { - rows.mc = nil - } - return io.EOF - } - mc := rows.mc - rows.mc = nil - - // Error otherwise - return mc.handleErrorPacket(data) - } - - // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes] - pos := 1 + (len(dest)+7+2)>>3 - nullMask := data[1:pos] - - for i := range dest { - // Field is NULL - // (byte >> bit-pos) % 2 == 1 - if ((nullMask[(i+2)>>3] >> uint((i+2)&7)) & 1) == 1 { - dest[i] = nil - continue - } - - // Convert to byte-coded string - switch rows.rs.columns[i].fieldType { - case fieldTypeNULL: - dest[i] = nil - continue - - // Numeric Types - case fieldTypeTiny: - if rows.rs.columns[i].flags&flagUnsigned != 0 { - dest[i] = int64(data[pos]) - } else { - dest[i] = int64(int8(data[pos])) - } - pos++ - continue - - case fieldTypeShort, fieldTypeYear: - if rows.rs.columns[i].flags&flagUnsigned != 0 { - dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2])) - } else { - dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2]))) - } - pos += 2 - continue - - case fieldTypeInt24, fieldTypeLong: - if rows.rs.columns[i].flags&flagUnsigned != 0 { - dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4])) - } else { - dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4]))) - } - pos += 4 - continue - - case fieldTypeLongLong: - if rows.rs.columns[i].flags&flagUnsigned != 0 { - val := binary.LittleEndian.Uint64(data[pos : pos+8]) - if val > math.MaxInt64 { - dest[i] = uint64ToString(val) - } else { - dest[i] = int64(val) - } - } else { - dest[i] = int64(binary.LittleEndian.Uint64(data[pos : pos+8])) - } - pos += 8 - continue - - case fieldTypeFloat: - dest[i] = math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4])) - pos += 4 - continue - - case fieldTypeDouble: - dest[i] = math.Float64frombits(binary.LittleEndian.Uint64(data[pos : pos+8])) - pos += 8 - continue - - // Length coded Binary Strings - case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, - fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, - fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, - fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON: - var isNull bool - var n int - dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) - pos += n - if err == nil { - if !isNull { - continue - } else { - dest[i] = nil - continue - } - } - return err - - case - fieldTypeDate, fieldTypeNewDate, // Date YYYY-MM-DD - fieldTypeTime, // Time [-][H]HH:MM:SS[.fractal] - fieldTypeTimestamp, fieldTypeDateTime: // Timestamp YYYY-MM-DD HH:MM:SS[.fractal] - - num, isNull, n := readLengthEncodedInteger(data[pos:]) - pos += n - - switch { - case isNull: - dest[i] = nil - continue - case rows.rs.columns[i].fieldType == fieldTypeTime: - // database/sql does not support an equivalent to TIME, return a string - var dstlen uint8 - switch decimals := rows.rs.columns[i].decimals; decimals { - case 0x00, 0x1f: - dstlen = 8 - case 1, 2, 3, 4, 5, 6: - dstlen = 8 + 1 + decimals - default: - return fmt.Errorf( - "protocol error, illegal decimals value %d", - rows.rs.columns[i].decimals, - ) - } - dest[i], err = formatBinaryTime(data[pos:pos+int(num)], dstlen) - case rows.mc.parseTime: - dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc) - default: - var dstlen uint8 - if rows.rs.columns[i].fieldType == fieldTypeDate { - dstlen = 10 - } else { - switch decimals := rows.rs.columns[i].decimals; decimals { - case 0x00, 0x1f: - dstlen = 19 - case 1, 2, 3, 4, 5, 6: - dstlen = 19 + 1 + decimals - default: - return fmt.Errorf( - "protocol error, illegal decimals value %d", - rows.rs.columns[i].decimals, - ) - } - } - dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen) - } - - if err == nil { - pos += int(num) - continue - } else { - return err - } - - // Please report if this happens! - default: - return fmt.Errorf("unknown field type %d", rows.rs.columns[i].fieldType) - } - } - - return nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/result.go b/vendor/github.com/go-sql-driver/mysql/result.go deleted file mode 100644 index c6438d0..0000000 --- a/vendor/github.com/go-sql-driver/mysql/result.go +++ /dev/null @@ -1,22 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -type mysqlResult struct { - affectedRows int64 - insertId int64 -} - -func (res *mysqlResult) LastInsertId() (int64, error) { - return res.insertId, nil -} - -func (res *mysqlResult) RowsAffected() (int64, error) { - return res.affectedRows, nil -} diff --git a/vendor/github.com/go-sql-driver/mysql/rows.go b/vendor/github.com/go-sql-driver/mysql/rows.go deleted file mode 100644 index 888bdb5..0000000 --- a/vendor/github.com/go-sql-driver/mysql/rows.go +++ /dev/null @@ -1,223 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql/driver" - "io" - "math" - "reflect" -) - -type resultSet struct { - columns []mysqlField - columnNames []string - done bool -} - -type mysqlRows struct { - mc *mysqlConn - rs resultSet - finish func() -} - -type binaryRows struct { - mysqlRows -} - -type textRows struct { - mysqlRows -} - -func (rows *mysqlRows) Columns() []string { - if rows.rs.columnNames != nil { - return rows.rs.columnNames - } - - columns := make([]string, len(rows.rs.columns)) - if rows.mc != nil && rows.mc.cfg.ColumnsWithAlias { - for i := range columns { - if tableName := rows.rs.columns[i].tableName; len(tableName) > 0 { - columns[i] = tableName + "." + rows.rs.columns[i].name - } else { - columns[i] = rows.rs.columns[i].name - } - } - } else { - for i := range columns { - columns[i] = rows.rs.columns[i].name - } - } - - rows.rs.columnNames = columns - return columns -} - -func (rows *mysqlRows) ColumnTypeDatabaseTypeName(i int) string { - return rows.rs.columns[i].typeDatabaseName() -} - -// func (rows *mysqlRows) ColumnTypeLength(i int) (length int64, ok bool) { -// return int64(rows.rs.columns[i].length), true -// } - -func (rows *mysqlRows) ColumnTypeNullable(i int) (nullable, ok bool) { - return rows.rs.columns[i].flags&flagNotNULL == 0, true -} - -func (rows *mysqlRows) ColumnTypePrecisionScale(i int) (int64, int64, bool) { - column := rows.rs.columns[i] - decimals := int64(column.decimals) - - switch column.fieldType { - case fieldTypeDecimal, fieldTypeNewDecimal: - if decimals > 0 { - return int64(column.length) - 2, decimals, true - } - return int64(column.length) - 1, decimals, true - case fieldTypeTimestamp, fieldTypeDateTime, fieldTypeTime: - return decimals, decimals, true - case fieldTypeFloat, fieldTypeDouble: - if decimals == 0x1f { - return math.MaxInt64, math.MaxInt64, true - } - return math.MaxInt64, decimals, true - } - - return 0, 0, false -} - -func (rows *mysqlRows) ColumnTypeScanType(i int) reflect.Type { - return rows.rs.columns[i].scanType() -} - -func (rows *mysqlRows) Close() (err error) { - if f := rows.finish; f != nil { - f() - rows.finish = nil - } - - mc := rows.mc - if mc == nil { - return nil - } - if err := mc.error(); err != nil { - return err - } - - // flip the buffer for this connection if we need to drain it. - // note that for a successful query (i.e. one where rows.next() - // has been called until it returns false), `rows.mc` will be nil - // by the time the user calls `(*Rows).Close`, so we won't reach this - // see: https://github.com/golang/go/commit/651ddbdb5056ded455f47f9c494c67b389622a47 - mc.buf.flip() - - // Remove unread packets from stream - if !rows.rs.done { - err = mc.readUntilEOF() - } - if err == nil { - if err = mc.discardResults(); err != nil { - return err - } - } - - rows.mc = nil - return err -} - -func (rows *mysqlRows) HasNextResultSet() (b bool) { - if rows.mc == nil { - return false - } - return rows.mc.status&statusMoreResultsExists != 0 -} - -func (rows *mysqlRows) nextResultSet() (int, error) { - if rows.mc == nil { - return 0, io.EOF - } - if err := rows.mc.error(); err != nil { - return 0, err - } - - // Remove unread packets from stream - if !rows.rs.done { - if err := rows.mc.readUntilEOF(); err != nil { - return 0, err - } - rows.rs.done = true - } - - if !rows.HasNextResultSet() { - rows.mc = nil - return 0, io.EOF - } - rows.rs = resultSet{} - return rows.mc.readResultSetHeaderPacket() -} - -func (rows *mysqlRows) nextNotEmptyResultSet() (int, error) { - for { - resLen, err := rows.nextResultSet() - if err != nil { - return 0, err - } - - if resLen > 0 { - return resLen, nil - } - - rows.rs.done = true - } -} - -func (rows *binaryRows) NextResultSet() error { - resLen, err := rows.nextNotEmptyResultSet() - if err != nil { - return err - } - - rows.rs.columns, err = rows.mc.readColumns(resLen) - return err -} - -func (rows *binaryRows) Next(dest []driver.Value) error { - if mc := rows.mc; mc != nil { - if err := mc.error(); err != nil { - return err - } - - // Fetch next row from stream - return rows.readRow(dest) - } - return io.EOF -} - -func (rows *textRows) NextResultSet() (err error) { - resLen, err := rows.nextNotEmptyResultSet() - if err != nil { - return err - } - - rows.rs.columns, err = rows.mc.readColumns(resLen) - return err -} - -func (rows *textRows) Next(dest []driver.Value) error { - if mc := rows.mc; mc != nil { - if err := mc.error(); err != nil { - return err - } - - // Fetch next row from stream - return rows.readRow(dest) - } - return io.EOF -} diff --git a/vendor/github.com/go-sql-driver/mysql/statement.go b/vendor/github.com/go-sql-driver/mysql/statement.go deleted file mode 100644 index f7e3709..0000000 --- a/vendor/github.com/go-sql-driver/mysql/statement.go +++ /dev/null @@ -1,204 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "database/sql/driver" - "fmt" - "io" - "reflect" -) - -type mysqlStmt struct { - mc *mysqlConn - id uint32 - paramCount int -} - -func (stmt *mysqlStmt) Close() error { - if stmt.mc == nil || stmt.mc.closed.IsSet() { - // driver.Stmt.Close can be called more than once, thus this function - // has to be idempotent. - // See also Issue #450 and golang/go#16019. - //errLog.Print(ErrInvalidConn) - return driver.ErrBadConn - } - - err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id) - stmt.mc = nil - return err -} - -func (stmt *mysqlStmt) NumInput() int { - return stmt.paramCount -} - -func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter { - return converter{} -} - -func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { - if stmt.mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - // Send command - err := stmt.writeExecutePacket(args) - if err != nil { - return nil, stmt.mc.markBadConn(err) - } - - mc := stmt.mc - - mc.affectedRows = 0 - mc.insertId = 0 - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err != nil { - return nil, err - } - - if resLen > 0 { - // Columns - if err = mc.readUntilEOF(); err != nil { - return nil, err - } - - // Rows - if err := mc.readUntilEOF(); err != nil { - return nil, err - } - } - - if err := mc.discardResults(); err != nil { - return nil, err - } - - return &mysqlResult{ - affectedRows: int64(mc.affectedRows), - insertId: int64(mc.insertId), - }, nil -} - -func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { - return stmt.query(args) -} - -func (stmt *mysqlStmt) query(args []driver.Value) (*binaryRows, error) { - if stmt.mc.closed.IsSet() { - errLog.Print(ErrInvalidConn) - return nil, driver.ErrBadConn - } - // Send command - err := stmt.writeExecutePacket(args) - if err != nil { - return nil, stmt.mc.markBadConn(err) - } - - mc := stmt.mc - - // Read Result - resLen, err := mc.readResultSetHeaderPacket() - if err != nil { - return nil, err - } - - rows := new(binaryRows) - - if resLen > 0 { - rows.mc = mc - rows.rs.columns, err = mc.readColumns(resLen) - } else { - rows.rs.done = true - - switch err := rows.NextResultSet(); err { - case nil, io.EOF: - return rows, nil - default: - return nil, err - } - } - - return rows, err -} - -type converter struct{} - -// ConvertValue mirrors the reference/default converter in database/sql/driver -// with _one_ exception. We support uint64 with their high bit and the default -// implementation does not. This function should be kept in sync with -// database/sql/driver defaultConverter.ConvertValue() except for that -// deliberate difference. -func (c converter) ConvertValue(v interface{}) (driver.Value, error) { - if driver.IsValue(v) { - return v, nil - } - - if vr, ok := v.(driver.Valuer); ok { - sv, err := callValuerValue(vr) - if err != nil { - return nil, err - } - if !driver.IsValue(sv) { - return nil, fmt.Errorf("non-Value type %T returned from Value", sv) - } - return sv, nil - } - - rv := reflect.ValueOf(v) - switch rv.Kind() { - case reflect.Ptr: - // indirect pointers - if rv.IsNil() { - return nil, nil - } else { - return c.ConvertValue(rv.Elem().Interface()) - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return rv.Int(), nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return rv.Uint(), nil - case reflect.Float32, reflect.Float64: - return rv.Float(), nil - case reflect.Bool: - return rv.Bool(), nil - case reflect.Slice: - ek := rv.Type().Elem().Kind() - if ek == reflect.Uint8 { - return rv.Bytes(), nil - } - return nil, fmt.Errorf("unsupported type %T, a slice of %s", v, ek) - case reflect.String: - return rv.String(), nil - } - return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind()) -} - -var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() - -// callValuerValue returns vr.Value(), with one exception: -// If vr.Value is an auto-generated method on a pointer type and the -// pointer is nil, it would panic at runtime in the panicwrap -// method. Treat it like nil instead. -// -// This is so people can implement driver.Value on value types and -// still use nil pointers to those types to mean nil/NULL, just like -// string/*string. -// -// This is an exact copy of the same-named unexported function from the -// database/sql package. -func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { - if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && - rv.IsNil() && - rv.Type().Elem().Implements(valuerReflectType) { - return nil, nil - } - return vr.Value() -} diff --git a/vendor/github.com/go-sql-driver/mysql/transaction.go b/vendor/github.com/go-sql-driver/mysql/transaction.go deleted file mode 100644 index 417d727..0000000 --- a/vendor/github.com/go-sql-driver/mysql/transaction.go +++ /dev/null @@ -1,31 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -type mysqlTx struct { - mc *mysqlConn -} - -func (tx *mysqlTx) Commit() (err error) { - if tx.mc == nil || tx.mc.closed.IsSet() { - return ErrInvalidConn - } - err = tx.mc.exec("COMMIT") - tx.mc = nil - return -} - -func (tx *mysqlTx) Rollback() (err error) { - if tx.mc == nil || tx.mc.closed.IsSet() { - return ErrInvalidConn - } - err = tx.mc.exec("ROLLBACK") - tx.mc = nil - return -} diff --git a/vendor/github.com/go-sql-driver/mysql/utils.go b/vendor/github.com/go-sql-driver/mysql/utils.go deleted file mode 100644 index 9552e80..0000000 --- a/vendor/github.com/go-sql-driver/mysql/utils.go +++ /dev/null @@ -1,701 +0,0 @@ -// Go MySQL Driver - A MySQL-Driver for Go's database/sql package -// -// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at http://mozilla.org/MPL/2.0/. - -package mysql - -import ( - "crypto/tls" - "database/sql" - "database/sql/driver" - "encoding/binary" - "errors" - "fmt" - "io" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" -) - -// Registry for custom tls.Configs -var ( - tlsConfigLock sync.RWMutex - tlsConfigRegistry map[string]*tls.Config -) - -// RegisterTLSConfig registers a custom tls.Config to be used with sql.Open. -// Use the key as a value in the DSN where tls=value. -// -// Note: The provided tls.Config is exclusively owned by the driver after -// registering it. -// -// rootCertPool := x509.NewCertPool() -// pem, err := ioutil.ReadFile("/path/ca-cert.pem") -// if err != nil { -// log.Fatal(err) -// } -// if ok := rootCertPool.AppendCertsFromPEM(pem); !ok { -// log.Fatal("Failed to append PEM.") -// } -// clientCert := make([]tls.Certificate, 0, 1) -// certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem") -// if err != nil { -// log.Fatal(err) -// } -// clientCert = append(clientCert, certs) -// mysql.RegisterTLSConfig("custom", &tls.Config{ -// RootCAs: rootCertPool, -// Certificates: clientCert, -// }) -// db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom") -// -func RegisterTLSConfig(key string, config *tls.Config) error { - if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" || strings.ToLower(key) == "preferred" { - return fmt.Errorf("key '%s' is reserved", key) - } - - tlsConfigLock.Lock() - if tlsConfigRegistry == nil { - tlsConfigRegistry = make(map[string]*tls.Config) - } - - tlsConfigRegistry[key] = config - tlsConfigLock.Unlock() - return nil -} - -// DeregisterTLSConfig removes the tls.Config associated with key. -func DeregisterTLSConfig(key string) { - tlsConfigLock.Lock() - if tlsConfigRegistry != nil { - delete(tlsConfigRegistry, key) - } - tlsConfigLock.Unlock() -} - -func getTLSConfigClone(key string) (config *tls.Config) { - tlsConfigLock.RLock() - if v, ok := tlsConfigRegistry[key]; ok { - config = v.Clone() - } - tlsConfigLock.RUnlock() - return -} - -// Returns the bool value of the input. -// The 2nd return value indicates if the input was a valid bool value -func readBool(input string) (value bool, valid bool) { - switch input { - case "1", "true", "TRUE", "True": - return true, true - case "0", "false", "FALSE", "False": - return false, true - } - - // Not a valid bool value - return -} - -/****************************************************************************** -* Time related utils * -******************************************************************************/ - -func parseDateTime(str string, loc *time.Location) (t time.Time, err error) { - base := "0000-00-00 00:00:00.0000000" - switch len(str) { - case 10, 19, 21, 22, 23, 24, 25, 26: // up to "YYYY-MM-DD HH:MM:SS.MMMMMM" - if str == base[:len(str)] { - return - } - t, err = time.Parse(timeFormat[:len(str)], str) - default: - err = fmt.Errorf("invalid time string: %s", str) - return - } - - // Adjust location - if err == nil && loc != time.UTC { - y, mo, d := t.Date() - h, mi, s := t.Clock() - t, err = time.Date(y, mo, d, h, mi, s, t.Nanosecond(), loc), nil - } - - return -} - -func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Value, error) { - switch num { - case 0: - return time.Time{}, nil - case 4: - return time.Date( - int(binary.LittleEndian.Uint16(data[:2])), // year - time.Month(data[2]), // month - int(data[3]), // day - 0, 0, 0, 0, - loc, - ), nil - case 7: - return time.Date( - int(binary.LittleEndian.Uint16(data[:2])), // year - time.Month(data[2]), // month - int(data[3]), // day - int(data[4]), // hour - int(data[5]), // minutes - int(data[6]), // seconds - 0, - loc, - ), nil - case 11: - return time.Date( - int(binary.LittleEndian.Uint16(data[:2])), // year - time.Month(data[2]), // month - int(data[3]), // day - int(data[4]), // hour - int(data[5]), // minutes - int(data[6]), // seconds - int(binary.LittleEndian.Uint32(data[7:11]))*1000, // nanoseconds - loc, - ), nil - } - return nil, fmt.Errorf("invalid DATETIME packet length %d", num) -} - -// zeroDateTime is used in formatBinaryDateTime to avoid an allocation -// if the DATE or DATETIME has the zero value. -// It must never be changed. -// The current behavior depends on database/sql copying the result. -var zeroDateTime = []byte("0000-00-00 00:00:00.000000") - -const digits01 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" -const digits10 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - -func appendMicrosecs(dst, src []byte, decimals int) []byte { - if decimals <= 0 { - return dst - } - if len(src) == 0 { - return append(dst, ".000000"[:decimals+1]...) - } - - microsecs := binary.LittleEndian.Uint32(src[:4]) - p1 := byte(microsecs / 10000) - microsecs -= 10000 * uint32(p1) - p2 := byte(microsecs / 100) - microsecs -= 100 * uint32(p2) - p3 := byte(microsecs) - - switch decimals { - default: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], digits01[p2], - digits10[p3], digits01[p3], - ) - case 1: - return append(dst, '.', - digits10[p1], - ) - case 2: - return append(dst, '.', - digits10[p1], digits01[p1], - ) - case 3: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], - ) - case 4: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], digits01[p2], - ) - case 5: - return append(dst, '.', - digits10[p1], digits01[p1], - digits10[p2], digits01[p2], - digits10[p3], - ) - } -} - -func formatBinaryDateTime(src []byte, length uint8) (driver.Value, error) { - // length expects the deterministic length of the zero value, - // negative time and 100+ hours are automatically added if needed - if len(src) == 0 { - return zeroDateTime[:length], nil - } - var dst []byte // return value - var p1, p2, p3 byte // current digit pair - - switch length { - case 10, 19, 21, 22, 23, 24, 25, 26: - default: - t := "DATE" - if length > 10 { - t += "TIME" - } - return nil, fmt.Errorf("illegal %s length %d", t, length) - } - switch len(src) { - case 4, 7, 11: - default: - t := "DATE" - if length > 10 { - t += "TIME" - } - return nil, fmt.Errorf("illegal %s packet length %d", t, len(src)) - } - dst = make([]byte, 0, length) - // start with the date - year := binary.LittleEndian.Uint16(src[:2]) - pt := year / 100 - p1 = byte(year - 100*uint16(pt)) - p2, p3 = src[2], src[3] - dst = append(dst, - digits10[pt], digits01[pt], - digits10[p1], digits01[p1], '-', - digits10[p2], digits01[p2], '-', - digits10[p3], digits01[p3], - ) - if length == 10 { - return dst, nil - } - if len(src) == 4 { - return append(dst, zeroDateTime[10:length]...), nil - } - dst = append(dst, ' ') - p1 = src[4] // hour - src = src[5:] - - // p1 is 2-digit hour, src is after hour - p2, p3 = src[0], src[1] - dst = append(dst, - digits10[p1], digits01[p1], ':', - digits10[p2], digits01[p2], ':', - digits10[p3], digits01[p3], - ) - return appendMicrosecs(dst, src[2:], int(length)-20), nil -} - -func formatBinaryTime(src []byte, length uint8) (driver.Value, error) { - // length expects the deterministic length of the zero value, - // negative time and 100+ hours are automatically added if needed - if len(src) == 0 { - return zeroDateTime[11 : 11+length], nil - } - var dst []byte // return value - - switch length { - case - 8, // time (can be up to 10 when negative and 100+ hours) - 10, 11, 12, 13, 14, 15: // time with fractional seconds - default: - return nil, fmt.Errorf("illegal TIME length %d", length) - } - switch len(src) { - case 8, 12: - default: - return nil, fmt.Errorf("invalid TIME packet length %d", len(src)) - } - // +2 to enable negative time and 100+ hours - dst = make([]byte, 0, length+2) - if src[0] == 1 { - dst = append(dst, '-') - } - days := binary.LittleEndian.Uint32(src[1:5]) - hours := int64(days)*24 + int64(src[5]) - - if hours >= 100 { - dst = strconv.AppendInt(dst, hours, 10) - } else { - dst = append(dst, digits10[hours], digits01[hours]) - } - - min, sec := src[6], src[7] - dst = append(dst, ':', - digits10[min], digits01[min], ':', - digits10[sec], digits01[sec], - ) - return appendMicrosecs(dst, src[8:], int(length)-9), nil -} - -/****************************************************************************** -* Convert from and to bytes * -******************************************************************************/ - -func uint64ToBytes(n uint64) []byte { - return []byte{ - byte(n), - byte(n >> 8), - byte(n >> 16), - byte(n >> 24), - byte(n >> 32), - byte(n >> 40), - byte(n >> 48), - byte(n >> 56), - } -} - -func uint64ToString(n uint64) []byte { - var a [20]byte - i := 20 - - // U+0030 = 0 - // ... - // U+0039 = 9 - - var q uint64 - for n >= 10 { - i-- - q = n / 10 - a[i] = uint8(n-q*10) + 0x30 - n = q - } - - i-- - a[i] = uint8(n) + 0x30 - - return a[i:] -} - -// treats string value as unsigned integer representation -func stringToInt(b []byte) int { - val := 0 - for i := range b { - val *= 10 - val += int(b[i] - 0x30) - } - return val -} - -// returns the string read as a bytes slice, wheter the value is NULL, -// the number of bytes read and an error, in case the string is longer than -// the input slice -func readLengthEncodedString(b []byte) ([]byte, bool, int, error) { - // Get length - num, isNull, n := readLengthEncodedInteger(b) - if num < 1 { - return b[n:n], isNull, n, nil - } - - n += int(num) - - // Check data length - if len(b) >= n { - return b[n-int(num) : n : n], false, n, nil - } - return nil, false, n, io.EOF -} - -// returns the number of bytes skipped and an error, in case the string is -// longer than the input slice -func skipLengthEncodedString(b []byte) (int, error) { - // Get length - num, _, n := readLengthEncodedInteger(b) - if num < 1 { - return n, nil - } - - n += int(num) - - // Check data length - if len(b) >= n { - return n, nil - } - return n, io.EOF -} - -// returns the number read, whether the value is NULL and the number of bytes read -func readLengthEncodedInteger(b []byte) (uint64, bool, int) { - // See issue #349 - if len(b) == 0 { - return 0, true, 1 - } - - switch b[0] { - // 251: NULL - case 0xfb: - return 0, true, 1 - - // 252: value of following 2 - case 0xfc: - return uint64(b[1]) | uint64(b[2])<<8, false, 3 - - // 253: value of following 3 - case 0xfd: - return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16, false, 4 - - // 254: value of following 8 - case 0xfe: - return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 | - uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 | - uint64(b[7])<<48 | uint64(b[8])<<56, - false, 9 - } - - // 0-250: value of first byte - return uint64(b[0]), false, 1 -} - -// encodes a uint64 value and appends it to the given bytes slice -func appendLengthEncodedInteger(b []byte, n uint64) []byte { - switch { - case n <= 250: - return append(b, byte(n)) - - case n <= 0xffff: - return append(b, 0xfc, byte(n), byte(n>>8)) - - case n <= 0xffffff: - return append(b, 0xfd, byte(n), byte(n>>8), byte(n>>16)) - } - return append(b, 0xfe, byte(n), byte(n>>8), byte(n>>16), byte(n>>24), - byte(n>>32), byte(n>>40), byte(n>>48), byte(n>>56)) -} - -// reserveBuffer checks cap(buf) and expand buffer to len(buf) + appendSize. -// If cap(buf) is not enough, reallocate new buffer. -func reserveBuffer(buf []byte, appendSize int) []byte { - newSize := len(buf) + appendSize - if cap(buf) < newSize { - // Grow buffer exponentially - newBuf := make([]byte, len(buf)*2+appendSize) - copy(newBuf, buf) - buf = newBuf - } - return buf[:newSize] -} - -// escapeBytesBackslash escapes []byte with backslashes (\) -// This escapes the contents of a string (provided as []byte) by adding backslashes before special -// characters, and turning others into specific escape sequences, such as -// turning newlines into \n and null bytes into \0. -// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L823-L932 -func escapeBytesBackslash(buf, v []byte) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for _, c := range v { - switch c { - case '\x00': - buf[pos] = '\\' - buf[pos+1] = '0' - pos += 2 - case '\n': - buf[pos] = '\\' - buf[pos+1] = 'n' - pos += 2 - case '\r': - buf[pos] = '\\' - buf[pos+1] = 'r' - pos += 2 - case '\x1a': - buf[pos] = '\\' - buf[pos+1] = 'Z' - pos += 2 - case '\'': - buf[pos] = '\\' - buf[pos+1] = '\'' - pos += 2 - case '"': - buf[pos] = '\\' - buf[pos+1] = '"' - pos += 2 - case '\\': - buf[pos] = '\\' - buf[pos+1] = '\\' - pos += 2 - default: - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} - -// escapeStringBackslash is similar to escapeBytesBackslash but for string. -func escapeStringBackslash(buf []byte, v string) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for i := 0; i < len(v); i++ { - c := v[i] - switch c { - case '\x00': - buf[pos] = '\\' - buf[pos+1] = '0' - pos += 2 - case '\n': - buf[pos] = '\\' - buf[pos+1] = 'n' - pos += 2 - case '\r': - buf[pos] = '\\' - buf[pos+1] = 'r' - pos += 2 - case '\x1a': - buf[pos] = '\\' - buf[pos+1] = 'Z' - pos += 2 - case '\'': - buf[pos] = '\\' - buf[pos+1] = '\'' - pos += 2 - case '"': - buf[pos] = '\\' - buf[pos+1] = '"' - pos += 2 - case '\\': - buf[pos] = '\\' - buf[pos+1] = '\\' - pos += 2 - default: - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} - -// escapeBytesQuotes escapes apostrophes in []byte by doubling them up. -// This escapes the contents of a string by doubling up any apostrophes that -// it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in -// effect on the server. -// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L963-L1038 -func escapeBytesQuotes(buf, v []byte) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for _, c := range v { - if c == '\'' { - buf[pos] = '\'' - buf[pos+1] = '\'' - pos += 2 - } else { - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} - -// escapeStringQuotes is similar to escapeBytesQuotes but for string. -func escapeStringQuotes(buf []byte, v string) []byte { - pos := len(buf) - buf = reserveBuffer(buf, len(v)*2) - - for i := 0; i < len(v); i++ { - c := v[i] - if c == '\'' { - buf[pos] = '\'' - buf[pos+1] = '\'' - pos += 2 - } else { - buf[pos] = c - pos++ - } - } - - return buf[:pos] -} - -/****************************************************************************** -* Sync utils * -******************************************************************************/ - -// noCopy may be embedded into structs which must not be copied -// after the first use. -// -// See https://github.com/golang/go/issues/8005#issuecomment-190753527 -// for details. -type noCopy struct{} - -// Lock is a no-op used by -copylocks checker from `go vet`. -func (*noCopy) Lock() {} - -// atomicBool is a wrapper around uint32 for usage as a boolean value with -// atomic access. -type atomicBool struct { - _noCopy noCopy - value uint32 -} - -// IsSet returns whether the current boolean value is true -func (ab *atomicBool) IsSet() bool { - return atomic.LoadUint32(&ab.value) > 0 -} - -// Set sets the value of the bool regardless of the previous value -func (ab *atomicBool) Set(value bool) { - if value { - atomic.StoreUint32(&ab.value, 1) - } else { - atomic.StoreUint32(&ab.value, 0) - } -} - -// TrySet sets the value of the bool and returns whether the value changed -func (ab *atomicBool) TrySet(value bool) bool { - if value { - return atomic.SwapUint32(&ab.value, 1) == 0 - } - return atomic.SwapUint32(&ab.value, 0) > 0 -} - -// atomicError is a wrapper for atomically accessed error values -type atomicError struct { - _noCopy noCopy - value atomic.Value -} - -// Set sets the error value regardless of the previous value. -// The value must not be nil -func (ae *atomicError) Set(value error) { - ae.value.Store(value) -} - -// Value returns the current error value -func (ae *atomicError) Value() error { - if v := ae.value.Load(); v != nil { - // this will panic if the value doesn't implement the error interface - return v.(error) - } - return nil -} - -func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { - dargs := make([]driver.Value, len(named)) - for n, param := range named { - if len(param.Name) > 0 { - // TODO: support the use of Named Parameters #561 - return nil, errors.New("mysql: driver does not support the use of Named Parameters") - } - dargs[n] = param.Value - } - return dargs, nil -} - -func mapIsolationLevel(level driver.IsolationLevel) (string, error) { - switch sql.IsolationLevel(level) { - case sql.LevelRepeatableRead: - return "REPEATABLE READ", nil - case sql.LevelReadCommitted: - return "READ COMMITTED", nil - case sql.LevelReadUncommitted: - return "READ UNCOMMITTED", nil - case sql.LevelSerializable: - return "SERIALIZABLE", nil - default: - return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) - } -} diff --git a/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/golang/protobuf/AUTHORS deleted file mode 100644 index 15167cd..0000000 --- a/vendor/github.com/golang/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/golang/protobuf/CONTRIBUTORS b/vendor/github.com/golang/protobuf/CONTRIBUTORS deleted file mode 100644 index 1c4577e..0000000 --- a/vendor/github.com/golang/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 0f64693..0000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go deleted file mode 100644 index 3cd3249..0000000 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ /dev/null @@ -1,253 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer deep copy and merge. -// TODO: RawMessage. - -package proto - -import ( - "fmt" - "log" - "reflect" - "strings" -) - -// Clone returns a deep copy of a protocol buffer. -func Clone(src Message) Message { - in := reflect.ValueOf(src) - if in.IsNil() { - return src - } - out := reflect.New(in.Type().Elem()) - dst := out.Interface().(Message) - Merge(dst, src) - return dst -} - -// Merger is the interface representing objects that can merge messages of the same type. -type Merger interface { - // Merge merges src into this message. - // Required and optional fields that are set in src will be set to that value in dst. - // Elements of repeated fields will be appended. - // - // Merge may panic if called with a different argument type than the receiver. - Merge(src Message) -} - -// generatedMerger is the custom merge method that generated protos will have. -// We must add this method since a generate Merge method will conflict with -// many existing protos that have a Merge data field already defined. -type generatedMerger interface { - XXX_Merge(src Message) -} - -// Merge merges src into dst. -// Required and optional fields that are set in src will be set to that value in dst. -// Elements of repeated fields will be appended. -// Merge panics if src and dst are not the same type, or if dst is nil. -func Merge(dst, src Message) { - if m, ok := dst.(Merger); ok { - m.Merge(src) - return - } - - in := reflect.ValueOf(src) - out := reflect.ValueOf(dst) - if out.IsNil() { - panic("proto: nil destination") - } - if in.Type() != out.Type() { - panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) - } - if in.IsNil() { - return // Merge from nil src is a noop - } - if m, ok := dst.(generatedMerger); ok { - m.XXX_Merge(src) - return - } - mergeStruct(out.Elem(), in.Elem()) -} - -func mergeStruct(out, in reflect.Value) { - sprop := GetProperties(in.Type()) - for i := 0; i < in.NumField(); i++ { - f := in.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) - } - - if emIn, err := extendable(in.Addr().Interface()); err == nil { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - uf := in.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return - } - uin := uf.Bytes() - if len(uin) > 0 { - out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) - } -} - -// mergeAny performs a merge between two values of the same type. -// viaPtr indicates whether the values were indirected through a pointer (implying proto2). -// prop is set if this is a struct field (it may be nil). -func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { - if in.Type() == protoMessageType { - if !in.IsNil() { - if out.IsNil() { - out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) - } else { - Merge(out.Interface().(Message), in.Interface().(Message)) - } - } - return - } - switch in.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - if !viaPtr && isProto3Zero(in) { - return - } - out.Set(in) - case reflect.Interface: - // Probably a oneof field; copy non-nil values. - if in.IsNil() { - return - } - // Allocate destination if it is not set, or set to a different type. - // Otherwise we will merge as normal. - if out.IsNil() || out.Elem().Type() != in.Elem().Type() { - out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) - } - mergeAny(out.Elem(), in.Elem(), false, nil) - case reflect.Map: - if in.Len() == 0 { - return - } - if out.IsNil() { - out.Set(reflect.MakeMap(in.Type())) - } - // For maps with value types of *T or []byte we need to deep copy each value. - elemKind := in.Type().Elem().Kind() - for _, key := range in.MapKeys() { - var val reflect.Value - switch elemKind { - case reflect.Ptr: - val = reflect.New(in.Type().Elem().Elem()) - mergeAny(val, in.MapIndex(key), false, nil) - case reflect.Slice: - val = in.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - default: - val = in.MapIndex(key) - } - out.SetMapIndex(key, val) - } - case reflect.Ptr: - if in.IsNil() { - return - } - if out.IsNil() { - out.Set(reflect.New(in.Elem().Type())) - } - mergeAny(out.Elem(), in.Elem(), true, nil) - case reflect.Slice: - if in.IsNil() { - return - } - if in.Type().Elem().Kind() == reflect.Uint8 { - // []byte is a scalar bytes field, not a repeated field. - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value, and should not - // be merged. - if prop != nil && prop.proto3 && in.Len() == 0 { - return - } - - // Make a deep copy. - // Append to []byte{} instead of []byte(nil) so that we never end up - // with a nil result. - out.SetBytes(append([]byte{}, in.Bytes()...)) - return - } - n := in.Len() - if out.IsNil() { - out.Set(reflect.MakeSlice(in.Type(), 0, n)) - } - switch in.Type().Elem().Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(reflect.AppendSlice(out, in)) - default: - for i := 0; i < n; i++ { - x := reflect.Indirect(reflect.New(in.Type().Elem())) - mergeAny(x, in.Index(i), false, nil) - out.Set(reflect.Append(out, x)) - } - } - case reflect.Struct: - mergeStruct(out, in) - default: - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to copy %v", in) - } -} - -func mergeExtension(out, in map[int32]Extension) { - for extNum, eIn := range in { - eOut := Extension{desc: eIn.desc} - if eIn.value != nil { - v := reflect.New(reflect.TypeOf(eIn.value)).Elem() - mergeAny(v, reflect.ValueOf(eIn.value), false, nil) - eOut.value = v.Interface() - } - if eIn.enc != nil { - eOut.enc = make([]byte, len(eIn.enc)) - copy(eOut.enc, eIn.enc) - } - - out[extNum] = eOut - } -} diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go deleted file mode 100644 index 63b0f08..0000000 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ /dev/null @@ -1,427 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for decoding protocol buffer data to construct in-memory representations. - */ - -import ( - "errors" - "fmt" - "io" -) - -// errOverflow is returned when an integer is too large to be represented. -var errOverflow = errors.New("proto: integer overflow") - -// ErrInternalBadWireType is returned by generated code when an incorrect -// wire type is encountered. It does not get returned to user code. -var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") - -// DecodeVarint reads a varint-encoded integer from the slice. -// It returns the integer and the number of bytes consumed, or -// zero if there is not enough. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func DecodeVarint(buf []byte) (x uint64, n int) { - for shift := uint(0); shift < 64; shift += 7 { - if n >= len(buf) { - return 0, 0 - } - b := uint64(buf[n]) - n++ - x |= (b & 0x7F) << shift - if (b & 0x80) == 0 { - return x, n - } - } - - // The number is too large to represent in a 64-bit value. - return 0, 0 -} - -func (p *Buffer) decodeVarintSlow() (x uint64, err error) { - i := p.index - l := len(p.buf) - - for shift := uint(0); shift < 64; shift += 7 { - if i >= l { - err = io.ErrUnexpectedEOF - return - } - b := p.buf[i] - i++ - x |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - p.index = i - return - } - } - - // The number is too large to represent in a 64-bit value. - err = errOverflow - return -} - -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - i := p.index - buf := p.buf - - if i >= len(buf) { - return 0, io.ErrUnexpectedEOF - } else if buf[i] < 0x80 { - p.index++ - return uint64(buf[i]), nil - } else if len(buf)-i < 10 { - return p.decodeVarintSlow() - } - - var b uint64 - // we already checked the first byte - x = uint64(buf[i]) - 0x80 - i++ - - b = uint64(buf[i]) - i++ - x += b << 7 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 7 - - b = uint64(buf[i]) - i++ - x += b << 14 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 14 - - b = uint64(buf[i]) - i++ - x += b << 21 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 21 - - b = uint64(buf[i]) - i++ - x += b << 28 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 28 - - b = uint64(buf[i]) - i++ - x += b << 35 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 35 - - b = uint64(buf[i]) - i++ - x += b << 42 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 42 - - b = uint64(buf[i]) - i++ - x += b << 49 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 49 - - b = uint64(buf[i]) - i++ - x += b << 56 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 56 - - b = uint64(buf[i]) - i++ - x += b << 63 - if b&0x80 == 0 { - goto done - } - - return 0, errOverflow - -done: - p.index = i - return x, nil -} - -// DecodeFixed64 reads a 64-bit integer from the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) DecodeFixed64() (x uint64, err error) { - // x, err already 0 - i := p.index + 8 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-8]) - x |= uint64(p.buf[i-7]) << 8 - x |= uint64(p.buf[i-6]) << 16 - x |= uint64(p.buf[i-5]) << 24 - x |= uint64(p.buf[i-4]) << 32 - x |= uint64(p.buf[i-3]) << 40 - x |= uint64(p.buf[i-2]) << 48 - x |= uint64(p.buf[i-1]) << 56 - return -} - -// DecodeFixed32 reads a 32-bit integer from the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) DecodeFixed32() (x uint64, err error) { - // x, err already 0 - i := p.index + 4 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-4]) - x |= uint64(p.buf[i-3]) << 8 - x |= uint64(p.buf[i-2]) << 16 - x |= uint64(p.buf[i-1]) << 24 - return -} - -// DecodeZigzag64 reads a zigzag-encoded 64-bit integer -// from the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) DecodeZigzag64() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) - return -} - -// DecodeZigzag32 reads a zigzag-encoded 32-bit integer -// from the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) DecodeZigzag32() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) - return -} - -// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { - n, err := p.DecodeVarint() - if err != nil { - return nil, err - } - - nb := int(n) - if nb < 0 { - return nil, fmt.Errorf("proto: bad byte length %d", nb) - } - end := p.index + nb - if end < p.index || end > len(p.buf) { - return nil, io.ErrUnexpectedEOF - } - - if !alloc { - // todo: check if can get more uses of alloc=false - buf = p.buf[p.index:end] - p.index += nb - return - } - - buf = make([]byte, nb) - copy(buf, p.buf[p.index:]) - p.index += nb - return -} - -// DecodeStringBytes reads an encoded string from the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) DecodeStringBytes() (s string, err error) { - buf, err := p.DecodeRawBytes(false) - if err != nil { - return - } - return string(buf), nil -} - -// Unmarshaler is the interface representing objects that can -// unmarshal themselves. The argument points to data that may be -// overwritten, so implementations should not keep references to the -// buffer. -// Unmarshal implementations should not clear the receiver. -// Any unmarshaled data should be merged into the receiver. -// Callers of Unmarshal that do not want to retain existing data -// should Reset the receiver before calling Unmarshal. -type Unmarshaler interface { - Unmarshal([]byte) error -} - -// newUnmarshaler is the interface representing objects that can -// unmarshal themselves. The semantics are identical to Unmarshaler. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newUnmarshaler interface { - XXX_Unmarshal([]byte) error -} - -// Unmarshal parses the protocol buffer representation in buf and places the -// decoded result in pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// Unmarshal resets pb before starting to unmarshal, so any -// existing data in pb is always removed. Use UnmarshalMerge -// to preserve and append to existing data. -func Unmarshal(buf []byte, pb Message) error { - pb.Reset() - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// UnmarshalMerge parses the protocol buffer representation in buf and -// writes the decoded result to pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// UnmarshalMerge merges into existing data in pb. -// Most code should use Unmarshal instead. -func UnmarshalMerge(buf []byte, pb Message) error { - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } - if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// DecodeMessage reads a count-delimited message from the Buffer. -func (p *Buffer) DecodeMessage(pb Message) error { - enc, err := p.DecodeRawBytes(false) - if err != nil { - return err - } - return NewBuffer(enc).Unmarshal(pb) -} - -// DecodeGroup reads a tag-delimited group from the Buffer. -// StartGroup tag is already consumed. This function consumes -// EndGroup tag. -func (p *Buffer) DecodeGroup(pb Message) error { - b := p.buf[p.index:] - x, y := findEndGroup(b) - if x < 0 { - return io.ErrUnexpectedEOF - } - err := Unmarshal(b[:x], pb) - p.index += y - return err -} - -// Unmarshal parses the protocol buffer representation in the -// Buffer and places the decoded result in pb. If the struct -// underlying pb does not match the data in the buffer, the results can be -// unpredictable. -// -// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. -func (p *Buffer) Unmarshal(pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(newUnmarshaler); ok { - err := u.XXX_Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 - err := u.Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - - // Slow workaround for messages that aren't Unmarshalers. - // This includes some hand-coded .pb.go files and - // bootstrap protos. - // TODO: fix all of those and then add Unmarshal to - // the Message interface. Then: - // The cast above and code below can be deleted. - // The old unmarshaler can be deleted. - // Clients can call Unmarshal directly (can already do that, actually). - var info InternalMessageInfo - err := info.Unmarshal(pb, p.buf[p.index:]) - p.index = len(p.buf) - return err -} diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go deleted file mode 100644 index 35b882c..0000000 --- a/vendor/github.com/golang/protobuf/proto/deprecated.go +++ /dev/null @@ -1,63 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2018 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import "errors" - -// Deprecated: do not use. -type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } - -// Deprecated: do not use. -func GetStats() Stats { return Stats{} } - -// Deprecated: do not use. -func MarshalMessageSet(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func UnmarshalMessageSet([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func MarshalMessageSetJSON(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func UnmarshalMessageSetJSON([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func RegisterMessageSetType(Message, int32, string) {} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go deleted file mode 100644 index dea2617..0000000 --- a/vendor/github.com/golang/protobuf/proto/discard.go +++ /dev/null @@ -1,350 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2017 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -type generatedDiscarder interface { - XXX_DiscardUnknown() -} - -// DiscardUnknown recursively discards all unknown fields from this message -// and all embedded messages. -// -// When unmarshaling a message with unrecognized fields, the tags and values -// of such fields are preserved in the Message. This allows a later call to -// marshal to be able to produce a message that continues to have those -// unrecognized fields. To avoid this, DiscardUnknown is used to -// explicitly clear the unknown fields after unmarshaling. -// -// For proto2 messages, the unknown fields of message extensions are only -// discarded from messages that have been accessed via GetExtension. -func DiscardUnknown(m Message) { - if m, ok := m.(generatedDiscarder); ok { - m.XXX_DiscardUnknown() - return - } - // TODO: Dynamically populate a InternalMessageInfo for legacy messages, - // but the master branch has no implementation for InternalMessageInfo, - // so it would be more work to replicate that approach. - discardLegacy(m) -} - -// DiscardUnknown recursively discards all unknown fields. -func (a *InternalMessageInfo) DiscardUnknown(m Message) { - di := atomicLoadDiscardInfo(&a.discard) - if di == nil { - di = getDiscardInfo(reflect.TypeOf(m).Elem()) - atomicStoreDiscardInfo(&a.discard, di) - } - di.discard(toPointer(&m)) -} - -type discardInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []discardFieldInfo - unrecognized field -} - -type discardFieldInfo struct { - field field // Offset of field, guaranteed to be valid - discard func(src pointer) -} - -var ( - discardInfoMap = map[reflect.Type]*discardInfo{} - discardInfoLock sync.Mutex -) - -func getDiscardInfo(t reflect.Type) *discardInfo { - discardInfoLock.Lock() - defer discardInfoLock.Unlock() - di := discardInfoMap[t] - if di == nil { - di = &discardInfo{typ: t} - discardInfoMap[t] = di - } - return di -} - -func (di *discardInfo) discard(src pointer) { - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&di.initialized) == 0 { - di.computeDiscardInfo() - } - - for _, fi := range di.fields { - sfp := src.offset(fi.field) - fi.discard(sfp) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { - // Ignore lock since DiscardUnknown is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - DiscardUnknown(m) - } - } - } - - if di.unrecognized.IsValid() { - *src.offset(di.unrecognized).toBytes() = nil - } -} - -func (di *discardInfo) computeDiscardInfo() { - di.lock.Lock() - defer di.lock.Unlock() - if di.initialized != 0 { - return - } - t := di.typ - n := t.NumField() - - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - dfi := discardFieldInfo{field: toField(&f)} - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) - case isSlice: // E.g., []*pb.T - di := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sps := src.getPointerSlice() - for _, sp := range sps { - if !sp.isNil() { - di.discard(sp) - } - } - } - default: // E.g., *pb.T - di := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sp := src.getPointer() - if !sp.isNil() { - di.discard(sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) - default: // E.g., map[K]V - if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) - dfi.discard = func(src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - DiscardUnknown(val.Interface().(Message)) - } - } - } else { - dfi.discard = func(pointer) {} // Noop - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) - default: // E.g., interface{} - // TODO: Make this faster? - dfi.discard = func(src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - DiscardUnknown(sv.Interface().(Message)) - } - } - } - } - default: - continue - } - di.fields = append(di.fields, dfi) - } - - di.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - di.unrecognized = toField(&f) - } - - atomic.StoreInt32(&di.initialized, 1) -} - -func discardLegacy(m Message) { - v := reflect.ValueOf(m) - if v.Kind() != reflect.Ptr || v.IsNil() { - return - } - v = v.Elem() - if v.Kind() != reflect.Struct { - return - } - t := v.Type() - - for i := 0; i < v.NumField(); i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - vf := v.Field(i) - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) - case isSlice: // E.g., []*pb.T - for j := 0; j < vf.Len(); j++ { - discardLegacy(vf.Index(j).Interface().(Message)) - } - default: // E.g., *pb.T - discardLegacy(vf.Interface().(Message)) - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) - default: // E.g., map[K]V - tv := vf.Type().Elem() - if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) - for _, key := range vf.MapKeys() { - val := vf.MapIndex(key) - discardLegacy(val.Interface().(Message)) - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) - default: // E.g., test_proto.isCommunique_Union interface - if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { - vf = vf.Elem() // E.g., *test_proto.Communique_Msg - if !vf.IsNil() { - vf = vf.Elem() // E.g., test_proto.Communique_Msg - vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value - if vf.Kind() == reflect.Ptr { - discardLegacy(vf.Interface().(Message)) - } - } - } - } - } - } - - if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { - if vf.Type() != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - vf.Set(reflect.ValueOf([]byte(nil))) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(m); err == nil { - // Ignore lock since discardLegacy is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - discardLegacy(m) - } - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go deleted file mode 100644 index 3abfed2..0000000 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ /dev/null @@ -1,203 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "errors" - "reflect" -) - -var ( - // errRepeatedHasNil is the error returned if Marshal is called with - // a struct with a repeated field containing a nil element. - errRepeatedHasNil = errors.New("proto: repeated field has nil element") - - // errOneofHasNil is the error returned if Marshal is called with - // a struct with a oneof field containing a nil element. - errOneofHasNil = errors.New("proto: oneof field has nil value") - - // ErrNil is the error returned if Marshal is called with nil. - ErrNil = errors.New("proto: Marshal called with nil") - - // ErrTooLarge is the error returned if Marshal is called with a - // message that encodes to >2GB. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") -) - -// The fundamental encoders that put bytes on the wire. -// Those that take integer types all accept uint64 and are -// therefore of type valueEncoder. - -const maxVarintBytes = 10 // maximum length of a varint - -// EncodeVarint returns the varint encoding of x. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -// Not used by the package itself, but helpful to clients -// wishing to use the same encoding. -func EncodeVarint(x uint64) []byte { - var buf [maxVarintBytes]byte - var n int - for n = 0; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return buf[0:n] -} - -// EncodeVarint writes a varint-encoded integer to the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) EncodeVarint(x uint64) error { - for x >= 1<<7 { - p.buf = append(p.buf, uint8(x&0x7f|0x80)) - x >>= 7 - } - p.buf = append(p.buf, uint8(x)) - return nil -} - -// SizeVarint returns the varint encoding size of an integer. -func SizeVarint(x uint64) int { - switch { - case x < 1<<7: - return 1 - case x < 1<<14: - return 2 - case x < 1<<21: - return 3 - case x < 1<<28: - return 4 - case x < 1<<35: - return 5 - case x < 1<<42: - return 6 - case x < 1<<49: - return 7 - case x < 1<<56: - return 8 - case x < 1<<63: - return 9 - } - return 10 -} - -// EncodeFixed64 writes a 64-bit integer to the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) EncodeFixed64(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24), - uint8(x>>32), - uint8(x>>40), - uint8(x>>48), - uint8(x>>56)) - return nil -} - -// EncodeFixed32 writes a 32-bit integer to the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) EncodeFixed32(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24)) - return nil -} - -// EncodeZigzag64 writes a zigzag-encoded 64-bit integer -// to the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) EncodeZigzag64(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -// EncodeZigzag32 writes a zigzag-encoded 32-bit integer -// to the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) EncodeZigzag32(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) EncodeRawBytes(b []byte) error { - p.EncodeVarint(uint64(len(b))) - p.buf = append(p.buf, b...) - return nil -} - -// EncodeStringBytes writes an encoded string to the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) EncodeStringBytes(s string) error { - p.EncodeVarint(uint64(len(s))) - p.buf = append(p.buf, s...) - return nil -} - -// Marshaler is the interface representing objects that can marshal themselves. -type Marshaler interface { - Marshal() ([]byte, error) -} - -// EncodeMessage writes the protocol buffer to the Buffer, -// prefixed by a varint-encoded length. -func (p *Buffer) EncodeMessage(pb Message) error { - siz := Size(pb) - p.EncodeVarint(uint64(siz)) - return p.Marshal(pb) -} - -// All protocol buffer fields are nillable, but be careful. -func isNil(v reflect.Value) bool { - switch v.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - return false -} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go deleted file mode 100644 index f9b6e41..0000000 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ /dev/null @@ -1,301 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer comparison. - -package proto - -import ( - "bytes" - "log" - "reflect" - "strings" -) - -/* -Equal returns true iff protocol buffers a and b are equal. -The arguments must both be pointers to protocol buffer structs. - -Equality is defined in this way: - - Two messages are equal iff they are the same type, - corresponding fields are equal, unknown field sets - are equal, and extensions sets are equal. - - Two set scalar fields are equal iff their values are equal. - If the fields are of a floating-point type, remember that - NaN != x for all x, including NaN. If the message is defined - in a proto3 .proto file, fields are not "set"; specifically, - zero length proto3 "bytes" fields are equal (nil == {}). - - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal. Note a "bytes" field, - although represented by []byte, is not a repeated field and the - rule for the scalar fields described above applies. - - Two unset fields are equal. - - Two unknown field sets are equal if their current - encoded state is equal. - - Two extension sets are equal iff they have corresponding - elements that are pairwise equal. - - Two map fields are equal iff their lengths are the same, - and they contain the same set of elements. Zero-length map - fields are equal. - - Every other combination of things are not equal. - -The return value is undefined if a and b are not protocol buffers. -*/ -func Equal(a, b Message) bool { - if a == nil || b == nil { - return a == b - } - v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) - if v1.Type() != v2.Type() { - return false - } - if v1.Kind() == reflect.Ptr { - if v1.IsNil() { - return v2.IsNil() - } - if v2.IsNil() { - return false - } - v1, v2 = v1.Elem(), v2.Elem() - } - if v1.Kind() != reflect.Struct { - return false - } - return equalStruct(v1, v2) -} - -// v1 and v2 are known to have the same type. -func equalStruct(v1, v2 reflect.Value) bool { - sprop := GetProperties(v1.Type()) - for i := 0; i < v1.NumField(); i++ { - f := v1.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - f1, f2 := v1.Field(i), v2.Field(i) - if f.Type.Kind() == reflect.Ptr { - if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { - // both unset - continue - } else if n1 != n2 { - // set/unset mismatch - return false - } - f1, f2 = f1.Elem(), f2.Elem() - } - if !equalAny(f1, f2, sprop.Prop[i]) { - return false - } - } - - if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_InternalExtensions") - if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { - return false - } - } - - if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_extensions") - if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { - return false - } - } - - uf := v1.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return true - } - - u1 := uf.Bytes() - u2 := v2.FieldByName("XXX_unrecognized").Bytes() - return bytes.Equal(u1, u2) -} - -// v1 and v2 are known to have the same type. -// prop may be nil. -func equalAny(v1, v2 reflect.Value, prop *Properties) bool { - if v1.Type() == protoMessageType { - m1, _ := v1.Interface().(Message) - m2, _ := v2.Interface().(Message) - return Equal(m1, m2) - } - switch v1.Kind() { - case reflect.Bool: - return v1.Bool() == v2.Bool() - case reflect.Float32, reflect.Float64: - return v1.Float() == v2.Float() - case reflect.Int32, reflect.Int64: - return v1.Int() == v2.Int() - case reflect.Interface: - // Probably a oneof field; compare the inner values. - n1, n2 := v1.IsNil(), v2.IsNil() - if n1 || n2 { - return n1 == n2 - } - e1, e2 := v1.Elem(), v2.Elem() - if e1.Type() != e2.Type() { - return false - } - return equalAny(e1, e2, nil) - case reflect.Map: - if v1.Len() != v2.Len() { - return false - } - for _, key := range v1.MapKeys() { - val2 := v2.MapIndex(key) - if !val2.IsValid() { - // This key was not found in the second map. - return false - } - if !equalAny(v1.MapIndex(key), val2, nil) { - return false - } - } - return true - case reflect.Ptr: - // Maps may have nil values in them, so check for nil. - if v1.IsNil() && v2.IsNil() { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return equalAny(v1.Elem(), v2.Elem(), prop) - case reflect.Slice: - if v1.Type().Elem().Kind() == reflect.Uint8 { - // short circuit: []byte - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value. - if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) - } - - if v1.Len() != v2.Len() { - return false - } - for i := 0; i < v1.Len(); i++ { - if !equalAny(v1.Index(i), v2.Index(i), prop) { - return false - } - } - return true - case reflect.String: - return v1.Interface().(string) == v2.Interface().(string) - case reflect.Struct: - return equalStruct(v1, v2) - case reflect.Uint32, reflect.Uint64: - return v1.Uint() == v2.Uint() - } - - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to compare %v", v1) - return false -} - -// base is the struct type that the extensions are based on. -// x1 and x2 are InternalExtensions. -func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { - em1, _ := x1.extensionsRead() - em2, _ := x2.extensionsRead() - return equalExtMap(base, em1, em2) -} - -func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { - if len(em1) != len(em2) { - return false - } - - for extNum, e1 := range em1 { - e2, ok := em2[extNum] - if !ok { - return false - } - - m1 := extensionAsLegacyType(e1.value) - m2 := extensionAsLegacyType(e2.value) - - if m1 == nil && m2 == nil { - // Both have only encoded form. - if bytes.Equal(e1.enc, e2.enc) { - continue - } - // The bytes are different, but the extensions might still be - // equal. We need to decode them to compare. - } - - if m1 != nil && m2 != nil { - // Both are unencoded. - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - continue - } - - // At least one is encoded. To do a semantically correct comparison - // we need to unmarshal them first. - var desc *ExtensionDesc - if m := extensionMaps[base]; m != nil { - desc = m[extNum] - } - if desc == nil { - // If both have only encoded form and the bytes are the same, - // it is handled above. We get here when the bytes are different. - // We don't know how to decode it, so just compare them as byte - // slices. - log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - return false - } - var err error - if m1 == nil { - m1, err = decodeExtension(e1.enc, desc) - } - if m2 == nil && err == nil { - m2, err = decodeExtension(e2.enc, desc) - } - if err != nil { - // The encoded form is invalid. - log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) - return false - } - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - } - - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go deleted file mode 100644 index fa88add..0000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,607 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Types and routines for supporting protocol buffer extensions. - */ - -import ( - "errors" - "fmt" - "io" - "reflect" - "strconv" - "sync" -) - -// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. -var ErrMissingExtension = errors.New("proto: missing extension") - -// ExtensionRange represents a range of message extensions for a protocol buffer. -// Used in code generated by the protocol compiler. -type ExtensionRange struct { - Start, End int32 // both inclusive -} - -// extendableProto is an interface implemented by any protocol buffer generated by the current -// proto compiler that may be extended. -type extendableProto interface { - Message - ExtensionRangeArray() []ExtensionRange - extensionsWrite() map[int32]Extension - extensionsRead() (map[int32]Extension, sync.Locker) -} - -// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous -// version of the proto compiler that may be extended. -type extendableProtoV1 interface { - Message - ExtensionRangeArray() []ExtensionRange - ExtensionMap() map[int32]Extension -} - -// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. -type extensionAdapter struct { - extendableProtoV1 -} - -func (e extensionAdapter) extensionsWrite() map[int32]Extension { - return e.ExtensionMap() -} - -func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { - return e.ExtensionMap(), notLocker{} -} - -// notLocker is a sync.Locker whose Lock and Unlock methods are nops. -type notLocker struct{} - -func (n notLocker) Lock() {} -func (n notLocker) Unlock() {} - -// extendable returns the extendableProto interface for the given generated proto message. -// If the proto message has the old extension format, it returns a wrapper that implements -// the extendableProto interface. -func extendable(p interface{}) (extendableProto, error) { - switch p := p.(type) { - case extendableProto: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return p, nil - case extendableProtoV1: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return extensionAdapter{p}, nil - } - // Don't allocate a specific error containing %T: - // this is the hot path for Clone and MarshalText. - return nil, errNotExtendable -} - -var errNotExtendable = errors.New("proto: not an extendable proto.Message") - -func isNilPtr(x interface{}) bool { - v := reflect.ValueOf(x) - return v.Kind() == reflect.Ptr && v.IsNil() -} - -// XXX_InternalExtensions is an internal representation of proto extensions. -// -// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, -// thus gaining the unexported 'extensions' method, which can be called only from the proto package. -// -// The methods of XXX_InternalExtensions are not concurrency safe in general, -// but calls to logically read-only methods such as has and get may be executed concurrently. -type XXX_InternalExtensions struct { - // The struct must be indirect so that if a user inadvertently copies a - // generated message and its embedded XXX_InternalExtensions, they - // avoid the mayhem of a copied mutex. - // - // The mutex serializes all logically read-only operations to p.extensionMap. - // It is up to the client to ensure that write operations to p.extensionMap are - // mutually exclusive with other accesses. - p *struct { - mu sync.Mutex - extensionMap map[int32]Extension - } -} - -// extensionsWrite returns the extension map, creating it on first use. -func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { - if e.p == nil { - e.p = new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }) - e.p.extensionMap = make(map[int32]Extension) - } - return e.p.extensionMap -} - -// extensionsRead returns the extensions map for read-only use. It may be nil. -// The caller must hold the returned mutex's lock when accessing Elements within the map. -func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { - if e.p == nil { - return nil, nil - } - return e.p.extensionMap, &e.p.mu -} - -// ExtensionDesc represents an extension specification. -// Used in generated code from the protocol compiler. -type ExtensionDesc struct { - ExtendedType Message // nil pointer to the type that is being extended - ExtensionType interface{} // nil pointer to the extension type - Field int32 // field number - Name string // fully-qualified name of extension, for text formatting - Tag string // protobuf tag style - Filename string // name of the file in which the extension is defined -} - -func (ed *ExtensionDesc) repeated() bool { - t := reflect.TypeOf(ed.ExtensionType) - return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -} - -// Extension represents an extension in a message. -type Extension struct { - // When an extension is stored in a message using SetExtension - // only desc and value are set. When the message is marshaled - // enc will be set to the encoded form of the message. - // - // When a message is unmarshaled and contains extensions, each - // extension will have only enc set. When such an extension is - // accessed using GetExtension (or GetExtensions) desc and value - // will be set. - desc *ExtensionDesc - - // value is a concrete value for the extension field. Let the type of - // desc.ExtensionType be the "API type" and the type of Extension.value - // be the "storage type". The API type and storage type are the same except: - // * For scalars (except []byte), the API type uses *T, - // while the storage type uses T. - // * For repeated fields, the API type uses []T, while the storage type - // uses *[]T. - // - // The reason for the divergence is so that the storage type more naturally - // matches what is expected of when retrieving the values through the - // protobuf reflection APIs. - // - // The value may only be populated if desc is also populated. - value interface{} - - // enc is the raw bytes for the extension field. - enc []byte -} - -// SetRawExtension is for testing only. -func SetRawExtension(base Message, id int32, b []byte) { - epb, err := extendable(base) - if err != nil { - return - } - extmap := epb.extensionsWrite() - extmap[id] = Extension{enc: b} -} - -// isExtensionField returns true iff the given field number is in an extension range. -func isExtensionField(pb extendableProto, field int32) bool { - for _, er := range pb.ExtensionRangeArray() { - if er.Start <= field && field <= er.End { - return true - } - } - return false -} - -// checkExtensionTypes checks that the given extension is valid for pb. -func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { - var pbi interface{} = pb - // Check the extended type. - if ea, ok := pbi.(extensionAdapter); ok { - pbi = ea.extendableProtoV1 - } - if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) - } - // Check the range. - if !isExtensionField(pb, extension.Field) { - return errors.New("proto: bad extension number; not in declared ranges") - } - return nil -} - -// extPropKey is sufficient to uniquely identify an extension. -type extPropKey struct { - base reflect.Type - field int32 -} - -var extProp = struct { - sync.RWMutex - m map[extPropKey]*Properties -}{ - m: make(map[extPropKey]*Properties), -} - -func extensionProperties(ed *ExtensionDesc) *Properties { - key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} - - extProp.RLock() - if prop, ok := extProp.m[key]; ok { - extProp.RUnlock() - return prop - } - extProp.RUnlock() - - extProp.Lock() - defer extProp.Unlock() - // Check again. - if prop, ok := extProp.m[key]; ok { - return prop - } - - prop := new(Properties) - prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) - extProp.m[key] = prop - return prop -} - -// HasExtension returns whether the given extension is present in pb. -func HasExtension(pb Message, extension *ExtensionDesc) bool { - // TODO: Check types, field numbers, etc.? - epb, err := extendable(pb) - if err != nil { - return false - } - extmap, mu := epb.extensionsRead() - if extmap == nil { - return false - } - mu.Lock() - _, ok := extmap[extension.Field] - mu.Unlock() - return ok -} - -// ClearExtension removes the given extension from pb. -func ClearExtension(pb Message, extension *ExtensionDesc) { - epb, err := extendable(pb) - if err != nil { - return - } - // TODO: Check types, field numbers, etc.? - extmap := epb.extensionsWrite() - delete(extmap, extension.Field) -} - -// GetExtension retrieves a proto2 extended field from pb. -// -// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), -// then GetExtension parses the encoded field and returns a Go value of the specified type. -// If the field is not present, then the default value is returned (if one is specified), -// otherwise ErrMissingExtension is reported. -// -// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), -// then GetExtension returns the raw encoded bytes of the field extension. -func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - - if extension.ExtendedType != nil { - // can only check type if this is a complete descriptor - if err := checkExtensionTypes(epb, extension); err != nil { - return nil, err - } - } - - emap, mu := epb.extensionsRead() - if emap == nil { - return defaultExtensionValue(extension) - } - mu.Lock() - defer mu.Unlock() - e, ok := emap[extension.Field] - if !ok { - // defaultExtensionValue returns the default value or - // ErrMissingExtension if there is no default. - return defaultExtensionValue(extension) - } - - if e.value != nil { - // Already decoded. Check the descriptor, though. - if e.desc != extension { - // This shouldn't happen. If it does, it means that - // GetExtension was called twice with two different - // descriptors with the same field number. - return nil, errors.New("proto: descriptor conflict") - } - return extensionAsLegacyType(e.value), nil - } - - if extension.ExtensionType == nil { - // incomplete descriptor - return e.enc, nil - } - - v, err := decodeExtension(e.enc, extension) - if err != nil { - return nil, err - } - - // Remember the decoded version and drop the encoded version. - // That way it is safe to mutate what we return. - e.value = extensionAsStorageType(v) - e.desc = extension - e.enc = nil - emap[extension.Field] = e - return extensionAsLegacyType(e.value), nil -} - -// defaultExtensionValue returns the default value for extension. -// If no default for an extension is defined ErrMissingExtension is returned. -func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { - if extension.ExtensionType == nil { - // incomplete descriptor, so no default - return nil, ErrMissingExtension - } - - t := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - - sf, _, err := fieldDefault(t, props) - if err != nil { - return nil, err - } - - if sf == nil || sf.value == nil { - // There is no default value. - return nil, ErrMissingExtension - } - - if t.Kind() != reflect.Ptr { - // We do not need to return a Ptr, we can directly return sf.value. - return sf.value, nil - } - - // We need to return an interface{} that is a pointer to sf.value. - value := reflect.New(t).Elem() - value.Set(reflect.New(value.Type().Elem())) - if sf.kind == reflect.Int32 { - // We may have an int32 or an enum, but the underlying data is int32. - // Since we can't set an int32 into a non int32 reflect.value directly - // set it as a int32. - value.Elem().SetInt(int64(sf.value.(int32))) - } else { - value.Elem().Set(reflect.ValueOf(sf.value)) - } - return value.Interface(), nil -} - -// decodeExtension decodes an extension encoded in b. -func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - t := reflect.TypeOf(extension.ExtensionType) - unmarshal := typeUnmarshaler(t, extension.Tag) - - // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate space to store the pointer/slice. - value := reflect.New(t).Elem() - - var err error - for { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - wire := int(x) & 7 - - b, err = unmarshal(b, valToPointer(value.Addr()), wire) - if err != nil { - return nil, err - } - - if len(b) == 0 { - break - } - } - return value.Interface(), nil -} - -// GetExtensions returns a slice of the extensions present in pb that are also listed in es. -// The returned slice has the same length as es; missing extensions will appear as nil elements. -func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - extensions = make([]interface{}, len(es)) - for i, e := range es { - extensions[i], err = GetExtension(epb, e) - if err == ErrMissingExtension { - err = nil - } - if err != nil { - return - } - } - return -} - -// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. -// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing -// just the Field field, which defines the extension's field number. -func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - registeredExtensions := RegisteredExtensions(pb) - - emap, mu := epb.extensionsRead() - if emap == nil { - return nil, nil - } - mu.Lock() - defer mu.Unlock() - extensions := make([]*ExtensionDesc, 0, len(emap)) - for extid, e := range emap { - desc := e.desc - if desc == nil { - desc = registeredExtensions[extid] - if desc == nil { - desc = &ExtensionDesc{Field: extid} - } - } - - extensions = append(extensions, desc) - } - return extensions, nil -} - -// SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - epb, err := extendable(pb) - if err != nil { - return err - } - if err := checkExtensionTypes(epb, extension); err != nil { - return err - } - typ := reflect.TypeOf(extension.ExtensionType) - if typ != reflect.TypeOf(value) { - return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType) - } - // nil extension values need to be caught early, because the - // encoder can't distinguish an ErrNil due to a nil extension - // from an ErrNil due to a missing field. Extensions are - // always optional, so the encoder would just swallow the error - // and drop all the extensions from the encoded message. - if reflect.ValueOf(value).IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) - } - - extmap := epb.extensionsWrite() - extmap[extension.Field] = Extension{desc: extension, value: extensionAsStorageType(value)} - return nil -} - -// ClearAllExtensions clears all extensions from pb. -func ClearAllExtensions(pb Message) { - epb, err := extendable(pb) - if err != nil { - return - } - m := epb.extensionsWrite() - for k := range m { - delete(m, k) - } -} - -// A global registry of extensions. -// The generated code will register the generated descriptors by calling RegisterExtension. - -var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) - -// RegisterExtension is called from the generated code. -func RegisterExtension(desc *ExtensionDesc) { - st := reflect.TypeOf(desc.ExtendedType).Elem() - m := extensionMaps[st] - if m == nil { - m = make(map[int32]*ExtensionDesc) - extensionMaps[st] = m - } - if _, ok := m[desc.Field]; ok { - panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) - } - m[desc.Field] = desc -} - -// RegisteredExtensions returns a map of the registered extensions of a -// protocol buffer struct, indexed by the extension number. -// The argument pb should be a nil pointer to the struct type. -func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { - return extensionMaps[reflect.TypeOf(pb).Elem()] -} - -// extensionAsLegacyType converts an value in the storage type as the API type. -// See Extension.value. -func extensionAsLegacyType(v interface{}) interface{} { - switch rv := reflect.ValueOf(v); rv.Kind() { - case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: - // Represent primitive types as a pointer to the value. - rv2 := reflect.New(rv.Type()) - rv2.Elem().Set(rv) - v = rv2.Interface() - case reflect.Ptr: - // Represent slice types as the value itself. - switch rv.Type().Elem().Kind() { - case reflect.Slice: - if rv.IsNil() { - v = reflect.Zero(rv.Type().Elem()).Interface() - } else { - v = rv.Elem().Interface() - } - } - } - return v -} - -// extensionAsStorageType converts an value in the API type as the storage type. -// See Extension.value. -func extensionAsStorageType(v interface{}) interface{} { - switch rv := reflect.ValueOf(v); rv.Kind() { - case reflect.Ptr: - // Represent slice types as the value itself. - switch rv.Type().Elem().Kind() { - case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: - if rv.IsNil() { - v = reflect.Zero(rv.Type().Elem()).Interface() - } else { - v = rv.Elem().Interface() - } - } - case reflect.Slice: - // Represent slice types as a pointer to the value. - if rv.Type().Elem().Kind() != reflect.Uint8 { - rv2 := reflect.New(rv.Type()) - rv2.Elem().Set(rv) - v = rv2.Interface() - } - } - return v -} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go deleted file mode 100644 index 70fbda5..0000000 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ /dev/null @@ -1,965 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* -Package proto converts data structures to and from the wire format of -protocol buffers. It works in concert with the Go source code generated -for .proto files by the protocol compiler. - -A summary of the properties of the protocol buffer interface -for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed by the enclosing message's name, or by the - enum's type name if it is a top-level enum. Enum types have a String - method, and a Enum method to assist in message construction. - - Nested messages, groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. - - Marshal and Unmarshal are functions to encode and decode the wire format. - -When the .proto file specifies `syntax="proto3"`, there are some differences: - - - Non-repeated fields of non-message type are values instead of pointers. - - Enum types do not get an Enum method. - -The simplest way to describe this is to see an example. -Given file test.proto, containing - - package example; - - enum FOO { X = 17; } - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - oneof union { - int32 number = 6; - string name = 7; - } - } - -The resulting file, test.pb.go, is: - - package example - - import proto "github.com/golang/protobuf/proto" - import math "math" - - type FOO int32 - const ( - FOO_X FOO = 17 - ) - var FOO_name = map[int32]string{ - 17: "X", - } - var FOO_value = map[string]int32{ - "X": 17, - } - - func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p - } - func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) - } - func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data) - if err != nil { - return err - } - *x = FOO(value) - return nil - } - - type Test struct { - Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` - Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` - Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` - Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - // Types that are valid to be assigned to Union: - // *Test_Number - // *Test_Name - Union isTest_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` - } - func (m *Test) Reset() { *m = Test{} } - func (m *Test) String() string { return proto.CompactTextString(m) } - func (*Test) ProtoMessage() {} - - type isTest_Union interface { - isTest_Union() - } - - type Test_Number struct { - Number int32 `protobuf:"varint,6,opt,name=number"` - } - type Test_Name struct { - Name string `protobuf:"bytes,7,opt,name=name"` - } - - func (*Test_Number) isTest_Union() {} - func (*Test_Name) isTest_Union() {} - - func (m *Test) GetUnion() isTest_Union { - if m != nil { - return m.Union - } - return nil - } - const Default_Test_Type int32 = 77 - - func (m *Test) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" - } - - func (m *Test) GetType() int32 { - if m != nil && m.Type != nil { - return *m.Type - } - return Default_Test_Type - } - - func (m *Test) GetOptionalgroup() *Test_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil - } - - type Test_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` - } - func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } - func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } - - func (m *Test_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" - } - - func (m *Test) GetNumber() int32 { - if x, ok := m.GetUnion().(*Test_Number); ok { - return x.Number - } - return 0 - } - - func (m *Test) GetName() string { - if x, ok := m.GetUnion().(*Test_Name); ok { - return x.Name - } - return "" - } - - func init() { - proto.RegisterEnum("example.FOO", FOO_name, FOO_value) - } - -To create and play with a Test object: - - package main - - import ( - "log" - - "github.com/golang/protobuf/proto" - pb "./example.pb" - ) - - func main() { - test := &pb.Test{ - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &pb.Test_OptionalGroup{ - RequiredField: proto.String("good bye"), - }, - Union: &pb.Test_Name{"fred"}, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &pb.Test{} - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // Use a type switch to determine which oneof was set. - switch u := test.Union.(type) { - case *pb.Test_Number: // u.Number contains the number. - case *pb.Test_Name: // u.Name contains the string. - } - // etc. - } -*/ -package proto - -import ( - "encoding/json" - "fmt" - "log" - "reflect" - "sort" - "strconv" - "sync" -) - -// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. -// Marshal reports this when a required field is not initialized. -// Unmarshal reports this when a required field is missing from the wire data. -type RequiredNotSetError struct{ field string } - -func (e *RequiredNotSetError) Error() string { - if e.field == "" { - return fmt.Sprintf("proto: required field not set") - } - return fmt.Sprintf("proto: required field %q not set", e.field) -} -func (e *RequiredNotSetError) RequiredNotSet() bool { - return true -} - -type invalidUTF8Error struct{ field string } - -func (e *invalidUTF8Error) Error() string { - if e.field == "" { - return "proto: invalid UTF-8 detected" - } - return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) -} -func (e *invalidUTF8Error) InvalidUTF8() bool { - return true -} - -// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. -// This error should not be exposed to the external API as such errors should -// be recreated with the field information. -var errInvalidUTF8 = &invalidUTF8Error{} - -// isNonFatal reports whether the error is either a RequiredNotSet error -// or a InvalidUTF8 error. -func isNonFatal(err error) bool { - if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { - return true - } - if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { - return true - } - return false -} - -type nonFatal struct{ E error } - -// Merge merges err into nf and reports whether it was successful. -// Otherwise it returns false for any fatal non-nil errors. -func (nf *nonFatal) Merge(err error) (ok bool) { - if err == nil { - return true // not an error - } - if !isNonFatal(err) { - return false // fatal error - } - if nf.E == nil { - nf.E = err // store first instance of non-fatal error - } - return true -} - -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() -} - -// A Buffer is a buffer manager for marshaling and unmarshaling -// protocol buffers. It may be reused between invocations to -// reduce memory usage. It is not necessary to use a Buffer; -// the global functions Marshal and Unmarshal create a -// temporary Buffer and are fine for most applications. -type Buffer struct { - buf []byte // encode/decode byte stream - index int // read point - - deterministic bool -} - -// NewBuffer allocates a new Buffer and initializes its internal data to -// the contents of the argument slice. -func NewBuffer(e []byte) *Buffer { - return &Buffer{buf: e} -} - -// Reset resets the Buffer, ready for marshaling a new protocol buffer. -func (p *Buffer) Reset() { - p.buf = p.buf[0:0] // for reading/writing - p.index = 0 // for reading -} - -// SetBuf replaces the internal buffer with the slice, -// ready for unmarshaling the contents of the slice. -func (p *Buffer) SetBuf(s []byte) { - p.buf = s - p.index = 0 -} - -// Bytes returns the contents of the Buffer. -func (p *Buffer) Bytes() []byte { return p.buf } - -// SetDeterministic sets whether to use deterministic serialization. -// -// Deterministic serialization guarantees that for a given binary, equal -// messages will always be serialized to the same bytes. This implies: -// -// - Repeated serialization of a message will return the same bytes. -// - Different processes of the same binary (which may be executing on -// different machines) will serialize equal messages to the same bytes. -// -// Note that the deterministic serialization is NOT canonical across -// languages. It is not guaranteed to remain stable over time. It is unstable -// across different builds with schema changes due to unknown fields. -// Users who need canonical serialization (e.g., persistent storage in a -// canonical form, fingerprinting, etc.) should define their own -// canonicalization specification and implement their own serializer rather -// than relying on this API. -// -// If deterministic serialization is requested, map entries will be sorted -// by keys in lexicographical order. This is an implementation detail and -// subject to change. -func (p *Buffer) SetDeterministic(deterministic bool) { - p.deterministic = deterministic -} - -/* - * Helper routines for simplifying the creation of optional fields of basic type. - */ - -// Bool is a helper routine that allocates a new bool value -// to store v and returns a pointer to it. -func Bool(v bool) *bool { - return &v -} - -// Int32 is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it. -func Int32(v int32) *int32 { - return &v -} - -// Int is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it, but unlike Int32 -// its argument value is an int. -func Int(v int) *int32 { - p := new(int32) - *p = int32(v) - return p -} - -// Int64 is a helper routine that allocates a new int64 value -// to store v and returns a pointer to it. -func Int64(v int64) *int64 { - return &v -} - -// Float32 is a helper routine that allocates a new float32 value -// to store v and returns a pointer to it. -func Float32(v float32) *float32 { - return &v -} - -// Float64 is a helper routine that allocates a new float64 value -// to store v and returns a pointer to it. -func Float64(v float64) *float64 { - return &v -} - -// Uint32 is a helper routine that allocates a new uint32 value -// to store v and returns a pointer to it. -func Uint32(v uint32) *uint32 { - return &v -} - -// Uint64 is a helper routine that allocates a new uint64 value -// to store v and returns a pointer to it. -func Uint64(v uint64) *uint64 { - return &v -} - -// String is a helper routine that allocates a new string value -// to store v and returns a pointer to it. -func String(v string) *string { - return &v -} - -// EnumName is a helper function to simplify printing protocol buffer enums -// by name. Given an enum map and a value, it returns a useful string. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// UnmarshalJSONEnum is a helper function to simplify recovering enum int values -// from their JSON-encoded representation. Given a map from the enum's symbolic -// names to its int values, and a byte buffer containing the JSON-encoded -// value, it returns an int32 that can be cast to the enum type by the caller. -// -// The function can deal with both JSON representations, numeric and symbolic. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// DebugPrint dumps the encoded data in b in a debugging format with a header -// including the string s. Used in testing but made available for general debugging. -func (p *Buffer) DebugPrint(s string, b []byte) { - var u uint64 - - obuf := p.buf - index := p.index - p.buf = b - p.index = 0 - depth := 0 - - fmt.Printf("\n--- %s ---\n", s) - -out: - for { - for i := 0; i < depth; i++ { - fmt.Print(" ") - } - - index := p.index - if index == len(p.buf) { - break - } - - op, err := p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: fetching op err %v\n", index, err) - break out - } - tag := op >> 3 - wire := op & 7 - - switch wire { - default: - fmt.Printf("%3d: t=%3d unknown wire=%d\n", - index, tag, wire) - break out - - case WireBytes: - var r []byte - - r, err = p.DecodeRawBytes(false) - if err != nil { - break out - } - fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) - if len(r) <= 6 { - for i := 0; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } else { - for i := 0; i < 3; i++ { - fmt.Printf(" %.2x", r[i]) - } - fmt.Printf(" ..") - for i := len(r) - 3; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } - fmt.Printf("\n") - - case WireFixed32: - u, err = p.DecodeFixed32() - if err != nil { - fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) - - case WireFixed64: - u, err = p.DecodeFixed64() - if err != nil { - fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) - - case WireVarint: - u, err = p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) - - case WireStartGroup: - fmt.Printf("%3d: t=%3d start\n", index, tag) - depth++ - - case WireEndGroup: - depth-- - fmt.Printf("%3d: t=%3d end\n", index, tag) - } - } - - if depth != 0 { - fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) - } - fmt.Printf("\n") - - p.buf = obuf - p.index = index -} - -// SetDefaults sets unset protocol buffer fields to their default values. -// It only modifies fields that are both unset and have defined defaults. -// It recursively sets default values in any non-nil sub-messages. -func SetDefaults(pb Message) { - setDefaults(reflect.ValueOf(pb), true, false) -} - -// v is a pointer to a struct. -func setDefaults(v reflect.Value, recur, zeros bool) { - v = v.Elem() - - defaultMu.RLock() - dm, ok := defaults[v.Type()] - defaultMu.RUnlock() - if !ok { - dm = buildDefaultMessage(v.Type()) - defaultMu.Lock() - defaults[v.Type()] = dm - defaultMu.Unlock() - } - - for _, sf := range dm.scalars { - f := v.Field(sf.index) - if !f.IsNil() { - // field already set - continue - } - dv := sf.value - if dv == nil && !zeros { - // no explicit default, and don't want to set zeros - continue - } - fptr := f.Addr().Interface() // **T - // TODO: Consider batching the allocations we do here. - switch sf.kind { - case reflect.Bool: - b := new(bool) - if dv != nil { - *b = dv.(bool) - } - *(fptr.(**bool)) = b - case reflect.Float32: - f := new(float32) - if dv != nil { - *f = dv.(float32) - } - *(fptr.(**float32)) = f - case reflect.Float64: - f := new(float64) - if dv != nil { - *f = dv.(float64) - } - *(fptr.(**float64)) = f - case reflect.Int32: - // might be an enum - if ft := f.Type(); ft != int32PtrType { - // enum - f.Set(reflect.New(ft.Elem())) - if dv != nil { - f.Elem().SetInt(int64(dv.(int32))) - } - } else { - // int32 field - i := new(int32) - if dv != nil { - *i = dv.(int32) - } - *(fptr.(**int32)) = i - } - case reflect.Int64: - i := new(int64) - if dv != nil { - *i = dv.(int64) - } - *(fptr.(**int64)) = i - case reflect.String: - s := new(string) - if dv != nil { - *s = dv.(string) - } - *(fptr.(**string)) = s - case reflect.Uint8: - // exceptional case: []byte - var b []byte - if dv != nil { - db := dv.([]byte) - b = make([]byte, len(db)) - copy(b, db) - } else { - b = []byte{} - } - *(fptr.(*[]byte)) = b - case reflect.Uint32: - u := new(uint32) - if dv != nil { - *u = dv.(uint32) - } - *(fptr.(**uint32)) = u - case reflect.Uint64: - u := new(uint64) - if dv != nil { - *u = dv.(uint64) - } - *(fptr.(**uint64)) = u - default: - log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) - } - } - - for _, ni := range dm.nested { - f := v.Field(ni) - // f is *T or []*T or map[T]*T - switch f.Kind() { - case reflect.Ptr: - if f.IsNil() { - continue - } - setDefaults(f, recur, zeros) - - case reflect.Slice: - for i := 0; i < f.Len(); i++ { - e := f.Index(i) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - - case reflect.Map: - for _, k := range f.MapKeys() { - e := f.MapIndex(k) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - } - } -} - -var ( - // defaults maps a protocol buffer struct type to a slice of the fields, - // with its scalar fields set to their proto-declared non-zero default values. - defaultMu sync.RWMutex - defaults = make(map[reflect.Type]defaultMessage) - - int32PtrType = reflect.TypeOf((*int32)(nil)) -) - -// defaultMessage represents information about the default values of a message. -type defaultMessage struct { - scalars []scalarField - nested []int // struct field index of nested messages -} - -type scalarField struct { - index int // struct field index - kind reflect.Kind // element type (the T in *T or []T) - value interface{} // the proto-declared default value, or nil -} - -// t is a struct type. -func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { - sprop := GetProperties(t) - for _, prop := range sprop.Prop { - fi, ok := sprop.decoderTags.get(prop.Tag) - if !ok { - // XXX_unrecognized - continue - } - ft := t.Field(fi).Type - - sf, nested, err := fieldDefault(ft, prop) - switch { - case err != nil: - log.Print(err) - case nested: - dm.nested = append(dm.nested, fi) - case sf != nil: - sf.index = fi - dm.scalars = append(dm.scalars, *sf) - } - } - - return dm -} - -// fieldDefault returns the scalarField for field type ft. -// sf will be nil if the field can not have a default. -// nestedMessage will be true if this is a nested message. -// Note that sf.index is not set on return. -func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { - var canHaveDefault bool - switch ft.Kind() { - case reflect.Ptr: - if ft.Elem().Kind() == reflect.Struct { - nestedMessage = true - } else { - canHaveDefault = true // proto2 scalar field - } - - case reflect.Slice: - switch ft.Elem().Kind() { - case reflect.Ptr: - nestedMessage = true // repeated message - case reflect.Uint8: - canHaveDefault = true // bytes field - } - - case reflect.Map: - if ft.Elem().Kind() == reflect.Ptr { - nestedMessage = true // map with message values - } - } - - if !canHaveDefault { - if nestedMessage { - return nil, true, nil - } - return nil, false, nil - } - - // We now know that ft is a pointer or slice. - sf = &scalarField{kind: ft.Elem().Kind()} - - // scalar fields without defaults - if !prop.HasDefault { - return sf, false, nil - } - - // a scalar field: either *T or []byte - switch ft.Elem().Kind() { - case reflect.Bool: - x, err := strconv.ParseBool(prop.Default) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Float32: - x, err := strconv.ParseFloat(prop.Default, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) - } - sf.value = float32(x) - case reflect.Float64: - x, err := strconv.ParseFloat(prop.Default, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Int32: - x, err := strconv.ParseInt(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) - } - sf.value = int32(x) - case reflect.Int64: - x, err := strconv.ParseInt(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.String: - sf.value = prop.Default - case reflect.Uint8: - // []byte (not *uint8) - sf.value = []byte(prop.Default) - case reflect.Uint32: - x, err := strconv.ParseUint(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) - } - sf.value = uint32(x) - case reflect.Uint64: - x, err := strconv.ParseUint(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) - } - sf.value = x - default: - return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) - } - - return sf, false, nil -} - -// mapKeys returns a sort.Interface to be used for sorting the map keys. -// Map fields may have key types of non-float scalars, strings and enums. -func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{vs: vs} - - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. - if len(vs) == 0 { - return s - } - switch vs[0].Kind() { - case reflect.Int32, reflect.Int64: - s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } - case reflect.Uint32, reflect.Uint64: - s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } - case reflect.Bool: - s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true - case reflect.String: - s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } - default: - panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) - } - - return s -} - -type mapKeySorter struct { - vs []reflect.Value - less func(a, b reflect.Value) bool -} - -func (s mapKeySorter) Len() int { return len(s.vs) } -func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } -func (s mapKeySorter) Less(i, j int) bool { - return s.less(s.vs[i], s.vs[j]) -} - -// isProto3Zero reports whether v is a zero proto3 value. -func isProto3Zero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return !v.Bool() - case reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint32, reflect.Uint64: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.String: - return v.String() == "" - } - return false -} - -const ( - // ProtoPackageIsVersion3 is referenced from generated protocol buffer files - // to assert that that code is compatible with this version of the proto package. - ProtoPackageIsVersion3 = true - - // ProtoPackageIsVersion2 is referenced from generated protocol buffer files - // to assert that that code is compatible with this version of the proto package. - ProtoPackageIsVersion2 = true - - // ProtoPackageIsVersion1 is referenced from generated protocol buffer files - // to assert that that code is compatible with this version of the proto package. - ProtoPackageIsVersion1 = true -) - -// InternalMessageInfo is a type used internally by generated .pb.go files. -// This type is not intended to be used by non-generated code. -// This type is not subject to any compatibility guarantee. -type InternalMessageInfo struct { - marshal *marshalInfo - unmarshal *unmarshalInfo - merge *mergeInfo - discard *discardInfo -} diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go deleted file mode 100644 index f48a756..0000000 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ /dev/null @@ -1,181 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Support for message sets. - */ - -import ( - "errors" -) - -// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. -// A message type ID is required for storing a protocol buffer in a message set. -var errNoMessageTypeID = errors.New("proto does not have a message type ID") - -// The first two types (_MessageSet_Item and messageSet) -// model what the protocol compiler produces for the following protocol message: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } -// That is the MessageSet wire format. We can't use a proto to generate these -// because that would introduce a circular dependency between it and this package. - -type _MessageSet_Item struct { - TypeId *int32 `protobuf:"varint,2,req,name=type_id"` - Message []byte `protobuf:"bytes,3,req,name=message"` -} - -type messageSet struct { - Item []*_MessageSet_Item `protobuf:"group,1,rep"` - XXX_unrecognized []byte - // TODO: caching? -} - -// Make sure messageSet is a Message. -var _ Message = (*messageSet)(nil) - -// messageTypeIder is an interface satisfied by a protocol buffer type -// that may be stored in a MessageSet. -type messageTypeIder interface { - MessageTypeId() int32 -} - -func (ms *messageSet) find(pb Message) *_MessageSet_Item { - mti, ok := pb.(messageTypeIder) - if !ok { - return nil - } - id := mti.MessageTypeId() - for _, item := range ms.Item { - if *item.TypeId == id { - return item - } - } - return nil -} - -func (ms *messageSet) Has(pb Message) bool { - return ms.find(pb) != nil -} - -func (ms *messageSet) Unmarshal(pb Message) error { - if item := ms.find(pb); item != nil { - return Unmarshal(item.Message, pb) - } - if _, ok := pb.(messageTypeIder); !ok { - return errNoMessageTypeID - } - return nil // TODO: return error instead? -} - -func (ms *messageSet) Marshal(pb Message) error { - msg, err := Marshal(pb) - if err != nil { - return err - } - if item := ms.find(pb); item != nil { - // reuse existing item - item.Message = msg - return nil - } - - mti, ok := pb.(messageTypeIder) - if !ok { - return errNoMessageTypeID - } - - mtid := mti.MessageTypeId() - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: &mtid, - Message: msg, - }) - return nil -} - -func (ms *messageSet) Reset() { *ms = messageSet{} } -func (ms *messageSet) String() string { return CompactTextString(ms) } -func (*messageSet) ProtoMessage() {} - -// Support for the message_set_wire_format message option. - -func skipVarint(buf []byte) []byte { - i := 0 - for ; buf[i]&0x80 != 0; i++ { - } - return buf[i+1:] -} - -// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func unmarshalMessageSet(buf []byte, exts interface{}) error { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m = exts.extensionsWrite() - case map[int32]Extension: - m = exts - default: - return errors.New("proto: not an extension map") - } - - ms := new(messageSet) - if err := Unmarshal(buf, ms); err != nil { - return err - } - for _, item := range ms.Item { - id := *item.TypeId - msg := item.Message - - // Restore wire type and field number varint, plus length varint. - // Be careful to preserve duplicate items. - b := EncodeVarint(uint64(id)<<3 | WireBytes) - if ext, ok := m[id]; ok { - // Existing data; rip off the tag and length varint - // so we join the new data correctly. - // We can assume that ext.enc is set because we are unmarshaling. - o := ext.enc[len(b):] // skip wire type and field number - _, n := DecodeVarint(o) // calculate length of length varint - o = o[n:] // skip length varint - msg = append(o, msg...) // join old data and new data - } - b = append(b, EncodeVarint(uint64(len(msg)))...) - b = append(b, msg...) - - m[id] = Extension{enc: b} - } - return nil -} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go deleted file mode 100644 index 94fa919..0000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,360 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build purego appengine js - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "reflect" - "sync" -) - -const unsafeAllowed = false - -// A field identifies a field in a struct, accessible from a pointer. -// In this implementation, a field is identified by the sequence of field indices -// passed to reflect's FieldByIndex. -type field []int - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return f.Index -} - -// invalidField is an invalid field identifier. -var invalidField = field(nil) - -// zeroField is a noop when calling pointer.offset. -var zeroField = field([]int{}) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { return f != nil } - -// The pointer type is for the table-driven decoder. -// The implementation here uses a reflect.Value of pointer type to -// create a generic pointer. In pointer_unsafe.go we use unsafe -// instead of reflect to implement the same (but faster) interface. -type pointer struct { - v reflect.Value -} - -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - return pointer{v: reflect.ValueOf(*i)} -} - -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr, deref bool) pointer { - v := reflect.ValueOf(*i) - u := reflect.New(v.Type()) - u.Elem().Set(v) - if deref { - u = u.Elem() - } - return pointer{v: u} -} - -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{v: v} -} - -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} -} - -func (p pointer) isNil() bool { - return p.v.IsNil() -} - -// grow updates the slice s in place to make it one element longer. -// s must be addressable. -// Returns the (addressable) new element. -func grow(s reflect.Value) reflect.Value { - n, m := s.Len(), s.Cap() - if n < m { - s.SetLen(n + 1) - } else { - s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) - } - return s.Index(n) -} - -func (p pointer) toInt64() *int64 { - return p.v.Interface().(*int64) -} -func (p pointer) toInt64Ptr() **int64 { - return p.v.Interface().(**int64) -} -func (p pointer) toInt64Slice() *[]int64 { - return p.v.Interface().(*[]int64) -} - -var int32ptr = reflect.TypeOf((*int32)(nil)) - -func (p pointer) toInt32() *int32 { - return p.v.Convert(int32ptr).Interface().(*int32) -} - -// The toInt32Ptr/Slice methods don't work because of enums. -// Instead, we must use set/get methods for the int32ptr/slice case. -/* - func (p pointer) toInt32Ptr() **int32 { - return p.v.Interface().(**int32) -} - func (p pointer) toInt32Slice() *[]int32 { - return p.v.Interface().(*[]int32) -} -*/ -func (p pointer) getInt32Ptr() *int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().(*int32) - } - // an enum - return p.v.Elem().Convert(int32PtrType).Interface().(*int32) -} -func (p pointer) setInt32Ptr(v int32) { - // Allocate value in a *int32. Possibly convert that to a *enum. - // Then assign it to a **int32 or **enum. - // Note: we can convert *int32 to *enum, but we can't convert - // **int32 to **enum! - p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) -} - -// getInt32Slice copies []int32 from p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getInt32Slice() []int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().([]int32) - } - // an enum - // Allocate a []int32, then assign []enum's values into it. - // Note: we can't convert []enum to []int32. - slice := p.v.Elem() - s := make([]int32, slice.Len()) - for i := 0; i < slice.Len(); i++ { - s[i] = int32(slice.Index(i).Int()) - } - return s -} - -// setInt32Slice copies []int32 into p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setInt32Slice(v []int32) { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - p.v.Elem().Set(reflect.ValueOf(v)) - return - } - // an enum - // Allocate a []enum, then assign []int32's values into it. - // Note: we can't convert []enum to []int32. - slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) - for i, x := range v { - slice.Index(i).SetInt(int64(x)) - } - p.v.Elem().Set(slice) -} -func (p pointer) appendInt32Slice(v int32) { - grow(p.v.Elem()).SetInt(int64(v)) -} - -func (p pointer) toUint64() *uint64 { - return p.v.Interface().(*uint64) -} -func (p pointer) toUint64Ptr() **uint64 { - return p.v.Interface().(**uint64) -} -func (p pointer) toUint64Slice() *[]uint64 { - return p.v.Interface().(*[]uint64) -} -func (p pointer) toUint32() *uint32 { - return p.v.Interface().(*uint32) -} -func (p pointer) toUint32Ptr() **uint32 { - return p.v.Interface().(**uint32) -} -func (p pointer) toUint32Slice() *[]uint32 { - return p.v.Interface().(*[]uint32) -} -func (p pointer) toBool() *bool { - return p.v.Interface().(*bool) -} -func (p pointer) toBoolPtr() **bool { - return p.v.Interface().(**bool) -} -func (p pointer) toBoolSlice() *[]bool { - return p.v.Interface().(*[]bool) -} -func (p pointer) toFloat64() *float64 { - return p.v.Interface().(*float64) -} -func (p pointer) toFloat64Ptr() **float64 { - return p.v.Interface().(**float64) -} -func (p pointer) toFloat64Slice() *[]float64 { - return p.v.Interface().(*[]float64) -} -func (p pointer) toFloat32() *float32 { - return p.v.Interface().(*float32) -} -func (p pointer) toFloat32Ptr() **float32 { - return p.v.Interface().(**float32) -} -func (p pointer) toFloat32Slice() *[]float32 { - return p.v.Interface().(*[]float32) -} -func (p pointer) toString() *string { - return p.v.Interface().(*string) -} -func (p pointer) toStringPtr() **string { - return p.v.Interface().(**string) -} -func (p pointer) toStringSlice() *[]string { - return p.v.Interface().(*[]string) -} -func (p pointer) toBytes() *[]byte { - return p.v.Interface().(*[]byte) -} -func (p pointer) toBytesSlice() *[][]byte { - return p.v.Interface().(*[][]byte) -} -func (p pointer) toExtensions() *XXX_InternalExtensions { - return p.v.Interface().(*XXX_InternalExtensions) -} -func (p pointer) toOldExtensions() *map[int32]Extension { - return p.v.Interface().(*map[int32]Extension) -} -func (p pointer) getPointer() pointer { - return pointer{v: p.v.Elem()} -} -func (p pointer) setPointer(q pointer) { - p.v.Elem().Set(q.v) -} -func (p pointer) appendPointer(q pointer) { - grow(p.v.Elem()).Set(q.v) -} - -// getPointerSlice copies []*T from p as a new []pointer. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getPointerSlice() []pointer { - if p.v.IsNil() { - return nil - } - n := p.v.Elem().Len() - s := make([]pointer, n) - for i := 0; i < n; i++ { - s[i] = pointer{v: p.v.Elem().Index(i)} - } - return s -} - -// setPointerSlice copies []pointer into p as a new []*T. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setPointerSlice(v []pointer) { - if v == nil { - p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) - return - } - s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) - for _, p := range v { - s = reflect.Append(s, p.v) - } - p.v.Elem().Set(s) -} - -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - if p.v.Elem().IsNil() { - return pointer{v: p.v.Elem()} - } - return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct -} - -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - // TODO: check that p.v.Type().Elem() == t? - return p.v -} - -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} - -var atomicLock sync.Mutex diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go deleted file mode 100644 index dbfffe0..0000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,313 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !purego,!appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "sync/atomic" - "unsafe" -) - -const unsafeAllowed = true - -// A field identifies a field in a struct, accessible from a pointer. -// In this implementation, a field is identified by its byte offset from the start of the struct. -type field uintptr - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return field(f.Offset) -} - -// invalidField is an invalid field identifier. -const invalidField = ^field(0) - -// zeroField is a noop when calling pointer.offset. -const zeroField = field(0) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { - return f != invalidField -} - -// The pointer type below is for the new table-driven encoder/decoder. -// The implementation here uses unsafe.Pointer to create a generic pointer. -// In pointer_reflect.go we use reflect instead of unsafe to implement -// the same (but slower) interface. -type pointer struct { - p unsafe.Pointer -} - -// size of pointer -var ptrSize = unsafe.Sizeof(uintptr(0)) - -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - // Super-tricky - read pointer out of data word of interface value. - // Saves ~25ns over the equivalent: - // return valToPointer(reflect.ValueOf(*i)) - return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} -} - -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr, deref bool) (p pointer) { - // Super-tricky - read or get the address of data word of interface value. - if isptr { - // The interface is of pointer type, thus it is a direct interface. - // The data word is the pointer data itself. We take its address. - p = pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} - } else { - // The interface is not of pointer type. The data word is the pointer - // to the data. - p = pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} - } - if deref { - p.p = *(*unsafe.Pointer)(p.p) - } - return p -} - -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{p: unsafe.Pointer(v.Pointer())} -} - -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - // For safety, we should panic if !f.IsValid, however calling panic causes - // this to no longer be inlineable, which is a serious performance cost. - /* - if !f.IsValid() { - panic("invalid field") - } - */ - return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} -} - -func (p pointer) isNil() bool { - return p.p == nil -} - -func (p pointer) toInt64() *int64 { - return (*int64)(p.p) -} -func (p pointer) toInt64Ptr() **int64 { - return (**int64)(p.p) -} -func (p pointer) toInt64Slice() *[]int64 { - return (*[]int64)(p.p) -} -func (p pointer) toInt32() *int32 { - return (*int32)(p.p) -} - -// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. -/* - func (p pointer) toInt32Ptr() **int32 { - return (**int32)(p.p) - } - func (p pointer) toInt32Slice() *[]int32 { - return (*[]int32)(p.p) - } -*/ -func (p pointer) getInt32Ptr() *int32 { - return *(**int32)(p.p) -} -func (p pointer) setInt32Ptr(v int32) { - *(**int32)(p.p) = &v -} - -// getInt32Slice loads a []int32 from p. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getInt32Slice() []int32 { - return *(*[]int32)(p.p) -} - -// setInt32Slice stores a []int32 to p. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setInt32Slice(v []int32) { - *(*[]int32)(p.p) = v -} - -// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? -func (p pointer) appendInt32Slice(v int32) { - s := (*[]int32)(p.p) - *s = append(*s, v) -} - -func (p pointer) toUint64() *uint64 { - return (*uint64)(p.p) -} -func (p pointer) toUint64Ptr() **uint64 { - return (**uint64)(p.p) -} -func (p pointer) toUint64Slice() *[]uint64 { - return (*[]uint64)(p.p) -} -func (p pointer) toUint32() *uint32 { - return (*uint32)(p.p) -} -func (p pointer) toUint32Ptr() **uint32 { - return (**uint32)(p.p) -} -func (p pointer) toUint32Slice() *[]uint32 { - return (*[]uint32)(p.p) -} -func (p pointer) toBool() *bool { - return (*bool)(p.p) -} -func (p pointer) toBoolPtr() **bool { - return (**bool)(p.p) -} -func (p pointer) toBoolSlice() *[]bool { - return (*[]bool)(p.p) -} -func (p pointer) toFloat64() *float64 { - return (*float64)(p.p) -} -func (p pointer) toFloat64Ptr() **float64 { - return (**float64)(p.p) -} -func (p pointer) toFloat64Slice() *[]float64 { - return (*[]float64)(p.p) -} -func (p pointer) toFloat32() *float32 { - return (*float32)(p.p) -} -func (p pointer) toFloat32Ptr() **float32 { - return (**float32)(p.p) -} -func (p pointer) toFloat32Slice() *[]float32 { - return (*[]float32)(p.p) -} -func (p pointer) toString() *string { - return (*string)(p.p) -} -func (p pointer) toStringPtr() **string { - return (**string)(p.p) -} -func (p pointer) toStringSlice() *[]string { - return (*[]string)(p.p) -} -func (p pointer) toBytes() *[]byte { - return (*[]byte)(p.p) -} -func (p pointer) toBytesSlice() *[][]byte { - return (*[][]byte)(p.p) -} -func (p pointer) toExtensions() *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(p.p) -} -func (p pointer) toOldExtensions() *map[int32]Extension { - return (*map[int32]Extension)(p.p) -} - -// getPointerSlice loads []*T from p as a []pointer. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getPointerSlice() []pointer { - // Super-tricky - p should point to a []*T where T is a - // message type. We load it as []pointer. - return *(*[]pointer)(p.p) -} - -// setPointerSlice stores []pointer into p as a []*T. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setPointerSlice(v []pointer) { - // Super-tricky - p should point to a []*T where T is a - // message type. We store it as []pointer. - *(*[]pointer)(p.p) = v -} - -// getPointer loads the pointer at p and returns it. -func (p pointer) getPointer() pointer { - return pointer{p: *(*unsafe.Pointer)(p.p)} -} - -// setPointer stores the pointer q at p. -func (p pointer) setPointer(q pointer) { - *(*unsafe.Pointer)(p.p) = q.p -} - -// append q to the slice pointed to by p. -func (p pointer) appendPointer(q pointer) { - s := (*[]unsafe.Pointer)(p.p) - *s = append(*s, q.p) -} - -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - // Super-tricky - read pointer out of data word of interface value. - return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} -} - -// asPointerTo returns a reflect.Value that is a pointer to an -// object of type t stored at p. -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - return reflect.NewAt(t, p.p) -} - -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go deleted file mode 100644 index a4b8c0c..0000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,544 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "fmt" - "log" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -const debug bool = false - -// Constants that identify the encoding of a value on the wire. -const ( - WireVarint = 0 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 - WireFixed32 = 5 -) - -// tagMap is an optimization over map[int]int for typical protocol buffer -// use-cases. Encoded protocol buffers are often in tag order with small tag -// numbers. -type tagMap struct { - fastTags []int - slowTags map[int]int -} - -// tagMapFastLimit is the upper bound on the tag number that will be stored in -// the tagMap slice rather than its map. -const tagMapFastLimit = 1024 - -func (p *tagMap) get(t int) (int, bool) { - if t > 0 && t < tagMapFastLimit { - if t >= len(p.fastTags) { - return 0, false - } - fi := p.fastTags[t] - return fi, fi >= 0 - } - fi, ok := p.slowTags[t] - return fi, ok -} - -func (p *tagMap) put(t int, fi int) { - if t > 0 && t < tagMapFastLimit { - for len(p.fastTags) < t+1 { - p.fastTags = append(p.fastTags, -1) - } - p.fastTags[t] = fi - return - } - if p.slowTags == nil { - p.slowTags = make(map[int]int) - } - p.slowTags[t] = fi -} - -// StructProperties represents properties for all the fields of a struct. -// decoderTags and decoderOrigNames should only be used by the decoder. -type StructProperties struct { - Prop []*Properties // properties for each field - reqCount int // required count - decoderTags tagMap // map from proto tag to struct field number - decoderOrigNames map[string]int // map from original name to struct field number - order []int // list of struct field numbers in tag order - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the original name of a field. - OneofTypes map[string]*OneofProperties -} - -// OneofProperties represents information about a specific field in a oneof. -type OneofProperties struct { - Type reflect.Type // pointer to generated struct type for this oneof field - Field int // struct field number of the containing oneof in the message - Prop *Properties -} - -// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. -// See encode.go, (*Buffer).enc_struct. - -func (sp *StructProperties) Len() int { return len(sp.order) } -func (sp *StructProperties) Less(i, j int) bool { - return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag -} -func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } - -// Properties represents the protocol-specific behavior of a single struct field. -type Properties struct { - Name string // name of the field, for error messages - OrigName string // original name before protocol compiler (always set) - JSONName string // name to use for JSON; determined by protoc - Wire string - WireType int - Tag int - Required bool - Optional bool - Repeated bool - Packed bool // relevant for repeated primitives only - Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field - oneof bool // whether this is a oneof field - - Default string // default value - HasDefault bool // whether an explicit default was provided - - stype reflect.Type // set for struct types only - sprop *StructProperties // set for struct types only - - mtype reflect.Type // set for map types only - MapKeyProp *Properties // set for map types only - MapValProp *Properties // set for map types only -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s += "," - s += strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != p.OrigName { - s += ",json=" + p.JSONName - } - if p.proto3 { - s += ",proto3" - } - if p.oneof { - s += ",oneof" - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(s string) { - // "bytes,49,opt,name=foo,def=hello!" - fields := strings.Split(s, ",") // breaks def=, but handled below. - if len(fields) < 2 { - log.Printf("proto: tag has too few fields: %q", s) - return - } - - p.Wire = fields[0] - switch p.Wire { - case "varint": - p.WireType = WireVarint - case "fixed32": - p.WireType = WireFixed32 - case "fixed64": - p.WireType = WireFixed64 - case "zigzag32": - p.WireType = WireVarint - case "zigzag64": - p.WireType = WireVarint - case "bytes", "group": - p.WireType = WireBytes - // no numeric converter for non-numeric types - default: - log.Printf("proto: tag has unknown wire type: %q", s) - return - } - - var err error - p.Tag, err = strconv.Atoi(fields[1]) - if err != nil { - return - } - -outer: - for i := 2; i < len(fields); i++ { - f := fields[i] - switch { - case f == "req": - p.Required = true - case f == "opt": - p.Optional = true - case f == "rep": - p.Repeated = true - case f == "packed": - p.Packed = true - case strings.HasPrefix(f, "name="): - p.OrigName = f[5:] - case strings.HasPrefix(f, "json="): - p.JSONName = f[5:] - case strings.HasPrefix(f, "enum="): - p.Enum = f[5:] - case f == "proto3": - p.proto3 = true - case f == "oneof": - p.oneof = true - case strings.HasPrefix(f, "def="): - p.HasDefault = true - p.Default = f[4:] // rest of string - if i+1 < len(fields) { - // Commas aren't escaped, and def is always last. - p.Default += "," + strings.Join(fields[i+1:], ",") - break outer - } - } - } -} - -var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() - -// setFieldProps initializes the field properties for submessages and maps. -func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - switch t1 := typ; t1.Kind() { - case reflect.Ptr: - if t1.Elem().Kind() == reflect.Struct { - p.stype = t1.Elem() - } - - case reflect.Slice: - if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { - p.stype = t2.Elem() - } - - case reflect.Map: - p.mtype = t1 - p.MapKeyProp = &Properties{} - p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.MapValProp = &Properties{} - vtype := p.mtype.Elem() - if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { - // The value type is not a message (*T) or bytes ([]byte), - // so we need encoders for the pointer to this type. - vtype = reflect.PtrTo(vtype) - } - p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) - } - - if p.stype != nil { - if lockGetProp { - p.sprop = GetProperties(p.stype) - } else { - p.sprop = getPropertiesLocked(p.stype) - } - } -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() -) - -// Init populates the properties from a protocol buffer struct tag. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.init(typ, name, tag, f, true) -} - -func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { - // "bytes,49,opt,def=hello!" - p.Name = name - p.OrigName = name - if tag == "" { - return - } - p.Parse(tag) - p.setFieldProps(typ, f, lockGetProp) -} - -var ( - propertiesMu sync.RWMutex - propertiesMap = make(map[reflect.Type]*StructProperties) -) - -// GetProperties returns the list of properties for the type represented by t. -// t must represent a generated struct type of a protocol message. -func GetProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic("proto: type must have kind struct") - } - - // Most calls to GetProperties in a long-running program will be - // retrieving details for types we have seen before. - propertiesMu.RLock() - sprop, ok := propertiesMap[t] - propertiesMu.RUnlock() - if ok { - return sprop - } - - propertiesMu.Lock() - sprop = getPropertiesLocked(t) - propertiesMu.Unlock() - return sprop -} - -type ( - oneofFuncsIface interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) - } - oneofWrappersIface interface { - XXX_OneofWrappers() []interface{} - } -) - -// getPropertiesLocked requires that propertiesMu is held. -func getPropertiesLocked(t reflect.Type) *StructProperties { - if prop, ok := propertiesMap[t]; ok { - return prop - } - - prop := new(StructProperties) - // in case of recursive protos, fill this in now. - propertiesMap[t] = prop - - // build properties - prop.Prop = make([]*Properties, t.NumField()) - prop.order = make([]int, t.NumField()) - - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - p := new(Properties) - name := f.Name - p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - - oneof := f.Tag.Get("protobuf_oneof") // special case - if oneof != "" { - // Oneof fields don't use the traditional protobuf tag. - p.OrigName = oneof - } - prop.Prop[i] = p - prop.order[i] = i - if debug { - print(i, " ", f.Name, " ", t.String(), " ") - if p.Tag > 0 { - print(p.String()) - } - print("\n") - } - } - - // Re-order prop.order. - sort.Sort(prop) - - var oots []interface{} - switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { - case oneofFuncsIface: - _, _, _, oots = m.XXX_OneofFuncs() - case oneofWrappersIface: - oots = m.XXX_OneofWrappers() - } - if len(oots) > 0 { - // Interpret oneof metadata. - prop.OneofTypes = make(map[string]*OneofProperties) - for _, oot := range oots { - oop := &OneofProperties{ - Type: reflect.ValueOf(oot).Type(), // *T - Prop: new(Properties), - } - sft := oop.Type.Elem().Field(0) - oop.Prop.Name = sft.Name - oop.Prop.Parse(sft.Tag.Get("protobuf")) - // There will be exactly one interface field that - // this new value is assignable to. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Type.Kind() != reflect.Interface { - continue - } - if !oop.Type.AssignableTo(f.Type) { - continue - } - oop.Field = i - break - } - prop.OneofTypes[oop.Prop.OrigName] = oop - } - } - - // build required counts - // build tags - reqCount := 0 - prop.decoderOrigNames = make(map[string]int) - for i, p := range prop.Prop { - if strings.HasPrefix(p.Name, "XXX_") { - // Internal fields should not appear in tags/origNames maps. - // They are handled specially when encoding and decoding. - continue - } - if p.Required { - reqCount++ - } - prop.decoderTags.put(p.Tag, i) - prop.decoderOrigNames[p.OrigName] = i - } - prop.reqCount = reqCount - - return prop -} - -// A global registry of enum types. -// The generated code will register the generated maps by calling RegisterEnum. - -var enumValueMaps = make(map[string]map[string]int32) - -// RegisterEnum is called from the generated code to install the enum descriptor -// maps into the global table to aid parsing text format protocol buffers. -func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { - if _, ok := enumValueMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumValueMaps[typeName] = valueMap -} - -// EnumValueMap returns the mapping from names to integers of the -// enum type enumType, or a nil if not found. -func EnumValueMap(enumType string) map[string]int32 { - return enumValueMaps[enumType] -} - -// A registry of all linked message types. -// The string is a fully-qualified proto name ("pkg.Message"). -var ( - protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers - protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types - revProtoTypes = make(map[reflect.Type]string) -) - -// RegisterType is called from generated code and maps from the fully qualified -// proto name to the type (pointer to struct) of the protocol buffer. -func RegisterType(x Message, name string) { - if _, ok := protoTypedNils[name]; ok { - // TODO: Some day, make this a panic. - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { - // Generated code always calls RegisterType with nil x. - // This check is just for extra safety. - protoTypedNils[name] = x - } else { - protoTypedNils[name] = reflect.Zero(t).Interface().(Message) - } - revProtoTypes[t] = name -} - -// RegisterMapType is called from generated code and maps from the fully qualified -// proto name to the native map type of the proto map definition. -func RegisterMapType(x interface{}, name string) { - if reflect.TypeOf(x).Kind() != reflect.Map { - panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) - } - if _, ok := protoMapTypes[name]; ok { - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - protoMapTypes[name] = t - revProtoTypes[t] = name -} - -// MessageName returns the fully-qualified proto name for the given message type. -func MessageName(x Message) string { - type xname interface { - XXX_MessageName() string - } - if m, ok := x.(xname); ok { - return m.XXX_MessageName() - } - return revProtoTypes[reflect.TypeOf(x)] -} - -// MessageType returns the message type (pointer to struct) for a named message. -// The type is not guaranteed to implement proto.Message if the name refers to a -// map entry. -func MessageType(name string) reflect.Type { - if t, ok := protoTypedNils[name]; ok { - return reflect.TypeOf(t) - } - return protoMapTypes[name] -} - -// A registry of all linked proto files. -var ( - protoFiles = make(map[string][]byte) // file name => fileDescriptor -) - -// RegisterFile is called from generated code and maps from the -// full file name of a .proto file to its compressed FileDescriptorProto. -func RegisterFile(filename string, fileDescriptor []byte) { - protoFiles[filename] = fileDescriptor -} - -// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. -func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/golang/protobuf/proto/table_marshal.go deleted file mode 100644 index 5cb11fa..0000000 --- a/vendor/github.com/golang/protobuf/proto/table_marshal.go +++ /dev/null @@ -1,2776 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "math" - "reflect" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// a sizer takes a pointer to a field and the size of its tag, computes the size of -// the encoded data. -type sizer func(pointer, int) int - -// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), -// marshals the field to the end of the slice, returns the slice and error (if any). -type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) - -// marshalInfo is the information used for marshaling a message. -type marshalInfo struct { - typ reflect.Type - fields []*marshalFieldInfo - unrecognized field // offset of XXX_unrecognized - extensions field // offset of XXX_InternalExtensions - v1extensions field // offset of XXX_extensions - sizecache field // offset of XXX_sizecache - initialized int32 // 0 -- only typ is set, 1 -- fully initialized - messageset bool // uses message set wire format - hasmarshaler bool // has custom marshaler - sync.RWMutex // protect extElems map, also for initialization - extElems map[int32]*marshalElemInfo // info of extension elements -} - -// marshalFieldInfo is the information used for marshaling a field of a message. -type marshalFieldInfo struct { - field field - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isPointer bool - required bool // field is required - name string // name of the field, for error reporting - oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements -} - -// marshalElemInfo is the information used for marshaling an extension or oneof element. -type marshalElemInfo struct { - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) - deref bool // dereference the pointer before operating on it; implies isptr -} - -var ( - marshalInfoMap = map[reflect.Type]*marshalInfo{} - marshalInfoLock sync.Mutex -) - -// getMarshalInfo returns the information to marshal a given type of message. -// The info it returns may not necessarily initialized. -// t is the type of the message (NOT the pointer to it). -func getMarshalInfo(t reflect.Type) *marshalInfo { - marshalInfoLock.Lock() - u, ok := marshalInfoMap[t] - if !ok { - u = &marshalInfo{typ: t} - marshalInfoMap[t] = u - } - marshalInfoLock.Unlock() - return u -} - -// Size is the entry point from generated code, -// and should be ONLY called by generated code. -// It computes the size of encoded data of msg. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Size(msg Message) int { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return 0 - } - return u.size(ptr) -} - -// Marshal is the entry point from generated code, -// and should be ONLY called by generated code. -// It marshals msg to the end of b. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return b, ErrNil - } - return u.marshal(b, ptr, deterministic) -} - -func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { - // u := a.marshal, but atomically. - // We use an atomic here to ensure memory consistency. - u := atomicLoadMarshalInfo(&a.marshal) - if u == nil { - // Get marshal information from type of message. - t := reflect.ValueOf(msg).Type() - if t.Kind() != reflect.Ptr { - panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) - } - u = getMarshalInfo(t.Elem()) - // Store it in the cache for later users. - // a.marshal = u, but atomically. - atomicStoreMarshalInfo(&a.marshal, u) - } - return u -} - -// size is the main function to compute the size of the encoded data of a message. -// ptr is the pointer to the message. -func (u *marshalInfo) size(ptr pointer) int { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b, _ := m.Marshal() - return len(b) - } - - n := 0 - for _, f := range u.fields { - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - n += f.sizer(ptr.offset(f.field), f.tagsize) - } - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - n += u.sizeMessageSet(e) - } else { - n += u.sizeExtensions(e) - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - n += u.sizeV1Extensions(m) - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - n += len(s) - } - // cache the result for use in marshal - if u.sizecache.IsValid() { - atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) - } - return n -} - -// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), -// fall back to compute the size. -func (u *marshalInfo) cachedsize(ptr pointer) int { - if u.sizecache.IsValid() { - return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) - } - return u.size(ptr) -} - -// marshal is the main function to marshal a message. It takes a byte slice and appends -// the encoded data to the end of the slice, returns the slice and error (if any). -// ptr is the pointer to the message. -// If deterministic is true, map is marshaled in deterministic order. -func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b1, err := m.Marshal() - b = append(b, b1...) - return b, err - } - - var err, errLater error - // The old marshaler encodes extensions at beginning. - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - b, err = u.appendMessageSet(b, e, deterministic) - } else { - b, err = u.appendExtensions(b, e, deterministic) - } - if err != nil { - return b, err - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - b, err = u.appendV1Extensions(b, m, deterministic) - if err != nil { - return b, err - } - } - for _, f := range u.fields { - if f.required { - if ptr.offset(f.field).getPointer().isNil() { - // Required field is not set. - // We record the error but keep going, to give a complete marshaling. - if errLater == nil { - errLater = &RequiredNotSetError{f.name} - } - continue - } - } - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) - if err != nil { - if err1, ok := err.(*RequiredNotSetError); ok { - // Required field in submessage is not set. - // We record the error but keep going, to give a complete marshaling. - if errLater == nil { - errLater = &RequiredNotSetError{f.name + "." + err1.field} - } - continue - } - if err == errRepeatedHasNil { - err = errors.New("proto: repeated field " + f.name + " has nil element") - } - if err == errInvalidUTF8 { - if errLater == nil { - fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name - errLater = &invalidUTF8Error{fullName} - } - continue - } - return b, err - } - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - b = append(b, s...) - } - return b, errLater -} - -// computeMarshalInfo initializes the marshal info. -func (u *marshalInfo) computeMarshalInfo() { - u.Lock() - defer u.Unlock() - if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock - return - } - - t := u.typ - u.unrecognized = invalidField - u.extensions = invalidField - u.v1extensions = invalidField - u.sizecache = invalidField - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if reflect.PtrTo(t).Implements(marshalerType) { - u.hasmarshaler = true - atomic.StoreInt32(&u.initialized, 1) - return - } - - // get oneof implementers - var oneofImplementers []interface{} - switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { - case oneofFuncsIface: - _, _, _, oneofImplementers = m.XXX_OneofFuncs() - case oneofWrappersIface: - oneofImplementers = m.XXX_OneofWrappers() - } - - n := t.NumField() - - // deal with XXX fields first - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if !strings.HasPrefix(f.Name, "XXX_") { - continue - } - switch f.Name { - case "XXX_sizecache": - u.sizecache = toField(&f) - case "XXX_unrecognized": - u.unrecognized = toField(&f) - case "XXX_InternalExtensions": - u.extensions = toField(&f) - u.messageset = f.Tag.Get("protobuf_messageset") == "1" - case "XXX_extensions": - u.v1extensions = toField(&f) - case "XXX_NoUnkeyedLiteral": - // nothing to do - default: - panic("unknown XXX field: " + f.Name) - } - n-- - } - - // normal fields - fields := make([]marshalFieldInfo, n) // batch allocation - u.fields = make([]*marshalFieldInfo, 0, n) - for i, j := 0, 0; i < t.NumField(); i++ { - f := t.Field(i) - - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - field := &fields[j] - j++ - field.name = f.Name - u.fields = append(u.fields, field) - if f.Tag.Get("protobuf_oneof") != "" { - field.computeOneofFieldInfo(&f, oneofImplementers) - continue - } - if f.Tag.Get("protobuf") == "" { - // field has no tag (not in generated message), ignore it - u.fields = u.fields[:len(u.fields)-1] - j-- - continue - } - field.computeMarshalFieldInfo(&f) - } - - // fields are marshaled in tag order on the wire. - sort.Sort(byTag(u.fields)) - - atomic.StoreInt32(&u.initialized, 1) -} - -// helper for sorting fields by tag -type byTag []*marshalFieldInfo - -func (a byTag) Len() int { return len(a) } -func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } - -// getExtElemInfo returns the information to marshal an extension element. -// The info it returns is initialized. -func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { - // get from cache first - u.RLock() - e, ok := u.extElems[desc.Field] - u.RUnlock() - if ok { - return e - } - - t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct - tags := strings.Split(desc.Tag, ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - if t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct { - t = t.Elem() - } - sizer, marshaler := typeMarshaler(t, tags, false, false) - var deref bool - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - t = reflect.PtrTo(t) - deref = true - } - e = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizer, - marshaler: marshaler, - isptr: t.Kind() == reflect.Ptr, - deref: deref, - } - - // update cache - u.Lock() - if u.extElems == nil { - u.extElems = make(map[int32]*marshalElemInfo) - } - u.extElems[desc.Field] = e - u.Unlock() - return e -} - -// computeMarshalFieldInfo fills up the information to marshal a field. -func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { - // parse protobuf tag of the field. - // tag has format of "bytes,49,opt,name=foo,def=hello!" - tags := strings.Split(f.Tag.Get("protobuf"), ",") - if tags[0] == "" { - return - } - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - if tags[2] == "req" { - fi.required = true - } - fi.setTag(f, tag, wt) - fi.setMarshaler(f, tags) -} - -func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { - fi.field = toField(f) - fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. - fi.isPointer = true - fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) - fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) - - ityp := f.Type // interface type - for _, o := range oneofImplementers { - t := reflect.TypeOf(o) - if !t.Implements(ityp) { - continue - } - sf := t.Elem().Field(0) // oneof implementer is a struct with a single field - tags := strings.Split(sf.Tag.Get("protobuf"), ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value - fi.oneofElems[t.Elem()] = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizer, - marshaler: marshaler, - } - } -} - -// wiretype returns the wire encoding of the type. -func wiretype(encoding string) uint64 { - switch encoding { - case "fixed32": - return WireFixed32 - case "fixed64": - return WireFixed64 - case "varint", "zigzag32", "zigzag64": - return WireVarint - case "bytes": - return WireBytes - case "group": - return WireStartGroup - } - panic("unknown wire type " + encoding) -} - -// setTag fills up the tag (in wire format) and its size in the info of a field. -func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { - fi.field = toField(f) - fi.wiretag = uint64(tag)<<3 | wt - fi.tagsize = SizeVarint(uint64(tag) << 3) -} - -// setMarshaler fills up the sizer and marshaler in the info of a field. -func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { - switch f.Type.Kind() { - case reflect.Map: - // map field - fi.isPointer = true - fi.sizer, fi.marshaler = makeMapMarshaler(f) - return - case reflect.Ptr, reflect.Slice: - fi.isPointer = true - } - fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) -} - -// typeMarshaler returns the sizer and marshaler of a given field. -// t is the type of the field. -// tags is the generated "protobuf" tag of the field. -// If nozero is true, zero value is not marshaled to the wire. -// If oneof is true, it is a oneof field. -func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { - encoding := tags[0] - - pointer := false - slice := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - packed := false - proto3 := false - validateUTF8 := true - for i := 2; i < len(tags); i++ { - if tags[i] == "packed" { - packed = true - } - if tags[i] == "proto3" { - proto3 = true - } - } - validateUTF8 = validateUTF8 && proto3 - - switch t.Kind() { - case reflect.Bool: - if pointer { - return sizeBoolPtr, appendBoolPtr - } - if slice { - if packed { - return sizeBoolPackedSlice, appendBoolPackedSlice - } - return sizeBoolSlice, appendBoolSlice - } - if nozero { - return sizeBoolValueNoZero, appendBoolValueNoZero - } - return sizeBoolValue, appendBoolValue - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixed32Ptr, appendFixed32Ptr - } - if slice { - if packed { - return sizeFixed32PackedSlice, appendFixed32PackedSlice - } - return sizeFixed32Slice, appendFixed32Slice - } - if nozero { - return sizeFixed32ValueNoZero, appendFixed32ValueNoZero - } - return sizeFixed32Value, appendFixed32Value - case "varint": - if pointer { - return sizeVarint32Ptr, appendVarint32Ptr - } - if slice { - if packed { - return sizeVarint32PackedSlice, appendVarint32PackedSlice - } - return sizeVarint32Slice, appendVarint32Slice - } - if nozero { - return sizeVarint32ValueNoZero, appendVarint32ValueNoZero - } - return sizeVarint32Value, appendVarint32Value - } - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixedS32Ptr, appendFixedS32Ptr - } - if slice { - if packed { - return sizeFixedS32PackedSlice, appendFixedS32PackedSlice - } - return sizeFixedS32Slice, appendFixedS32Slice - } - if nozero { - return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero - } - return sizeFixedS32Value, appendFixedS32Value - case "varint": - if pointer { - return sizeVarintS32Ptr, appendVarintS32Ptr - } - if slice { - if packed { - return sizeVarintS32PackedSlice, appendVarintS32PackedSlice - } - return sizeVarintS32Slice, appendVarintS32Slice - } - if nozero { - return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero - } - return sizeVarintS32Value, appendVarintS32Value - case "zigzag32": - if pointer { - return sizeZigzag32Ptr, appendZigzag32Ptr - } - if slice { - if packed { - return sizeZigzag32PackedSlice, appendZigzag32PackedSlice - } - return sizeZigzag32Slice, appendZigzag32Slice - } - if nozero { - return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero - } - return sizeZigzag32Value, appendZigzag32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixed64Ptr, appendFixed64Ptr - } - if slice { - if packed { - return sizeFixed64PackedSlice, appendFixed64PackedSlice - } - return sizeFixed64Slice, appendFixed64Slice - } - if nozero { - return sizeFixed64ValueNoZero, appendFixed64ValueNoZero - } - return sizeFixed64Value, appendFixed64Value - case "varint": - if pointer { - return sizeVarint64Ptr, appendVarint64Ptr - } - if slice { - if packed { - return sizeVarint64PackedSlice, appendVarint64PackedSlice - } - return sizeVarint64Slice, appendVarint64Slice - } - if nozero { - return sizeVarint64ValueNoZero, appendVarint64ValueNoZero - } - return sizeVarint64Value, appendVarint64Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixedS64Ptr, appendFixedS64Ptr - } - if slice { - if packed { - return sizeFixedS64PackedSlice, appendFixedS64PackedSlice - } - return sizeFixedS64Slice, appendFixedS64Slice - } - if nozero { - return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero - } - return sizeFixedS64Value, appendFixedS64Value - case "varint": - if pointer { - return sizeVarintS64Ptr, appendVarintS64Ptr - } - if slice { - if packed { - return sizeVarintS64PackedSlice, appendVarintS64PackedSlice - } - return sizeVarintS64Slice, appendVarintS64Slice - } - if nozero { - return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero - } - return sizeVarintS64Value, appendVarintS64Value - case "zigzag64": - if pointer { - return sizeZigzag64Ptr, appendZigzag64Ptr - } - if slice { - if packed { - return sizeZigzag64PackedSlice, appendZigzag64PackedSlice - } - return sizeZigzag64Slice, appendZigzag64Slice - } - if nozero { - return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero - } - return sizeZigzag64Value, appendZigzag64Value - } - case reflect.Float32: - if pointer { - return sizeFloat32Ptr, appendFloat32Ptr - } - if slice { - if packed { - return sizeFloat32PackedSlice, appendFloat32PackedSlice - } - return sizeFloat32Slice, appendFloat32Slice - } - if nozero { - return sizeFloat32ValueNoZero, appendFloat32ValueNoZero - } - return sizeFloat32Value, appendFloat32Value - case reflect.Float64: - if pointer { - return sizeFloat64Ptr, appendFloat64Ptr - } - if slice { - if packed { - return sizeFloat64PackedSlice, appendFloat64PackedSlice - } - return sizeFloat64Slice, appendFloat64Slice - } - if nozero { - return sizeFloat64ValueNoZero, appendFloat64ValueNoZero - } - return sizeFloat64Value, appendFloat64Value - case reflect.String: - if validateUTF8 { - if pointer { - return sizeStringPtr, appendUTF8StringPtr - } - if slice { - return sizeStringSlice, appendUTF8StringSlice - } - if nozero { - return sizeStringValueNoZero, appendUTF8StringValueNoZero - } - return sizeStringValue, appendUTF8StringValue - } - if pointer { - return sizeStringPtr, appendStringPtr - } - if slice { - return sizeStringSlice, appendStringSlice - } - if nozero { - return sizeStringValueNoZero, appendStringValueNoZero - } - return sizeStringValue, appendStringValue - case reflect.Slice: - if slice { - return sizeBytesSlice, appendBytesSlice - } - if oneof { - // Oneof bytes field may also have "proto3" tag. - // We want to marshal it as a oneof field. Do this - // check before the proto3 check. - return sizeBytesOneof, appendBytesOneof - } - if proto3 { - return sizeBytes3, appendBytes3 - } - return sizeBytes, appendBytes - case reflect.Struct: - switch encoding { - case "group": - if slice { - return makeGroupSliceMarshaler(getMarshalInfo(t)) - } - return makeGroupMarshaler(getMarshalInfo(t)) - case "bytes": - if slice { - return makeMessageSliceMarshaler(getMarshalInfo(t)) - } - return makeMessageMarshaler(getMarshalInfo(t)) - } - } - panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) -} - -// Below are functions to size/marshal a specific type of a field. -// They are stored in the field's info, and called by function pointers. -// They have type sizer or marshaler. - -func sizeFixed32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixedS32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFloat32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - return (4 + tagsize) * len(s) -} -func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixed64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFixedS64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFloat64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - return (8 + tagsize) * len(s) -} -func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeVarint32Value(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarint32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarint64Value(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - return SizeVarint(v) + tagsize -} -func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return SizeVarint(v) + tagsize -} -func sizeVarint64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return SizeVarint(*p) + tagsize -} -func sizeVarint64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(v) + tagsize - } - return n -} -func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize - } - return n -} -func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize - } - return n -} -func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeBoolValue(_ pointer, tagsize int) int { - return 1 + tagsize -} -func sizeBoolValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toBool() - if !v { - return 0 - } - return 1 + tagsize -} -func sizeBoolPtr(ptr pointer, tagsize int) int { - p := *ptr.toBoolPtr() - if p == nil { - return 0 - } - return 1 + tagsize -} -func sizeBoolSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - return (1 + tagsize) * len(s) -} -func sizeBoolPackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return 0 - } - return len(s) + SizeVarint(uint64(len(s))) + tagsize -} -func sizeStringValue(ptr pointer, tagsize int) int { - v := *ptr.toString() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toString() - if v == "" { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringPtr(ptr pointer, tagsize int) int { - p := *ptr.toStringPtr() - if p == nil { - return 0 - } - v := *p - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringSlice(ptr pointer, tagsize int) int { - s := *ptr.toStringSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} -func sizeBytes(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if v == nil { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytes3(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if len(v) == 0 { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesOneof(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesSlice(ptr pointer, tagsize int) int { - s := *ptr.toBytesSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} - -// appendFixed32 appends an encoded fixed32 to b. -func appendFixed32(b []byte, v uint32) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24)) - return b -} - -// appendFixed64 appends an encoded fixed64 to b. -func appendFixed64(b []byte, v uint64) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24), - byte(v>>32), - byte(v>>40), - byte(v>>48), - byte(v>>56)) - return b -} - -// appendVarint appends an encoded varint to b. -func appendVarint(b []byte, v uint64) []byte { - // TODO: make 1-byte (maybe 2-byte) case inline-able, once we - // have non-leaf inliner. - switch { - case v < 1<<7: - b = append(b, byte(v)) - case v < 1<<14: - b = append(b, - byte(v&0x7f|0x80), - byte(v>>7)) - case v < 1<<21: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte(v>>14)) - case v < 1<<28: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte(v>>21)) - case v < 1<<35: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte(v>>28)) - case v < 1<<42: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte(v>>35)) - case v < 1<<49: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte(v>>42)) - case v < 1<<56: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte(v>>49)) - case v < 1<<63: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte(v>>56)) - default: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte((v>>56)&0x7f|0x80), - 1) - } - return b -} - -func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, *p) - return b, nil -} -func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(*p)) - return b, nil -} -func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(*p)) - return b, nil -} -func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, *p) - return b, nil -} -func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(*p)) - return b, nil -} -func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(*p)) - return b, nil -} -func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, *p) - return b, nil -} -func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - } - return b, nil -} -func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, v) - } - return b, nil -} -func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - if !v { - return b, nil - } - b = appendVarint(b, wiretag) - b = append(b, 1) - return b, nil -} - -func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toBoolPtr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - if *p { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(len(s))) - for _, v := range s { - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - if v == "" { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toStringPtr() - if p == nil { - return b, nil - } - v := *p - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toStringSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} -func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - v := *ptr.toString() - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - v := *ptr.toString() - if v == "" { - return b, nil - } - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - p := *ptr.toStringPtr() - if p == nil { - return b, nil - } - v := *p - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - s := *ptr.toStringSlice() - for _, v := range s { - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if v == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if len(v) == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBytesSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} - -// makeGroupMarshaler returns the sizer and marshaler for a group. -// u is the marshal info of the underlying message. -func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - return u.size(p) + 2*tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - var err error - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, p, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - return b, err - } -} - -// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. -// u is the marshal info of the underlying message. -func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - n += u.size(v) + 2*tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err error - var nerr nonFatal - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, v, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - if !nerr.Merge(err) { - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, nerr.E - } -} - -// makeMessageMarshaler returns the sizer and marshaler for a message field. -// u is the marshal info of the message. -func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - siz := u.size(p) - return siz + SizeVarint(uint64(siz)) + tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(p) - b = appendVarint(b, uint64(siz)) - return u.marshal(b, p, deterministic) - } -} - -// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. -// u is the marshal info of the message. -func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - siz := u.size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err error - var nerr nonFatal - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(v) - b = appendVarint(b, uint64(siz)) - b, err = u.marshal(b, v, deterministic) - - if !nerr.Merge(err) { - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, nerr.E - } -} - -// makeMapMarshaler returns the sizer and marshaler for a map field. -// f is the pointer to the reflect data structure of the field. -func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { - // figure out key and value type - t := f.Type - keyType := t.Key() - valType := t.Elem() - keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") - valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") - keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map - valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map - keyWireTag := 1<<3 | wiretype(keyTags[0]) - valWireTag := 2<<3 | wiretype(valTags[0]) - - // We create an interface to get the addresses of the map key and value. - // If value is pointer-typed, the interface is a direct interface, the - // idata itself is the value. Otherwise, the idata is the pointer to the - // value. - // Key cannot be pointer-typed. - valIsPtr := valType.Kind() == reflect.Ptr - - // If value is a message with nested maps, calling - // valSizer in marshal may be quadratic. We should use - // cached version in marshal (but not in size). - // If value is not message type, we don't have size cache, - // but it cannot be nested either. Just use valSizer. - valCachedSizer := valSizer - if valIsPtr && valType.Elem().Kind() == reflect.Struct { - u := getMarshalInfo(valType.Elem()) - valCachedSizer = func(ptr pointer, tagsize int) int { - // Same as message sizer, but use cache. - p := ptr.getPointer() - if p.isNil() { - return 0 - } - siz := u.cachedsize(p) - return siz + SizeVarint(uint64(siz)) + tagsize - } - } - return func(ptr pointer, tagsize int) int { - m := ptr.asPointerTo(t).Elem() // the map - n := 0 - for _, k := range m.MapKeys() { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value - siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { - m := ptr.asPointerTo(t).Elem() // the map - var err error - keys := m.MapKeys() - if len(keys) > 1 && deterministic { - sort.Sort(mapKeys(keys)) - } - - var nerr nonFatal - for _, k := range keys { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value - b = appendVarint(b, tag) - siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - b = appendVarint(b, uint64(siz)) - b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) - if !nerr.Merge(err) { - return b, err - } - b, err = valMarshaler(b, vaddr, valWireTag, deterministic) - if err != ErrNil && !nerr.Merge(err) { // allow nil value in map - return b, err - } - } - return b, nerr.E - } -} - -// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. -// fi is the marshal info of the field. -// f is the pointer to the reflect data structure of the field. -func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { - // Oneof field is an interface. We need to get the actual data type on the fly. - t := f.Type - return func(ptr pointer, _ int) int { - p := ptr.getInterfacePointer() - if p.isNil() { - return 0 - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - e := fi.oneofElems[telem] - return e.sizer(p, e.tagsize) - }, - func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { - p := ptr.getInterfacePointer() - if p.isNil() { - return b, nil - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { - return b, errOneofHasNil - } - e := fi.oneofElems[telem] - return e.marshaler(b, p, e.wiretag, deterministic) - } -} - -// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. -func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - n += ei.sizer(p, ei.tagsize) - } - mu.Unlock() - return n -} - -// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. -func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - var nerr nonFatal - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E - } - - // Sort the keys to provide a deterministic encoding. - // Not sure this is required, but the old code does it. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// message set format is: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } - -// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field -// in message set format (above). -func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for id, e := range m { - n += 2 // start group, end group. tag = 1 (size=1) - n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - siz := len(msgWithLen) - n += siz + 1 // message, tag = 3 (size=1) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - n += ei.sizer(p, 1) // message, tag = 3 (size=1) - } - mu.Unlock() - return n -} - -// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) -// to the end of byte slice b. -func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - var nerr nonFatal - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for id, e := range m { - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - if !nerr.Merge(err) { - return b, err - } - b = append(b, 1<<3|WireEndGroup) - } - return b, nerr.E - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, id := range keys { - e := m[int32(id)] - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - b = append(b, 1<<3|WireEndGroup) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// sizeV1Extensions computes the size of encoded data for a V1-API extension field. -func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { - if m == nil { - return 0 - } - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - n += ei.sizer(p, ei.tagsize) - } - return n -} - -// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. -func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { - if m == nil { - return b, nil - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - var err error - var nerr nonFatal - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr, ei.deref) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// newMarshaler is the interface representing objects that can marshal themselves. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newMarshaler interface { - XXX_Size() int - XXX_Marshal(b []byte, deterministic bool) ([]byte, error) -} - -// Size returns the encoded size of a protocol buffer message. -// This is the main entry point. -func Size(pb Message) int { - if m, ok := pb.(newMarshaler); ok { - return m.XXX_Size() - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - b, _ := m.Marshal() - return len(b) - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return 0 - } - var info InternalMessageInfo - return info.Size(pb) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, returning the data. -// This is the main entry point. -func Marshal(pb Message) ([]byte, error) { - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - b := make([]byte, 0, siz) - return m.XXX_Marshal(b, false) - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - return m.Marshal() - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return nil, ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - b := make([]byte, 0, siz) - return info.Marshal(b, pb, false) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, writing the result to the -// Buffer. -// This is an alternative entry point. It is not necessary to use -// a Buffer for most applications. -func (p *Buffer) Marshal(pb Message) error { - var err error - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - p.grow(siz) // make sure buf has enough capacity - p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) - return err - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - b, err := m.Marshal() - p.buf = append(p.buf, b...) - return err - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - p.grow(siz) // make sure buf has enough capacity - p.buf, err = info.Marshal(p.buf, pb, p.deterministic) - return err -} - -// grow grows the buffer's capacity, if necessary, to guarantee space for -// another n bytes. After grow(n), at least n bytes can be written to the -// buffer without another allocation. -func (p *Buffer) grow(n int) { - need := len(p.buf) + n - if need <= cap(p.buf) { - return - } - newCap := len(p.buf) * 2 - if newCap < need { - newCap = need - } - p.buf = append(make([]byte, 0, newCap), p.buf...) -} diff --git a/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/golang/protobuf/proto/table_merge.go deleted file mode 100644 index 5525def..0000000 --- a/vendor/github.com/golang/protobuf/proto/table_merge.go +++ /dev/null @@ -1,654 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -// Merge merges the src message into dst. -// This assumes that dst and src of the same type and are non-nil. -func (a *InternalMessageInfo) Merge(dst, src Message) { - mi := atomicLoadMergeInfo(&a.merge) - if mi == nil { - mi = getMergeInfo(reflect.TypeOf(dst).Elem()) - atomicStoreMergeInfo(&a.merge, mi) - } - mi.merge(toPointer(&dst), toPointer(&src)) -} - -type mergeInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []mergeFieldInfo - unrecognized field // Offset of XXX_unrecognized -} - -type mergeFieldInfo struct { - field field // Offset of field, guaranteed to be valid - - // isPointer reports whether the value in the field is a pointer. - // This is true for the following situations: - // * Pointer to struct - // * Pointer to basic type (proto2 only) - // * Slice (first value in slice header is a pointer) - // * String (first value in string header is a pointer) - isPointer bool - - // basicWidth reports the width of the field assuming that it is directly - // embedded in the struct (as is the case for basic types in proto3). - // The possible values are: - // 0: invalid - // 1: bool - // 4: int32, uint32, float32 - // 8: int64, uint64, float64 - basicWidth int - - // Where dst and src are pointers to the types being merged. - merge func(dst, src pointer) -} - -var ( - mergeInfoMap = map[reflect.Type]*mergeInfo{} - mergeInfoLock sync.Mutex -) - -func getMergeInfo(t reflect.Type) *mergeInfo { - mergeInfoLock.Lock() - defer mergeInfoLock.Unlock() - mi := mergeInfoMap[t] - if mi == nil { - mi = &mergeInfo{typ: t} - mergeInfoMap[t] = mi - } - return mi -} - -// merge merges src into dst assuming they are both of type *mi.typ. -func (mi *mergeInfo) merge(dst, src pointer) { - if dst.isNil() { - panic("proto: nil destination") - } - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&mi.initialized) == 0 { - mi.computeMergeInfo() - } - - for _, fi := range mi.fields { - sfp := src.offset(fi.field) - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string - continue - } - if fi.basicWidth > 0 { - switch { - case fi.basicWidth == 1 && !*sfp.toBool(): - continue - case fi.basicWidth == 4 && *sfp.toUint32() == 0: - continue - case fi.basicWidth == 8 && *sfp.toUint64() == 0: - continue - } - } - } - - dfp := dst.offset(fi.field) - fi.merge(dfp, sfp) - } - - // TODO: Make this faster? - out := dst.asPointerTo(mi.typ).Elem() - in := src.asPointerTo(mi.typ).Elem() - if emIn, err := extendable(in.Addr().Interface()); err == nil { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - if mi.unrecognized.IsValid() { - if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { - *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) - } - } -} - -func (mi *mergeInfo) computeMergeInfo() { - mi.lock.Lock() - defer mi.lock.Unlock() - if mi.initialized != 0 { - return - } - t := mi.typ - n := t.NumField() - - props := GetProperties(t) - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - mfi := mergeFieldInfo{field: toField(&f)} - tf := f.Type - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - switch tf.Kind() { - case reflect.Ptr, reflect.Slice, reflect.String: - // As a special case, we assume slices and strings are pointers - // since we know that the first field in the SliceSlice or - // StringHeader is a data pointer. - mfi.isPointer = true - case reflect.Bool: - mfi.basicWidth = 1 - case reflect.Int32, reflect.Uint32, reflect.Float32: - mfi.basicWidth = 4 - case reflect.Int64, reflect.Uint64, reflect.Float64: - mfi.basicWidth = 8 - } - } - - // Unwrap tf to get at its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + tf.Name()) - } - - switch tf.Kind() { - case reflect.Int32: - switch { - case isSlice: // E.g., []int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Slice is not defined (see pointer_reflect.go). - /* - sfsp := src.toInt32Slice() - if *sfsp != nil { - dfsp := dst.toInt32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - */ - sfs := src.getInt32Slice() - if sfs != nil { - dfs := dst.getInt32Slice() - dfs = append(dfs, sfs...) - if dfs == nil { - dfs = []int32{} - } - dst.setInt32Slice(dfs) - } - } - case isPointer: // E.g., *int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). - /* - sfpp := src.toInt32Ptr() - if *sfpp != nil { - dfpp := dst.toInt32Ptr() - if *dfpp == nil { - *dfpp = Int32(**sfpp) - } else { - **dfpp = **sfpp - } - } - */ - sfp := src.getInt32Ptr() - if sfp != nil { - dfp := dst.getInt32Ptr() - if dfp == nil { - dst.setInt32Ptr(*sfp) - } else { - *dfp = *sfp - } - } - } - default: // E.g., int32 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt32(); v != 0 { - *dst.toInt32() = v - } - } - } - case reflect.Int64: - switch { - case isSlice: // E.g., []int64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toInt64Slice() - if *sfsp != nil { - dfsp := dst.toInt64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - } - case isPointer: // E.g., *int64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toInt64Ptr() - if *sfpp != nil { - dfpp := dst.toInt64Ptr() - if *dfpp == nil { - *dfpp = Int64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., int64 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt64(); v != 0 { - *dst.toInt64() = v - } - } - } - case reflect.Uint32: - switch { - case isSlice: // E.g., []uint32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint32Slice() - if *sfsp != nil { - dfsp := dst.toUint32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint32{} - } - } - } - case isPointer: // E.g., *uint32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint32Ptr() - if *sfpp != nil { - dfpp := dst.toUint32Ptr() - if *dfpp == nil { - *dfpp = Uint32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint32 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint32(); v != 0 { - *dst.toUint32() = v - } - } - } - case reflect.Uint64: - switch { - case isSlice: // E.g., []uint64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint64Slice() - if *sfsp != nil { - dfsp := dst.toUint64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint64{} - } - } - } - case isPointer: // E.g., *uint64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint64Ptr() - if *sfpp != nil { - dfpp := dst.toUint64Ptr() - if *dfpp == nil { - *dfpp = Uint64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint64 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint64(); v != 0 { - *dst.toUint64() = v - } - } - } - case reflect.Float32: - switch { - case isSlice: // E.g., []float32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat32Slice() - if *sfsp != nil { - dfsp := dst.toFloat32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float32{} - } - } - } - case isPointer: // E.g., *float32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat32Ptr() - if *sfpp != nil { - dfpp := dst.toFloat32Ptr() - if *dfpp == nil { - *dfpp = Float32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float32 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat32(); v != 0 { - *dst.toFloat32() = v - } - } - } - case reflect.Float64: - switch { - case isSlice: // E.g., []float64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat64Slice() - if *sfsp != nil { - dfsp := dst.toFloat64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float64{} - } - } - } - case isPointer: // E.g., *float64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat64Ptr() - if *sfpp != nil { - dfpp := dst.toFloat64Ptr() - if *dfpp == nil { - *dfpp = Float64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float64 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat64(); v != 0 { - *dst.toFloat64() = v - } - } - } - case reflect.Bool: - switch { - case isSlice: // E.g., []bool - mfi.merge = func(dst, src pointer) { - sfsp := src.toBoolSlice() - if *sfsp != nil { - dfsp := dst.toBoolSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []bool{} - } - } - } - case isPointer: // E.g., *bool - mfi.merge = func(dst, src pointer) { - sfpp := src.toBoolPtr() - if *sfpp != nil { - dfpp := dst.toBoolPtr() - if *dfpp == nil { - *dfpp = Bool(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., bool - mfi.merge = func(dst, src pointer) { - if v := *src.toBool(); v { - *dst.toBool() = v - } - } - } - case reflect.String: - switch { - case isSlice: // E.g., []string - mfi.merge = func(dst, src pointer) { - sfsp := src.toStringSlice() - if *sfsp != nil { - dfsp := dst.toStringSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []string{} - } - } - } - case isPointer: // E.g., *string - mfi.merge = func(dst, src pointer) { - sfpp := src.toStringPtr() - if *sfpp != nil { - dfpp := dst.toStringPtr() - if *dfpp == nil { - *dfpp = String(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., string - mfi.merge = func(dst, src pointer) { - if v := *src.toString(); v != "" { - *dst.toString() = v - } - } - } - case reflect.Slice: - isProto3 := props.Prop[i].proto3 - switch { - case isPointer: - panic("bad pointer in byte slice case in " + tf.Name()) - case tf.Elem().Kind() != reflect.Uint8: - panic("bad element kind in byte slice case in " + tf.Name()) - case isSlice: // E.g., [][]byte - mfi.merge = func(dst, src pointer) { - sbsp := src.toBytesSlice() - if *sbsp != nil { - dbsp := dst.toBytesSlice() - for _, sb := range *sbsp { - if sb == nil { - *dbsp = append(*dbsp, nil) - } else { - *dbsp = append(*dbsp, append([]byte{}, sb...)) - } - } - if *dbsp == nil { - *dbsp = [][]byte{} - } - } - } - default: // E.g., []byte - mfi.merge = func(dst, src pointer) { - sbp := src.toBytes() - if *sbp != nil { - dbp := dst.toBytes() - if !isProto3 || len(*sbp) > 0 { - *dbp = append([]byte{}, *sbp...) - } - } - } - } - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("message field %s without pointer", tf)) - case isSlice: // E.g., []*pb.T - mi := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sps := src.getPointerSlice() - if sps != nil { - dps := dst.getPointerSlice() - for _, sp := range sps { - var dp pointer - if !sp.isNil() { - dp = valToPointer(reflect.New(tf)) - mi.merge(dp, sp) - } - dps = append(dps, dp) - } - if dps == nil { - dps = []pointer{} - } - dst.setPointerSlice(dps) - } - } - default: // E.g., *pb.T - mi := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sp := src.getPointer() - if !sp.isNil() { - dp := dst.getPointer() - if dp.isNil() { - dp = valToPointer(reflect.New(tf)) - dst.setPointer(dp) - } - mi.merge(dp, sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic("bad pointer or slice in map case in " + tf.Name()) - default: // E.g., map[K]V - mfi.merge = func(dst, src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - dm := dst.asPointerTo(tf).Elem() - if dm.IsNil() { - dm.Set(reflect.MakeMap(tf)) - } - - switch tf.Elem().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(Clone(val.Interface().(Message))) - dm.SetMapIndex(key, val) - } - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - dm.SetMapIndex(key, val) - } - default: // Basic type (e.g., string) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - dm.SetMapIndex(key, val) - } - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic("bad pointer or slice in interface case in " + tf.Name()) - default: // E.g., interface{} - // TODO: Make this faster? - mfi.merge = func(dst, src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - du := dst.asPointerTo(tf).Elem() - typ := su.Elem().Type() - if du.IsNil() || du.Elem().Type() != typ { - du.Set(reflect.New(typ.Elem())) // Initialize interface if empty - } - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - dv := du.Elem().Elem().Field(0) - if dv.Kind() == reflect.Ptr && dv.IsNil() { - dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - Merge(dv.Interface().(Message), sv.Interface().(Message)) - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) - default: // Basic type (e.g., string) - dv.Set(sv) - } - } - } - } - default: - panic(fmt.Sprintf("merger not found for type:%s", tf)) - } - mi.fields = append(mi.fields, mfi) - } - - mi.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - mi.unrecognized = toField(&f) - } - - atomic.StoreInt32(&mi.initialized, 1) -} diff --git a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go deleted file mode 100644 index acee2fc..0000000 --- a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go +++ /dev/null @@ -1,2053 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "io" - "math" - "reflect" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// Unmarshal is the entry point from the generated .pb.go files. -// This function is not intended to be used by non-generated code. -// This function is not subject to any compatibility guarantee. -// msg contains a pointer to a protocol buffer struct. -// b is the data to be unmarshaled into the protocol buffer. -// a is a pointer to a place to store cached unmarshal information. -func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { - // Load the unmarshal information for this message type. - // The atomic load ensures memory consistency. - u := atomicLoadUnmarshalInfo(&a.unmarshal) - if u == nil { - // Slow path: find unmarshal info for msg, update a with it. - u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) - atomicStoreUnmarshalInfo(&a.unmarshal, u) - } - // Then do the unmarshaling. - err := u.unmarshal(toPointer(&msg), b) - return err -} - -type unmarshalInfo struct { - typ reflect.Type // type of the protobuf struct - - // 0 = only typ field is initialized - // 1 = completely initialized - initialized int32 - lock sync.Mutex // prevents double initialization - dense []unmarshalFieldInfo // fields indexed by tag # - sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # - reqFields []string // names of required fields - reqMask uint64 // 1< 0 { - // Read tag and wire type. - // Special case 1 and 2 byte varints. - var x uint64 - if b[0] < 128 { - x = uint64(b[0]) - b = b[1:] - } else if len(b) >= 2 && b[1] < 128 { - x = uint64(b[0]&0x7f) + uint64(b[1])<<7 - b = b[2:] - } else { - var n int - x, n = decodeVarint(b) - if n == 0 { - return io.ErrUnexpectedEOF - } - b = b[n:] - } - tag := x >> 3 - wire := int(x) & 7 - - // Dispatch on the tag to one of the unmarshal* functions below. - var f unmarshalFieldInfo - if tag < uint64(len(u.dense)) { - f = u.dense[tag] - } else { - f = u.sparse[tag] - } - if fn := f.unmarshal; fn != nil { - var err error - b, err = fn(b, m.offset(f.field), wire) - if err == nil { - reqMask |= f.reqMask - continue - } - if r, ok := err.(*RequiredNotSetError); ok { - // Remember this error, but keep parsing. We need to produce - // a full parse even if a required field is missing. - if errLater == nil { - errLater = r - } - reqMask |= f.reqMask - continue - } - if err != errInternalBadWireType { - if err == errInvalidUTF8 { - if errLater == nil { - fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name - errLater = &invalidUTF8Error{fullName} - } - continue - } - return err - } - // Fragments with bad wire type are treated as unknown fields. - } - - // Unknown tag. - if !u.unrecognized.IsValid() { - // Don't keep unrecognized data; just skip it. - var err error - b, err = skipField(b, wire) - if err != nil { - return err - } - continue - } - // Keep unrecognized data around. - // maybe in extensions, maybe in the unrecognized field. - z := m.offset(u.unrecognized).toBytes() - var emap map[int32]Extension - var e Extension - for _, r := range u.extensionRanges { - if uint64(r.Start) <= tag && tag <= uint64(r.End) { - if u.extensions.IsValid() { - mp := m.offset(u.extensions).toExtensions() - emap = mp.extensionsWrite() - e = emap[int32(tag)] - z = &e.enc - break - } - if u.oldExtensions.IsValid() { - p := m.offset(u.oldExtensions).toOldExtensions() - emap = *p - if emap == nil { - emap = map[int32]Extension{} - *p = emap - } - e = emap[int32(tag)] - z = &e.enc - break - } - panic("no extensions field available") - } - } - - // Use wire type to skip data. - var err error - b0 := b - b, err = skipField(b, wire) - if err != nil { - return err - } - *z = encodeVarint(*z, tag<<3|uint64(wire)) - *z = append(*z, b0[:len(b0)-len(b)]...) - - if emap != nil { - emap[int32(tag)] = e - } - } - if reqMask != u.reqMask && errLater == nil { - // A required field of this message is missing. - for _, n := range u.reqFields { - if reqMask&1 == 0 { - errLater = &RequiredNotSetError{n} - } - reqMask >>= 1 - } - } - return errLater -} - -// computeUnmarshalInfo fills in u with information for use -// in unmarshaling protocol buffers of type u.typ. -func (u *unmarshalInfo) computeUnmarshalInfo() { - u.lock.Lock() - defer u.lock.Unlock() - if u.initialized != 0 { - return - } - t := u.typ - n := t.NumField() - - // Set up the "not found" value for the unrecognized byte buffer. - // This is the default for proto3. - u.unrecognized = invalidField - u.extensions = invalidField - u.oldExtensions = invalidField - - // List of the generated type and offset for each oneof field. - type oneofField struct { - ityp reflect.Type // interface type of oneof field - field field // offset in containing message - } - var oneofFields []oneofField - - for i := 0; i < n; i++ { - f := t.Field(i) - if f.Name == "XXX_unrecognized" { - // The byte slice used to hold unrecognized input is special. - if f.Type != reflect.TypeOf(([]byte)(nil)) { - panic("bad type for XXX_unrecognized field: " + f.Type.Name()) - } - u.unrecognized = toField(&f) - continue - } - if f.Name == "XXX_InternalExtensions" { - // Ditto here. - if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { - panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) - } - u.extensions = toField(&f) - if f.Tag.Get("protobuf_messageset") == "1" { - u.isMessageSet = true - } - continue - } - if f.Name == "XXX_extensions" { - // An older form of the extensions field. - if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { - panic("bad type for XXX_extensions field: " + f.Type.Name()) - } - u.oldExtensions = toField(&f) - continue - } - if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { - continue - } - - oneof := f.Tag.Get("protobuf_oneof") - if oneof != "" { - oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) - // The rest of oneof processing happens below. - continue - } - - tags := f.Tag.Get("protobuf") - tagArray := strings.Split(tags, ",") - if len(tagArray) < 2 { - panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) - } - tag, err := strconv.Atoi(tagArray[1]) - if err != nil { - panic("protobuf tag field not an integer: " + tagArray[1]) - } - - name := "" - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - } - - // Extract unmarshaling function from the field (its type and tags). - unmarshal := fieldUnmarshaler(&f) - - // Required field? - var reqMask uint64 - if tagArray[2] == "req" { - bit := len(u.reqFields) - u.reqFields = append(u.reqFields, name) - reqMask = uint64(1) << uint(bit) - // TODO: if we have more than 64 required fields, we end up - // not verifying that all required fields are present. - // Fix this, perhaps using a count of required fields? - } - - // Store the info in the correct slot in the message. - u.setTag(tag, toField(&f), unmarshal, reqMask, name) - } - - // Find any types associated with oneof fields. - var oneofImplementers []interface{} - switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { - case oneofFuncsIface: - _, _, _, oneofImplementers = m.XXX_OneofFuncs() - case oneofWrappersIface: - oneofImplementers = m.XXX_OneofWrappers() - } - for _, v := range oneofImplementers { - tptr := reflect.TypeOf(v) // *Msg_X - typ := tptr.Elem() // Msg_X - - f := typ.Field(0) // oneof implementers have one field - baseUnmarshal := fieldUnmarshaler(&f) - tags := strings.Split(f.Tag.Get("protobuf"), ",") - fieldNum, err := strconv.Atoi(tags[1]) - if err != nil { - panic("protobuf tag field not an integer: " + tags[1]) - } - var name string - for _, tag := range tags { - if strings.HasPrefix(tag, "name=") { - name = strings.TrimPrefix(tag, "name=") - break - } - } - - // Find the oneof field that this struct implements. - // Might take O(n^2) to process all of the oneofs, but who cares. - for _, of := range oneofFields { - if tptr.Implements(of.ityp) { - // We have found the corresponding interface for this struct. - // That lets us know where this struct should be stored - // when we encounter it during unmarshaling. - unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) - u.setTag(fieldNum, of.field, unmarshal, 0, name) - } - } - - } - - // Get extension ranges, if any. - fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") - if fn.IsValid() { - if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { - panic("a message with extensions, but no extensions field in " + t.Name()) - } - u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) - } - - // Explicitly disallow tag 0. This will ensure we flag an error - // when decoding a buffer of all zeros. Without this code, we - // would decode and skip an all-zero buffer of even length. - // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. - u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { - return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) - }, 0, "") - - // Set mask for required field check. - u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? - for len(u.dense) <= tag { - u.dense = append(u.dense, unmarshalFieldInfo{}) - } - u.dense[tag] = i - return - } - if u.sparse == nil { - u.sparse = map[uint64]unmarshalFieldInfo{} - } - u.sparse[uint64(tag)] = i -} - -// fieldUnmarshaler returns an unmarshaler for the given field. -func fieldUnmarshaler(f *reflect.StructField) unmarshaler { - if f.Type.Kind() == reflect.Map { - return makeUnmarshalMap(f) - } - return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) -} - -// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. -func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { - tagArray := strings.Split(tags, ",") - encoding := tagArray[0] - name := "unknown" - proto3 := false - validateUTF8 := true - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - if tag == "proto3" { - proto3 = true - } - } - validateUTF8 = validateUTF8 && proto3 - - // Figure out packaging (pointer, slice, or both) - slice := false - pointer := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - // We'll never have both pointer and slice for basic types. - if pointer && slice && t.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + t.Name()) - } - - switch t.Kind() { - case reflect.Bool: - if pointer { - return unmarshalBoolPtr - } - if slice { - return unmarshalBoolSlice - } - return unmarshalBoolValue - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixedS32Ptr - } - if slice { - return unmarshalFixedS32Slice - } - return unmarshalFixedS32Value - case "varint": - // this could be int32 or enum - if pointer { - return unmarshalInt32Ptr - } - if slice { - return unmarshalInt32Slice - } - return unmarshalInt32Value - case "zigzag32": - if pointer { - return unmarshalSint32Ptr - } - if slice { - return unmarshalSint32Slice - } - return unmarshalSint32Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixedS64Ptr - } - if slice { - return unmarshalFixedS64Slice - } - return unmarshalFixedS64Value - case "varint": - if pointer { - return unmarshalInt64Ptr - } - if slice { - return unmarshalInt64Slice - } - return unmarshalInt64Value - case "zigzag64": - if pointer { - return unmarshalSint64Ptr - } - if slice { - return unmarshalSint64Slice - } - return unmarshalSint64Value - } - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixed32Ptr - } - if slice { - return unmarshalFixed32Slice - } - return unmarshalFixed32Value - case "varint": - if pointer { - return unmarshalUint32Ptr - } - if slice { - return unmarshalUint32Slice - } - return unmarshalUint32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixed64Ptr - } - if slice { - return unmarshalFixed64Slice - } - return unmarshalFixed64Value - case "varint": - if pointer { - return unmarshalUint64Ptr - } - if slice { - return unmarshalUint64Slice - } - return unmarshalUint64Value - } - case reflect.Float32: - if pointer { - return unmarshalFloat32Ptr - } - if slice { - return unmarshalFloat32Slice - } - return unmarshalFloat32Value - case reflect.Float64: - if pointer { - return unmarshalFloat64Ptr - } - if slice { - return unmarshalFloat64Slice - } - return unmarshalFloat64Value - case reflect.Map: - panic("map type in typeUnmarshaler in " + t.Name()) - case reflect.Slice: - if pointer { - panic("bad pointer in slice case in " + t.Name()) - } - if slice { - return unmarshalBytesSlice - } - return unmarshalBytesValue - case reflect.String: - if validateUTF8 { - if pointer { - return unmarshalUTF8StringPtr - } - if slice { - return unmarshalUTF8StringSlice - } - return unmarshalUTF8StringValue - } - if pointer { - return unmarshalStringPtr - } - if slice { - return unmarshalStringSlice - } - return unmarshalStringValue - case reflect.Struct: - // message or group field - if !pointer { - panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) - } - switch encoding { - case "bytes": - if slice { - return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) - case "group": - if slice { - return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) - } - } - panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) -} - -// Below are all the unmarshalers for individual fields of various types. - -func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64() = v - return b, nil -} - -func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64() = v - return b, nil -} - -func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64() = v - return b, nil -} - -func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64Ptr() = &v - return b, nil -} - -func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - *f.toInt32() = v - return b, nil -} - -func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - *f.toInt32() = v - return b, nil -} - -func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32() = v - return b, nil -} - -func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32Ptr() = &v - return b, nil -} - -func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64() = v - return b[8:], nil -} - -func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64() = v - return b[8:], nil -} - -func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32() = v - return b[4:], nil -} - -func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32Ptr() = &v - return b[4:], nil -} - -func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - *f.toInt32() = v - return b[4:], nil -} - -func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.setInt32Ptr(v) - return b[4:], nil -} - -func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - return b[4:], nil -} - -func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - // Note: any length varint is allowed, even though any sane - // encoder will use one byte. - // See https://github.com/golang/protobuf/issues/76 - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - // TODO: check if x>1? Tests seem to indicate no. - v := x != 0 - *f.toBool() = v - return b[n:], nil -} - -func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - *f.toBoolPtr() = &v - return b[n:], nil -} - -func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - b = b[n:] - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - return b[n:], nil -} - -func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64() = v - return b[8:], nil -} - -func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64Ptr() = &v - return b[8:], nil -} - -func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32() = v - return b[4:], nil -} - -func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32Ptr() = &v - return b[4:], nil -} - -func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toString() = v - return b[x:], nil -} - -func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toStringPtr() = &v - return b[x:], nil -} - -func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - s := f.toStringSlice() - *s = append(*s, v) - return b[x:], nil -} - -func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toString() = v - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toStringPtr() = &v - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - s := f.toStringSlice() - *s = append(*s, v) - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -var emptyBuf [0]byte - -func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // The use of append here is a trick which avoids the zeroing - // that would be required if we used a make/copy pair. - // We append to emptyBuf instead of nil because we want - // a non-nil result even when the length is 0. - v := append(emptyBuf[:], b[:x]...) - *f.toBytes() = v - return b[x:], nil -} - -func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := append(emptyBuf[:], b[:x]...) - s := f.toBytesSlice() - *s = append(*s, v) - return b[x:], nil -} - -func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // First read the message field to see if something is there. - // The semantics of multiple submessages are weird. Instead of - // the last one winning (as it is for all other fields), multiple - // submessages are merged. - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[x:], err - } -} - -func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[x:], err - } -} - -func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[y:], err - } -} - -func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[y:], err - } -} - -func makeUnmarshalMap(f *reflect.StructField) unmarshaler { - t := f.Type - kt := t.Key() - vt := t.Elem() - unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) - unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) - return func(b []byte, f pointer, w int) ([]byte, error) { - // The map entry is a submessage. Figure out how big it is. - if w != WireBytes { - return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - r := b[x:] // unused data to return - b = b[:x] // data for map entry - - // Note: we could use #keys * #values ~= 200 functions - // to do map decoding without reflection. Probably not worth it. - // Maps will be somewhat slow. Oh well. - - // Read key and value from data. - var nerr nonFatal - k := reflect.New(kt) - v := reflect.New(vt) - for len(b) > 0 { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - wire := int(x) & 7 - b = b[n:] - - var err error - switch x >> 3 { - case 1: - b, err = unmarshalKey(b, valToPointer(k), wire) - case 2: - b, err = unmarshalVal(b, valToPointer(v), wire) - default: - err = errInternalBadWireType // skip unknown tag - } - - if nerr.Merge(err) { - continue - } - if err != errInternalBadWireType { - return nil, err - } - - // Skip past unknown fields. - b, err = skipField(b, wire) - if err != nil { - return nil, err - } - } - - // Get map, allocate if needed. - m := f.asPointerTo(t).Elem() // an addressable map[K]T - if m.IsNil() { - m.Set(reflect.MakeMap(t)) - } - - // Insert into map. - m.SetMapIndex(k.Elem(), v.Elem()) - - return r, nerr.E - } -} - -// makeUnmarshalOneof makes an unmarshaler for oneof fields. -// for: -// message Msg { -// oneof F { -// int64 X = 1; -// float64 Y = 2; -// } -// } -// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). -// ityp is the interface type of the oneof field (e.g. isMsg_F). -// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). -// Note that this function will be called once for each case in the oneof. -func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { - sf := typ.Field(0) - field0 := toField(&sf) - return func(b []byte, f pointer, w int) ([]byte, error) { - // Allocate holder for value. - v := reflect.New(typ) - - // Unmarshal data into holder. - // We unmarshal into the first field of the holder object. - var err error - var nerr nonFatal - b, err = unmarshal(b, valToPointer(v).offset(field0), w) - if !nerr.Merge(err) { - return nil, err - } - - // Write pointer to holder into target field. - f.asPointerTo(ityp).Elem().Set(v) - - return b, nerr.E - } -} - -// Error used by decode internally. -var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") - -// skipField skips past a field of type wire and returns the remaining bytes. -func skipField(b []byte, wire int) ([]byte, error) { - switch wire { - case WireVarint: - _, k := decodeVarint(b) - if k == 0 { - return b, io.ErrUnexpectedEOF - } - b = b[k:] - case WireFixed32: - if len(b) < 4 { - return b, io.ErrUnexpectedEOF - } - b = b[4:] - case WireFixed64: - if len(b) < 8 { - return b, io.ErrUnexpectedEOF - } - b = b[8:] - case WireBytes: - m, k := decodeVarint(b) - if k == 0 || uint64(len(b)-k) < m { - return b, io.ErrUnexpectedEOF - } - b = b[uint64(k)+m:] - case WireStartGroup: - _, i := findEndGroup(b) - if i == -1 { - return b, io.ErrUnexpectedEOF - } - b = b[i:] - default: - return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) - } - return b, nil -} - -// findEndGroup finds the index of the next EndGroup tag. -// Groups may be nested, so the "next" EndGroup tag is the first -// unpaired EndGroup. -// findEndGroup returns the indexes of the start and end of the EndGroup tag. -// Returns (-1,-1) if it can't find one. -func findEndGroup(b []byte) (int, int) { - depth := 1 - i := 0 - for { - x, n := decodeVarint(b[i:]) - if n == 0 { - return -1, -1 - } - j := i - i += n - switch x & 7 { - case WireVarint: - _, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - case WireFixed32: - if len(b)-4 < i { - return -1, -1 - } - i += 4 - case WireFixed64: - if len(b)-8 < i { - return -1, -1 - } - i += 8 - case WireBytes: - m, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - if uint64(len(b)-i) < m { - return -1, -1 - } - i += int(m) - case WireStartGroup: - depth++ - case WireEndGroup: - depth-- - if depth == 0 { - return j, i - } - default: - return -1, -1 - } - } -} - -// encodeVarint appends a varint-encoded integer to b and returns the result. -func encodeVarint(b []byte, x uint64) []byte { - for x >= 1<<7 { - b = append(b, byte(x&0x7f|0x80)) - x >>= 7 - } - return append(b, byte(x)) -} - -// decodeVarint reads a varint-encoded integer from b. -// Returns the decoded integer and the number of bytes read. -// If there is an error, it returns 0,0. -func decodeVarint(b []byte) (uint64, int) { - var x, y uint64 - if len(b) == 0 { - goto bad - } - x = uint64(b[0]) - if x < 0x80 { - return x, 1 - } - x -= 0x80 - - if len(b) <= 1 { - goto bad - } - y = uint64(b[1]) - x += y << 7 - if y < 0x80 { - return x, 2 - } - x -= 0x80 << 7 - - if len(b) <= 2 { - goto bad - } - y = uint64(b[2]) - x += y << 14 - if y < 0x80 { - return x, 3 - } - x -= 0x80 << 14 - - if len(b) <= 3 { - goto bad - } - y = uint64(b[3]) - x += y << 21 - if y < 0x80 { - return x, 4 - } - x -= 0x80 << 21 - - if len(b) <= 4 { - goto bad - } - y = uint64(b[4]) - x += y << 28 - if y < 0x80 { - return x, 5 - } - x -= 0x80 << 28 - - if len(b) <= 5 { - goto bad - } - y = uint64(b[5]) - x += y << 35 - if y < 0x80 { - return x, 6 - } - x -= 0x80 << 35 - - if len(b) <= 6 { - goto bad - } - y = uint64(b[6]) - x += y << 42 - if y < 0x80 { - return x, 7 - } - x -= 0x80 << 42 - - if len(b) <= 7 { - goto bad - } - y = uint64(b[7]) - x += y << 49 - if y < 0x80 { - return x, 8 - } - x -= 0x80 << 49 - - if len(b) <= 8 { - goto bad - } - y = uint64(b[8]) - x += y << 56 - if y < 0x80 { - return x, 9 - } - x -= 0x80 << 56 - - if len(b) <= 9 { - goto bad - } - y = uint64(b[9]) - x += y << 63 - if y < 2 { - return x, 10 - } - -bad: - return 0, 0 -} diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go deleted file mode 100644 index d97f9b3..0000000 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ /dev/null @@ -1,845 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for writing the text protocol buffer format. - -import ( - "bufio" - "bytes" - "encoding" - "errors" - "fmt" - "io" - "log" - "math" - "reflect" - "sort" - "strings" -) - -var ( - newline = []byte("\n") - spaces = []byte(" ") - endBraceNewline = []byte("}\n") - backslashN = []byte{'\\', 'n'} - backslashR = []byte{'\\', 'r'} - backslashT = []byte{'\\', 't'} - backslashDQ = []byte{'\\', '"'} - backslashBS = []byte{'\\', '\\'} - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -type writer interface { - io.Writer - WriteByte(byte) error -} - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - ind int - complete bool // if the current position is a complete line - compact bool // whether to write out as a one-liner - w writer -} - -func (w *textWriter) WriteString(s string) (n int, err error) { - if !strings.Contains(s, "\n") { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - return io.WriteString(w.w, s) - } - // WriteString is typically called without newlines, so this - // codepath and its copy are rare. We copy to avoid - // duplicating all of Write's logic here. - return w.Write([]byte(s)) -} - -func (w *textWriter) Write(p []byte) (n int, err error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - n, err = w.w.Write(p) - w.complete = false - return n, err - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - if err := w.w.WriteByte(' '); err != nil { - return n, err - } - n++ - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - if i+1 < len(frags) { - if err := w.w.WriteByte('\n'); err != nil { - return n, err - } - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - err := w.w.WriteByte(c) - w.complete = c == '\n' - return err -} - -func (w *textWriter) indent() { w.ind++ } - -func (w *textWriter) unindent() { - if w.ind == 0 { - log.Print("proto: textWriter unindented too far") - return - } - w.ind-- -} - -func writeName(w *textWriter, props *Properties) error { - if _, err := w.WriteString(props.OrigName); err != nil { - return err - } - if props.Wire != "group" { - return w.WriteByte(':') - } - return nil -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// isAny reports whether sv is a google.protobuf.Any message -func isAny(sv reflect.Value) bool { - type wkt interface { - XXX_WellKnownType() string - } - t, ok := sv.Addr().Interface().(wkt) - return ok && t.XXX_WellKnownType() == "Any" -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { - turl := sv.FieldByName("TypeUrl") - val := sv.FieldByName("Value") - if !turl.IsValid() || !val.IsValid() { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - b, ok := val.Interface().([]byte) - if !ok { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - parts := strings.Split(turl.String(), "/") - mt := MessageType(parts[len(parts)-1]) - if mt == nil { - return false, nil - } - m := reflect.New(mt.Elem()) - if err := Unmarshal(b, m.Interface().(Message)); err != nil { - return false, nil - } - w.Write([]byte("[")) - u := turl.String() - if requiresQuotes(u) { - writeString(w, u) - } else { - w.Write([]byte(u)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.ind++ - } - if err := tm.writeStruct(w, m.Elem()); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.ind-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { - if tm.ExpandAny && isAny(sv) { - if canExpand, err := tm.writeProto3Any(w, sv); canExpand { - return err - } - } - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < sv.NumField(); i++ { - fv := sv.Field(i) - props := sprops.Prop[i] - name := st.Field(i).Name - - if name == "XXX_NoUnkeyedLiteral" { - continue - } - - if strings.HasPrefix(name, "XXX_") { - // There are two XXX_ fields: - // XXX_unrecognized []byte - // XXX_extensions map[int32]proto.Extension - // The first is handled here; - // the second is handled at the bottom of this function. - if name == "XXX_unrecognized" && !fv.IsNil() { - if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Field not filled in. This could be an optional field or - // a required field that wasn't filled in. Either way, there - // isn't anything we can show for it. - continue - } - if fv.Kind() == reflect.Slice && fv.IsNil() { - // Repeated field that is empty, or a bytes field that is unused. - continue - } - - if props.Repeated && fv.Kind() == reflect.Slice { - // Repeated field. - for j := 0; j < fv.Len(); j++ { - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - v := fv.Index(j) - if v.Kind() == reflect.Ptr && v.IsNil() { - // A nil message in a repeated field is not valid, - // but we can handle that more gracefully than panicking. - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - continue - } - if err := tm.writeAny(w, v, props); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Map { - // Map fields are rendered as a repeated struct with key/value fields. - keys := fv.MapKeys() - sort.Sort(mapKeys(keys)) - for _, key := range keys { - val := fv.MapIndex(key) - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - // open struct - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - // key - if _, err := w.WriteString("key:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - // nil values aren't legal, but we can avoid panicking because of them. - if val.Kind() != reflect.Ptr || !val.IsNil() { - // value - if _, err := w.WriteString("value:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, val, props.MapValProp); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - // close struct - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { - // empty bytes field - continue - } - if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { - // proto3 non-repeated scalar field; skip if zero value - if isProto3Zero(fv) { - continue - } - } - - if fv.Kind() == reflect.Interface { - // Check if it is a oneof. - if st.Field(i).Tag.Get("protobuf_oneof") != "" { - // fv is nil, or holds a pointer to generated struct. - // That generated struct has exactly one field, - // which has a protobuf struct tag. - if fv.IsNil() { - continue - } - inner := fv.Elem().Elem() // interface -> *T -> T - tag := inner.Type().Field(0).Tag.Get("protobuf") - props = new(Properties) // Overwrite the outer props var, but not its pointee. - props.Parse(tag) - // Write the value in the oneof, not the oneof itself. - fv = inner.Field(0) - - // Special case to cope with malformed messages gracefully: - // If the value in the oneof is a nil pointer, don't panic - // in writeAny. - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Use errors.New so writeAny won't render quotes. - msg := errors.New("/* nil */") - fv = reflect.ValueOf(&msg).Elem() - } - } - } - - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - - // Enums have a String method, so writeAny will work fine. - if err := tm.writeAny(w, fv, props); err != nil { - return err - } - - if err := w.WriteByte('\n'); err != nil { - return err - } - } - - // Extensions (the XXX_extensions field). - pv := sv.Addr() - if _, err := extendable(pv.Interface()); err == nil { - if err := tm.writeExtensions(w, pv); err != nil { - return err - } - } - - return nil -} - -var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() - -// writeAny writes an arbitrary field. -func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { - v = reflect.Indirect(v) - - // Floats have special cases. - if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { - x := v.Float() - var b []byte - switch { - case math.IsInf(x, 1): - b = posInf - case math.IsInf(x, -1): - b = negInf - case math.IsNaN(x): - b = nan - } - if b != nil { - _, err := w.Write(b) - return err - } - // Other values are handled below. - } - - // We don't attempt to serialise every possible value type; only those - // that can occur in protocol buffers. - switch v.Kind() { - case reflect.Slice: - // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Bytes())); err != nil { - return err - } - case reflect.String: - if err := writeString(w, v.String()); err != nil { - return err - } - case reflect.Struct: - // Required/optional group/message. - var bra, ket byte = '<', '>' - if props != nil && props.Wire == "group" { - bra, ket = '{', '}' - } - if err := w.WriteByte(bra); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if v.CanAddr() { - // Calling v.Interface on a struct causes the reflect package to - // copy the entire struct. This is racy with the new Marshaler - // since we atomically update the XXX_sizecache. - // - // Thus, we retrieve a pointer to the struct if possible to avoid - // a race since v.Interface on the pointer doesn't copy the struct. - // - // If v is not addressable, then we are not worried about a race - // since it implies that the binary Marshaler cannot possibly be - // mutating this value. - v = v.Addr() - } - if v.Type().Implements(textMarshalerType) { - text, err := v.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return err - } - if _, err = w.Write(text); err != nil { - return err - } - } else { - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - if err := tm.writeStruct(w, v); err != nil { - return err - } - } - w.unindent() - if err := w.WriteByte(ket); err != nil { - return err - } - default: - _, err := fmt.Fprint(w, v.Interface()) - return err - } - return nil -} - -// equivalent to C's isprint. -func isprint(c byte) bool { - return c >= 0x20 && c < 0x7f -} - -// writeString writes a string in the protocol buffer text format. -// It is similar to strconv.Quote except we don't use Go escape sequences, -// we treat the string as a byte sequence, and we use octal escapes. -// These differences are to maintain interoperability with the other -// languages' implementations of the text format. -func writeString(w *textWriter, s string) error { - // use WriteByte here to get any needed indent - if err := w.WriteByte('"'); err != nil { - return err - } - // Loop over the bytes, not the runes. - for i := 0; i < len(s); i++ { - var err error - // Divergence from C++: we don't escape apostrophes. - // There's no need to escape them, and the C++ parser - // copes with a naked apostrophe. - switch c := s[i]; c { - case '\n': - _, err = w.w.Write(backslashN) - case '\r': - _, err = w.w.Write(backslashR) - case '\t': - _, err = w.w.Write(backslashT) - case '"': - _, err = w.w.Write(backslashDQ) - case '\\': - _, err = w.w.Write(backslashBS) - default: - if isprint(c) { - err = w.w.WriteByte(c) - } else { - _, err = fmt.Fprintf(w.w, "\\%03o", c) - } - } - if err != nil { - return err - } - } - return w.WriteByte('"') -} - -func writeUnknownStruct(w *textWriter, data []byte) (err error) { - if !w.compact { - if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { - return err - } - } - b := NewBuffer(data) - for b.index < len(b.buf) { - x, err := b.DecodeVarint() - if err != nil { - _, err := fmt.Fprintf(w, "/* %v */\n", err) - return err - } - wire, tag := x&7, x>>3 - if wire == WireEndGroup { - w.unindent() - if _, err := w.Write(endBraceNewline); err != nil { - return err - } - continue - } - if _, err := fmt.Fprint(w, tag); err != nil { - return err - } - if wire != WireStartGroup { - if err := w.WriteByte(':'); err != nil { - return err - } - } - if !w.compact || wire == WireStartGroup { - if err := w.WriteByte(' '); err != nil { - return err - } - } - switch wire { - case WireBytes: - buf, e := b.DecodeRawBytes(false) - if e == nil { - _, err = fmt.Fprintf(w, "%q", buf) - } else { - _, err = fmt.Fprintf(w, "/* %v */", e) - } - case WireFixed32: - x, err = b.DecodeFixed32() - err = writeUnknownInt(w, x, err) - case WireFixed64: - x, err = b.DecodeFixed64() - err = writeUnknownInt(w, x, err) - case WireStartGroup: - err = w.WriteByte('{') - w.indent() - case WireVarint: - x, err = b.DecodeVarint() - err = writeUnknownInt(w, x, err) - default: - _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) - } - if err != nil { - return err - } - if err = w.WriteByte('\n'); err != nil { - return err - } - } - return nil -} - -func writeUnknownInt(w *textWriter, x uint64, err error) error { - if err == nil { - _, err = fmt.Fprint(w, x) - } else { - _, err = fmt.Fprintf(w, "/* %v */", err) - } - return err -} - -type int32Slice []int32 - -func (s int32Slice) Len() int { return len(s) } -func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// writeExtensions writes all the extensions in pv. -// pv is assumed to be a pointer to a protocol message struct that is extendable. -func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { - emap := extensionMaps[pv.Type().Elem()] - ep, _ := extendable(pv.Interface()) - - // Order the extensions by ID. - // This isn't strictly necessary, but it will give us - // canonical output, which will also make testing easier. - m, mu := ep.extensionsRead() - if m == nil { - return nil - } - mu.Lock() - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) - mu.Unlock() - - for _, extNum := range ids { - ext := m[extNum] - var desc *ExtensionDesc - if emap != nil { - desc = emap[extNum] - } - if desc == nil { - // Unknown extension. - if err := writeUnknownStruct(w, ext.enc); err != nil { - return err - } - continue - } - - pb, err := GetExtension(ep, desc) - if err != nil { - return fmt.Errorf("failed getting extension: %v", err) - } - - // Repeated extensions will appear as a slice. - if !desc.repeated() { - if err := tm.writeExtension(w, desc.Name, pb); err != nil { - return err - } - } else { - v := reflect.ValueOf(pb) - for i := 0; i < v.Len(); i++ { - if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { - return err - } - } - } - } - return nil -} - -func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { - if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - remain := w.ind * 2 - for remain > 0 { - n := remain - if n > len(spaces) { - n = len(spaces) - } - w.w.Write(spaces[:n]) - remain -= n - } - w.complete = false -} - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line). - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes a given protocol buffer in text format. -// The only errors returned are from w. -func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { - val := reflect.ValueOf(pb) - if pb == nil || val.IsNil() { - w.Write([]byte("")) - return nil - } - var bw *bufio.Writer - ww, ok := w.(writer) - if !ok { - bw = bufio.NewWriter(w) - ww = bw - } - aw := &textWriter{ - w: ww, - complete: true, - compact: tm.Compact, - } - - if etm, ok := pb.(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = aw.Write(text); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil - } - // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(val) - if err := tm.writeStruct(aw, v); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil -} - -// Text is the same as Marshal, but returns the string directly. -func (tm *TextMarshaler) Text(pb Message) string { - var buf bytes.Buffer - tm.Marshal(&buf, pb) - return buf.String() -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// TODO: consider removing some of the Marshal functions below. - -// MarshalText writes a given protocol buffer in text format. -// The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } - -// MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } - -// CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } - -// CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go deleted file mode 100644 index bb55a3a..0000000 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ /dev/null @@ -1,880 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for parsing the Text protocol buffer format. -// TODO: message sets. - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" -) - -// Error string emitted when deserializing Any and fields are already set -const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" - -type ParseError struct { - Message string - Line int // 1-based line number - Offset int // 0-based byte offset from start of input -} - -func (p *ParseError) Error() string { - if p.Line == 1 { - // show offset only for first line - return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) - } - return fmt.Sprintf("line %d: %v", p.Line, p.Message) -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func (t *token) String() string { - if t.err == nil { - return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) - } - return fmt.Sprintf("parse error: %v", t.err) -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -// Numbers and identifiers are matched by [-+._A-Za-z0-9] -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -var ( - errBadUTF8 = errors.New("proto: bad UTF-8") -) - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - ss := string(r) + s[:2] - s = s[2:] - i, err := strconv.ParseUint(ss, 8, 8) - if err != nil { - return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) - } - return string([]byte{byte(i)}), s, nil - case 'x', 'X', 'u', 'U': - var n int - switch r { - case 'x', 'X': - n = 2 - case 'u': - n = 4 - case 'U': - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) - } - ss := s[:n] - s = s[n:] - i, err := strconv.ParseUint(ss, 16, 64) - if err != nil { - return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) - } - if r == 'x' || r == 'X' { - return string([]byte{byte(i)}), s, nil - } - if i > utf8.MaxRune { - return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) - } - return string(i), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -// Return a RequiredNotSetError indicating which required field was not set. -func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < st.NumField(); i++ { - if !isNil(sv.Field(i)) { - continue - } - - props := sprops.Prop[i] - if props.Required { - return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} - } - } - return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen -} - -// Returns the index in the struct for the named field, as well as the parsed tag properties. -func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { - i, ok := sprops.decoderOrigNames[name] - if ok { - return i, sprops.Prop[i], true - } - return -1, nil, false -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - // Colon is optional when the field is a group or message. - needColon := true - switch props.Wire { - case "group": - needColon = false - case "bytes": - // A "bytes" field is either a message, a string, or a repeated field; - // those three become *T, *string and []T respectively, so we can check for - // this field being a pointer to a non-string. - if typ.Kind() == reflect.Ptr { - // *T or *string - if typ.Elem().Kind() == reflect.String { - break - } - } else if typ.Kind() == reflect.Slice { - // []T or []*T - if typ.Elem().Kind() != reflect.Ptr { - break - } - } else if typ.Kind() == reflect.String { - // The proto3 exception is for a string field, - // which requires a colon. - break - } - needColon = false - } - if needColon { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -func (p *textParser) readStruct(sv reflect.Value, terminator string) error { - st := sv.Type() - sprops := GetProperties(st) - reqCount := sprops.reqCount - var reqFieldErr error - fieldSet := make(map[string]bool) - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - // Looks like an extension or an Any. - // - // TODO: Check whether we need to handle - // namespace rooted names (e.g. ".something.Foo"). - extName, err := p.consumeExtName() - if err != nil { - return err - } - - if s := strings.LastIndex(extName, "/"); s >= 0 { - // If it contains a slash, it's an Any type URL. - messageName := extName[s+1:] - mt := MessageType(messageName) - if mt == nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) - } - tok = p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - v := reflect.New(mt.Elem()) - if pe := p.readStruct(v.Elem(), terminator); pe != nil { - return pe - } - b, err := Marshal(v.Interface().(Message)) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", messageName, err) - } - if fieldSet["type_url"] { - return p.errorf(anyRepeatedlyUnpacked, "type_url") - } - if fieldSet["value"] { - return p.errorf(anyRepeatedlyUnpacked, "value") - } - sv.FieldByName("TypeUrl").SetString(extName) - sv.FieldByName("Value").SetBytes(b) - fieldSet["type_url"] = true - fieldSet["value"] = true - continue - } - - var desc *ExtensionDesc - // This could be faster, but it's functional. - // TODO: Do something smarter than a linear scan. - for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { - if d.Name == extName { - desc = d - break - } - } - if desc == nil { - return p.errorf("unrecognized extension %q", extName) - } - - props := &Properties{} - props.Parse(desc.Tag) - - typ := reflect.TypeOf(desc.ExtensionType) - if err := p.checkForColon(props, typ); err != nil { - return err - } - - rep := desc.repeated() - - // Read the extension structure, and set it in - // the value we're constructing. - var ext reflect.Value - if !rep { - ext = reflect.New(typ).Elem() - } else { - ext = reflect.New(typ.Elem()).Elem() - } - if err := p.readAny(ext, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - ep := sv.Addr().Interface().(Message) - if !rep { - SetExtension(ep, desc, ext.Interface()) - } else { - old, err := GetExtension(ep, desc) - var sl reflect.Value - if err == nil { - sl = reflect.ValueOf(old) // existing slice - } else { - sl = reflect.MakeSlice(typ, 0, 1) - } - sl = reflect.Append(sl, ext) - SetExtension(ep, desc, sl.Interface()) - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := tok.value - var dst reflect.Value - fi, props, ok := structFieldByName(sprops, name) - if ok { - dst = sv.Field(fi) - } else if oop, ok := sprops.OneofTypes[name]; ok { - // It is a oneof. - props = oop.Prop - nv := reflect.New(oop.Type.Elem()) - dst = nv.Elem().Field(0) - field := sv.Field(oop.Field) - if !field.IsNil() { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) - } - field.Set(nv) - } - if !dst.IsValid() { - return p.errorf("unknown field name %q in %v", name, st) - } - - if dst.Kind() == reflect.Map { - // Consume any colon. - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Construct the map if it doesn't already exist. - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - key := reflect.New(dst.Type().Key()).Elem() - val := reflect.New(dst.Type().Elem()).Elem() - - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. See b/28924776 for a time - // this went wrong. - - tok := p.next() - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.MapKeyProp); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - case "value": - if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.MapValProp); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - default: - p.back() - return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - - dst.SetMapIndex(key, val) - continue - } - - // Check that it's not already set if it's not a repeated field. - if !props.Repeated && fieldSet[name] { - return p.errorf("non-repeated field %q was repeated", name) - } - - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Parse into the field. - fieldSet[name] = true - if err := p.readAny(dst, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - if props.Required { - reqCount-- - } - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - - } - - if reqCount > 0 { - return p.missingRequiredFieldError(sv) - } - return reqFieldErr -} - -// consumeExtName consumes extension name or expanded Any type URL and the -// following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - if p.done && tok.value != "]" { - return "", p.errorf("unclosed type_url or extension name") - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in readStruct to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) readAny(v reflect.Value, props *Properties) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "" { - return p.errorf("unexpected EOF") - } - - switch fv := v; fv.Kind() { - case reflect.Slice: - at := v.Type() - if at.Elem().Kind() == reflect.Uint8 { - // Special case for []byte - if tok.value[0] != '"' && tok.value[0] != '\'' { - // Deliberately written out here, as the error after - // this switch statement would write "invalid []byte: ...", - // which is not as user-friendly. - return p.errorf("invalid string: %v", tok.value) - } - bytes := []byte(tok.unquoted) - fv.Set(reflect.ValueOf(bytes)) - return nil - } - // Repeated field. - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - err := p.readAny(fv.Index(fv.Len()-1), props) - if err != nil { - return err - } - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "]" { - break - } - if tok.value != "," { - return p.errorf("Expected ']' or ',' found %q", tok.value) - } - } - return nil - } - // One value of the repeated field. - p.back() - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - return p.readAny(fv.Index(fv.Len()-1), props) - case reflect.Bool: - // true/1/t/True or false/f/0/False. - switch tok.value { - case "true", "1", "t", "True": - fv.SetBool(true) - return nil - case "false", "0", "f", "False": - fv.SetBool(false) - return nil - } - case reflect.Float32, reflect.Float64: - v := tok.value - // Ignore 'f' for compatibility with output generated by C++, but don't - // remove 'f' when the value is "-inf" or "inf". - if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { - v = v[:len(v)-1] - } - if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { - fv.SetFloat(f) - return nil - } - case reflect.Int32: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - fv.SetInt(x) - return nil - } - - if len(props.Enum) == 0 { - break - } - m, ok := enumValueMaps[props.Enum] - if !ok { - break - } - x, ok := m[tok.value] - if !ok { - break - } - fv.SetInt(int64(x)) - return nil - case reflect.Int64: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - fv.SetInt(x) - return nil - } - - case reflect.Ptr: - // A basic field (indirected through pointer), or a repeated message/group - p.back() - fv.Set(reflect.New(fv.Type().Elem())) - return p.readAny(fv.Elem(), props) - case reflect.String: - if tok.value[0] == '"' || tok.value[0] == '\'' { - fv.SetString(tok.unquoted) - return nil - } - case reflect.Struct: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - // TODO: Handle nested messages which implement encoding.TextUnmarshaler. - return p.readStruct(fv, terminator) - case reflect.Uint32: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(uint64(x)) - return nil - } - case reflect.Uint64: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - fv.SetUint(x) - return nil - } - } - return p.errorf("invalid %v: %v", v.Type(), tok.value) -} - -// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb -// before starting to unmarshal, so any existing data in pb is always removed. -// If a required field is not set and no other error occurs, -// UnmarshalText returns *RequiredNotSetError. -func UnmarshalText(s string, pb Message) error { - if um, ok := pb.(encoding.TextUnmarshaler); ok { - return um.UnmarshalText([]byte(s)) - } - pb.Reset() - v := reflect.ValueOf(pb) - return newTextParser(s).readStruct(v.Elem(), "") -} diff --git a/vendor/github.com/inconshreveable/mousetrap/LICENSE b/vendor/github.com/inconshreveable/mousetrap/LICENSE deleted file mode 100644 index 5f0d1fb..0000000 --- a/vendor/github.com/inconshreveable/mousetrap/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2014 Alan Shreve - -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/github.com/inconshreveable/mousetrap/README.md b/vendor/github.com/inconshreveable/mousetrap/README.md deleted file mode 100644 index 7a950d1..0000000 --- a/vendor/github.com/inconshreveable/mousetrap/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# mousetrap - -mousetrap is a tiny library that answers a single question. - -On a Windows machine, was the process invoked by someone double clicking on -the executable file while browsing in explorer? - -### Motivation - -Windows developers unfamiliar with command line tools will often "double-click" -the executable for a tool. Because most CLI tools print the help and then exit -when invoked without arguments, this is often very frustrating for those users. - -mousetrap provides a way to detect these invocations so that you can provide -more helpful behavior and instructions on how to run the CLI tool. To see what -this looks like, both from an organizational and a technical perspective, see -https://inconshreveable.com/09-09-2014/sweat-the-small-stuff/ - -### The interface - -The library exposes a single interface: - - func StartedByExplorer() (bool) diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_others.go b/vendor/github.com/inconshreveable/mousetrap/trap_others.go deleted file mode 100644 index 9d2d8a4..0000000 --- a/vendor/github.com/inconshreveable/mousetrap/trap_others.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !windows - -package mousetrap - -// StartedByExplorer returns true if the program was invoked by the user -// double-clicking on the executable from explorer.exe -// -// It is conservative and returns false if any of the internal calls fail. -// It does not guarantee that the program was run from a terminal. It only can tell you -// whether it was launched from explorer.exe -// -// On non-Windows platforms, it always returns false. -func StartedByExplorer() bool { - return false -} diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows.go deleted file mode 100644 index 336142a..0000000 --- a/vendor/github.com/inconshreveable/mousetrap/trap_windows.go +++ /dev/null @@ -1,98 +0,0 @@ -// +build windows -// +build !go1.4 - -package mousetrap - -import ( - "fmt" - "os" - "syscall" - "unsafe" -) - -const ( - // defined by the Win32 API - th32cs_snapprocess uintptr = 0x2 -) - -var ( - kernel = syscall.MustLoadDLL("kernel32.dll") - CreateToolhelp32Snapshot = kernel.MustFindProc("CreateToolhelp32Snapshot") - Process32First = kernel.MustFindProc("Process32FirstW") - Process32Next = kernel.MustFindProc("Process32NextW") -) - -// ProcessEntry32 structure defined by the Win32 API -type processEntry32 struct { - dwSize uint32 - cntUsage uint32 - th32ProcessID uint32 - th32DefaultHeapID int - th32ModuleID uint32 - cntThreads uint32 - th32ParentProcessID uint32 - pcPriClassBase int32 - dwFlags uint32 - szExeFile [syscall.MAX_PATH]uint16 -} - -func getProcessEntry(pid int) (pe *processEntry32, err error) { - snapshot, _, e1 := CreateToolhelp32Snapshot.Call(th32cs_snapprocess, uintptr(0)) - if snapshot == uintptr(syscall.InvalidHandle) { - err = fmt.Errorf("CreateToolhelp32Snapshot: %v", e1) - return - } - defer syscall.CloseHandle(syscall.Handle(snapshot)) - - var processEntry processEntry32 - processEntry.dwSize = uint32(unsafe.Sizeof(processEntry)) - ok, _, e1 := Process32First.Call(snapshot, uintptr(unsafe.Pointer(&processEntry))) - if ok == 0 { - err = fmt.Errorf("Process32First: %v", e1) - return - } - - for { - if processEntry.th32ProcessID == uint32(pid) { - pe = &processEntry - return - } - - ok, _, e1 = Process32Next.Call(snapshot, uintptr(unsafe.Pointer(&processEntry))) - if ok == 0 { - err = fmt.Errorf("Process32Next: %v", e1) - return - } - } -} - -func getppid() (pid int, err error) { - pe, err := getProcessEntry(os.Getpid()) - if err != nil { - return - } - - pid = int(pe.th32ParentProcessID) - return -} - -// StartedByExplorer returns true if the program was invoked by the user double-clicking -// on the executable from explorer.exe -// -// It is conservative and returns false if any of the internal calls fail. -// It does not guarantee that the program was run from a terminal. It only can tell you -// whether it was launched from explorer.exe -func StartedByExplorer() bool { - ppid, err := getppid() - if err != nil { - return false - } - - pe, err := getProcessEntry(ppid) - if err != nil { - return false - } - - name := syscall.UTF16ToString(pe.szExeFile[:]) - return name == "explorer.exe" -} diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go deleted file mode 100644 index 9a28e57..0000000 --- a/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go +++ /dev/null @@ -1,46 +0,0 @@ -// +build windows -// +build go1.4 - -package mousetrap - -import ( - "os" - "syscall" - "unsafe" -) - -func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) { - snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0) - if err != nil { - return nil, err - } - defer syscall.CloseHandle(snapshot) - var procEntry syscall.ProcessEntry32 - procEntry.Size = uint32(unsafe.Sizeof(procEntry)) - if err = syscall.Process32First(snapshot, &procEntry); err != nil { - return nil, err - } - for { - if procEntry.ProcessID == uint32(pid) { - return &procEntry, nil - } - err = syscall.Process32Next(snapshot, &procEntry) - if err != nil { - return nil, err - } - } -} - -// StartedByExplorer returns true if the program was invoked by the user double-clicking -// on the executable from explorer.exe -// -// It is conservative and returns false if any of the internal calls fail. -// It does not guarantee that the program was run from a terminal. It only can tell you -// whether it was launched from explorer.exe -func StartedByExplorer() bool { - pe, err := getProcessEntry(os.Getppid()) - if err != nil { - return false - } - return "explorer.exe" == syscall.UTF16ToString(pe.ExeFile[:]) -} diff --git a/vendor/github.com/jinzhu/gorm/.gitignore b/vendor/github.com/jinzhu/gorm/.gitignore deleted file mode 100644 index 117f92f..0000000 --- a/vendor/github.com/jinzhu/gorm/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -documents -coverage.txt -_book diff --git a/vendor/github.com/jinzhu/gorm/License b/vendor/github.com/jinzhu/gorm/License deleted file mode 100644 index 037e165..0000000 --- a/vendor/github.com/jinzhu/gorm/License +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-NOW Jinzhu - -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. diff --git a/vendor/github.com/jinzhu/gorm/README.md b/vendor/github.com/jinzhu/gorm/README.md deleted file mode 100644 index b1f31b4..0000000 --- a/vendor/github.com/jinzhu/gorm/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# GORM - -Moved to https://github.com/go-gorm/gorm diff --git a/vendor/github.com/jinzhu/gorm/association.go b/vendor/github.com/jinzhu/gorm/association.go deleted file mode 100644 index a73344f..0000000 --- a/vendor/github.com/jinzhu/gorm/association.go +++ /dev/null @@ -1,377 +0,0 @@ -package gorm - -import ( - "errors" - "fmt" - "reflect" -) - -// Association Mode contains some helper methods to handle relationship things easily. -type Association struct { - Error error - scope *Scope - column string - field *Field -} - -// Find find out all related associations -func (association *Association) Find(value interface{}) *Association { - association.scope.related(value, association.column) - return association.setErr(association.scope.db.Error) -} - -// Append append new associations for many2many, has_many, replace current association for has_one, belongs_to -func (association *Association) Append(values ...interface{}) *Association { - if association.Error != nil { - return association - } - - if relationship := association.field.Relationship; relationship.Kind == "has_one" { - return association.Replace(values...) - } - return association.saveAssociations(values...) -} - -// Replace replace current associations with new one -func (association *Association) Replace(values ...interface{}) *Association { - if association.Error != nil { - return association - } - - var ( - relationship = association.field.Relationship - scope = association.scope - field = association.field.Field - newDB = scope.NewDB() - ) - - // Append new values - association.field.Set(reflect.Zero(association.field.Field.Type())) - association.saveAssociations(values...) - - // Belongs To - if relationship.Kind == "belongs_to" { - // Set foreign key to be null when clearing value (length equals 0) - if len(values) == 0 { - // Set foreign key to be nil - var foreignKeyMap = map[string]interface{}{} - for _, foreignKey := range relationship.ForeignDBNames { - foreignKeyMap[foreignKey] = nil - } - association.setErr(newDB.Model(scope.Value).UpdateColumn(foreignKeyMap).Error) - } - } else { - // Polymorphic Relations - if relationship.PolymorphicDBName != "" { - newDB = newDB.Where(fmt.Sprintf("%v = ?", scope.Quote(relationship.PolymorphicDBName)), relationship.PolymorphicValue) - } - - // Delete Relations except new created - if len(values) > 0 { - var associationForeignFieldNames, associationForeignDBNames []string - if relationship.Kind == "many_to_many" { - // if many to many relations, get association fields name from association foreign keys - associationScope := scope.New(reflect.New(field.Type()).Interface()) - for idx, dbName := range relationship.AssociationForeignFieldNames { - if field, ok := associationScope.FieldByName(dbName); ok { - associationForeignFieldNames = append(associationForeignFieldNames, field.Name) - associationForeignDBNames = append(associationForeignDBNames, relationship.AssociationForeignDBNames[idx]) - } - } - } else { - // If has one/many relations, use primary keys - for _, field := range scope.New(reflect.New(field.Type()).Interface()).PrimaryFields() { - associationForeignFieldNames = append(associationForeignFieldNames, field.Name) - associationForeignDBNames = append(associationForeignDBNames, field.DBName) - } - } - - newPrimaryKeys := scope.getColumnAsArray(associationForeignFieldNames, field.Interface()) - - if len(newPrimaryKeys) > 0 { - sql := fmt.Sprintf("%v NOT IN (%v)", toQueryCondition(scope, associationForeignDBNames), toQueryMarks(newPrimaryKeys)) - newDB = newDB.Where(sql, toQueryValues(newPrimaryKeys)...) - } - } - - if relationship.Kind == "many_to_many" { - // if many to many relations, delete related relations from join table - var sourceForeignFieldNames []string - - for _, dbName := range relationship.ForeignFieldNames { - if field, ok := scope.FieldByName(dbName); ok { - sourceForeignFieldNames = append(sourceForeignFieldNames, field.Name) - } - } - - if sourcePrimaryKeys := scope.getColumnAsArray(sourceForeignFieldNames, scope.Value); len(sourcePrimaryKeys) > 0 { - newDB = newDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(sourcePrimaryKeys)), toQueryValues(sourcePrimaryKeys)...) - - association.setErr(relationship.JoinTableHandler.Delete(relationship.JoinTableHandler, newDB)) - } - } else if relationship.Kind == "has_one" || relationship.Kind == "has_many" { - // has_one or has_many relations, set foreign key to be nil (TODO or delete them?) - var foreignKeyMap = map[string]interface{}{} - for idx, foreignKey := range relationship.ForeignDBNames { - foreignKeyMap[foreignKey] = nil - if field, ok := scope.FieldByName(relationship.AssociationForeignFieldNames[idx]); ok { - newDB = newDB.Where(fmt.Sprintf("%v = ?", scope.Quote(foreignKey)), field.Field.Interface()) - } - } - - fieldValue := reflect.New(association.field.Field.Type()).Interface() - association.setErr(newDB.Model(fieldValue).UpdateColumn(foreignKeyMap).Error) - } - } - return association -} - -// Delete remove relationship between source & passed arguments, but won't delete those arguments -func (association *Association) Delete(values ...interface{}) *Association { - if association.Error != nil { - return association - } - - var ( - relationship = association.field.Relationship - scope = association.scope - field = association.field.Field - newDB = scope.NewDB() - ) - - if len(values) == 0 { - return association - } - - var deletingResourcePrimaryFieldNames, deletingResourcePrimaryDBNames []string - for _, field := range scope.New(reflect.New(field.Type()).Interface()).PrimaryFields() { - deletingResourcePrimaryFieldNames = append(deletingResourcePrimaryFieldNames, field.Name) - deletingResourcePrimaryDBNames = append(deletingResourcePrimaryDBNames, field.DBName) - } - - deletingPrimaryKeys := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, values...) - - if relationship.Kind == "many_to_many" { - // source value's foreign keys - for idx, foreignKey := range relationship.ForeignDBNames { - if field, ok := scope.FieldByName(relationship.ForeignFieldNames[idx]); ok { - newDB = newDB.Where(fmt.Sprintf("%v = ?", scope.Quote(foreignKey)), field.Field.Interface()) - } - } - - // get association's foreign fields name - var associationScope = scope.New(reflect.New(field.Type()).Interface()) - var associationForeignFieldNames []string - for _, associationDBName := range relationship.AssociationForeignFieldNames { - if field, ok := associationScope.FieldByName(associationDBName); ok { - associationForeignFieldNames = append(associationForeignFieldNames, field.Name) - } - } - - // association value's foreign keys - deletingPrimaryKeys := scope.getColumnAsArray(associationForeignFieldNames, values...) - sql := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(deletingPrimaryKeys)) - newDB = newDB.Where(sql, toQueryValues(deletingPrimaryKeys)...) - - association.setErr(relationship.JoinTableHandler.Delete(relationship.JoinTableHandler, newDB)) - } else { - var foreignKeyMap = map[string]interface{}{} - for _, foreignKey := range relationship.ForeignDBNames { - foreignKeyMap[foreignKey] = nil - } - - if relationship.Kind == "belongs_to" { - // find with deleting relation's foreign keys - primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, values...) - newDB = newDB.Where( - fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)), - toQueryValues(primaryKeys)..., - ) - - // set foreign key to be null if there are some records affected - modelValue := reflect.New(scope.GetModelStruct().ModelType).Interface() - if results := newDB.Model(modelValue).UpdateColumn(foreignKeyMap); results.Error == nil { - if results.RowsAffected > 0 { - scope.updatedAttrsWithValues(foreignKeyMap) - } - } else { - association.setErr(results.Error) - } - } else if relationship.Kind == "has_one" || relationship.Kind == "has_many" { - // find all relations - primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, scope.Value) - newDB = newDB.Where( - fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)), - toQueryValues(primaryKeys)..., - ) - - // only include those deleting relations - newDB = newDB.Where( - fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, deletingResourcePrimaryDBNames), toQueryMarks(deletingPrimaryKeys)), - toQueryValues(deletingPrimaryKeys)..., - ) - - // set matched relation's foreign key to be null - fieldValue := reflect.New(association.field.Field.Type()).Interface() - association.setErr(newDB.Model(fieldValue).UpdateColumn(foreignKeyMap).Error) - } - } - - // Remove deleted records from source's field - if association.Error == nil { - if field.Kind() == reflect.Slice { - leftValues := reflect.Zero(field.Type()) - - for i := 0; i < field.Len(); i++ { - reflectValue := field.Index(i) - primaryKey := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, reflectValue.Interface())[0] - var isDeleted = false - for _, pk := range deletingPrimaryKeys { - if equalAsString(primaryKey, pk) { - isDeleted = true - break - } - } - if !isDeleted { - leftValues = reflect.Append(leftValues, reflectValue) - } - } - - association.field.Set(leftValues) - } else if field.Kind() == reflect.Struct { - primaryKey := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, field.Interface())[0] - for _, pk := range deletingPrimaryKeys { - if equalAsString(primaryKey, pk) { - association.field.Set(reflect.Zero(field.Type())) - break - } - } - } - } - - return association -} - -// Clear remove relationship between source & current associations, won't delete those associations -func (association *Association) Clear() *Association { - return association.Replace() -} - -// Count return the count of current associations -func (association *Association) Count() int { - var ( - count = 0 - relationship = association.field.Relationship - scope = association.scope - fieldValue = association.field.Field.Interface() - query = scope.DB() - ) - - switch relationship.Kind { - case "many_to_many": - query = relationship.JoinTableHandler.JoinWith(relationship.JoinTableHandler, query, scope.Value) - case "has_many", "has_one": - primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, scope.Value) - query = query.Where( - fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)), - toQueryValues(primaryKeys)..., - ) - case "belongs_to": - primaryKeys := scope.getColumnAsArray(relationship.ForeignFieldNames, scope.Value) - query = query.Where( - fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(primaryKeys)), - toQueryValues(primaryKeys)..., - ) - } - - if relationship.PolymorphicType != "" { - query = query.Where( - fmt.Sprintf("%v.%v = ?", scope.New(fieldValue).QuotedTableName(), scope.Quote(relationship.PolymorphicDBName)), - relationship.PolymorphicValue, - ) - } - - if err := query.Model(fieldValue).Count(&count).Error; err != nil { - association.Error = err - } - return count -} - -// saveAssociations save passed values as associations -func (association *Association) saveAssociations(values ...interface{}) *Association { - var ( - scope = association.scope - field = association.field - relationship = field.Relationship - ) - - saveAssociation := func(reflectValue reflect.Value) { - // value has to been pointer - if reflectValue.Kind() != reflect.Ptr { - reflectPtr := reflect.New(reflectValue.Type()) - reflectPtr.Elem().Set(reflectValue) - reflectValue = reflectPtr - } - - // value has to been saved for many2many - if relationship.Kind == "many_to_many" { - if scope.New(reflectValue.Interface()).PrimaryKeyZero() { - association.setErr(scope.NewDB().Save(reflectValue.Interface()).Error) - } - } - - // Assign Fields - var fieldType = field.Field.Type() - var setFieldBackToValue, setSliceFieldBackToValue bool - if reflectValue.Type().AssignableTo(fieldType) { - field.Set(reflectValue) - } else if reflectValue.Type().Elem().AssignableTo(fieldType) { - // if field's type is struct, then need to set value back to argument after save - setFieldBackToValue = true - field.Set(reflectValue.Elem()) - } else if fieldType.Kind() == reflect.Slice { - if reflectValue.Type().AssignableTo(fieldType.Elem()) { - field.Set(reflect.Append(field.Field, reflectValue)) - } else if reflectValue.Type().Elem().AssignableTo(fieldType.Elem()) { - // if field's type is slice of struct, then need to set value back to argument after save - setSliceFieldBackToValue = true - field.Set(reflect.Append(field.Field, reflectValue.Elem())) - } - } - - if relationship.Kind == "many_to_many" { - association.setErr(relationship.JoinTableHandler.Add(relationship.JoinTableHandler, scope.NewDB(), scope.Value, reflectValue.Interface())) - } else { - association.setErr(scope.NewDB().Select(field.Name).Save(scope.Value).Error) - - if setFieldBackToValue { - reflectValue.Elem().Set(field.Field) - } else if setSliceFieldBackToValue { - reflectValue.Elem().Set(field.Field.Index(field.Field.Len() - 1)) - } - } - } - - for _, value := range values { - reflectValue := reflect.ValueOf(value) - indirectReflectValue := reflect.Indirect(reflectValue) - if indirectReflectValue.Kind() == reflect.Struct { - saveAssociation(reflectValue) - } else if indirectReflectValue.Kind() == reflect.Slice { - for i := 0; i < indirectReflectValue.Len(); i++ { - saveAssociation(indirectReflectValue.Index(i)) - } - } else { - association.setErr(errors.New("invalid value type")) - } - } - return association -} - -// setErr set error when the error is not nil. And return Association. -func (association *Association) setErr(err error) *Association { - if err != nil { - association.Error = err - } - return association -} diff --git a/vendor/github.com/jinzhu/gorm/callback.go b/vendor/github.com/jinzhu/gorm/callback.go deleted file mode 100644 index 1f0e3c7..0000000 --- a/vendor/github.com/jinzhu/gorm/callback.go +++ /dev/null @@ -1,250 +0,0 @@ -package gorm - -import "fmt" - -// DefaultCallback default callbacks defined by gorm -var DefaultCallback = &Callback{logger: nopLogger{}} - -// Callback is a struct that contains all CRUD callbacks -// Field `creates` contains callbacks will be call when creating object -// Field `updates` contains callbacks will be call when updating object -// Field `deletes` contains callbacks will be call when deleting object -// Field `queries` contains callbacks will be call when querying object with query methods like Find, First, Related, Association... -// Field `rowQueries` contains callbacks will be call when querying object with Row, Rows... -// Field `processors` contains all callback processors, will be used to generate above callbacks in order -type Callback struct { - logger logger - creates []*func(scope *Scope) - updates []*func(scope *Scope) - deletes []*func(scope *Scope) - queries []*func(scope *Scope) - rowQueries []*func(scope *Scope) - processors []*CallbackProcessor -} - -// CallbackProcessor contains callback informations -type CallbackProcessor struct { - logger logger - name string // current callback's name - before string // register current callback before a callback - after string // register current callback after a callback - replace bool // replace callbacks with same name - remove bool // delete callbacks with same name - kind string // callback type: create, update, delete, query, row_query - processor *func(scope *Scope) // callback handler - parent *Callback -} - -func (c *Callback) clone(logger logger) *Callback { - return &Callback{ - logger: logger, - creates: c.creates, - updates: c.updates, - deletes: c.deletes, - queries: c.queries, - rowQueries: c.rowQueries, - processors: c.processors, - } -} - -// Create could be used to register callbacks for creating object -// db.Callback().Create().After("gorm:create").Register("plugin:run_after_create", func(*Scope) { -// // business logic -// ... -// -// // set error if some thing wrong happened, will rollback the creating -// scope.Err(errors.New("error")) -// }) -func (c *Callback) Create() *CallbackProcessor { - return &CallbackProcessor{logger: c.logger, kind: "create", parent: c} -} - -// Update could be used to register callbacks for updating object, refer `Create` for usage -func (c *Callback) Update() *CallbackProcessor { - return &CallbackProcessor{logger: c.logger, kind: "update", parent: c} -} - -// Delete could be used to register callbacks for deleting object, refer `Create` for usage -func (c *Callback) Delete() *CallbackProcessor { - return &CallbackProcessor{logger: c.logger, kind: "delete", parent: c} -} - -// Query could be used to register callbacks for querying objects with query methods like `Find`, `First`, `Related`, `Association`... -// Refer `Create` for usage -func (c *Callback) Query() *CallbackProcessor { - return &CallbackProcessor{logger: c.logger, kind: "query", parent: c} -} - -// RowQuery could be used to register callbacks for querying objects with `Row`, `Rows`, refer `Create` for usage -func (c *Callback) RowQuery() *CallbackProcessor { - return &CallbackProcessor{logger: c.logger, kind: "row_query", parent: c} -} - -// After insert a new callback after callback `callbackName`, refer `Callbacks.Create` -func (cp *CallbackProcessor) After(callbackName string) *CallbackProcessor { - cp.after = callbackName - return cp -} - -// Before insert a new callback before callback `callbackName`, refer `Callbacks.Create` -func (cp *CallbackProcessor) Before(callbackName string) *CallbackProcessor { - cp.before = callbackName - return cp -} - -// Register a new callback, refer `Callbacks.Create` -func (cp *CallbackProcessor) Register(callbackName string, callback func(scope *Scope)) { - if cp.kind == "row_query" { - if cp.before == "" && cp.after == "" && callbackName != "gorm:row_query" { - cp.logger.Print("info", fmt.Sprintf("Registering RowQuery callback %v without specify order with Before(), After(), applying Before('gorm:row_query') by default for compatibility...", callbackName)) - cp.before = "gorm:row_query" - } - } - - cp.logger.Print("info", fmt.Sprintf("[info] registering callback `%v` from %v", callbackName, fileWithLineNum())) - cp.name = callbackName - cp.processor = &callback - cp.parent.processors = append(cp.parent.processors, cp) - cp.parent.reorder() -} - -// Remove a registered callback -// db.Callback().Create().Remove("gorm:update_time_stamp_when_create") -func (cp *CallbackProcessor) Remove(callbackName string) { - cp.logger.Print("info", fmt.Sprintf("[info] removing callback `%v` from %v", callbackName, fileWithLineNum())) - cp.name = callbackName - cp.remove = true - cp.parent.processors = append(cp.parent.processors, cp) - cp.parent.reorder() -} - -// Replace a registered callback with new callback -// db.Callback().Create().Replace("gorm:update_time_stamp_when_create", func(*Scope) { -// scope.SetColumn("CreatedAt", now) -// scope.SetColumn("UpdatedAt", now) -// }) -func (cp *CallbackProcessor) Replace(callbackName string, callback func(scope *Scope)) { - cp.logger.Print("info", fmt.Sprintf("[info] replacing callback `%v` from %v", callbackName, fileWithLineNum())) - cp.name = callbackName - cp.processor = &callback - cp.replace = true - cp.parent.processors = append(cp.parent.processors, cp) - cp.parent.reorder() -} - -// Get registered callback -// db.Callback().Create().Get("gorm:create") -func (cp *CallbackProcessor) Get(callbackName string) (callback func(scope *Scope)) { - for _, p := range cp.parent.processors { - if p.name == callbackName && p.kind == cp.kind { - if p.remove { - callback = nil - } else { - callback = *p.processor - } - } - } - return -} - -// getRIndex get right index from string slice -func getRIndex(strs []string, str string) int { - for i := len(strs) - 1; i >= 0; i-- { - if strs[i] == str { - return i - } - } - return -1 -} - -// sortProcessors sort callback processors based on its before, after, remove, replace -func sortProcessors(cps []*CallbackProcessor) []*func(scope *Scope) { - var ( - allNames, sortedNames []string - sortCallbackProcessor func(c *CallbackProcessor) - ) - - for _, cp := range cps { - // show warning message the callback name already exists - if index := getRIndex(allNames, cp.name); index > -1 && !cp.replace && !cp.remove { - cp.logger.Print("warning", fmt.Sprintf("[warning] duplicated callback `%v` from %v", cp.name, fileWithLineNum())) - } - allNames = append(allNames, cp.name) - } - - sortCallbackProcessor = func(c *CallbackProcessor) { - if getRIndex(sortedNames, c.name) == -1 { // if not sorted - if c.before != "" { // if defined before callback - if index := getRIndex(sortedNames, c.before); index != -1 { - // if before callback already sorted, append current callback just after it - sortedNames = append(sortedNames[:index], append([]string{c.name}, sortedNames[index:]...)...) - } else if index := getRIndex(allNames, c.before); index != -1 { - // if before callback exists but haven't sorted, append current callback to last - sortedNames = append(sortedNames, c.name) - sortCallbackProcessor(cps[index]) - } - } - - if c.after != "" { // if defined after callback - if index := getRIndex(sortedNames, c.after); index != -1 { - // if after callback already sorted, append current callback just before it - sortedNames = append(sortedNames[:index+1], append([]string{c.name}, sortedNames[index+1:]...)...) - } else if index := getRIndex(allNames, c.after); index != -1 { - // if after callback exists but haven't sorted - cp := cps[index] - // set after callback's before callback to current callback - if cp.before == "" { - cp.before = c.name - } - sortCallbackProcessor(cp) - } - } - - // if current callback haven't been sorted, append it to last - if getRIndex(sortedNames, c.name) == -1 { - sortedNames = append(sortedNames, c.name) - } - } - } - - for _, cp := range cps { - sortCallbackProcessor(cp) - } - - var sortedFuncs []*func(scope *Scope) - for _, name := range sortedNames { - if index := getRIndex(allNames, name); !cps[index].remove { - sortedFuncs = append(sortedFuncs, cps[index].processor) - } - } - - return sortedFuncs -} - -// reorder all registered processors, and reset CRUD callbacks -func (c *Callback) reorder() { - var creates, updates, deletes, queries, rowQueries []*CallbackProcessor - - for _, processor := range c.processors { - if processor.name != "" { - switch processor.kind { - case "create": - creates = append(creates, processor) - case "update": - updates = append(updates, processor) - case "delete": - deletes = append(deletes, processor) - case "query": - queries = append(queries, processor) - case "row_query": - rowQueries = append(rowQueries, processor) - } - } - } - - c.creates = sortProcessors(creates) - c.updates = sortProcessors(updates) - c.deletes = sortProcessors(deletes) - c.queries = sortProcessors(queries) - c.rowQueries = sortProcessors(rowQueries) -} diff --git a/vendor/github.com/jinzhu/gorm/callback_create.go b/vendor/github.com/jinzhu/gorm/callback_create.go deleted file mode 100644 index c4d25f3..0000000 --- a/vendor/github.com/jinzhu/gorm/callback_create.go +++ /dev/null @@ -1,197 +0,0 @@ -package gorm - -import ( - "fmt" - "strings" -) - -// Define callbacks for creating -func init() { - DefaultCallback.Create().Register("gorm:begin_transaction", beginTransactionCallback) - DefaultCallback.Create().Register("gorm:before_create", beforeCreateCallback) - DefaultCallback.Create().Register("gorm:save_before_associations", saveBeforeAssociationsCallback) - DefaultCallback.Create().Register("gorm:update_time_stamp", updateTimeStampForCreateCallback) - DefaultCallback.Create().Register("gorm:create", createCallback) - DefaultCallback.Create().Register("gorm:force_reload_after_create", forceReloadAfterCreateCallback) - DefaultCallback.Create().Register("gorm:save_after_associations", saveAfterAssociationsCallback) - DefaultCallback.Create().Register("gorm:after_create", afterCreateCallback) - DefaultCallback.Create().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback) -} - -// beforeCreateCallback will invoke `BeforeSave`, `BeforeCreate` method before creating -func beforeCreateCallback(scope *Scope) { - if !scope.HasError() { - scope.CallMethod("BeforeSave") - } - if !scope.HasError() { - scope.CallMethod("BeforeCreate") - } -} - -// updateTimeStampForCreateCallback will set `CreatedAt`, `UpdatedAt` when creating -func updateTimeStampForCreateCallback(scope *Scope) { - if !scope.HasError() { - now := scope.db.nowFunc() - - if createdAtField, ok := scope.FieldByName("CreatedAt"); ok { - if createdAtField.IsBlank { - createdAtField.Set(now) - } - } - - if updatedAtField, ok := scope.FieldByName("UpdatedAt"); ok { - if updatedAtField.IsBlank { - updatedAtField.Set(now) - } - } - } -} - -// createCallback the callback used to insert data into database -func createCallback(scope *Scope) { - if !scope.HasError() { - defer scope.trace(NowFunc()) - - var ( - columns, placeholders []string - blankColumnsWithDefaultValue []string - ) - - for _, field := range scope.Fields() { - if scope.changeableField(field) { - if field.IsNormal && !field.IsIgnored { - if field.IsBlank && field.HasDefaultValue { - blankColumnsWithDefaultValue = append(blankColumnsWithDefaultValue, scope.Quote(field.DBName)) - scope.InstanceSet("gorm:blank_columns_with_default_value", blankColumnsWithDefaultValue) - } else if !field.IsPrimaryKey || !field.IsBlank { - columns = append(columns, scope.Quote(field.DBName)) - placeholders = append(placeholders, scope.AddToVars(field.Field.Interface())) - } - } else if field.Relationship != nil && field.Relationship.Kind == "belongs_to" { - for _, foreignKey := range field.Relationship.ForeignDBNames { - if foreignField, ok := scope.FieldByName(foreignKey); ok && !scope.changeableField(foreignField) { - columns = append(columns, scope.Quote(foreignField.DBName)) - placeholders = append(placeholders, scope.AddToVars(foreignField.Field.Interface())) - } - } - } - } - } - - var ( - returningColumn = "*" - quotedTableName = scope.QuotedTableName() - primaryField = scope.PrimaryField() - extraOption string - insertModifier string - ) - - if str, ok := scope.Get("gorm:insert_option"); ok { - extraOption = fmt.Sprint(str) - } - if str, ok := scope.Get("gorm:insert_modifier"); ok { - insertModifier = strings.ToUpper(fmt.Sprint(str)) - if insertModifier == "INTO" { - insertModifier = "" - } - } - - if primaryField != nil { - returningColumn = scope.Quote(primaryField.DBName) - } - - lastInsertIDOutputInterstitial := scope.Dialect().LastInsertIDOutputInterstitial(quotedTableName, returningColumn, columns) - var lastInsertIDReturningSuffix string - if lastInsertIDOutputInterstitial == "" { - lastInsertIDReturningSuffix = scope.Dialect().LastInsertIDReturningSuffix(quotedTableName, returningColumn) - } - - if len(columns) == 0 { - scope.Raw(fmt.Sprintf( - "INSERT%v INTO %v %v%v%v", - addExtraSpaceIfExist(insertModifier), - quotedTableName, - scope.Dialect().DefaultValueStr(), - addExtraSpaceIfExist(extraOption), - addExtraSpaceIfExist(lastInsertIDReturningSuffix), - )) - } else { - scope.Raw(fmt.Sprintf( - "INSERT%v INTO %v (%v)%v VALUES (%v)%v%v", - addExtraSpaceIfExist(insertModifier), - scope.QuotedTableName(), - strings.Join(columns, ","), - addExtraSpaceIfExist(lastInsertIDOutputInterstitial), - strings.Join(placeholders, ","), - addExtraSpaceIfExist(extraOption), - addExtraSpaceIfExist(lastInsertIDReturningSuffix), - )) - } - - // execute create sql: no primaryField - if primaryField == nil { - if result, err := scope.SQLDB().Exec(scope.SQL, scope.SQLVars...); scope.Err(err) == nil { - // set rows affected count - scope.db.RowsAffected, _ = result.RowsAffected() - - // set primary value to primary field - if primaryField != nil && primaryField.IsBlank { - if primaryValue, err := result.LastInsertId(); scope.Err(err) == nil { - scope.Err(primaryField.Set(primaryValue)) - } - } - } - return - } - - // execute create sql: lastInsertID implemention for majority of dialects - if lastInsertIDReturningSuffix == "" && lastInsertIDOutputInterstitial == "" { - if result, err := scope.SQLDB().Exec(scope.SQL, scope.SQLVars...); scope.Err(err) == nil { - // set rows affected count - scope.db.RowsAffected, _ = result.RowsAffected() - - // set primary value to primary field - if primaryField != nil && primaryField.IsBlank { - if primaryValue, err := result.LastInsertId(); scope.Err(err) == nil { - scope.Err(primaryField.Set(primaryValue)) - } - } - } - return - } - - // execute create sql: dialects with additional lastInsertID requirements (currently postgres & mssql) - if primaryField.Field.CanAddr() { - if err := scope.SQLDB().QueryRow(scope.SQL, scope.SQLVars...).Scan(primaryField.Field.Addr().Interface()); scope.Err(err) == nil { - primaryField.IsBlank = false - scope.db.RowsAffected = 1 - } - } else { - scope.Err(ErrUnaddressable) - } - return - } -} - -// forceReloadAfterCreateCallback will reload columns that having default value, and set it back to current object -func forceReloadAfterCreateCallback(scope *Scope) { - if blankColumnsWithDefaultValue, ok := scope.InstanceGet("gorm:blank_columns_with_default_value"); ok { - db := scope.DB().New().Table(scope.TableName()).Select(blankColumnsWithDefaultValue.([]string)) - for _, field := range scope.Fields() { - if field.IsPrimaryKey && !field.IsBlank { - db = db.Where(fmt.Sprintf("%v = ?", field.DBName), field.Field.Interface()) - } - } - db.Scan(scope.Value) - } -} - -// afterCreateCallback will invoke `AfterCreate`, `AfterSave` method after creating -func afterCreateCallback(scope *Scope) { - if !scope.HasError() { - scope.CallMethod("AfterCreate") - } - if !scope.HasError() { - scope.CallMethod("AfterSave") - } -} diff --git a/vendor/github.com/jinzhu/gorm/callback_delete.go b/vendor/github.com/jinzhu/gorm/callback_delete.go deleted file mode 100644 index 48b97ac..0000000 --- a/vendor/github.com/jinzhu/gorm/callback_delete.go +++ /dev/null @@ -1,63 +0,0 @@ -package gorm - -import ( - "errors" - "fmt" -) - -// Define callbacks for deleting -func init() { - DefaultCallback.Delete().Register("gorm:begin_transaction", beginTransactionCallback) - DefaultCallback.Delete().Register("gorm:before_delete", beforeDeleteCallback) - DefaultCallback.Delete().Register("gorm:delete", deleteCallback) - DefaultCallback.Delete().Register("gorm:after_delete", afterDeleteCallback) - DefaultCallback.Delete().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback) -} - -// beforeDeleteCallback will invoke `BeforeDelete` method before deleting -func beforeDeleteCallback(scope *Scope) { - if scope.DB().HasBlockGlobalUpdate() && !scope.hasConditions() { - scope.Err(errors.New("missing WHERE clause while deleting")) - return - } - if !scope.HasError() { - scope.CallMethod("BeforeDelete") - } -} - -// deleteCallback used to delete data from database or set deleted_at to current time (when using with soft delete) -func deleteCallback(scope *Scope) { - if !scope.HasError() { - var extraOption string - if str, ok := scope.Get("gorm:delete_option"); ok { - extraOption = fmt.Sprint(str) - } - - deletedAtField, hasDeletedAtField := scope.FieldByName("DeletedAt") - - if !scope.Search.Unscoped && hasDeletedAtField { - scope.Raw(fmt.Sprintf( - "UPDATE %v SET %v=%v%v%v", - scope.QuotedTableName(), - scope.Quote(deletedAtField.DBName), - scope.AddToVars(scope.db.nowFunc()), - addExtraSpaceIfExist(scope.CombinedConditionSql()), - addExtraSpaceIfExist(extraOption), - )).Exec() - } else { - scope.Raw(fmt.Sprintf( - "DELETE FROM %v%v%v", - scope.QuotedTableName(), - addExtraSpaceIfExist(scope.CombinedConditionSql()), - addExtraSpaceIfExist(extraOption), - )).Exec() - } - } -} - -// afterDeleteCallback will invoke `AfterDelete` method after deleting -func afterDeleteCallback(scope *Scope) { - if !scope.HasError() { - scope.CallMethod("AfterDelete") - } -} diff --git a/vendor/github.com/jinzhu/gorm/callback_query.go b/vendor/github.com/jinzhu/gorm/callback_query.go deleted file mode 100644 index 544afd6..0000000 --- a/vendor/github.com/jinzhu/gorm/callback_query.go +++ /dev/null @@ -1,109 +0,0 @@ -package gorm - -import ( - "errors" - "fmt" - "reflect" -) - -// Define callbacks for querying -func init() { - DefaultCallback.Query().Register("gorm:query", queryCallback) - DefaultCallback.Query().Register("gorm:preload", preloadCallback) - DefaultCallback.Query().Register("gorm:after_query", afterQueryCallback) -} - -// queryCallback used to query data from database -func queryCallback(scope *Scope) { - if _, skip := scope.InstanceGet("gorm:skip_query_callback"); skip { - return - } - - //we are only preloading relations, dont touch base model - if _, skip := scope.InstanceGet("gorm:only_preload"); skip { - return - } - - defer scope.trace(NowFunc()) - - var ( - isSlice, isPtr bool - resultType reflect.Type - results = scope.IndirectValue() - ) - - if orderBy, ok := scope.Get("gorm:order_by_primary_key"); ok { - if primaryField := scope.PrimaryField(); primaryField != nil { - scope.Search.Order(fmt.Sprintf("%v.%v %v", scope.QuotedTableName(), scope.Quote(primaryField.DBName), orderBy)) - } - } - - if value, ok := scope.Get("gorm:query_destination"); ok { - results = indirect(reflect.ValueOf(value)) - } - - if kind := results.Kind(); kind == reflect.Slice { - isSlice = true - resultType = results.Type().Elem() - results.Set(reflect.MakeSlice(results.Type(), 0, 0)) - - if resultType.Kind() == reflect.Ptr { - isPtr = true - resultType = resultType.Elem() - } - } else if kind != reflect.Struct { - scope.Err(errors.New("unsupported destination, should be slice or struct")) - return - } - - scope.prepareQuerySQL() - - if !scope.HasError() { - scope.db.RowsAffected = 0 - - if str, ok := scope.Get("gorm:query_hint"); ok { - scope.SQL = fmt.Sprint(str) + scope.SQL - } - - if str, ok := scope.Get("gorm:query_option"); ok { - scope.SQL += addExtraSpaceIfExist(fmt.Sprint(str)) - } - - if rows, err := scope.SQLDB().Query(scope.SQL, scope.SQLVars...); scope.Err(err) == nil { - defer rows.Close() - - columns, _ := rows.Columns() - for rows.Next() { - scope.db.RowsAffected++ - - elem := results - if isSlice { - elem = reflect.New(resultType).Elem() - } - - scope.scan(rows, columns, scope.New(elem.Addr().Interface()).Fields()) - - if isSlice { - if isPtr { - results.Set(reflect.Append(results, elem.Addr())) - } else { - results.Set(reflect.Append(results, elem)) - } - } - } - - if err := rows.Err(); err != nil { - scope.Err(err) - } else if scope.db.RowsAffected == 0 && !isSlice { - scope.Err(ErrRecordNotFound) - } - } - } -} - -// afterQueryCallback will invoke `AfterFind` method after querying -func afterQueryCallback(scope *Scope) { - if !scope.HasError() { - scope.CallMethod("AfterFind") - } -} diff --git a/vendor/github.com/jinzhu/gorm/callback_query_preload.go b/vendor/github.com/jinzhu/gorm/callback_query_preload.go deleted file mode 100644 index a936180..0000000 --- a/vendor/github.com/jinzhu/gorm/callback_query_preload.go +++ /dev/null @@ -1,410 +0,0 @@ -package gorm - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" -) - -// preloadCallback used to preload associations -func preloadCallback(scope *Scope) { - if _, skip := scope.InstanceGet("gorm:skip_query_callback"); skip { - return - } - - if ap, ok := scope.Get("gorm:auto_preload"); ok { - // If gorm:auto_preload IS NOT a bool then auto preload. - // Else if it IS a bool, use the value - if apb, ok := ap.(bool); !ok { - autoPreload(scope) - } else if apb { - autoPreload(scope) - } - } - - if scope.Search.preload == nil || scope.HasError() { - return - } - - var ( - preloadedMap = map[string]bool{} - fields = scope.Fields() - ) - - for _, preload := range scope.Search.preload { - var ( - preloadFields = strings.Split(preload.schema, ".") - currentScope = scope - currentFields = fields - ) - - for idx, preloadField := range preloadFields { - var currentPreloadConditions []interface{} - - if currentScope == nil { - continue - } - - // if not preloaded - if preloadKey := strings.Join(preloadFields[:idx+1], "."); !preloadedMap[preloadKey] { - - // assign search conditions to last preload - if idx == len(preloadFields)-1 { - currentPreloadConditions = preload.conditions - } - - for _, field := range currentFields { - if field.Name != preloadField || field.Relationship == nil { - continue - } - - switch field.Relationship.Kind { - case "has_one": - currentScope.handleHasOnePreload(field, currentPreloadConditions) - case "has_many": - currentScope.handleHasManyPreload(field, currentPreloadConditions) - case "belongs_to": - currentScope.handleBelongsToPreload(field, currentPreloadConditions) - case "many_to_many": - currentScope.handleManyToManyPreload(field, currentPreloadConditions) - default: - scope.Err(errors.New("unsupported relation")) - } - - preloadedMap[preloadKey] = true - break - } - - if !preloadedMap[preloadKey] { - scope.Err(fmt.Errorf("can't preload field %s for %s", preloadField, currentScope.GetModelStruct().ModelType)) - return - } - } - - // preload next level - if idx < len(preloadFields)-1 { - currentScope = currentScope.getColumnAsScope(preloadField) - if currentScope != nil { - currentFields = currentScope.Fields() - } - } - } - } -} - -func autoPreload(scope *Scope) { - for _, field := range scope.Fields() { - if field.Relationship == nil { - continue - } - - if val, ok := field.TagSettingsGet("PRELOAD"); ok { - if preload, err := strconv.ParseBool(val); err != nil { - scope.Err(errors.New("invalid preload option")) - return - } else if !preload { - continue - } - } - - scope.Search.Preload(field.Name) - } -} - -func (scope *Scope) generatePreloadDBWithConditions(conditions []interface{}) (*DB, []interface{}) { - var ( - preloadDB = scope.NewDB() - preloadConditions []interface{} - ) - - for _, condition := range conditions { - if scopes, ok := condition.(func(*DB) *DB); ok { - preloadDB = scopes(preloadDB) - } else { - preloadConditions = append(preloadConditions, condition) - } - } - - return preloadDB, preloadConditions -} - -// handleHasOnePreload used to preload has one associations -func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{}) { - relation := field.Relationship - - // get relations's primary keys - primaryKeys := scope.getColumnAsArray(relation.AssociationForeignFieldNames, scope.Value) - if len(primaryKeys) == 0 { - return - } - - // preload conditions - preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) - - // find relations - query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)) - values := toQueryValues(primaryKeys) - if relation.PolymorphicType != "" { - query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName)) - values = append(values, relation.PolymorphicValue) - } - - results := makeSlice(field.Struct.Type) - scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error) - - // assign find results - var ( - resultsValue = indirect(reflect.ValueOf(results)) - indirectScopeValue = scope.IndirectValue() - ) - - if indirectScopeValue.Kind() == reflect.Slice { - foreignValuesToResults := make(map[string]reflect.Value) - for i := 0; i < resultsValue.Len(); i++ { - result := resultsValue.Index(i) - foreignValues := toString(getValueFromFields(result, relation.ForeignFieldNames)) - foreignValuesToResults[foreignValues] = result - } - for j := 0; j < indirectScopeValue.Len(); j++ { - indirectValue := indirect(indirectScopeValue.Index(j)) - valueString := toString(getValueFromFields(indirectValue, relation.AssociationForeignFieldNames)) - if result, found := foreignValuesToResults[valueString]; found { - indirectValue.FieldByName(field.Name).Set(result) - } - } - } else { - for i := 0; i < resultsValue.Len(); i++ { - result := resultsValue.Index(i) - scope.Err(field.Set(result)) - } - } -} - -// handleHasManyPreload used to preload has many associations -func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{}) { - relation := field.Relationship - - // get relations's primary keys - primaryKeys := scope.getColumnAsArray(relation.AssociationForeignFieldNames, scope.Value) - if len(primaryKeys) == 0 { - return - } - - // preload conditions - preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) - - // find relations - query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)) - values := toQueryValues(primaryKeys) - if relation.PolymorphicType != "" { - query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName)) - values = append(values, relation.PolymorphicValue) - } - - results := makeSlice(field.Struct.Type) - scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error) - - // assign find results - var ( - resultsValue = indirect(reflect.ValueOf(results)) - indirectScopeValue = scope.IndirectValue() - ) - - if indirectScopeValue.Kind() == reflect.Slice { - preloadMap := make(map[string][]reflect.Value) - for i := 0; i < resultsValue.Len(); i++ { - result := resultsValue.Index(i) - foreignValues := getValueFromFields(result, relation.ForeignFieldNames) - preloadMap[toString(foreignValues)] = append(preloadMap[toString(foreignValues)], result) - } - - for j := 0; j < indirectScopeValue.Len(); j++ { - object := indirect(indirectScopeValue.Index(j)) - objectRealValue := getValueFromFields(object, relation.AssociationForeignFieldNames) - f := object.FieldByName(field.Name) - if results, ok := preloadMap[toString(objectRealValue)]; ok { - f.Set(reflect.Append(f, results...)) - } else { - f.Set(reflect.MakeSlice(f.Type(), 0, 0)) - } - } - } else { - scope.Err(field.Set(resultsValue)) - } -} - -// handleBelongsToPreload used to preload belongs to associations -func (scope *Scope) handleBelongsToPreload(field *Field, conditions []interface{}) { - relation := field.Relationship - - // preload conditions - preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) - - // get relations's primary keys - primaryKeys := scope.getColumnAsArray(relation.ForeignFieldNames, scope.Value) - if len(primaryKeys) == 0 { - return - } - - // find relations - results := makeSlice(field.Struct.Type) - scope.Err(preloadDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.AssociationForeignDBNames), toQueryMarks(primaryKeys)), toQueryValues(primaryKeys)...).Find(results, preloadConditions...).Error) - - // assign find results - var ( - resultsValue = indirect(reflect.ValueOf(results)) - indirectScopeValue = scope.IndirectValue() - ) - - foreignFieldToObjects := make(map[string][]*reflect.Value) - if indirectScopeValue.Kind() == reflect.Slice { - for j := 0; j < indirectScopeValue.Len(); j++ { - object := indirect(indirectScopeValue.Index(j)) - valueString := toString(getValueFromFields(object, relation.ForeignFieldNames)) - foreignFieldToObjects[valueString] = append(foreignFieldToObjects[valueString], &object) - } - } - - for i := 0; i < resultsValue.Len(); i++ { - result := resultsValue.Index(i) - if indirectScopeValue.Kind() == reflect.Slice { - valueString := toString(getValueFromFields(result, relation.AssociationForeignFieldNames)) - if objects, found := foreignFieldToObjects[valueString]; found { - for _, object := range objects { - object.FieldByName(field.Name).Set(result) - } - } - } else { - scope.Err(field.Set(result)) - } - } -} - -// handleManyToManyPreload used to preload many to many associations -func (scope *Scope) handleManyToManyPreload(field *Field, conditions []interface{}) { - var ( - relation = field.Relationship - joinTableHandler = relation.JoinTableHandler - fieldType = field.Struct.Type.Elem() - foreignKeyValue interface{} - foreignKeyType = reflect.ValueOf(&foreignKeyValue).Type() - linkHash = map[string][]reflect.Value{} - isPtr bool - ) - - if fieldType.Kind() == reflect.Ptr { - isPtr = true - fieldType = fieldType.Elem() - } - - var sourceKeys = []string{} - for _, key := range joinTableHandler.SourceForeignKeys() { - sourceKeys = append(sourceKeys, key.DBName) - } - - // preload conditions - preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) - - // generate query with join table - newScope := scope.New(reflect.New(fieldType).Interface()) - preloadDB = preloadDB.Table(newScope.TableName()).Model(newScope.Value) - - if len(preloadDB.search.selects) == 0 { - preloadDB = preloadDB.Select("*") - } - - preloadDB = joinTableHandler.JoinWith(joinTableHandler, preloadDB, scope.Value) - - // preload inline conditions - if len(preloadConditions) > 0 { - preloadDB = preloadDB.Where(preloadConditions[0], preloadConditions[1:]...) - } - - rows, err := preloadDB.Rows() - - if scope.Err(err) != nil { - return - } - defer rows.Close() - - columns, _ := rows.Columns() - for rows.Next() { - var ( - elem = reflect.New(fieldType).Elem() - fields = scope.New(elem.Addr().Interface()).Fields() - ) - - // register foreign keys in join tables - var joinTableFields []*Field - for _, sourceKey := range sourceKeys { - joinTableFields = append(joinTableFields, &Field{StructField: &StructField{DBName: sourceKey, IsNormal: true}, Field: reflect.New(foreignKeyType).Elem()}) - } - - scope.scan(rows, columns, append(fields, joinTableFields...)) - - scope.New(elem.Addr().Interface()). - InstanceSet("gorm:skip_query_callback", true). - callCallbacks(scope.db.parent.callbacks.queries) - - var foreignKeys = make([]interface{}, len(sourceKeys)) - // generate hashed forkey keys in join table - for idx, joinTableField := range joinTableFields { - if !joinTableField.Field.IsNil() { - foreignKeys[idx] = joinTableField.Field.Elem().Interface() - } - } - hashedSourceKeys := toString(foreignKeys) - - if isPtr { - linkHash[hashedSourceKeys] = append(linkHash[hashedSourceKeys], elem.Addr()) - } else { - linkHash[hashedSourceKeys] = append(linkHash[hashedSourceKeys], elem) - } - } - - if err := rows.Err(); err != nil { - scope.Err(err) - } - - // assign find results - var ( - indirectScopeValue = scope.IndirectValue() - fieldsSourceMap = map[string][]reflect.Value{} - foreignFieldNames = []string{} - ) - - for _, dbName := range relation.ForeignFieldNames { - if field, ok := scope.FieldByName(dbName); ok { - foreignFieldNames = append(foreignFieldNames, field.Name) - } - } - - if indirectScopeValue.Kind() == reflect.Slice { - for j := 0; j < indirectScopeValue.Len(); j++ { - object := indirect(indirectScopeValue.Index(j)) - key := toString(getValueFromFields(object, foreignFieldNames)) - fieldsSourceMap[key] = append(fieldsSourceMap[key], object.FieldByName(field.Name)) - } - } else if indirectScopeValue.IsValid() { - key := toString(getValueFromFields(indirectScopeValue, foreignFieldNames)) - fieldsSourceMap[key] = append(fieldsSourceMap[key], indirectScopeValue.FieldByName(field.Name)) - } - - for source, fields := range fieldsSourceMap { - for _, f := range fields { - //If not 0 this means Value is a pointer and we already added preloaded models to it - if f.Len() != 0 { - continue - } - - v := reflect.MakeSlice(f.Type(), 0, 0) - if len(linkHash[source]) > 0 { - v = reflect.Append(f, linkHash[source]...) - } - - f.Set(v) - } - } -} diff --git a/vendor/github.com/jinzhu/gorm/callback_row_query.go b/vendor/github.com/jinzhu/gorm/callback_row_query.go deleted file mode 100644 index 323b160..0000000 --- a/vendor/github.com/jinzhu/gorm/callback_row_query.go +++ /dev/null @@ -1,41 +0,0 @@ -package gorm - -import ( - "database/sql" - "fmt" -) - -// Define callbacks for row query -func init() { - DefaultCallback.RowQuery().Register("gorm:row_query", rowQueryCallback) -} - -type RowQueryResult struct { - Row *sql.Row -} - -type RowsQueryResult struct { - Rows *sql.Rows - Error error -} - -// queryCallback used to query data from database -func rowQueryCallback(scope *Scope) { - if result, ok := scope.InstanceGet("row_query_result"); ok { - scope.prepareQuerySQL() - - if str, ok := scope.Get("gorm:query_hint"); ok { - scope.SQL = fmt.Sprint(str) + scope.SQL - } - - if str, ok := scope.Get("gorm:query_option"); ok { - scope.SQL += addExtraSpaceIfExist(fmt.Sprint(str)) - } - - if rowResult, ok := result.(*RowQueryResult); ok { - rowResult.Row = scope.SQLDB().QueryRow(scope.SQL, scope.SQLVars...) - } else if rowsResult, ok := result.(*RowsQueryResult); ok { - rowsResult.Rows, rowsResult.Error = scope.SQLDB().Query(scope.SQL, scope.SQLVars...) - } - } -} diff --git a/vendor/github.com/jinzhu/gorm/callback_save.go b/vendor/github.com/jinzhu/gorm/callback_save.go deleted file mode 100644 index 3b4e058..0000000 --- a/vendor/github.com/jinzhu/gorm/callback_save.go +++ /dev/null @@ -1,170 +0,0 @@ -package gorm - -import ( - "reflect" - "strings" -) - -func beginTransactionCallback(scope *Scope) { - scope.Begin() -} - -func commitOrRollbackTransactionCallback(scope *Scope) { - scope.CommitOrRollback() -} - -func saveAssociationCheck(scope *Scope, field *Field) (autoUpdate bool, autoCreate bool, saveReference bool, r *Relationship) { - checkTruth := func(value interface{}) bool { - if v, ok := value.(bool); ok && !v { - return false - } - - if v, ok := value.(string); ok { - v = strings.ToLower(v) - return v == "true" - } - - return true - } - - if scope.changeableField(field) && !field.IsBlank && !field.IsIgnored { - if r = field.Relationship; r != nil { - autoUpdate, autoCreate, saveReference = true, true, true - - if value, ok := scope.Get("gorm:save_associations"); ok { - autoUpdate = checkTruth(value) - autoCreate = autoUpdate - saveReference = autoUpdate - } else if value, ok := field.TagSettingsGet("SAVE_ASSOCIATIONS"); ok { - autoUpdate = checkTruth(value) - autoCreate = autoUpdate - saveReference = autoUpdate - } - - if value, ok := scope.Get("gorm:association_autoupdate"); ok { - autoUpdate = checkTruth(value) - } else if value, ok := field.TagSettingsGet("ASSOCIATION_AUTOUPDATE"); ok { - autoUpdate = checkTruth(value) - } - - if value, ok := scope.Get("gorm:association_autocreate"); ok { - autoCreate = checkTruth(value) - } else if value, ok := field.TagSettingsGet("ASSOCIATION_AUTOCREATE"); ok { - autoCreate = checkTruth(value) - } - - if value, ok := scope.Get("gorm:association_save_reference"); ok { - saveReference = checkTruth(value) - } else if value, ok := field.TagSettingsGet("ASSOCIATION_SAVE_REFERENCE"); ok { - saveReference = checkTruth(value) - } - } - } - - return -} - -func saveBeforeAssociationsCallback(scope *Scope) { - for _, field := range scope.Fields() { - autoUpdate, autoCreate, saveReference, relationship := saveAssociationCheck(scope, field) - - if relationship != nil && relationship.Kind == "belongs_to" { - fieldValue := field.Field.Addr().Interface() - newScope := scope.New(fieldValue) - - if newScope.PrimaryKeyZero() { - if autoCreate { - scope.Err(scope.NewDB().Save(fieldValue).Error) - } - } else if autoUpdate { - scope.Err(scope.NewDB().Save(fieldValue).Error) - } - - if saveReference { - if len(relationship.ForeignFieldNames) != 0 { - // set value's foreign key - for idx, fieldName := range relationship.ForeignFieldNames { - associationForeignName := relationship.AssociationForeignDBNames[idx] - if foreignField, ok := scope.New(fieldValue).FieldByName(associationForeignName); ok { - scope.Err(scope.SetColumn(fieldName, foreignField.Field.Interface())) - } - } - } - } - } - } -} - -func saveAfterAssociationsCallback(scope *Scope) { - for _, field := range scope.Fields() { - autoUpdate, autoCreate, saveReference, relationship := saveAssociationCheck(scope, field) - - if relationship != nil && (relationship.Kind == "has_one" || relationship.Kind == "has_many" || relationship.Kind == "many_to_many") { - value := field.Field - - switch value.Kind() { - case reflect.Slice: - for i := 0; i < value.Len(); i++ { - newDB := scope.NewDB() - elem := value.Index(i).Addr().Interface() - newScope := newDB.NewScope(elem) - - if saveReference { - if relationship.JoinTableHandler == nil && len(relationship.ForeignFieldNames) != 0 { - for idx, fieldName := range relationship.ForeignFieldNames { - associationForeignName := relationship.AssociationForeignDBNames[idx] - if f, ok := scope.FieldByName(associationForeignName); ok { - scope.Err(newScope.SetColumn(fieldName, f.Field.Interface())) - } - } - } - - if relationship.PolymorphicType != "" { - scope.Err(newScope.SetColumn(relationship.PolymorphicType, relationship.PolymorphicValue)) - } - } - - if newScope.PrimaryKeyZero() { - if autoCreate { - scope.Err(newDB.Save(elem).Error) - } - } else if autoUpdate { - scope.Err(newDB.Save(elem).Error) - } - - if !scope.New(newScope.Value).PrimaryKeyZero() && saveReference { - if joinTableHandler := relationship.JoinTableHandler; joinTableHandler != nil { - scope.Err(joinTableHandler.Add(joinTableHandler, newDB, scope.Value, newScope.Value)) - } - } - } - default: - elem := value.Addr().Interface() - newScope := scope.New(elem) - - if saveReference { - if len(relationship.ForeignFieldNames) != 0 { - for idx, fieldName := range relationship.ForeignFieldNames { - associationForeignName := relationship.AssociationForeignDBNames[idx] - if f, ok := scope.FieldByName(associationForeignName); ok { - scope.Err(newScope.SetColumn(fieldName, f.Field.Interface())) - } - } - } - - if relationship.PolymorphicType != "" { - scope.Err(newScope.SetColumn(relationship.PolymorphicType, relationship.PolymorphicValue)) - } - } - - if newScope.PrimaryKeyZero() { - if autoCreate { - scope.Err(scope.NewDB().Save(elem).Error) - } - } else if autoUpdate { - scope.Err(scope.NewDB().Save(elem).Error) - } - } - } - } -} diff --git a/vendor/github.com/jinzhu/gorm/callback_update.go b/vendor/github.com/jinzhu/gorm/callback_update.go deleted file mode 100644 index 699e534..0000000 --- a/vendor/github.com/jinzhu/gorm/callback_update.go +++ /dev/null @@ -1,121 +0,0 @@ -package gorm - -import ( - "errors" - "fmt" - "sort" - "strings" -) - -// Define callbacks for updating -func init() { - DefaultCallback.Update().Register("gorm:assign_updating_attributes", assignUpdatingAttributesCallback) - DefaultCallback.Update().Register("gorm:begin_transaction", beginTransactionCallback) - DefaultCallback.Update().Register("gorm:before_update", beforeUpdateCallback) - DefaultCallback.Update().Register("gorm:save_before_associations", saveBeforeAssociationsCallback) - DefaultCallback.Update().Register("gorm:update_time_stamp", updateTimeStampForUpdateCallback) - DefaultCallback.Update().Register("gorm:update", updateCallback) - DefaultCallback.Update().Register("gorm:save_after_associations", saveAfterAssociationsCallback) - DefaultCallback.Update().Register("gorm:after_update", afterUpdateCallback) - DefaultCallback.Update().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback) -} - -// assignUpdatingAttributesCallback assign updating attributes to model -func assignUpdatingAttributesCallback(scope *Scope) { - if attrs, ok := scope.InstanceGet("gorm:update_interface"); ok { - if updateMaps, hasUpdate := scope.updatedAttrsWithValues(attrs); hasUpdate { - scope.InstanceSet("gorm:update_attrs", updateMaps) - } else { - scope.SkipLeft() - } - } -} - -// beforeUpdateCallback will invoke `BeforeSave`, `BeforeUpdate` method before updating -func beforeUpdateCallback(scope *Scope) { - if scope.DB().HasBlockGlobalUpdate() && !scope.hasConditions() { - scope.Err(errors.New("missing WHERE clause while updating")) - return - } - if _, ok := scope.Get("gorm:update_column"); !ok { - if !scope.HasError() { - scope.CallMethod("BeforeSave") - } - if !scope.HasError() { - scope.CallMethod("BeforeUpdate") - } - } -} - -// updateTimeStampForUpdateCallback will set `UpdatedAt` when updating -func updateTimeStampForUpdateCallback(scope *Scope) { - if _, ok := scope.Get("gorm:update_column"); !ok { - scope.SetColumn("UpdatedAt", scope.db.nowFunc()) - } -} - -// updateCallback the callback used to update data to database -func updateCallback(scope *Scope) { - if !scope.HasError() { - var sqls []string - - if updateAttrs, ok := scope.InstanceGet("gorm:update_attrs"); ok { - // Sort the column names so that the generated SQL is the same every time. - updateMap := updateAttrs.(map[string]interface{}) - var columns []string - for c := range updateMap { - columns = append(columns, c) - } - sort.Strings(columns) - - for _, column := range columns { - value := updateMap[column] - sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(column), scope.AddToVars(value))) - } - } else { - for _, field := range scope.Fields() { - if scope.changeableField(field) { - if !field.IsPrimaryKey && field.IsNormal && (field.Name != "CreatedAt" || !field.IsBlank) { - if !field.IsForeignKey || !field.IsBlank || !field.HasDefaultValue { - sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(field.DBName), scope.AddToVars(field.Field.Interface()))) - } - } else if relationship := field.Relationship; relationship != nil && relationship.Kind == "belongs_to" { - for _, foreignKey := range relationship.ForeignDBNames { - if foreignField, ok := scope.FieldByName(foreignKey); ok && !scope.changeableField(foreignField) { - sqls = append(sqls, - fmt.Sprintf("%v = %v", scope.Quote(foreignField.DBName), scope.AddToVars(foreignField.Field.Interface()))) - } - } - } - } - } - } - - var extraOption string - if str, ok := scope.Get("gorm:update_option"); ok { - extraOption = fmt.Sprint(str) - } - - if len(sqls) > 0 { - scope.Raw(fmt.Sprintf( - "UPDATE %v SET %v%v%v", - scope.QuotedTableName(), - strings.Join(sqls, ", "), - addExtraSpaceIfExist(scope.CombinedConditionSql()), - addExtraSpaceIfExist(extraOption), - )).Exec() - } - } -} - -// afterUpdateCallback will invoke `AfterUpdate`, `AfterSave` method after updating -func afterUpdateCallback(scope *Scope) { - if _, ok := scope.Get("gorm:update_column"); !ok { - if !scope.HasError() { - scope.CallMethod("AfterUpdate") - } - if !scope.HasError() { - scope.CallMethod("AfterSave") - } - } -} diff --git a/vendor/github.com/jinzhu/gorm/dialect.go b/vendor/github.com/jinzhu/gorm/dialect.go deleted file mode 100644 index 749587f..0000000 --- a/vendor/github.com/jinzhu/gorm/dialect.go +++ /dev/null @@ -1,147 +0,0 @@ -package gorm - -import ( - "database/sql" - "fmt" - "reflect" - "strconv" - "strings" -) - -// Dialect interface contains behaviors that differ across SQL database -type Dialect interface { - // GetName get dialect's name - GetName() string - - // SetDB set db for dialect - SetDB(db SQLCommon) - - // BindVar return the placeholder for actual values in SQL statements, in many dbs it is "?", Postgres using $1 - BindVar(i int) string - // Quote quotes field name to avoid SQL parsing exceptions by using a reserved word as a field name - Quote(key string) string - // DataTypeOf return data's sql type - DataTypeOf(field *StructField) string - - // HasIndex check has index or not - HasIndex(tableName string, indexName string) bool - // HasForeignKey check has foreign key or not - HasForeignKey(tableName string, foreignKeyName string) bool - // RemoveIndex remove index - RemoveIndex(tableName string, indexName string) error - // HasTable check has table or not - HasTable(tableName string) bool - // HasColumn check has column or not - HasColumn(tableName string, columnName string) bool - // ModifyColumn modify column's type - ModifyColumn(tableName string, columnName string, typ string) error - - // LimitAndOffsetSQL return generated SQL with Limit and Offset, as mssql has special case - LimitAndOffsetSQL(limit, offset interface{}) (string, error) - // SelectFromDummyTable return select values, for most dbs, `SELECT values` just works, mysql needs `SELECT value FROM DUAL` - SelectFromDummyTable() string - // LastInsertIDOutputInterstitial most dbs support LastInsertId, but mssql needs to use `OUTPUT` - LastInsertIDOutputInterstitial(tableName, columnName string, columns []string) string - // LastInsertIdReturningSuffix most dbs support LastInsertId, but postgres needs to use `RETURNING` - LastInsertIDReturningSuffix(tableName, columnName string) string - // DefaultValueStr - DefaultValueStr() string - - // BuildKeyName returns a valid key name (foreign key, index key) for the given table, field and reference - BuildKeyName(kind, tableName string, fields ...string) string - - // NormalizeIndexAndColumn returns valid index name and column name depending on each dialect - NormalizeIndexAndColumn(indexName, columnName string) (string, string) - - // CurrentDatabase return current database name - CurrentDatabase() string -} - -var dialectsMap = map[string]Dialect{} - -func newDialect(name string, db SQLCommon) Dialect { - if value, ok := dialectsMap[name]; ok { - dialect := reflect.New(reflect.TypeOf(value).Elem()).Interface().(Dialect) - dialect.SetDB(db) - return dialect - } - - fmt.Printf("`%v` is not officially supported, running under compatibility mode.\n", name) - commontDialect := &commonDialect{} - commontDialect.SetDB(db) - return commontDialect -} - -// RegisterDialect register new dialect -func RegisterDialect(name string, dialect Dialect) { - dialectsMap[name] = dialect -} - -// GetDialect gets the dialect for the specified dialect name -func GetDialect(name string) (dialect Dialect, ok bool) { - dialect, ok = dialectsMap[name] - return -} - -// ParseFieldStructForDialect get field's sql data type -var ParseFieldStructForDialect = func(field *StructField, dialect Dialect) (fieldValue reflect.Value, sqlType string, size int, additionalType string) { - // Get redirected field type - var ( - reflectType = field.Struct.Type - dataType, _ = field.TagSettingsGet("TYPE") - ) - - for reflectType.Kind() == reflect.Ptr { - reflectType = reflectType.Elem() - } - - // Get redirected field value - fieldValue = reflect.Indirect(reflect.New(reflectType)) - - if gormDataType, ok := fieldValue.Interface().(interface { - GormDataType(Dialect) string - }); ok { - dataType = gormDataType.GormDataType(dialect) - } - - // Get scanner's real value - if dataType == "" { - var getScannerValue func(reflect.Value) - getScannerValue = func(value reflect.Value) { - fieldValue = value - if _, isScanner := reflect.New(fieldValue.Type()).Interface().(sql.Scanner); isScanner && fieldValue.Kind() == reflect.Struct { - getScannerValue(fieldValue.Field(0)) - } - } - getScannerValue(fieldValue) - } - - // Default Size - if num, ok := field.TagSettingsGet("SIZE"); ok { - size, _ = strconv.Atoi(num) - } else { - size = 255 - } - - // Default type from tag setting - notNull, _ := field.TagSettingsGet("NOT NULL") - unique, _ := field.TagSettingsGet("UNIQUE") - additionalType = notNull + " " + unique - if value, ok := field.TagSettingsGet("DEFAULT"); ok { - additionalType = additionalType + " DEFAULT " + value - } - - if value, ok := field.TagSettingsGet("COMMENT"); ok { - additionalType = additionalType + " COMMENT " + value - } - - return fieldValue, dataType, size, strings.TrimSpace(additionalType) -} - -func currentDatabaseAndTable(dialect Dialect, tableName string) (string, string) { - if strings.Contains(tableName, ".") { - splitStrings := strings.SplitN(tableName, ".", 2) - return splitStrings[0], splitStrings[1] - } - return dialect.CurrentDatabase(), tableName -} diff --git a/vendor/github.com/jinzhu/gorm/dialect_common.go b/vendor/github.com/jinzhu/gorm/dialect_common.go deleted file mode 100644 index d549510..0000000 --- a/vendor/github.com/jinzhu/gorm/dialect_common.go +++ /dev/null @@ -1,196 +0,0 @@ -package gorm - -import ( - "fmt" - "reflect" - "regexp" - "strconv" - "strings" - "time" -) - -var keyNameRegex = regexp.MustCompile("[^a-zA-Z0-9]+") - -// DefaultForeignKeyNamer contains the default foreign key name generator method -type DefaultForeignKeyNamer struct { -} - -type commonDialect struct { - db SQLCommon - DefaultForeignKeyNamer -} - -func init() { - RegisterDialect("common", &commonDialect{}) -} - -func (commonDialect) GetName() string { - return "common" -} - -func (s *commonDialect) SetDB(db SQLCommon) { - s.db = db -} - -func (commonDialect) BindVar(i int) string { - return "$$$" // ? -} - -func (commonDialect) Quote(key string) string { - return fmt.Sprintf(`"%s"`, key) -} - -func (s *commonDialect) fieldCanAutoIncrement(field *StructField) bool { - if value, ok := field.TagSettingsGet("AUTO_INCREMENT"); ok { - return strings.ToLower(value) != "false" - } - return field.IsPrimaryKey -} - -func (s *commonDialect) DataTypeOf(field *StructField) string { - var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) - - if sqlType == "" { - switch dataValue.Kind() { - case reflect.Bool: - sqlType = "BOOLEAN" - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr: - if s.fieldCanAutoIncrement(field) { - sqlType = "INTEGER AUTO_INCREMENT" - } else { - sqlType = "INTEGER" - } - case reflect.Int64, reflect.Uint64: - if s.fieldCanAutoIncrement(field) { - sqlType = "BIGINT AUTO_INCREMENT" - } else { - sqlType = "BIGINT" - } - case reflect.Float32, reflect.Float64: - sqlType = "FLOAT" - case reflect.String: - if size > 0 && size < 65532 { - sqlType = fmt.Sprintf("VARCHAR(%d)", size) - } else { - sqlType = "VARCHAR(65532)" - } - case reflect.Struct: - if _, ok := dataValue.Interface().(time.Time); ok { - sqlType = "TIMESTAMP" - } - default: - if _, ok := dataValue.Interface().([]byte); ok { - if size > 0 && size < 65532 { - sqlType = fmt.Sprintf("BINARY(%d)", size) - } else { - sqlType = "BINARY(65532)" - } - } - } - } - - if sqlType == "" { - panic(fmt.Sprintf("invalid sql type %s (%s) for commonDialect", dataValue.Type().Name(), dataValue.Kind().String())) - } - - if strings.TrimSpace(additionalType) == "" { - return sqlType - } - return fmt.Sprintf("%v %v", sqlType, additionalType) -} - -func (s commonDialect) HasIndex(tableName string, indexName string) bool { - var count int - currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) - s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema = ? AND table_name = ? AND index_name = ?", currentDatabase, tableName, indexName).Scan(&count) - return count > 0 -} - -func (s commonDialect) RemoveIndex(tableName string, indexName string) error { - _, err := s.db.Exec(fmt.Sprintf("DROP INDEX %v", indexName)) - return err -} - -func (s commonDialect) HasForeignKey(tableName string, foreignKeyName string) bool { - return false -} - -func (s commonDialect) HasTable(tableName string) bool { - var count int - currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) - s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = ? AND table_name = ?", currentDatabase, tableName).Scan(&count) - return count > 0 -} - -func (s commonDialect) HasColumn(tableName string, columnName string) bool { - var count int - currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) - s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = ? AND table_name = ? AND column_name = ?", currentDatabase, tableName, columnName).Scan(&count) - return count > 0 -} - -func (s commonDialect) ModifyColumn(tableName string, columnName string, typ string) error { - _, err := s.db.Exec(fmt.Sprintf("ALTER TABLE %v ALTER COLUMN %v TYPE %v", tableName, columnName, typ)) - return err -} - -func (s commonDialect) CurrentDatabase() (name string) { - s.db.QueryRow("SELECT DATABASE()").Scan(&name) - return -} - -// LimitAndOffsetSQL return generated SQL with Limit and Offset -func (s commonDialect) LimitAndOffsetSQL(limit, offset interface{}) (sql string, err error) { - if limit != nil { - if parsedLimit, err := s.parseInt(limit); err != nil { - return "", err - } else if parsedLimit >= 0 { - sql += fmt.Sprintf(" LIMIT %d", parsedLimit) - } - } - if offset != nil { - if parsedOffset, err := s.parseInt(offset); err != nil { - return "", err - } else if parsedOffset >= 0 { - sql += fmt.Sprintf(" OFFSET %d", parsedOffset) - } - } - return -} - -func (commonDialect) SelectFromDummyTable() string { - return "" -} - -func (commonDialect) LastInsertIDOutputInterstitial(tableName, columnName string, columns []string) string { - return "" -} - -func (commonDialect) LastInsertIDReturningSuffix(tableName, columnName string) string { - return "" -} - -func (commonDialect) DefaultValueStr() string { - return "DEFAULT VALUES" -} - -// BuildKeyName returns a valid key name (foreign key, index key) for the given table, field and reference -func (DefaultForeignKeyNamer) BuildKeyName(kind, tableName string, fields ...string) string { - keyName := fmt.Sprintf("%s_%s_%s", kind, tableName, strings.Join(fields, "_")) - keyName = keyNameRegex.ReplaceAllString(keyName, "_") - return keyName -} - -// NormalizeIndexAndColumn returns argument's index name and column name without doing anything -func (commonDialect) NormalizeIndexAndColumn(indexName, columnName string) (string, string) { - return indexName, columnName -} - -func (commonDialect) parseInt(value interface{}) (int64, error) { - return strconv.ParseInt(fmt.Sprint(value), 0, 0) -} - -// IsByteArrayOrSlice returns true of the reflected value is an array or slice -func IsByteArrayOrSlice(value reflect.Value) bool { - return (value.Kind() == reflect.Array || value.Kind() == reflect.Slice) && value.Type().Elem() == reflect.TypeOf(uint8(0)) -} diff --git a/vendor/github.com/jinzhu/gorm/dialect_mysql.go b/vendor/github.com/jinzhu/gorm/dialect_mysql.go deleted file mode 100644 index b4467ff..0000000 --- a/vendor/github.com/jinzhu/gorm/dialect_mysql.go +++ /dev/null @@ -1,246 +0,0 @@ -package gorm - -import ( - "crypto/sha1" - "database/sql" - "fmt" - "reflect" - "regexp" - "strings" - "time" - "unicode/utf8" -) - -var mysqlIndexRegex = regexp.MustCompile(`^(.+)\((\d+)\)$`) - -type mysql struct { - commonDialect -} - -func init() { - RegisterDialect("mysql", &mysql{}) -} - -func (mysql) GetName() string { - return "mysql" -} - -func (mysql) Quote(key string) string { - return fmt.Sprintf("`%s`", key) -} - -// Get Data Type for MySQL Dialect -func (s *mysql) DataTypeOf(field *StructField) string { - var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) - - // MySQL allows only one auto increment column per table, and it must - // be a KEY column. - if _, ok := field.TagSettingsGet("AUTO_INCREMENT"); ok { - if _, ok = field.TagSettingsGet("INDEX"); !ok && !field.IsPrimaryKey { - field.TagSettingsDelete("AUTO_INCREMENT") - } - } - - if sqlType == "" { - switch dataValue.Kind() { - case reflect.Bool: - sqlType = "boolean" - case reflect.Int8: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "tinyint AUTO_INCREMENT" - } else { - sqlType = "tinyint" - } - case reflect.Int, reflect.Int16, reflect.Int32: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "int AUTO_INCREMENT" - } else { - sqlType = "int" - } - case reflect.Uint8: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "tinyint unsigned AUTO_INCREMENT" - } else { - sqlType = "tinyint unsigned" - } - case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uintptr: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "int unsigned AUTO_INCREMENT" - } else { - sqlType = "int unsigned" - } - case reflect.Int64: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "bigint AUTO_INCREMENT" - } else { - sqlType = "bigint" - } - case reflect.Uint64: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "bigint unsigned AUTO_INCREMENT" - } else { - sqlType = "bigint unsigned" - } - case reflect.Float32, reflect.Float64: - sqlType = "double" - case reflect.String: - if size > 0 && size < 65532 { - sqlType = fmt.Sprintf("varchar(%d)", size) - } else { - sqlType = "longtext" - } - case reflect.Struct: - if _, ok := dataValue.Interface().(time.Time); ok { - precision := "" - if p, ok := field.TagSettingsGet("PRECISION"); ok { - precision = fmt.Sprintf("(%s)", p) - } - - if _, ok := field.TagSettings["NOT NULL"]; ok || field.IsPrimaryKey { - sqlType = fmt.Sprintf("DATETIME%v", precision) - } else { - sqlType = fmt.Sprintf("DATETIME%v NULL", precision) - } - } - default: - if IsByteArrayOrSlice(dataValue) { - if size > 0 && size < 65532 { - sqlType = fmt.Sprintf("varbinary(%d)", size) - } else { - sqlType = "longblob" - } - } - } - } - - if sqlType == "" { - panic(fmt.Sprintf("invalid sql type %s (%s) in field %s for mysql", dataValue.Type().Name(), dataValue.Kind().String(), field.Name)) - } - - if strings.TrimSpace(additionalType) == "" { - return sqlType - } - return fmt.Sprintf("%v %v", sqlType, additionalType) -} - -func (s mysql) RemoveIndex(tableName string, indexName string) error { - _, err := s.db.Exec(fmt.Sprintf("DROP INDEX %v ON %v", indexName, s.Quote(tableName))) - return err -} - -func (s mysql) ModifyColumn(tableName string, columnName string, typ string) error { - _, err := s.db.Exec(fmt.Sprintf("ALTER TABLE %v MODIFY COLUMN %v %v", tableName, columnName, typ)) - return err -} - -func (s mysql) LimitAndOffsetSQL(limit, offset interface{}) (sql string, err error) { - if limit != nil { - parsedLimit, err := s.parseInt(limit) - if err != nil { - return "", err - } - if parsedLimit >= 0 { - sql += fmt.Sprintf(" LIMIT %d", parsedLimit) - - if offset != nil { - parsedOffset, err := s.parseInt(offset) - if err != nil { - return "", err - } - if parsedOffset >= 0 { - sql += fmt.Sprintf(" OFFSET %d", parsedOffset) - } - } - } - } - return -} - -func (s mysql) HasForeignKey(tableName string, foreignKeyName string) bool { - var count int - currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) - s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA=? AND TABLE_NAME=? AND CONSTRAINT_NAME=? AND CONSTRAINT_TYPE='FOREIGN KEY'", currentDatabase, tableName, foreignKeyName).Scan(&count) - return count > 0 -} - -func (s mysql) HasTable(tableName string) bool { - currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) - var name string - // allow mysql database name with '-' character - if err := s.db.QueryRow(fmt.Sprintf("SHOW TABLES FROM `%s` WHERE `Tables_in_%s` = ?", currentDatabase, currentDatabase), tableName).Scan(&name); err != nil { - if err == sql.ErrNoRows { - return false - } - panic(err) - } else { - return true - } -} - -func (s mysql) HasIndex(tableName string, indexName string) bool { - currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) - if rows, err := s.db.Query(fmt.Sprintf("SHOW INDEXES FROM `%s` FROM `%s` WHERE Key_name = ?", tableName, currentDatabase), indexName); err != nil { - panic(err) - } else { - defer rows.Close() - return rows.Next() - } -} - -func (s mysql) HasColumn(tableName string, columnName string) bool { - currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) - if rows, err := s.db.Query(fmt.Sprintf("SHOW COLUMNS FROM `%s` FROM `%s` WHERE Field = ?", tableName, currentDatabase), columnName); err != nil { - panic(err) - } else { - defer rows.Close() - return rows.Next() - } -} - -func (s mysql) CurrentDatabase() (name string) { - s.db.QueryRow("SELECT DATABASE()").Scan(&name) - return -} - -func (mysql) SelectFromDummyTable() string { - return "FROM DUAL" -} - -func (s mysql) BuildKeyName(kind, tableName string, fields ...string) string { - keyName := s.commonDialect.BuildKeyName(kind, tableName, fields...) - if utf8.RuneCountInString(keyName) <= 64 { - return keyName - } - h := sha1.New() - h.Write([]byte(keyName)) - bs := h.Sum(nil) - - // sha1 is 40 characters, keep first 24 characters of destination - destRunes := []rune(keyNameRegex.ReplaceAllString(fields[0], "_")) - if len(destRunes) > 24 { - destRunes = destRunes[:24] - } - - return fmt.Sprintf("%s%x", string(destRunes), bs) -} - -// NormalizeIndexAndColumn returns index name and column name for specify an index prefix length if needed -func (mysql) NormalizeIndexAndColumn(indexName, columnName string) (string, string) { - submatch := mysqlIndexRegex.FindStringSubmatch(indexName) - if len(submatch) != 3 { - return indexName, columnName - } - indexName = submatch[1] - columnName = fmt.Sprintf("%s(%s)", columnName, submatch[2]) - return indexName, columnName -} - -func (mysql) DefaultValueStr() string { - return "VALUES()" -} diff --git a/vendor/github.com/jinzhu/gorm/dialect_postgres.go b/vendor/github.com/jinzhu/gorm/dialect_postgres.go deleted file mode 100644 index d2df313..0000000 --- a/vendor/github.com/jinzhu/gorm/dialect_postgres.go +++ /dev/null @@ -1,147 +0,0 @@ -package gorm - -import ( - "encoding/json" - "fmt" - "reflect" - "strings" - "time" -) - -type postgres struct { - commonDialect -} - -func init() { - RegisterDialect("postgres", &postgres{}) - RegisterDialect("cloudsqlpostgres", &postgres{}) -} - -func (postgres) GetName() string { - return "postgres" -} - -func (postgres) BindVar(i int) string { - return fmt.Sprintf("$%v", i) -} - -func (s *postgres) DataTypeOf(field *StructField) string { - var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) - - if sqlType == "" { - switch dataValue.Kind() { - case reflect.Bool: - sqlType = "boolean" - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uintptr: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "serial" - } else { - sqlType = "integer" - } - case reflect.Int64, reflect.Uint32, reflect.Uint64: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "bigserial" - } else { - sqlType = "bigint" - } - case reflect.Float32, reflect.Float64: - sqlType = "numeric" - case reflect.String: - if _, ok := field.TagSettingsGet("SIZE"); !ok { - size = 0 // if SIZE haven't been set, use `text` as the default type, as there are no performance different - } - - if size > 0 && size < 65532 { - sqlType = fmt.Sprintf("varchar(%d)", size) - } else { - sqlType = "text" - } - case reflect.Struct: - if _, ok := dataValue.Interface().(time.Time); ok { - sqlType = "timestamp with time zone" - } - case reflect.Map: - if dataValue.Type().Name() == "Hstore" { - sqlType = "hstore" - } - default: - if IsByteArrayOrSlice(dataValue) { - sqlType = "bytea" - - if isUUID(dataValue) { - sqlType = "uuid" - } - - if isJSON(dataValue) { - sqlType = "jsonb" - } - } - } - } - - if sqlType == "" { - panic(fmt.Sprintf("invalid sql type %s (%s) for postgres", dataValue.Type().Name(), dataValue.Kind().String())) - } - - if strings.TrimSpace(additionalType) == "" { - return sqlType - } - return fmt.Sprintf("%v %v", sqlType, additionalType) -} - -func (s postgres) HasIndex(tableName string, indexName string) bool { - var count int - s.db.QueryRow("SELECT count(*) FROM pg_indexes WHERE tablename = $1 AND indexname = $2 AND schemaname = CURRENT_SCHEMA()", tableName, indexName).Scan(&count) - return count > 0 -} - -func (s postgres) HasForeignKey(tableName string, foreignKeyName string) bool { - var count int - s.db.QueryRow("SELECT count(con.conname) FROM pg_constraint con WHERE $1::regclass::oid = con.conrelid AND con.conname = $2 AND con.contype='f'", tableName, foreignKeyName).Scan(&count) - return count > 0 -} - -func (s postgres) HasTable(tableName string) bool { - var count int - s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.tables WHERE table_name = $1 AND table_type = 'BASE TABLE' AND table_schema = CURRENT_SCHEMA()", tableName).Scan(&count) - return count > 0 -} - -func (s postgres) HasColumn(tableName string, columnName string) bool { - var count int - s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = CURRENT_SCHEMA()", tableName, columnName).Scan(&count) - return count > 0 -} - -func (s postgres) CurrentDatabase() (name string) { - s.db.QueryRow("SELECT CURRENT_DATABASE()").Scan(&name) - return -} - -func (s postgres) LastInsertIDOutputInterstitial(tableName, key string, columns []string) string { - return "" -} - -func (s postgres) LastInsertIDReturningSuffix(tableName, key string) string { - return fmt.Sprintf("RETURNING %v.%v", tableName, key) -} - -func (postgres) SupportLastInsertID() bool { - return false -} - -func isUUID(value reflect.Value) bool { - if value.Kind() != reflect.Array || value.Type().Len() != 16 { - return false - } - typename := value.Type().Name() - lower := strings.ToLower(typename) - return "uuid" == lower || "guid" == lower -} - -func isJSON(value reflect.Value) bool { - _, ok := value.Interface().(json.RawMessage) - return ok -} diff --git a/vendor/github.com/jinzhu/gorm/dialect_sqlite3.go b/vendor/github.com/jinzhu/gorm/dialect_sqlite3.go deleted file mode 100644 index 5f96c36..0000000 --- a/vendor/github.com/jinzhu/gorm/dialect_sqlite3.go +++ /dev/null @@ -1,107 +0,0 @@ -package gorm - -import ( - "fmt" - "reflect" - "strings" - "time" -) - -type sqlite3 struct { - commonDialect -} - -func init() { - RegisterDialect("sqlite3", &sqlite3{}) -} - -func (sqlite3) GetName() string { - return "sqlite3" -} - -// Get Data Type for Sqlite Dialect -func (s *sqlite3) DataTypeOf(field *StructField) string { - var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) - - if sqlType == "" { - switch dataValue.Kind() { - case reflect.Bool: - sqlType = "bool" - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "integer primary key autoincrement" - } else { - sqlType = "integer" - } - case reflect.Int64, reflect.Uint64: - if s.fieldCanAutoIncrement(field) { - field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") - sqlType = "integer primary key autoincrement" - } else { - sqlType = "bigint" - } - case reflect.Float32, reflect.Float64: - sqlType = "real" - case reflect.String: - if size > 0 && size < 65532 { - sqlType = fmt.Sprintf("varchar(%d)", size) - } else { - sqlType = "text" - } - case reflect.Struct: - if _, ok := dataValue.Interface().(time.Time); ok { - sqlType = "datetime" - } - default: - if IsByteArrayOrSlice(dataValue) { - sqlType = "blob" - } - } - } - - if sqlType == "" { - panic(fmt.Sprintf("invalid sql type %s (%s) for sqlite3", dataValue.Type().Name(), dataValue.Kind().String())) - } - - if strings.TrimSpace(additionalType) == "" { - return sqlType - } - return fmt.Sprintf("%v %v", sqlType, additionalType) -} - -func (s sqlite3) HasIndex(tableName string, indexName string) bool { - var count int - s.db.QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND sql LIKE '%%INDEX %v ON%%'", indexName), tableName).Scan(&count) - return count > 0 -} - -func (s sqlite3) HasTable(tableName string) bool { - var count int - s.db.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", tableName).Scan(&count) - return count > 0 -} - -func (s sqlite3) HasColumn(tableName string, columnName string) bool { - var count int - s.db.QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND (sql LIKE '%%\"%v\" %%' OR sql LIKE '%%%v %%');\n", columnName, columnName), tableName).Scan(&count) - return count > 0 -} - -func (s sqlite3) CurrentDatabase() (name string) { - var ( - ifaces = make([]interface{}, 3) - pointers = make([]*string, 3) - i int - ) - for i = 0; i < 3; i++ { - ifaces[i] = &pointers[i] - } - if err := s.db.QueryRow("PRAGMA database_list").Scan(ifaces...); err != nil { - return - } - if pointers[1] != nil { - name = *pointers[1] - } - return -} diff --git a/vendor/github.com/jinzhu/gorm/docker-compose.yml b/vendor/github.com/jinzhu/gorm/docker-compose.yml deleted file mode 100644 index 79bf5fc..0000000 --- a/vendor/github.com/jinzhu/gorm/docker-compose.yml +++ /dev/null @@ -1,30 +0,0 @@ -version: '3' - -services: - mysql: - image: 'mysql:latest' - ports: - - 9910:3306 - environment: - - MYSQL_DATABASE=gorm - - MYSQL_USER=gorm - - MYSQL_PASSWORD=gorm - - MYSQL_RANDOM_ROOT_PASSWORD="yes" - postgres: - image: 'postgres:latest' - ports: - - 9920:5432 - environment: - - POSTGRES_USER=gorm - - POSTGRES_DB=gorm - - POSTGRES_PASSWORD=gorm - mssql: - image: 'mcmoe/mssqldocker:latest' - ports: - - 9930:1433 - environment: - - ACCEPT_EULA=Y - - SA_PASSWORD=LoremIpsum86 - - MSSQL_DB=gorm - - MSSQL_USER=gorm - - MSSQL_PASSWORD=LoremIpsum86 diff --git a/vendor/github.com/jinzhu/gorm/errors.go b/vendor/github.com/jinzhu/gorm/errors.go deleted file mode 100644 index d5ef8d5..0000000 --- a/vendor/github.com/jinzhu/gorm/errors.go +++ /dev/null @@ -1,72 +0,0 @@ -package gorm - -import ( - "errors" - "strings" -) - -var ( - // ErrRecordNotFound returns a "record not found error". Occurs only when attempting to query the database with a struct; querying with a slice won't return this error - ErrRecordNotFound = errors.New("record not found") - // ErrInvalidSQL occurs when you attempt a query with invalid SQL - ErrInvalidSQL = errors.New("invalid SQL") - // ErrInvalidTransaction occurs when you are trying to `Commit` or `Rollback` - ErrInvalidTransaction = errors.New("no valid transaction") - // ErrCantStartTransaction can't start transaction when you are trying to start one with `Begin` - ErrCantStartTransaction = errors.New("can't start transaction") - // ErrUnaddressable unaddressable value - ErrUnaddressable = errors.New("using unaddressable value") -) - -// Errors contains all happened errors -type Errors []error - -// IsRecordNotFoundError returns true if error contains a RecordNotFound error -func IsRecordNotFoundError(err error) bool { - if errs, ok := err.(Errors); ok { - for _, err := range errs { - if err == ErrRecordNotFound { - return true - } - } - } - return err == ErrRecordNotFound -} - -// GetErrors gets all errors that have occurred and returns a slice of errors (Error type) -func (errs Errors) GetErrors() []error { - return errs -} - -// Add adds an error to a given slice of errors -func (errs Errors) Add(newErrors ...error) Errors { - for _, err := range newErrors { - if err == nil { - continue - } - - if errors, ok := err.(Errors); ok { - errs = errs.Add(errors...) - } else { - ok = true - for _, e := range errs { - if err == e { - ok = false - } - } - if ok { - errs = append(errs, err) - } - } - } - return errs -} - -// Error takes a slice of all errors that have occurred and returns it as a formatted string -func (errs Errors) Error() string { - var errors = []string{} - for _, e := range errs { - errors = append(errors, e.Error()) - } - return strings.Join(errors, "; ") -} diff --git a/vendor/github.com/jinzhu/gorm/field.go b/vendor/github.com/jinzhu/gorm/field.go deleted file mode 100644 index acd06e2..0000000 --- a/vendor/github.com/jinzhu/gorm/field.go +++ /dev/null @@ -1,66 +0,0 @@ -package gorm - -import ( - "database/sql" - "database/sql/driver" - "errors" - "fmt" - "reflect" -) - -// Field model field definition -type Field struct { - *StructField - IsBlank bool - Field reflect.Value -} - -// Set set a value to the field -func (field *Field) Set(value interface{}) (err error) { - if !field.Field.IsValid() { - return errors.New("field value not valid") - } - - if !field.Field.CanAddr() { - return ErrUnaddressable - } - - reflectValue, ok := value.(reflect.Value) - if !ok { - reflectValue = reflect.ValueOf(value) - } - - fieldValue := field.Field - if reflectValue.IsValid() { - if reflectValue.Type().ConvertibleTo(fieldValue.Type()) { - fieldValue.Set(reflectValue.Convert(fieldValue.Type())) - } else { - if fieldValue.Kind() == reflect.Ptr { - if fieldValue.IsNil() { - fieldValue.Set(reflect.New(field.Struct.Type.Elem())) - } - fieldValue = fieldValue.Elem() - } - - if reflectValue.Type().ConvertibleTo(fieldValue.Type()) { - fieldValue.Set(reflectValue.Convert(fieldValue.Type())) - } else if scanner, ok := fieldValue.Addr().Interface().(sql.Scanner); ok { - v := reflectValue.Interface() - if valuer, ok := v.(driver.Valuer); ok { - if v, err = valuer.Value(); err == nil { - err = scanner.Scan(v) - } - } else { - err = scanner.Scan(v) - } - } else { - err = fmt.Errorf("could not convert argument of field %s from %s to %s", field.Name, reflectValue.Type(), fieldValue.Type()) - } - } - } else { - field.Field.Set(reflect.Zero(field.Field.Type())) - } - - field.IsBlank = isBlank(field.Field) - return err -} diff --git a/vendor/github.com/jinzhu/gorm/go.mod b/vendor/github.com/jinzhu/gorm/go.mod deleted file mode 100644 index 64a42a4..0000000 --- a/vendor/github.com/jinzhu/gorm/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/jinzhu/gorm - -go 1.12 - -require ( - github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd - github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 - github.com/go-sql-driver/mysql v1.5.0 - github.com/jinzhu/inflection v1.0.0 - github.com/jinzhu/now v1.0.1 - github.com/lib/pq v1.1.1 - github.com/mattn/go-sqlite3 v1.14.0 - golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd // indirect -) diff --git a/vendor/github.com/jinzhu/gorm/go.sum b/vendor/github.com/jinzhu/gorm/go.sum deleted file mode 100644 index d30630b..0000000 --- a/vendor/github.com/jinzhu/gorm/go.sum +++ /dev/null @@ -1,33 +0,0 @@ -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= -github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= -github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= -github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/vendor/github.com/jinzhu/gorm/interface.go b/vendor/github.com/jinzhu/gorm/interface.go deleted file mode 100644 index fe64923..0000000 --- a/vendor/github.com/jinzhu/gorm/interface.go +++ /dev/null @@ -1,24 +0,0 @@ -package gorm - -import ( - "context" - "database/sql" -) - -// SQLCommon is the minimal database connection functionality gorm requires. Implemented by *sql.DB. -type SQLCommon interface { - Exec(query string, args ...interface{}) (sql.Result, error) - Prepare(query string) (*sql.Stmt, error) - Query(query string, args ...interface{}) (*sql.Rows, error) - QueryRow(query string, args ...interface{}) *sql.Row -} - -type sqlDb interface { - Begin() (*sql.Tx, error) - BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) -} - -type sqlTx interface { - Commit() error - Rollback() error -} diff --git a/vendor/github.com/jinzhu/gorm/join_table_handler.go b/vendor/github.com/jinzhu/gorm/join_table_handler.go deleted file mode 100644 index a036d46..0000000 --- a/vendor/github.com/jinzhu/gorm/join_table_handler.go +++ /dev/null @@ -1,211 +0,0 @@ -package gorm - -import ( - "errors" - "fmt" - "reflect" - "strings" -) - -// JoinTableHandlerInterface is an interface for how to handle many2many relations -type JoinTableHandlerInterface interface { - // initialize join table handler - Setup(relationship *Relationship, tableName string, source reflect.Type, destination reflect.Type) - // Table return join table's table name - Table(db *DB) string - // Add create relationship in join table for source and destination - Add(handler JoinTableHandlerInterface, db *DB, source interface{}, destination interface{}) error - // Delete delete relationship in join table for sources - Delete(handler JoinTableHandlerInterface, db *DB, sources ...interface{}) error - // JoinWith query with `Join` conditions - JoinWith(handler JoinTableHandlerInterface, db *DB, source interface{}) *DB - // SourceForeignKeys return source foreign keys - SourceForeignKeys() []JoinTableForeignKey - // DestinationForeignKeys return destination foreign keys - DestinationForeignKeys() []JoinTableForeignKey -} - -// JoinTableForeignKey join table foreign key struct -type JoinTableForeignKey struct { - DBName string - AssociationDBName string -} - -// JoinTableSource is a struct that contains model type and foreign keys -type JoinTableSource struct { - ModelType reflect.Type - ForeignKeys []JoinTableForeignKey -} - -// JoinTableHandler default join table handler -type JoinTableHandler struct { - TableName string `sql:"-"` - Source JoinTableSource `sql:"-"` - Destination JoinTableSource `sql:"-"` -} - -// SourceForeignKeys return source foreign keys -func (s *JoinTableHandler) SourceForeignKeys() []JoinTableForeignKey { - return s.Source.ForeignKeys -} - -// DestinationForeignKeys return destination foreign keys -func (s *JoinTableHandler) DestinationForeignKeys() []JoinTableForeignKey { - return s.Destination.ForeignKeys -} - -// Setup initialize a default join table handler -func (s *JoinTableHandler) Setup(relationship *Relationship, tableName string, source reflect.Type, destination reflect.Type) { - s.TableName = tableName - - s.Source = JoinTableSource{ModelType: source} - s.Source.ForeignKeys = []JoinTableForeignKey{} - for idx, dbName := range relationship.ForeignFieldNames { - s.Source.ForeignKeys = append(s.Source.ForeignKeys, JoinTableForeignKey{ - DBName: relationship.ForeignDBNames[idx], - AssociationDBName: dbName, - }) - } - - s.Destination = JoinTableSource{ModelType: destination} - s.Destination.ForeignKeys = []JoinTableForeignKey{} - for idx, dbName := range relationship.AssociationForeignFieldNames { - s.Destination.ForeignKeys = append(s.Destination.ForeignKeys, JoinTableForeignKey{ - DBName: relationship.AssociationForeignDBNames[idx], - AssociationDBName: dbName, - }) - } -} - -// Table return join table's table name -func (s JoinTableHandler) Table(db *DB) string { - return DefaultTableNameHandler(db, s.TableName) -} - -func (s JoinTableHandler) updateConditionMap(conditionMap map[string]interface{}, db *DB, joinTableSources []JoinTableSource, sources ...interface{}) { - for _, source := range sources { - scope := db.NewScope(source) - modelType := scope.GetModelStruct().ModelType - - for _, joinTableSource := range joinTableSources { - if joinTableSource.ModelType == modelType { - for _, foreignKey := range joinTableSource.ForeignKeys { - if field, ok := scope.FieldByName(foreignKey.AssociationDBName); ok { - conditionMap[foreignKey.DBName] = field.Field.Interface() - } - } - break - } - } - } -} - -// Add create relationship in join table for source and destination -func (s JoinTableHandler) Add(handler JoinTableHandlerInterface, db *DB, source interface{}, destination interface{}) error { - var ( - scope = db.NewScope("") - conditionMap = map[string]interface{}{} - ) - - // Update condition map for source - s.updateConditionMap(conditionMap, db, []JoinTableSource{s.Source}, source) - - // Update condition map for destination - s.updateConditionMap(conditionMap, db, []JoinTableSource{s.Destination}, destination) - - var assignColumns, binVars, conditions []string - var values []interface{} - for key, value := range conditionMap { - assignColumns = append(assignColumns, scope.Quote(key)) - binVars = append(binVars, `?`) - conditions = append(conditions, fmt.Sprintf("%v = ?", scope.Quote(key))) - values = append(values, value) - } - - for _, value := range values { - values = append(values, value) - } - - quotedTable := scope.Quote(handler.Table(db)) - sql := fmt.Sprintf( - "INSERT INTO %v (%v) SELECT %v %v WHERE NOT EXISTS (SELECT * FROM %v WHERE %v)", - quotedTable, - strings.Join(assignColumns, ","), - strings.Join(binVars, ","), - scope.Dialect().SelectFromDummyTable(), - quotedTable, - strings.Join(conditions, " AND "), - ) - - return db.Exec(sql, values...).Error -} - -// Delete delete relationship in join table for sources -func (s JoinTableHandler) Delete(handler JoinTableHandlerInterface, db *DB, sources ...interface{}) error { - var ( - scope = db.NewScope(nil) - conditions []string - values []interface{} - conditionMap = map[string]interface{}{} - ) - - s.updateConditionMap(conditionMap, db, []JoinTableSource{s.Source, s.Destination}, sources...) - - for key, value := range conditionMap { - conditions = append(conditions, fmt.Sprintf("%v = ?", scope.Quote(key))) - values = append(values, value) - } - - return db.Table(handler.Table(db)).Where(strings.Join(conditions, " AND "), values...).Delete("").Error -} - -// JoinWith query with `Join` conditions -func (s JoinTableHandler) JoinWith(handler JoinTableHandlerInterface, db *DB, source interface{}) *DB { - var ( - scope = db.NewScope(source) - tableName = handler.Table(db) - quotedTableName = scope.Quote(tableName) - joinConditions []string - values []interface{} - ) - - if s.Source.ModelType == scope.GetModelStruct().ModelType { - destinationTableName := db.NewScope(reflect.New(s.Destination.ModelType).Interface()).QuotedTableName() - for _, foreignKey := range s.Destination.ForeignKeys { - joinConditions = append(joinConditions, fmt.Sprintf("%v.%v = %v.%v", quotedTableName, scope.Quote(foreignKey.DBName), destinationTableName, scope.Quote(foreignKey.AssociationDBName))) - } - - var foreignDBNames []string - var foreignFieldNames []string - - for _, foreignKey := range s.Source.ForeignKeys { - foreignDBNames = append(foreignDBNames, foreignKey.DBName) - if field, ok := scope.FieldByName(foreignKey.AssociationDBName); ok { - foreignFieldNames = append(foreignFieldNames, field.Name) - } - } - - foreignFieldValues := scope.getColumnAsArray(foreignFieldNames, scope.Value) - - var condString string - if len(foreignFieldValues) > 0 { - var quotedForeignDBNames []string - for _, dbName := range foreignDBNames { - quotedForeignDBNames = append(quotedForeignDBNames, tableName+"."+dbName) - } - - condString = fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, quotedForeignDBNames), toQueryMarks(foreignFieldValues)) - - keys := scope.getColumnAsArray(foreignFieldNames, scope.Value) - values = append(values, toQueryValues(keys)) - } else { - condString = fmt.Sprintf("1 <> 1") - } - - return db.Joins(fmt.Sprintf("INNER JOIN %v ON %v", quotedTableName, strings.Join(joinConditions, " AND "))). - Where(condString, toQueryValues(foreignFieldValues)...) - } - - db.Error = errors.New("wrong source type for join table handler") - return db -} diff --git a/vendor/github.com/jinzhu/gorm/logger.go b/vendor/github.com/jinzhu/gorm/logger.go deleted file mode 100644 index 88e167d..0000000 --- a/vendor/github.com/jinzhu/gorm/logger.go +++ /dev/null @@ -1,141 +0,0 @@ -package gorm - -import ( - "database/sql/driver" - "fmt" - "log" - "os" - "reflect" - "regexp" - "strconv" - "time" - "unicode" -) - -var ( - defaultLogger = Logger{log.New(os.Stdout, "\r\n", 0)} - sqlRegexp = regexp.MustCompile(`\?`) - numericPlaceHolderRegexp = regexp.MustCompile(`\$\d+`) -) - -func isPrintable(s string) bool { - for _, r := range s { - if !unicode.IsPrint(r) { - return false - } - } - return true -} - -var LogFormatter = func(values ...interface{}) (messages []interface{}) { - if len(values) > 1 { - var ( - sql string - formattedValues []string - level = values[0] - currentTime = "\n\033[33m[" + NowFunc().Format("2006-01-02 15:04:05") + "]\033[0m" - source = fmt.Sprintf("\033[35m(%v)\033[0m", values[1]) - ) - - messages = []interface{}{source, currentTime} - - if len(values) == 2 { - //remove the line break - currentTime = currentTime[1:] - //remove the brackets - source = fmt.Sprintf("\033[35m%v\033[0m", values[1]) - - messages = []interface{}{currentTime, source} - } - - if level == "sql" { - // duration - messages = append(messages, fmt.Sprintf(" \033[36;1m[%.2fms]\033[0m ", float64(values[2].(time.Duration).Nanoseconds()/1e4)/100.0)) - // sql - - for _, value := range values[4].([]interface{}) { - indirectValue := reflect.Indirect(reflect.ValueOf(value)) - if indirectValue.IsValid() { - value = indirectValue.Interface() - if t, ok := value.(time.Time); ok { - if t.IsZero() { - formattedValues = append(formattedValues, fmt.Sprintf("'%v'", "0000-00-00 00:00:00")) - } else { - formattedValues = append(formattedValues, fmt.Sprintf("'%v'", t.Format("2006-01-02 15:04:05"))) - } - } else if b, ok := value.([]byte); ok { - if str := string(b); isPrintable(str) { - formattedValues = append(formattedValues, fmt.Sprintf("'%v'", str)) - } else { - formattedValues = append(formattedValues, "''") - } - } else if r, ok := value.(driver.Valuer); ok { - if value, err := r.Value(); err == nil && value != nil { - formattedValues = append(formattedValues, fmt.Sprintf("'%v'", value)) - } else { - formattedValues = append(formattedValues, "NULL") - } - } else { - switch value.(type) { - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, bool: - formattedValues = append(formattedValues, fmt.Sprintf("%v", value)) - default: - formattedValues = append(formattedValues, fmt.Sprintf("'%v'", value)) - } - } - } else { - formattedValues = append(formattedValues, "NULL") - } - } - - // differentiate between $n placeholders or else treat like ? - if numericPlaceHolderRegexp.MatchString(values[3].(string)) { - sql = values[3].(string) - for index, value := range formattedValues { - placeholder := fmt.Sprintf(`\$%d([^\d]|$)`, index+1) - sql = regexp.MustCompile(placeholder).ReplaceAllString(sql, value+"$1") - } - } else { - formattedValuesLength := len(formattedValues) - for index, value := range sqlRegexp.Split(values[3].(string), -1) { - sql += value - if index < formattedValuesLength { - sql += formattedValues[index] - } - } - } - - messages = append(messages, sql) - messages = append(messages, fmt.Sprintf(" \n\033[36;31m[%v]\033[0m ", strconv.FormatInt(values[5].(int64), 10)+" rows affected or returned ")) - } else { - messages = append(messages, "\033[31;1m") - messages = append(messages, values[2:]...) - messages = append(messages, "\033[0m") - } - } - - return -} - -type logger interface { - Print(v ...interface{}) -} - -// LogWriter log writer interface -type LogWriter interface { - Println(v ...interface{}) -} - -// Logger default logger -type Logger struct { - LogWriter -} - -// Print format & print log -func (logger Logger) Print(values ...interface{}) { - logger.Println(LogFormatter(values...)...) -} - -type nopLogger struct{} - -func (nopLogger) Print(values ...interface{}) {} diff --git a/vendor/github.com/jinzhu/gorm/main.go b/vendor/github.com/jinzhu/gorm/main.go deleted file mode 100644 index 3db8787..0000000 --- a/vendor/github.com/jinzhu/gorm/main.go +++ /dev/null @@ -1,881 +0,0 @@ -package gorm - -import ( - "context" - "database/sql" - "errors" - "fmt" - "reflect" - "strings" - "sync" - "time" -) - -// DB contains information for current db connection -type DB struct { - sync.RWMutex - Value interface{} - Error error - RowsAffected int64 - - // single db - db SQLCommon - blockGlobalUpdate bool - logMode logModeValue - logger logger - search *search - values sync.Map - - // global db - parent *DB - callbacks *Callback - dialect Dialect - singularTable bool - - // function to be used to override the creating of a new timestamp - nowFuncOverride func() time.Time -} - -type logModeValue int - -const ( - defaultLogMode logModeValue = iota - noLogMode - detailedLogMode -) - -// Open initialize a new db connection, need to import driver first, e.g: -// -// import _ "github.com/go-sql-driver/mysql" -// func main() { -// db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local") -// } -// GORM has wrapped some drivers, for easier to remember driver's import path, so you could import the mysql driver with -// import _ "github.com/jinzhu/gorm/dialects/mysql" -// // import _ "github.com/jinzhu/gorm/dialects/postgres" -// // import _ "github.com/jinzhu/gorm/dialects/sqlite" -// // import _ "github.com/jinzhu/gorm/dialects/mssql" -func Open(dialect string, args ...interface{}) (db *DB, err error) { - if len(args) == 0 { - err = errors.New("invalid database source") - return nil, err - } - var source string - var dbSQL SQLCommon - var ownDbSQL bool - - switch value := args[0].(type) { - case string: - var driver = dialect - if len(args) == 1 { - source = value - } else if len(args) >= 2 { - driver = value - source = args[1].(string) - } - dbSQL, err = sql.Open(driver, source) - ownDbSQL = true - case SQLCommon: - dbSQL = value - ownDbSQL = false - default: - return nil, fmt.Errorf("invalid database source: %v is not a valid type", value) - } - - db = &DB{ - db: dbSQL, - logger: defaultLogger, - callbacks: DefaultCallback, - dialect: newDialect(dialect, dbSQL), - } - db.parent = db - if err != nil { - return - } - // Send a ping to make sure the database connection is alive. - if d, ok := dbSQL.(*sql.DB); ok { - if err = d.Ping(); err != nil && ownDbSQL { - d.Close() - } - } - return -} - -// New clone a new db connection without search conditions -func (s *DB) New() *DB { - clone := s.clone() - clone.search = nil - clone.Value = nil - return clone -} - -type closer interface { - Close() error -} - -// Close close current db connection. If database connection is not an io.Closer, returns an error. -func (s *DB) Close() error { - if db, ok := s.parent.db.(closer); ok { - return db.Close() - } - return errors.New("can't close current db") -} - -// DB get `*sql.DB` from current connection -// If the underlying database connection is not a *sql.DB, returns nil -func (s *DB) DB() *sql.DB { - db, ok := s.db.(*sql.DB) - if !ok { - panic("can't support full GORM on currently status, maybe this is a TX instance.") - } - return db -} - -// CommonDB return the underlying `*sql.DB` or `*sql.Tx` instance, mainly intended to allow coexistence with legacy non-GORM code. -func (s *DB) CommonDB() SQLCommon { - return s.db -} - -// Dialect get dialect -func (s *DB) Dialect() Dialect { - return s.dialect -} - -// Callback return `Callbacks` container, you could add/change/delete callbacks with it -// db.Callback().Create().Register("update_created_at", updateCreated) -// Refer https://jinzhu.github.io/gorm/development.html#callbacks -func (s *DB) Callback() *Callback { - s.parent.callbacks = s.parent.callbacks.clone(s.logger) - return s.parent.callbacks -} - -// SetLogger replace default logger -func (s *DB) SetLogger(log logger) { - s.logger = log -} - -// LogMode set log mode, `true` for detailed logs, `false` for no log, default, will only print error logs -func (s *DB) LogMode(enable bool) *DB { - if enable { - s.logMode = detailedLogMode - } else { - s.logMode = noLogMode - } - return s -} - -// SetNowFuncOverride set the function to be used when creating a new timestamp -func (s *DB) SetNowFuncOverride(nowFuncOverride func() time.Time) *DB { - s.nowFuncOverride = nowFuncOverride - return s -} - -// Get a new timestamp, using the provided nowFuncOverride on the DB instance if set, -// otherwise defaults to the global NowFunc() -func (s *DB) nowFunc() time.Time { - if s.nowFuncOverride != nil { - return s.nowFuncOverride() - } - - return NowFunc() -} - -// BlockGlobalUpdate if true, generates an error on update/delete without where clause. -// This is to prevent eventual error with empty objects updates/deletions -func (s *DB) BlockGlobalUpdate(enable bool) *DB { - s.blockGlobalUpdate = enable - return s -} - -// HasBlockGlobalUpdate return state of block -func (s *DB) HasBlockGlobalUpdate() bool { - return s.blockGlobalUpdate -} - -// SingularTable use singular table by default -func (s *DB) SingularTable(enable bool) { - s.parent.Lock() - defer s.parent.Unlock() - s.parent.singularTable = enable -} - -// NewScope create a scope for current operation -func (s *DB) NewScope(value interface{}) *Scope { - dbClone := s.clone() - dbClone.Value = value - scope := &Scope{db: dbClone, Value: value} - if s.search != nil { - scope.Search = s.search.clone() - } else { - scope.Search = &search{} - } - return scope -} - -// QueryExpr returns the query as SqlExpr object -func (s *DB) QueryExpr() *SqlExpr { - scope := s.NewScope(s.Value) - scope.InstanceSet("skip_bindvar", true) - scope.prepareQuerySQL() - - return Expr(scope.SQL, scope.SQLVars...) -} - -// SubQuery returns the query as sub query -func (s *DB) SubQuery() *SqlExpr { - scope := s.NewScope(s.Value) - scope.InstanceSet("skip_bindvar", true) - scope.prepareQuerySQL() - - return Expr(fmt.Sprintf("(%v)", scope.SQL), scope.SQLVars...) -} - -// Where return a new relation, filter records with given conditions, accepts `map`, `struct` or `string` as conditions, refer http://jinzhu.github.io/gorm/crud.html#query -func (s *DB) Where(query interface{}, args ...interface{}) *DB { - return s.clone().search.Where(query, args...).db -} - -// Or filter records that match before conditions or this one, similar to `Where` -func (s *DB) Or(query interface{}, args ...interface{}) *DB { - return s.clone().search.Or(query, args...).db -} - -// Not filter records that don't match current conditions, similar to `Where` -func (s *DB) Not(query interface{}, args ...interface{}) *DB { - return s.clone().search.Not(query, args...).db -} - -// Limit specify the number of records to be retrieved -func (s *DB) Limit(limit interface{}) *DB { - return s.clone().search.Limit(limit).db -} - -// Offset specify the number of records to skip before starting to return the records -func (s *DB) Offset(offset interface{}) *DB { - return s.clone().search.Offset(offset).db -} - -// Order specify order when retrieve records from database, set reorder to `true` to overwrite defined conditions -// db.Order("name DESC") -// db.Order("name DESC", true) // reorder -// db.Order(gorm.Expr("name = ? DESC", "first")) // sql expression -func (s *DB) Order(value interface{}, reorder ...bool) *DB { - return s.clone().search.Order(value, reorder...).db -} - -// Select specify fields that you want to retrieve from database when querying, by default, will select all fields; -// When creating/updating, specify fields that you want to save to database -func (s *DB) Select(query interface{}, args ...interface{}) *DB { - return s.clone().search.Select(query, args...).db -} - -// Omit specify fields that you want to ignore when saving to database for creating, updating -func (s *DB) Omit(columns ...string) *DB { - return s.clone().search.Omit(columns...).db -} - -// Group specify the group method on the find -func (s *DB) Group(query string) *DB { - return s.clone().search.Group(query).db -} - -// Having specify HAVING conditions for GROUP BY -func (s *DB) Having(query interface{}, values ...interface{}) *DB { - return s.clone().search.Having(query, values...).db -} - -// Joins specify Joins conditions -// db.Joins("JOIN emails ON emails.user_id = users.id AND emails.email = ?", "jinzhu@example.org").Find(&user) -func (s *DB) Joins(query string, args ...interface{}) *DB { - return s.clone().search.Joins(query, args...).db -} - -// Scopes pass current database connection to arguments `func(*DB) *DB`, which could be used to add conditions dynamically -// func AmountGreaterThan1000(db *gorm.DB) *gorm.DB { -// return db.Where("amount > ?", 1000) -// } -// -// func OrderStatus(status []string) func (db *gorm.DB) *gorm.DB { -// return func (db *gorm.DB) *gorm.DB { -// return db.Scopes(AmountGreaterThan1000).Where("status in (?)", status) -// } -// } -// -// db.Scopes(AmountGreaterThan1000, OrderStatus([]string{"paid", "shipped"})).Find(&orders) -// Refer https://jinzhu.github.io/gorm/crud.html#scopes -func (s *DB) Scopes(funcs ...func(*DB) *DB) *DB { - for _, f := range funcs { - s = f(s) - } - return s -} - -// Unscoped return all record including deleted record, refer Soft Delete https://jinzhu.github.io/gorm/crud.html#soft-delete -func (s *DB) Unscoped() *DB { - return s.clone().search.unscoped().db -} - -// Attrs initialize struct with argument if record not found with `FirstOrInit` https://jinzhu.github.io/gorm/crud.html#firstorinit or `FirstOrCreate` https://jinzhu.github.io/gorm/crud.html#firstorcreate -func (s *DB) Attrs(attrs ...interface{}) *DB { - return s.clone().search.Attrs(attrs...).db -} - -// Assign assign result with argument regardless it is found or not with `FirstOrInit` https://jinzhu.github.io/gorm/crud.html#firstorinit or `FirstOrCreate` https://jinzhu.github.io/gorm/crud.html#firstorcreate -func (s *DB) Assign(attrs ...interface{}) *DB { - return s.clone().search.Assign(attrs...).db -} - -// First find first record that match given conditions, order by primary key -func (s *DB) First(out interface{}, where ...interface{}) *DB { - newScope := s.NewScope(out) - newScope.Search.Limit(1) - - return newScope.Set("gorm:order_by_primary_key", "ASC"). - inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db -} - -// Take return a record that match given conditions, the order will depend on the database implementation -func (s *DB) Take(out interface{}, where ...interface{}) *DB { - newScope := s.NewScope(out) - newScope.Search.Limit(1) - return newScope.inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db -} - -// Last find last record that match given conditions, order by primary key -func (s *DB) Last(out interface{}, where ...interface{}) *DB { - newScope := s.NewScope(out) - newScope.Search.Limit(1) - return newScope.Set("gorm:order_by_primary_key", "DESC"). - inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db -} - -// Find find records that match given conditions -func (s *DB) Find(out interface{}, where ...interface{}) *DB { - return s.NewScope(out).inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db -} - -//Preloads preloads relations, don`t touch out -func (s *DB) Preloads(out interface{}) *DB { - return s.NewScope(out).InstanceSet("gorm:only_preload", 1).callCallbacks(s.parent.callbacks.queries).db -} - -// Scan scan value to a struct -func (s *DB) Scan(dest interface{}) *DB { - return s.NewScope(s.Value).Set("gorm:query_destination", dest).callCallbacks(s.parent.callbacks.queries).db -} - -// Row return `*sql.Row` with given conditions -func (s *DB) Row() *sql.Row { - return s.NewScope(s.Value).row() -} - -// Rows return `*sql.Rows` with given conditions -func (s *DB) Rows() (*sql.Rows, error) { - return s.NewScope(s.Value).rows() -} - -// ScanRows scan `*sql.Rows` to give struct -func (s *DB) ScanRows(rows *sql.Rows, result interface{}) error { - var ( - scope = s.NewScope(result) - clone = scope.db - columns, err = rows.Columns() - ) - - if clone.AddError(err) == nil { - scope.scan(rows, columns, scope.Fields()) - } - - return clone.Error -} - -// Pluck used to query single column from a model as a map -// var ages []int64 -// db.Find(&users).Pluck("age", &ages) -func (s *DB) Pluck(column string, value interface{}) *DB { - return s.NewScope(s.Value).pluck(column, value).db -} - -// Count get how many records for a model -func (s *DB) Count(value interface{}) *DB { - return s.NewScope(s.Value).count(value).db -} - -// Related get related associations -func (s *DB) Related(value interface{}, foreignKeys ...string) *DB { - return s.NewScope(s.Value).related(value, foreignKeys...).db -} - -// FirstOrInit find first matched record or initialize a new one with given conditions (only works with struct, map conditions) -// https://jinzhu.github.io/gorm/crud.html#firstorinit -func (s *DB) FirstOrInit(out interface{}, where ...interface{}) *DB { - c := s.clone() - if result := c.First(out, where...); result.Error != nil { - if !result.RecordNotFound() { - return result - } - c.NewScope(out).inlineCondition(where...).initialize() - } else { - c.NewScope(out).updatedAttrsWithValues(c.search.assignAttrs) - } - return c -} - -// FirstOrCreate find first matched record or create a new one with given conditions (only works with struct, map conditions) -// https://jinzhu.github.io/gorm/crud.html#firstorcreate -func (s *DB) FirstOrCreate(out interface{}, where ...interface{}) *DB { - c := s.clone() - if result := s.First(out, where...); result.Error != nil { - if !result.RecordNotFound() { - return result - } - return c.NewScope(out).inlineCondition(where...).initialize().callCallbacks(c.parent.callbacks.creates).db - } else if len(c.search.assignAttrs) > 0 { - return c.NewScope(out).InstanceSet("gorm:update_interface", c.search.assignAttrs).callCallbacks(c.parent.callbacks.updates).db - } - return c -} - -// Update update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update -// WARNING when update with struct, GORM will not update fields that with zero value -func (s *DB) Update(attrs ...interface{}) *DB { - return s.Updates(toSearchableMap(attrs...), true) -} - -// Updates update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update -func (s *DB) Updates(values interface{}, ignoreProtectedAttrs ...bool) *DB { - return s.NewScope(s.Value). - Set("gorm:ignore_protected_attrs", len(ignoreProtectedAttrs) > 0). - InstanceSet("gorm:update_interface", values). - callCallbacks(s.parent.callbacks.updates).db -} - -// UpdateColumn update attributes without callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update -func (s *DB) UpdateColumn(attrs ...interface{}) *DB { - return s.UpdateColumns(toSearchableMap(attrs...)) -} - -// UpdateColumns update attributes without callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update -func (s *DB) UpdateColumns(values interface{}) *DB { - return s.NewScope(s.Value). - Set("gorm:update_column", true). - Set("gorm:save_associations", false). - InstanceSet("gorm:update_interface", values). - callCallbacks(s.parent.callbacks.updates).db -} - -// Save update value in database, if the value doesn't have primary key, will insert it -func (s *DB) Save(value interface{}) *DB { - scope := s.NewScope(value) - if !scope.PrimaryKeyZero() { - newDB := scope.callCallbacks(s.parent.callbacks.updates).db - if newDB.Error == nil && newDB.RowsAffected == 0 { - return s.New().Table(scope.TableName()).FirstOrCreate(value) - } - return newDB - } - return scope.callCallbacks(s.parent.callbacks.creates).db -} - -// Create insert the value into database -func (s *DB) Create(value interface{}) *DB { - scope := s.NewScope(value) - return scope.callCallbacks(s.parent.callbacks.creates).db -} - -// Delete delete value match given conditions, if the value has primary key, then will including the primary key as condition -// WARNING If model has DeletedAt field, GORM will only set field DeletedAt's value to current time -func (s *DB) Delete(value interface{}, where ...interface{}) *DB { - return s.NewScope(value).inlineCondition(where...).callCallbacks(s.parent.callbacks.deletes).db -} - -// Raw use raw sql as conditions, won't run it unless invoked by other methods -// db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result) -func (s *DB) Raw(sql string, values ...interface{}) *DB { - return s.clone().search.Raw(true).Where(sql, values...).db -} - -// Exec execute raw sql -func (s *DB) Exec(sql string, values ...interface{}) *DB { - scope := s.NewScope(nil) - generatedSQL := scope.buildCondition(map[string]interface{}{"query": sql, "args": values}, true) - generatedSQL = strings.TrimSuffix(strings.TrimPrefix(generatedSQL, "("), ")") - scope.Raw(generatedSQL) - return scope.Exec().db -} - -// Model specify the model you would like to run db operations -// // update all users's name to `hello` -// db.Model(&User{}).Update("name", "hello") -// // if user's primary key is non-blank, will use it as condition, then will only update the user's name to `hello` -// db.Model(&user).Update("name", "hello") -func (s *DB) Model(value interface{}) *DB { - c := s.clone() - c.Value = value - return c -} - -// Table specify the table you would like to run db operations -func (s *DB) Table(name string) *DB { - clone := s.clone() - clone.search.Table(name) - clone.Value = nil - return clone -} - -// Debug start debug mode -func (s *DB) Debug() *DB { - return s.clone().LogMode(true) -} - -// Transaction start a transaction as a block, -// return error will rollback, otherwise to commit. -func (s *DB) Transaction(fc func(tx *DB) error) (err error) { - panicked := true - tx := s.Begin() - defer func() { - // Make sure to rollback when panic, Block error or Commit error - if panicked || err != nil { - tx.Rollback() - } - }() - - err = fc(tx) - - if err == nil { - err = tx.Commit().Error - } - - panicked = false - return -} - -// Begin begins a transaction -func (s *DB) Begin() *DB { - return s.BeginTx(context.Background(), &sql.TxOptions{}) -} - -// BeginTx begins a transaction with options -func (s *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) *DB { - c := s.clone() - if db, ok := c.db.(sqlDb); ok && db != nil { - tx, err := db.BeginTx(ctx, opts) - c.db = interface{}(tx).(SQLCommon) - - c.dialect.SetDB(c.db) - c.AddError(err) - } else { - c.AddError(ErrCantStartTransaction) - } - return c -} - -// Commit commit a transaction -func (s *DB) Commit() *DB { - var emptySQLTx *sql.Tx - if db, ok := s.db.(sqlTx); ok && db != nil && db != emptySQLTx { - s.AddError(db.Commit()) - } else { - s.AddError(ErrInvalidTransaction) - } - return s -} - -// Rollback rollback a transaction -func (s *DB) Rollback() *DB { - var emptySQLTx *sql.Tx - if db, ok := s.db.(sqlTx); ok && db != nil && db != emptySQLTx { - if err := db.Rollback(); err != nil && err != sql.ErrTxDone { - s.AddError(err) - } - } else { - s.AddError(ErrInvalidTransaction) - } - return s -} - -// RollbackUnlessCommitted rollback a transaction if it has not yet been -// committed. -func (s *DB) RollbackUnlessCommitted() *DB { - var emptySQLTx *sql.Tx - if db, ok := s.db.(sqlTx); ok && db != nil && db != emptySQLTx { - err := db.Rollback() - // Ignore the error indicating that the transaction has already - // been committed. - if err != sql.ErrTxDone { - s.AddError(err) - } - } else { - s.AddError(ErrInvalidTransaction) - } - return s -} - -// NewRecord check if value's primary key is blank -func (s *DB) NewRecord(value interface{}) bool { - return s.NewScope(value).PrimaryKeyZero() -} - -// RecordNotFound check if returning ErrRecordNotFound error -func (s *DB) RecordNotFound() bool { - for _, err := range s.GetErrors() { - if err == ErrRecordNotFound { - return true - } - } - return false -} - -// CreateTable create table for models -func (s *DB) CreateTable(models ...interface{}) *DB { - db := s.Unscoped() - for _, model := range models { - db = db.NewScope(model).createTable().db - } - return db -} - -// DropTable drop table for models -func (s *DB) DropTable(values ...interface{}) *DB { - db := s.clone() - for _, value := range values { - if tableName, ok := value.(string); ok { - db = db.Table(tableName) - } - - db = db.NewScope(value).dropTable().db - } - return db -} - -// DropTableIfExists drop table if it is exist -func (s *DB) DropTableIfExists(values ...interface{}) *DB { - db := s.clone() - for _, value := range values { - if s.HasTable(value) { - db.AddError(s.DropTable(value).Error) - } - } - return db -} - -// HasTable check has table or not -func (s *DB) HasTable(value interface{}) bool { - var ( - scope = s.NewScope(value) - tableName string - ) - - if name, ok := value.(string); ok { - tableName = name - } else { - tableName = scope.TableName() - } - - has := scope.Dialect().HasTable(tableName) - s.AddError(scope.db.Error) - return has -} - -// AutoMigrate run auto migration for given models, will only add missing fields, won't delete/change current data -func (s *DB) AutoMigrate(values ...interface{}) *DB { - db := s.Unscoped() - for _, value := range values { - db = db.NewScope(value).autoMigrate().db - } - return db -} - -// ModifyColumn modify column to type -func (s *DB) ModifyColumn(column string, typ string) *DB { - scope := s.NewScope(s.Value) - scope.modifyColumn(column, typ) - return scope.db -} - -// DropColumn drop a column -func (s *DB) DropColumn(column string) *DB { - scope := s.NewScope(s.Value) - scope.dropColumn(column) - return scope.db -} - -// AddIndex add index for columns with given name -func (s *DB) AddIndex(indexName string, columns ...string) *DB { - scope := s.Unscoped().NewScope(s.Value) - scope.addIndex(false, indexName, columns...) - return scope.db -} - -// AddUniqueIndex add unique index for columns with given name -func (s *DB) AddUniqueIndex(indexName string, columns ...string) *DB { - scope := s.Unscoped().NewScope(s.Value) - scope.addIndex(true, indexName, columns...) - return scope.db -} - -// RemoveIndex remove index with name -func (s *DB) RemoveIndex(indexName string) *DB { - scope := s.NewScope(s.Value) - scope.removeIndex(indexName) - return scope.db -} - -// AddForeignKey Add foreign key to the given scope, e.g: -// db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT") -func (s *DB) AddForeignKey(field string, dest string, onDelete string, onUpdate string) *DB { - scope := s.NewScope(s.Value) - scope.addForeignKey(field, dest, onDelete, onUpdate) - return scope.db -} - -// RemoveForeignKey Remove foreign key from the given scope, e.g: -// db.Model(&User{}).RemoveForeignKey("city_id", "cities(id)") -func (s *DB) RemoveForeignKey(field string, dest string) *DB { - scope := s.clone().NewScope(s.Value) - scope.removeForeignKey(field, dest) - return scope.db -} - -// Association start `Association Mode` to handler relations things easir in that mode, refer: https://jinzhu.github.io/gorm/associations.html#association-mode -func (s *DB) Association(column string) *Association { - var err error - var scope = s.Set("gorm:association:source", s.Value).NewScope(s.Value) - - if primaryField := scope.PrimaryField(); primaryField.IsBlank { - err = errors.New("primary key can't be nil") - } else { - if field, ok := scope.FieldByName(column); ok { - if field.Relationship == nil || len(field.Relationship.ForeignFieldNames) == 0 { - err = fmt.Errorf("invalid association %v for %v", column, scope.IndirectValue().Type()) - } else { - return &Association{scope: scope, column: column, field: field} - } - } else { - err = fmt.Errorf("%v doesn't have column %v", scope.IndirectValue().Type(), column) - } - } - - return &Association{Error: err} -} - -// Preload preload associations with given conditions -// db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users) -func (s *DB) Preload(column string, conditions ...interface{}) *DB { - return s.clone().search.Preload(column, conditions...).db -} - -// Set set setting by name, which could be used in callbacks, will clone a new db, and update its setting -func (s *DB) Set(name string, value interface{}) *DB { - return s.clone().InstantSet(name, value) -} - -// InstantSet instant set setting, will affect current db -func (s *DB) InstantSet(name string, value interface{}) *DB { - s.values.Store(name, value) - return s -} - -// Get get setting by name -func (s *DB) Get(name string) (value interface{}, ok bool) { - value, ok = s.values.Load(name) - return -} - -// SetJoinTableHandler set a model's join table handler for a relation -func (s *DB) SetJoinTableHandler(source interface{}, column string, handler JoinTableHandlerInterface) { - scope := s.NewScope(source) - for _, field := range scope.GetModelStruct().StructFields { - if field.Name == column || field.DBName == column { - if many2many, _ := field.TagSettingsGet("MANY2MANY"); many2many != "" { - source := (&Scope{Value: source}).GetModelStruct().ModelType - destination := (&Scope{Value: reflect.New(field.Struct.Type).Interface()}).GetModelStruct().ModelType - handler.Setup(field.Relationship, many2many, source, destination) - field.Relationship.JoinTableHandler = handler - if table := handler.Table(s); scope.Dialect().HasTable(table) { - s.Table(table).AutoMigrate(handler) - } - } - } - } -} - -// AddError add error to the db -func (s *DB) AddError(err error) error { - if err != nil { - if err != ErrRecordNotFound { - if s.logMode == defaultLogMode { - go s.print("error", fileWithLineNum(), err) - } else { - s.log(err) - } - - errors := Errors(s.GetErrors()) - errors = errors.Add(err) - if len(errors) > 1 { - err = errors - } - } - - s.Error = err - } - return err -} - -// GetErrors get happened errors from the db -func (s *DB) GetErrors() []error { - if errs, ok := s.Error.(Errors); ok { - return errs - } else if s.Error != nil { - return []error{s.Error} - } - return []error{} -} - -//////////////////////////////////////////////////////////////////////////////// -// Private Methods For DB -//////////////////////////////////////////////////////////////////////////////// - -func (s *DB) clone() *DB { - db := &DB{ - db: s.db, - parent: s.parent, - logger: s.logger, - logMode: s.logMode, - Value: s.Value, - Error: s.Error, - blockGlobalUpdate: s.blockGlobalUpdate, - dialect: newDialect(s.dialect.GetName(), s.db), - nowFuncOverride: s.nowFuncOverride, - } - - s.values.Range(func(k, v interface{}) bool { - db.values.Store(k, v) - return true - }) - - if s.search == nil { - db.search = &search{limit: -1, offset: -1} - } else { - db.search = s.search.clone() - } - - db.search.db = db - return db -} - -func (s *DB) print(v ...interface{}) { - s.logger.Print(v...) -} - -func (s *DB) log(v ...interface{}) { - if s != nil && s.logMode == detailedLogMode { - s.print(append([]interface{}{"log", fileWithLineNum()}, v...)...) - } -} - -func (s *DB) slog(sql string, t time.Time, vars ...interface{}) { - if s.logMode == detailedLogMode { - s.print("sql", fileWithLineNum(), NowFunc().Sub(t), sql, vars, s.RowsAffected) - } -} diff --git a/vendor/github.com/jinzhu/gorm/model.go b/vendor/github.com/jinzhu/gorm/model.go deleted file mode 100644 index f37ff7e..0000000 --- a/vendor/github.com/jinzhu/gorm/model.go +++ /dev/null @@ -1,14 +0,0 @@ -package gorm - -import "time" - -// Model base model definition, including fields `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`, which could be embedded in your models -// type User struct { -// gorm.Model -// } -type Model struct { - ID uint `gorm:"primary_key"` - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt *time.Time `sql:"index"` -} diff --git a/vendor/github.com/jinzhu/gorm/model_struct.go b/vendor/github.com/jinzhu/gorm/model_struct.go deleted file mode 100644 index d9e2e90..0000000 --- a/vendor/github.com/jinzhu/gorm/model_struct.go +++ /dev/null @@ -1,671 +0,0 @@ -package gorm - -import ( - "database/sql" - "errors" - "go/ast" - "reflect" - "strings" - "sync" - "time" - - "github.com/jinzhu/inflection" -) - -// DefaultTableNameHandler default table name handler -var DefaultTableNameHandler = func(db *DB, defaultTableName string) string { - return defaultTableName -} - -// lock for mutating global cached model metadata -var structsLock sync.Mutex - -// global cache of model metadata -var modelStructsMap sync.Map - -// ModelStruct model definition -type ModelStruct struct { - PrimaryFields []*StructField - StructFields []*StructField - ModelType reflect.Type - - defaultTableName string - l sync.Mutex -} - -// TableName returns model's table name -func (s *ModelStruct) TableName(db *DB) string { - s.l.Lock() - defer s.l.Unlock() - - if s.defaultTableName == "" && db != nil && s.ModelType != nil { - // Set default table name - if tabler, ok := reflect.New(s.ModelType).Interface().(tabler); ok { - s.defaultTableName = tabler.TableName() - } else { - tableName := ToTableName(s.ModelType.Name()) - db.parent.RLock() - if db == nil || (db.parent != nil && !db.parent.singularTable) { - tableName = inflection.Plural(tableName) - } - db.parent.RUnlock() - s.defaultTableName = tableName - } - } - - return DefaultTableNameHandler(db, s.defaultTableName) -} - -// StructField model field's struct definition -type StructField struct { - DBName string - Name string - Names []string - IsPrimaryKey bool - IsNormal bool - IsIgnored bool - IsScanner bool - HasDefaultValue bool - Tag reflect.StructTag - TagSettings map[string]string - Struct reflect.StructField - IsForeignKey bool - Relationship *Relationship - - tagSettingsLock sync.RWMutex -} - -// TagSettingsSet Sets a tag in the tag settings map -func (sf *StructField) TagSettingsSet(key, val string) { - sf.tagSettingsLock.Lock() - defer sf.tagSettingsLock.Unlock() - sf.TagSettings[key] = val -} - -// TagSettingsGet returns a tag from the tag settings -func (sf *StructField) TagSettingsGet(key string) (string, bool) { - sf.tagSettingsLock.RLock() - defer sf.tagSettingsLock.RUnlock() - val, ok := sf.TagSettings[key] - return val, ok -} - -// TagSettingsDelete deletes a tag -func (sf *StructField) TagSettingsDelete(key string) { - sf.tagSettingsLock.Lock() - defer sf.tagSettingsLock.Unlock() - delete(sf.TagSettings, key) -} - -func (sf *StructField) clone() *StructField { - clone := &StructField{ - DBName: sf.DBName, - Name: sf.Name, - Names: sf.Names, - IsPrimaryKey: sf.IsPrimaryKey, - IsNormal: sf.IsNormal, - IsIgnored: sf.IsIgnored, - IsScanner: sf.IsScanner, - HasDefaultValue: sf.HasDefaultValue, - Tag: sf.Tag, - TagSettings: map[string]string{}, - Struct: sf.Struct, - IsForeignKey: sf.IsForeignKey, - } - - if sf.Relationship != nil { - relationship := *sf.Relationship - clone.Relationship = &relationship - } - - // copy the struct field tagSettings, they should be read-locked while they are copied - sf.tagSettingsLock.Lock() - defer sf.tagSettingsLock.Unlock() - for key, value := range sf.TagSettings { - clone.TagSettings[key] = value - } - - return clone -} - -// Relationship described the relationship between models -type Relationship struct { - Kind string - PolymorphicType string - PolymorphicDBName string - PolymorphicValue string - ForeignFieldNames []string - ForeignDBNames []string - AssociationForeignFieldNames []string - AssociationForeignDBNames []string - JoinTableHandler JoinTableHandlerInterface -} - -func getForeignField(column string, fields []*StructField) *StructField { - for _, field := range fields { - if field.Name == column || field.DBName == column || field.DBName == ToColumnName(column) { - return field - } - } - return nil -} - -// GetModelStruct get value's model struct, relationships based on struct and tag definition -func (scope *Scope) GetModelStruct() *ModelStruct { - var modelStruct ModelStruct - // Scope value can't be nil - if scope.Value == nil { - return &modelStruct - } - - reflectType := reflect.ValueOf(scope.Value).Type() - for reflectType.Kind() == reflect.Slice || reflectType.Kind() == reflect.Ptr { - reflectType = reflectType.Elem() - } - - // Scope value need to be a struct - if reflectType.Kind() != reflect.Struct { - return &modelStruct - } - - // Get Cached model struct - isSingularTable := false - if scope.db != nil && scope.db.parent != nil { - scope.db.parent.RLock() - isSingularTable = scope.db.parent.singularTable - scope.db.parent.RUnlock() - } - - hashKey := struct { - singularTable bool - reflectType reflect.Type - }{isSingularTable, reflectType} - if value, ok := modelStructsMap.Load(hashKey); ok && value != nil { - return value.(*ModelStruct) - } - - modelStruct.ModelType = reflectType - - // Get all fields - for i := 0; i < reflectType.NumField(); i++ { - if fieldStruct := reflectType.Field(i); ast.IsExported(fieldStruct.Name) { - field := &StructField{ - Struct: fieldStruct, - Name: fieldStruct.Name, - Names: []string{fieldStruct.Name}, - Tag: fieldStruct.Tag, - TagSettings: parseTagSetting(fieldStruct.Tag), - } - - // is ignored field - if _, ok := field.TagSettingsGet("-"); ok { - field.IsIgnored = true - } else { - if _, ok := field.TagSettingsGet("PRIMARY_KEY"); ok { - field.IsPrimaryKey = true - modelStruct.PrimaryFields = append(modelStruct.PrimaryFields, field) - } - - if _, ok := field.TagSettingsGet("DEFAULT"); ok && !field.IsPrimaryKey { - field.HasDefaultValue = true - } - - if _, ok := field.TagSettingsGet("AUTO_INCREMENT"); ok && !field.IsPrimaryKey { - field.HasDefaultValue = true - } - - indirectType := fieldStruct.Type - for indirectType.Kind() == reflect.Ptr { - indirectType = indirectType.Elem() - } - - fieldValue := reflect.New(indirectType).Interface() - if _, isScanner := fieldValue.(sql.Scanner); isScanner { - // is scanner - field.IsScanner, field.IsNormal = true, true - if indirectType.Kind() == reflect.Struct { - for i := 0; i < indirectType.NumField(); i++ { - for key, value := range parseTagSetting(indirectType.Field(i).Tag) { - if _, ok := field.TagSettingsGet(key); !ok { - field.TagSettingsSet(key, value) - } - } - } - } - } else if _, isTime := fieldValue.(*time.Time); isTime { - // is time - field.IsNormal = true - } else if _, ok := field.TagSettingsGet("EMBEDDED"); ok || fieldStruct.Anonymous { - // is embedded struct - for _, subField := range scope.New(fieldValue).GetModelStruct().StructFields { - subField = subField.clone() - subField.Names = append([]string{fieldStruct.Name}, subField.Names...) - if prefix, ok := field.TagSettingsGet("EMBEDDED_PREFIX"); ok { - subField.DBName = prefix + subField.DBName - } - - if subField.IsPrimaryKey { - if _, ok := subField.TagSettingsGet("PRIMARY_KEY"); ok { - modelStruct.PrimaryFields = append(modelStruct.PrimaryFields, subField) - } else { - subField.IsPrimaryKey = false - } - } - - if subField.Relationship != nil && subField.Relationship.JoinTableHandler != nil { - if joinTableHandler, ok := subField.Relationship.JoinTableHandler.(*JoinTableHandler); ok { - newJoinTableHandler := &JoinTableHandler{} - newJoinTableHandler.Setup(subField.Relationship, joinTableHandler.TableName, reflectType, joinTableHandler.Destination.ModelType) - subField.Relationship.JoinTableHandler = newJoinTableHandler - } - } - - modelStruct.StructFields = append(modelStruct.StructFields, subField) - } - continue - } else { - // build relationships - switch indirectType.Kind() { - case reflect.Slice: - defer func(field *StructField) { - var ( - relationship = &Relationship{} - toScope = scope.New(reflect.New(field.Struct.Type).Interface()) - foreignKeys []string - associationForeignKeys []string - elemType = field.Struct.Type - ) - - if foreignKey, _ := field.TagSettingsGet("FOREIGNKEY"); foreignKey != "" { - foreignKeys = strings.Split(foreignKey, ",") - } - - if foreignKey, _ := field.TagSettingsGet("ASSOCIATION_FOREIGNKEY"); foreignKey != "" { - associationForeignKeys = strings.Split(foreignKey, ",") - } else if foreignKey, _ := field.TagSettingsGet("ASSOCIATIONFOREIGNKEY"); foreignKey != "" { - associationForeignKeys = strings.Split(foreignKey, ",") - } - - for elemType.Kind() == reflect.Slice || elemType.Kind() == reflect.Ptr { - elemType = elemType.Elem() - } - - if elemType.Kind() == reflect.Struct { - if many2many, _ := field.TagSettingsGet("MANY2MANY"); many2many != "" { - relationship.Kind = "many_to_many" - - { // Foreign Keys for Source - joinTableDBNames := []string{} - - if foreignKey, _ := field.TagSettingsGet("JOINTABLE_FOREIGNKEY"); foreignKey != "" { - joinTableDBNames = strings.Split(foreignKey, ",") - } - - // if no foreign keys defined with tag - if len(foreignKeys) == 0 { - for _, field := range modelStruct.PrimaryFields { - foreignKeys = append(foreignKeys, field.DBName) - } - } - - for idx, foreignKey := range foreignKeys { - if foreignField := getForeignField(foreignKey, modelStruct.StructFields); foreignField != nil { - // source foreign keys (db names) - relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.DBName) - - // setup join table foreign keys for source - if len(joinTableDBNames) > idx { - // if defined join table's foreign key - relationship.ForeignDBNames = append(relationship.ForeignDBNames, joinTableDBNames[idx]) - } else { - defaultJointableForeignKey := ToColumnName(reflectType.Name()) + "_" + foreignField.DBName - relationship.ForeignDBNames = append(relationship.ForeignDBNames, defaultJointableForeignKey) - } - } - } - } - - { // Foreign Keys for Association (Destination) - associationJoinTableDBNames := []string{} - - if foreignKey, _ := field.TagSettingsGet("ASSOCIATION_JOINTABLE_FOREIGNKEY"); foreignKey != "" { - associationJoinTableDBNames = strings.Split(foreignKey, ",") - } - - // if no association foreign keys defined with tag - if len(associationForeignKeys) == 0 { - for _, field := range toScope.PrimaryFields() { - associationForeignKeys = append(associationForeignKeys, field.DBName) - } - } - - for idx, name := range associationForeignKeys { - if field, ok := toScope.FieldByName(name); ok { - // association foreign keys (db names) - relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, field.DBName) - - // setup join table foreign keys for association - if len(associationJoinTableDBNames) > idx { - relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, associationJoinTableDBNames[idx]) - } else { - // join table foreign keys for association - joinTableDBName := ToColumnName(elemType.Name()) + "_" + field.DBName - relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, joinTableDBName) - } - } - } - } - - joinTableHandler := JoinTableHandler{} - joinTableHandler.Setup(relationship, many2many, reflectType, elemType) - relationship.JoinTableHandler = &joinTableHandler - field.Relationship = relationship - } else { - // User has many comments, associationType is User, comment use UserID as foreign key - var associationType = reflectType.Name() - var toFields = toScope.GetStructFields() - relationship.Kind = "has_many" - - if polymorphic, _ := field.TagSettingsGet("POLYMORPHIC"); polymorphic != "" { - // Dog has many toys, tag polymorphic is Owner, then associationType is Owner - // Toy use OwnerID, OwnerType ('dogs') as foreign key - if polymorphicType := getForeignField(polymorphic+"Type", toFields); polymorphicType != nil { - associationType = polymorphic - relationship.PolymorphicType = polymorphicType.Name - relationship.PolymorphicDBName = polymorphicType.DBName - // if Dog has multiple set of toys set name of the set (instead of default 'dogs') - if value, ok := field.TagSettingsGet("POLYMORPHIC_VALUE"); ok { - relationship.PolymorphicValue = value - } else { - relationship.PolymorphicValue = scope.TableName() - } - polymorphicType.IsForeignKey = true - } - } - - // if no foreign keys defined with tag - if len(foreignKeys) == 0 { - // if no association foreign keys defined with tag - if len(associationForeignKeys) == 0 { - for _, field := range modelStruct.PrimaryFields { - foreignKeys = append(foreignKeys, associationType+field.Name) - associationForeignKeys = append(associationForeignKeys, field.Name) - } - } else { - // generate foreign keys from defined association foreign keys - for _, scopeFieldName := range associationForeignKeys { - if foreignField := getForeignField(scopeFieldName, modelStruct.StructFields); foreignField != nil { - foreignKeys = append(foreignKeys, associationType+foreignField.Name) - associationForeignKeys = append(associationForeignKeys, foreignField.Name) - } - } - } - } else { - // generate association foreign keys from foreign keys - if len(associationForeignKeys) == 0 { - for _, foreignKey := range foreignKeys { - if strings.HasPrefix(foreignKey, associationType) { - associationForeignKey := strings.TrimPrefix(foreignKey, associationType) - if foreignField := getForeignField(associationForeignKey, modelStruct.StructFields); foreignField != nil { - associationForeignKeys = append(associationForeignKeys, associationForeignKey) - } - } - } - if len(associationForeignKeys) == 0 && len(foreignKeys) == 1 { - associationForeignKeys = []string{scope.PrimaryKey()} - } - } else if len(foreignKeys) != len(associationForeignKeys) { - scope.Err(errors.New("invalid foreign keys, should have same length")) - return - } - } - - for idx, foreignKey := range foreignKeys { - if foreignField := getForeignField(foreignKey, toFields); foreignField != nil { - if associationField := getForeignField(associationForeignKeys[idx], modelStruct.StructFields); associationField != nil { - // mark field as foreignkey, use global lock to avoid race - structsLock.Lock() - foreignField.IsForeignKey = true - structsLock.Unlock() - - // association foreign keys - relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, associationField.Name) - relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, associationField.DBName) - - // association foreign keys - relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.Name) - relationship.ForeignDBNames = append(relationship.ForeignDBNames, foreignField.DBName) - } - } - } - - if len(relationship.ForeignFieldNames) != 0 { - field.Relationship = relationship - } - } - } else { - field.IsNormal = true - } - }(field) - case reflect.Struct: - defer func(field *StructField) { - var ( - // user has one profile, associationType is User, profile use UserID as foreign key - // user belongs to profile, associationType is Profile, user use ProfileID as foreign key - associationType = reflectType.Name() - relationship = &Relationship{} - toScope = scope.New(reflect.New(field.Struct.Type).Interface()) - toFields = toScope.GetStructFields() - tagForeignKeys []string - tagAssociationForeignKeys []string - ) - - if foreignKey, _ := field.TagSettingsGet("FOREIGNKEY"); foreignKey != "" { - tagForeignKeys = strings.Split(foreignKey, ",") - } - - if foreignKey, _ := field.TagSettingsGet("ASSOCIATION_FOREIGNKEY"); foreignKey != "" { - tagAssociationForeignKeys = strings.Split(foreignKey, ",") - } else if foreignKey, _ := field.TagSettingsGet("ASSOCIATIONFOREIGNKEY"); foreignKey != "" { - tagAssociationForeignKeys = strings.Split(foreignKey, ",") - } - - if polymorphic, _ := field.TagSettingsGet("POLYMORPHIC"); polymorphic != "" { - // Cat has one toy, tag polymorphic is Owner, then associationType is Owner - // Toy use OwnerID, OwnerType ('cats') as foreign key - if polymorphicType := getForeignField(polymorphic+"Type", toFields); polymorphicType != nil { - associationType = polymorphic - relationship.PolymorphicType = polymorphicType.Name - relationship.PolymorphicDBName = polymorphicType.DBName - // if Cat has several different types of toys set name for each (instead of default 'cats') - if value, ok := field.TagSettingsGet("POLYMORPHIC_VALUE"); ok { - relationship.PolymorphicValue = value - } else { - relationship.PolymorphicValue = scope.TableName() - } - polymorphicType.IsForeignKey = true - } - } - - // Has One - { - var foreignKeys = tagForeignKeys - var associationForeignKeys = tagAssociationForeignKeys - // if no foreign keys defined with tag - if len(foreignKeys) == 0 { - // if no association foreign keys defined with tag - if len(associationForeignKeys) == 0 { - for _, primaryField := range modelStruct.PrimaryFields { - foreignKeys = append(foreignKeys, associationType+primaryField.Name) - associationForeignKeys = append(associationForeignKeys, primaryField.Name) - } - } else { - // generate foreign keys form association foreign keys - for _, associationForeignKey := range tagAssociationForeignKeys { - if foreignField := getForeignField(associationForeignKey, modelStruct.StructFields); foreignField != nil { - foreignKeys = append(foreignKeys, associationType+foreignField.Name) - associationForeignKeys = append(associationForeignKeys, foreignField.Name) - } - } - } - } else { - // generate association foreign keys from foreign keys - if len(associationForeignKeys) == 0 { - for _, foreignKey := range foreignKeys { - if strings.HasPrefix(foreignKey, associationType) { - associationForeignKey := strings.TrimPrefix(foreignKey, associationType) - if foreignField := getForeignField(associationForeignKey, modelStruct.StructFields); foreignField != nil { - associationForeignKeys = append(associationForeignKeys, associationForeignKey) - } - } - } - if len(associationForeignKeys) == 0 && len(foreignKeys) == 1 { - associationForeignKeys = []string{scope.PrimaryKey()} - } - } else if len(foreignKeys) != len(associationForeignKeys) { - scope.Err(errors.New("invalid foreign keys, should have same length")) - return - } - } - - for idx, foreignKey := range foreignKeys { - if foreignField := getForeignField(foreignKey, toFields); foreignField != nil { - if scopeField := getForeignField(associationForeignKeys[idx], modelStruct.StructFields); scopeField != nil { - // mark field as foreignkey, use global lock to avoid race - structsLock.Lock() - foreignField.IsForeignKey = true - structsLock.Unlock() - - // association foreign keys - relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, scopeField.Name) - relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, scopeField.DBName) - - // association foreign keys - relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.Name) - relationship.ForeignDBNames = append(relationship.ForeignDBNames, foreignField.DBName) - } - } - } - } - - if len(relationship.ForeignFieldNames) != 0 { - relationship.Kind = "has_one" - field.Relationship = relationship - } else { - var foreignKeys = tagForeignKeys - var associationForeignKeys = tagAssociationForeignKeys - - if len(foreignKeys) == 0 { - // generate foreign keys & association foreign keys - if len(associationForeignKeys) == 0 { - for _, primaryField := range toScope.PrimaryFields() { - foreignKeys = append(foreignKeys, field.Name+primaryField.Name) - associationForeignKeys = append(associationForeignKeys, primaryField.Name) - } - } else { - // generate foreign keys with association foreign keys - for _, associationForeignKey := range associationForeignKeys { - if foreignField := getForeignField(associationForeignKey, toFields); foreignField != nil { - foreignKeys = append(foreignKeys, field.Name+foreignField.Name) - associationForeignKeys = append(associationForeignKeys, foreignField.Name) - } - } - } - } else { - // generate foreign keys & association foreign keys - if len(associationForeignKeys) == 0 { - for _, foreignKey := range foreignKeys { - if strings.HasPrefix(foreignKey, field.Name) { - associationForeignKey := strings.TrimPrefix(foreignKey, field.Name) - if foreignField := getForeignField(associationForeignKey, toFields); foreignField != nil { - associationForeignKeys = append(associationForeignKeys, associationForeignKey) - } - } - } - if len(associationForeignKeys) == 0 && len(foreignKeys) == 1 { - associationForeignKeys = []string{toScope.PrimaryKey()} - } - } else if len(foreignKeys) != len(associationForeignKeys) { - scope.Err(errors.New("invalid foreign keys, should have same length")) - return - } - } - - for idx, foreignKey := range foreignKeys { - if foreignField := getForeignField(foreignKey, modelStruct.StructFields); foreignField != nil { - if associationField := getForeignField(associationForeignKeys[idx], toFields); associationField != nil { - // mark field as foreignkey, use global lock to avoid race - structsLock.Lock() - foreignField.IsForeignKey = true - structsLock.Unlock() - - // association foreign keys - relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, associationField.Name) - relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, associationField.DBName) - - // source foreign keys - relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.Name) - relationship.ForeignDBNames = append(relationship.ForeignDBNames, foreignField.DBName) - } - } - } - - if len(relationship.ForeignFieldNames) != 0 { - relationship.Kind = "belongs_to" - field.Relationship = relationship - } - } - }(field) - default: - field.IsNormal = true - } - } - } - - // Even it is ignored, also possible to decode db value into the field - if value, ok := field.TagSettingsGet("COLUMN"); ok { - field.DBName = value - } else { - field.DBName = ToColumnName(fieldStruct.Name) - } - - modelStruct.StructFields = append(modelStruct.StructFields, field) - } - } - - if len(modelStruct.PrimaryFields) == 0 { - if field := getForeignField("id", modelStruct.StructFields); field != nil { - field.IsPrimaryKey = true - modelStruct.PrimaryFields = append(modelStruct.PrimaryFields, field) - } - } - - modelStructsMap.Store(hashKey, &modelStruct) - - return &modelStruct -} - -// GetStructFields get model's field structs -func (scope *Scope) GetStructFields() (fields []*StructField) { - return scope.GetModelStruct().StructFields -} - -func parseTagSetting(tags reflect.StructTag) map[string]string { - setting := map[string]string{} - for _, str := range []string{tags.Get("sql"), tags.Get("gorm")} { - if str == "" { - continue - } - tags := strings.Split(str, ";") - for _, value := range tags { - v := strings.Split(value, ":") - k := strings.TrimSpace(strings.ToUpper(v[0])) - if len(v) >= 2 { - setting[k] = strings.Join(v[1:], ":") - } else { - setting[k] = k - } - } - } - return setting -} diff --git a/vendor/github.com/jinzhu/gorm/naming.go b/vendor/github.com/jinzhu/gorm/naming.go deleted file mode 100644 index 6b0a4fd..0000000 --- a/vendor/github.com/jinzhu/gorm/naming.go +++ /dev/null @@ -1,124 +0,0 @@ -package gorm - -import ( - "bytes" - "strings" -) - -// Namer is a function type which is given a string and return a string -type Namer func(string) string - -// NamingStrategy represents naming strategies -type NamingStrategy struct { - DB Namer - Table Namer - Column Namer -} - -// TheNamingStrategy is being initialized with defaultNamingStrategy -var TheNamingStrategy = &NamingStrategy{ - DB: defaultNamer, - Table: defaultNamer, - Column: defaultNamer, -} - -// AddNamingStrategy sets the naming strategy -func AddNamingStrategy(ns *NamingStrategy) { - if ns.DB == nil { - ns.DB = defaultNamer - } - if ns.Table == nil { - ns.Table = defaultNamer - } - if ns.Column == nil { - ns.Column = defaultNamer - } - TheNamingStrategy = ns -} - -// DBName alters the given name by DB -func (ns *NamingStrategy) DBName(name string) string { - return ns.DB(name) -} - -// TableName alters the given name by Table -func (ns *NamingStrategy) TableName(name string) string { - return ns.Table(name) -} - -// ColumnName alters the given name by Column -func (ns *NamingStrategy) ColumnName(name string) string { - return ns.Column(name) -} - -// ToDBName convert string to db name -func ToDBName(name string) string { - return TheNamingStrategy.DBName(name) -} - -// ToTableName convert string to table name -func ToTableName(name string) string { - return TheNamingStrategy.TableName(name) -} - -// ToColumnName convert string to db name -func ToColumnName(name string) string { - return TheNamingStrategy.ColumnName(name) -} - -var smap = newSafeMap() - -func defaultNamer(name string) string { - const ( - lower = false - upper = true - ) - - if v := smap.Get(name); v != "" { - return v - } - - if name == "" { - return "" - } - - var ( - value = commonInitialismsReplacer.Replace(name) - buf = bytes.NewBufferString("") - lastCase, currCase, nextCase, nextNumber bool - ) - - for i, v := range value[:len(value)-1] { - nextCase = bool(value[i+1] >= 'A' && value[i+1] <= 'Z') - nextNumber = bool(value[i+1] >= '0' && value[i+1] <= '9') - - if i > 0 { - if currCase == upper { - if lastCase == upper && (nextCase == upper || nextNumber == upper) { - buf.WriteRune(v) - } else { - if value[i-1] != '_' && value[i+1] != '_' { - buf.WriteRune('_') - } - buf.WriteRune(v) - } - } else { - buf.WriteRune(v) - if i == len(value)-2 && (nextCase == upper && nextNumber == lower) { - buf.WriteRune('_') - } - } - } else { - currCase = upper - buf.WriteRune(v) - } - lastCase = currCase - currCase = nextCase - } - - buf.WriteByte(value[len(value)-1]) - - s := strings.ToLower(buf.String()) - smap.Set(name, s) - return s -} diff --git a/vendor/github.com/jinzhu/gorm/scope.go b/vendor/github.com/jinzhu/gorm/scope.go deleted file mode 100644 index 3749db0..0000000 --- a/vendor/github.com/jinzhu/gorm/scope.go +++ /dev/null @@ -1,1425 +0,0 @@ -package gorm - -import ( - "bytes" - "database/sql" - "database/sql/driver" - "errors" - "fmt" - "reflect" - "regexp" - "strings" - "time" -) - -// Scope contain current operation's information when you perform any operation on the database -type Scope struct { - Search *search - Value interface{} - SQL string - SQLVars []interface{} - db *DB - instanceID string - primaryKeyField *Field - skipLeft bool - fields *[]*Field - selectAttrs *[]string -} - -// IndirectValue return scope's reflect value's indirect value -func (scope *Scope) IndirectValue() reflect.Value { - return indirect(reflect.ValueOf(scope.Value)) -} - -// New create a new Scope without search information -func (scope *Scope) New(value interface{}) *Scope { - return &Scope{db: scope.NewDB(), Search: &search{}, Value: value} -} - -//////////////////////////////////////////////////////////////////////////////// -// Scope DB -//////////////////////////////////////////////////////////////////////////////// - -// DB return scope's DB connection -func (scope *Scope) DB() *DB { - return scope.db -} - -// NewDB create a new DB without search information -func (scope *Scope) NewDB() *DB { - if scope.db != nil { - db := scope.db.clone() - db.search = nil - db.Value = nil - return db - } - return nil -} - -// SQLDB return *sql.DB -func (scope *Scope) SQLDB() SQLCommon { - return scope.db.db -} - -// Dialect get dialect -func (scope *Scope) Dialect() Dialect { - return scope.db.dialect -} - -// Quote used to quote string to escape them for database -func (scope *Scope) Quote(str string) string { - if strings.Contains(str, ".") { - newStrs := []string{} - for _, str := range strings.Split(str, ".") { - newStrs = append(newStrs, scope.Dialect().Quote(str)) - } - return strings.Join(newStrs, ".") - } - - return scope.Dialect().Quote(str) -} - -// Err add error to Scope -func (scope *Scope) Err(err error) error { - if err != nil { - scope.db.AddError(err) - } - return err -} - -// HasError check if there are any error -func (scope *Scope) HasError() bool { - return scope.db.Error != nil -} - -// Log print log message -func (scope *Scope) Log(v ...interface{}) { - scope.db.log(v...) -} - -// SkipLeft skip remaining callbacks -func (scope *Scope) SkipLeft() { - scope.skipLeft = true -} - -// Fields get value's fields -func (scope *Scope) Fields() []*Field { - if scope.fields == nil { - var ( - fields []*Field - indirectScopeValue = scope.IndirectValue() - isStruct = indirectScopeValue.Kind() == reflect.Struct - ) - - for _, structField := range scope.GetModelStruct().StructFields { - if isStruct { - fieldValue := indirectScopeValue - for _, name := range structField.Names { - if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() { - fieldValue.Set(reflect.New(fieldValue.Type().Elem())) - } - fieldValue = reflect.Indirect(fieldValue).FieldByName(name) - } - fields = append(fields, &Field{StructField: structField, Field: fieldValue, IsBlank: isBlank(fieldValue)}) - } else { - fields = append(fields, &Field{StructField: structField, IsBlank: true}) - } - } - scope.fields = &fields - } - - return *scope.fields -} - -// FieldByName find `gorm.Field` with field name or db name -func (scope *Scope) FieldByName(name string) (field *Field, ok bool) { - var ( - dbName = ToColumnName(name) - mostMatchedField *Field - ) - - for _, field := range scope.Fields() { - if field.Name == name || field.DBName == name { - return field, true - } - if field.DBName == dbName { - mostMatchedField = field - } - } - return mostMatchedField, mostMatchedField != nil -} - -// PrimaryFields return scope's primary fields -func (scope *Scope) PrimaryFields() (fields []*Field) { - for _, field := range scope.Fields() { - if field.IsPrimaryKey { - fields = append(fields, field) - } - } - return fields -} - -// PrimaryField return scope's main primary field, if defined more that one primary fields, will return the one having column name `id` or the first one -func (scope *Scope) PrimaryField() *Field { - if primaryFields := scope.GetModelStruct().PrimaryFields; len(primaryFields) > 0 { - if len(primaryFields) > 1 { - if field, ok := scope.FieldByName("id"); ok { - return field - } - } - return scope.PrimaryFields()[0] - } - return nil -} - -// PrimaryKey get main primary field's db name -func (scope *Scope) PrimaryKey() string { - if field := scope.PrimaryField(); field != nil { - return field.DBName - } - return "" -} - -// PrimaryKeyZero check main primary field's value is blank or not -func (scope *Scope) PrimaryKeyZero() bool { - field := scope.PrimaryField() - return field == nil || field.IsBlank -} - -// PrimaryKeyValue get the primary key's value -func (scope *Scope) PrimaryKeyValue() interface{} { - if field := scope.PrimaryField(); field != nil && field.Field.IsValid() { - return field.Field.Interface() - } - return 0 -} - -// HasColumn to check if has column -func (scope *Scope) HasColumn(column string) bool { - for _, field := range scope.GetStructFields() { - if field.IsNormal && (field.Name == column || field.DBName == column) { - return true - } - } - return false -} - -// SetColumn to set the column's value, column could be field or field's name/dbname -func (scope *Scope) SetColumn(column interface{}, value interface{}) error { - var updateAttrs = map[string]interface{}{} - if attrs, ok := scope.InstanceGet("gorm:update_attrs"); ok { - updateAttrs = attrs.(map[string]interface{}) - defer scope.InstanceSet("gorm:update_attrs", updateAttrs) - } - - if field, ok := column.(*Field); ok { - updateAttrs[field.DBName] = value - return field.Set(value) - } else if name, ok := column.(string); ok { - var ( - dbName = ToDBName(name) - mostMatchedField *Field - ) - for _, field := range scope.Fields() { - if field.DBName == value { - updateAttrs[field.DBName] = value - return field.Set(value) - } - if !field.IsIgnored && ((field.DBName == dbName) || (field.Name == name && mostMatchedField == nil)) { - mostMatchedField = field - } - } - - if mostMatchedField != nil { - updateAttrs[mostMatchedField.DBName] = value - return mostMatchedField.Set(value) - } - } - return errors.New("could not convert column to field") -} - -// CallMethod call scope value's method, if it is a slice, will call its element's method one by one -func (scope *Scope) CallMethod(methodName string) { - if scope.Value == nil { - return - } - - if indirectScopeValue := scope.IndirectValue(); indirectScopeValue.Kind() == reflect.Slice { - for i := 0; i < indirectScopeValue.Len(); i++ { - scope.callMethod(methodName, indirectScopeValue.Index(i)) - } - } else { - scope.callMethod(methodName, indirectScopeValue) - } -} - -// AddToVars add value as sql's vars, used to prevent SQL injection -func (scope *Scope) AddToVars(value interface{}) string { - _, skipBindVar := scope.InstanceGet("skip_bindvar") - - if expr, ok := value.(*SqlExpr); ok { - exp := expr.expr - for _, arg := range expr.args { - if skipBindVar { - scope.AddToVars(arg) - } else { - exp = strings.Replace(exp, "?", scope.AddToVars(arg), 1) - } - } - return exp - } - - scope.SQLVars = append(scope.SQLVars, value) - - if skipBindVar { - return "?" - } - return scope.Dialect().BindVar(len(scope.SQLVars)) -} - -// SelectAttrs return selected attributes -func (scope *Scope) SelectAttrs() []string { - if scope.selectAttrs == nil { - attrs := []string{} - for _, value := range scope.Search.selects { - if str, ok := value.(string); ok { - attrs = append(attrs, str) - } else if strs, ok := value.([]string); ok { - attrs = append(attrs, strs...) - } else if strs, ok := value.([]interface{}); ok { - for _, str := range strs { - attrs = append(attrs, fmt.Sprintf("%v", str)) - } - } - } - scope.selectAttrs = &attrs - } - return *scope.selectAttrs -} - -// OmitAttrs return omitted attributes -func (scope *Scope) OmitAttrs() []string { - return scope.Search.omits -} - -type tabler interface { - TableName() string -} - -type dbTabler interface { - TableName(*DB) string -} - -// TableName return table name -func (scope *Scope) TableName() string { - if scope.Search != nil && len(scope.Search.tableName) > 0 { - return scope.Search.tableName - } - - if tabler, ok := scope.Value.(tabler); ok { - return tabler.TableName() - } - - if tabler, ok := scope.Value.(dbTabler); ok { - return tabler.TableName(scope.db) - } - - return scope.GetModelStruct().TableName(scope.db.Model(scope.Value)) -} - -// QuotedTableName return quoted table name -func (scope *Scope) QuotedTableName() (name string) { - if scope.Search != nil && len(scope.Search.tableName) > 0 { - if strings.Contains(scope.Search.tableName, " ") { - return scope.Search.tableName - } - return scope.Quote(scope.Search.tableName) - } - - return scope.Quote(scope.TableName()) -} - -// CombinedConditionSql return combined condition sql -func (scope *Scope) CombinedConditionSql() string { - joinSQL := scope.joinsSQL() - whereSQL := scope.whereSQL() - if scope.Search.raw { - whereSQL = strings.TrimSuffix(strings.TrimPrefix(whereSQL, "WHERE ("), ")") - } - return joinSQL + whereSQL + scope.groupSQL() + - scope.havingSQL() + scope.orderSQL() + scope.limitAndOffsetSQL() -} - -// Raw set raw sql -func (scope *Scope) Raw(sql string) *Scope { - scope.SQL = strings.Replace(sql, "$$$", "?", -1) - return scope -} - -// Exec perform generated SQL -func (scope *Scope) Exec() *Scope { - defer scope.trace(NowFunc()) - - if !scope.HasError() { - if result, err := scope.SQLDB().Exec(scope.SQL, scope.SQLVars...); scope.Err(err) == nil { - if count, err := result.RowsAffected(); scope.Err(err) == nil { - scope.db.RowsAffected = count - } - } - } - return scope -} - -// Set set value by name -func (scope *Scope) Set(name string, value interface{}) *Scope { - scope.db.InstantSet(name, value) - return scope -} - -// Get get setting by name -func (scope *Scope) Get(name string) (interface{}, bool) { - return scope.db.Get(name) -} - -// InstanceID get InstanceID for scope -func (scope *Scope) InstanceID() string { - if scope.instanceID == "" { - scope.instanceID = fmt.Sprintf("%v%v", &scope, &scope.db) - } - return scope.instanceID -} - -// InstanceSet set instance setting for current operation, but not for operations in callbacks, like saving associations callback -func (scope *Scope) InstanceSet(name string, value interface{}) *Scope { - return scope.Set(name+scope.InstanceID(), value) -} - -// InstanceGet get instance setting from current operation -func (scope *Scope) InstanceGet(name string) (interface{}, bool) { - return scope.Get(name + scope.InstanceID()) -} - -// Begin start a transaction -func (scope *Scope) Begin() *Scope { - if db, ok := scope.SQLDB().(sqlDb); ok { - if tx, err := db.Begin(); scope.Err(err) == nil { - scope.db.db = interface{}(tx).(SQLCommon) - scope.InstanceSet("gorm:started_transaction", true) - } - } - return scope -} - -// CommitOrRollback commit current transaction if no error happened, otherwise will rollback it -func (scope *Scope) CommitOrRollback() *Scope { - if _, ok := scope.InstanceGet("gorm:started_transaction"); ok { - if db, ok := scope.db.db.(sqlTx); ok { - if scope.HasError() { - db.Rollback() - } else { - scope.Err(db.Commit()) - } - scope.db.db = scope.db.parent.db - } - } - return scope -} - -//////////////////////////////////////////////////////////////////////////////// -// Private Methods For *gorm.Scope -//////////////////////////////////////////////////////////////////////////////// - -func (scope *Scope) callMethod(methodName string, reflectValue reflect.Value) { - // Only get address from non-pointer - if reflectValue.CanAddr() && reflectValue.Kind() != reflect.Ptr { - reflectValue = reflectValue.Addr() - } - - if methodValue := reflectValue.MethodByName(methodName); methodValue.IsValid() { - switch method := methodValue.Interface().(type) { - case func(): - method() - case func(*Scope): - method(scope) - case func(*DB): - newDB := scope.NewDB() - method(newDB) - scope.Err(newDB.Error) - case func() error: - scope.Err(method()) - case func(*Scope) error: - scope.Err(method(scope)) - case func(*DB) error: - newDB := scope.NewDB() - scope.Err(method(newDB)) - scope.Err(newDB.Error) - default: - scope.Err(fmt.Errorf("unsupported function %v", methodName)) - } - } -} - -var ( - columnRegexp = regexp.MustCompile("^[a-zA-Z\\d]+(\\.[a-zA-Z\\d]+)*$") // only match string like `name`, `users.name` - isNumberRegexp = regexp.MustCompile("^\\s*\\d+\\s*$") // match if string is number - comparisonRegexp = regexp.MustCompile("(?i) (=|<>|(>|<)(=?)|LIKE|IS|IN) ") - countingQueryRegexp = regexp.MustCompile("(?i)^count(.+)$") -) - -func (scope *Scope) quoteIfPossible(str string) string { - if columnRegexp.MatchString(str) { - return scope.Quote(str) - } - return str -} - -func (scope *Scope) scan(rows *sql.Rows, columns []string, fields []*Field) { - var ( - ignored interface{} - values = make([]interface{}, len(columns)) - selectFields []*Field - selectedColumnsMap = map[string]int{} - resetFields = map[int]*Field{} - ) - - for index, column := range columns { - values[index] = &ignored - - selectFields = fields - offset := 0 - if idx, ok := selectedColumnsMap[column]; ok { - offset = idx + 1 - selectFields = selectFields[offset:] - } - - for fieldIndex, field := range selectFields { - if field.DBName == column { - if field.Field.Kind() == reflect.Ptr { - values[index] = field.Field.Addr().Interface() - } else { - reflectValue := reflect.New(reflect.PtrTo(field.Struct.Type)) - reflectValue.Elem().Set(field.Field.Addr()) - values[index] = reflectValue.Interface() - resetFields[index] = field - } - - selectedColumnsMap[column] = offset + fieldIndex - - if field.IsNormal { - break - } - } - } - } - - scope.Err(rows.Scan(values...)) - - for index, field := range resetFields { - if v := reflect.ValueOf(values[index]).Elem().Elem(); v.IsValid() { - field.Field.Set(v) - } - } -} - -func (scope *Scope) primaryCondition(value interface{}) string { - return fmt.Sprintf("(%v.%v = %v)", scope.QuotedTableName(), scope.Quote(scope.PrimaryKey()), value) -} - -func (scope *Scope) buildCondition(clause map[string]interface{}, include bool) (str string) { - var ( - quotedTableName = scope.QuotedTableName() - quotedPrimaryKey = scope.Quote(scope.PrimaryKey()) - equalSQL = "=" - inSQL = "IN" - ) - - // If building not conditions - if !include { - equalSQL = "<>" - inSQL = "NOT IN" - } - - switch value := clause["query"].(type) { - case sql.NullInt64: - return fmt.Sprintf("(%v.%v %s %v)", quotedTableName, quotedPrimaryKey, equalSQL, value.Int64) - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: - return fmt.Sprintf("(%v.%v %s %v)", quotedTableName, quotedPrimaryKey, equalSQL, value) - case []int, []int8, []int16, []int32, []int64, []uint, []uint8, []uint16, []uint32, []uint64, []string, []interface{}: - if !include && reflect.ValueOf(value).Len() == 0 { - return - } - str = fmt.Sprintf("(%v.%v %s (?))", quotedTableName, quotedPrimaryKey, inSQL) - clause["args"] = []interface{}{value} - case string: - if isNumberRegexp.MatchString(value) { - return fmt.Sprintf("(%v.%v %s %v)", quotedTableName, quotedPrimaryKey, equalSQL, scope.AddToVars(value)) - } - - if value != "" { - if !include { - if comparisonRegexp.MatchString(value) { - str = fmt.Sprintf("NOT (%v)", value) - } else { - str = fmt.Sprintf("(%v.%v NOT IN (?))", quotedTableName, scope.Quote(value)) - } - } else { - str = fmt.Sprintf("(%v)", value) - } - } - case map[string]interface{}: - var sqls []string - for key, value := range value { - if value != nil { - sqls = append(sqls, fmt.Sprintf("(%v.%v %s %v)", quotedTableName, scope.Quote(key), equalSQL, scope.AddToVars(value))) - } else { - if !include { - sqls = append(sqls, fmt.Sprintf("(%v.%v IS NOT NULL)", quotedTableName, scope.Quote(key))) - } else { - sqls = append(sqls, fmt.Sprintf("(%v.%v IS NULL)", quotedTableName, scope.Quote(key))) - } - } - } - return strings.Join(sqls, " AND ") - case interface{}: - var sqls []string - newScope := scope.New(value) - - if len(newScope.Fields()) == 0 { - scope.Err(fmt.Errorf("invalid query condition: %v", value)) - return - } - scopeQuotedTableName := newScope.QuotedTableName() - for _, field := range newScope.Fields() { - if !field.IsIgnored && !field.IsBlank { - sqls = append(sqls, fmt.Sprintf("(%v.%v %s %v)", scopeQuotedTableName, scope.Quote(field.DBName), equalSQL, scope.AddToVars(field.Field.Interface()))) - } - } - return strings.Join(sqls, " AND ") - default: - scope.Err(fmt.Errorf("invalid query condition: %v", value)) - return - } - - replacements := []string{} - args := clause["args"].([]interface{}) - for _, arg := range args { - var err error - switch reflect.ValueOf(arg).Kind() { - case reflect.Slice: // For where("id in (?)", []int64{1,2}) - if scanner, ok := interface{}(arg).(driver.Valuer); ok { - arg, err = scanner.Value() - replacements = append(replacements, scope.AddToVars(arg)) - } else if b, ok := arg.([]byte); ok { - replacements = append(replacements, scope.AddToVars(b)) - } else if as, ok := arg.([][]interface{}); ok { - var tempMarks []string - for _, a := range as { - var arrayMarks []string - for _, v := range a { - arrayMarks = append(arrayMarks, scope.AddToVars(v)) - } - - if len(arrayMarks) > 0 { - tempMarks = append(tempMarks, fmt.Sprintf("(%v)", strings.Join(arrayMarks, ","))) - } - } - - if len(tempMarks) > 0 { - replacements = append(replacements, strings.Join(tempMarks, ",")) - } - } else if values := reflect.ValueOf(arg); values.Len() > 0 { - var tempMarks []string - for i := 0; i < values.Len(); i++ { - tempMarks = append(tempMarks, scope.AddToVars(values.Index(i).Interface())) - } - replacements = append(replacements, strings.Join(tempMarks, ",")) - } else { - replacements = append(replacements, scope.AddToVars(Expr("NULL"))) - } - default: - if valuer, ok := interface{}(arg).(driver.Valuer); ok { - arg, err = valuer.Value() - } - - replacements = append(replacements, scope.AddToVars(arg)) - } - - if err != nil { - scope.Err(err) - } - } - - buff := bytes.NewBuffer([]byte{}) - i := 0 - for _, s := range str { - if s == '?' && len(replacements) > i { - buff.WriteString(replacements[i]) - i++ - } else { - buff.WriteRune(s) - } - } - - str = buff.String() - - return -} - -func (scope *Scope) buildSelectQuery(clause map[string]interface{}) (str string) { - switch value := clause["query"].(type) { - case string: - str = value - case []string: - str = strings.Join(value, ", ") - } - - args := clause["args"].([]interface{}) - replacements := []string{} - for _, arg := range args { - switch reflect.ValueOf(arg).Kind() { - case reflect.Slice: - values := reflect.ValueOf(arg) - var tempMarks []string - for i := 0; i < values.Len(); i++ { - tempMarks = append(tempMarks, scope.AddToVars(values.Index(i).Interface())) - } - replacements = append(replacements, strings.Join(tempMarks, ",")) - default: - if valuer, ok := interface{}(arg).(driver.Valuer); ok { - arg, _ = valuer.Value() - } - replacements = append(replacements, scope.AddToVars(arg)) - } - } - - buff := bytes.NewBuffer([]byte{}) - i := 0 - for pos, char := range str { - if str[pos] == '?' { - buff.WriteString(replacements[i]) - i++ - } else { - buff.WriteRune(char) - } - } - - str = buff.String() - - return -} - -func (scope *Scope) whereSQL() (sql string) { - var ( - quotedTableName = scope.QuotedTableName() - deletedAtField, hasDeletedAtField = scope.FieldByName("DeletedAt") - primaryConditions, andConditions, orConditions []string - ) - - if !scope.Search.Unscoped && hasDeletedAtField { - sql := fmt.Sprintf("%v.%v IS NULL", quotedTableName, scope.Quote(deletedAtField.DBName)) - primaryConditions = append(primaryConditions, sql) - } - - if !scope.PrimaryKeyZero() { - for _, field := range scope.PrimaryFields() { - sql := fmt.Sprintf("%v.%v = %v", quotedTableName, scope.Quote(field.DBName), scope.AddToVars(field.Field.Interface())) - primaryConditions = append(primaryConditions, sql) - } - } - - for _, clause := range scope.Search.whereConditions { - if sql := scope.buildCondition(clause, true); sql != "" { - andConditions = append(andConditions, sql) - } - } - - for _, clause := range scope.Search.orConditions { - if sql := scope.buildCondition(clause, true); sql != "" { - orConditions = append(orConditions, sql) - } - } - - for _, clause := range scope.Search.notConditions { - if sql := scope.buildCondition(clause, false); sql != "" { - andConditions = append(andConditions, sql) - } - } - - orSQL := strings.Join(orConditions, " OR ") - combinedSQL := strings.Join(andConditions, " AND ") - if len(combinedSQL) > 0 { - if len(orSQL) > 0 { - combinedSQL = combinedSQL + " OR " + orSQL - } - } else { - combinedSQL = orSQL - } - - if len(primaryConditions) > 0 { - sql = "WHERE " + strings.Join(primaryConditions, " AND ") - if len(combinedSQL) > 0 { - sql = sql + " AND (" + combinedSQL + ")" - } - } else if len(combinedSQL) > 0 { - sql = "WHERE " + combinedSQL - } - return -} - -func (scope *Scope) selectSQL() string { - if len(scope.Search.selects) == 0 { - if len(scope.Search.joinConditions) > 0 { - return fmt.Sprintf("%v.*", scope.QuotedTableName()) - } - return "*" - } - return scope.buildSelectQuery(scope.Search.selects) -} - -func (scope *Scope) orderSQL() string { - if len(scope.Search.orders) == 0 || scope.Search.ignoreOrderQuery { - return "" - } - - var orders []string - for _, order := range scope.Search.orders { - if str, ok := order.(string); ok { - orders = append(orders, scope.quoteIfPossible(str)) - } else if expr, ok := order.(*SqlExpr); ok { - exp := expr.expr - for _, arg := range expr.args { - exp = strings.Replace(exp, "?", scope.AddToVars(arg), 1) - } - orders = append(orders, exp) - } - } - return " ORDER BY " + strings.Join(orders, ",") -} - -func (scope *Scope) limitAndOffsetSQL() string { - sql, err := scope.Dialect().LimitAndOffsetSQL(scope.Search.limit, scope.Search.offset) - scope.Err(err) - return sql -} - -func (scope *Scope) groupSQL() string { - if len(scope.Search.group) == 0 { - return "" - } - return " GROUP BY " + scope.Search.group -} - -func (scope *Scope) havingSQL() string { - if len(scope.Search.havingConditions) == 0 { - return "" - } - - var andConditions []string - for _, clause := range scope.Search.havingConditions { - if sql := scope.buildCondition(clause, true); sql != "" { - andConditions = append(andConditions, sql) - } - } - - combinedSQL := strings.Join(andConditions, " AND ") - if len(combinedSQL) == 0 { - return "" - } - - return " HAVING " + combinedSQL -} - -func (scope *Scope) joinsSQL() string { - var joinConditions []string - for _, clause := range scope.Search.joinConditions { - if sql := scope.buildCondition(clause, true); sql != "" { - joinConditions = append(joinConditions, strings.TrimSuffix(strings.TrimPrefix(sql, "("), ")")) - } - } - - return strings.Join(joinConditions, " ") + " " -} - -func (scope *Scope) prepareQuerySQL() { - if scope.Search.raw { - scope.Raw(scope.CombinedConditionSql()) - } else { - scope.Raw(fmt.Sprintf("SELECT %v FROM %v %v", scope.selectSQL(), scope.QuotedTableName(), scope.CombinedConditionSql())) - } - return -} - -func (scope *Scope) inlineCondition(values ...interface{}) *Scope { - if len(values) > 0 { - scope.Search.Where(values[0], values[1:]...) - } - return scope -} - -func (scope *Scope) callCallbacks(funcs []*func(s *Scope)) *Scope { - defer func() { - if err := recover(); err != nil { - if db, ok := scope.db.db.(sqlTx); ok { - db.Rollback() - } - panic(err) - } - }() - for _, f := range funcs { - (*f)(scope) - if scope.skipLeft { - break - } - } - return scope -} - -func convertInterfaceToMap(values interface{}, withIgnoredField bool, db *DB) map[string]interface{} { - var attrs = map[string]interface{}{} - - switch value := values.(type) { - case map[string]interface{}: - return value - case []interface{}: - for _, v := range value { - for key, value := range convertInterfaceToMap(v, withIgnoredField, db) { - attrs[key] = value - } - } - case interface{}: - reflectValue := reflect.ValueOf(values) - - switch reflectValue.Kind() { - case reflect.Map: - for _, key := range reflectValue.MapKeys() { - attrs[ToColumnName(key.Interface().(string))] = reflectValue.MapIndex(key).Interface() - } - default: - for _, field := range (&Scope{Value: values, db: db}).Fields() { - if !field.IsBlank && (withIgnoredField || !field.IsIgnored) { - attrs[field.DBName] = field.Field.Interface() - } - } - } - } - return attrs -} - -func (scope *Scope) updatedAttrsWithValues(value interface{}) (results map[string]interface{}, hasUpdate bool) { - if scope.IndirectValue().Kind() != reflect.Struct { - return convertInterfaceToMap(value, false, scope.db), true - } - - results = map[string]interface{}{} - - for key, value := range convertInterfaceToMap(value, true, scope.db) { - if field, ok := scope.FieldByName(key); ok { - if scope.changeableField(field) { - if _, ok := value.(*SqlExpr); ok { - hasUpdate = true - results[field.DBName] = value - } else { - err := field.Set(value) - if field.IsNormal && !field.IsIgnored { - hasUpdate = true - if err == ErrUnaddressable { - results[field.DBName] = value - } else { - results[field.DBName] = field.Field.Interface() - } - } - } - } - } else { - results[key] = value - } - } - return -} - -func (scope *Scope) row() *sql.Row { - defer scope.trace(NowFunc()) - - result := &RowQueryResult{} - scope.InstanceSet("row_query_result", result) - scope.callCallbacks(scope.db.parent.callbacks.rowQueries) - - return result.Row -} - -func (scope *Scope) rows() (*sql.Rows, error) { - defer scope.trace(NowFunc()) - - result := &RowsQueryResult{} - scope.InstanceSet("row_query_result", result) - scope.callCallbacks(scope.db.parent.callbacks.rowQueries) - - return result.Rows, result.Error -} - -func (scope *Scope) initialize() *Scope { - for _, clause := range scope.Search.whereConditions { - scope.updatedAttrsWithValues(clause["query"]) - } - scope.updatedAttrsWithValues(scope.Search.initAttrs) - scope.updatedAttrsWithValues(scope.Search.assignAttrs) - return scope -} - -func (scope *Scope) isQueryForColumn(query interface{}, column string) bool { - queryStr := strings.ToLower(fmt.Sprint(query)) - if queryStr == column { - return true - } - - if strings.HasSuffix(queryStr, "as "+column) { - return true - } - - if strings.HasSuffix(queryStr, "as "+scope.Quote(column)) { - return true - } - - return false -} - -func (scope *Scope) pluck(column string, value interface{}) *Scope { - dest := reflect.Indirect(reflect.ValueOf(value)) - if dest.Kind() != reflect.Slice { - scope.Err(fmt.Errorf("results should be a slice, not %s", dest.Kind())) - return scope - } - - if dest.Len() > 0 { - dest.Set(reflect.Zero(dest.Type())) - } - - if query, ok := scope.Search.selects["query"]; !ok || !scope.isQueryForColumn(query, column) { - scope.Search.Select(column) - } - - rows, err := scope.rows() - if scope.Err(err) == nil { - defer rows.Close() - for rows.Next() { - elem := reflect.New(dest.Type().Elem()).Interface() - scope.Err(rows.Scan(elem)) - dest.Set(reflect.Append(dest, reflect.ValueOf(elem).Elem())) - } - - if err := rows.Err(); err != nil { - scope.Err(err) - } - } - return scope -} - -func (scope *Scope) count(value interface{}) *Scope { - if query, ok := scope.Search.selects["query"]; !ok || !countingQueryRegexp.MatchString(fmt.Sprint(query)) { - if len(scope.Search.group) != 0 { - if len(scope.Search.havingConditions) != 0 { - scope.prepareQuerySQL() - scope.Search = &search{} - scope.Search.Select("count(*)") - scope.Search.Table(fmt.Sprintf("( %s ) AS count_table", scope.SQL)) - } else { - scope.Search.Select("count(*) FROM ( SELECT count(*) as name ") - scope.Search.group += " ) AS count_table" - } - } else { - scope.Search.Select("count(*)") - } - } - scope.Search.ignoreOrderQuery = true - scope.Err(scope.row().Scan(value)) - return scope -} - -func (scope *Scope) typeName() string { - typ := scope.IndirectValue().Type() - - for typ.Kind() == reflect.Slice || typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - - return typ.Name() -} - -// trace print sql log -func (scope *Scope) trace(t time.Time) { - if len(scope.SQL) > 0 { - scope.db.slog(scope.SQL, t, scope.SQLVars...) - } -} - -func (scope *Scope) changeableField(field *Field) bool { - if selectAttrs := scope.SelectAttrs(); len(selectAttrs) > 0 { - for _, attr := range selectAttrs { - if field.Name == attr || field.DBName == attr { - return true - } - } - return false - } - - for _, attr := range scope.OmitAttrs() { - if field.Name == attr || field.DBName == attr { - return false - } - } - - return true -} - -func (scope *Scope) related(value interface{}, foreignKeys ...string) *Scope { - toScope := scope.db.NewScope(value) - tx := scope.db.Set("gorm:association:source", scope.Value) - - for _, foreignKey := range append(foreignKeys, toScope.typeName()+"Id", scope.typeName()+"Id") { - fromField, _ := scope.FieldByName(foreignKey) - toField, _ := toScope.FieldByName(foreignKey) - - if fromField != nil { - if relationship := fromField.Relationship; relationship != nil { - if relationship.Kind == "many_to_many" { - joinTableHandler := relationship.JoinTableHandler - scope.Err(joinTableHandler.JoinWith(joinTableHandler, tx, scope.Value).Find(value).Error) - } else if relationship.Kind == "belongs_to" { - for idx, foreignKey := range relationship.ForeignDBNames { - if field, ok := scope.FieldByName(foreignKey); ok { - tx = tx.Where(fmt.Sprintf("%v = ?", scope.Quote(relationship.AssociationForeignDBNames[idx])), field.Field.Interface()) - } - } - scope.Err(tx.Find(value).Error) - } else if relationship.Kind == "has_many" || relationship.Kind == "has_one" { - for idx, foreignKey := range relationship.ForeignDBNames { - if field, ok := scope.FieldByName(relationship.AssociationForeignDBNames[idx]); ok { - tx = tx.Where(fmt.Sprintf("%v = ?", scope.Quote(foreignKey)), field.Field.Interface()) - } - } - - if relationship.PolymorphicType != "" { - tx = tx.Where(fmt.Sprintf("%v = ?", scope.Quote(relationship.PolymorphicDBName)), relationship.PolymorphicValue) - } - scope.Err(tx.Find(value).Error) - } - } else { - sql := fmt.Sprintf("%v = ?", scope.Quote(toScope.PrimaryKey())) - scope.Err(tx.Where(sql, fromField.Field.Interface()).Find(value).Error) - } - return scope - } else if toField != nil { - sql := fmt.Sprintf("%v = ?", scope.Quote(toField.DBName)) - scope.Err(tx.Where(sql, scope.PrimaryKeyValue()).Find(value).Error) - return scope - } - } - - scope.Err(fmt.Errorf("invalid association %v", foreignKeys)) - return scope -} - -// getTableOptions return the table options string or an empty string if the table options does not exist -func (scope *Scope) getTableOptions() string { - tableOptions, ok := scope.Get("gorm:table_options") - if !ok { - return "" - } - return " " + tableOptions.(string) -} - -func (scope *Scope) createJoinTable(field *StructField) { - if relationship := field.Relationship; relationship != nil && relationship.JoinTableHandler != nil { - joinTableHandler := relationship.JoinTableHandler - joinTable := joinTableHandler.Table(scope.db) - if !scope.Dialect().HasTable(joinTable) { - toScope := &Scope{Value: reflect.New(field.Struct.Type).Interface()} - - var sqlTypes, primaryKeys []string - for idx, fieldName := range relationship.ForeignFieldNames { - if field, ok := scope.FieldByName(fieldName); ok { - foreignKeyStruct := field.clone() - foreignKeyStruct.IsPrimaryKey = false - foreignKeyStruct.TagSettingsSet("IS_JOINTABLE_FOREIGNKEY", "true") - foreignKeyStruct.TagSettingsDelete("AUTO_INCREMENT") - sqlTypes = append(sqlTypes, scope.Quote(relationship.ForeignDBNames[idx])+" "+scope.Dialect().DataTypeOf(foreignKeyStruct)) - primaryKeys = append(primaryKeys, scope.Quote(relationship.ForeignDBNames[idx])) - } - } - - for idx, fieldName := range relationship.AssociationForeignFieldNames { - if field, ok := toScope.FieldByName(fieldName); ok { - foreignKeyStruct := field.clone() - foreignKeyStruct.IsPrimaryKey = false - foreignKeyStruct.TagSettingsSet("IS_JOINTABLE_FOREIGNKEY", "true") - foreignKeyStruct.TagSettingsDelete("AUTO_INCREMENT") - sqlTypes = append(sqlTypes, scope.Quote(relationship.AssociationForeignDBNames[idx])+" "+scope.Dialect().DataTypeOf(foreignKeyStruct)) - primaryKeys = append(primaryKeys, scope.Quote(relationship.AssociationForeignDBNames[idx])) - } - } - - scope.Err(scope.NewDB().Exec(fmt.Sprintf("CREATE TABLE %v (%v, PRIMARY KEY (%v))%s", scope.Quote(joinTable), strings.Join(sqlTypes, ","), strings.Join(primaryKeys, ","), scope.getTableOptions())).Error) - } - scope.NewDB().Table(joinTable).AutoMigrate(joinTableHandler) - } -} - -func (scope *Scope) createTable() *Scope { - var tags []string - var primaryKeys []string - var primaryKeyInColumnType = false - for _, field := range scope.GetModelStruct().StructFields { - if field.IsNormal { - sqlTag := scope.Dialect().DataTypeOf(field) - - // Check if the primary key constraint was specified as - // part of the column type. If so, we can only support - // one column as the primary key. - if strings.Contains(strings.ToLower(sqlTag), "primary key") { - primaryKeyInColumnType = true - } - - tags = append(tags, scope.Quote(field.DBName)+" "+sqlTag) - } - - if field.IsPrimaryKey { - primaryKeys = append(primaryKeys, scope.Quote(field.DBName)) - } - scope.createJoinTable(field) - } - - var primaryKeyStr string - if len(primaryKeys) > 0 && !primaryKeyInColumnType { - primaryKeyStr = fmt.Sprintf(", PRIMARY KEY (%v)", strings.Join(primaryKeys, ",")) - } - - scope.Raw(fmt.Sprintf("CREATE TABLE %v (%v %v)%s", scope.QuotedTableName(), strings.Join(tags, ","), primaryKeyStr, scope.getTableOptions())).Exec() - - scope.autoIndex() - return scope -} - -func (scope *Scope) dropTable() *Scope { - scope.Raw(fmt.Sprintf("DROP TABLE %v", scope.QuotedTableName())).Exec() - return scope -} - -func (scope *Scope) modifyColumn(column string, typ string) { - scope.db.AddError(scope.Dialect().ModifyColumn(scope.QuotedTableName(), scope.Quote(column), typ)) -} - -func (scope *Scope) dropColumn(column string) { - scope.Raw(fmt.Sprintf("ALTER TABLE %v DROP COLUMN %v", scope.QuotedTableName(), scope.Quote(column))).Exec() -} - -func (scope *Scope) addIndex(unique bool, indexName string, column ...string) { - if scope.Dialect().HasIndex(scope.TableName(), indexName) { - return - } - - var columns []string - for _, name := range column { - columns = append(columns, scope.quoteIfPossible(name)) - } - - sqlCreate := "CREATE INDEX" - if unique { - sqlCreate = "CREATE UNIQUE INDEX" - } - - scope.Raw(fmt.Sprintf("%s %v ON %v(%v) %v", sqlCreate, indexName, scope.QuotedTableName(), strings.Join(columns, ", "), scope.whereSQL())).Exec() -} - -func (scope *Scope) addForeignKey(field string, dest string, onDelete string, onUpdate string) { - // Compatible with old generated key - keyName := scope.Dialect().BuildKeyName(scope.TableName(), field, dest, "foreign") - - if scope.Dialect().HasForeignKey(scope.TableName(), keyName) { - return - } - var query = `ALTER TABLE %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s ON DELETE %s ON UPDATE %s;` - scope.Raw(fmt.Sprintf(query, scope.QuotedTableName(), scope.quoteIfPossible(keyName), scope.quoteIfPossible(field), dest, onDelete, onUpdate)).Exec() -} - -func (scope *Scope) removeForeignKey(field string, dest string) { - keyName := scope.Dialect().BuildKeyName(scope.TableName(), field, dest, "foreign") - if !scope.Dialect().HasForeignKey(scope.TableName(), keyName) { - return - } - var mysql mysql - var query string - if scope.Dialect().GetName() == mysql.GetName() { - query = `ALTER TABLE %s DROP FOREIGN KEY %s;` - } else { - query = `ALTER TABLE %s DROP CONSTRAINT %s;` - } - - scope.Raw(fmt.Sprintf(query, scope.QuotedTableName(), scope.quoteIfPossible(keyName))).Exec() -} - -func (scope *Scope) removeIndex(indexName string) { - scope.Dialect().RemoveIndex(scope.TableName(), indexName) -} - -func (scope *Scope) autoMigrate() *Scope { - tableName := scope.TableName() - quotedTableName := scope.QuotedTableName() - - if !scope.Dialect().HasTable(tableName) { - scope.createTable() - } else { - for _, field := range scope.GetModelStruct().StructFields { - if !scope.Dialect().HasColumn(tableName, field.DBName) { - if field.IsNormal { - sqlTag := scope.Dialect().DataTypeOf(field) - scope.Raw(fmt.Sprintf("ALTER TABLE %v ADD %v %v;", quotedTableName, scope.Quote(field.DBName), sqlTag)).Exec() - } - } - scope.createJoinTable(field) - } - scope.autoIndex() - } - return scope -} - -func (scope *Scope) autoIndex() *Scope { - var indexes = map[string][]string{} - var uniqueIndexes = map[string][]string{} - - for _, field := range scope.GetStructFields() { - if name, ok := field.TagSettingsGet("INDEX"); ok { - names := strings.Split(name, ",") - - for _, name := range names { - if name == "INDEX" || name == "" { - name = scope.Dialect().BuildKeyName("idx", scope.TableName(), field.DBName) - } - name, column := scope.Dialect().NormalizeIndexAndColumn(name, field.DBName) - indexes[name] = append(indexes[name], column) - } - } - - if name, ok := field.TagSettingsGet("UNIQUE_INDEX"); ok { - names := strings.Split(name, ",") - - for _, name := range names { - if name == "UNIQUE_INDEX" || name == "" { - name = scope.Dialect().BuildKeyName("uix", scope.TableName(), field.DBName) - } - name, column := scope.Dialect().NormalizeIndexAndColumn(name, field.DBName) - uniqueIndexes[name] = append(uniqueIndexes[name], column) - } - } - } - - for name, columns := range indexes { - if db := scope.NewDB().Table(scope.TableName()).Model(scope.Value).AddIndex(name, columns...); db.Error != nil { - scope.db.AddError(db.Error) - } - } - - for name, columns := range uniqueIndexes { - if db := scope.NewDB().Table(scope.TableName()).Model(scope.Value).AddUniqueIndex(name, columns...); db.Error != nil { - scope.db.AddError(db.Error) - } - } - - return scope -} - -func (scope *Scope) getColumnAsArray(columns []string, values ...interface{}) (results [][]interface{}) { - resultMap := make(map[string][]interface{}) - for _, value := range values { - indirectValue := indirect(reflect.ValueOf(value)) - - switch indirectValue.Kind() { - case reflect.Slice: - for i := 0; i < indirectValue.Len(); i++ { - var result []interface{} - var object = indirect(indirectValue.Index(i)) - var hasValue = false - for _, column := range columns { - field := object.FieldByName(column) - if hasValue || !isBlank(field) { - hasValue = true - } - result = append(result, field.Interface()) - } - - if hasValue { - h := fmt.Sprint(result...) - if _, exist := resultMap[h]; !exist { - resultMap[h] = result - } - } - } - case reflect.Struct: - var result []interface{} - var hasValue = false - for _, column := range columns { - field := indirectValue.FieldByName(column) - if hasValue || !isBlank(field) { - hasValue = true - } - result = append(result, field.Interface()) - } - - if hasValue { - h := fmt.Sprint(result...) - if _, exist := resultMap[h]; !exist { - resultMap[h] = result - } - } - } - } - for _, v := range resultMap { - results = append(results, v) - } - return -} - -func (scope *Scope) getColumnAsScope(column string) *Scope { - indirectScopeValue := scope.IndirectValue() - - switch indirectScopeValue.Kind() { - case reflect.Slice: - if fieldStruct, ok := scope.GetModelStruct().ModelType.FieldByName(column); ok { - fieldType := fieldStruct.Type - if fieldType.Kind() == reflect.Slice || fieldType.Kind() == reflect.Ptr { - fieldType = fieldType.Elem() - } - - resultsMap := map[interface{}]bool{} - results := reflect.New(reflect.SliceOf(reflect.PtrTo(fieldType))).Elem() - - for i := 0; i < indirectScopeValue.Len(); i++ { - result := indirect(indirect(indirectScopeValue.Index(i)).FieldByName(column)) - - if result.Kind() == reflect.Slice { - for j := 0; j < result.Len(); j++ { - if elem := result.Index(j); elem.CanAddr() && resultsMap[elem.Addr()] != true { - resultsMap[elem.Addr()] = true - results = reflect.Append(results, elem.Addr()) - } - } - } else if result.CanAddr() && resultsMap[result.Addr()] != true { - resultsMap[result.Addr()] = true - results = reflect.Append(results, result.Addr()) - } - } - return scope.New(results.Interface()) - } - case reflect.Struct: - if field := indirectScopeValue.FieldByName(column); field.CanAddr() { - return scope.New(field.Addr().Interface()) - } - } - return nil -} - -func (scope *Scope) hasConditions() bool { - return !scope.PrimaryKeyZero() || - len(scope.Search.whereConditions) > 0 || - len(scope.Search.orConditions) > 0 || - len(scope.Search.notConditions) > 0 -} diff --git a/vendor/github.com/jinzhu/gorm/search.go b/vendor/github.com/jinzhu/gorm/search.go deleted file mode 100644 index 7c4cc18..0000000 --- a/vendor/github.com/jinzhu/gorm/search.go +++ /dev/null @@ -1,153 +0,0 @@ -package gorm - -import ( - "fmt" -) - -type search struct { - db *DB - whereConditions []map[string]interface{} - orConditions []map[string]interface{} - notConditions []map[string]interface{} - havingConditions []map[string]interface{} - joinConditions []map[string]interface{} - initAttrs []interface{} - assignAttrs []interface{} - selects map[string]interface{} - omits []string - orders []interface{} - preload []searchPreload - offset interface{} - limit interface{} - group string - tableName string - raw bool - Unscoped bool - ignoreOrderQuery bool -} - -type searchPreload struct { - schema string - conditions []interface{} -} - -func (s *search) clone() *search { - clone := *s - return &clone -} - -func (s *search) Where(query interface{}, values ...interface{}) *search { - s.whereConditions = append(s.whereConditions, map[string]interface{}{"query": query, "args": values}) - return s -} - -func (s *search) Not(query interface{}, values ...interface{}) *search { - s.notConditions = append(s.notConditions, map[string]interface{}{"query": query, "args": values}) - return s -} - -func (s *search) Or(query interface{}, values ...interface{}) *search { - s.orConditions = append(s.orConditions, map[string]interface{}{"query": query, "args": values}) - return s -} - -func (s *search) Attrs(attrs ...interface{}) *search { - s.initAttrs = append(s.initAttrs, toSearchableMap(attrs...)) - return s -} - -func (s *search) Assign(attrs ...interface{}) *search { - s.assignAttrs = append(s.assignAttrs, toSearchableMap(attrs...)) - return s -} - -func (s *search) Order(value interface{}, reorder ...bool) *search { - if len(reorder) > 0 && reorder[0] { - s.orders = []interface{}{} - } - - if value != nil && value != "" { - s.orders = append(s.orders, value) - } - return s -} - -func (s *search) Select(query interface{}, args ...interface{}) *search { - s.selects = map[string]interface{}{"query": query, "args": args} - return s -} - -func (s *search) Omit(columns ...string) *search { - s.omits = columns - return s -} - -func (s *search) Limit(limit interface{}) *search { - s.limit = limit - return s -} - -func (s *search) Offset(offset interface{}) *search { - s.offset = offset - return s -} - -func (s *search) Group(query string) *search { - s.group = s.getInterfaceAsSQL(query) - return s -} - -func (s *search) Having(query interface{}, values ...interface{}) *search { - if val, ok := query.(*SqlExpr); ok { - s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": val.expr, "args": val.args}) - } else { - s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": query, "args": values}) - } - return s -} - -func (s *search) Joins(query string, values ...interface{}) *search { - s.joinConditions = append(s.joinConditions, map[string]interface{}{"query": query, "args": values}) - return s -} - -func (s *search) Preload(schema string, values ...interface{}) *search { - var preloads []searchPreload - for _, preload := range s.preload { - if preload.schema != schema { - preloads = append(preloads, preload) - } - } - preloads = append(preloads, searchPreload{schema, values}) - s.preload = preloads - return s -} - -func (s *search) Raw(b bool) *search { - s.raw = b - return s -} - -func (s *search) unscoped() *search { - s.Unscoped = true - return s -} - -func (s *search) Table(name string) *search { - s.tableName = name - return s -} - -func (s *search) getInterfaceAsSQL(value interface{}) (str string) { - switch value.(type) { - case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: - str = fmt.Sprintf("%v", value) - default: - s.db.AddError(ErrInvalidSQL) - } - - if str == "-1" { - return "" - } - return -} diff --git a/vendor/github.com/jinzhu/gorm/test_all.sh b/vendor/github.com/jinzhu/gorm/test_all.sh deleted file mode 100644 index 5cfb332..0000000 --- a/vendor/github.com/jinzhu/gorm/test_all.sh +++ /dev/null @@ -1,5 +0,0 @@ -dialects=("postgres" "mysql" "mssql" "sqlite") - -for dialect in "${dialects[@]}" ; do - DEBUG=false GORM_DIALECT=${dialect} go test -done diff --git a/vendor/github.com/jinzhu/gorm/utils.go b/vendor/github.com/jinzhu/gorm/utils.go deleted file mode 100644 index d2ae946..0000000 --- a/vendor/github.com/jinzhu/gorm/utils.go +++ /dev/null @@ -1,226 +0,0 @@ -package gorm - -import ( - "database/sql/driver" - "fmt" - "reflect" - "regexp" - "runtime" - "strings" - "sync" - "time" -) - -// NowFunc returns current time, this function is exported in order to be able -// to give the flexibility to the developer to customize it according to their -// needs, e.g: -// gorm.NowFunc = func() time.Time { -// return time.Now().UTC() -// } -var NowFunc = func() time.Time { - return time.Now() -} - -// Copied from golint -var commonInitialisms = []string{"API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "LHS", "QPS", "RAM", "RHS", "RPC", "SLA", "SMTP", "SSH", "TLS", "TTL", "UID", "UI", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XSRF", "XSS"} -var commonInitialismsReplacer *strings.Replacer - -var goSrcRegexp = regexp.MustCompile(`jinzhu/gorm(@.*)?/.*.go`) -var goTestRegexp = regexp.MustCompile(`jinzhu/gorm(@.*)?/.*test.go`) - -func init() { - var commonInitialismsForReplacer []string - for _, initialism := range commonInitialisms { - commonInitialismsForReplacer = append(commonInitialismsForReplacer, initialism, strings.Title(strings.ToLower(initialism))) - } - commonInitialismsReplacer = strings.NewReplacer(commonInitialismsForReplacer...) -} - -type safeMap struct { - m map[string]string - l *sync.RWMutex -} - -func (s *safeMap) Set(key string, value string) { - s.l.Lock() - defer s.l.Unlock() - s.m[key] = value -} - -func (s *safeMap) Get(key string) string { - s.l.RLock() - defer s.l.RUnlock() - return s.m[key] -} - -func newSafeMap() *safeMap { - return &safeMap{l: new(sync.RWMutex), m: make(map[string]string)} -} - -// SQL expression -type SqlExpr struct { - expr string - args []interface{} -} - -// Expr generate raw SQL expression, for example: -// DB.Model(&product).Update("price", gorm.Expr("price * ? + ?", 2, 100)) -func Expr(expression string, args ...interface{}) *SqlExpr { - return &SqlExpr{expr: expression, args: args} -} - -func indirect(reflectValue reflect.Value) reflect.Value { - for reflectValue.Kind() == reflect.Ptr { - reflectValue = reflectValue.Elem() - } - return reflectValue -} - -func toQueryMarks(primaryValues [][]interface{}) string { - var results []string - - for _, primaryValue := range primaryValues { - var marks []string - for range primaryValue { - marks = append(marks, "?") - } - - if len(marks) > 1 { - results = append(results, fmt.Sprintf("(%v)", strings.Join(marks, ","))) - } else { - results = append(results, strings.Join(marks, "")) - } - } - return strings.Join(results, ",") -} - -func toQueryCondition(scope *Scope, columns []string) string { - var newColumns []string - for _, column := range columns { - newColumns = append(newColumns, scope.Quote(column)) - } - - if len(columns) > 1 { - return fmt.Sprintf("(%v)", strings.Join(newColumns, ",")) - } - return strings.Join(newColumns, ",") -} - -func toQueryValues(values [][]interface{}) (results []interface{}) { - for _, value := range values { - for _, v := range value { - results = append(results, v) - } - } - return -} - -func fileWithLineNum() string { - for i := 2; i < 15; i++ { - _, file, line, ok := runtime.Caller(i) - if ok && (!goSrcRegexp.MatchString(file) || goTestRegexp.MatchString(file)) { - return fmt.Sprintf("%v:%v", file, line) - } - } - return "" -} - -func isBlank(value reflect.Value) bool { - switch value.Kind() { - case reflect.String: - return value.Len() == 0 - case reflect.Bool: - return !value.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return value.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return value.Uint() == 0 - case reflect.Float32, reflect.Float64: - return value.Float() == 0 - case reflect.Interface, reflect.Ptr: - return value.IsNil() - } - - return reflect.DeepEqual(value.Interface(), reflect.Zero(value.Type()).Interface()) -} - -func toSearchableMap(attrs ...interface{}) (result interface{}) { - if len(attrs) > 1 { - if str, ok := attrs[0].(string); ok { - result = map[string]interface{}{str: attrs[1]} - } - } else if len(attrs) == 1 { - if attr, ok := attrs[0].(map[string]interface{}); ok { - result = attr - } - - if attr, ok := attrs[0].(interface{}); ok { - result = attr - } - } - return -} - -func equalAsString(a interface{}, b interface{}) bool { - return toString(a) == toString(b) -} - -func toString(str interface{}) string { - if values, ok := str.([]interface{}); ok { - var results []string - for _, value := range values { - results = append(results, toString(value)) - } - return strings.Join(results, "_") - } else if bytes, ok := str.([]byte); ok { - return string(bytes) - } else if reflectValue := reflect.Indirect(reflect.ValueOf(str)); reflectValue.IsValid() { - return fmt.Sprintf("%v", reflectValue.Interface()) - } - return "" -} - -func makeSlice(elemType reflect.Type) interface{} { - if elemType.Kind() == reflect.Slice { - elemType = elemType.Elem() - } - sliceType := reflect.SliceOf(elemType) - slice := reflect.New(sliceType) - slice.Elem().Set(reflect.MakeSlice(sliceType, 0, 0)) - return slice.Interface() -} - -func strInSlice(a string, list []string) bool { - for _, b := range list { - if b == a { - return true - } - } - return false -} - -// getValueFromFields return given fields's value -func getValueFromFields(value reflect.Value, fieldNames []string) (results []interface{}) { - // If value is a nil pointer, Indirect returns a zero Value! - // Therefor we need to check for a zero value, - // as FieldByName could panic - if indirectValue := reflect.Indirect(value); indirectValue.IsValid() { - for _, fieldName := range fieldNames { - if fieldValue := reflect.Indirect(indirectValue.FieldByName(fieldName)); fieldValue.IsValid() { - result := fieldValue.Interface() - if r, ok := result.(driver.Valuer); ok { - result, _ = r.Value() - } - results = append(results, result) - } - } - } - return -} - -func addExtraSpaceIfExist(str string) string { - if str != "" { - return " " + str - } - return "" -} diff --git a/vendor/github.com/jinzhu/gorm/wercker.yml b/vendor/github.com/jinzhu/gorm/wercker.yml deleted file mode 100644 index c74fa4d..0000000 --- a/vendor/github.com/jinzhu/gorm/wercker.yml +++ /dev/null @@ -1,154 +0,0 @@ -# use the default golang container from Docker Hub -box: golang - -services: - - name: mariadb - id: mariadb:latest - env: - MYSQL_DATABASE: gorm - MYSQL_USER: gorm - MYSQL_PASSWORD: gorm - MYSQL_RANDOM_ROOT_PASSWORD: "yes" - - name: mysql - id: mysql:latest - env: - MYSQL_DATABASE: gorm - MYSQL_USER: gorm - MYSQL_PASSWORD: gorm - MYSQL_RANDOM_ROOT_PASSWORD: "yes" - - name: mysql57 - id: mysql:5.7 - env: - MYSQL_DATABASE: gorm - MYSQL_USER: gorm - MYSQL_PASSWORD: gorm - MYSQL_RANDOM_ROOT_PASSWORD: "yes" - - name: mysql56 - id: mysql:5.6 - env: - MYSQL_DATABASE: gorm - MYSQL_USER: gorm - MYSQL_PASSWORD: gorm - MYSQL_RANDOM_ROOT_PASSWORD: "yes" - - name: postgres - id: postgres:latest - env: - POSTGRES_USER: gorm - POSTGRES_PASSWORD: gorm - POSTGRES_DB: gorm - - name: postgres96 - id: postgres:9.6 - env: - POSTGRES_USER: gorm - POSTGRES_PASSWORD: gorm - POSTGRES_DB: gorm - - name: postgres95 - id: postgres:9.5 - env: - POSTGRES_USER: gorm - POSTGRES_PASSWORD: gorm - POSTGRES_DB: gorm - - name: postgres94 - id: postgres:9.4 - env: - POSTGRES_USER: gorm - POSTGRES_PASSWORD: gorm - POSTGRES_DB: gorm - - name: postgres93 - id: postgres:9.3 - env: - POSTGRES_USER: gorm - POSTGRES_PASSWORD: gorm - POSTGRES_DB: gorm - - name: mssql - id: mcmoe/mssqldocker:latest - env: - ACCEPT_EULA: Y - SA_PASSWORD: LoremIpsum86 - MSSQL_DB: gorm - MSSQL_USER: gorm - MSSQL_PASSWORD: LoremIpsum86 - -# The steps that will be executed in the build pipeline -build: - # The steps that will be executed on build - steps: - # Sets the go workspace and places you package - # at the right place in the workspace tree - - setup-go-workspace - - # Gets the dependencies - - script: - name: go get - code: | - cd $WERCKER_SOURCE_DIR - go version - go get -t -v ./... - - # Build the project - - script: - name: go build - code: | - go build ./... - - # Test the project - - script: - name: test sqlite - code: | - go test -race -v ./... - - - script: - name: test mariadb - code: | - GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mariadb:3306)/gorm?charset=utf8&parseTime=True" go test -race ./... - - - script: - name: test mysql - code: | - GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mysql:3306)/gorm?charset=utf8&parseTime=True" go test -race ./... - - - script: - name: test mysql5.7 - code: | - GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mysql57:3306)/gorm?charset=utf8&parseTime=True" go test -race ./... - - - script: - name: test mysql5.6 - code: | - GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mysql56:3306)/gorm?charset=utf8&parseTime=True" go test -race ./... - - - script: - name: test postgres - code: | - GORM_DIALECT=postgres GORM_DSN="host=postgres user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test -race ./... - - - script: - name: test postgres96 - code: | - GORM_DIALECT=postgres GORM_DSN="host=postgres96 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test -race ./... - - - script: - name: test postgres95 - code: | - GORM_DIALECT=postgres GORM_DSN="host=postgres95 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test -race ./... - - - script: - name: test postgres94 - code: | - GORM_DIALECT=postgres GORM_DSN="host=postgres94 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test -race ./... - - - script: - name: test postgres93 - code: | - GORM_DIALECT=postgres GORM_DSN="host=postgres93 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test -race ./... - - - script: - name: test mssql - code: | - GORM_DIALECT=mssql GORM_DSN="sqlserver://gorm:LoremIpsum86@mssql:1433?database=gorm" go test -race ./... - - - script: - name: codecov - code: | - go test -race -coverprofile=coverage.txt -covermode=atomic ./... - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/jinzhu/inflection/LICENSE b/vendor/github.com/jinzhu/inflection/LICENSE deleted file mode 100644 index a1ca9a0..0000000 --- a/vendor/github.com/jinzhu/inflection/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 - Jinzhu - -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. diff --git a/vendor/github.com/jinzhu/inflection/README.md b/vendor/github.com/jinzhu/inflection/README.md deleted file mode 100644 index a3de336..0000000 --- a/vendor/github.com/jinzhu/inflection/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# Inflection - -Inflection pluralizes and singularizes English nouns - -[![wercker status](https://app.wercker.com/status/f8c7432b097d1f4ce636879670be0930/s/master "wercker status")](https://app.wercker.com/project/byKey/f8c7432b097d1f4ce636879670be0930) - -## Basic Usage - -```go -inflection.Plural("person") => "people" -inflection.Plural("Person") => "People" -inflection.Plural("PERSON") => "PEOPLE" -inflection.Plural("bus") => "buses" -inflection.Plural("BUS") => "BUSES" -inflection.Plural("Bus") => "Buses" - -inflection.Singular("people") => "person" -inflection.Singular("People") => "Person" -inflection.Singular("PEOPLE") => "PERSON" -inflection.Singular("buses") => "bus" -inflection.Singular("BUSES") => "BUS" -inflection.Singular("Buses") => "Bus" - -inflection.Plural("FancyPerson") => "FancyPeople" -inflection.Singular("FancyPeople") => "FancyPerson" -``` - -## Register Rules - -Standard rules are from Rails's ActiveSupport (https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflections.rb) - -If you want to register more rules, follow: - -``` -inflection.AddUncountable("fish") -inflection.AddIrregular("person", "people") -inflection.AddPlural("(bu)s$", "${1}ses") # "bus" => "buses" / "BUS" => "BUSES" / "Bus" => "Buses" -inflection.AddSingular("(bus)(es)?$", "${1}") # "buses" => "bus" / "Buses" => "Bus" / "BUSES" => "BUS" -``` - -## Contributing - -You can help to make the project better, check out [http://gorm.io/contribute.html](http://gorm.io/contribute.html) for things you can do. - -## Author - -**jinzhu** - -* -* -* - -## License - -Released under the [MIT License](http://www.opensource.org/licenses/MIT). diff --git a/vendor/github.com/jinzhu/inflection/go.mod b/vendor/github.com/jinzhu/inflection/go.mod deleted file mode 100644 index 2fb7690..0000000 --- a/vendor/github.com/jinzhu/inflection/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/jinzhu/inflection diff --git a/vendor/github.com/jinzhu/inflection/inflections.go b/vendor/github.com/jinzhu/inflection/inflections.go deleted file mode 100644 index 606263b..0000000 --- a/vendor/github.com/jinzhu/inflection/inflections.go +++ /dev/null @@ -1,273 +0,0 @@ -/* -Package inflection pluralizes and singularizes English nouns. - - inflection.Plural("person") => "people" - inflection.Plural("Person") => "People" - inflection.Plural("PERSON") => "PEOPLE" - - inflection.Singular("people") => "person" - inflection.Singular("People") => "Person" - inflection.Singular("PEOPLE") => "PERSON" - - inflection.Plural("FancyPerson") => "FancydPeople" - inflection.Singular("FancyPeople") => "FancydPerson" - -Standard rules are from Rails's ActiveSupport (https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflections.rb) - -If you want to register more rules, follow: - - inflection.AddUncountable("fish") - inflection.AddIrregular("person", "people") - inflection.AddPlural("(bu)s$", "${1}ses") # "bus" => "buses" / "BUS" => "BUSES" / "Bus" => "Buses" - inflection.AddSingular("(bus)(es)?$", "${1}") # "buses" => "bus" / "Buses" => "Bus" / "BUSES" => "BUS" -*/ -package inflection - -import ( - "regexp" - "strings" -) - -type inflection struct { - regexp *regexp.Regexp - replace string -} - -// Regular is a regexp find replace inflection -type Regular struct { - find string - replace string -} - -// Irregular is a hard replace inflection, -// containing both singular and plural forms -type Irregular struct { - singular string - plural string -} - -// RegularSlice is a slice of Regular inflections -type RegularSlice []Regular - -// IrregularSlice is a slice of Irregular inflections -type IrregularSlice []Irregular - -var pluralInflections = RegularSlice{ - {"([a-z])$", "${1}s"}, - {"s$", "s"}, - {"^(ax|test)is$", "${1}es"}, - {"(octop|vir)us$", "${1}i"}, - {"(octop|vir)i$", "${1}i"}, - {"(alias|status)$", "${1}es"}, - {"(bu)s$", "${1}ses"}, - {"(buffal|tomat)o$", "${1}oes"}, - {"([ti])um$", "${1}a"}, - {"([ti])a$", "${1}a"}, - {"sis$", "ses"}, - {"(?:([^f])fe|([lr])f)$", "${1}${2}ves"}, - {"(hive)$", "${1}s"}, - {"([^aeiouy]|qu)y$", "${1}ies"}, - {"(x|ch|ss|sh)$", "${1}es"}, - {"(matr|vert|ind)(?:ix|ex)$", "${1}ices"}, - {"^(m|l)ouse$", "${1}ice"}, - {"^(m|l)ice$", "${1}ice"}, - {"^(ox)$", "${1}en"}, - {"^(oxen)$", "${1}"}, - {"(quiz)$", "${1}zes"}, -} - -var singularInflections = RegularSlice{ - {"s$", ""}, - {"(ss)$", "${1}"}, - {"(n)ews$", "${1}ews"}, - {"([ti])a$", "${1}um"}, - {"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$", "${1}sis"}, - {"(^analy)(sis|ses)$", "${1}sis"}, - {"([^f])ves$", "${1}fe"}, - {"(hive)s$", "${1}"}, - {"(tive)s$", "${1}"}, - {"([lr])ves$", "${1}f"}, - {"([^aeiouy]|qu)ies$", "${1}y"}, - {"(s)eries$", "${1}eries"}, - {"(m)ovies$", "${1}ovie"}, - {"(c)ookies$", "${1}ookie"}, - {"(x|ch|ss|sh)es$", "${1}"}, - {"^(m|l)ice$", "${1}ouse"}, - {"(bus)(es)?$", "${1}"}, - {"(o)es$", "${1}"}, - {"(shoe)s$", "${1}"}, - {"(cris|test)(is|es)$", "${1}is"}, - {"^(a)x[ie]s$", "${1}xis"}, - {"(octop|vir)(us|i)$", "${1}us"}, - {"(alias|status)(es)?$", "${1}"}, - {"^(ox)en", "${1}"}, - {"(vert|ind)ices$", "${1}ex"}, - {"(matr)ices$", "${1}ix"}, - {"(quiz)zes$", "${1}"}, - {"(database)s$", "${1}"}, -} - -var irregularInflections = IrregularSlice{ - {"person", "people"}, - {"man", "men"}, - {"child", "children"}, - {"sex", "sexes"}, - {"move", "moves"}, - {"mombie", "mombies"}, -} - -var uncountableInflections = []string{"equipment", "information", "rice", "money", "species", "series", "fish", "sheep", "jeans", "police"} - -var compiledPluralMaps []inflection -var compiledSingularMaps []inflection - -func compile() { - compiledPluralMaps = []inflection{} - compiledSingularMaps = []inflection{} - for _, uncountable := range uncountableInflections { - inf := inflection{ - regexp: regexp.MustCompile("^(?i)(" + uncountable + ")$"), - replace: "${1}", - } - compiledPluralMaps = append(compiledPluralMaps, inf) - compiledSingularMaps = append(compiledSingularMaps, inf) - } - - for _, value := range irregularInflections { - infs := []inflection{ - inflection{regexp: regexp.MustCompile(strings.ToUpper(value.singular) + "$"), replace: strings.ToUpper(value.plural)}, - inflection{regexp: regexp.MustCompile(strings.Title(value.singular) + "$"), replace: strings.Title(value.plural)}, - inflection{regexp: regexp.MustCompile(value.singular + "$"), replace: value.plural}, - } - compiledPluralMaps = append(compiledPluralMaps, infs...) - } - - for _, value := range irregularInflections { - infs := []inflection{ - inflection{regexp: regexp.MustCompile(strings.ToUpper(value.plural) + "$"), replace: strings.ToUpper(value.singular)}, - inflection{regexp: regexp.MustCompile(strings.Title(value.plural) + "$"), replace: strings.Title(value.singular)}, - inflection{regexp: regexp.MustCompile(value.plural + "$"), replace: value.singular}, - } - compiledSingularMaps = append(compiledSingularMaps, infs...) - } - - for i := len(pluralInflections) - 1; i >= 0; i-- { - value := pluralInflections[i] - infs := []inflection{ - inflection{regexp: regexp.MustCompile(strings.ToUpper(value.find)), replace: strings.ToUpper(value.replace)}, - inflection{regexp: regexp.MustCompile(value.find), replace: value.replace}, - inflection{regexp: regexp.MustCompile("(?i)" + value.find), replace: value.replace}, - } - compiledPluralMaps = append(compiledPluralMaps, infs...) - } - - for i := len(singularInflections) - 1; i >= 0; i-- { - value := singularInflections[i] - infs := []inflection{ - inflection{regexp: regexp.MustCompile(strings.ToUpper(value.find)), replace: strings.ToUpper(value.replace)}, - inflection{regexp: regexp.MustCompile(value.find), replace: value.replace}, - inflection{regexp: regexp.MustCompile("(?i)" + value.find), replace: value.replace}, - } - compiledSingularMaps = append(compiledSingularMaps, infs...) - } -} - -func init() { - compile() -} - -// AddPlural adds a plural inflection -func AddPlural(find, replace string) { - pluralInflections = append(pluralInflections, Regular{find, replace}) - compile() -} - -// AddSingular adds a singular inflection -func AddSingular(find, replace string) { - singularInflections = append(singularInflections, Regular{find, replace}) - compile() -} - -// AddIrregular adds an irregular inflection -func AddIrregular(singular, plural string) { - irregularInflections = append(irregularInflections, Irregular{singular, plural}) - compile() -} - -// AddUncountable adds an uncountable inflection -func AddUncountable(values ...string) { - uncountableInflections = append(uncountableInflections, values...) - compile() -} - -// GetPlural retrieves the plural inflection values -func GetPlural() RegularSlice { - plurals := make(RegularSlice, len(pluralInflections)) - copy(plurals, pluralInflections) - return plurals -} - -// GetSingular retrieves the singular inflection values -func GetSingular() RegularSlice { - singulars := make(RegularSlice, len(singularInflections)) - copy(singulars, singularInflections) - return singulars -} - -// GetIrregular retrieves the irregular inflection values -func GetIrregular() IrregularSlice { - irregular := make(IrregularSlice, len(irregularInflections)) - copy(irregular, irregularInflections) - return irregular -} - -// GetUncountable retrieves the uncountable inflection values -func GetUncountable() []string { - uncountables := make([]string, len(uncountableInflections)) - copy(uncountables, uncountableInflections) - return uncountables -} - -// SetPlural sets the plural inflections slice -func SetPlural(inflections RegularSlice) { - pluralInflections = inflections - compile() -} - -// SetSingular sets the singular inflections slice -func SetSingular(inflections RegularSlice) { - singularInflections = inflections - compile() -} - -// SetIrregular sets the irregular inflections slice -func SetIrregular(inflections IrregularSlice) { - irregularInflections = inflections - compile() -} - -// SetUncountable sets the uncountable inflections slice -func SetUncountable(inflections []string) { - uncountableInflections = inflections - compile() -} - -// Plural converts a word to its plural form -func Plural(str string) string { - for _, inflection := range compiledPluralMaps { - if inflection.regexp.MatchString(str) { - return inflection.regexp.ReplaceAllString(str, inflection.replace) - } - } - return str -} - -// Singular converts a word to its singular form -func Singular(str string) string { - for _, inflection := range compiledSingularMaps { - if inflection.regexp.MatchString(str) { - return inflection.regexp.ReplaceAllString(str, inflection.replace) - } - } - return str -} diff --git a/vendor/github.com/jinzhu/inflection/wercker.yml b/vendor/github.com/jinzhu/inflection/wercker.yml deleted file mode 100644 index 5e6ce98..0000000 --- a/vendor/github.com/jinzhu/inflection/wercker.yml +++ /dev/null @@ -1,23 +0,0 @@ -box: golang - -build: - steps: - - setup-go-workspace - - # Gets the dependencies - - script: - name: go get - code: | - go get - - # Build the project - - script: - name: go build - code: | - go build ./... - - # Test the project - - script: - name: go test - code: | - go test ./... diff --git a/vendor/github.com/json-iterator/go/.codecov.yml b/vendor/github.com/json-iterator/go/.codecov.yml deleted file mode 100644 index 955dc0b..0000000 --- a/vendor/github.com/json-iterator/go/.codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -ignore: - - "output_tests/.*" - diff --git a/vendor/github.com/json-iterator/go/.gitignore b/vendor/github.com/json-iterator/go/.gitignore deleted file mode 100644 index 1555653..0000000 --- a/vendor/github.com/json-iterator/go/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/vendor -/bug_test.go -/coverage.txt -/.idea diff --git a/vendor/github.com/json-iterator/go/.travis.yml b/vendor/github.com/json-iterator/go/.travis.yml deleted file mode 100644 index 449e67c..0000000 --- a/vendor/github.com/json-iterator/go/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: go - -go: - - 1.8.x - - 1.x - -before_install: - - go get -t -v ./... - -script: - - ./test.sh - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/json-iterator/go/Gopkg.lock b/vendor/github.com/json-iterator/go/Gopkg.lock deleted file mode 100644 index c8a9fbb..0000000 --- a/vendor/github.com/json-iterator/go/Gopkg.lock +++ /dev/null @@ -1,21 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/modern-go/concurrent" - packages = ["."] - revision = "e0a39a4cb4216ea8db28e22a69f4ec25610d513a" - version = "1.0.0" - -[[projects]] - name = "github.com/modern-go/reflect2" - packages = ["."] - revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" - version = "1.0.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "ea54a775e5a354cb015502d2e7aa4b74230fc77e894f34a838b268c25ec8eeb8" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/json-iterator/go/Gopkg.toml b/vendor/github.com/json-iterator/go/Gopkg.toml deleted file mode 100644 index 313a0f8..0000000 --- a/vendor/github.com/json-iterator/go/Gopkg.toml +++ /dev/null @@ -1,26 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - -ignored = ["github.com/davecgh/go-spew*","github.com/google/gofuzz*","github.com/stretchr/testify*"] - -[[constraint]] - name = "github.com/modern-go/reflect2" - version = "1.0.1" diff --git a/vendor/github.com/json-iterator/go/LICENSE b/vendor/github.com/json-iterator/go/LICENSE deleted file mode 100644 index 2cf4f5a..0000000 --- a/vendor/github.com/json-iterator/go/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 json-iterator - -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. diff --git a/vendor/github.com/json-iterator/go/README.md b/vendor/github.com/json-iterator/go/README.md deleted file mode 100644 index 50d56ff..0000000 --- a/vendor/github.com/json-iterator/go/README.md +++ /dev/null @@ -1,87 +0,0 @@ -[![Sourcegraph](https://sourcegraph.com/github.com/json-iterator/go/-/badge.svg)](https://sourcegraph.com/github.com/json-iterator/go?badge) -[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/json-iterator/go) -[![Build Status](https://travis-ci.org/json-iterator/go.svg?branch=master)](https://travis-ci.org/json-iterator/go) -[![codecov](https://codecov.io/gh/json-iterator/go/branch/master/graph/badge.svg)](https://codecov.io/gh/json-iterator/go) -[![rcard](https://goreportcard.com/badge/github.com/json-iterator/go)](https://goreportcard.com/report/github.com/json-iterator/go) -[![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/json-iterator/go/master/LICENSE) -[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby) - -A high-performance 100% compatible drop-in replacement of "encoding/json" - -You can also use thrift like JSON using [thrift-iterator](https://github.com/thrift-iterator/go) - -# Benchmark - -![benchmark](http://jsoniter.com/benchmarks/go-benchmark.png) - -Source code: https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go - -Raw Result (easyjson requires static code generation) - -| | ns/op | allocation bytes | allocation times | -| --- | --- | --- | --- | -| std decode | 35510 ns/op | 1960 B/op | 99 allocs/op | -| easyjson decode | 8499 ns/op | 160 B/op | 4 allocs/op | -| jsoniter decode | 5623 ns/op | 160 B/op | 3 allocs/op | -| std encode | 2213 ns/op | 712 B/op | 5 allocs/op | -| easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op | -| jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op | - -Always benchmark with your own workload. -The result depends heavily on the data input. - -# Usage - -100% compatibility with standard lib - -Replace - -```go -import "encoding/json" -json.Marshal(&data) -``` - -with - -```go -import "github.com/json-iterator/go" - -var json = jsoniter.ConfigCompatibleWithStandardLibrary -json.Marshal(&data) -``` - -Replace - -```go -import "encoding/json" -json.Unmarshal(input, &data) -``` - -with - -```go -import "github.com/json-iterator/go" - -var json = jsoniter.ConfigCompatibleWithStandardLibrary -json.Unmarshal(input, &data) -``` - -[More documentation](http://jsoniter.com/migrate-from-go-std.html) - -# How to get - -``` -go get github.com/json-iterator/go -``` - -# Contribution Welcomed ! - -Contributors - -* [thockin](https://github.com/thockin) -* [mattn](https://github.com/mattn) -* [cch123](https://github.com/cch123) -* [Oleg Shaldybin](https://github.com/olegshaldybin) -* [Jason Toffaletti](https://github.com/toffaletti) - -Report issue or pull request, or email taowen@gmail.com, or [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby) diff --git a/vendor/github.com/json-iterator/go/adapter.go b/vendor/github.com/json-iterator/go/adapter.go deleted file mode 100644 index 92d2cc4..0000000 --- a/vendor/github.com/json-iterator/go/adapter.go +++ /dev/null @@ -1,150 +0,0 @@ -package jsoniter - -import ( - "bytes" - "io" -) - -// RawMessage to make replace json with jsoniter -type RawMessage []byte - -// Unmarshal adapts to json/encoding Unmarshal API -// -// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. -// Refer to https://godoc.org/encoding/json#Unmarshal for more information -func Unmarshal(data []byte, v interface{}) error { - return ConfigDefault.Unmarshal(data, v) -} - -// UnmarshalFromString is a convenient method to read from string instead of []byte -func UnmarshalFromString(str string, v interface{}) error { - return ConfigDefault.UnmarshalFromString(str, v) -} - -// Get quick method to get value from deeply nested JSON structure -func Get(data []byte, path ...interface{}) Any { - return ConfigDefault.Get(data, path...) -} - -// Marshal adapts to json/encoding Marshal API -// -// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API -// Refer to https://godoc.org/encoding/json#Marshal for more information -func Marshal(v interface{}) ([]byte, error) { - return ConfigDefault.Marshal(v) -} - -// MarshalIndent same as json.MarshalIndent. Prefix is not supported. -func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { - return ConfigDefault.MarshalIndent(v, prefix, indent) -} - -// MarshalToString convenient method to write as string instead of []byte -func MarshalToString(v interface{}) (string, error) { - return ConfigDefault.MarshalToString(v) -} - -// NewDecoder adapts to json/stream NewDecoder API. -// -// NewDecoder returns a new decoder that reads from r. -// -// Instead of a json/encoding Decoder, an Decoder is returned -// Refer to https://godoc.org/encoding/json#NewDecoder for more information -func NewDecoder(reader io.Reader) *Decoder { - return ConfigDefault.NewDecoder(reader) -} - -// Decoder reads and decodes JSON values from an input stream. -// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress) -type Decoder struct { - iter *Iterator -} - -// Decode decode JSON into interface{} -func (adapter *Decoder) Decode(obj interface{}) error { - if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil { - if !adapter.iter.loadMore() { - return io.EOF - } - } - adapter.iter.ReadVal(obj) - err := adapter.iter.Error - if err == io.EOF { - return nil - } - return adapter.iter.Error -} - -// More is there more? -func (adapter *Decoder) More() bool { - iter := adapter.iter - if iter.Error != nil { - return false - } - c := iter.nextToken() - if c == 0 { - return false - } - iter.unreadByte() - return c != ']' && c != '}' -} - -// Buffered remaining buffer -func (adapter *Decoder) Buffered() io.Reader { - remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail] - return bytes.NewReader(remaining) -} - -// UseNumber causes the Decoder to unmarshal a number into an interface{} as a -// Number instead of as a float64. -func (adapter *Decoder) UseNumber() { - cfg := adapter.iter.cfg.configBeforeFrozen - cfg.UseNumber = true - adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions) -} - -// DisallowUnknownFields causes the Decoder to return an error when the destination -// is a struct and the input contains object keys which do not match any -// non-ignored, exported fields in the destination. -func (adapter *Decoder) DisallowUnknownFields() { - cfg := adapter.iter.cfg.configBeforeFrozen - cfg.DisallowUnknownFields = true - adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions) -} - -// NewEncoder same as json.NewEncoder -func NewEncoder(writer io.Writer) *Encoder { - return ConfigDefault.NewEncoder(writer) -} - -// Encoder same as json.Encoder -type Encoder struct { - stream *Stream -} - -// Encode encode interface{} as JSON to io.Writer -func (adapter *Encoder) Encode(val interface{}) error { - adapter.stream.WriteVal(val) - adapter.stream.WriteRaw("\n") - adapter.stream.Flush() - return adapter.stream.Error -} - -// SetIndent set the indention. Prefix is not supported -func (adapter *Encoder) SetIndent(prefix, indent string) { - config := adapter.stream.cfg.configBeforeFrozen - config.IndentionStep = len(indent) - adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions) -} - -// SetEscapeHTML escape html by default, set to false to disable -func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) { - config := adapter.stream.cfg.configBeforeFrozen - config.EscapeHTML = escapeHTML - adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions) -} - -// Valid reports whether data is a valid JSON encoding. -func Valid(data []byte) bool { - return ConfigDefault.Valid(data) -} diff --git a/vendor/github.com/json-iterator/go/any.go b/vendor/github.com/json-iterator/go/any.go deleted file mode 100644 index f6b8aea..0000000 --- a/vendor/github.com/json-iterator/go/any.go +++ /dev/null @@ -1,325 +0,0 @@ -package jsoniter - -import ( - "errors" - "fmt" - "github.com/modern-go/reflect2" - "io" - "reflect" - "strconv" - "unsafe" -) - -// Any generic object representation. -// The lazy json implementation holds []byte and parse lazily. -type Any interface { - LastError() error - ValueType() ValueType - MustBeValid() Any - ToBool() bool - ToInt() int - ToInt32() int32 - ToInt64() int64 - ToUint() uint - ToUint32() uint32 - ToUint64() uint64 - ToFloat32() float32 - ToFloat64() float64 - ToString() string - ToVal(val interface{}) - Get(path ...interface{}) Any - Size() int - Keys() []string - GetInterface() interface{} - WriteTo(stream *Stream) -} - -type baseAny struct{} - -func (any *baseAny) Get(path ...interface{}) Any { - return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} -} - -func (any *baseAny) Size() int { - return 0 -} - -func (any *baseAny) Keys() []string { - return []string{} -} - -func (any *baseAny) ToVal(obj interface{}) { - panic("not implemented") -} - -// WrapInt32 turn int32 into Any interface -func WrapInt32(val int32) Any { - return &int32Any{baseAny{}, val} -} - -// WrapInt64 turn int64 into Any interface -func WrapInt64(val int64) Any { - return &int64Any{baseAny{}, val} -} - -// WrapUint32 turn uint32 into Any interface -func WrapUint32(val uint32) Any { - return &uint32Any{baseAny{}, val} -} - -// WrapUint64 turn uint64 into Any interface -func WrapUint64(val uint64) Any { - return &uint64Any{baseAny{}, val} -} - -// WrapFloat64 turn float64 into Any interface -func WrapFloat64(val float64) Any { - return &floatAny{baseAny{}, val} -} - -// WrapString turn string into Any interface -func WrapString(val string) Any { - return &stringAny{baseAny{}, val} -} - -// Wrap turn a go object into Any interface -func Wrap(val interface{}) Any { - if val == nil { - return &nilAny{} - } - asAny, isAny := val.(Any) - if isAny { - return asAny - } - typ := reflect2.TypeOf(val) - switch typ.Kind() { - case reflect.Slice: - return wrapArray(val) - case reflect.Struct: - return wrapStruct(val) - case reflect.Map: - return wrapMap(val) - case reflect.String: - return WrapString(val.(string)) - case reflect.Int: - if strconv.IntSize == 32 { - return WrapInt32(int32(val.(int))) - } - return WrapInt64(int64(val.(int))) - case reflect.Int8: - return WrapInt32(int32(val.(int8))) - case reflect.Int16: - return WrapInt32(int32(val.(int16))) - case reflect.Int32: - return WrapInt32(val.(int32)) - case reflect.Int64: - return WrapInt64(val.(int64)) - case reflect.Uint: - if strconv.IntSize == 32 { - return WrapUint32(uint32(val.(uint))) - } - return WrapUint64(uint64(val.(uint))) - case reflect.Uintptr: - if ptrSize == 32 { - return WrapUint32(uint32(val.(uintptr))) - } - return WrapUint64(uint64(val.(uintptr))) - case reflect.Uint8: - return WrapUint32(uint32(val.(uint8))) - case reflect.Uint16: - return WrapUint32(uint32(val.(uint16))) - case reflect.Uint32: - return WrapUint32(uint32(val.(uint32))) - case reflect.Uint64: - return WrapUint64(val.(uint64)) - case reflect.Float32: - return WrapFloat64(float64(val.(float32))) - case reflect.Float64: - return WrapFloat64(val.(float64)) - case reflect.Bool: - if val.(bool) == true { - return &trueAny{} - } - return &falseAny{} - } - return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", typ)} -} - -// ReadAny read next JSON element as an Any object. It is a better json.RawMessage. -func (iter *Iterator) ReadAny() Any { - return iter.readAny() -} - -func (iter *Iterator) readAny() Any { - c := iter.nextToken() - switch c { - case '"': - iter.unreadByte() - return &stringAny{baseAny{}, iter.ReadString()} - case 'n': - iter.skipThreeBytes('u', 'l', 'l') // null - return &nilAny{} - case 't': - iter.skipThreeBytes('r', 'u', 'e') // true - return &trueAny{} - case 'f': - iter.skipFourBytes('a', 'l', 's', 'e') // false - return &falseAny{} - case '{': - return iter.readObjectAny() - case '[': - return iter.readArrayAny() - case '-': - return iter.readNumberAny(false) - case 0: - return &invalidAny{baseAny{}, errors.New("input is empty")} - default: - return iter.readNumberAny(true) - } -} - -func (iter *Iterator) readNumberAny(positive bool) Any { - iter.startCapture(iter.head - 1) - iter.skipNumber() - lazyBuf := iter.stopCapture() - return &numberLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} -} - -func (iter *Iterator) readObjectAny() Any { - iter.startCapture(iter.head - 1) - iter.skipObject() - lazyBuf := iter.stopCapture() - return &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} -} - -func (iter *Iterator) readArrayAny() Any { - iter.startCapture(iter.head - 1) - iter.skipArray() - lazyBuf := iter.stopCapture() - return &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} -} - -func locateObjectField(iter *Iterator, target string) []byte { - var found []byte - iter.ReadObjectCB(func(iter *Iterator, field string) bool { - if field == target { - found = iter.SkipAndReturnBytes() - return false - } - iter.Skip() - return true - }) - return found -} - -func locateArrayElement(iter *Iterator, target int) []byte { - var found []byte - n := 0 - iter.ReadArrayCB(func(iter *Iterator) bool { - if n == target { - found = iter.SkipAndReturnBytes() - return false - } - iter.Skip() - n++ - return true - }) - return found -} - -func locatePath(iter *Iterator, path []interface{}) Any { - for i, pathKeyObj := range path { - switch pathKey := pathKeyObj.(type) { - case string: - valueBytes := locateObjectField(iter, pathKey) - if valueBytes == nil { - return newInvalidAny(path[i:]) - } - iter.ResetBytes(valueBytes) - case int: - valueBytes := locateArrayElement(iter, pathKey) - if valueBytes == nil { - return newInvalidAny(path[i:]) - } - iter.ResetBytes(valueBytes) - case int32: - if '*' == pathKey { - return iter.readAny().Get(path[i:]...) - } - return newInvalidAny(path[i:]) - default: - return newInvalidAny(path[i:]) - } - } - if iter.Error != nil && iter.Error != io.EOF { - return &invalidAny{baseAny{}, iter.Error} - } - return iter.readAny() -} - -var anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem() - -func createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ == anyType { - return &directAnyCodec{} - } - if typ.Implements(anyType) { - return &anyCodec{ - valType: typ, - } - } - return nil -} - -func createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == anyType { - return &directAnyCodec{} - } - if typ.Implements(anyType) { - return &anyCodec{ - valType: typ, - } - } - return nil -} - -type anyCodec struct { - valType reflect2.Type -} - -func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - panic("not implemented") -} - -func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := codec.valType.UnsafeIndirect(ptr) - any := obj.(Any) - any.WriteTo(stream) -} - -func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { - obj := codec.valType.UnsafeIndirect(ptr) - any := obj.(Any) - return any.Size() == 0 -} - -type directAnyCodec struct { -} - -func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *(*Any)(ptr) = iter.readAny() -} - -func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - any := *(*Any)(ptr) - if any == nil { - stream.WriteNil() - return - } - any.WriteTo(stream) -} - -func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool { - any := *(*Any)(ptr) - return any.Size() == 0 -} diff --git a/vendor/github.com/json-iterator/go/any_array.go b/vendor/github.com/json-iterator/go/any_array.go deleted file mode 100644 index 0449e9a..0000000 --- a/vendor/github.com/json-iterator/go/any_array.go +++ /dev/null @@ -1,278 +0,0 @@ -package jsoniter - -import ( - "reflect" - "unsafe" -) - -type arrayLazyAny struct { - baseAny - cfg *frozenConfig - buf []byte - err error -} - -func (any *arrayLazyAny) ValueType() ValueType { - return ArrayValue -} - -func (any *arrayLazyAny) MustBeValid() Any { - return any -} - -func (any *arrayLazyAny) LastError() error { - return any.err -} - -func (any *arrayLazyAny) ToBool() bool { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.ReadArray() -} - -func (any *arrayLazyAny) ToInt() int { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToInt32() int32 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToInt64() int64 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToUint() uint { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToUint32() uint32 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToUint64() uint64 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToFloat32() float32 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToFloat64() float64 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToString() string { - return *(*string)(unsafe.Pointer(&any.buf)) -} - -func (any *arrayLazyAny) ToVal(val interface{}) { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadVal(val) -} - -func (any *arrayLazyAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case int: - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - valueBytes := locateArrayElement(iter, firstPath) - if valueBytes == nil { - return newInvalidAny(path) - } - iter.ResetBytes(valueBytes) - return locatePath(iter, path[1:]) - case int32: - if '*' == firstPath { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - arr := make([]Any, 0) - iter.ReadArrayCB(func(iter *Iterator) bool { - found := iter.readAny().Get(path[1:]...) - if found.ValueType() != InvalidValue { - arr = append(arr, found) - } - return true - }) - return wrapArray(arr) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *arrayLazyAny) Size() int { - size := 0 - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadArrayCB(func(iter *Iterator) bool { - size++ - iter.Skip() - return true - }) - return size -} - -func (any *arrayLazyAny) WriteTo(stream *Stream) { - stream.Write(any.buf) -} - -func (any *arrayLazyAny) GetInterface() interface{} { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.Read() -} - -type arrayAny struct { - baseAny - val reflect.Value -} - -func wrapArray(val interface{}) *arrayAny { - return &arrayAny{baseAny{}, reflect.ValueOf(val)} -} - -func (any *arrayAny) ValueType() ValueType { - return ArrayValue -} - -func (any *arrayAny) MustBeValid() Any { - return any -} - -func (any *arrayAny) LastError() error { - return nil -} - -func (any *arrayAny) ToBool() bool { - return any.val.Len() != 0 -} - -func (any *arrayAny) ToInt() int { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToInt32() int32 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToInt64() int64 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToUint() uint { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToUint32() uint32 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToUint64() uint64 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToFloat32() float32 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToFloat64() float64 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToString() string { - str, _ := MarshalToString(any.val.Interface()) - return str -} - -func (any *arrayAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case int: - if firstPath < 0 || firstPath >= any.val.Len() { - return newInvalidAny(path) - } - return Wrap(any.val.Index(firstPath).Interface()) - case int32: - if '*' == firstPath { - mappedAll := make([]Any, 0) - for i := 0; i < any.val.Len(); i++ { - mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...) - if mapped.ValueType() != InvalidValue { - mappedAll = append(mappedAll, mapped) - } - } - return wrapArray(mappedAll) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *arrayAny) Size() int { - return any.val.Len() -} - -func (any *arrayAny) WriteTo(stream *Stream) { - stream.WriteVal(any.val) -} - -func (any *arrayAny) GetInterface() interface{} { - return any.val.Interface() -} diff --git a/vendor/github.com/json-iterator/go/any_bool.go b/vendor/github.com/json-iterator/go/any_bool.go deleted file mode 100644 index 9452324..0000000 --- a/vendor/github.com/json-iterator/go/any_bool.go +++ /dev/null @@ -1,137 +0,0 @@ -package jsoniter - -type trueAny struct { - baseAny -} - -func (any *trueAny) LastError() error { - return nil -} - -func (any *trueAny) ToBool() bool { - return true -} - -func (any *trueAny) ToInt() int { - return 1 -} - -func (any *trueAny) ToInt32() int32 { - return 1 -} - -func (any *trueAny) ToInt64() int64 { - return 1 -} - -func (any *trueAny) ToUint() uint { - return 1 -} - -func (any *trueAny) ToUint32() uint32 { - return 1 -} - -func (any *trueAny) ToUint64() uint64 { - return 1 -} - -func (any *trueAny) ToFloat32() float32 { - return 1 -} - -func (any *trueAny) ToFloat64() float64 { - return 1 -} - -func (any *trueAny) ToString() string { - return "true" -} - -func (any *trueAny) WriteTo(stream *Stream) { - stream.WriteTrue() -} - -func (any *trueAny) Parse() *Iterator { - return nil -} - -func (any *trueAny) GetInterface() interface{} { - return true -} - -func (any *trueAny) ValueType() ValueType { - return BoolValue -} - -func (any *trueAny) MustBeValid() Any { - return any -} - -type falseAny struct { - baseAny -} - -func (any *falseAny) LastError() error { - return nil -} - -func (any *falseAny) ToBool() bool { - return false -} - -func (any *falseAny) ToInt() int { - return 0 -} - -func (any *falseAny) ToInt32() int32 { - return 0 -} - -func (any *falseAny) ToInt64() int64 { - return 0 -} - -func (any *falseAny) ToUint() uint { - return 0 -} - -func (any *falseAny) ToUint32() uint32 { - return 0 -} - -func (any *falseAny) ToUint64() uint64 { - return 0 -} - -func (any *falseAny) ToFloat32() float32 { - return 0 -} - -func (any *falseAny) ToFloat64() float64 { - return 0 -} - -func (any *falseAny) ToString() string { - return "false" -} - -func (any *falseAny) WriteTo(stream *Stream) { - stream.WriteFalse() -} - -func (any *falseAny) Parse() *Iterator { - return nil -} - -func (any *falseAny) GetInterface() interface{} { - return false -} - -func (any *falseAny) ValueType() ValueType { - return BoolValue -} - -func (any *falseAny) MustBeValid() Any { - return any -} diff --git a/vendor/github.com/json-iterator/go/any_float.go b/vendor/github.com/json-iterator/go/any_float.go deleted file mode 100644 index 35fdb09..0000000 --- a/vendor/github.com/json-iterator/go/any_float.go +++ /dev/null @@ -1,83 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type floatAny struct { - baseAny - val float64 -} - -func (any *floatAny) Parse() *Iterator { - return nil -} - -func (any *floatAny) ValueType() ValueType { - return NumberValue -} - -func (any *floatAny) MustBeValid() Any { - return any -} - -func (any *floatAny) LastError() error { - return nil -} - -func (any *floatAny) ToBool() bool { - return any.ToFloat64() != 0 -} - -func (any *floatAny) ToInt() int { - return int(any.val) -} - -func (any *floatAny) ToInt32() int32 { - return int32(any.val) -} - -func (any *floatAny) ToInt64() int64 { - return int64(any.val) -} - -func (any *floatAny) ToUint() uint { - if any.val > 0 { - return uint(any.val) - } - return 0 -} - -func (any *floatAny) ToUint32() uint32 { - if any.val > 0 { - return uint32(any.val) - } - return 0 -} - -func (any *floatAny) ToUint64() uint64 { - if any.val > 0 { - return uint64(any.val) - } - return 0 -} - -func (any *floatAny) ToFloat32() float32 { - return float32(any.val) -} - -func (any *floatAny) ToFloat64() float64 { - return any.val -} - -func (any *floatAny) ToString() string { - return strconv.FormatFloat(any.val, 'E', -1, 64) -} - -func (any *floatAny) WriteTo(stream *Stream) { - stream.WriteFloat64(any.val) -} - -func (any *floatAny) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_int32.go b/vendor/github.com/json-iterator/go/any_int32.go deleted file mode 100644 index 1b56f39..0000000 --- a/vendor/github.com/json-iterator/go/any_int32.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type int32Any struct { - baseAny - val int32 -} - -func (any *int32Any) LastError() error { - return nil -} - -func (any *int32Any) ValueType() ValueType { - return NumberValue -} - -func (any *int32Any) MustBeValid() Any { - return any -} - -func (any *int32Any) ToBool() bool { - return any.val != 0 -} - -func (any *int32Any) ToInt() int { - return int(any.val) -} - -func (any *int32Any) ToInt32() int32 { - return any.val -} - -func (any *int32Any) ToInt64() int64 { - return int64(any.val) -} - -func (any *int32Any) ToUint() uint { - return uint(any.val) -} - -func (any *int32Any) ToUint32() uint32 { - return uint32(any.val) -} - -func (any *int32Any) ToUint64() uint64 { - return uint64(any.val) -} - -func (any *int32Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *int32Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *int32Any) ToString() string { - return strconv.FormatInt(int64(any.val), 10) -} - -func (any *int32Any) WriteTo(stream *Stream) { - stream.WriteInt32(any.val) -} - -func (any *int32Any) Parse() *Iterator { - return nil -} - -func (any *int32Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_int64.go b/vendor/github.com/json-iterator/go/any_int64.go deleted file mode 100644 index c440d72..0000000 --- a/vendor/github.com/json-iterator/go/any_int64.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type int64Any struct { - baseAny - val int64 -} - -func (any *int64Any) LastError() error { - return nil -} - -func (any *int64Any) ValueType() ValueType { - return NumberValue -} - -func (any *int64Any) MustBeValid() Any { - return any -} - -func (any *int64Any) ToBool() bool { - return any.val != 0 -} - -func (any *int64Any) ToInt() int { - return int(any.val) -} - -func (any *int64Any) ToInt32() int32 { - return int32(any.val) -} - -func (any *int64Any) ToInt64() int64 { - return any.val -} - -func (any *int64Any) ToUint() uint { - return uint(any.val) -} - -func (any *int64Any) ToUint32() uint32 { - return uint32(any.val) -} - -func (any *int64Any) ToUint64() uint64 { - return uint64(any.val) -} - -func (any *int64Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *int64Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *int64Any) ToString() string { - return strconv.FormatInt(any.val, 10) -} - -func (any *int64Any) WriteTo(stream *Stream) { - stream.WriteInt64(any.val) -} - -func (any *int64Any) Parse() *Iterator { - return nil -} - -func (any *int64Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_invalid.go b/vendor/github.com/json-iterator/go/any_invalid.go deleted file mode 100644 index 1d859ea..0000000 --- a/vendor/github.com/json-iterator/go/any_invalid.go +++ /dev/null @@ -1,82 +0,0 @@ -package jsoniter - -import "fmt" - -type invalidAny struct { - baseAny - err error -} - -func newInvalidAny(path []interface{}) *invalidAny { - return &invalidAny{baseAny{}, fmt.Errorf("%v not found", path)} -} - -func (any *invalidAny) LastError() error { - return any.err -} - -func (any *invalidAny) ValueType() ValueType { - return InvalidValue -} - -func (any *invalidAny) MustBeValid() Any { - panic(any.err) -} - -func (any *invalidAny) ToBool() bool { - return false -} - -func (any *invalidAny) ToInt() int { - return 0 -} - -func (any *invalidAny) ToInt32() int32 { - return 0 -} - -func (any *invalidAny) ToInt64() int64 { - return 0 -} - -func (any *invalidAny) ToUint() uint { - return 0 -} - -func (any *invalidAny) ToUint32() uint32 { - return 0 -} - -func (any *invalidAny) ToUint64() uint64 { - return 0 -} - -func (any *invalidAny) ToFloat32() float32 { - return 0 -} - -func (any *invalidAny) ToFloat64() float64 { - return 0 -} - -func (any *invalidAny) ToString() string { - return "" -} - -func (any *invalidAny) WriteTo(stream *Stream) { -} - -func (any *invalidAny) Get(path ...interface{}) Any { - if any.err == nil { - return &invalidAny{baseAny{}, fmt.Errorf("get %v from invalid", path)} - } - return &invalidAny{baseAny{}, fmt.Errorf("%v, get %v from invalid", any.err, path)} -} - -func (any *invalidAny) Parse() *Iterator { - return nil -} - -func (any *invalidAny) GetInterface() interface{} { - return nil -} diff --git a/vendor/github.com/json-iterator/go/any_nil.go b/vendor/github.com/json-iterator/go/any_nil.go deleted file mode 100644 index d04cb54..0000000 --- a/vendor/github.com/json-iterator/go/any_nil.go +++ /dev/null @@ -1,69 +0,0 @@ -package jsoniter - -type nilAny struct { - baseAny -} - -func (any *nilAny) LastError() error { - return nil -} - -func (any *nilAny) ValueType() ValueType { - return NilValue -} - -func (any *nilAny) MustBeValid() Any { - return any -} - -func (any *nilAny) ToBool() bool { - return false -} - -func (any *nilAny) ToInt() int { - return 0 -} - -func (any *nilAny) ToInt32() int32 { - return 0 -} - -func (any *nilAny) ToInt64() int64 { - return 0 -} - -func (any *nilAny) ToUint() uint { - return 0 -} - -func (any *nilAny) ToUint32() uint32 { - return 0 -} - -func (any *nilAny) ToUint64() uint64 { - return 0 -} - -func (any *nilAny) ToFloat32() float32 { - return 0 -} - -func (any *nilAny) ToFloat64() float64 { - return 0 -} - -func (any *nilAny) ToString() string { - return "" -} - -func (any *nilAny) WriteTo(stream *Stream) { - stream.WriteNil() -} - -func (any *nilAny) Parse() *Iterator { - return nil -} - -func (any *nilAny) GetInterface() interface{} { - return nil -} diff --git a/vendor/github.com/json-iterator/go/any_number.go b/vendor/github.com/json-iterator/go/any_number.go deleted file mode 100644 index 9d1e901..0000000 --- a/vendor/github.com/json-iterator/go/any_number.go +++ /dev/null @@ -1,123 +0,0 @@ -package jsoniter - -import ( - "io" - "unsafe" -) - -type numberLazyAny struct { - baseAny - cfg *frozenConfig - buf []byte - err error -} - -func (any *numberLazyAny) ValueType() ValueType { - return NumberValue -} - -func (any *numberLazyAny) MustBeValid() Any { - return any -} - -func (any *numberLazyAny) LastError() error { - return any.err -} - -func (any *numberLazyAny) ToBool() bool { - return any.ToFloat64() != 0 -} - -func (any *numberLazyAny) ToInt() int { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadInt() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToInt32() int32 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadInt32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToInt64() int64 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadInt64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToUint() uint { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadUint() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToUint32() uint32 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadUint32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToUint64() uint64 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadUint64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToFloat32() float32 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadFloat32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToFloat64() float64 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadFloat64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToString() string { - return *(*string)(unsafe.Pointer(&any.buf)) -} - -func (any *numberLazyAny) WriteTo(stream *Stream) { - stream.Write(any.buf) -} - -func (any *numberLazyAny) GetInterface() interface{} { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.Read() -} diff --git a/vendor/github.com/json-iterator/go/any_object.go b/vendor/github.com/json-iterator/go/any_object.go deleted file mode 100644 index c44ef5c..0000000 --- a/vendor/github.com/json-iterator/go/any_object.go +++ /dev/null @@ -1,374 +0,0 @@ -package jsoniter - -import ( - "reflect" - "unsafe" -) - -type objectLazyAny struct { - baseAny - cfg *frozenConfig - buf []byte - err error -} - -func (any *objectLazyAny) ValueType() ValueType { - return ObjectValue -} - -func (any *objectLazyAny) MustBeValid() Any { - return any -} - -func (any *objectLazyAny) LastError() error { - return any.err -} - -func (any *objectLazyAny) ToBool() bool { - return true -} - -func (any *objectLazyAny) ToInt() int { - return 0 -} - -func (any *objectLazyAny) ToInt32() int32 { - return 0 -} - -func (any *objectLazyAny) ToInt64() int64 { - return 0 -} - -func (any *objectLazyAny) ToUint() uint { - return 0 -} - -func (any *objectLazyAny) ToUint32() uint32 { - return 0 -} - -func (any *objectLazyAny) ToUint64() uint64 { - return 0 -} - -func (any *objectLazyAny) ToFloat32() float32 { - return 0 -} - -func (any *objectLazyAny) ToFloat64() float64 { - return 0 -} - -func (any *objectLazyAny) ToString() string { - return *(*string)(unsafe.Pointer(&any.buf)) -} - -func (any *objectLazyAny) ToVal(obj interface{}) { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadVal(obj) -} - -func (any *objectLazyAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case string: - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - valueBytes := locateObjectField(iter, firstPath) - if valueBytes == nil { - return newInvalidAny(path) - } - iter.ResetBytes(valueBytes) - return locatePath(iter, path[1:]) - case int32: - if '*' == firstPath { - mappedAll := map[string]Any{} - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadMapCB(func(iter *Iterator, field string) bool { - mapped := locatePath(iter, path[1:]) - if mapped.ValueType() != InvalidValue { - mappedAll[field] = mapped - } - return true - }) - return wrapMap(mappedAll) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *objectLazyAny) Keys() []string { - keys := []string{} - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadMapCB(func(iter *Iterator, field string) bool { - iter.Skip() - keys = append(keys, field) - return true - }) - return keys -} - -func (any *objectLazyAny) Size() int { - size := 0 - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadObjectCB(func(iter *Iterator, field string) bool { - iter.Skip() - size++ - return true - }) - return size -} - -func (any *objectLazyAny) WriteTo(stream *Stream) { - stream.Write(any.buf) -} - -func (any *objectLazyAny) GetInterface() interface{} { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.Read() -} - -type objectAny struct { - baseAny - err error - val reflect.Value -} - -func wrapStruct(val interface{}) *objectAny { - return &objectAny{baseAny{}, nil, reflect.ValueOf(val)} -} - -func (any *objectAny) ValueType() ValueType { - return ObjectValue -} - -func (any *objectAny) MustBeValid() Any { - return any -} - -func (any *objectAny) Parse() *Iterator { - return nil -} - -func (any *objectAny) LastError() error { - return any.err -} - -func (any *objectAny) ToBool() bool { - return any.val.NumField() != 0 -} - -func (any *objectAny) ToInt() int { - return 0 -} - -func (any *objectAny) ToInt32() int32 { - return 0 -} - -func (any *objectAny) ToInt64() int64 { - return 0 -} - -func (any *objectAny) ToUint() uint { - return 0 -} - -func (any *objectAny) ToUint32() uint32 { - return 0 -} - -func (any *objectAny) ToUint64() uint64 { - return 0 -} - -func (any *objectAny) ToFloat32() float32 { - return 0 -} - -func (any *objectAny) ToFloat64() float64 { - return 0 -} - -func (any *objectAny) ToString() string { - str, err := MarshalToString(any.val.Interface()) - any.err = err - return str -} - -func (any *objectAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case string: - field := any.val.FieldByName(firstPath) - if !field.IsValid() { - return newInvalidAny(path) - } - return Wrap(field.Interface()) - case int32: - if '*' == firstPath { - mappedAll := map[string]Any{} - for i := 0; i < any.val.NumField(); i++ { - field := any.val.Field(i) - if field.CanInterface() { - mapped := Wrap(field.Interface()).Get(path[1:]...) - if mapped.ValueType() != InvalidValue { - mappedAll[any.val.Type().Field(i).Name] = mapped - } - } - } - return wrapMap(mappedAll) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *objectAny) Keys() []string { - keys := make([]string, 0, any.val.NumField()) - for i := 0; i < any.val.NumField(); i++ { - keys = append(keys, any.val.Type().Field(i).Name) - } - return keys -} - -func (any *objectAny) Size() int { - return any.val.NumField() -} - -func (any *objectAny) WriteTo(stream *Stream) { - stream.WriteVal(any.val) -} - -func (any *objectAny) GetInterface() interface{} { - return any.val.Interface() -} - -type mapAny struct { - baseAny - err error - val reflect.Value -} - -func wrapMap(val interface{}) *mapAny { - return &mapAny{baseAny{}, nil, reflect.ValueOf(val)} -} - -func (any *mapAny) ValueType() ValueType { - return ObjectValue -} - -func (any *mapAny) MustBeValid() Any { - return any -} - -func (any *mapAny) Parse() *Iterator { - return nil -} - -func (any *mapAny) LastError() error { - return any.err -} - -func (any *mapAny) ToBool() bool { - return true -} - -func (any *mapAny) ToInt() int { - return 0 -} - -func (any *mapAny) ToInt32() int32 { - return 0 -} - -func (any *mapAny) ToInt64() int64 { - return 0 -} - -func (any *mapAny) ToUint() uint { - return 0 -} - -func (any *mapAny) ToUint32() uint32 { - return 0 -} - -func (any *mapAny) ToUint64() uint64 { - return 0 -} - -func (any *mapAny) ToFloat32() float32 { - return 0 -} - -func (any *mapAny) ToFloat64() float64 { - return 0 -} - -func (any *mapAny) ToString() string { - str, err := MarshalToString(any.val.Interface()) - any.err = err - return str -} - -func (any *mapAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case int32: - if '*' == firstPath { - mappedAll := map[string]Any{} - for _, key := range any.val.MapKeys() { - keyAsStr := key.String() - element := Wrap(any.val.MapIndex(key).Interface()) - mapped := element.Get(path[1:]...) - if mapped.ValueType() != InvalidValue { - mappedAll[keyAsStr] = mapped - } - } - return wrapMap(mappedAll) - } - return newInvalidAny(path) - default: - value := any.val.MapIndex(reflect.ValueOf(firstPath)) - if !value.IsValid() { - return newInvalidAny(path) - } - return Wrap(value.Interface()) - } -} - -func (any *mapAny) Keys() []string { - keys := make([]string, 0, any.val.Len()) - for _, key := range any.val.MapKeys() { - keys = append(keys, key.String()) - } - return keys -} - -func (any *mapAny) Size() int { - return any.val.Len() -} - -func (any *mapAny) WriteTo(stream *Stream) { - stream.WriteVal(any.val) -} - -func (any *mapAny) GetInterface() interface{} { - return any.val.Interface() -} diff --git a/vendor/github.com/json-iterator/go/any_str.go b/vendor/github.com/json-iterator/go/any_str.go deleted file mode 100644 index a4b93c7..0000000 --- a/vendor/github.com/json-iterator/go/any_str.go +++ /dev/null @@ -1,166 +0,0 @@ -package jsoniter - -import ( - "fmt" - "strconv" -) - -type stringAny struct { - baseAny - val string -} - -func (any *stringAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} -} - -func (any *stringAny) Parse() *Iterator { - return nil -} - -func (any *stringAny) ValueType() ValueType { - return StringValue -} - -func (any *stringAny) MustBeValid() Any { - return any -} - -func (any *stringAny) LastError() error { - return nil -} - -func (any *stringAny) ToBool() bool { - str := any.ToString() - if str == "0" { - return false - } - for _, c := range str { - switch c { - case ' ', '\n', '\r', '\t': - default: - return true - } - } - return false -} - -func (any *stringAny) ToInt() int { - return int(any.ToInt64()) - -} - -func (any *stringAny) ToInt32() int32 { - return int32(any.ToInt64()) -} - -func (any *stringAny) ToInt64() int64 { - if any.val == "" { - return 0 - } - - flag := 1 - startPos := 0 - endPos := 0 - if any.val[0] == '+' || any.val[0] == '-' { - startPos = 1 - } - - if any.val[0] == '-' { - flag = -1 - } - - for i := startPos; i < len(any.val); i++ { - if any.val[i] >= '0' && any.val[i] <= '9' { - endPos = i + 1 - } else { - break - } - } - parsed, _ := strconv.ParseInt(any.val[startPos:endPos], 10, 64) - return int64(flag) * parsed -} - -func (any *stringAny) ToUint() uint { - return uint(any.ToUint64()) -} - -func (any *stringAny) ToUint32() uint32 { - return uint32(any.ToUint64()) -} - -func (any *stringAny) ToUint64() uint64 { - if any.val == "" { - return 0 - } - - startPos := 0 - endPos := 0 - - if any.val[0] == '-' { - return 0 - } - if any.val[0] == '+' { - startPos = 1 - } - - for i := startPos; i < len(any.val); i++ { - if any.val[i] >= '0' && any.val[i] <= '9' { - endPos = i + 1 - } else { - break - } - } - parsed, _ := strconv.ParseUint(any.val[startPos:endPos], 10, 64) - return parsed -} - -func (any *stringAny) ToFloat32() float32 { - return float32(any.ToFloat64()) -} - -func (any *stringAny) ToFloat64() float64 { - if len(any.val) == 0 { - return 0 - } - - // first char invalid - if any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') { - return 0 - } - - // extract valid num expression from string - // eg 123true => 123, -12.12xxa => -12.12 - endPos := 1 - for i := 1; i < len(any.val); i++ { - if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' { - endPos = i + 1 - continue - } - - // end position is the first char which is not digit - if any.val[i] >= '0' && any.val[i] <= '9' { - endPos = i + 1 - } else { - endPos = i - break - } - } - parsed, _ := strconv.ParseFloat(any.val[:endPos], 64) - return parsed -} - -func (any *stringAny) ToString() string { - return any.val -} - -func (any *stringAny) WriteTo(stream *Stream) { - stream.WriteString(any.val) -} - -func (any *stringAny) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_uint32.go b/vendor/github.com/json-iterator/go/any_uint32.go deleted file mode 100644 index 656bbd3..0000000 --- a/vendor/github.com/json-iterator/go/any_uint32.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type uint32Any struct { - baseAny - val uint32 -} - -func (any *uint32Any) LastError() error { - return nil -} - -func (any *uint32Any) ValueType() ValueType { - return NumberValue -} - -func (any *uint32Any) MustBeValid() Any { - return any -} - -func (any *uint32Any) ToBool() bool { - return any.val != 0 -} - -func (any *uint32Any) ToInt() int { - return int(any.val) -} - -func (any *uint32Any) ToInt32() int32 { - return int32(any.val) -} - -func (any *uint32Any) ToInt64() int64 { - return int64(any.val) -} - -func (any *uint32Any) ToUint() uint { - return uint(any.val) -} - -func (any *uint32Any) ToUint32() uint32 { - return any.val -} - -func (any *uint32Any) ToUint64() uint64 { - return uint64(any.val) -} - -func (any *uint32Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *uint32Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *uint32Any) ToString() string { - return strconv.FormatInt(int64(any.val), 10) -} - -func (any *uint32Any) WriteTo(stream *Stream) { - stream.WriteUint32(any.val) -} - -func (any *uint32Any) Parse() *Iterator { - return nil -} - -func (any *uint32Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_uint64.go b/vendor/github.com/json-iterator/go/any_uint64.go deleted file mode 100644 index 7df2fce..0000000 --- a/vendor/github.com/json-iterator/go/any_uint64.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type uint64Any struct { - baseAny - val uint64 -} - -func (any *uint64Any) LastError() error { - return nil -} - -func (any *uint64Any) ValueType() ValueType { - return NumberValue -} - -func (any *uint64Any) MustBeValid() Any { - return any -} - -func (any *uint64Any) ToBool() bool { - return any.val != 0 -} - -func (any *uint64Any) ToInt() int { - return int(any.val) -} - -func (any *uint64Any) ToInt32() int32 { - return int32(any.val) -} - -func (any *uint64Any) ToInt64() int64 { - return int64(any.val) -} - -func (any *uint64Any) ToUint() uint { - return uint(any.val) -} - -func (any *uint64Any) ToUint32() uint32 { - return uint32(any.val) -} - -func (any *uint64Any) ToUint64() uint64 { - return any.val -} - -func (any *uint64Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *uint64Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *uint64Any) ToString() string { - return strconv.FormatUint(any.val, 10) -} - -func (any *uint64Any) WriteTo(stream *Stream) { - stream.WriteUint64(any.val) -} - -func (any *uint64Any) Parse() *Iterator { - return nil -} - -func (any *uint64Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/build.sh b/vendor/github.com/json-iterator/go/build.sh deleted file mode 100644 index b45ef68..0000000 --- a/vendor/github.com/json-iterator/go/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e -set -x - -if [ ! -d /tmp/build-golang/src/github.com/json-iterator ]; then - mkdir -p /tmp/build-golang/src/github.com/json-iterator - ln -s $PWD /tmp/build-golang/src/github.com/json-iterator/go -fi -export GOPATH=/tmp/build-golang -go get -u github.com/golang/dep/cmd/dep -cd /tmp/build-golang/src/github.com/json-iterator/go -exec $GOPATH/bin/dep ensure -update diff --git a/vendor/github.com/json-iterator/go/config.go b/vendor/github.com/json-iterator/go/config.go deleted file mode 100644 index 8c58fcb..0000000 --- a/vendor/github.com/json-iterator/go/config.go +++ /dev/null @@ -1,375 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "io" - "reflect" - "sync" - "unsafe" - - "github.com/modern-go/concurrent" - "github.com/modern-go/reflect2" -) - -// Config customize how the API should behave. -// The API is created from Config by Froze. -type Config struct { - IndentionStep int - MarshalFloatWith6Digits bool - EscapeHTML bool - SortMapKeys bool - UseNumber bool - DisallowUnknownFields bool - TagKey string - OnlyTaggedField bool - ValidateJsonRawMessage bool - ObjectFieldMustBeSimpleString bool - CaseSensitive bool -} - -// API the public interface of this package. -// Primary Marshal and Unmarshal. -type API interface { - IteratorPool - StreamPool - MarshalToString(v interface{}) (string, error) - Marshal(v interface{}) ([]byte, error) - MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) - UnmarshalFromString(str string, v interface{}) error - Unmarshal(data []byte, v interface{}) error - Get(data []byte, path ...interface{}) Any - NewEncoder(writer io.Writer) *Encoder - NewDecoder(reader io.Reader) *Decoder - Valid(data []byte) bool - RegisterExtension(extension Extension) - DecoderOf(typ reflect2.Type) ValDecoder - EncoderOf(typ reflect2.Type) ValEncoder -} - -// ConfigDefault the default API -var ConfigDefault = Config{ - EscapeHTML: true, -}.Froze() - -// ConfigCompatibleWithStandardLibrary tries to be 100% compatible with standard library behavior -var ConfigCompatibleWithStandardLibrary = Config{ - EscapeHTML: true, - SortMapKeys: true, - ValidateJsonRawMessage: true, -}.Froze() - -// ConfigFastest marshals float with only 6 digits precision -var ConfigFastest = Config{ - EscapeHTML: false, - MarshalFloatWith6Digits: true, // will lose precession - ObjectFieldMustBeSimpleString: true, // do not unescape object field -}.Froze() - -type frozenConfig struct { - configBeforeFrozen Config - sortMapKeys bool - indentionStep int - objectFieldMustBeSimpleString bool - onlyTaggedField bool - disallowUnknownFields bool - decoderCache *concurrent.Map - encoderCache *concurrent.Map - encoderExtension Extension - decoderExtension Extension - extraExtensions []Extension - streamPool *sync.Pool - iteratorPool *sync.Pool - caseSensitive bool -} - -func (cfg *frozenConfig) initCache() { - cfg.decoderCache = concurrent.NewMap() - cfg.encoderCache = concurrent.NewMap() -} - -func (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) { - cfg.decoderCache.Store(cacheKey, decoder) -} - -func (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) { - cfg.encoderCache.Store(cacheKey, encoder) -} - -func (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) ValDecoder { - decoder, found := cfg.decoderCache.Load(cacheKey) - if found { - return decoder.(ValDecoder) - } - return nil -} - -func (cfg *frozenConfig) getEncoderFromCache(cacheKey uintptr) ValEncoder { - encoder, found := cfg.encoderCache.Load(cacheKey) - if found { - return encoder.(ValEncoder) - } - return nil -} - -var cfgCache = concurrent.NewMap() - -func getFrozenConfigFromCache(cfg Config) *frozenConfig { - obj, found := cfgCache.Load(cfg) - if found { - return obj.(*frozenConfig) - } - return nil -} - -func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) { - cfgCache.Store(cfg, frozenConfig) -} - -// Froze forge API from config -func (cfg Config) Froze() API { - api := &frozenConfig{ - sortMapKeys: cfg.SortMapKeys, - indentionStep: cfg.IndentionStep, - objectFieldMustBeSimpleString: cfg.ObjectFieldMustBeSimpleString, - onlyTaggedField: cfg.OnlyTaggedField, - disallowUnknownFields: cfg.DisallowUnknownFields, - caseSensitive: cfg.CaseSensitive, - } - api.streamPool = &sync.Pool{ - New: func() interface{} { - return NewStream(api, nil, 512) - }, - } - api.iteratorPool = &sync.Pool{ - New: func() interface{} { - return NewIterator(api) - }, - } - api.initCache() - encoderExtension := EncoderExtension{} - decoderExtension := DecoderExtension{} - if cfg.MarshalFloatWith6Digits { - api.marshalFloatWith6Digits(encoderExtension) - } - if cfg.EscapeHTML { - api.escapeHTML(encoderExtension) - } - if cfg.UseNumber { - api.useNumber(decoderExtension) - } - if cfg.ValidateJsonRawMessage { - api.validateJsonRawMessage(encoderExtension) - } - api.encoderExtension = encoderExtension - api.decoderExtension = decoderExtension - api.configBeforeFrozen = cfg - return api -} - -func (cfg Config) frozeWithCacheReuse(extraExtensions []Extension) *frozenConfig { - api := getFrozenConfigFromCache(cfg) - if api != nil { - return api - } - api = cfg.Froze().(*frozenConfig) - for _, extension := range extraExtensions { - api.RegisterExtension(extension) - } - addFrozenConfigToCache(cfg, api) - return api -} - -func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) { - encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) { - rawMessage := *(*json.RawMessage)(ptr) - iter := cfg.BorrowIterator([]byte(rawMessage)) - iter.Read() - if iter.Error != nil { - stream.WriteRaw("null") - } else { - cfg.ReturnIterator(iter) - stream.WriteRaw(string(rawMessage)) - } - }, func(ptr unsafe.Pointer) bool { - return len(*((*json.RawMessage)(ptr))) == 0 - }} - extension[reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()] = encoder - extension[reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()] = encoder -} - -func (cfg *frozenConfig) useNumber(extension DecoderExtension) { - extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { - exitingValue := *((*interface{})(ptr)) - if exitingValue != nil && reflect.TypeOf(exitingValue).Kind() == reflect.Ptr { - iter.ReadVal(exitingValue) - return - } - if iter.WhatIsNext() == NumberValue { - *((*interface{})(ptr)) = json.Number(iter.readNumberAsString()) - } else { - *((*interface{})(ptr)) = iter.Read() - } - }} -} -func (cfg *frozenConfig) getTagKey() string { - tagKey := cfg.configBeforeFrozen.TagKey - if tagKey == "" { - return "json" - } - return tagKey -} - -func (cfg *frozenConfig) RegisterExtension(extension Extension) { - cfg.extraExtensions = append(cfg.extraExtensions, extension) - copied := cfg.configBeforeFrozen - cfg.configBeforeFrozen = copied -} - -type lossyFloat32Encoder struct { -} - -func (encoder *lossyFloat32Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat32Lossy(*((*float32)(ptr))) -} - -func (encoder *lossyFloat32Encoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float32)(ptr)) == 0 -} - -type lossyFloat64Encoder struct { -} - -func (encoder *lossyFloat64Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat64Lossy(*((*float64)(ptr))) -} - -func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float64)(ptr)) == 0 -} - -// EnableLossyFloatMarshalling keeps 10**(-6) precision -// for float variables for better performance. -func (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) { - // for better performance - extension[reflect2.TypeOfPtr((*float32)(nil)).Elem()] = &lossyFloat32Encoder{} - extension[reflect2.TypeOfPtr((*float64)(nil)).Elem()] = &lossyFloat64Encoder{} -} - -type htmlEscapedStringEncoder struct { -} - -func (encoder *htmlEscapedStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - str := *((*string)(ptr)) - stream.WriteStringWithHTMLEscaped(str) -} - -func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*string)(ptr)) == "" -} - -func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) { - encoderExtension[reflect2.TypeOfPtr((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{} -} - -func (cfg *frozenConfig) cleanDecoders() { - typeDecoders = map[string]ValDecoder{} - fieldDecoders = map[string]ValDecoder{} - *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) -} - -func (cfg *frozenConfig) cleanEncoders() { - typeEncoders = map[string]ValEncoder{} - fieldEncoders = map[string]ValEncoder{} - *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) -} - -func (cfg *frozenConfig) MarshalToString(v interface{}) (string, error) { - stream := cfg.BorrowStream(nil) - defer cfg.ReturnStream(stream) - stream.WriteVal(v) - if stream.Error != nil { - return "", stream.Error - } - return string(stream.Buffer()), nil -} - -func (cfg *frozenConfig) Marshal(v interface{}) ([]byte, error) { - stream := cfg.BorrowStream(nil) - defer cfg.ReturnStream(stream) - stream.WriteVal(v) - if stream.Error != nil { - return nil, stream.Error - } - result := stream.Buffer() - copied := make([]byte, len(result)) - copy(copied, result) - return copied, nil -} - -func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { - if prefix != "" { - panic("prefix is not supported") - } - for _, r := range indent { - if r != ' ' { - panic("indent can only be space") - } - } - newCfg := cfg.configBeforeFrozen - newCfg.IndentionStep = len(indent) - return newCfg.frozeWithCacheReuse(cfg.extraExtensions).Marshal(v) -} - -func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error { - data := []byte(str) - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.ReadVal(v) - c := iter.nextToken() - if c == 0 { - if iter.Error == io.EOF { - return nil - } - return iter.Error - } - iter.ReportError("Unmarshal", "there are bytes left after unmarshal") - return iter.Error -} - -func (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - return locatePath(iter, path) -} - -func (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.ReadVal(v) - c := iter.nextToken() - if c == 0 { - if iter.Error == io.EOF { - return nil - } - return iter.Error - } - iter.ReportError("Unmarshal", "there are bytes left after unmarshal") - return iter.Error -} - -func (cfg *frozenConfig) NewEncoder(writer io.Writer) *Encoder { - stream := NewStream(cfg, writer, 512) - return &Encoder{stream} -} - -func (cfg *frozenConfig) NewDecoder(reader io.Reader) *Decoder { - iter := Parse(cfg, reader, 512) - return &Decoder{iter} -} - -func (cfg *frozenConfig) Valid(data []byte) bool { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.Skip() - return iter.Error == nil -} diff --git a/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md b/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md deleted file mode 100644 index 3095662..0000000 --- a/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md +++ /dev/null @@ -1,7 +0,0 @@ -| json type \ dest type | bool | int | uint | float |string| -| --- | --- | --- | --- |--|--| -| number | positive => true
negative => true
zero => false| 23.2 => 23
-32.1 => -32| 12.1 => 12
-12.1 => 0|as normal|same as origin| -| string | empty string => false
string "0" => false
other strings => true | "123.32" => 123
"-123.4" => -123
"123.23xxxw" => 123
"abcde12" => 0
"-32.1" => -32| 13.2 => 13
-1.1 => 0 |12.1 => 12.1
-12.3 => -12.3
12.4xxa => 12.4
+1.1e2 =>110 |same as origin| -| bool | true => true
false => false| true => 1
false => 0 | true => 1
false => 0 |true => 1
false => 0|true => "true"
false => "false"| -| object | true | 0 | 0 |0|originnal json| -| array | empty array => false
nonempty array => true| [] => 0
[1,2] => 1 | [] => 0
[1,2] => 1 |[] => 0
[1,2] => 1|original json| \ No newline at end of file diff --git a/vendor/github.com/json-iterator/go/go.mod b/vendor/github.com/json-iterator/go/go.mod deleted file mode 100644 index e05c42f..0000000 --- a/vendor/github.com/json-iterator/go/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module github.com/json-iterator/go - -go 1.12 - -require ( - github.com/davecgh/go-spew v1.1.1 - github.com/google/gofuzz v1.0.0 - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 - github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 - github.com/stretchr/testify v1.3.0 -) diff --git a/vendor/github.com/json-iterator/go/go.sum b/vendor/github.com/json-iterator/go/go.sum deleted file mode 100644 index d778b5a..0000000 --- a/vendor/github.com/json-iterator/go/go.sum +++ /dev/null @@ -1,14 +0,0 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/json-iterator/go/iter.go b/vendor/github.com/json-iterator/go/iter.go deleted file mode 100644 index 29b31cf..0000000 --- a/vendor/github.com/json-iterator/go/iter.go +++ /dev/null @@ -1,349 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "fmt" - "io" -) - -// ValueType the type for JSON element -type ValueType int - -const ( - // InvalidValue invalid JSON element - InvalidValue ValueType = iota - // StringValue JSON element "string" - StringValue - // NumberValue JSON element 100 or 0.10 - NumberValue - // NilValue JSON element null - NilValue - // BoolValue JSON element true or false - BoolValue - // ArrayValue JSON element [] - ArrayValue - // ObjectValue JSON element {} - ObjectValue -) - -var hexDigits []byte -var valueTypes []ValueType - -func init() { - hexDigits = make([]byte, 256) - for i := 0; i < len(hexDigits); i++ { - hexDigits[i] = 255 - } - for i := '0'; i <= '9'; i++ { - hexDigits[i] = byte(i - '0') - } - for i := 'a'; i <= 'f'; i++ { - hexDigits[i] = byte((i - 'a') + 10) - } - for i := 'A'; i <= 'F'; i++ { - hexDigits[i] = byte((i - 'A') + 10) - } - valueTypes = make([]ValueType, 256) - for i := 0; i < len(valueTypes); i++ { - valueTypes[i] = InvalidValue - } - valueTypes['"'] = StringValue - valueTypes['-'] = NumberValue - valueTypes['0'] = NumberValue - valueTypes['1'] = NumberValue - valueTypes['2'] = NumberValue - valueTypes['3'] = NumberValue - valueTypes['4'] = NumberValue - valueTypes['5'] = NumberValue - valueTypes['6'] = NumberValue - valueTypes['7'] = NumberValue - valueTypes['8'] = NumberValue - valueTypes['9'] = NumberValue - valueTypes['t'] = BoolValue - valueTypes['f'] = BoolValue - valueTypes['n'] = NilValue - valueTypes['['] = ArrayValue - valueTypes['{'] = ObjectValue -} - -// Iterator is a io.Reader like object, with JSON specific read functions. -// Error is not returned as return value, but stored as Error member on this iterator instance. -type Iterator struct { - cfg *frozenConfig - reader io.Reader - buf []byte - head int - tail int - depth int - captureStartedAt int - captured []byte - Error error - Attachment interface{} // open for customized decoder -} - -// NewIterator creates an empty Iterator instance -func NewIterator(cfg API) *Iterator { - return &Iterator{ - cfg: cfg.(*frozenConfig), - reader: nil, - buf: nil, - head: 0, - tail: 0, - depth: 0, - } -} - -// Parse creates an Iterator instance from io.Reader -func Parse(cfg API, reader io.Reader, bufSize int) *Iterator { - return &Iterator{ - cfg: cfg.(*frozenConfig), - reader: reader, - buf: make([]byte, bufSize), - head: 0, - tail: 0, - depth: 0, - } -} - -// ParseBytes creates an Iterator instance from byte array -func ParseBytes(cfg API, input []byte) *Iterator { - return &Iterator{ - cfg: cfg.(*frozenConfig), - reader: nil, - buf: input, - head: 0, - tail: len(input), - depth: 0, - } -} - -// ParseString creates an Iterator instance from string -func ParseString(cfg API, input string) *Iterator { - return ParseBytes(cfg, []byte(input)) -} - -// Pool returns a pool can provide more iterator with same configuration -func (iter *Iterator) Pool() IteratorPool { - return iter.cfg -} - -// Reset reuse iterator instance by specifying another reader -func (iter *Iterator) Reset(reader io.Reader) *Iterator { - iter.reader = reader - iter.head = 0 - iter.tail = 0 - iter.depth = 0 - return iter -} - -// ResetBytes reuse iterator instance by specifying another byte array as input -func (iter *Iterator) ResetBytes(input []byte) *Iterator { - iter.reader = nil - iter.buf = input - iter.head = 0 - iter.tail = len(input) - iter.depth = 0 - return iter -} - -// WhatIsNext gets ValueType of relatively next json element -func (iter *Iterator) WhatIsNext() ValueType { - valueType := valueTypes[iter.nextToken()] - iter.unreadByte() - return valueType -} - -func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case ' ', '\n', '\t', '\r': - continue - } - iter.head = i - return false - } - return true -} - -func (iter *Iterator) isObjectEnd() bool { - c := iter.nextToken() - if c == ',' { - return false - } - if c == '}' { - return true - } - iter.ReportError("isObjectEnd", "object ended prematurely, unexpected char "+string([]byte{c})) - return true -} - -func (iter *Iterator) nextToken() byte { - // a variation of skip whitespaces, returning the next non-whitespace token - for { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case ' ', '\n', '\t', '\r': - continue - } - iter.head = i + 1 - return c - } - if !iter.loadMore() { - return 0 - } - } -} - -// ReportError record a error in iterator instance with current position. -func (iter *Iterator) ReportError(operation string, msg string) { - if iter.Error != nil { - if iter.Error != io.EOF { - return - } - } - peekStart := iter.head - 10 - if peekStart < 0 { - peekStart = 0 - } - peekEnd := iter.head + 10 - if peekEnd > iter.tail { - peekEnd = iter.tail - } - parsing := string(iter.buf[peekStart:peekEnd]) - contextStart := iter.head - 50 - if contextStart < 0 { - contextStart = 0 - } - contextEnd := iter.head + 50 - if contextEnd > iter.tail { - contextEnd = iter.tail - } - context := string(iter.buf[contextStart:contextEnd]) - iter.Error = fmt.Errorf("%s: %s, error found in #%v byte of ...|%s|..., bigger context ...|%s|...", - operation, msg, iter.head-peekStart, parsing, context) -} - -// CurrentBuffer gets current buffer as string for debugging purpose -func (iter *Iterator) CurrentBuffer() string { - peekStart := iter.head - 10 - if peekStart < 0 { - peekStart = 0 - } - return fmt.Sprintf("parsing #%v byte, around ...|%s|..., whole buffer ...|%s|...", iter.head, - string(iter.buf[peekStart:iter.head]), string(iter.buf[0:iter.tail])) -} - -func (iter *Iterator) readByte() (ret byte) { - if iter.head == iter.tail { - if iter.loadMore() { - ret = iter.buf[iter.head] - iter.head++ - return ret - } - return 0 - } - ret = iter.buf[iter.head] - iter.head++ - return ret -} - -func (iter *Iterator) loadMore() bool { - if iter.reader == nil { - if iter.Error == nil { - iter.head = iter.tail - iter.Error = io.EOF - } - return false - } - if iter.captured != nil { - iter.captured = append(iter.captured, - iter.buf[iter.captureStartedAt:iter.tail]...) - iter.captureStartedAt = 0 - } - for { - n, err := iter.reader.Read(iter.buf) - if n == 0 { - if err != nil { - if iter.Error == nil { - iter.Error = err - } - return false - } - } else { - iter.head = 0 - iter.tail = n - return true - } - } -} - -func (iter *Iterator) unreadByte() { - if iter.Error != nil { - return - } - iter.head-- - return -} - -// Read read the next JSON element as generic interface{}. -func (iter *Iterator) Read() interface{} { - valueType := iter.WhatIsNext() - switch valueType { - case StringValue: - return iter.ReadString() - case NumberValue: - if iter.cfg.configBeforeFrozen.UseNumber { - return json.Number(iter.readNumberAsString()) - } - return iter.ReadFloat64() - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - return nil - case BoolValue: - return iter.ReadBool() - case ArrayValue: - arr := []interface{}{} - iter.ReadArrayCB(func(iter *Iterator) bool { - var elem interface{} - iter.ReadVal(&elem) - arr = append(arr, elem) - return true - }) - return arr - case ObjectValue: - obj := map[string]interface{}{} - iter.ReadMapCB(func(Iter *Iterator, field string) bool { - var elem interface{} - iter.ReadVal(&elem) - obj[field] = elem - return true - }) - return obj - default: - iter.ReportError("Read", fmt.Sprintf("unexpected value type: %v", valueType)) - return nil - } -} - -// limit maximum depth of nesting, as allowed by https://tools.ietf.org/html/rfc7159#section-9 -const maxDepth = 10000 - -func (iter *Iterator) incrementDepth() (success bool) { - iter.depth++ - if iter.depth <= maxDepth { - return true - } - iter.ReportError("incrementDepth", "exceeded max depth") - return false -} - -func (iter *Iterator) decrementDepth() (success bool) { - iter.depth-- - if iter.depth >= 0 { - return true - } - iter.ReportError("decrementDepth", "unexpected negative nesting") - return false -} diff --git a/vendor/github.com/json-iterator/go/iter_array.go b/vendor/github.com/json-iterator/go/iter_array.go deleted file mode 100644 index 204fe0e..0000000 --- a/vendor/github.com/json-iterator/go/iter_array.go +++ /dev/null @@ -1,64 +0,0 @@ -package jsoniter - -// ReadArray read array element, tells if the array has more element to read. -func (iter *Iterator) ReadArray() (ret bool) { - c := iter.nextToken() - switch c { - case 'n': - iter.skipThreeBytes('u', 'l', 'l') - return false // null - case '[': - c = iter.nextToken() - if c != ']' { - iter.unreadByte() - return true - } - return false - case ']': - return false - case ',': - return true - default: - iter.ReportError("ReadArray", "expect [ or , or ] or n, but found "+string([]byte{c})) - return - } -} - -// ReadArrayCB read array with callback -func (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) { - c := iter.nextToken() - if c == '[' { - if !iter.incrementDepth() { - return false - } - c = iter.nextToken() - if c != ']' { - iter.unreadByte() - if !callback(iter) { - iter.decrementDepth() - return false - } - c = iter.nextToken() - for c == ',' { - if !callback(iter) { - iter.decrementDepth() - return false - } - c = iter.nextToken() - } - if c != ']' { - iter.ReportError("ReadArrayCB", "expect ] in the end, but found "+string([]byte{c})) - iter.decrementDepth() - return false - } - return iter.decrementDepth() - } - return iter.decrementDepth() - } - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return true // null - } - iter.ReportError("ReadArrayCB", "expect [ or n, but found "+string([]byte{c})) - return false -} diff --git a/vendor/github.com/json-iterator/go/iter_float.go b/vendor/github.com/json-iterator/go/iter_float.go deleted file mode 100644 index b975463..0000000 --- a/vendor/github.com/json-iterator/go/iter_float.go +++ /dev/null @@ -1,339 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "io" - "math/big" - "strconv" - "strings" - "unsafe" -) - -var floatDigits []int8 - -const invalidCharForNumber = int8(-1) -const endOfNumber = int8(-2) -const dotInNumber = int8(-3) - -func init() { - floatDigits = make([]int8, 256) - for i := 0; i < len(floatDigits); i++ { - floatDigits[i] = invalidCharForNumber - } - for i := int8('0'); i <= int8('9'); i++ { - floatDigits[i] = i - int8('0') - } - floatDigits[','] = endOfNumber - floatDigits[']'] = endOfNumber - floatDigits['}'] = endOfNumber - floatDigits[' '] = endOfNumber - floatDigits['\t'] = endOfNumber - floatDigits['\n'] = endOfNumber - floatDigits['.'] = dotInNumber -} - -// ReadBigFloat read big.Float -func (iter *Iterator) ReadBigFloat() (ret *big.Float) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return nil - } - prec := 64 - if len(str) > prec { - prec = len(str) - } - val, _, err := big.ParseFloat(str, 10, uint(prec), big.ToZero) - if err != nil { - iter.Error = err - return nil - } - return val -} - -// ReadBigInt read big.Int -func (iter *Iterator) ReadBigInt() (ret *big.Int) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return nil - } - ret = big.NewInt(0) - var success bool - ret, success = ret.SetString(str, 10) - if !success { - iter.ReportError("ReadBigInt", "invalid big int") - return nil - } - return ret -} - -//ReadFloat32 read float32 -func (iter *Iterator) ReadFloat32() (ret float32) { - c := iter.nextToken() - if c == '-' { - return -iter.readPositiveFloat32() - } - iter.unreadByte() - return iter.readPositiveFloat32() -} - -func (iter *Iterator) readPositiveFloat32() (ret float32) { - i := iter.head - // first char - if i == iter.tail { - return iter.readFloat32SlowPath() - } - c := iter.buf[i] - i++ - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat32SlowPath() - case endOfNumber: - iter.ReportError("readFloat32", "empty number") - return - case dotInNumber: - iter.ReportError("readFloat32", "leading dot is invalid") - return - case 0: - if i == iter.tail { - return iter.readFloat32SlowPath() - } - c = iter.buf[i] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - iter.ReportError("readFloat32", "leading zero is invalid") - return - } - } - value := uint64(ind) - // chars before dot -non_decimal_loop: - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat32SlowPath() - case endOfNumber: - iter.head = i - return float32(value) - case dotInNumber: - break non_decimal_loop - } - if value > uint64SafeToMultiple10 { - return iter.readFloat32SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind; - } - // chars after dot - if c == '.' { - i++ - decimalPlaces := 0 - if i == iter.tail { - return iter.readFloat32SlowPath() - } - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case endOfNumber: - if decimalPlaces > 0 && decimalPlaces < len(pow10) { - iter.head = i - return float32(float64(value) / float64(pow10[decimalPlaces])) - } - // too many decimal places - return iter.readFloat32SlowPath() - case invalidCharForNumber, dotInNumber: - return iter.readFloat32SlowPath() - } - decimalPlaces++ - if value > uint64SafeToMultiple10 { - return iter.readFloat32SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) - } - } - return iter.readFloat32SlowPath() -} - -func (iter *Iterator) readNumberAsString() (ret string) { - strBuf := [16]byte{} - str := strBuf[0:0] -load_loop: - for { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case '+', '-', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - str = append(str, c) - continue - default: - iter.head = i - break load_loop - } - } - if !iter.loadMore() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - return - } - if len(str) == 0 { - iter.ReportError("readNumberAsString", "invalid number") - } - return *(*string)(unsafe.Pointer(&str)) -} - -func (iter *Iterator) readFloat32SlowPath() (ret float32) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return - } - errMsg := validateFloat(str) - if errMsg != "" { - iter.ReportError("readFloat32SlowPath", errMsg) - return - } - val, err := strconv.ParseFloat(str, 32) - if err != nil { - iter.Error = err - return - } - return float32(val) -} - -// ReadFloat64 read float64 -func (iter *Iterator) ReadFloat64() (ret float64) { - c := iter.nextToken() - if c == '-' { - return -iter.readPositiveFloat64() - } - iter.unreadByte() - return iter.readPositiveFloat64() -} - -func (iter *Iterator) readPositiveFloat64() (ret float64) { - i := iter.head - // first char - if i == iter.tail { - return iter.readFloat64SlowPath() - } - c := iter.buf[i] - i++ - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat64SlowPath() - case endOfNumber: - iter.ReportError("readFloat64", "empty number") - return - case dotInNumber: - iter.ReportError("readFloat64", "leading dot is invalid") - return - case 0: - if i == iter.tail { - return iter.readFloat64SlowPath() - } - c = iter.buf[i] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - iter.ReportError("readFloat64", "leading zero is invalid") - return - } - } - value := uint64(ind) - // chars before dot -non_decimal_loop: - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat64SlowPath() - case endOfNumber: - iter.head = i - return float64(value) - case dotInNumber: - break non_decimal_loop - } - if value > uint64SafeToMultiple10 { - return iter.readFloat64SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind; - } - // chars after dot - if c == '.' { - i++ - decimalPlaces := 0 - if i == iter.tail { - return iter.readFloat64SlowPath() - } - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case endOfNumber: - if decimalPlaces > 0 && decimalPlaces < len(pow10) { - iter.head = i - return float64(value) / float64(pow10[decimalPlaces]) - } - // too many decimal places - return iter.readFloat64SlowPath() - case invalidCharForNumber, dotInNumber: - return iter.readFloat64SlowPath() - } - decimalPlaces++ - if value > uint64SafeToMultiple10 { - return iter.readFloat64SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) - } - } - return iter.readFloat64SlowPath() -} - -func (iter *Iterator) readFloat64SlowPath() (ret float64) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return - } - errMsg := validateFloat(str) - if errMsg != "" { - iter.ReportError("readFloat64SlowPath", errMsg) - return - } - val, err := strconv.ParseFloat(str, 64) - if err != nil { - iter.Error = err - return - } - return val -} - -func validateFloat(str string) string { - // strconv.ParseFloat is not validating `1.` or `1.e1` - if len(str) == 0 { - return "empty number" - } - if str[0] == '-' { - return "-- is not valid" - } - dotPos := strings.IndexByte(str, '.') - if dotPos != -1 { - if dotPos == len(str)-1 { - return "dot can not be last character" - } - switch str[dotPos+1] { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - default: - return "missing digit after dot" - } - } - return "" -} - -// ReadNumber read json.Number -func (iter *Iterator) ReadNumber() (ret json.Number) { - return json.Number(iter.readNumberAsString()) -} diff --git a/vendor/github.com/json-iterator/go/iter_int.go b/vendor/github.com/json-iterator/go/iter_int.go deleted file mode 100644 index 2142320..0000000 --- a/vendor/github.com/json-iterator/go/iter_int.go +++ /dev/null @@ -1,345 +0,0 @@ -package jsoniter - -import ( - "math" - "strconv" -) - -var intDigits []int8 - -const uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 1 -const uint64SafeToMultiple10 = uint64(0xffffffffffffffff)/10 - 1 - -func init() { - intDigits = make([]int8, 256) - for i := 0; i < len(intDigits); i++ { - intDigits[i] = invalidCharForNumber - } - for i := int8('0'); i <= int8('9'); i++ { - intDigits[i] = i - int8('0') - } -} - -// ReadUint read uint -func (iter *Iterator) ReadUint() uint { - if strconv.IntSize == 32 { - return uint(iter.ReadUint32()) - } - return uint(iter.ReadUint64()) -} - -// ReadInt read int -func (iter *Iterator) ReadInt() int { - if strconv.IntSize == 32 { - return int(iter.ReadInt32()) - } - return int(iter.ReadInt64()) -} - -// ReadInt8 read int8 -func (iter *Iterator) ReadInt8() (ret int8) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint32(iter.readByte()) - if val > math.MaxInt8+1 { - iter.ReportError("ReadInt8", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return -int8(val) - } - val := iter.readUint32(c) - if val > math.MaxInt8 { - iter.ReportError("ReadInt8", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return int8(val) -} - -// ReadUint8 read uint8 -func (iter *Iterator) ReadUint8() (ret uint8) { - val := iter.readUint32(iter.nextToken()) - if val > math.MaxUint8 { - iter.ReportError("ReadUint8", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return uint8(val) -} - -// ReadInt16 read int16 -func (iter *Iterator) ReadInt16() (ret int16) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint32(iter.readByte()) - if val > math.MaxInt16+1 { - iter.ReportError("ReadInt16", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return -int16(val) - } - val := iter.readUint32(c) - if val > math.MaxInt16 { - iter.ReportError("ReadInt16", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return int16(val) -} - -// ReadUint16 read uint16 -func (iter *Iterator) ReadUint16() (ret uint16) { - val := iter.readUint32(iter.nextToken()) - if val > math.MaxUint16 { - iter.ReportError("ReadUint16", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return uint16(val) -} - -// ReadInt32 read int32 -func (iter *Iterator) ReadInt32() (ret int32) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint32(iter.readByte()) - if val > math.MaxInt32+1 { - iter.ReportError("ReadInt32", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return -int32(val) - } - val := iter.readUint32(c) - if val > math.MaxInt32 { - iter.ReportError("ReadInt32", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return int32(val) -} - -// ReadUint32 read uint32 -func (iter *Iterator) ReadUint32() (ret uint32) { - return iter.readUint32(iter.nextToken()) -} - -func (iter *Iterator) readUint32(c byte) (ret uint32) { - ind := intDigits[c] - if ind == 0 { - iter.assertInteger() - return 0 // single zero - } - if ind == invalidCharForNumber { - iter.ReportError("readUint32", "unexpected character: "+string([]byte{byte(ind)})) - return - } - value := uint32(ind) - if iter.tail-iter.head > 10 { - i := iter.head - ind2 := intDigits[iter.buf[i]] - if ind2 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - i++ - ind3 := intDigits[iter.buf[i]] - if ind3 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10 + uint32(ind2) - } - //iter.head = i + 1 - //value = value * 100 + uint32(ind2) * 10 + uint32(ind3) - i++ - ind4 := intDigits[iter.buf[i]] - if ind4 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100 + uint32(ind2)*10 + uint32(ind3) - } - i++ - ind5 := intDigits[iter.buf[i]] - if ind5 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000 + uint32(ind2)*100 + uint32(ind3)*10 + uint32(ind4) - } - i++ - ind6 := intDigits[iter.buf[i]] - if ind6 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10000 + uint32(ind2)*1000 + uint32(ind3)*100 + uint32(ind4)*10 + uint32(ind5) - } - i++ - ind7 := intDigits[iter.buf[i]] - if ind7 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100000 + uint32(ind2)*10000 + uint32(ind3)*1000 + uint32(ind4)*100 + uint32(ind5)*10 + uint32(ind6) - } - i++ - ind8 := intDigits[iter.buf[i]] - if ind8 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000000 + uint32(ind2)*100000 + uint32(ind3)*10000 + uint32(ind4)*1000 + uint32(ind5)*100 + uint32(ind6)*10 + uint32(ind7) - } - i++ - ind9 := intDigits[iter.buf[i]] - value = value*10000000 + uint32(ind2)*1000000 + uint32(ind3)*100000 + uint32(ind4)*10000 + uint32(ind5)*1000 + uint32(ind6)*100 + uint32(ind7)*10 + uint32(ind8) - iter.head = i - if ind9 == invalidCharForNumber { - iter.assertInteger() - return value - } - } - for { - for i := iter.head; i < iter.tail; i++ { - ind = intDigits[iter.buf[i]] - if ind == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - if value > uint32SafeToMultiply10 { - value2 := (value << 3) + (value << 1) + uint32(ind) - if value2 < value { - iter.ReportError("readUint32", "overflow") - return - } - value = value2 - continue - } - value = (value << 3) + (value << 1) + uint32(ind) - } - if !iter.loadMore() { - iter.assertInteger() - return value - } - } -} - -// ReadInt64 read int64 -func (iter *Iterator) ReadInt64() (ret int64) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint64(iter.readByte()) - if val > math.MaxInt64+1 { - iter.ReportError("ReadInt64", "overflow: "+strconv.FormatUint(uint64(val), 10)) - return - } - return -int64(val) - } - val := iter.readUint64(c) - if val > math.MaxInt64 { - iter.ReportError("ReadInt64", "overflow: "+strconv.FormatUint(uint64(val), 10)) - return - } - return int64(val) -} - -// ReadUint64 read uint64 -func (iter *Iterator) ReadUint64() uint64 { - return iter.readUint64(iter.nextToken()) -} - -func (iter *Iterator) readUint64(c byte) (ret uint64) { - ind := intDigits[c] - if ind == 0 { - iter.assertInteger() - return 0 // single zero - } - if ind == invalidCharForNumber { - iter.ReportError("readUint64", "unexpected character: "+string([]byte{byte(ind)})) - return - } - value := uint64(ind) - if iter.tail-iter.head > 10 { - i := iter.head - ind2 := intDigits[iter.buf[i]] - if ind2 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - i++ - ind3 := intDigits[iter.buf[i]] - if ind3 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10 + uint64(ind2) - } - //iter.head = i + 1 - //value = value * 100 + uint32(ind2) * 10 + uint32(ind3) - i++ - ind4 := intDigits[iter.buf[i]] - if ind4 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100 + uint64(ind2)*10 + uint64(ind3) - } - i++ - ind5 := intDigits[iter.buf[i]] - if ind5 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000 + uint64(ind2)*100 + uint64(ind3)*10 + uint64(ind4) - } - i++ - ind6 := intDigits[iter.buf[i]] - if ind6 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10000 + uint64(ind2)*1000 + uint64(ind3)*100 + uint64(ind4)*10 + uint64(ind5) - } - i++ - ind7 := intDigits[iter.buf[i]] - if ind7 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100000 + uint64(ind2)*10000 + uint64(ind3)*1000 + uint64(ind4)*100 + uint64(ind5)*10 + uint64(ind6) - } - i++ - ind8 := intDigits[iter.buf[i]] - if ind8 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000000 + uint64(ind2)*100000 + uint64(ind3)*10000 + uint64(ind4)*1000 + uint64(ind5)*100 + uint64(ind6)*10 + uint64(ind7) - } - i++ - ind9 := intDigits[iter.buf[i]] - value = value*10000000 + uint64(ind2)*1000000 + uint64(ind3)*100000 + uint64(ind4)*10000 + uint64(ind5)*1000 + uint64(ind6)*100 + uint64(ind7)*10 + uint64(ind8) - iter.head = i - if ind9 == invalidCharForNumber { - iter.assertInteger() - return value - } - } - for { - for i := iter.head; i < iter.tail; i++ { - ind = intDigits[iter.buf[i]] - if ind == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - if value > uint64SafeToMultiple10 { - value2 := (value << 3) + (value << 1) + uint64(ind) - if value2 < value { - iter.ReportError("readUint64", "overflow") - return - } - value = value2 - continue - } - value = (value << 3) + (value << 1) + uint64(ind) - } - if !iter.loadMore() { - iter.assertInteger() - return value - } - } -} - -func (iter *Iterator) assertInteger() { - if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' { - iter.ReportError("assertInteger", "can not decode float as int") - } -} diff --git a/vendor/github.com/json-iterator/go/iter_object.go b/vendor/github.com/json-iterator/go/iter_object.go deleted file mode 100644 index b651371..0000000 --- a/vendor/github.com/json-iterator/go/iter_object.go +++ /dev/null @@ -1,267 +0,0 @@ -package jsoniter - -import ( - "fmt" - "strings" -) - -// ReadObject read one field from object. -// If object ended, returns empty string. -// Otherwise, returns the field name. -func (iter *Iterator) ReadObject() (ret string) { - c := iter.nextToken() - switch c { - case 'n': - iter.skipThreeBytes('u', 'l', 'l') - return "" // null - case '{': - c = iter.nextToken() - if c == '"' { - iter.unreadByte() - field := iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - return field - } - if c == '}' { - return "" // end of object - } - iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c})) - return - case ',': - field := iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - return field - case '}': - return "" // end of object - default: - iter.ReportError("ReadObject", fmt.Sprintf(`expect { or , or } or n, but found %s`, string([]byte{c}))) - return - } -} - -// CaseInsensitive -func (iter *Iterator) readFieldHash() int64 { - hash := int64(0x811c9dc5) - c := iter.nextToken() - if c != '"' { - iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c})) - return 0 - } - for { - for i := iter.head; i < iter.tail; i++ { - // require ascii string and no escape - b := iter.buf[i] - if b == '\\' { - iter.head = i - for _, b := range iter.readStringSlowPath() { - if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { - b += 'a' - 'A' - } - hash ^= int64(b) - hash *= 0x1000193 - } - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 - } - return hash - } - if b == '"' { - iter.head = i + 1 - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 - } - return hash - } - if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { - b += 'a' - 'A' - } - hash ^= int64(b) - hash *= 0x1000193 - } - if !iter.loadMore() { - iter.ReportError("readFieldHash", `incomplete field name`) - return 0 - } - } -} - -func calcHash(str string, caseSensitive bool) int64 { - if !caseSensitive { - str = strings.ToLower(str) - } - hash := int64(0x811c9dc5) - for _, b := range []byte(str) { - hash ^= int64(b) - hash *= 0x1000193 - } - return int64(hash) -} - -// ReadObjectCB read object with callback, the key is ascii only and field name not copied -func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { - c := iter.nextToken() - var field string - if c == '{' { - if !iter.incrementDepth() { - return false - } - c = iter.nextToken() - if c == '"' { - iter.unreadByte() - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - if !callback(iter, field) { - iter.decrementDepth() - return false - } - c = iter.nextToken() - for c == ',' { - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - if !callback(iter, field) { - iter.decrementDepth() - return false - } - c = iter.nextToken() - } - if c != '}' { - iter.ReportError("ReadObjectCB", `object not ended with }`) - iter.decrementDepth() - return false - } - return iter.decrementDepth() - } - if c == '}' { - return iter.decrementDepth() - } - iter.ReportError("ReadObjectCB", `expect " after }, but found `+string([]byte{c})) - iter.decrementDepth() - return false - } - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return true // null - } - iter.ReportError("ReadObjectCB", `expect { or n, but found `+string([]byte{c})) - return false -} - -// ReadMapCB read map with callback, the key can be any string -func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool { - c := iter.nextToken() - if c == '{' { - if !iter.incrementDepth() { - return false - } - c = iter.nextToken() - if c == '"' { - iter.unreadByte() - field := iter.ReadString() - if iter.nextToken() != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - iter.decrementDepth() - return false - } - if !callback(iter, field) { - iter.decrementDepth() - return false - } - c = iter.nextToken() - for c == ',' { - field = iter.ReadString() - if iter.nextToken() != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - iter.decrementDepth() - return false - } - if !callback(iter, field) { - iter.decrementDepth() - return false - } - c = iter.nextToken() - } - if c != '}' { - iter.ReportError("ReadMapCB", `object not ended with }`) - iter.decrementDepth() - return false - } - return iter.decrementDepth() - } - if c == '}' { - return iter.decrementDepth() - } - iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) - iter.decrementDepth() - return false - } - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return true // null - } - iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) - return false -} - -func (iter *Iterator) readObjectStart() bool { - c := iter.nextToken() - if c == '{' { - c = iter.nextToken() - if c == '}' { - return false - } - iter.unreadByte() - return true - } else if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return false - } - iter.ReportError("readObjectStart", "expect { or n, but found "+string([]byte{c})) - return false -} - -func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) { - str := iter.ReadStringAsSlice() - if iter.skipWhitespacesWithoutLoadMore() { - if ret == nil { - ret = make([]byte, len(str)) - copy(ret, str) - } - if !iter.loadMore() { - return - } - } - if iter.buf[iter.head] != ':' { - iter.ReportError("readObjectFieldAsBytes", "expect : after object field, but found "+string([]byte{iter.buf[iter.head]})) - return - } - iter.head++ - if iter.skipWhitespacesWithoutLoadMore() { - if ret == nil { - ret = make([]byte, len(str)) - copy(ret, str) - } - if !iter.loadMore() { - return - } - } - if ret == nil { - return str - } - return ret -} diff --git a/vendor/github.com/json-iterator/go/iter_skip.go b/vendor/github.com/json-iterator/go/iter_skip.go deleted file mode 100644 index e91eefb..0000000 --- a/vendor/github.com/json-iterator/go/iter_skip.go +++ /dev/null @@ -1,130 +0,0 @@ -package jsoniter - -import "fmt" - -// ReadNil reads a json object as nil and -// returns whether it's a nil or not -func (iter *Iterator) ReadNil() (ret bool) { - c := iter.nextToken() - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') // null - return true - } - iter.unreadByte() - return false -} - -// ReadBool reads a json object as BoolValue -func (iter *Iterator) ReadBool() (ret bool) { - c := iter.nextToken() - if c == 't' { - iter.skipThreeBytes('r', 'u', 'e') - return true - } - if c == 'f' { - iter.skipFourBytes('a', 'l', 's', 'e') - return false - } - iter.ReportError("ReadBool", "expect t or f, but found "+string([]byte{c})) - return -} - -// SkipAndReturnBytes skip next JSON element, and return its content as []byte. -// The []byte can be kept, it is a copy of data. -func (iter *Iterator) SkipAndReturnBytes() []byte { - iter.startCapture(iter.head) - iter.Skip() - return iter.stopCapture() -} - -// SkipAndAppendBytes skips next JSON element and appends its content to -// buffer, returning the result. -func (iter *Iterator) SkipAndAppendBytes(buf []byte) []byte { - iter.startCaptureTo(buf, iter.head) - iter.Skip() - return iter.stopCapture() -} - -func (iter *Iterator) startCaptureTo(buf []byte, captureStartedAt int) { - if iter.captured != nil { - panic("already in capture mode") - } - iter.captureStartedAt = captureStartedAt - iter.captured = buf -} - -func (iter *Iterator) startCapture(captureStartedAt int) { - iter.startCaptureTo(make([]byte, 0, 32), captureStartedAt) -} - -func (iter *Iterator) stopCapture() []byte { - if iter.captured == nil { - panic("not in capture mode") - } - captured := iter.captured - remaining := iter.buf[iter.captureStartedAt:iter.head] - iter.captureStartedAt = -1 - iter.captured = nil - return append(captured, remaining...) -} - -// Skip skips a json object and positions to relatively the next json object -func (iter *Iterator) Skip() { - c := iter.nextToken() - switch c { - case '"': - iter.skipString() - case 'n': - iter.skipThreeBytes('u', 'l', 'l') // null - case 't': - iter.skipThreeBytes('r', 'u', 'e') // true - case 'f': - iter.skipFourBytes('a', 'l', 's', 'e') // false - case '0': - iter.unreadByte() - iter.ReadFloat32() - case '-', '1', '2', '3', '4', '5', '6', '7', '8', '9': - iter.skipNumber() - case '[': - iter.skipArray() - case '{': - iter.skipObject() - default: - iter.ReportError("Skip", fmt.Sprintf("do not know how to skip: %v", c)) - return - } -} - -func (iter *Iterator) skipFourBytes(b1, b2, b3, b4 byte) { - if iter.readByte() != b1 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } - if iter.readByte() != b2 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } - if iter.readByte() != b3 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } - if iter.readByte() != b4 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } -} - -func (iter *Iterator) skipThreeBytes(b1, b2, b3 byte) { - if iter.readByte() != b1 { - iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) - return - } - if iter.readByte() != b2 { - iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) - return - } - if iter.readByte() != b3 { - iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) - return - } -} diff --git a/vendor/github.com/json-iterator/go/iter_skip_sloppy.go b/vendor/github.com/json-iterator/go/iter_skip_sloppy.go deleted file mode 100644 index 9303de4..0000000 --- a/vendor/github.com/json-iterator/go/iter_skip_sloppy.go +++ /dev/null @@ -1,163 +0,0 @@ -//+build jsoniter_sloppy - -package jsoniter - -// sloppy but faster implementation, do not validate the input json - -func (iter *Iterator) skipNumber() { - for { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case ' ', '\n', '\r', '\t', ',', '}', ']': - iter.head = i - return - } - } - if !iter.loadMore() { - return - } - } -} - -func (iter *Iterator) skipArray() { - level := 1 - if !iter.incrementDepth() { - return - } - for { - for i := iter.head; i < iter.tail; i++ { - switch iter.buf[i] { - case '"': // If inside string, skip it - iter.head = i + 1 - iter.skipString() - i = iter.head - 1 // it will be i++ soon - case '[': // If open symbol, increase level - level++ - if !iter.incrementDepth() { - return - } - case ']': // If close symbol, increase level - level-- - if !iter.decrementDepth() { - return - } - - // If we have returned to the original level, we're done - if level == 0 { - iter.head = i + 1 - return - } - } - } - if !iter.loadMore() { - iter.ReportError("skipObject", "incomplete array") - return - } - } -} - -func (iter *Iterator) skipObject() { - level := 1 - if !iter.incrementDepth() { - return - } - - for { - for i := iter.head; i < iter.tail; i++ { - switch iter.buf[i] { - case '"': // If inside string, skip it - iter.head = i + 1 - iter.skipString() - i = iter.head - 1 // it will be i++ soon - case '{': // If open symbol, increase level - level++ - if !iter.incrementDepth() { - return - } - case '}': // If close symbol, increase level - level-- - if !iter.decrementDepth() { - return - } - - // If we have returned to the original level, we're done - if level == 0 { - iter.head = i + 1 - return - } - } - } - if !iter.loadMore() { - iter.ReportError("skipObject", "incomplete object") - return - } - } -} - -func (iter *Iterator) skipString() { - for { - end, escaped := iter.findStringEnd() - if end == -1 { - if !iter.loadMore() { - iter.ReportError("skipString", "incomplete string") - return - } - if escaped { - iter.head = 1 // skip the first char as last char read is \ - } - } else { - iter.head = end - return - } - } -} - -// adapted from: https://github.com/buger/jsonparser/blob/master/parser.go -// Tries to find the end of string -// Support if string contains escaped quote symbols. -func (iter *Iterator) findStringEnd() (int, bool) { - escaped := false - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - if c == '"' { - if !escaped { - return i + 1, false - } - j := i - 1 - for { - if j < iter.head || iter.buf[j] != '\\' { - // even number of backslashes - // either end of buffer, or " found - return i + 1, true - } - j-- - if j < iter.head || iter.buf[j] != '\\' { - // odd number of backslashes - // it is \" or \\\" - break - } - j-- - } - } else if c == '\\' { - escaped = true - } - } - j := iter.tail - 1 - for { - if j < iter.head || iter.buf[j] != '\\' { - // even number of backslashes - // either end of buffer, or " found - return -1, false // do not end with \ - } - j-- - if j < iter.head || iter.buf[j] != '\\' { - // odd number of backslashes - // it is \" or \\\" - break - } - j-- - - } - return -1, true // end with \ -} diff --git a/vendor/github.com/json-iterator/go/iter_skip_strict.go b/vendor/github.com/json-iterator/go/iter_skip_strict.go deleted file mode 100644 index 6cf66d0..0000000 --- a/vendor/github.com/json-iterator/go/iter_skip_strict.go +++ /dev/null @@ -1,99 +0,0 @@ -//+build !jsoniter_sloppy - -package jsoniter - -import ( - "fmt" - "io" -) - -func (iter *Iterator) skipNumber() { - if !iter.trySkipNumber() { - iter.unreadByte() - if iter.Error != nil && iter.Error != io.EOF { - return - } - iter.ReadFloat64() - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = nil - iter.ReadBigFloat() - } - } -} - -func (iter *Iterator) trySkipNumber() bool { - dotFound := false - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - case '.': - if dotFound { - iter.ReportError("validateNumber", `more than one dot found in number`) - return true // already failed - } - if i+1 == iter.tail { - return false - } - c = iter.buf[i+1] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - default: - iter.ReportError("validateNumber", `missing digit after dot`) - return true // already failed - } - dotFound = true - default: - switch c { - case ',', ']', '}', ' ', '\t', '\n', '\r': - if iter.head == i { - return false // if - without following digits - } - iter.head = i - return true // must be valid - } - return false // may be invalid - } - } - return false -} - -func (iter *Iterator) skipString() { - if !iter.trySkipString() { - iter.unreadByte() - iter.ReadString() - } -} - -func (iter *Iterator) trySkipString() bool { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - if c == '"' { - iter.head = i + 1 - return true // valid - } else if c == '\\' { - return false - } else if c < ' ' { - iter.ReportError("trySkipString", - fmt.Sprintf(`invalid control character found: %d`, c)) - return true // already failed - } - } - return false -} - -func (iter *Iterator) skipObject() { - iter.unreadByte() - iter.ReadObjectCB(func(iter *Iterator, field string) bool { - iter.Skip() - return true - }) -} - -func (iter *Iterator) skipArray() { - iter.unreadByte() - iter.ReadArrayCB(func(iter *Iterator) bool { - iter.Skip() - return true - }) -} diff --git a/vendor/github.com/json-iterator/go/iter_str.go b/vendor/github.com/json-iterator/go/iter_str.go deleted file mode 100644 index adc487e..0000000 --- a/vendor/github.com/json-iterator/go/iter_str.go +++ /dev/null @@ -1,215 +0,0 @@ -package jsoniter - -import ( - "fmt" - "unicode/utf16" -) - -// ReadString read string from iterator -func (iter *Iterator) ReadString() (ret string) { - c := iter.nextToken() - if c == '"' { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - if c == '"' { - ret = string(iter.buf[iter.head:i]) - iter.head = i + 1 - return ret - } else if c == '\\' { - break - } else if c < ' ' { - iter.ReportError("ReadString", - fmt.Sprintf(`invalid control character found: %d`, c)) - return - } - } - return iter.readStringSlowPath() - } else if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return "" - } - iter.ReportError("ReadString", `expects " or n, but found `+string([]byte{c})) - return -} - -func (iter *Iterator) readStringSlowPath() (ret string) { - var str []byte - var c byte - for iter.Error == nil { - c = iter.readByte() - if c == '"' { - return string(str) - } - if c == '\\' { - c = iter.readByte() - str = iter.readEscapedChar(c, str) - } else { - str = append(str, c) - } - } - iter.ReportError("readStringSlowPath", "unexpected end of input") - return -} - -func (iter *Iterator) readEscapedChar(c byte, str []byte) []byte { - switch c { - case 'u': - r := iter.readU4() - if utf16.IsSurrogate(r) { - c = iter.readByte() - if iter.Error != nil { - return nil - } - if c != '\\' { - iter.unreadByte() - str = appendRune(str, r) - return str - } - c = iter.readByte() - if iter.Error != nil { - return nil - } - if c != 'u' { - str = appendRune(str, r) - return iter.readEscapedChar(c, str) - } - r2 := iter.readU4() - if iter.Error != nil { - return nil - } - combined := utf16.DecodeRune(r, r2) - if combined == '\uFFFD' { - str = appendRune(str, r) - str = appendRune(str, r2) - } else { - str = appendRune(str, combined) - } - } else { - str = appendRune(str, r) - } - case '"': - str = append(str, '"') - case '\\': - str = append(str, '\\') - case '/': - str = append(str, '/') - case 'b': - str = append(str, '\b') - case 'f': - str = append(str, '\f') - case 'n': - str = append(str, '\n') - case 'r': - str = append(str, '\r') - case 't': - str = append(str, '\t') - default: - iter.ReportError("readEscapedChar", - `invalid escape char after \`) - return nil - } - return str -} - -// ReadStringAsSlice read string from iterator without copying into string form. -// The []byte can not be kept, as it will change after next iterator call. -func (iter *Iterator) ReadStringAsSlice() (ret []byte) { - c := iter.nextToken() - if c == '"' { - for i := iter.head; i < iter.tail; i++ { - // require ascii string and no escape - // for: field name, base64, number - if iter.buf[i] == '"' { - // fast path: reuse the underlying buffer - ret = iter.buf[iter.head:i] - iter.head = i + 1 - return ret - } - } - readLen := iter.tail - iter.head - copied := make([]byte, readLen, readLen*2) - copy(copied, iter.buf[iter.head:iter.tail]) - iter.head = iter.tail - for iter.Error == nil { - c := iter.readByte() - if c == '"' { - return copied - } - copied = append(copied, c) - } - return copied - } - iter.ReportError("ReadStringAsSlice", `expects " or n, but found `+string([]byte{c})) - return -} - -func (iter *Iterator) readU4() (ret rune) { - for i := 0; i < 4; i++ { - c := iter.readByte() - if iter.Error != nil { - return - } - if c >= '0' && c <= '9' { - ret = ret*16 + rune(c-'0') - } else if c >= 'a' && c <= 'f' { - ret = ret*16 + rune(c-'a'+10) - } else if c >= 'A' && c <= 'F' { - ret = ret*16 + rune(c-'A'+10) - } else { - iter.ReportError("readU4", "expects 0~9 or a~f, but found "+string([]byte{c})) - return - } - } - return ret -} - -const ( - t1 = 0x00 // 0000 0000 - tx = 0x80 // 1000 0000 - t2 = 0xC0 // 1100 0000 - t3 = 0xE0 // 1110 0000 - t4 = 0xF0 // 1111 0000 - t5 = 0xF8 // 1111 1000 - - maskx = 0x3F // 0011 1111 - mask2 = 0x1F // 0001 1111 - mask3 = 0x0F // 0000 1111 - mask4 = 0x07 // 0000 0111 - - rune1Max = 1<<7 - 1 - rune2Max = 1<<11 - 1 - rune3Max = 1<<16 - 1 - - surrogateMin = 0xD800 - surrogateMax = 0xDFFF - - maxRune = '\U0010FFFF' // Maximum valid Unicode code point. - runeError = '\uFFFD' // the "error" Rune or "Unicode replacement character" -) - -func appendRune(p []byte, r rune) []byte { - // Negative values are erroneous. Making it unsigned addresses the problem. - switch i := uint32(r); { - case i <= rune1Max: - p = append(p, byte(r)) - return p - case i <= rune2Max: - p = append(p, t2|byte(r>>6)) - p = append(p, tx|byte(r)&maskx) - return p - case i > maxRune, surrogateMin <= i && i <= surrogateMax: - r = runeError - fallthrough - case i <= rune3Max: - p = append(p, t3|byte(r>>12)) - p = append(p, tx|byte(r>>6)&maskx) - p = append(p, tx|byte(r)&maskx) - return p - default: - p = append(p, t4|byte(r>>18)) - p = append(p, tx|byte(r>>12)&maskx) - p = append(p, tx|byte(r>>6)&maskx) - p = append(p, tx|byte(r)&maskx) - return p - } -} diff --git a/vendor/github.com/json-iterator/go/jsoniter.go b/vendor/github.com/json-iterator/go/jsoniter.go deleted file mode 100644 index c2934f9..0000000 --- a/vendor/github.com/json-iterator/go/jsoniter.go +++ /dev/null @@ -1,18 +0,0 @@ -// Package jsoniter implements encoding and decoding of JSON as defined in -// RFC 4627 and provides interfaces with identical syntax of standard lib encoding/json. -// Converting from encoding/json to jsoniter is no more than replacing the package with jsoniter -// and variable type declarations (if any). -// jsoniter interfaces gives 100% compatibility with code using standard lib. -// -// "JSON and Go" -// (https://golang.org/doc/articles/json_and_go.html) -// gives a description of how Marshal/Unmarshal operate -// between arbitrary or predefined json objects and bytes, -// and it applies to jsoniter.Marshal/Unmarshal as well. -// -// Besides, jsoniter.Iterator provides a different set of interfaces -// iterating given bytes/string/reader -// and yielding parsed elements one by one. -// This set of interfaces reads input as required and gives -// better performance. -package jsoniter diff --git a/vendor/github.com/json-iterator/go/pool.go b/vendor/github.com/json-iterator/go/pool.go deleted file mode 100644 index e2389b5..0000000 --- a/vendor/github.com/json-iterator/go/pool.go +++ /dev/null @@ -1,42 +0,0 @@ -package jsoniter - -import ( - "io" -) - -// IteratorPool a thread safe pool of iterators with same configuration -type IteratorPool interface { - BorrowIterator(data []byte) *Iterator - ReturnIterator(iter *Iterator) -} - -// StreamPool a thread safe pool of streams with same configuration -type StreamPool interface { - BorrowStream(writer io.Writer) *Stream - ReturnStream(stream *Stream) -} - -func (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream { - stream := cfg.streamPool.Get().(*Stream) - stream.Reset(writer) - return stream -} - -func (cfg *frozenConfig) ReturnStream(stream *Stream) { - stream.out = nil - stream.Error = nil - stream.Attachment = nil - cfg.streamPool.Put(stream) -} - -func (cfg *frozenConfig) BorrowIterator(data []byte) *Iterator { - iter := cfg.iteratorPool.Get().(*Iterator) - iter.ResetBytes(data) - return iter -} - -func (cfg *frozenConfig) ReturnIterator(iter *Iterator) { - iter.Error = nil - iter.Attachment = nil - cfg.iteratorPool.Put(iter) -} diff --git a/vendor/github.com/json-iterator/go/reflect.go b/vendor/github.com/json-iterator/go/reflect.go deleted file mode 100644 index 74974ba..0000000 --- a/vendor/github.com/json-iterator/go/reflect.go +++ /dev/null @@ -1,337 +0,0 @@ -package jsoniter - -import ( - "fmt" - "reflect" - "unsafe" - - "github.com/modern-go/reflect2" -) - -// ValDecoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValDecoder with json.Decoder. -// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link). -// -// Reflection on type to create decoders, which is then cached -// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions -// 1. create instance of new value, for example *int will need a int to be allocated -// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New -// 3. assignment to map, both key and value will be reflect.Value -// For a simple struct binding, it will be reflect.Value free and allocation free -type ValDecoder interface { - Decode(ptr unsafe.Pointer, iter *Iterator) -} - -// ValEncoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValEncoder with json.Encoder. -// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link). -type ValEncoder interface { - IsEmpty(ptr unsafe.Pointer) bool - Encode(ptr unsafe.Pointer, stream *Stream) -} - -type checkIsEmpty interface { - IsEmpty(ptr unsafe.Pointer) bool -} - -type ctx struct { - *frozenConfig - prefix string - encoders map[reflect2.Type]ValEncoder - decoders map[reflect2.Type]ValDecoder -} - -func (b *ctx) caseSensitive() bool { - if b.frozenConfig == nil { - // default is case-insensitive - return false - } - return b.frozenConfig.caseSensitive -} - -func (b *ctx) append(prefix string) *ctx { - return &ctx{ - frozenConfig: b.frozenConfig, - prefix: b.prefix + " " + prefix, - encoders: b.encoders, - decoders: b.decoders, - } -} - -// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal -func (iter *Iterator) ReadVal(obj interface{}) { - depth := iter.depth - cacheKey := reflect2.RTypeOf(obj) - decoder := iter.cfg.getDecoderFromCache(cacheKey) - if decoder == nil { - typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { - iter.ReportError("ReadVal", "can only unmarshal into pointer") - return - } - decoder = iter.cfg.DecoderOf(typ) - } - ptr := reflect2.PtrOf(obj) - if ptr == nil { - iter.ReportError("ReadVal", "can not read into nil pointer") - return - } - decoder.Decode(ptr, iter) - if iter.depth != depth { - iter.ReportError("ReadVal", "unexpected mismatched nesting") - return - } -} - -// WriteVal copy the go interface into underlying JSON, same as json.Marshal -func (stream *Stream) WriteVal(val interface{}) { - if nil == val { - stream.WriteNil() - return - } - cacheKey := reflect2.RTypeOf(val) - encoder := stream.cfg.getEncoderFromCache(cacheKey) - if encoder == nil { - typ := reflect2.TypeOf(val) - encoder = stream.cfg.EncoderOf(typ) - } - encoder.Encode(reflect2.PtrOf(val), stream) -} - -func (cfg *frozenConfig) DecoderOf(typ reflect2.Type) ValDecoder { - cacheKey := typ.RType() - decoder := cfg.getDecoderFromCache(cacheKey) - if decoder != nil { - return decoder - } - ctx := &ctx{ - frozenConfig: cfg, - prefix: "", - decoders: map[reflect2.Type]ValDecoder{}, - encoders: map[reflect2.Type]ValEncoder{}, - } - ptrType := typ.(*reflect2.UnsafePtrType) - decoder = decoderOfType(ctx, ptrType.Elem()) - cfg.addDecoderToCache(cacheKey, decoder) - return decoder -} - -func decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := getTypeDecoderFromExtension(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfType(ctx, typ) - for _, extension := range extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - decoder = ctx.decoderExtension.DecorateDecoder(typ, decoder) - for _, extension := range ctx.extraExtensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - return decoder -} - -func createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := ctx.decoders[typ] - if decoder != nil { - return decoder - } - placeholder := &placeholderDecoder{} - ctx.decoders[typ] = placeholder - decoder = _createDecoderOfType(ctx, typ) - placeholder.decoder = decoder - return decoder -} - -func _createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := createDecoderOfJsonRawMessage(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfJsonNumber(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfMarshaler(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfAny(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfNative(ctx, typ) - if decoder != nil { - return decoder - } - switch typ.Kind() { - case reflect.Interface: - ifaceType, isIFace := typ.(*reflect2.UnsafeIFaceType) - if isIFace { - return &ifaceDecoder{valType: ifaceType} - } - return &efaceDecoder{} - case reflect.Struct: - return decoderOfStruct(ctx, typ) - case reflect.Array: - return decoderOfArray(ctx, typ) - case reflect.Slice: - return decoderOfSlice(ctx, typ) - case reflect.Map: - return decoderOfMap(ctx, typ) - case reflect.Ptr: - return decoderOfOptional(ctx, typ) - default: - return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} - } -} - -func (cfg *frozenConfig) EncoderOf(typ reflect2.Type) ValEncoder { - cacheKey := typ.RType() - encoder := cfg.getEncoderFromCache(cacheKey) - if encoder != nil { - return encoder - } - ctx := &ctx{ - frozenConfig: cfg, - prefix: "", - decoders: map[reflect2.Type]ValDecoder{}, - encoders: map[reflect2.Type]ValEncoder{}, - } - encoder = encoderOfType(ctx, typ) - if typ.LikePtr() { - encoder = &onePtrEncoder{encoder} - } - cfg.addEncoderToCache(cacheKey, encoder) - return encoder -} - -type onePtrEncoder struct { - encoder ValEncoder -} - -func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) -} - -func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) -} - -func encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := getTypeEncoderFromExtension(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfType(ctx, typ) - for _, extension := range extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - encoder = ctx.encoderExtension.DecorateEncoder(typ, encoder) - for _, extension := range ctx.extraExtensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - return encoder -} - -func createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := ctx.encoders[typ] - if encoder != nil { - return encoder - } - placeholder := &placeholderEncoder{} - ctx.encoders[typ] = placeholder - encoder = _createEncoderOfType(ctx, typ) - placeholder.encoder = encoder - return encoder -} -func _createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := createEncoderOfJsonRawMessage(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfJsonNumber(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfMarshaler(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfAny(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfNative(ctx, typ) - if encoder != nil { - return encoder - } - kind := typ.Kind() - switch kind { - case reflect.Interface: - return &dynamicEncoder{typ} - case reflect.Struct: - return encoderOfStruct(ctx, typ) - case reflect.Array: - return encoderOfArray(ctx, typ) - case reflect.Slice: - return encoderOfSlice(ctx, typ) - case reflect.Map: - return encoderOfMap(ctx, typ) - case reflect.Ptr: - return encoderOfOptional(ctx, typ) - default: - return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} - } -} - -type lazyErrorDecoder struct { - err error -} - -func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.WhatIsNext() != NilValue { - if iter.Error == nil { - iter.Error = decoder.err - } - } else { - iter.Skip() - } -} - -type lazyErrorEncoder struct { - err error -} - -func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if ptr == nil { - stream.WriteNil() - } else if stream.Error == nil { - stream.Error = encoder.err - } -} - -func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type placeholderDecoder struct { - decoder ValDecoder -} - -func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.decoder.Decode(ptr, iter) -} - -type placeholderEncoder struct { - encoder ValEncoder -} - -func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(ptr, stream) -} - -func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(ptr) -} diff --git a/vendor/github.com/json-iterator/go/reflect_array.go b/vendor/github.com/json-iterator/go/reflect_array.go deleted file mode 100644 index 13a0b7b..0000000 --- a/vendor/github.com/json-iterator/go/reflect_array.go +++ /dev/null @@ -1,104 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "unsafe" -) - -func decoderOfArray(ctx *ctx, typ reflect2.Type) ValDecoder { - arrayType := typ.(*reflect2.UnsafeArrayType) - decoder := decoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) - return &arrayDecoder{arrayType, decoder} -} - -func encoderOfArray(ctx *ctx, typ reflect2.Type) ValEncoder { - arrayType := typ.(*reflect2.UnsafeArrayType) - if arrayType.Len() == 0 { - return emptyArrayEncoder{} - } - encoder := encoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) - return &arrayEncoder{arrayType, encoder} -} - -type emptyArrayEncoder struct{} - -func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteEmptyArray() -} - -func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return true -} - -type arrayEncoder struct { - arrayType *reflect2.UnsafeArrayType - elemEncoder ValEncoder -} - -func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteArrayStart() - elemPtr := unsafe.Pointer(ptr) - encoder.elemEncoder.Encode(elemPtr, stream) - for i := 1; i < encoder.arrayType.Len(); i++ { - stream.WriteMore() - elemPtr = encoder.arrayType.UnsafeGetIndex(ptr, i) - encoder.elemEncoder.Encode(elemPtr, stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error()) - } -} - -func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type arrayDecoder struct { - arrayType *reflect2.UnsafeArrayType - elemDecoder ValDecoder -} - -func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error()) - } -} - -func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - arrayType := decoder.arrayType - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return - } - if c != '[' { - iter.ReportError("decode array", "expect [ or n, but found "+string([]byte{c})) - return - } - c = iter.nextToken() - if c == ']' { - return - } - iter.unreadByte() - elemPtr := arrayType.UnsafeGetIndex(ptr, 0) - decoder.elemDecoder.Decode(elemPtr, iter) - length := 1 - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - if length >= arrayType.Len() { - iter.Skip() - continue - } - idx := length - length += 1 - elemPtr = arrayType.UnsafeGetIndex(ptr, idx) - decoder.elemDecoder.Decode(elemPtr, iter) - } - if c != ']' { - iter.ReportError("decode array", "expect ], but found "+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_dynamic.go b/vendor/github.com/json-iterator/go/reflect_dynamic.go deleted file mode 100644 index 8b6bc8b..0000000 --- a/vendor/github.com/json-iterator/go/reflect_dynamic.go +++ /dev/null @@ -1,70 +0,0 @@ -package jsoniter - -import ( - "github.com/modern-go/reflect2" - "reflect" - "unsafe" -) - -type dynamicEncoder struct { - valType reflect2.Type -} - -func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - stream.WriteVal(obj) -} - -func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.valType.UnsafeIndirect(ptr) == nil -} - -type efaceDecoder struct { -} - -func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - pObj := (*interface{})(ptr) - obj := *pObj - if obj == nil { - *pObj = iter.Read() - return - } - typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { - *pObj = iter.Read() - return - } - ptrType := typ.(*reflect2.UnsafePtrType) - ptrElemType := ptrType.Elem() - if iter.WhatIsNext() == NilValue { - if ptrElemType.Kind() != reflect.Ptr { - iter.skipFourBytes('n', 'u', 'l', 'l') - *pObj = nil - return - } - } - if reflect2.IsNil(obj) { - obj := ptrElemType.New() - iter.ReadVal(obj) - *pObj = obj - return - } - iter.ReadVal(obj) -} - -type ifaceDecoder struct { - valType *reflect2.UnsafeIFaceType -} - -func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew()) - return - } - obj := decoder.valType.UnsafeIndirect(ptr) - if reflect2.IsNil(obj) { - iter.ReportError("decode non empty interface", "can not unmarshal into nil") - return - } - iter.ReadVal(obj) -} diff --git a/vendor/github.com/json-iterator/go/reflect_extension.go b/vendor/github.com/json-iterator/go/reflect_extension.go deleted file mode 100644 index 80320cd..0000000 --- a/vendor/github.com/json-iterator/go/reflect_extension.go +++ /dev/null @@ -1,483 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "reflect" - "sort" - "strings" - "unicode" - "unsafe" -) - -var typeDecoders = map[string]ValDecoder{} -var fieldDecoders = map[string]ValDecoder{} -var typeEncoders = map[string]ValEncoder{} -var fieldEncoders = map[string]ValEncoder{} -var extensions = []Extension{} - -// StructDescriptor describe how should we encode/decode the struct -type StructDescriptor struct { - Type reflect2.Type - Fields []*Binding -} - -// GetField get one field from the descriptor by its name. -// Can not use map here to keep field orders. -func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { - for _, binding := range structDescriptor.Fields { - if binding.Field.Name() == fieldName { - return binding - } - } - return nil -} - -// Binding describe how should we encode/decode the struct field -type Binding struct { - levels []int - Field reflect2.StructField - FromNames []string - ToNames []string - Encoder ValEncoder - Decoder ValDecoder -} - -// Extension the one for all SPI. Customize encoding/decoding by specifying alternate encoder/decoder. -// Can also rename fields by UpdateStructDescriptor. -type Extension interface { - UpdateStructDescriptor(structDescriptor *StructDescriptor) - CreateMapKeyDecoder(typ reflect2.Type) ValDecoder - CreateMapKeyEncoder(typ reflect2.Type) ValEncoder - CreateDecoder(typ reflect2.Type) ValDecoder - CreateEncoder(typ reflect2.Type) ValEncoder - DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder - DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder -} - -// DummyExtension embed this type get dummy implementation for all methods of Extension -type DummyExtension struct { -} - -// UpdateStructDescriptor No-op -func (extension *DummyExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - -// CreateMapKeyDecoder No-op -func (extension *DummyExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension *DummyExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// CreateDecoder No-op -func (extension *DummyExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateEncoder No-op -func (extension *DummyExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension *DummyExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension *DummyExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type EncoderExtension map[reflect2.Type]ValEncoder - -// UpdateStructDescriptor No-op -func (extension EncoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - -// CreateDecoder No-op -func (extension EncoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateEncoder get encoder from map -func (extension EncoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return extension[typ] -} - -// CreateMapKeyDecoder No-op -func (extension EncoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension EncoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension EncoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension EncoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type DecoderExtension map[reflect2.Type]ValDecoder - -// UpdateStructDescriptor No-op -func (extension DecoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - -// CreateMapKeyDecoder No-op -func (extension DecoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension DecoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// CreateDecoder get decoder from map -func (extension DecoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return extension[typ] -} - -// CreateEncoder No-op -func (extension DecoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension DecoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension DecoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type funcDecoder struct { - fun DecoderFunc -} - -func (decoder *funcDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.fun(ptr, iter) -} - -type funcEncoder struct { - fun EncoderFunc - isEmptyFunc func(ptr unsafe.Pointer) bool -} - -func (encoder *funcEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.fun(ptr, stream) -} - -func (encoder *funcEncoder) IsEmpty(ptr unsafe.Pointer) bool { - if encoder.isEmptyFunc == nil { - return false - } - return encoder.isEmptyFunc(ptr) -} - -// DecoderFunc the function form of TypeDecoder -type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator) - -// EncoderFunc the function form of TypeEncoder -type EncoderFunc func(ptr unsafe.Pointer, stream *Stream) - -// RegisterTypeDecoderFunc register TypeDecoder for a type with function -func RegisterTypeDecoderFunc(typ string, fun DecoderFunc) { - typeDecoders[typ] = &funcDecoder{fun} -} - -// RegisterTypeDecoder register TypeDecoder for a typ -func RegisterTypeDecoder(typ string, decoder ValDecoder) { - typeDecoders[typ] = decoder -} - -// RegisterFieldDecoderFunc register TypeDecoder for a struct field with function -func RegisterFieldDecoderFunc(typ string, field string, fun DecoderFunc) { - RegisterFieldDecoder(typ, field, &funcDecoder{fun}) -} - -// RegisterFieldDecoder register TypeDecoder for a struct field -func RegisterFieldDecoder(typ string, field string, decoder ValDecoder) { - fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = decoder -} - -// RegisterTypeEncoderFunc register TypeEncoder for a type with encode/isEmpty function -func RegisterTypeEncoderFunc(typ string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) { - typeEncoders[typ] = &funcEncoder{fun, isEmptyFunc} -} - -// RegisterTypeEncoder register TypeEncoder for a type -func RegisterTypeEncoder(typ string, encoder ValEncoder) { - typeEncoders[typ] = encoder -} - -// RegisterFieldEncoderFunc register TypeEncoder for a struct field with encode/isEmpty function -func RegisterFieldEncoderFunc(typ string, field string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) { - RegisterFieldEncoder(typ, field, &funcEncoder{fun, isEmptyFunc}) -} - -// RegisterFieldEncoder register TypeEncoder for a struct field -func RegisterFieldEncoder(typ string, field string, encoder ValEncoder) { - fieldEncoders[fmt.Sprintf("%s/%s", typ, field)] = encoder -} - -// RegisterExtension register extension -func RegisterExtension(extension Extension) { - extensions = append(extensions, extension) -} - -func getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := _getTypeDecoderFromExtension(ctx, typ) - if decoder != nil { - for _, extension := range extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - decoder = ctx.decoderExtension.DecorateDecoder(typ, decoder) - for _, extension := range ctx.extraExtensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - } - return decoder -} -func _getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { - for _, extension := range extensions { - decoder := extension.CreateDecoder(typ) - if decoder != nil { - return decoder - } - } - decoder := ctx.decoderExtension.CreateDecoder(typ) - if decoder != nil { - return decoder - } - for _, extension := range ctx.extraExtensions { - decoder := extension.CreateDecoder(typ) - if decoder != nil { - return decoder - } - } - typeName := typ.String() - decoder = typeDecoders[typeName] - if decoder != nil { - return decoder - } - if typ.Kind() == reflect.Ptr { - ptrType := typ.(*reflect2.UnsafePtrType) - decoder := typeDecoders[ptrType.Elem().String()] - if decoder != nil { - return &OptionalDecoder{ptrType.Elem(), decoder} - } - } - return nil -} - -func getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := _getTypeEncoderFromExtension(ctx, typ) - if encoder != nil { - for _, extension := range extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - encoder = ctx.encoderExtension.DecorateEncoder(typ, encoder) - for _, extension := range ctx.extraExtensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - } - return encoder -} - -func _getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { - for _, extension := range extensions { - encoder := extension.CreateEncoder(typ) - if encoder != nil { - return encoder - } - } - encoder := ctx.encoderExtension.CreateEncoder(typ) - if encoder != nil { - return encoder - } - for _, extension := range ctx.extraExtensions { - encoder := extension.CreateEncoder(typ) - if encoder != nil { - return encoder - } - } - typeName := typ.String() - encoder = typeEncoders[typeName] - if encoder != nil { - return encoder - } - if typ.Kind() == reflect.Ptr { - typePtr := typ.(*reflect2.UnsafePtrType) - encoder := typeEncoders[typePtr.Elem().String()] - if encoder != nil { - return &OptionalEncoder{encoder} - } - } - return nil -} - -func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { - structType := typ.(*reflect2.UnsafeStructType) - embeddedBindings := []*Binding{} - bindings := []*Binding{} - for i := 0; i < structType.NumField(); i++ { - field := structType.Field(i) - tag, hastag := field.Tag().Lookup(ctx.getTagKey()) - if ctx.onlyTaggedField && !hastag && !field.Anonymous() { - continue - } - if tag == "-" || field.Name() == "_" { - continue - } - tagParts := strings.Split(tag, ",") - if field.Anonymous() && (tag == "" || tagParts[0] == "") { - if field.Type().Kind() == reflect.Struct { - structDescriptor := describeStruct(ctx, field.Type()) - for _, binding := range structDescriptor.Fields { - binding.levels = append([]int{i}, binding.levels...) - omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} - binding.Decoder = &structFieldDecoder{field, binding.Decoder} - embeddedBindings = append(embeddedBindings, binding) - } - continue - } else if field.Type().Kind() == reflect.Ptr { - ptrType := field.Type().(*reflect2.UnsafePtrType) - if ptrType.Elem().Kind() == reflect.Struct { - structDescriptor := describeStruct(ctx, ptrType.Elem()) - for _, binding := range structDescriptor.Fields { - binding.levels = append([]int{i}, binding.levels...) - omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &dereferenceEncoder{binding.Encoder} - binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} - binding.Decoder = &dereferenceDecoder{ptrType.Elem(), binding.Decoder} - binding.Decoder = &structFieldDecoder{field, binding.Decoder} - embeddedBindings = append(embeddedBindings, binding) - } - continue - } - } - } - fieldNames := calcFieldNames(field.Name(), tagParts[0], tag) - fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name()) - decoder := fieldDecoders[fieldCacheKey] - if decoder == nil { - decoder = decoderOfType(ctx.append(field.Name()), field.Type()) - } - encoder := fieldEncoders[fieldCacheKey] - if encoder == nil { - encoder = encoderOfType(ctx.append(field.Name()), field.Type()) - } - binding := &Binding{ - Field: field, - FromNames: fieldNames, - ToNames: fieldNames, - Decoder: decoder, - Encoder: encoder, - } - binding.levels = []int{i} - bindings = append(bindings, binding) - } - return createStructDescriptor(ctx, typ, bindings, embeddedBindings) -} -func createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor { - structDescriptor := &StructDescriptor{ - Type: typ, - Fields: bindings, - } - for _, extension := range extensions { - extension.UpdateStructDescriptor(structDescriptor) - } - ctx.encoderExtension.UpdateStructDescriptor(structDescriptor) - ctx.decoderExtension.UpdateStructDescriptor(structDescriptor) - for _, extension := range ctx.extraExtensions { - extension.UpdateStructDescriptor(structDescriptor) - } - processTags(structDescriptor, ctx.frozenConfig) - // merge normal & embedded bindings & sort with original order - allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...)) - sort.Sort(allBindings) - structDescriptor.Fields = allBindings - return structDescriptor -} - -type sortableBindings []*Binding - -func (bindings sortableBindings) Len() int { - return len(bindings) -} - -func (bindings sortableBindings) Less(i, j int) bool { - left := bindings[i].levels - right := bindings[j].levels - k := 0 - for { - if left[k] < right[k] { - return true - } else if left[k] > right[k] { - return false - } - k++ - } -} - -func (bindings sortableBindings) Swap(i, j int) { - bindings[i], bindings[j] = bindings[j], bindings[i] -} - -func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { - for _, binding := range structDescriptor.Fields { - shouldOmitEmpty := false - tagParts := strings.Split(binding.Field.Tag().Get(cfg.getTagKey()), ",") - for _, tagPart := range tagParts[1:] { - if tagPart == "omitempty" { - shouldOmitEmpty = true - } else if tagPart == "string" { - if binding.Field.Type().Kind() == reflect.String { - binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg} - binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg} - } else { - binding.Decoder = &stringModeNumberDecoder{binding.Decoder} - binding.Encoder = &stringModeNumberEncoder{binding.Encoder} - } - } - } - binding.Decoder = &structFieldDecoder{binding.Field, binding.Decoder} - binding.Encoder = &structFieldEncoder{binding.Field, binding.Encoder, shouldOmitEmpty} - } -} - -func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string { - // ignore? - if wholeTag == "-" { - return []string{} - } - // rename? - var fieldNames []string - if tagProvidedFieldName == "" { - fieldNames = []string{originalFieldName} - } else { - fieldNames = []string{tagProvidedFieldName} - } - // private? - isNotExported := unicode.IsLower(rune(originalFieldName[0])) - if isNotExported { - fieldNames = []string{} - } - return fieldNames -} diff --git a/vendor/github.com/json-iterator/go/reflect_json_number.go b/vendor/github.com/json-iterator/go/reflect_json_number.go deleted file mode 100644 index 98d45c1..0000000 --- a/vendor/github.com/json-iterator/go/reflect_json_number.go +++ /dev/null @@ -1,112 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "github.com/modern-go/reflect2" - "strconv" - "unsafe" -) - -type Number string - -// String returns the literal text of the number. -func (n Number) String() string { return string(n) } - -// Float64 returns the number as a float64. -func (n Number) Float64() (float64, error) { - return strconv.ParseFloat(string(n), 64) -} - -// Int64 returns the number as an int64. -func (n Number) Int64() (int64, error) { - return strconv.ParseInt(string(n), 10, 64) -} - -func CastJsonNumber(val interface{}) (string, bool) { - switch typedVal := val.(type) { - case json.Number: - return string(typedVal), true - case Number: - return string(typedVal), true - } - return "", false -} - -var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem() -var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem() - -func createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{} - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{} - } - return nil -} - -func createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{} - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{} - } - return nil -} - -type jsonNumberCodec struct { -} - -func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*json.Number)(ptr)) = json.Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*json.Number)(ptr)) = "" - default: - *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - number := *((*json.Number)(ptr)) - if len(number) == 0 { - stream.writeByte('0') - } else { - stream.WriteRaw(string(number)) - } -} - -func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.Number)(ptr))) == 0 -} - -type jsoniterNumberCodec struct { -} - -func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*Number)(ptr)) = Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*Number)(ptr)) = "" - default: - *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - number := *((*Number)(ptr)) - if len(number) == 0 { - stream.writeByte('0') - } else { - stream.WriteRaw(string(number)) - } -} - -func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*Number)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go b/vendor/github.com/json-iterator/go/reflect_json_raw_message.go deleted file mode 100644 index f261993..0000000 --- a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go +++ /dev/null @@ -1,60 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "github.com/modern-go/reflect2" - "unsafe" -) - -var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem() -var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem() - -func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{} - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{} - } - return nil -} - -func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{} - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{} - } - return nil -} - -type jsonRawMessageCodec struct { -} - -func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) -} - -func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.RawMessage)(ptr))) == 0 -} - -type jsoniterRawMessageCodec struct { -} - -func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*RawMessage)(ptr)))) -} - -func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*RawMessage)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_map.go b/vendor/github.com/json-iterator/go/reflect_map.go deleted file mode 100644 index 9e2b623..0000000 --- a/vendor/github.com/json-iterator/go/reflect_map.go +++ /dev/null @@ -1,346 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "reflect" - "sort" - "unsafe" -) - -func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder { - mapType := typ.(*reflect2.UnsafeMapType) - keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()) - elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem()) - return &mapDecoder{ - mapType: mapType, - keyType: mapType.Key(), - elemType: mapType.Elem(), - keyDecoder: keyDecoder, - elemDecoder: elemDecoder, - } -} - -func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder { - mapType := typ.(*reflect2.UnsafeMapType) - if ctx.sortMapKeys { - return &sortKeysMapEncoder{ - mapType: mapType, - keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), - elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), - } - } - return &mapEncoder{ - mapType: mapType, - keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), - elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), - } -} - -func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := ctx.decoderExtension.CreateMapKeyDecoder(typ) - if decoder != nil { - return decoder - } - for _, extension := range ctx.extraExtensions { - decoder := extension.CreateMapKeyDecoder(typ) - if decoder != nil { - return decoder - } - } - switch typ.Kind() { - case reflect.String: - return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) - case reflect.Bool, - reflect.Uint8, reflect.Int8, - reflect.Uint16, reflect.Int16, - reflect.Uint32, reflect.Int32, - reflect.Uint64, reflect.Int64, - reflect.Uint, reflect.Int, - reflect.Float32, reflect.Float64, - reflect.Uintptr: - typ = reflect2.DefaultTypeOfKind(typ.Kind()) - return &numericMapKeyDecoder{decoderOfType(ctx, typ)} - default: - ptrType := reflect2.PtrTo(typ) - if ptrType.Implements(unmarshalerType) { - return &referenceDecoder{ - &unmarshalerDecoder{ - valType: ptrType, - }, - } - } - if typ.Implements(unmarshalerType) { - return &unmarshalerDecoder{ - valType: typ, - } - } - if ptrType.Implements(textUnmarshalerType) { - return &referenceDecoder{ - &textUnmarshalerDecoder{ - valType: ptrType, - }, - } - } - if typ.Implements(textUnmarshalerType) { - return &textUnmarshalerDecoder{ - valType: typ, - } - } - return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)} - } -} - -func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := ctx.encoderExtension.CreateMapKeyEncoder(typ) - if encoder != nil { - return encoder - } - for _, extension := range ctx.extraExtensions { - encoder := extension.CreateMapKeyEncoder(typ) - if encoder != nil { - return encoder - } - } - switch typ.Kind() { - case reflect.String: - return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) - case reflect.Bool, - reflect.Uint8, reflect.Int8, - reflect.Uint16, reflect.Int16, - reflect.Uint32, reflect.Int32, - reflect.Uint64, reflect.Int64, - reflect.Uint, reflect.Int, - reflect.Float32, reflect.Float64, - reflect.Uintptr: - typ = reflect2.DefaultTypeOfKind(typ.Kind()) - return &numericMapKeyEncoder{encoderOfType(ctx, typ)} - default: - if typ == textMarshalerType { - return &directTextMarshalerEncoder{ - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - } - if typ.Implements(textMarshalerType) { - return &textMarshalerEncoder{ - valType: typ, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - } - if typ.Kind() == reflect.Interface { - return &dynamicMapKeyEncoder{ctx, typ} - } - return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)} - } -} - -type mapDecoder struct { - mapType *reflect2.UnsafeMapType - keyType reflect2.Type - elemType reflect2.Type - keyDecoder ValDecoder - elemDecoder ValDecoder -} - -func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - mapType := decoder.mapType - c := iter.nextToken() - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - *(*unsafe.Pointer)(ptr) = nil - mapType.UnsafeSet(ptr, mapType.UnsafeNew()) - return - } - if mapType.UnsafeIsNil(ptr) { - mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0)) - } - if c != '{' { - iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) - return - } - c = iter.nextToken() - if c == '}' { - return - } - if c != '"' { - iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) - return - } - iter.unreadByte() - key := decoder.keyType.UnsafeNew() - decoder.keyDecoder.Decode(key, iter) - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return - } - elem := decoder.elemType.UnsafeNew() - decoder.elemDecoder.Decode(elem, iter) - decoder.mapType.UnsafeSetIndex(ptr, key, elem) - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - key := decoder.keyType.UnsafeNew() - decoder.keyDecoder.Decode(key, iter) - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return - } - elem := decoder.elemType.UnsafeNew() - decoder.elemDecoder.Decode(elem, iter) - decoder.mapType.UnsafeSetIndex(ptr, key, elem) - } - if c != '}' { - iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c})) - } -} - -type numericMapKeyDecoder struct { - decoder ValDecoder -} - -func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - if c != '"' { - iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) - return - } - decoder.decoder.Decode(ptr, iter) - c = iter.nextToken() - if c != '"' { - iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) - return - } -} - -type numericMapKeyEncoder struct { - encoder ValEncoder -} - -func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.writeByte('"') - encoder.encoder.Encode(ptr, stream) - stream.writeByte('"') -} - -func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type dynamicMapKeyEncoder struct { - ctx *ctx - valType reflect2.Type -} - -func (encoder *dynamicMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).Encode(reflect2.PtrOf(obj), stream) -} - -func (encoder *dynamicMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { - obj := encoder.valType.UnsafeIndirect(ptr) - return encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).IsEmpty(reflect2.PtrOf(obj)) -} - -type mapEncoder struct { - mapType *reflect2.UnsafeMapType - keyEncoder ValEncoder - elemEncoder ValEncoder -} - -func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *(*unsafe.Pointer)(ptr) == nil { - stream.WriteNil() - return - } - stream.WriteObjectStart() - iter := encoder.mapType.UnsafeIterate(ptr) - for i := 0; iter.HasNext(); i++ { - if i != 0 { - stream.WriteMore() - } - key, elem := iter.UnsafeNext() - encoder.keyEncoder.Encode(key, stream) - if stream.indention > 0 { - stream.writeTwoBytes(byte(':'), byte(' ')) - } else { - stream.writeByte(':') - } - encoder.elemEncoder.Encode(elem, stream) - } - stream.WriteObjectEnd() -} - -func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - iter := encoder.mapType.UnsafeIterate(ptr) - return !iter.HasNext() -} - -type sortKeysMapEncoder struct { - mapType *reflect2.UnsafeMapType - keyEncoder ValEncoder - elemEncoder ValEncoder -} - -func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *(*unsafe.Pointer)(ptr) == nil { - stream.WriteNil() - return - } - stream.WriteObjectStart() - mapIter := encoder.mapType.UnsafeIterate(ptr) - subStream := stream.cfg.BorrowStream(nil) - subStream.Attachment = stream.Attachment - subIter := stream.cfg.BorrowIterator(nil) - keyValues := encodedKeyValues{} - for mapIter.HasNext() { - key, elem := mapIter.UnsafeNext() - subStreamIndex := subStream.Buffered() - encoder.keyEncoder.Encode(key, subStream) - if subStream.Error != nil && subStream.Error != io.EOF && stream.Error == nil { - stream.Error = subStream.Error - } - encodedKey := subStream.Buffer()[subStreamIndex:] - subIter.ResetBytes(encodedKey) - decodedKey := subIter.ReadString() - if stream.indention > 0 { - subStream.writeTwoBytes(byte(':'), byte(' ')) - } else { - subStream.writeByte(':') - } - encoder.elemEncoder.Encode(elem, subStream) - keyValues = append(keyValues, encodedKV{ - key: decodedKey, - keyValue: subStream.Buffer()[subStreamIndex:], - }) - } - sort.Sort(keyValues) - for i, keyValue := range keyValues { - if i != 0 { - stream.WriteMore() - } - stream.Write(keyValue.keyValue) - } - if subStream.Error != nil && stream.Error == nil { - stream.Error = subStream.Error - } - stream.WriteObjectEnd() - stream.cfg.ReturnStream(subStream) - stream.cfg.ReturnIterator(subIter) -} - -func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - iter := encoder.mapType.UnsafeIterate(ptr) - return !iter.HasNext() -} - -type encodedKeyValues []encodedKV - -type encodedKV struct { - key string - keyValue []byte -} - -func (sv encodedKeyValues) Len() int { return len(sv) } -func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } -func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key } diff --git a/vendor/github.com/json-iterator/go/reflect_marshaler.go b/vendor/github.com/json-iterator/go/reflect_marshaler.go deleted file mode 100644 index 3e21f37..0000000 --- a/vendor/github.com/json-iterator/go/reflect_marshaler.go +++ /dev/null @@ -1,225 +0,0 @@ -package jsoniter - -import ( - "encoding" - "encoding/json" - "unsafe" - - "github.com/modern-go/reflect2" -) - -var marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem() -var unmarshalerType = reflect2.TypeOfPtr((*json.Unmarshaler)(nil)).Elem() -var textMarshalerType = reflect2.TypeOfPtr((*encoding.TextMarshaler)(nil)).Elem() -var textUnmarshalerType = reflect2.TypeOfPtr((*encoding.TextUnmarshaler)(nil)).Elem() - -func createDecoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValDecoder { - ptrType := reflect2.PtrTo(typ) - if ptrType.Implements(unmarshalerType) { - return &referenceDecoder{ - &unmarshalerDecoder{ptrType}, - } - } - if ptrType.Implements(textUnmarshalerType) { - return &referenceDecoder{ - &textUnmarshalerDecoder{ptrType}, - } - } - return nil -} - -func createEncoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == marshalerType { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &directMarshalerEncoder{ - checkIsEmpty: checkIsEmpty, - } - return encoder - } - if typ.Implements(marshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &marshalerEncoder{ - valType: typ, - checkIsEmpty: checkIsEmpty, - } - return encoder - } - ptrType := reflect2.PtrTo(typ) - if ctx.prefix != "" && ptrType.Implements(marshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, ptrType) - var encoder ValEncoder = &marshalerEncoder{ - valType: ptrType, - checkIsEmpty: checkIsEmpty, - } - return &referenceEncoder{encoder} - } - if typ == textMarshalerType { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &directTextMarshalerEncoder{ - checkIsEmpty: checkIsEmpty, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - return encoder - } - if typ.Implements(textMarshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &textMarshalerEncoder{ - valType: typ, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - checkIsEmpty: checkIsEmpty, - } - return encoder - } - // if prefix is empty, the type is the root type - if ctx.prefix != "" && ptrType.Implements(textMarshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, ptrType) - var encoder ValEncoder = &textMarshalerEncoder{ - valType: ptrType, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - checkIsEmpty: checkIsEmpty, - } - return &referenceEncoder{encoder} - } - return nil -} - -type marshalerEncoder struct { - checkIsEmpty checkIsEmpty - valType reflect2.Type -} - -func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - if encoder.valType.IsNullable() && reflect2.IsNil(obj) { - stream.WriteNil() - return - } - marshaler := obj.(json.Marshaler) - bytes, err := marshaler.MarshalJSON() - if err != nil { - stream.Error = err - } else { - // html escape was already done by jsoniter - // but the extra '\n' should be trimed - l := len(bytes) - if l > 0 && bytes[l-1] == '\n' { - bytes = bytes[:l-1] - } - stream.Write(bytes) - } -} - -func (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type directMarshalerEncoder struct { - checkIsEmpty checkIsEmpty -} - -func (encoder *directMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - marshaler := *(*json.Marshaler)(ptr) - if marshaler == nil { - stream.WriteNil() - return - } - bytes, err := marshaler.MarshalJSON() - if err != nil { - stream.Error = err - } else { - stream.Write(bytes) - } -} - -func (encoder *directMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type textMarshalerEncoder struct { - valType reflect2.Type - stringEncoder ValEncoder - checkIsEmpty checkIsEmpty -} - -func (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - if encoder.valType.IsNullable() && reflect2.IsNil(obj) { - stream.WriteNil() - return - } - marshaler := (obj).(encoding.TextMarshaler) - bytes, err := marshaler.MarshalText() - if err != nil { - stream.Error = err - } else { - str := string(bytes) - encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) - } -} - -func (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type directTextMarshalerEncoder struct { - stringEncoder ValEncoder - checkIsEmpty checkIsEmpty -} - -func (encoder *directTextMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - marshaler := *(*encoding.TextMarshaler)(ptr) - if marshaler == nil { - stream.WriteNil() - return - } - bytes, err := marshaler.MarshalText() - if err != nil { - stream.Error = err - } else { - str := string(bytes) - encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) - } -} - -func (encoder *directTextMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type unmarshalerDecoder struct { - valType reflect2.Type -} - -func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valType := decoder.valType - obj := valType.UnsafeIndirect(ptr) - unmarshaler := obj.(json.Unmarshaler) - iter.nextToken() - iter.unreadByte() // skip spaces - bytes := iter.SkipAndReturnBytes() - err := unmarshaler.UnmarshalJSON(bytes) - if err != nil { - iter.ReportError("unmarshalerDecoder", err.Error()) - } -} - -type textUnmarshalerDecoder struct { - valType reflect2.Type -} - -func (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valType := decoder.valType - obj := valType.UnsafeIndirect(ptr) - if reflect2.IsNil(obj) { - ptrType := valType.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - elem := elemType.UnsafeNew() - ptrType.UnsafeSet(ptr, unsafe.Pointer(&elem)) - obj = valType.UnsafeIndirect(ptr) - } - unmarshaler := (obj).(encoding.TextUnmarshaler) - str := iter.ReadString() - err := unmarshaler.UnmarshalText([]byte(str)) - if err != nil { - iter.ReportError("textUnmarshalerDecoder", err.Error()) - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_native.go b/vendor/github.com/json-iterator/go/reflect_native.go deleted file mode 100644 index f88722d..0000000 --- a/vendor/github.com/json-iterator/go/reflect_native.go +++ /dev/null @@ -1,453 +0,0 @@ -package jsoniter - -import ( - "encoding/base64" - "reflect" - "strconv" - "unsafe" - - "github.com/modern-go/reflect2" -) - -const ptrSize = 32 << uintptr(^uintptr(0)>>63) - -func createEncoderOfNative(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { - sliceDecoder := decoderOfSlice(ctx, typ) - return &base64Codec{sliceDecoder: sliceDecoder} - } - typeName := typ.String() - kind := typ.Kind() - switch kind { - case reflect.String: - if typeName != "string" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) - } - return &stringCodec{} - case reflect.Int: - if typeName != "int" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &int32Codec{} - } - return &int64Codec{} - case reflect.Int8: - if typeName != "int8" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) - } - return &int8Codec{} - case reflect.Int16: - if typeName != "int16" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) - } - return &int16Codec{} - case reflect.Int32: - if typeName != "int32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) - } - return &int32Codec{} - case reflect.Int64: - if typeName != "int64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) - } - return &int64Codec{} - case reflect.Uint: - if typeName != "uint" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint8: - if typeName != "uint8" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) - } - return &uint8Codec{} - case reflect.Uint16: - if typeName != "uint16" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) - } - return &uint16Codec{} - case reflect.Uint32: - if typeName != "uint32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) - } - return &uint32Codec{} - case reflect.Uintptr: - if typeName != "uintptr" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) - } - if ptrSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint64: - if typeName != "uint64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) - } - return &uint64Codec{} - case reflect.Float32: - if typeName != "float32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) - } - return &float32Codec{} - case reflect.Float64: - if typeName != "float64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) - } - return &float64Codec{} - case reflect.Bool: - if typeName != "bool" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) - } - return &boolCodec{} - } - return nil -} - -func createDecoderOfNative(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { - sliceDecoder := decoderOfSlice(ctx, typ) - return &base64Codec{sliceDecoder: sliceDecoder} - } - typeName := typ.String() - switch typ.Kind() { - case reflect.String: - if typeName != "string" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) - } - return &stringCodec{} - case reflect.Int: - if typeName != "int" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &int32Codec{} - } - return &int64Codec{} - case reflect.Int8: - if typeName != "int8" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) - } - return &int8Codec{} - case reflect.Int16: - if typeName != "int16" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) - } - return &int16Codec{} - case reflect.Int32: - if typeName != "int32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) - } - return &int32Codec{} - case reflect.Int64: - if typeName != "int64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) - } - return &int64Codec{} - case reflect.Uint: - if typeName != "uint" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint8: - if typeName != "uint8" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) - } - return &uint8Codec{} - case reflect.Uint16: - if typeName != "uint16" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) - } - return &uint16Codec{} - case reflect.Uint32: - if typeName != "uint32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) - } - return &uint32Codec{} - case reflect.Uintptr: - if typeName != "uintptr" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) - } - if ptrSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint64: - if typeName != "uint64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) - } - return &uint64Codec{} - case reflect.Float32: - if typeName != "float32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) - } - return &float32Codec{} - case reflect.Float64: - if typeName != "float64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) - } - return &float64Codec{} - case reflect.Bool: - if typeName != "bool" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) - } - return &boolCodec{} - } - return nil -} - -type stringCodec struct { -} - -func (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*string)(ptr)) = iter.ReadString() -} - -func (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - str := *((*string)(ptr)) - stream.WriteString(str) -} - -func (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*string)(ptr)) == "" -} - -type int8Codec struct { -} - -func (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int8)(ptr)) = iter.ReadInt8() - } -} - -func (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt8(*((*int8)(ptr))) -} - -func (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int8)(ptr)) == 0 -} - -type int16Codec struct { -} - -func (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int16)(ptr)) = iter.ReadInt16() - } -} - -func (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt16(*((*int16)(ptr))) -} - -func (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int16)(ptr)) == 0 -} - -type int32Codec struct { -} - -func (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int32)(ptr)) = iter.ReadInt32() - } -} - -func (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt32(*((*int32)(ptr))) -} - -func (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int32)(ptr)) == 0 -} - -type int64Codec struct { -} - -func (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int64)(ptr)) = iter.ReadInt64() - } -} - -func (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt64(*((*int64)(ptr))) -} - -func (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int64)(ptr)) == 0 -} - -type uint8Codec struct { -} - -func (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint8)(ptr)) = iter.ReadUint8() - } -} - -func (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint8(*((*uint8)(ptr))) -} - -func (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint8)(ptr)) == 0 -} - -type uint16Codec struct { -} - -func (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint16)(ptr)) = iter.ReadUint16() - } -} - -func (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint16(*((*uint16)(ptr))) -} - -func (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint16)(ptr)) == 0 -} - -type uint32Codec struct { -} - -func (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint32)(ptr)) = iter.ReadUint32() - } -} - -func (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint32(*((*uint32)(ptr))) -} - -func (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint32)(ptr)) == 0 -} - -type uint64Codec struct { -} - -func (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint64)(ptr)) = iter.ReadUint64() - } -} - -func (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint64(*((*uint64)(ptr))) -} - -func (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint64)(ptr)) == 0 -} - -type float32Codec struct { -} - -func (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float32)(ptr)) = iter.ReadFloat32() - } -} - -func (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat32(*((*float32)(ptr))) -} - -func (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float32)(ptr)) == 0 -} - -type float64Codec struct { -} - -func (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float64)(ptr)) = iter.ReadFloat64() - } -} - -func (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat64(*((*float64)(ptr))) -} - -func (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float64)(ptr)) == 0 -} - -type boolCodec struct { -} - -func (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*bool)(ptr)) = iter.ReadBool() - } -} - -func (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteBool(*((*bool)(ptr))) -} - -func (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool { - return !(*((*bool)(ptr))) -} - -type base64Codec struct { - sliceType *reflect2.UnsafeSliceType - sliceDecoder ValDecoder -} - -func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - codec.sliceType.UnsafeSetNil(ptr) - return - } - switch iter.WhatIsNext() { - case StringValue: - src := iter.ReadString() - dst, err := base64.StdEncoding.DecodeString(src) - if err != nil { - iter.ReportError("decode base64", err.Error()) - } else { - codec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst)) - } - case ArrayValue: - codec.sliceDecoder.Decode(ptr, iter) - default: - iter.ReportError("base64Codec", "invalid input") - } -} - -func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - if codec.sliceType.UnsafeIsNil(ptr) { - stream.WriteNil() - return - } - src := *((*[]byte)(ptr)) - encoding := base64.StdEncoding - stream.writeByte('"') - if len(src) != 0 { - size := encoding.EncodedLen(len(src)) - buf := make([]byte, size) - encoding.Encode(buf, src) - stream.buf = append(stream.buf, buf...) - } - stream.writeByte('"') -} - -func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*[]byte)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_optional.go b/vendor/github.com/json-iterator/go/reflect_optional.go deleted file mode 100644 index 43ec71d..0000000 --- a/vendor/github.com/json-iterator/go/reflect_optional.go +++ /dev/null @@ -1,133 +0,0 @@ -package jsoniter - -import ( - "github.com/modern-go/reflect2" - "reflect" - "unsafe" -) - -func decoderOfOptional(ctx *ctx, typ reflect2.Type) ValDecoder { - ptrType := typ.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - decoder := decoderOfType(ctx, elemType) - if ctx.prefix == "" && elemType.Kind() == reflect.Ptr { - return &dereferenceDecoder{elemType, decoder} - } - return &OptionalDecoder{elemType, decoder} -} - -func encoderOfOptional(ctx *ctx, typ reflect2.Type) ValEncoder { - ptrType := typ.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - elemEncoder := encoderOfType(ctx, elemType) - encoder := &OptionalEncoder{elemEncoder} - return encoder -} - -type OptionalDecoder struct { - ValueType reflect2.Type - ValueDecoder ValDecoder -} - -func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - *((*unsafe.Pointer)(ptr)) = nil - } else { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - newPtr := decoder.ValueType.UnsafeNew() - decoder.ValueDecoder.Decode(newPtr, iter) - *((*unsafe.Pointer)(ptr)) = newPtr - } else { - //reuse existing instance - decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } - } -} - -type dereferenceDecoder struct { - // only to deference a pointer - valueType reflect2.Type - valueDecoder ValDecoder -} - -func (decoder *dereferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - newPtr := decoder.valueType.UnsafeNew() - decoder.valueDecoder.Decode(newPtr, iter) - *((*unsafe.Pointer)(ptr)) = newPtr - } else { - //reuse existing instance - decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } -} - -type OptionalEncoder struct { - ValueEncoder ValEncoder -} - -func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*unsafe.Pointer)(ptr)) == nil -} - -type dereferenceEncoder struct { - ValueEncoder ValEncoder -} - -func (encoder *dereferenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *dereferenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - dePtr := *((*unsafe.Pointer)(ptr)) - if dePtr == nil { - return true - } - return encoder.ValueEncoder.IsEmpty(dePtr) -} - -func (encoder *dereferenceEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { - deReferenced := *((*unsafe.Pointer)(ptr)) - if deReferenced == nil { - return true - } - isEmbeddedPtrNil, converted := encoder.ValueEncoder.(IsEmbeddedPtrNil) - if !converted { - return false - } - fieldPtr := unsafe.Pointer(deReferenced) - return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) -} - -type referenceEncoder struct { - encoder ValEncoder -} - -func (encoder *referenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) -} - -func (encoder *referenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) -} - -type referenceDecoder struct { - decoder ValDecoder -} - -func (decoder *referenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.decoder.Decode(unsafe.Pointer(&ptr), iter) -} diff --git a/vendor/github.com/json-iterator/go/reflect_slice.go b/vendor/github.com/json-iterator/go/reflect_slice.go deleted file mode 100644 index 9441d79..0000000 --- a/vendor/github.com/json-iterator/go/reflect_slice.go +++ /dev/null @@ -1,99 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "unsafe" -) - -func decoderOfSlice(ctx *ctx, typ reflect2.Type) ValDecoder { - sliceType := typ.(*reflect2.UnsafeSliceType) - decoder := decoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) - return &sliceDecoder{sliceType, decoder} -} - -func encoderOfSlice(ctx *ctx, typ reflect2.Type) ValEncoder { - sliceType := typ.(*reflect2.UnsafeSliceType) - encoder := encoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) - return &sliceEncoder{sliceType, encoder} -} - -type sliceEncoder struct { - sliceType *reflect2.UnsafeSliceType - elemEncoder ValEncoder -} - -func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if encoder.sliceType.UnsafeIsNil(ptr) { - stream.WriteNil() - return - } - length := encoder.sliceType.UnsafeLengthOf(ptr) - if length == 0 { - stream.WriteEmptyArray() - return - } - stream.WriteArrayStart() - encoder.elemEncoder.Encode(encoder.sliceType.UnsafeGetIndex(ptr, 0), stream) - for i := 1; i < length; i++ { - stream.WriteMore() - elemPtr := encoder.sliceType.UnsafeGetIndex(ptr, i) - encoder.elemEncoder.Encode(elemPtr, stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.sliceType, stream.Error.Error()) - } -} - -func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.sliceType.UnsafeLengthOf(ptr) == 0 -} - -type sliceDecoder struct { - sliceType *reflect2.UnsafeSliceType - elemDecoder ValDecoder -} - -func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error()) - } -} - -func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - sliceType := decoder.sliceType - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - sliceType.UnsafeSetNil(ptr) - return - } - if c != '[' { - iter.ReportError("decode slice", "expect [ or n, but found "+string([]byte{c})) - return - } - c = iter.nextToken() - if c == ']' { - sliceType.UnsafeSet(ptr, sliceType.UnsafeMakeSlice(0, 0)) - return - } - iter.unreadByte() - sliceType.UnsafeGrow(ptr, 1) - elemPtr := sliceType.UnsafeGetIndex(ptr, 0) - decoder.elemDecoder.Decode(elemPtr, iter) - length := 1 - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - idx := length - length += 1 - sliceType.UnsafeGrow(ptr, length) - elemPtr = sliceType.UnsafeGetIndex(ptr, idx) - decoder.elemDecoder.Decode(elemPtr, iter) - } - if c != ']' { - iter.ReportError("decode slice", "expect ], but found "+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go deleted file mode 100644 index 5ad5cc5..0000000 --- a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go +++ /dev/null @@ -1,1092 +0,0 @@ -package jsoniter - -import ( - "fmt" - "io" - "strings" - "unsafe" - - "github.com/modern-go/reflect2" -) - -func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder { - bindings := map[string]*Binding{} - structDescriptor := describeStruct(ctx, typ) - for _, binding := range structDescriptor.Fields { - for _, fromName := range binding.FromNames { - old := bindings[fromName] - if old == nil { - bindings[fromName] = binding - continue - } - ignoreOld, ignoreNew := resolveConflictBinding(ctx.frozenConfig, old, binding) - if ignoreOld { - delete(bindings, fromName) - } - if !ignoreNew { - bindings[fromName] = binding - } - } - } - fields := map[string]*structFieldDecoder{} - for k, binding := range bindings { - fields[k] = binding.Decoder.(*structFieldDecoder) - } - - if !ctx.caseSensitive() { - for k, binding := range bindings { - if _, found := fields[strings.ToLower(k)]; !found { - fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) - } - } - } - - return createStructDecoder(ctx, typ, fields) -} - -func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structFieldDecoder) ValDecoder { - if ctx.disallowUnknownFields { - return &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true} - } - knownHash := map[int64]struct{}{ - 0: {}, - } - - switch len(fields) { - case 0: - return &skipObjectDecoder{typ} - case 1: - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder} - } - case 2: - var fieldHash1 int64 - var fieldHash2 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldHash1 == 0 { - fieldHash1 = fieldHash - fieldDecoder1 = fieldDecoder - } else { - fieldHash2 = fieldHash - fieldDecoder2 = fieldDecoder - } - } - return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2} - case 3: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } - } - return &threeFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3} - case 4: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } - } - return &fourFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4} - case 5: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } - } - return &fiveFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5} - case 6: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } - } - return &sixFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6} - case 7: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } - } - return &sevenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7} - case 8: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - var fieldDecoder8 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else if fieldName7 == 0 { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } else { - fieldName8 = fieldHash - fieldDecoder8 = fieldDecoder - } - } - return &eightFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8} - case 9: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldName9 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - var fieldDecoder8 *structFieldDecoder - var fieldDecoder9 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else if fieldName7 == 0 { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } else if fieldName8 == 0 { - fieldName8 = fieldHash - fieldDecoder8 = fieldDecoder - } else { - fieldName9 = fieldHash - fieldDecoder9 = fieldDecoder - } - } - return &nineFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8, - fieldName9, fieldDecoder9} - case 10: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldName9 int64 - var fieldName10 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - var fieldDecoder8 *structFieldDecoder - var fieldDecoder9 *structFieldDecoder - var fieldDecoder10 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else if fieldName7 == 0 { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } else if fieldName8 == 0 { - fieldName8 = fieldHash - fieldDecoder8 = fieldDecoder - } else if fieldName9 == 0 { - fieldName9 = fieldHash - fieldDecoder9 = fieldDecoder - } else { - fieldName10 = fieldHash - fieldDecoder10 = fieldDecoder - } - } - return &tenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8, - fieldName9, fieldDecoder9, - fieldName10, fieldDecoder10} - } - return &generalStructDecoder{typ, fields, false} -} - -type generalStructDecoder struct { - typ reflect2.Type - fields map[string]*structFieldDecoder - disallowUnknownFields bool -} - -func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - var c byte - for c = ','; c == ','; c = iter.nextToken() { - decoder.decodeOneField(ptr, iter) - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - if c != '}' { - iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c})) - } - iter.decrementDepth() -} - -func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) { - var field string - var fieldDecoder *structFieldDecoder - if iter.cfg.objectFieldMustBeSimpleString { - fieldBytes := iter.ReadStringAsSlice() - field = *(*string)(unsafe.Pointer(&fieldBytes)) - fieldDecoder = decoder.fields[field] - if fieldDecoder == nil && !iter.cfg.caseSensitive { - fieldDecoder = decoder.fields[strings.ToLower(field)] - } - } else { - field = iter.ReadString() - fieldDecoder = decoder.fields[field] - if fieldDecoder == nil && !iter.cfg.caseSensitive { - fieldDecoder = decoder.fields[strings.ToLower(field)] - } - } - if fieldDecoder == nil { - if decoder.disallowUnknownFields { - msg := "found unknown field: " + field - iter.ReportError("ReadObject", msg) - } - c := iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - iter.Skip() - return - } - c := iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - fieldDecoder.Decode(ptr, iter) -} - -type skipObjectDecoder struct { - typ reflect2.Type -} - -func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valueType := iter.WhatIsNext() - if valueType != ObjectValue && valueType != NilValue { - iter.ReportError("skipObjectDecoder", "expect object or null") - return - } - iter.Skip() -} - -type oneFieldStructDecoder struct { - typ reflect2.Type - fieldHash int64 - fieldDecoder *structFieldDecoder -} - -func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - if iter.readFieldHash() == decoder.fieldHash { - decoder.fieldDecoder.Decode(ptr, iter) - } else { - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type twoFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder -} - -func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type threeFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder -} - -func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type fourFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder -} - -func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type fiveFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder -} - -func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type sixFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder -} - -func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type sevenFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder -} - -func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type eightFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder - fieldHash8 int64 - fieldDecoder8 *structFieldDecoder -} - -func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - case decoder.fieldHash8: - decoder.fieldDecoder8.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type nineFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder - fieldHash8 int64 - fieldDecoder8 *structFieldDecoder - fieldHash9 int64 - fieldDecoder9 *structFieldDecoder -} - -func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - case decoder.fieldHash8: - decoder.fieldDecoder8.Decode(ptr, iter) - case decoder.fieldHash9: - decoder.fieldDecoder9.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type tenFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder - fieldHash8 int64 - fieldDecoder8 *structFieldDecoder - fieldHash9 int64 - fieldDecoder9 *structFieldDecoder - fieldHash10 int64 - fieldDecoder10 *structFieldDecoder -} - -func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - if !iter.incrementDepth() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - case decoder.fieldHash8: - decoder.fieldDecoder8.Decode(ptr, iter) - case decoder.fieldHash9: - decoder.fieldDecoder9.Decode(ptr, iter) - case decoder.fieldHash10: - decoder.fieldDecoder10.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - iter.decrementDepth() -} - -type structFieldDecoder struct { - field reflect2.StructField - fieldDecoder ValDecoder -} - -func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - fieldPtr := decoder.field.UnsafeGet(ptr) - decoder.fieldDecoder.Decode(fieldPtr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%s: %s", decoder.field.Name(), iter.Error.Error()) - } -} - -type stringModeStringDecoder struct { - elemDecoder ValDecoder - cfg *frozenConfig -} - -func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.elemDecoder.Decode(ptr, iter) - str := *((*string)(ptr)) - tempIter := decoder.cfg.BorrowIterator([]byte(str)) - defer decoder.cfg.ReturnIterator(tempIter) - *((*string)(ptr)) = tempIter.ReadString() -} - -type stringModeNumberDecoder struct { - elemDecoder ValDecoder -} - -func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return - } - decoder.elemDecoder.Decode(ptr, iter) - if iter.Error != nil { - return - } - c = iter.readByte() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_encoder.go b/vendor/github.com/json-iterator/go/reflect_struct_encoder.go deleted file mode 100644 index 152e3ef..0000000 --- a/vendor/github.com/json-iterator/go/reflect_struct_encoder.go +++ /dev/null @@ -1,211 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "reflect" - "unsafe" -) - -func encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder { - type bindingTo struct { - binding *Binding - toName string - ignored bool - } - orderedBindings := []*bindingTo{} - structDescriptor := describeStruct(ctx, typ) - for _, binding := range structDescriptor.Fields { - for _, toName := range binding.ToNames { - new := &bindingTo{ - binding: binding, - toName: toName, - } - for _, old := range orderedBindings { - if old.toName != toName { - continue - } - old.ignored, new.ignored = resolveConflictBinding(ctx.frozenConfig, old.binding, new.binding) - } - orderedBindings = append(orderedBindings, new) - } - } - if len(orderedBindings) == 0 { - return &emptyStructEncoder{} - } - finalOrderedFields := []structFieldTo{} - for _, bindingTo := range orderedBindings { - if !bindingTo.ignored { - finalOrderedFields = append(finalOrderedFields, structFieldTo{ - encoder: bindingTo.binding.Encoder.(*structFieldEncoder), - toName: bindingTo.toName, - }) - } - } - return &structEncoder{typ, finalOrderedFields} -} - -func createCheckIsEmpty(ctx *ctx, typ reflect2.Type) checkIsEmpty { - encoder := createEncoderOfNative(ctx, typ) - if encoder != nil { - return encoder - } - kind := typ.Kind() - switch kind { - case reflect.Interface: - return &dynamicEncoder{typ} - case reflect.Struct: - return &structEncoder{typ: typ} - case reflect.Array: - return &arrayEncoder{} - case reflect.Slice: - return &sliceEncoder{} - case reflect.Map: - return encoderOfMap(ctx, typ) - case reflect.Ptr: - return &OptionalEncoder{} - default: - return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)} - } -} - -func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) { - newTagged := new.Field.Tag().Get(cfg.getTagKey()) != "" - oldTagged := old.Field.Tag().Get(cfg.getTagKey()) != "" - if newTagged { - if oldTagged { - if len(old.levels) > len(new.levels) { - return true, false - } else if len(new.levels) > len(old.levels) { - return false, true - } else { - return true, true - } - } else { - return true, false - } - } else { - if oldTagged { - return true, false - } - if len(old.levels) > len(new.levels) { - return true, false - } else if len(new.levels) > len(old.levels) { - return false, true - } else { - return true, true - } - } -} - -type structFieldEncoder struct { - field reflect2.StructField - fieldEncoder ValEncoder - omitempty bool -} - -func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - fieldPtr := encoder.field.UnsafeGet(ptr) - encoder.fieldEncoder.Encode(fieldPtr, stream) - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%s: %s", encoder.field.Name(), stream.Error.Error()) - } -} - -func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool { - fieldPtr := encoder.field.UnsafeGet(ptr) - return encoder.fieldEncoder.IsEmpty(fieldPtr) -} - -func (encoder *structFieldEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { - isEmbeddedPtrNil, converted := encoder.fieldEncoder.(IsEmbeddedPtrNil) - if !converted { - return false - } - fieldPtr := encoder.field.UnsafeGet(ptr) - return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) -} - -type IsEmbeddedPtrNil interface { - IsEmbeddedPtrNil(ptr unsafe.Pointer) bool -} - -type structEncoder struct { - typ reflect2.Type - fields []structFieldTo -} - -type structFieldTo struct { - encoder *structFieldEncoder - toName string -} - -func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteObjectStart() - isNotFirst := false - for _, field := range encoder.fields { - if field.encoder.omitempty && field.encoder.IsEmpty(ptr) { - continue - } - if field.encoder.IsEmbeddedPtrNil(ptr) { - continue - } - if isNotFirst { - stream.WriteMore() - } - stream.WriteObjectField(field.toName) - field.encoder.Encode(ptr, stream) - isNotFirst = true - } - stream.WriteObjectEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v.%s", encoder.typ, stream.Error.Error()) - } -} - -func (encoder *structEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type emptyStructEncoder struct { -} - -func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteEmptyObject() -} - -func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type stringModeNumberEncoder struct { - elemEncoder ValEncoder -} - -func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.writeByte('"') - encoder.elemEncoder.Encode(ptr, stream) - stream.writeByte('"') -} - -func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) -} - -type stringModeStringEncoder struct { - elemEncoder ValEncoder - cfg *frozenConfig -} - -func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - tempStream := encoder.cfg.BorrowStream(nil) - tempStream.Attachment = stream.Attachment - defer encoder.cfg.ReturnStream(tempStream) - encoder.elemEncoder.Encode(ptr, tempStream) - stream.WriteString(string(tempStream.Buffer())) -} - -func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) -} diff --git a/vendor/github.com/json-iterator/go/stream.go b/vendor/github.com/json-iterator/go/stream.go deleted file mode 100644 index 17662fd..0000000 --- a/vendor/github.com/json-iterator/go/stream.go +++ /dev/null @@ -1,211 +0,0 @@ -package jsoniter - -import ( - "io" -) - -// stream is a io.Writer like object, with JSON specific write functions. -// Error is not returned as return value, but stored as Error member on this stream instance. -type Stream struct { - cfg *frozenConfig - out io.Writer - buf []byte - Error error - indention int - Attachment interface{} // open for customized encoder -} - -// NewStream create new stream instance. -// cfg can be jsoniter.ConfigDefault. -// out can be nil if write to internal buffer. -// bufSize is the initial size for the internal buffer in bytes. -func NewStream(cfg API, out io.Writer, bufSize int) *Stream { - return &Stream{ - cfg: cfg.(*frozenConfig), - out: out, - buf: make([]byte, 0, bufSize), - Error: nil, - indention: 0, - } -} - -// Pool returns a pool can provide more stream with same configuration -func (stream *Stream) Pool() StreamPool { - return stream.cfg -} - -// Reset reuse this stream instance by assign a new writer -func (stream *Stream) Reset(out io.Writer) { - stream.out = out - stream.buf = stream.buf[:0] -} - -// Available returns how many bytes are unused in the buffer. -func (stream *Stream) Available() int { - return cap(stream.buf) - len(stream.buf) -} - -// Buffered returns the number of bytes that have been written into the current buffer. -func (stream *Stream) Buffered() int { - return len(stream.buf) -} - -// Buffer if writer is nil, use this method to take the result -func (stream *Stream) Buffer() []byte { - return stream.buf -} - -// SetBuffer allows to append to the internal buffer directly -func (stream *Stream) SetBuffer(buf []byte) { - stream.buf = buf -} - -// Write writes the contents of p into the buffer. -// It returns the number of bytes written. -// If nn < len(p), it also returns an error explaining -// why the write is short. -func (stream *Stream) Write(p []byte) (nn int, err error) { - stream.buf = append(stream.buf, p...) - if stream.out != nil { - nn, err = stream.out.Write(stream.buf) - stream.buf = stream.buf[nn:] - return - } - return len(p), nil -} - -// WriteByte writes a single byte. -func (stream *Stream) writeByte(c byte) { - stream.buf = append(stream.buf, c) -} - -func (stream *Stream) writeTwoBytes(c1 byte, c2 byte) { - stream.buf = append(stream.buf, c1, c2) -} - -func (stream *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) { - stream.buf = append(stream.buf, c1, c2, c3) -} - -func (stream *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) { - stream.buf = append(stream.buf, c1, c2, c3, c4) -} - -func (stream *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) { - stream.buf = append(stream.buf, c1, c2, c3, c4, c5) -} - -// Flush writes any buffered data to the underlying io.Writer. -func (stream *Stream) Flush() error { - if stream.out == nil { - return nil - } - if stream.Error != nil { - return stream.Error - } - n, err := stream.out.Write(stream.buf) - if err != nil { - if stream.Error == nil { - stream.Error = err - } - return err - } - stream.buf = stream.buf[n:] - return nil -} - -// WriteRaw write string out without quotes, just like []byte -func (stream *Stream) WriteRaw(s string) { - stream.buf = append(stream.buf, s...) -} - -// WriteNil write null to stream -func (stream *Stream) WriteNil() { - stream.writeFourBytes('n', 'u', 'l', 'l') -} - -// WriteTrue write true to stream -func (stream *Stream) WriteTrue() { - stream.writeFourBytes('t', 'r', 'u', 'e') -} - -// WriteFalse write false to stream -func (stream *Stream) WriteFalse() { - stream.writeFiveBytes('f', 'a', 'l', 's', 'e') -} - -// WriteBool write true or false into stream -func (stream *Stream) WriteBool(val bool) { - if val { - stream.WriteTrue() - } else { - stream.WriteFalse() - } -} - -// WriteObjectStart write { with possible indention -func (stream *Stream) WriteObjectStart() { - stream.indention += stream.cfg.indentionStep - stream.writeByte('{') - stream.writeIndention(0) -} - -// WriteObjectField write "field": with possible indention -func (stream *Stream) WriteObjectField(field string) { - stream.WriteString(field) - if stream.indention > 0 { - stream.writeTwoBytes(':', ' ') - } else { - stream.writeByte(':') - } -} - -// WriteObjectEnd write } with possible indention -func (stream *Stream) WriteObjectEnd() { - stream.writeIndention(stream.cfg.indentionStep) - stream.indention -= stream.cfg.indentionStep - stream.writeByte('}') -} - -// WriteEmptyObject write {} -func (stream *Stream) WriteEmptyObject() { - stream.writeByte('{') - stream.writeByte('}') -} - -// WriteMore write , with possible indention -func (stream *Stream) WriteMore() { - stream.writeByte(',') - stream.writeIndention(0) - stream.Flush() -} - -// WriteArrayStart write [ with possible indention -func (stream *Stream) WriteArrayStart() { - stream.indention += stream.cfg.indentionStep - stream.writeByte('[') - stream.writeIndention(0) -} - -// WriteEmptyArray write [] -func (stream *Stream) WriteEmptyArray() { - stream.writeTwoBytes('[', ']') -} - -// WriteArrayEnd write ] with possible indention -func (stream *Stream) WriteArrayEnd() { - stream.writeIndention(stream.cfg.indentionStep) - stream.indention -= stream.cfg.indentionStep - stream.writeByte(']') -} - -func (stream *Stream) writeIndention(delta int) { - if stream.indention == 0 { - return - } - stream.writeByte('\n') - toWrite := stream.indention - delta - for i := 0; i < toWrite; i++ { - stream.buf = append(stream.buf, ' ') - } -} diff --git a/vendor/github.com/json-iterator/go/stream_float.go b/vendor/github.com/json-iterator/go/stream_float.go deleted file mode 100644 index 826aa59..0000000 --- a/vendor/github.com/json-iterator/go/stream_float.go +++ /dev/null @@ -1,111 +0,0 @@ -package jsoniter - -import ( - "fmt" - "math" - "strconv" -) - -var pow10 []uint64 - -func init() { - pow10 = []uint64{1, 10, 100, 1000, 10000, 100000, 1000000} -} - -// WriteFloat32 write float32 to stream -func (stream *Stream) WriteFloat32(val float32) { - if math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) { - stream.Error = fmt.Errorf("unsupported value: %f", val) - return - } - abs := math.Abs(float64(val)) - fmt := byte('f') - // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. - if abs != 0 { - if float32(abs) < 1e-6 || float32(abs) >= 1e21 { - fmt = 'e' - } - } - stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32) -} - -// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster -func (stream *Stream) WriteFloat32Lossy(val float32) { - if math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) { - stream.Error = fmt.Errorf("unsupported value: %f", val) - return - } - if val < 0 { - stream.writeByte('-') - val = -val - } - if val > 0x4ffffff { - stream.WriteFloat32(val) - return - } - precision := 6 - exp := uint64(1000000) // 6 - lval := uint64(float64(val)*float64(exp) + 0.5) - stream.WriteUint64(lval / exp) - fval := lval % exp - if fval == 0 { - return - } - stream.writeByte('.') - for p := precision - 1; p > 0 && fval < pow10[p]; p-- { - stream.writeByte('0') - } - stream.WriteUint64(fval) - for stream.buf[len(stream.buf)-1] == '0' { - stream.buf = stream.buf[:len(stream.buf)-1] - } -} - -// WriteFloat64 write float64 to stream -func (stream *Stream) WriteFloat64(val float64) { - if math.IsInf(val, 0) || math.IsNaN(val) { - stream.Error = fmt.Errorf("unsupported value: %f", val) - return - } - abs := math.Abs(val) - fmt := byte('f') - // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. - if abs != 0 { - if abs < 1e-6 || abs >= 1e21 { - fmt = 'e' - } - } - stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64) -} - -// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster -func (stream *Stream) WriteFloat64Lossy(val float64) { - if math.IsInf(val, 0) || math.IsNaN(val) { - stream.Error = fmt.Errorf("unsupported value: %f", val) - return - } - if val < 0 { - stream.writeByte('-') - val = -val - } - if val > 0x4ffffff { - stream.WriteFloat64(val) - return - } - precision := 6 - exp := uint64(1000000) // 6 - lval := uint64(val*float64(exp) + 0.5) - stream.WriteUint64(lval / exp) - fval := lval % exp - if fval == 0 { - return - } - stream.writeByte('.') - for p := precision - 1; p > 0 && fval < pow10[p]; p-- { - stream.writeByte('0') - } - stream.WriteUint64(fval) - for stream.buf[len(stream.buf)-1] == '0' { - stream.buf = stream.buf[:len(stream.buf)-1] - } -} diff --git a/vendor/github.com/json-iterator/go/stream_int.go b/vendor/github.com/json-iterator/go/stream_int.go deleted file mode 100644 index d1059ee..0000000 --- a/vendor/github.com/json-iterator/go/stream_int.go +++ /dev/null @@ -1,190 +0,0 @@ -package jsoniter - -var digits []uint32 - -func init() { - digits = make([]uint32, 1000) - for i := uint32(0); i < 1000; i++ { - digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' - if i < 10 { - digits[i] += 2 << 24 - } else if i < 100 { - digits[i] += 1 << 24 - } - } -} - -func writeFirstBuf(space []byte, v uint32) []byte { - start := v >> 24 - if start == 0 { - space = append(space, byte(v>>16), byte(v>>8)) - } else if start == 1 { - space = append(space, byte(v>>8)) - } - space = append(space, byte(v)) - return space -} - -func writeBuf(buf []byte, v uint32) []byte { - return append(buf, byte(v>>16), byte(v>>8), byte(v)) -} - -// WriteUint8 write uint8 to stream -func (stream *Stream) WriteUint8(val uint8) { - stream.buf = writeFirstBuf(stream.buf, digits[val]) -} - -// WriteInt8 write int8 to stream -func (stream *Stream) WriteInt8(nval int8) { - var val uint8 - if nval < 0 { - val = uint8(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint8(nval) - } - stream.buf = writeFirstBuf(stream.buf, digits[val]) -} - -// WriteUint16 write uint16 to stream -func (stream *Stream) WriteUint16(val uint16) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return -} - -// WriteInt16 write int16 to stream -func (stream *Stream) WriteInt16(nval int16) { - var val uint16 - if nval < 0 { - val = uint16(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint16(nval) - } - stream.WriteUint16(val) -} - -// WriteUint32 write uint32 to stream -func (stream *Stream) WriteUint32(val uint32) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q2]) - } else { - r3 := q2 - q3*1000 - stream.buf = append(stream.buf, byte(q3+'0')) - stream.buf = writeBuf(stream.buf, digits[r3]) - } - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) -} - -// WriteInt32 write int32 to stream -func (stream *Stream) WriteInt32(nval int32) { - var val uint32 - if nval < 0 { - val = uint32(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint32(nval) - } - stream.WriteUint32(val) -} - -// WriteUint64 write uint64 to stream -func (stream *Stream) WriteUint64(val uint64) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q2]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r3 := q2 - q3*1000 - q4 := q3 / 1000 - if q4 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q3]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r4 := q3 - q4*1000 - q5 := q4 / 1000 - if q5 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q4]) - stream.buf = writeBuf(stream.buf, digits[r4]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r5 := q4 - q5*1000 - q6 := q5 / 1000 - if q6 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q5]) - } else { - stream.buf = writeFirstBuf(stream.buf, digits[q6]) - r6 := q5 - q6*1000 - stream.buf = writeBuf(stream.buf, digits[r6]) - } - stream.buf = writeBuf(stream.buf, digits[r5]) - stream.buf = writeBuf(stream.buf, digits[r4]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) -} - -// WriteInt64 write int64 to stream -func (stream *Stream) WriteInt64(nval int64) { - var val uint64 - if nval < 0 { - val = uint64(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint64(nval) - } - stream.WriteUint64(val) -} - -// WriteInt write int to stream -func (stream *Stream) WriteInt(val int) { - stream.WriteInt64(int64(val)) -} - -// WriteUint write uint to stream -func (stream *Stream) WriteUint(val uint) { - stream.WriteUint64(uint64(val)) -} diff --git a/vendor/github.com/json-iterator/go/stream_str.go b/vendor/github.com/json-iterator/go/stream_str.go deleted file mode 100644 index 54c2ba0..0000000 --- a/vendor/github.com/json-iterator/go/stream_str.go +++ /dev/null @@ -1,372 +0,0 @@ -package jsoniter - -import ( - "unicode/utf8" -) - -// htmlSafeSet holds the value true if the ASCII character with the given -// array position can be safely represented inside a JSON string, embedded -// inside of HTML